Langage c

Résolu/Fermé
devinform - 3 mai 2010 à 20:20
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 - 3 mai 2010 à 23:16

salut à tout
svp correctez moi le code suivant:





#include <stdio.h>
#include <stdlib.h>
int n,i,nb,k,j;
int main(int argc, char *argv[])
{
printf("entrez le nombre des cellules de votre tableau:\n");
scanf("%d",&n);
int t[n];
for(i=0;i<n;i++)
{printf(" entrez le contenu de cellule N°:%d\n",i);
scanf("%d",&t[i]);
}
printf(" entrez votre nombre recherché \n");
scanf("%d",&nb);
for(j=0;j<n;j++)
{if(t[j]==nb);
{k=0;}}

if(k==0)
{printf("%d est existe\n",nb);}
else
{printf("%d n'existe pas\n",nb);}
system("PAUSE");
return 0;
}


par le biais de ce dernier je veux chercher une valeur dans mon tableau. mon probléme est que je tape une valeur qui n'existe pas dans la tableau et me retourne qu'il existe et je n'arrive pas à trouver le probléme aidez moi et merci bien d'avance
A voir également:

3 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
3 mai 2010 à 20:43
salut,

le problème principal que je vois (j'ai regardé vite fait, pardon s'il y a une autre erreur) est un problème très important, et j'espère que cet exercice te "servira de leçon" pour ne plus la refaire ;) (c'est justement le but des exercices bien sûr)

Ton programme :
on parcours le tableau, et si on trouve le nombre cherché on met k qui a la valeur 0.

ainsi, on regarde à la fin la valeur de k. Si c'est 0, on dit que le nombre est présent.
Et sinon on dit qu'il ne l'était pas.

Le principe est parfait. Mais tu as oublié quelque chose.

Que se passe t-il dans ton programme si le nombre cherché n'est pas dans le tableau ? k n'est jamais touché. C'est le principe de ton programme.

Donc comme k n'est jamais touché, il garde la valeur qu'il avait au départ. Il est obligé d'avoir une valeur au départ, une variable c'est une case de la mémoire, il y a toujours quelque chose dans la mémoire.

Mais alors, quelle était cette valeur de départ que k avait ?

Il n'y a aucune ligne de code dans ton programme qui donne une valeur à k avant la boucle.

(C'est ce qu'on appelle une variable non-initialisée)

C'est une erreur très très très courante en C : oubli d'initialiser une variable.

Le problème est que cette variable peut en fait contenir n'importe quoi, cela dépend : 1) de ton système et 2) de ton compilateur.

Dans ton cas, il se trouve que k avait la valeur 0 au départ. Donc de toute manière, lorsque la boucle est exécutée, même s'il n'y a pas le nombre cherché, k vaudra 0, puisque c'était sa valeur au départ !

Mais il aurait été possible que tu compiles ton programme avec un autre compilateur sur un autre ordinateur et que ce bug soit passé complètement innapperçu.


Donc initialise la valeur de k au début de ton programme à n'importe quelle valeur qui n'est pas zéro et tout devrait aller bien :)


C'est vraiment un genre d'erreur difficile à comprendre, c'est tout à fait normal que tu te sois fait "avoir".

Par contre, je te conseille de toujours lire les "Warnings" de ton compilateur. Dans ce cas je suis quasiment sûr que le compilateur aurait dû te dire quelque chose comme "attention, k pourrait ne pas être initialisée.". ça aide à vérifier qu'on n'a pas oublié ce genre de chose


j'ai été un peu long, mais j'espère avoir été clair !
bonne continuation.
n'hésite pas à demander si tu ne comprends pas quelquechose (ou si j'ai mal compris ton programme)
1
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
Modifié par fiddy le 3/05/2010 à 21:45
Salut pacorabanix,
Mais il aurait été possible que tu compiles ton programme avec un autre compilateur sur un autre ordinateur et que ce bug soit passé complètement innapperçu.
Non puisqu'il s'agit d'une variable globale. La valeur est donc initialisée à 0.

Par contre, il vaut mieux éviter d'utiliser les variables globales.
0
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
3 mai 2010 à 23:16
merci fiddy ! Je n'avais même pas percuté.
0
oui je pense que j'ai bien compris tout ce que tu m'explique donc je vous bien remercie et voici ce que je correcte .est ce que c cela ce que tu veux dire ou bien d'autre chose???mais je constate que ca ne marche plus si j'avais compris correctement votre explication pardon moi pour le dérengement et merci encore ... .


#include <stdio.h>
#include <stdlib.h>
int n,i,nb,k,j;
int main(int argc, char *argv[])
{k=1;
printf("entrez le nombre des cellules de votre tableau:\n");
scanf("%d",&n);
int t[n];
for(i=0;i<n;i++)
{printf(" entrez le contenu de cellule N°:%d\n",i);
scanf("%d",&t[i]);
}
printf(" entrez votre nombre recherché \n");
scanf("%d",&nb);
for(j=0;j<n;j++)
{if(t[j]==nb);
{k=0;}}

if(k!=0)
{printf("%d n'existe pas\n",nb);}
else
{printf("%d est existe\n",nb);}
system("PAUSE");
return 0;
}
1
Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 661
Modifié par Pacorabanix le 3/05/2010 à 21:13
{k=1; 


exactement ! c'est tout à fait cela que je voulais dire.

:)

Alors par contre ça ne marche toujours pas, en effet, car il y a une autre petite erreur vicieuse dans le code, que je n'avais pas vu au début.

D'ailleurs peut-être que ton code initial aurait bien fonctionné avec la deuxième erreur corrigée, mais c'est quand même une bonne chose d'initialiser ses variables correctement.

La deuxième erreur vient du "if"

Lorsque tu écris cela :
if (condition) ; {instruction;}


tu fais une erreur.

Ce qu'il faut écrire est
 if (condition) { instruction;} 
(il y a un " ; " en moins)

en fait, ta version c'est comme si tu avais fait ceci :

if (condition) {  
   ;  
}  

{   
   instruction;  
}   

c'est à dire que instruction ne fait pas partie du if, c'est un bloc qui est exécuté tout le temps, dans tous les cas, peu importe la condition.

donc k était toujours remis à 0 à chaque pas de la boucle peu importe ce qu'il se passe.

alors que sans le point-virgule c'est :
if (condition) {  
  instruction;  
}  
 

(c'est-à-dire exactement ce que tu voulais faire).

et sinon, pas de problème, c'est un forum de programmation, tu ne déranges pas. Tu as fait des essais, tu expliques correctement ton erreur et tu donnes les détails qu'il faut, c'est un plaisir de t'aider.
0
oui oui vous avez raison ce dernier est l'erreure que je cherche même moi je ne le vois pas d'accord d'abord ca marche bien merci biennnnnnnnnnnnnnnnn
0