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
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
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
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,
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,
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
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.
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.
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
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.
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.
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
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.
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.
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
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.
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.