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
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
A voir également:
- Langage c
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Delphi (langage) - Télécharger - Langages
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
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)
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)
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;
}
#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;
}
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
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.
Modifié par fiddy le 3/05/2010 à 21:45
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.
3 mai 2010 à 23:16