Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le plus ou le moins

Sans le choix 0 et 1

    22 août 2007 à 17:30:46

    Bonjour,

    Voilà j'ai fait ce code modifié du Plus ou du moins:
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <time.h>
    4. int main(int argc, char *argv[])
    5. {
    6. long nombreMystere = 0, nombreEntre = 0, rejouer = 1;
    7. const long MAX = 100, MIN = 0;
    8. srand(time(NULL));
    9. nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
    10. do
    11. {
    12.     printf("Veuillez choisir un 1 pour jouer et 0 pour quitter !\n");
    13.     scanf("%ld", &rejouer);
    14.     if (rejouer == 1) {
    15. printf("Veuillez choisir un chiffre entre 0 et 100\n");
    16. nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
    17. do{
    18.     scanf("%ld", &nombreEntre);
    19.     if (nombreEntre < nombreMystere) {printf("Le nombre Mystere est plus!\n");}
    20.     else if (nombreEntre > nombreMystere) {printf("Le nombre Mystere est inferieur\n");}
    21.     else {printf("Bravo ! Vous avez trouve le chiffre Mystere ! Le chiffre Mystere etait: %ld\n", nombreEntre);}
    22. } while (nombreEntre != nombreMystere);}
    23.     else if (rejouer == 0) {printf("Vous ne voulez pas y jouer... dommage!\n\n");
    24.       system("PAUSE");
    25.   return 0;}
    26.     else printf("Veuillez choisir un 1 pour jouer et 0 pour quitter !\n");
    27. } while (rejouer < 10);
    28.   system("PAUSE");
    29.   return 0;
    30. }



    Mon programme permet de choisir 1 si l'on veut jouer et 0 si l'on ne veut pas jouer... Si l'on met 4 ou 6 par exemple, cela me remet mes choix. Simple oui...
    Mais pourquoi si l'on mets un nombre à plus de 1 chiffre (genre 12) le programme s'arrete?


    Mon problème c'est que je ne veut pas savoir la solution pour que ça s'enlève, mais j'aimerai juste savoir pourquoi cela se produit parce que je ne le sait pas.

    Voilà je ne veut pas de solution, mais juste une explication.

    Merci ^^
    • Partager sur Facebook
    • Partager sur Twitter
      22 août 2007 à 18:01:51

      - ton code est illisible
      - tu pourrais beaucoup le simplifier
      • Partager sur Facebook
      • Partager sur Twitter
        22 août 2007 à 22:15:57

        ton problème est là, ligne 28:
        1. } while (rejouer < 10);

        Tant que l'on entre un nombre plus petit que 10 on rejoue, mais si on entre plus, le jeux s'arrête, et ce n'est pas ce que tu veux!
        1. } while (rejouer > 0 || rejouer < 1);

        Ce code est correct, si tu entre un chiffre plus petit que 1 ou plus grand que 0 ( soit 1 ou 0), ta boucle se refait, mais j'avoue que ton code est illisible ( j'ai eu du mal) et est très compliquer, il marche peut être, mais il marche à l'envers, ce qui t'oblige à te compliquer la vie et à résonner à l'envers!
        Pour preuve, sur tout les TP + ou -, tout le monde mettait
        1. } while (rejouer < 0 || rejouer > 1);

        Alors que toi c'est l'inverse qu'il faut mettre!!!
        1. } while (rejouer > 0 || rejouer < 1);
        • Partager sur Facebook
        • Partager sur Twitter
          23 août 2007 à 4:01:22

          Citation : FeNiX57

          ton problème est là, ligne 28:

          1. } while (rejouer < 10);


          Tant que l'on entre un nombre plus petit que 10 on rejoue, mais si on entre plus, le jeux s'arrête, et ce n'est pas ce que tu veux!

          1. } while (rejouer > 0 || rejouer < 1);


          Ce code est correct, si tu entre un chiffre plus petit que 1 ou plus grand que 0 ( soit 1 ou 0), ta boucle se refait, mais j'avoue que ton code est illisible ( j'ai eu du mal) et est très compliquer, il marche peut être, mais il marche à l'envers, ce qui t'oblige à te compliquer la vie et à résonner à l'envers!
          Pour preuve, sur tout les TP + ou -, tout le monde mettait

          1. } while (rejouer < 0 || rejouer > 1);


          Alors que toi c'est l'inverse qu'il faut mettre!!!

          1. } while (rejouer > 0 || rejouer < 1);

          Désolé, mais c'est faux.
          while(rejouer>0||rejouer<1);
          Est infini comme boucle si on entre des nombres entiers.

          Le seul moyen de quitter cette boucle serait de "kill'er" l'application.

          En fait, ce qu'il faut faire c'est insérer une boucle qui va répéter l'instruction de saisie (scanf()) tant que la saisie est incorrecte.

          tant que saisie plus petit que minimum ou saisie plus grand que maximum
          afficher instructions
          lire saisie
          fin tant que

          /*Reste du programme*/

          Je te laisse réfléchir à ça.

          J'espère avoir aidé.
          Cordialement, Vhann.
          • Partager sur Facebook
          • Partager sur Twitter
            23 août 2007 à 13:54:36

            Citation : Vhann

            Citation : FeNiX57

            ton problème est là, ligne 28:

            1. } while (rejouer < 10);


            Tant que l'on entre un nombre plus petit que 10 on rejoue, mais si on entre plus, le jeux s'arrête, et ce n'est pas ce que tu veux!

            1. } while (rejouer > 0 || rejouer < 1);


            Ce code est correct, si tu entre un chiffre plus petit que 1 ou plus grand que 0 ( soit 1 ou 0), ta boucle se refait, mais j'avoue que ton code est illisible ( j'ai eu du mal) et est très compliquer, il marche peut être, mais il marche à l'envers, ce qui t'oblige à te compliquer la vie et à résonner à l'envers!
            Pour preuve, sur tout les TP + ou -, tout le monde mettait

            1. } while (rejouer < 0 || rejouer > 1);


            Alors que toi c'est l'inverse qu'il faut mettre!!!

            1. } while (rejouer > 0 || rejouer < 1);


            Désolé, mais c'est faux.
            while(rejouer>0||rejouer<1);
            Est infini comme boucle si on entre des nombres entiers.

            Le seul moyen de quitter cette boucle serait de provoquer une erreur (en entrant autre chose que des chiffres par exemple (ou, bien sûr, de "kill'er" l'application).

            En fait, ce qu'il faut faire c'est insérer une boucle qui va répéter l'instruction de saisie (scanf()) tant que la saisie est incorrecte.

            tant que saisie plus petit que minimum ou saisie plus grand que maximum
            afficher instructions
            lire saisie
            fin tant que

            /*Reste du programme*/

            Je te laisse réfléchir à ça.

            J'espère avoir aidé.
            Cordialement, Vhann.



            Non non non analyse mieux son code, tu verras que j'ai raison ^^
            dans la boucle principal (rejouer oui ou non), il y a un "if(jouer == 1)" dans lequel il y a le jeu, un "if else (jouer ==0)" dans lequel il y a "printf("dommage vous ne voulez pas jouer\n" );, et return 0;", et un else qui pose la question voulez-vous jouer? 1 pour oui, 0 pour non, donc avec ce que j'ai dit:
            1. } while (rejouer > 0 || rejouer < 1);

            Si la personne entre 1 la partie recommence, puis la boucle se refait et repose la question s'il veut rejouer, si la personne dit 0, la passe sur le else if, et arrête le jeux, si il entre autre chose que 1 ou 0, le else se met en place ( et repose la question) pusi la boucle recommence et repose une nouvelle fois la question... il suffit donc bien de mettre
            1. } while (rejouer > 0 || rejouer < 1);
            et de retirer le else, ne servant à rien
            • Partager sur Facebook
            • Partager sur Twitter
              23 août 2007 à 13:56:29

              J'aime pas trop la condition (if rejouer == 1) :o Pour ça y a les boucles.. (même si ça marche ta méthode mais autant bien coder).
              • Partager sur Facebook
              • Partager sur Twitter
                23 août 2007 à 13:58:54

                Je suis tout à fait d'accord, mais j'ai donné la solution avec son code, qui est je suis d'accord très mal coder, mais bon tant que ça marche hun ^^ mais pour les améliorations, je pense qu'il vas avoir du mal!
                • Partager sur Facebook
                • Partager sur Twitter
                  27 août 2007 à 5:03:22

                  Pardon, j'ai fait une erreur.

                  Ce que je voulais dire surtout, c'était que, tant qu'à faire une boucle qui se répète tant que le nombre entier entré par l'utilisateur est plus petit que 1 ou plus grand que 0, aussi bien mettre "while(1);"!

                  Bref, tu as deux "return" dans ton programme (ce qui, à mon avis, n'est pas la meilleure façon de programmer déjà, mais en plus, et que je viens de l'écrire, le contrôle n'atteint jamais la fin du programme (hors de la boucle infinie).

                  Pour le reste, je dois avouer que l' "indentation" n'avait rien pour m'aider à lire le code.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 août 2007 à 14:08:09

                    1. while (rejouer > 0 || rejouer < 1);


                    Ce ne serais pas une boucle infini ?
                    Car taper un nombre entier plus grand que 0 et plus petit que 1....

                    Ce serais plutôt :

                    1. while (rejouer >= 0 || rejouer <= 1);
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 août 2007 à 15:08:20

                      Non non, j'ai vérifier, oui al boucle devrait être infini ( c'est le but me^me à car si tu entre 0, à l'intérieur de la boucle il y a le return et si tu met 1 le jeux recommence, donc si tu met autre chose ça te repose la question...
                      • Partager sur Facebook
                      • Partager sur Twitter
                        31 août 2007 à 21:07:10

                        @ rrazpo: le symbole "||" signifie ou, c'est donc un nombre plus grand que 0 OU plus petit que 1 (et comme 0 est plus petit que 1, la boucle me semble infinie, qu'en dis-tu?). Si tu n'es pas d'accord avec moi, j'aimerais que tu m'expliques qu'elle serait la saisie que tu entrerais pour quitter cette boucle.

                        @FeNiX57: Utiliser une boucle infinie est, je dirais, une mauvaise chose peu importe le cas. Dans ton cas, le programme quitte parce qu'il y a un return dans la boucle (ce qui fait que le return à la fin du main n'est jamais atteint).

                        Ce qu'il aurait fallu faire depuis le début, c'est une boucle autour des instructions de saisie:

                        1. while (rejouer < 0 || rejouer > 1)


                        puis, lorsque la saisie est valide, on quitte la boucle. Tu peux alors gérer les cas.

                        (Et, pour qu'on puisse rejouer, une autre boucle qui englobe tout).

                        En espérant avoir été clair.
                        Cordialement, Vhann.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le plus ou le moins

                        × 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