Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme de boucle

Boucle ne s'execute pas

Sujet résolu
    21 novembre 2017 à 15:14:46

    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

    -
    Edité par Genin64 21 novembre 2017 à 15:31:39

    • Partager sur Facebook
    • Partager sur Twitter
      21 novembre 2017 à 15:33:12

      je pense qu'il te manque un do.

      Tu devrais le voir en indentant soigneusement ou mieux, en utilisant un debugger.

      -
      Edité par zoup 21 novembre 2017 à 15:41:05

      • Partager sur Facebook
      • Partager sur Twitter
        21 novembre 2017 à 15:48:57

        Bonjour zoup,

        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)

        • Partager sur Facebook
        • Partager sur Twitter
          21 novembre 2017 à 15:59:43

          Hello,

          Le problème est clair, je condense ton code:

          do { 
          	scanf("%d", &partie);
          } while (partie!=0);

          Voilà pourquoi tu ne sors proprement qu'avec zéro ....

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            21 novembre 2017 à 15:59:47

            si tu mets un do après le 1er while, tu vas te retrouver avec 2 boucles successives et pas imbriquées, donc tu ne pourras pas recommencer.
            • Partager sur Facebook
            • Partager sur Twitter
              21 novembre 2017 à 16:38:27

              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é !!)
              • Partager sur Facebook
              • Partager sur Twitter
                21 novembre 2017 à 16:46:50

                Re,-

                Genin64 a écrit:

                .... il faut que je trouve le moyen de les imbriquer. Une petite piste ? ....

                do { // rejouer
                
                    do { // chercher le nombre
                        ....
                    } while(entré <> mystère)
                
                    do { // voulez-vous rejouer ?
                        ....
                    } while(rejouer < 0 ou rejouer > ....);
                
                } while(rejouer==je veux rejouer);


                -
                Edité par edgarjacobs 21 novembre 2017 à 16:49:57

                • Partager sur Facebook
                • Partager sur Twitter

                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                  21 novembre 2017 à 17:03:23

                  Merci edgarjacobs, je pense voir ce que tu veux dire. Il faudrait en fait que je revois complètement la structure du programme. C'est ça?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    21 novembre 2017 à 17:23:49

                    Il faut juste organiser les boucles comme il faut. Il n'y a pas tant de lignes à bousculer.

                    -
                    Edité par zoup 21 novembre 2017 à 17:23:57

                    • Partager sur Facebook
                    • Partager sur Twitter
                      21 novembre 2017 à 20:10:47

                      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;
                      }

                      Mayde, j'en peux plus.....

                      • Partager sur Facebook
                      • Partager sur Twitter
                        21 novembre 2017 à 20:17:54

                        Again,-

                        Ligne 13: nouvellePartie vaut 1, que donne l'évaluation nouvellePartie!=1  ?

                        -
                        Edité par edgarjacobs 21 novembre 2017 à 20:18:19

                        • Partager sur Facebook
                        • Partager sur Twitter

                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                          21 novembre 2017 à 20:27:28

                          C'est déjà !=1. Si j’écris nouvellePartie=1, le jeu recommence mais sans passer par la deuxième boucle.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            21 novembre 2017 à 20:46:38

                            Parce que == est différent de = ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              21 novembre 2017 à 21:07:37

                              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.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                21 novembre 2017 à 22:14:00

                                Genin64 a écrit:

                                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

                                • Partager sur Facebook
                                • Partager sur Twitter

                                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                  21 novembre 2017 à 23:29:36

                                  edgarjacobs a écrit:

                                  (1!=1, c'est faux)

                                   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.

                                  Merci encore




                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    21 novembre 2017 à 23:56:02

                                    Still on the road,-

                                    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

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                      22 novembre 2017 à 0:01:03

                                      Oui, 0 = faux, tout autre valeur = vrai.

                                      C'est pour cela que

                                      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)

                                      Voila voila.









                                      -
                                      Edité par SofEvans 22 novembre 2017 à 1:06:18

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        22 novembre 2017 à 0:58:04

                                        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. :)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          23 novembre 2017 à 18:14:13

                                          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.

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            23 novembre 2017 à 19:13:11

                                            New day,-

                                            Genin64 a écrit:

                                            ....Est-ce-que je peux vous le soumettre pour avis....

                                            Fallait pas poser la question, mais poster le code ;)

                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                              23 novembre 2017 à 19:43:41

                                              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 :honte::).

                                              #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;
                                              }
                                              



                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                23 novembre 2017 à 21:13:12

                                                Hello,

                                                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

                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                                  23 novembre 2017 à 21:51:47

                                                  Merci du retour.

                                                  -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 !:D:D

                                                  -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 ?

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    23 novembre 2017 à 23:01:58

                                                    De rien.

                                                    • 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

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter

                                                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                                      23 novembre 2017 à 23:44:00

                                                      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 !:)

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        24 novembre 2017 à 0:17:14

                                                        End of game, -

                                                        Genin64 a écrit:

                                                        .... 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 :D

                                                        -
                                                        Edité par edgarjacobs 24 novembre 2017 à 0:25:08

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        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.
                                                        • Editeur
                                                        • Markdown