Boucles en C

Fermé
Quester4 Messages postés 134 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 18 juillet 2013 - 29 avril 2012 à 11:26
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 29 avril 2012 à 14:37
Bonjour, j'apprends à coder en C, et malheureusement, c'est en faisant des erreurs que l'on apprend. Sauf que je n'ai pas trouvé de solution à cette erreur : dans ce programme, la condition do-while considère qu'il faut que le nombre "essai" soit égal au nombre gagnant ET que le compteur soit égal à zéro. Sauf que je n'ai pas spécifié && mais || dans la condition de la boucle.

do
{
if (score > 0)
printf("Il vous reste %d coups. Retentez votre chance : ", compteur);
else if (score == 0)
printf("Vous avez %d coups. Essayez : ", compteur);

scanf("%d", &essai);

while (essai < valeurMIN || essai > valeurMAX)
{
valide = 0;
printf("\n\nCette valeur n'existe pas. Reessayez : ");
scanf("%d", &essai);
}
if (essai > nombreGagnant)
printf("C'est moins.\n\n");
if (essai < nombreGagnant)
printf("C'est plus.\n\n");
score++;
compteur--;
} while (essai != nombreGagnant || compteur > 0);

Comment faire pour que l'ordinateur "comprenne" que c'est un OU ?
Merci de vos réponses.

4 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 avril 2012 à 13:08
Faut faire attention avec les conditions dans les while.
Dans le do while(condition); si "condition" est vraie, on réitère la boucle.

Ici, tu feras la boucle tant que essai != nombreGagnant OU compteur > 0.
La condition d'arrêt est donc l'inverse de la "condition".
L'inverse de "essai != nombreGagnant OU compteur > 0" est : essai == nombreGagnant ET compteur<=0".

Cdlt,
0
Quester4 Messages postés 134 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 18 juillet 2013 126
29 avril 2012 à 13:40
L'idée, c'est que dès que essai est égal à nombreGagnant OU dès que compteur arrive à zéro, la boucle s'arrête. Donc il faut en théorie que l'utilisateur trouve le bon nombre pour arrêter la boucle, ou que le compteur de coups arrive à zéro.

A la compilation, il n'y a aucune erreur. Quand je teste, le programme va attendre qu'il y ait le bon nombre ET que le compteur arrive à zéro.
Si je n'ai pas trouvé au moment où le compteur arrive à zéro, il continue dans les négatifs au lieu de s'arrêter. Si j'ai trouvé avant la fin du décompte, la machine me redemande d'essayer.
Ici, l'idée est bien "tant que (essai != nombreGagnant || compteur > 0)", le programme continue. Pour que ça s'arrête, je voudrais que le compteur arrive à zéro OU que essai soit égal à nombreGagnant.
Donc l'erreur est que en pratique, le programme considère un ET alors qu'il devrait il y avoir un OU.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 avril 2012 à 14:01
L'idée, c'est que dès que essai est égal à nombreGagnant OU dès que compteur arrive à zéro, la boucle s'arrête.
Dis autrement, pour que la boucle continue, il faut que essai soit différent de nombreGagnant ET que compteur soit différent de 0.
Ce qu'il faut mettre dans while est donc : (nombreGagnant != essai && compteur > 0)

J'ai l'impression que vous êtes fâché avec l'algèbre de Bool et notamment avec la loi de De Morgan.

Donc l'erreur est que en pratique, le programme considère un ET alors qu'il devrait il y avoir un OU.
Le programme ne fait pas d'erreurs. Il fait ce que vous lui dites. En l'occurence il faut mettre un ET ici (voir paragraphe précédent).

A la compilation, il n'y a aucune erreur.
Normal, sémantiquement parlant il n'y a pas d'erreurs.
0
Quester4 Messages postés 134 Date d'inscription mercredi 8 février 2012 Statut Membre Dernière intervention 18 juillet 2013 126
29 avril 2012 à 14:14
Bon, malgré mes réticences, j'ai tout de même fini par mettre &&. Et le résultat ne change pas. J'ai un peu modifié le code :
do
{
if (score == 0)
printf("Essayez : ");
else
printf("Retentez votre chance : ");
score++;
scanf("%d", &essai);
if (essai < nombreGagnant && essai >= valeurMIN)
printf("C'est plus.\n\n");
else if (essai > nombreGagnant && essai <= valeurMAX)
printf("C'est moins.\n\n");
else if (essai < valeurMIN || essai > valeurMAX)
printf("Ce chiffre n'est pas valide. Entrez en un autre : ");
} while (essai != nombreGagnant && compteur > 0);

Donc la boucle continue jusqu'au moment où le compteur est inférieur à zéro ET que l'essai est égal au nombre gagnant.
Sauf que, comme dit plus haut, il faudrait que la boucle continue jusqu'au moment où soit le compteur arrive à zéro soit l'essai est égal au nombre gagnant.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
29 avril 2012 à 14:37
C'est mieux ainsi.
Maintenant, combien vaut compteur avant de rentrer dans la boucle do while ? Et où avez-vous mis compteur-- ? Je ne le vois plus dans votre seconde version.

PS : lorsque vous postez un code, merci de le mettre dans des balises "code" (à droite du bouton souligné) sinon c'est illisible.
0