Bonjour à tous, toujours le jeux du plus ou moins ..........
Je n'arrive pas à comprendre pour ce programme m'affiche " Au revoir " et s’arrête correctement si je choisi 0, mais ne m'affiche pas c'est " parti " et recommence le jeux. Au lieu de cela, si je tape 1 (par ex) je peux taper n'importe quel chiffre ou lettre indéfiniment, rien ne se passe. Je dois fermer le terminal moi même.
Je pense que cela vient de la structure même du programme mais je comprends po.
Merci pour votre aide
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int nombre = 0 , nombreMystere = 0, MAX = 100, MIN = 1 , compteur = 0 , partie =1 ;
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN +1)) +MIN;
do
{
printf("Quel est le nombre ?:\n");
scanf("%d", &nombre);
compteur++;
if (nombre<nombreMystere)
printf("C'est plus\n");
else if(nombre>nombreMystere)
printf("C'est moins\n");
else
printf("Bravo, partie réussi en %d coup%c\n", compteur, (compteur>1) ? 's' : ' ');
}
while (nombre!=nombreMystere);
{
printf("Une autre partie ?\n");
printf("0 pour non, autre chiffre pour oui\n");
scanf("%d", &partie);
if (partie ==1)
printf("C'est parti");
else
printf("Au revoir");
}
while (partie!=0);
return 0;
Je ne sais pourquoi elle n’apparaît pas mais il y a une accolade } en ligne 43
Je viens de mettre un do après le premier while (et avant accolade). Ca bouge un peu mais c'est pas ça. La boucle répétée est la deuxième mais pas le jeu entier. (il y à aussi un autre soucis dans la réponse à la sélection mais secondaire)
C'est ça zoup, il faut que je trouve le moyen de les imbriquer. Une petite piste ? (car à force de tourner en rond, j'ai peur de plus sortir du fossé que j'ai creusé !!)
Franchement, je deviens fou. J'ai beau mettre de while, do while,... dans tous les sens, le jeu ne veux jamais revenir au début. Ma dernière tentative ci-après, aller m'expliquer pourquoi, n’exécute pas la première boucle mais me pose de suite la question "Voulez vous rejouer".
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int nombre = 0 , nombreMystere = 0, MAX = 5, MIN = 1 , compteur = 0 , nouvellePartie = 1;
srand(time(NULL));
nombreMystere = (rand() % (MAX - MIN +1)) +MIN;
while(nouvellePartie!=1)
do
{
printf("Quel est le nombre ?\n");
scanf("%d", &nombre);
compteur++;
if (nombre > nombreMystere)
printf("C'est moins\n");
else if (nombre < nombreMystere)
printf("C'est plus\n");
else
printf("Bravo, vous avez réussi en %d coup%c\n", compteur, (compteur+1) ? 's' : ' ');
}while(nombre!=nombreMystere);
do
{
printf("Voulez vous rejouer?\n");
printf("Tapez 0 pour quitter, autre touche pour jouer\n");
scanf("%d", &nouvellePartie);
}while(nouvellePartie);
{
printf("Au revoir");
}
return 0;
}
Merci SofEvans, je le sait en plus. C'est modifié mais ça ne change rien. Le jeu reprend sans la deuxième boucle. Étant sous linux, je commence à maîtriser le ctrl-c.
C'est déjà !=1. Si j’écris nouvellePartie=1, le jeu recommence mais sans passer par la deuxième boucle.
En toute logique, le test ligne 13 donne false (1!=1, c'est faux), donc tu vas directement en ligne 34. Et tu ne sortiras de ce do....while que lorsque nouvellePartie sera =0.... ce qui affichera "au revoir", et fin du programme.
Oublie ce while en ligne 13, et transforme-le en do....while → voir mon, p'tit exemple
Et, conseil: indente ton code et, tant que tu ne seras pas sur de toi, mets les { }
- Edité par edgarjacobs 21 novembre 2017 à 22:19:20
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Pourrais tu me faire comprendre l'erreur de mon raisonnement qui est le suivant :
0, c'est faux
1, (ou toute autre valeur positive) c'est vrai
Donc je me dis que le programme va suivre les lignes de code suivantes jusqu'à ce qu'il tombe sur la variante " nouvellePartie ". La réponse à la question pouvant être 0 (c-a-d Non) et dans ce cas il s’arrête, ou 1 et tout autre chiffre/numéro (c-a-d Oui) et là il recommence.
Cette logique en elle-même se tient, mais n'est pas valable pour un programme, je m'en rends bien compte.
1!=1 ? → un est-différent de un ? Non, l'évaluation donne faux → on passe à l' (aux) instruction(s) du else, si elle(s) existe(nt), puis on continue
1==1 ? → un est est-il égal à un ? Oui, l'évaluation donne vrai → on fait l'(es) instruction(s) qui sui(ven)t le if, on saute celle(s) du else, et on continue
Mais sémantiquement, en français: un est-il différent de un ? Non, mais réponse exacte.
- Edité par edgarjacobs 22 novembre 2017 à 0:20:42
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
if (0) {
printf("Jamais exécuté\n");
}
if (1) {
printf("toujours exécuté\n");
}
Maintenant, dans un contexte "d'évaluation" d'expression, "1 != 1" est faux (1 est-il différent de 1 ?). Le "1 != 1" est évalué comme équivalent 0.
if (0) {
printf("première maniére\n");
}
if (1 != 1) {
printf("deuxième manière, identique à la première\n");
}
Tu confond le résultat de l'évaluation d'une expression avec les valeurs qui compose l'expression. Si par exemple, tu fait un programme de ce type :
int age = 12;
if (age < 0) {
printf("Pas encore né ? C'est pour bientôt !\n");
}
if (0 <= age && age <= 10) {
printf("Tu as entre 0 et 10 ans !\n");
}
if (10 < age) {
printf("Tu as plus de 10 ans !\n");
}
Pour age = 12, les expression seront évalué comme ce qui suit :
int age = 12;
// "age < 0" -->> "12 < 0" -->> "0" (faux)
if (age < 0) {
printf("Pas encore né ? C'est pour bientôt !\n");
}
// "0 <= age" -->> "0 <= 12" -->> "1" (vrai)
// "age <= 10" -->> "12 <= 10 -->> "0" (faux)
// "0 <= age && age <= 10" -->> "1 && 0" -->> (faux)
if (0 <= age && age <= 10) {
printf("Tu as entre 0 et 10 ans !\n");
}
// "10 < age" -->> "10 < 12" -->> "1" (vrai)
if (10 < age) {
printf("Tu as plus de 10 ans !\n");
}
Le seul printf qui s'affichera sera "Tu as plus de 10 ans !".
Le "0" et le "1" qui sont le résultat de l'évaluation ne sont en généralement pas manipuler telle quelle, mais c'est amplement possible.
int age = 12;
bool majeur = 18 <= age;
if (majeur) {
printf("Tu es majeur.\n");
else {
printf("Tu n'es pas majeur.\n");
}
Le printf qui s'affichera est "Tu n'es pas majeur", car la ligne "bool majeur = 18 <= age;" est évalué comme ceci :
int age = 12;
bool majeur = (18 <= age);
// la ligne du dessus est équivalente à la ligne du dessous
bool majeur = (18 <= 12);
// la ligne du dessus est équivalente à la ligne du dessous
bool majeur = 0;
if (majeur)
// la ligne du dessus est équivalente à la ligne du dessous
if (0)
Je viens de voir vos post et .........merci. Demain, enfin tout à l'heure maintenant, je vais me pencher dessus sérieusement. Mes yeux me réclament une pause, mais je crois que je vais dormir vite.
Bonjour edgarjacobs et SofEvans. Vos explications et exemples ont été très bénéfiques. Pas pour ce programme mais pour la suite.
Pour ce qui est du programme, j'ai trouvé la (une ?) solution. Heureusement qu'on a du très beau temps et chaleur sur la cote-basque, ça m'a permis de faire un break et la réponse est arrivé toute seule. Est-ce-que je peux vous le soumettre pour avis (et savoir s'il y a plus simple à faire) ? S'il le faut, j'effacerai ma solution avant de passer ce problème en résolu.
Comme il me semble que l'idée du site est de ne pas donner les solutions mais plutôt aiguiller (comme tu l'a fait), je préfère poser la question. Ce sont mes débuts .
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
int compteur = 0 , nombre = 0 , MAX = 100 , MIN =1 , nombreMystere = 0 , nouvellePartie = 1;
srand(time(NULL));
do
{
compteur = 0;
nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
do
{
printf("\n");
printf("Quel est le nombre ?\n");
scanf("%d", & nombre);
compteur++;
if(nombre > nombreMystere)
printf("C'est moins\n");
else if(nombre < nombreMystere)
printf("C'est plus\n");
else
printf("Vous avez trouve en %d coup%c\n" , compteur, (compteur > 1) ? 's' : '\0');
}while(nombre != nombreMystere);
{
printf("Voulez vous rejouer ?\n\n");
printf("0 pour quitter ou autre chiffre pour continuer\n\n");
scanf("%d", &nouvellePartie);
if(nouvellePartie==0)
printf("Au revoir\n");
else
printf("C'est parti\n");
}
}while(nouvellePartie>=1);
return 0;
}
En dehors de l'indentation (peut-être due au copié/collé), bon code.
Quelques remarques (ha bin oui), mais qui n'impactent pas le fait que le code soit correct
la forme du main() n'est pas correcte: seules les formes int main(void) ou int main(int,char **) sont reconnues dans la norme
Les initialisations ligne 8 ne sont nécessaires que pour MIN et MAX.
l'accolade ligne 33 (et fatalement ligne 42) n'a aucune raison d'être.
ligne 36: il est possible d'entrer un nombre négatif. Quid alors du test ligne 43 ? Ou alors il faut changer le message ligne 35 (c'est juste pour t'enquiquiner, mais un jour [peut-être] devras-tu penser à ce genre de chose: ne jamais faire confiance à l'utilisateur).
Il y a encore autre chose au sujet du scanf(), mais tu verras ça plus tard dans le tutoriel.
- Edité par edgarjacobs 23 novembre 2017 à 21:26:53
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
-Pour les accolades : elles ne sont pas nécessaires car il n'y à pas de "fonction" avant ?
-Pour le coup du nombre négatif, je vois ce que tu veux dire. Mais s'il y en a un qui s'amuse à ça, tant pis pour lui. Fini pour lui de passer de longues heures avec un jeu si captivant et instructif !
-Sinon, pour l'initialisation : pour compteur, je comprend puisque je l'initialise aprés do. Mais pour les autres (j'ai fait le test pour m'en assurer) j'ai le message d'erreur , ex : 'nombre' undeclared (first use in this fonction). Ce qui me parait logique. Pourquoi ne sont elles pas nécessaire alors ?
Pour les accolades, elles entourent un bloc d'instructions, typiquement après un if else do switch while. Mais tu peux écrire
{
puts("Bonjour");
{
puts("Encore bonjour");
}
}
sans problème.
Tu confonds déclaration et initialisation. Déclaration:
int i;
déclaration et initialisation
int i=852647;
Dans la mesure où tu mets compteur à zéro ligne 14, pas besoin d'écrire compteur=0 ligne 8. Personnellement, je n'initialise rien lors des déclarations, je ne le fais qu'au moment nécessaire. Beaucoup de gens diront "ça évite d'avoir une variable qui contient n'importe quoi", ce à quoi je réponds: ça ne fait que reporter le problème si l'initialisation n'est pas la bonne.
- Edité par edgarjacobs 24 novembre 2017 à 0:13:40
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Compris et encore merci pour tous les conseils/explications (jusqu'au prochain sujet que j'ouvrirai !). Mais sans vouloir me disculper, concernant les déclarations et initialisations, je n'en suis qu'à la huitième étape de l'apprentissage. Du coup, je déclare et initialise comme il est dit. Cela dit, je comprends tout à fait ta phrase: "ça ne fait que reporter le problème si l'initialisation n'est pas la bonne."
Avant de passer ce sujet en résolu, est-il "préférable" pour les autres débutants comme moi que j'efface ma solution du jeu afin qu'ils trouvent par eux-mêmes ? A la prochaine !
.... Mais sans vouloir me disculper, concernant les déclarations et initialisations, je n'en suis qu'à la huitième étape de l'apprentissage....
Aucun souci, à ce sujet-là, chacun voit les choses à sa manière.
Genin64 a écrit:
Avant de passer ce sujet en résolu, est-il "préférable" pour les autres débutants comme moi que j'efface ma solution du jeu afin qu'ils trouvent par eux-mêmes ?
Surtout pas. D'abord, ça peut intéresser d'autres personnes de suivre le fil de la discussion (du problème à sa résolution) - particulièrement vrai pour tous les problèmes "hors sujets classiques". Et ensuite, c'est tellement dommage de voir effacées les traces de l'approche, du cheminement vers une solution. Comme celui (celle) qui poste un problème, et qui édite son post 2h plus tard en écrivant un laconique "Résolu" -- sans dire comment....
Collaboration agréable, à la prochaine
- Edité par edgarjacobs 24 novembre 2017 à 0:25:08
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
Probleme de boucle
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent