Probleme avec les tableaux en c

Fermé
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011 - 22 oct. 2010 à 15:55
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 - 24 oct. 2010 à 23:57
Bonjour,
j'ai écris un code qui me permet de remplir un premier tableau tant que l'utilisateur ne saisi pas zéro et dés que cette condition n'est plus valable,je transmet toutes les valeurs du premier tableau vers un deuxième tableau sans le zéro.mon programme s'execute mais pas comme je veux.Il se bloque en fait dans la saisie de la 1ére valeur
je ne sais pas d'où provient l'erreur
voici mon code
#include <stdio.h>
#include <stdlib.h>
int main()
{

int j,i,p;
float tableau[100];
float tab[100];
for (i=0,j=0,p=0;i<100;i++)
{
while (&tableau[i]!= 0)
{
printf("donner la valeur %d : ",i+1);
scanf("%f",&tableau[i]);
}

}
if (&tableau[i]==0)
p=i;
for (j=0;j<i+1;j++)
{
(&tab[j]==&tableau[i]);
}
for (j=0;j<p;j++)
printf("%f",tab[j]);
system("pause");
return 0;
}




A voir également:

14 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
22 oct. 2010 à 16:12
Bonjour,

while (&tableau[i]!= 0)
Attention, l'esperluette (&) permet de récupérer l'adresse. Ici on compare la valeur donc, il ne faut pas mettre l'esperluette => while (tableau[i]!=0) fera amplement l'affaire.

(&tab[j]==&tableau[i]);
Pourquoi des parenthèses ? Elles sont inutiles. De plus toujours le même problème d'esperluette. Et enfin, pour faire une affectation, il faut mettre un simple signe égal (=).

Ton algorithme ne correspond avec ton énoncé. Ici tu obliges ton utilisateur à choisir des valeurs différentes de 0 alors qu'il doit pouvoir en mettre tant que c'est différent de 0. Donc, tu dois revoir ce point.

Ensuite la recopie du tableau dans le for est une mauvaise idée. Non seulement tu fais des itérations pour rien car tu recopies le début du tableau à chaque itération et en plus c'est diminue la lisibilité.

Ensuite, initialiser les variables p et j à 0 dans la boucle for n'est pas très clair puisque ce ne sont pas les compteurs. Vaut mieux les initialiser à l'extérieur.

Et enfin je te conseille dans un premier temps de ne pas faire sur les float mais sur des int. Car sinon ça sera un peu plus dur et comme ton code contient beaucoup d'erreur, autant simplifier pour l'instant ;-)).

Corrige le tout et reposte ton programme sans oublier de mettre des balises code autour (à droite du bouton souligné).
Cdlt,
0
Noter également l'utilisation de l'opérateur de comparaison == au lieu de celui d'affectation =
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
22 oct. 2010 à 16:25
j'ai modifié le code mais ça ne marche encore pas :(((
je veux remplir mon premier tableau tant que le réel entré n'est pas un zéro et dés qu'il y a un zéro la copie s'effectue .voici le nouveau code
 #include <stdio.h>
 #include <stdlib.h>
void copie(float*tableau,float*tab,int p);
int main()
{

 int j,i,p;
 float tableau[100];
 float tab[100];
 for (i=0,j=0,p=0;i<100;i++)
    {
        while (tableau[i]!= 0)
        {
            printf("donner la valeur %d : ",i+1);
            scanf("%f",&tableau[i]);
        }
    }
    if (tableau[i]=0)
    p=i;
    copie(tableau,tab,p);
 system("pause");
    return 0;
 }
 void copie(float*tableau,float*tab,int p)
 {
     int j,i;
     for(j=0;j<p;i++)
     {
         tab[j]=tableau[i];
         printf("val du tab est: %f\n",tab[j]);
     }
 }
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
22 oct. 2010 à 16:37
en fait dans la fonction copie c'est j++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
22 oct. 2010 à 16:44
Relis mes commentaires car t'as pas tenu compte de tous...
De plus, tu as rajouté des erreurs : if (tableau[i]=0)
J'ai jamais dit de mettre un simple égal dans les if. Il faut remettre le double égal.
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
22 oct. 2010 à 16:53
j'ai modifié (encore une fois) le code,la saisie fonctionne mais le probleme réside maintenant à la saisie du zéro,ça ne marche pas
if (tableau[i]==0)
   {
        p=i;
    copie(tableau,tab,p);
   }
 system("pause");
    return 0;
 }
 void copie(float*tableau,float*tab,int p)
 {
     int j,i;
     for(j=0,i=0;j<p;j++,i++)
     {
         tab[j]=tableau[i];
         printf("val du tab est: %f\n",tab[j]);
     }
 }
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
22 oct. 2010 à 16:58
L'algorithme n'est toujours pas bon.
Tu obliges l'utilisateur à choisir des nombres différents de 0. Il faudrait faire intervenir dans la boucle initial le fait que dès qu'un nombre tapé par l'utilisateur est différent de 0 la boucle s'arrête.
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
22 oct. 2010 à 17:01
non,je veux que l'utilisateur tape des nombres différent de zéro,le zéro c'est le signal de la fin de la boucle
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 843
22 oct. 2010 à 17:10
Je remets l'énoncé du départ que tu as mis : j'ai écris un code qui me permet de remplir un premier tableau tant que l'utilisateur ne saisi pas zéro et dés que cette condition n'est plus valable
Je comprends que l'utilisateur tape tous les nombres qu'il veut et lorsqu'il choisit 0, la boucle s'arrête.
Si c'est le cas, ton programme ne fait pas ça.

Actuellement ton programme oblige l'utilisateur à choisir des nombres différents de 0 jusqu'à ce qu'il atteint la fin du tableau...
Alors soit ton algorithme est faux, soit ton énoncé n'est pas clair...
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
22 oct. 2010 à 22:45
comment pourrai-je mettre la saisie à condition??en d'autre terme comment mettre une condition sur la valeur lue par scanf pour le remplissage du tableau??
0
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 18
23 oct. 2010 à 00:01
attention à ne pas confondre l'adresse d'une donnée avec la donnée !
l'opérateur & retourne une adresse (ou un pointeur sur ..).
et une adresse ne sera jamais égale à 0 (du moins sur un PC)
Si scanf réclame une adresse , c'est du fait que le C travaille en passage par valeurs des paramètres de fonctions et non en passage par référence (comme pascal par ex ). Donc, pour changer la valeur de la variable, il nécessite l'adresse, d'où la nécessité du &.
Par contre, les valeurs de tableau sont accédées directement par tab[n] (&tab[n] donnant l'adresse de la valeur et non la valeur).
bon courage.
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
23 oct. 2010 à 21:01
voici le code modifié mais ça ne marche encore pas
l'execution donne une saisie infini des chiffres que ce soit un zero ou pas
alors que je veux que la saisie s'arrete en tapant zero et enregistrer l'indice de la case de zero pour l'utiliser aprés.
#include <stdio.h>
 #include <stdlib.h>
int main()
{
 
 int i;
 float tableau[100];
float c='\0';
i=0;
do
    {
        printf("entrer un chiffre :\n ");
    scanf("%f",&c);
   tableau[i]=c;
   i++;
    }
while(c='0');
    if (c=='0')
    { p=i;
    }
    return(p);
system("pause");
    return 0;
 }
0
marooh Messages postés 122 Date d'inscription vendredi 8 octobre 2010 Statut Membre Dernière intervention 16 novembre 2011
23 oct. 2010 à 21:28
oooooppps j'ai fais quelques erreurs que j'ai corrigé

#include <stdio.h>
 #include <stdlib.h>
int main()
{

 int i,p;
 float tableau[100];
float c;
i=0;
p=0;
do
    {
        printf("entrer un chiffre :\n ");
    scanf("%f",&c);
   tableau[i]=c;
   i++;
    }
while(c=0);
    if (c=0)
     p=i;

    return(p);
system("pause");
    return 0;
 }
0
ydurce Messages postés 78 Date d'inscription samedi 9 octobre 2010 Statut Membre Dernière intervention 12 décembre 2010 18
24 oct. 2010 à 23:57
while (c==0) et if (c==0)
je ne vois pas trop ce que fait le return(p) dans le contexte à moins que le code ne soit dans une fonction ?
0