Partage
  • Partager sur Facebook
  • Partager sur Twitter

[c]probleme tp1

c'est au moment de recommencer une partie

Sujet résolu
    11 avril 2006 à 14:15:15

    salut alors je me suis lancé dans le cour de c et j'en suis au premier tp mais j'ai un probleme j'ai reussi sans probleme a faire le tp mais au moment de l'ameliorer j'ai un petit probleme: quand je demande si on veu recommencer le programme recommence mais pas au debut enfin voila ce que ca donne

    entrez un nombre entier entre 1 et 100
    50
    C'est moins
    entrez un nombre entier entre 1 et 100
    40
    C'est plus
    entrez un nombre entier entre 1 et 100
    45
    C'est plus
    entrez un nombre entier entre 1 et 100
    46
    C'est plus
    entrez un nombre entier entre 1 et 100
    47
    C'est plus
    entrez un nombre entier entre 1 et 100
    48
    C'est plus
    entrez un nombre entier entre 1 et 100
    49
    vous avez trouve le nombre mystere
    Souhaitez vous continuer?

    1.Recomencer
    2.Quitter
    1
    Souhaitez vous continuer?

    1.Recomencer
    2.Quitter
    1
    Souhaitez vous continuer?

    1.Recomencer
    2.Quitter

    et ca continu a faire ca a l'infini.

    voila mon code (normalement il est bien commenté ca devrait pas etre tp dur a s'y retrouvé j'ai suivi les conseils de mateo)

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>

    int main(int argc, char *argv[])
    {
        // on initialise les variable
      const char MAX = 100, MIN = 1;
      char quitter = 0;
      char nombreScanf = 0, NOMBRE_MYSTERE = 0;
     
     
    //-------------------------------------------//
    //-----[boucle qui contient tout le jeu]-----//
    //-------------------------------------------// 

    while(quitter == 0) // tant que quiter = 0 on fait la boucle (la premiere foi il est = a 0 donc la boucle s'execute une foi au moins
      {
      nombreScanf = 0; // on redonne la valeur zero pour quand le boucle recommence a la deuxieme partie
      NOMBRE_MYSTERE = 0; // la aussi
      // on va tirer le nombre au hazard (il est tiré dans la boucle pour etre différent a chaque partie)
      srand(time(NULL))
      NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN;
     
     
    /* tant que le nombre entré n'est pas égal au nombre mystere la boucle s'execute
     (la premiere fois le nombre entré vaut 0 donc est forcement innegal vu que le nombre
     est obligatoirement STRICTEMENT superieur a 0.) */

     
     while (nombreScanf != NOMBRE_MYSTERE) //on debute donc cette boucle
      {
                     printf("entrez un nombre entier entre 1 et 100\n"); // on demande d'entrer un nombre
                     scanf("%ld",&nombreScanf);
                     
                     //on test si le nombre entré vaut le nombre mystere et on affiche un message en consequence
                     if (nombreScanf < NOMBRE_MYSTERE) // si nb scané est strictement unferrieur alors
                        {printf("C'est plus\n");}// on ecrit que le nombre est plus grand
                     else if (nombreScanf > NOMBRE_MYSTERE)//Si le nb scané est plus grand
                        {printf("C'est moins\n");} // on ecrit que le nombre a trouver est plus petit
                     else if (nombreScanf == NOMBRE_MYSTERE)// sinon si le nombre est egal c'est que on a trouvé et la boucle s'arretera
                     {printf("vous avez trouve le nombre mystere\n");}// on ecrit au joueur qu'il a gagné
                     else // sinon si le nombre n'est ni superieur ni inferieur ni egal c'est qu'il y a une erreur
                        {printf("error");}// on l'indioue a l'utilisateur                               
      }
    /* on a fini de jouer maintenant on demande au joueur si il veut quitter ou recomencer*/
     
      printf("Souhaitez vous continuer?\n\n");
      printf("1.Recomencer\n2.Quitter\n");
      scanf("%ld", &quitter); // il tape son choix (1 ou 2) et on enregistre le nombre dans la variable quitter
     
      switch (quitter) //on fait une condition
       {
             case 1: // dans le cas ou quitter vaut 1
                  quitter = 0; // on la remet a zero pour que la boucle du jeu recommence
                  break;
             case 2:
                  quitter = 1;// on a fait devenir egale a 1 pour que le programme se ferme
                  break;
       }               
    }
    /* ici on est a la fin de la boucle il y a deux solution :
           - soit quitter = 0 et la boucle recommence
           - soit quitter vaut 1 et on passe aux instructions suivantes qui mennent a la fermeture du programme */

                     
      system("PAUSE");     
      return 0;
    }


    Merci si vous voyez d'ou vien le probleme parceque je comprend pas j'aiessayé quelques truc mais ca marche pas je suis bloqué la.
    • Partager sur Facebook
    • Partager sur Twitter
      11 avril 2006 à 14:20:36

      Bonjour,

      La boucle :
      *************************************
      while (nombreScanf != NOMBRE_MYSTERE)
      *************************************
      n'est pas lue, parce que la condition est remplie. Au moment où on demande de continuer le jeu, tu dois regénérer le nombre aléatoire.
      • Partager sur Facebook
      • Partager sur Twitter
        11 avril 2006 à 14:35:31

        Citation : bigjake

        salut alors je me suis lancé dans le cour de c et j'en suis au premier tp mais j'ai un probleme j'ai reussi sans probleme a faire le tp mais au moment de l'ameliorer j'ai un petit probleme: quand je demande si on veu recommencer le programme recommence mais pas au debut enfin voila ce que ca donne


        Je ne vois pas de problème :

        entrez un nombre entier entre 1 et 100
        50
        C'est moins
        entrez un nombre entier entre 1 et 100
        25
        C'est plus
        entrez un nombre entier entre 1 et 100
        32
        C'est plus
        entrez un nombre entier entre 1 et 100
        38
        C'est plus
        entrez un nombre entier entre 1 et 100
        42
        vous avez trouve le nombre mystere
        Souhaitez vous continuer?

        1.Recomencer
        2.Quitter
        1
        entrez un nombre entier entre 1 et 100
        <...>

        Mais comme souvent, scanf() est mal utilisé et le code est instable si on entre autre chose qu'un nombre...

        http://mapage.noos.fr/emdel/notes.htm#saisie
        http://mapage.noos.fr/emdel/notes.htm#fichiers
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          11 avril 2006 à 14:42:29

          Juste après :
          *************************************
          srand(time(NULL));
          NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN;
          *************************************
          Si on affiche le nombre mystère printf("%ld\n", NOMBRE_MYSTERE);, il retourne 0 lorsqu'on tape 1 pour recommmencer.
          • Partager sur Facebook
          • Partager sur Twitter
            11 avril 2006 à 14:49:59

            Citation : Orphée

            Juste après :
            *************************************
            srand(time(NULL));
            NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN;
            *************************************
            Si on affiche le nombre mystère printf("%ld\n", NOMBRE_MYSTERE);, il retourne 0 lorsqu'on tape 1 pour recommmencer.


            Il y a effectivement un problème. srand() ne doit être appelé qu'une seule fois. Il faut le placer avant la boucle. D'autre part, il serait préférable d'utiliser do-while(), ça évite les pré-conditions douteuses...

            C'est pour ça que je ne suis pas forcément d'accord avec le principe d'initialiser les variables systématiquement.

            Ce code fonctionne :

            #include <stdio.h>
            int main (void)
            {
               int end = 0;
               while (!end)
               {
                  char s[4];
                  printf ("'q' pour quitter\n");
                  fgets(s, sizeof s, stdin);
                  end = *s == 'q';
               }
               return 0;
            }

            Mais n'est-il pas trop compliqué ?

            Que se passe-t-il si la variable 'end' n'est pas initialisée :

            Je préfère écrire un algorithme qui fait le boulot :

            #include <stdio.h>
            int main (void)
            {
               int end;
               while (!end)
               {
                  char s[4];
                  printf ("'q' pour quitter\n");
                  fgets(s, sizeof s, stdin);
                  end = *s == 'q';
               }
               return 0;
            }

            Le compilateur fait son travail et signale :
            Project : Forums

            main.c: In function `main_':
            main.c:6: warning: 'end' might be used uninitialized in this function

            Là, on doit s'interroger.
            - soit j'initialise la variable (solution naive)
            - soit je reflechis à l'algorithme :
            -- Pourquoi tester une valeur que l'exécution du code n'a pas encore initialisé ?
            -- Est-ce que l'exécution provoque toujours l'initialisation ?

            Conclusion, on peut tester après coup, c'est à dire utiliser do-while ;

            /* main.c */
            #include <stdio.h>
            #include <stdio.h>
            int main (void)
            {
               int end;
               do
               {
                  char s[4];
                  printf ("'q' pour quitter\n");
                  fgets(s, sizeof s, stdin);
                  end = *s == 'q';
               }
               while (!end);
               return 0;
            }

            Ce qui est un algorithme parfaitement simple et logique. Pas d'astuce, que du code 'droit'.
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              11 avril 2006 à 15:15:11

              bonjour,

              j'ai testé ton code, le fait de mettre srand hors de la boucle ne change rien au problème... j'ai fait un printf

              avant et après la ligne
              NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN;

              et bien la première fois on a bien 0 et un autre nombre mais à la deuxième boucle on obtient 0 et 0... donc la ligne : NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN; n'a pas d'effet à la deuxième boucle... et ça je ne sais pas pourquoi... je cherche...

              A bientôt...
              • Partager sur Facebook
              • Partager sur Twitter
                11 avril 2006 à 15:18:38

                Citation : vinceh1983


                j'ai testé ton code, le fait de mettre srand hors de la boucle ne change rien au problème... j'ai fait un printf

                avant et après la ligne
                NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN;

                et bien la première fois on a bien 0 et un autre nombre mais à la deuxième boucle on obtient 0 et 0... donc la ligne : NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN; n'a pas d'effet à la deuxième boucle... et ça je ne sais pas pourquoi... je cherche...


                Essaye les do-while. Plus besoin d'init foireuse...
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  11 avril 2006 à 15:24:46

                  personnellement je n'ai pas géré ce tp de cette manière... j'ai fait des fonctions, des boucles, etc... chacun à son propre raisonnement et je ne pense pas qu'il y ait fondamentalement de raisonnement mauvais... ici je ne vois pas ce qui ne marche pas dans la manière où c'est codé mais je cherche à trouver ce qui ne marche pas dans cette solution et pas une autre solution... et je pense que Bigjake n'attend pas de nous une solution toute prête mais bien un coup de main pour résoudre le problème de SA solution... alors cherchons cherchons !!!

                  A bientôt
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 avril 2006 à 22:04:19

                    int main(int argc, char *argv[])
                    {
                        // on initialise les variable
                      const char MAX = 100, MIN = 1;
                      char quitter = 0;
                     
                      srand(time(NULL));
                     
                    //-------------------------------------------//
                    //-----[boucle qui contient tout le jeu]-----//
                    //-------------------------------------------// 

                    while(quitter == 0) // tant que quiter = 0 on fait la boucle (la premiere foi il est = a 0 donc la boucle s'execute une foi au moins
                      {
                      const char MAX = 100, MIN = 1;
                      char quitter = 0;
                      char nombreScanf = 0, NOMBRE_MYSTERE = 0, nombreDeCoups = 0;
                      //nombreScanf = 0; // on redonne la valeur zero pour quand le boucle recommence a la deuxieme partie
                      //NOMBRE_MYSTERE = 0; // la aussi
                      // on va tirer le nombre au hazard (il est tiré dans la boucle pour etre différent a chaque partie)
                     
                      NOMBRE_MYSTERE = (rand() % (MAX - MIN + 1)) + MIN;


                    j'ai créer les variables a l'interrieur de la boucle et apperement ca marche maintenant merci quand meme de votre aide

                    ps : merci vinceh1983 parceque ce que tu as dit est vrai (en plus vu mon niveau les autres methodes que vous me donniez je ne les comprennait pas)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [c]probleme tp1

                    × 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