Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le premier TP

Dans les tutoriaux

    26 mai 2006 à 17:10:51

    Bonjour !!!
    Je voudrais faire appel à votre experience pour m'aider à denouer une petite enigme que je n'arrive pas à resoudre. :D
    Il s'agit du premier TP des tutoriaux d'apprentissage du language C/C++ qui nous demande de faire un petit jeu de devinette.
    Le créer selon la consigne à été très facile, cependant, quand j'ai essayé d'y rajouter des options, quelques bizarreries se sont posées quand à mon programme. :o

    Voici mon code :

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

    int main()
    {
    const long MAX=100,MIN=1;
    long nombreAleatoire;
    long nombreTape;
    long reessayer=1;

    printf("Salut, j'ai un super jeu a te proposer !!\n");
    printf("J'ai choisi un nombre au hasard entre 1 et 100,a toi de le trouver !!!");

    do
    {
    long compteurDeCoups=0;

    srand(time(NULL));
    nombreAleatoire=rand()%(MAX-MIN+1)+MIN;

    printf("\n\nEntre un nombre : ");

    scanf("%ld",&nombreTape);

    while(nombreTape!=nombreAleatoire)
    {
    if(nombreTape>nombreAleatoire)
    {
    compteurDeCoups++;
    printf("\tTrop grand !\n\nReessayes :");
    scanf("%ld",&nombreTape);
    }
    else
    {
    compteurDeCoups++;
    printf("\tTrop petit !\n\nReessayes :");
    scanf("%ld",&nombreTape);
    }
    }
    compteurDeCoups++;
    printf("\nBravo ! Tu as gagne en %ld coups !!!\n\n\n",compteurDeCoups);
    printf("1.Refaire une partie\n2.Quitter\n\n");
    printf("Entre ton choix:");
    scanf("%ld",&reessayer);
    }while(reessayer==1);

    printf("\n\n\n");
    system("PAUSE");
    return 0;
    }

    Le programme marche bien, cependant, il y a deux problemes :
    --premièrement, quand j'ai créé un menu "nouvelle partie/quitter", j'ai bien fait attention à ce que la boucle demarre avant le choix du nombre aléatoire par l'ordi et malgré ca, tant que je mets nouvelle partie, il me ressort toujours le même nombre aléatoire.
    --deuzièmement, j'ai aussi déclarer la variable compteurDeCoups après le demarrage de la boucle pour qu'elle revienne à "0" à chaque debut de partie, or, il n'y a rien à faire, chaque fois qu'on demarre une partie, l'ordinateur comptabilise les coups de la partie d'avant comme existant dans la nouvelle partie. :(
    Si on pouvait m'aider à comprendre ce qui s'est mal passer dans mon code, je vous en serais reconnaissant.
    Merci d'avance !! :p:p

    PS : Désolé, je ne comprends pas, à chaque fois que je fais copier-coller, il me met les tabulations là où j'ecris mais pas dans l'apercu final, alors désolé si mon code n'est pas facile à lire et expliquez-moi comment conserver les tabulations. ;)
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      26 mai 2006 à 17:19:12

      La balise code existe !
      • Partager sur Facebook
      • Partager sur Twitter
        26 mai 2006 à 17:20:01

        Salut!
        J'ai testé ton programme et tout fonctionne bien!
        Le nombre de coups est correct et le nombre change tout le temps!

        o_Oo_O^^


        EDIT: Effectivement c'est plus lisible comme ça (mais il ne me semble pas y avoir de problème :euh: ):


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

        int main()
        {
        const long MAX=100,MIN=1;
        long nombreAleatoire;
        long nombreTape;
        long reessayer=1;

        printf("Salut, j'ai un super jeu a te proposer !!\n");
        printf("J'ai choisi un nombre au hasard entre 1 et 100,a toi de le trouver !!!");

        do
        {
        long compteurDeCoups=0;

        srand(time(NULL));
        nombreAleatoire=rand()%(MAX-MIN+1)+MIN;

        printf("\n\nEntre un nombre : ");

        scanf("%ld",&nombreTape);

        while(nombreTape!=nombreAleatoire)
        {
        if(nombreTape>nombreAleatoire)
        {
        compteurDeCoups++;
        printf("\tTrop grand !\n\nReessayes :");
        scanf("%ld",&nombreTape);
        }
        else
        {
        compteurDeCoups++;
        printf("\tTrop petit !\n\nReessayes :");
        scanf("%ld",&nombreTape);
        }
        }
        compteurDeCoups++;
        printf("\nBravo ! Tu as gagne en %ld coups !!!\n\n\n",compteurDeCoups);
        printf("1.Refaire une partie\n2.Quitter\n\n");
        printf("Entre ton choix:");
        scanf("%ld",&reessayer);
        }while(reessayer==1);

        printf("\n\n\n");
        system("PAUSE");
        return 0;
        }
        • Partager sur Facebook
        • Partager sur Twitter
          26 mai 2006 à 17:31:09

          C'est super bizarre ça. Chez moi, il y a tout le temps le même nombre, je peux aussi bien faire 18 parties qu'il y a toujours le même nombre (tu peux me croire, j'ai essayé). Pour avoir un nouveau nombre, il faut que j'eteignes mon programme et que je le rallumes à chaque parties.
          Quand au compteur de coups, je mets, par exemple, 8 coups pour trouver le nombre aleatoire, je demande une nouvelle partie que je gagne en 1 coup (etant donné que c'est le meme nombre que precedemment) et là, il me dit que j'ai utilisé 9 coups !!! Il y a un truc qui cloche !! :(

          (PS : Où est la balise code ?)
          • Partager sur Facebook
          • Partager sur Twitter
            26 mai 2006 à 19:51:26

            Image utilisateur

            o_O
            Copie/Colle le code que tu as envoyé ici à la place de celui que tu utilises!

            Pour ta balise code:

            Image utilisateur

            • Partager sur Facebook
            • Partager sur Twitter
              26 mai 2006 à 20:32:14

              Citation : Miro


              Voici mon code :

              #include<stdio.h>


              Merci de lire les regles du forum et d'apprendre à te servir des balises de code.

              Citation : Miro


              do
              {
              long compteurDeCoups=0;

              srand(time(NULL));


              srand() ne doit être appelé qu'une seule fois au début du code.

              Citation : Miro




              nombreAleatoire=rand()%(MAX-MIN+1)+MIN;

              printf("\n\nEntre un nombre : ");

              scanf("%ld",&nombreTape);

              while(nombreTape!=nombreAleatoire)
              {
              if(nombreTape>nombreAleatoire)
              {
              compteurDeCoups++;
              printf("\tTrop grand !\n\nReessayes :");
              scanf("%ld",&nombreTape);
              }
              else
              {
              compteurDeCoups++;
              printf("\tTrop petit !\n\nReessayes :");
              scanf("%ld",&nombreTape);
              }
              }
              compteurDeCoups++;
              printf("\nBravo ! Tu as gagne en %ld coups !!!\n\n\n",compteurDeCoups);
              printf("1.Refaire une partie\n2.Quitter\n\n");
              printf("Entre ton choix:");
              scanf("%ld",&reessayer);
              }while(reessayer==1);

              printf("\n\n\n");
              system("PAUSE");
              return 0;
              }

              Le programme marche bien, cependant, il y a deux problemes :
              --premièrement, quand j'ai créé un menu "nouvelle partie/quitter", j'ai bien fait attention à ce que la boucle demarre avant le choix du nombre aléatoire par l'ordi et malgré ca, tant que je mets nouvelle partie, il me ressort toujours le même nombre aléatoire.
              --deuzièmement, j'ai aussi déclarer la variable compteurDeCoups après le demarrage de la boucle pour qu'elle revienne à "0" à chaque debut de partie, or, il n'y a rien à faire, chaque fois qu'on demarre une partie, l'ordinateur comptabilise les coups de la partie d'avant comme existant dans la nouvelle partie. :(
              Si on pouvait m'aider à comprendre ce qui s'est mal passer dans mon code, je vous en serais reconnaissant.


              Bizarre, j'ai ça :

              Salut, j'ai un super jeu a te proposer !!
              J'ai choisi un nombre au hasard entre 1 et 100,a toi de le trouver !!!

              Entre un nombre : 50
              Trop petit !

              Reessayes :75
              Trop grand !

              Reessayes :63
              Trop grand !

              Reessayes :56
              Trop petit !

              Reessayes :59
              Trop grand !

              Reessayes :58
              Trop grand !

              Reessayes :57

              Bravo ! Tu as gagne en 7 coups !!!


              1.Refaire une partie
              2.Quitter

              Entre ton choix:1


              Entre un nombre : 50
              Trop grand !

              Reessayes :25
              Trop grand !

              Reessayes :13
              Trop grand !

              Reessayes :6
              Trop grand !

              Reessayes :3
              Trop grand !

              Reessayes :2
              Trop grand !

              Reessayes :1

              Bravo ! Tu as gagne en 7 coups !!!


              1.Refaire une partie
              2.Quitter

              Entre ton choix:2



              Appuyez sur une touche pour continuer...

              Ce qui ne me parait pas épouvantable...

              En tout cas, pour une fois, le jeu est bien présenté et bien rédigé.

              Evidemment, si je tapes a au lieu d'un nombre, c'est le drame habituel, mais quand on ne connait pas scanf(), c'est normal... Ceci est stable :

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

              static void purge (FILE * fp)
              {
                 int c;
                 while ((c = fgetc (fp)) != '\n' && c != EOF)
                 {
                 }
              }

              int main ()
              {
                 const long MAX = 100, MIN = 1;
                 long nombreAleatoire;
                 long nombreTape;
                 long reessayer = 1;

                 srand ((unsigned) time (NULL));

                 printf ("Salut, j'ai un super jeu a te proposer !!\n");
                 printf ("J'ai choisi un nombre au hasard entre 1 et 100,a toi de le trouver !!!");

                 do
                 {
                    int n;
                    int err;
                    long compteurDeCoups = 0;

                    nombreAleatoire = rand () % (MAX - MIN + 1) + MIN;

                    do
                    {
                       printf ("\n\nEntre un nombre entre %ld et %ld\n: ", MIN, MAX);
                       fflush (stdout);
                       n = scanf ("%ld", &nombreTape);
                       err = n != 1 || nombreTape < MIN || nombreTape > MAX;

                       if (err)
                       {
                          printf ("erreur\n");
                          purge (stdin);
                       }
                    }
                    while (n != 1 || nombreTape < MIN || nombreTape > MAX);
                    compteurDeCoups++;

                    while (nombreTape != nombreAleatoire)
                    {
                       if (nombreTape > nombreAleatoire)
                       {
                          printf ("\tTrop grand !\n\n");
                       }
                       else
                       {
                          printf ("\tTrop petit !\n\n");
                       }
                       do
                       {
                          printf ("Reessayes :");
                          fflush (stdout);
                          n = scanf ("%ld", &nombreTape);
                          err = n != 1 || nombreTape < MIN || nombreTape > MAX;
                          if (err)
                          {
                             printf ("erreur, on a dit entre %ld et %ld\n: ", MIN, MAX);
                             purge (stdin);
                          }
                       }
                       while (err);
                       compteurDeCoups++;
                    }
                    printf ("\nBravo ! Tu as gagne en %ld coups !!!\n\n\n", compteurDeCoups);
                    printf ("1.Refaire une partie\n2.Quitter\n\n");
                    do
                    {
                       printf ("Entre ton choix: ");
                       fflush (stdout);

                       n = scanf ("%ld", &reessayer);
                       err = n != 1 || reessayer < 1 || reessayer > 2;
                       if (err)
                       {
                          printf ("erreur\n");
                          purge (stdin);
                       }
                    }
                    while (err);
                 }
                 while (reessayer == 1);

                 printf ("\n");
                 return 0;
              }

              Pour répondre à tes questions sur fflush (stdout);

              http://mapage.noos.fr/emdel/notes.htm#fflush_stdout
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !

              Le premier TP

              × 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