Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP plus ou moins

    18 mars 2023 à 15:01:02

    Bonjour,

    Débutant, je suis en train de lire "Apprenez à programmer en C" de Mathieu NEBRA, et à toutes fins utiles je propose mon code pour le premier TP.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main()
    {
    
        int nombreMystere = 0,nombreEntre = 0, compteur = 0 ,continuer = 1, nombreDeJoueurs =1, difficulte=1, max=10, min =1;
        srand(time(NULL));
        printf("*******Plus ou Moins*******\n\n");
    
        printf("Choisissez la difficulte\n\n");
        printf("1. Facile\n\n");
        printf("2. Moyen\n\n");
        printf("3. Difficile\n\n");
        scanf("%d",&difficulte);
    
        printf("Choisissez le nombre de joueurs\n\n");
        printf("1. Un joueur \n\n", &nombreDeJoueurs);
        printf("2. Deux joueurs \n\n", &nombreDeJoueurs);
        scanf("%d",&nombreDeJoueurs);
    
        if (difficulte==1)
        {
          max =10, min = 1;
        }
    
        if (difficulte==2)
        {
          max =100, min = 1;
        }
    
        if (difficulte==3)
        {
          max =1000, min = 1;
        }
    
        if (nombreDeJoueurs==1)
        {
          do
            {
            nombreMystere = (rand()%(max - min +1)) +  min;
    
                            do
                            {
    
                            printf ("quel est le nombre mystere ?\n");
                            scanf("%d",&nombreEntre);
                            compteur++;
    
                            if (nombreEntre<nombreMystere)
                            printf("c'est plus\n") ;
    
                            else if(nombreEntre>nombreMystere)
                            printf("c'est moins\n") ;
    
                            else
                            printf("c'est bon ! De la %d eme fois !\n", compteur) ;
                                            }
                            while (nombreEntre!=nombreMystere);
    
            compteur-=compteur;
            printf("Souhaitez vous rejouer ?\n\n");
            printf("1.Continuer\n\n");
            printf("2.Quitter\n\n");
            scanf("%d",&continuer);
            }
            while(continuer==1);
        }
        else
        {
    
        do
            {
              if   (difficulte==1)
              {
                printf("Veuillez entrer le nombre mystere  entre 1 et 10 :",&nombreMystere);
                scanf("%d",&nombreMystere);
                    do
                    {
                        printf("Veuillez entrer le nombre mystere  entre 1 et 10 :",&nombreMystere);
                        scanf("%d",&nombreMystere);
                    }
                    while (nombreMystere>10);
              }
    
    
              if   (difficulte==2)
              {
                printf("Veuillez entrer le nombre mystere  entre 1 et 100 :",&nombreMystere);
                scanf("%d",&nombreMystere);
    
                do
                    {
                        printf("Veuillez entrer le nombre mystere  entre 1 et 100 :",&nombreMystere);
                        scanf("%d",&nombreMystere);
                    }
                    while (nombreMystere>100);
              }
    
              if   (difficulte==3)
              {
                printf("Veuillez entrer le nombre mystere  entre 1 et 1000 :",&nombreMystere);
                scanf("%d",&nombreMystere);
    
                do
                    {
                        printf("Veuillez entrer le nombre mystere  entre 1 et 1000 :",&nombreMystere);
                        scanf("%d",&nombreMystere);
                    }
                    while (nombreMystere>1000);
              }
                            do
                            {
    
                            printf ("quel est le nombre mystere ?\n");
                            scanf("%d",&nombreEntre);
                            compteur++;
    
                            if (nombreEntre<nombreMystere)
                            printf("c'est plus\n") ;
    
                            else if(nombreEntre>nombreMystere)
                            printf("c'est moins\n") ;
    
                            else
                            printf("c'est bon ! De la %d eme fois !\n", compteur) ;
                                            }
                            while (nombreEntre!=nombreMystere);
    
            compteur-=compteur;
            printf("Souhaitez vous rejouer ?\n\n");
            printf("1.Continuer\n\n");
            printf("2.Quitter\n\n");
            scanf("%d",&continuer);
            }
            while(continuer==1);
    
        }
    return 0;
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      18 mars 2023 à 16:35:50

      Pourquoi ces deux lignes avec ces variables ?

      printf("1. Un joueur \n\n", &nombreDeJoueurs);
      printf("2. Deux joueurs \n\n", &nombreDeJoueurs);

      Ligne 62 je comprend pas la soustraction, j'aurai réinitialiser cette variable à la valeur 0.

      Ligne 77, 90 et 103, je comprend pas l'affichage avec des adresses et ce que tu souhaites en faire.

      -
      Edité par fred1599 18 mars 2023 à 16:40:58

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        18 mars 2023 à 17:00:13

        > Débutant, je suis en train de lire "Apprenez à programmer en C" de Mathieu NEBRA, et à toutes fins utiles je propose mon code pour le premier TP.


        Le mieux, c'est de commencer par demander l'avis du compilateur sur le code en question. Pour ça, il suffit de mettre les options à la compilation :

        $ gcc -Wall -Wextra jeu.c 
        jeu.c: Dans la fonction « main »:
        jeu.c:19:12: attention: trop d'arguments pour le format [-Wformat-extra-args]
           19 |     printf("1. Un joueur \n\n", &nombreDeJoueurs);
              |            ^~~~~~~~~~~~~~~~~~~
        jeu.c:20:12: attention: trop d'arguments pour le format [-Wformat-extra-args]
           20 |     printf("2. Deux joueurs \n\n", &nombreDeJoueurs);
              |            ^~~~~~~~~~~~~~~~~~~~~~
        jeu.c:77:20: attention: trop d'arguments pour le format [-Wformat-extra-args]
           77 |             printf("Veuillez entrer le nombre mystere  entre 1 et 10 :",&nombreMystere);
              |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        jeu.c:81:28: attention: trop d'arguments pour le format [-Wformat-extra-args]
           81 |                     printf("Veuillez entrer le nombre mystere  entre 1 et 10 :",&nombreMystere);
              |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        jeu.c:90:20: attention: trop d'arguments pour le format [-Wformat-extra-args]
           90 |             printf("Veuillez entrer le nombre mystere  entre 1 et 100 :",&nombreMystere);
              |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        jeu.c:95:28: attention: trop d'arguments pour le format [-Wformat-extra-args]
           95 |                     printf("Veuillez entrer le nombre mystere  entre 1 et 100 :",&nombreMystere);
              |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        jeu.c:103:20: attention: trop d'arguments pour le format [-Wformat-extra-args]
          103 |             printf("Veuillez entrer le nombre mystere  entre 1 et 1000 :",&nombreMystere);
              |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        jeu.c:108:28: attention: trop d'arguments pour le format [-Wformat-extra-args]
          108 |                     printf("Veuillez entrer le nombre mystere  entre 1 et 1000 :",&nombreMystere);
              |                            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        


        Si il raconte des trucs, c'est pas par plaisir d'allumer des pixels sur l'écran. Ce sont des indications sur d'éventuels problèmes : à lire et à prendre en considération. Le compilateur est là pour AIDER.

         Remarque : le cours n'attire pas l'attention là-dessus. Une des nombreuses raisons qui font que c'est un mauvais cours, malheureusement.

        -
        Edité par michelbillaud 18 mars 2023 à 17:18:36

        • Partager sur Facebook
        • Partager sur Twitter
          18 mars 2023 à 17:28:55

          Merci pour vos remarques.

          Fred, pour lignes 77, 90, 103 ainsi que les deux premières, les affichages de ces adresses sont des erreurs de ma part, ça ne sert en effet strictement à rien !

          Pour la ligne 62 le but est en effet de remettre la variable à 0, c'est la solution que j'ai trouvée.

          Michel, je ne connaissais pas cette utilisation du compilateur, je regarderai.

          -
          Edité par Syntax_Error1978 18 mars 2023 à 17:29:23

          • Partager sur Facebook
          • Partager sur Twitter
            18 mars 2023 à 17:45:06

            Une autre chose importante est d'utiliser fréquemment le re-formattage de code, facilité désormais proposée par tout IDE de ce siècle.

            Non, ça ne reformatte pas le disque dur : ça remet d'aplomb le code en décalant les lignes juste ce qu'il faut vers la droite. Ca donne du code qui est plus agréable à lire, et dans lequel il est beaucoup plus facile d'aller retrouver le { qui correspond au }  10 lignes plus loin (les deux choses sont liées).

            Pour CodeBLocks :

            https://forums.commentcamarche.net/forum/affich-36257403-probleme-de-plugin-astyle

            Sous VS-COde :  SHIFT-CONTROL-I

            Exemple, ça transforme -ligne 38-

               if (nombreDeJoueurs==1)
                {
                  do
                    {
                    nombreMystere = (rand()%(max - min +1)) +  min;
             
                                    do
                                    {
             
                                    printf ("quel est le nombre mystere ?\n");
                                    scanf("%d",&nombreEntre);
                                    compteur++;
             
                                    if (nombreEntre<nombreMystere)
                                    printf("c'est plus\n") ;
             
                                    else if(nombreEntre>nombreMystere)
                                    printf("c'est moins\n") ;
             
                                    else
                                    printf("c'est bon ! De la %d eme fois !\n", compteur) ;
                                                    }
                                    while (nombreEntre!=nombreMystere);
             
                    compteur-=compteur;
                    printf("Souhaitez vous rejouer ?\n\n");
                    printf("1.Continuer\n\n");
                    printf("2.Quitter\n\n");
                    scanf("%d",&continuer);
                    }
                    while(continuer==1);
                }
            

            en

                if (nombreDeJoueurs==1) {
                    do {
                        nombreMystere = (rand()%(max - min +1)) +  min;
            
                        do {
            
                            printf ("quel est le nombre mystere ?\n");
                            scanf("%d",&nombreEntre);
                            compteur++;
            
                            if (nombreEntre<nombreMystere)
                                printf("c'est plus\n") ;
            
                            else if(nombreEntre>nombreMystere)
                                printf("c'est moins\n") ;
            
                            else
                                printf("c'est bon ! De la %d eme fois !\n", compteur) ;
                        } while (nombreEntre!=nombreMystere);
            
                        compteur-=compteur;
                        printf("Souhaitez vous rejouer ?\n\n");
                        printf("1.Continuer\n\n");
                        printf("2.Quitter\n\n");
                        scanf("%d",&continuer);
                    } while(continuer==1);
                } 

            > Pour la ligne 62 le but est en effet de remettre la variable à 0, c'est la solution que j'ai trouvée.

            En ayant l'esprit moins tordu, pour mettre une variable à zéro

            compteur = 0;
            

            fait aussi bien l'affaire.




            -
            Edité par michelbillaud 18 mars 2023 à 17:50:30

            • Partager sur Facebook
            • Partager sur Twitter
              18 mars 2023 à 18:04:17

              @Syntax_Error1978:
              Tu ne trouves pas qu'il y a des choses qui se répètent dans ton code?
              Par exemple, la demande et l'assignation des difficultés. Ou le jeu lui-même?
              As-tu appris les fonctions? Ou les tableaux?

              -
              Edité par PierrotLeFou 18 mars 2023 à 18:12:43

              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

                18 mars 2023 à 18:08:20

                Dans le cours en question, les fonctions viennent après....

                Mais même sans fonctions, les comparaisons dans les 3 niveaux de difficulté pourraient se faire avec la variable max, qui vaut 10, 100 ou 100 selon les cas.

                Les 34 lignes 77 à 110  se ramèneraient à :

                do {
                   printf("Entrez un nombre entre %d et %d\n", min, max);
                   scanf("%d", &nombre_mystere);
                } while (nombre_mystere < min || nombre_mystere > max);
                


                 

                Je me demande si c'est le cours qui à la mauvaise idée de leur faire écrire

                max = 100, min = 1;
                
                

                plutôt que

                max = 100;
                min = 1;
                

                ou alors une faute de frappe répétée ?




                -
                Edité par michelbillaud 18 mars 2023 à 18:17:58

                • Partager sur Facebook
                • Partager sur Twitter
                  18 mars 2023 à 18:30:17

                  Oui les fonctions viennent après dans le livre, je suis justement en train de lire ce chapitre.

                  Je suis un vrai débutant, c'est beaucoup de connaissances à assimiler, mais je vais revenir sur ce topic pour tenir compte de vos remarques.

                  Astyles me facile dores et déjà la tache.

                  -
                  Edité par Syntax_Error1978 18 mars 2023 à 18:45:19

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 mars 2023 à 20:26:17

                    Hello,

                    Il y aurait aussi besoin d'un do....while autour des lignes 132 à 135 pour vérifier l'entrée utilisateur. Car si on donne autre chose que 1, le programme s'arrête. Or tu spécifies 1 .... 2 .... , il n'y a donc qu'un de ces deux choix qui soit valide.

                    -
                    Edité par edgarjacobs 18 mars 2023 à 20:27:01

                    • 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

                      19 mars 2023 à 1:26:06

                      Globalement le programme pourrait ressembler à ceci:
                       
                          do {
                              // Demander la difficulté et obtenir max (min vaut toujours 1)
                             // Demander si un ou deux joueurs.
                                  // Si un joueur obtenir le nombre mystère avec rand()
                                  // Si deux joueurs, demander le nombre à l'autre joueur (pas besoin de if ici, on connait déjà max)
                              // Faire le jeu
                              // Demander si on veut continuer
                          } while(continuer == 1);
                       
                      En supposant que difficulte soit valide, on peut obtenir max sans if avec un tableau:
                       
                          int tableauDifficultes[3] = {10, 100, 1000};
                          int max = tableauDifficultes[difficulte - 1];   // Si difficulte vaut 1, 2 ou 3
                      • Partager sur Facebook
                      • Partager sur Twitter

                      Le Tout est souvent plus grand que la somme de ses parties.

                        19 mars 2023 à 17:26:27

                        Salut,

                        si pour les difficultés 1, 2 et 3 on a des limites de 10, 100 et 1000 alors on a :

                        max = 10^diffculté;

                        Il faut apprendre à voir quand une fonction mathématique de "base" est capable de répondre à tes besoins.

                        Quand on voit que le max est un 1 suivi d'autant de 0 que la difficulté, ça devrait interpeller.

                        Et si min vaut toujours 1, alors il suffit de le mettre à un au début une bonne fois pour toute, et même, si c'est une constante, alors on en fait une constante, les variables sont pour ce qui varie.

                        Tu peux factoriser un peu ton code et le réduire de moitié au moins. La boucle de jeu est la même qu'il y ait un ou 2 joueurs, la seule différence est la création du nombre mystère. Donc si tu générais le nombre mystère avant la boucle, tu n'en aurais qu'une sans avoir à faire la différence entre le nombre de joueurs.

                        Bonne continuation.

                        • Partager sur Facebook
                        • Partager sur Twitter

                        Bonhomme !! | Jeu de plateforme : Prototype.

                          20 mars 2023 à 6:21:29

                          J'ai suggéré un tableau où justement les valeurs ne seraient pas une puissance de 10.
                          Pour une puissance de 10, on peut le faire facilement sans fonction (comme pow() ).
                              int max = 10;
                              for(int i = 1; i < difficulte; i++)   max *= 10;
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Le Tout est souvent plus grand que la somme de ses parties.

                            20 mars 2023 à 8:06:19

                            Les niveaux de difficulté étant fixés et en petit nombre, la meilleure solution me semble être celle du tableau. 

                            Arguments

                            • Le moins de code
                            • Pas besoin de réfléchir pour les retrouver

                            Par ailleurs,

                            • que ça soit des puissances de 10 successives, c'est fortuit. Les niveaux seraient 10, 20, 50, 100  200, 500... la solution calculatoire tombe direct à l'eau
                            • Pour un jeu plus souple, on peut imaginer charger les coefficients (et le texte des messages ?) depuis un fichier de config.

                            Conseil : 

                            • À ce stade, se contenter de nettoyer le code
                            • Pour une restructuration plus sérieuse, attendre d'avoir plus d'éléments du langage dans sa boite à outils. Découpage en fonctions surtout.

                            Avec les fonctions, un bon exercice sera d'extraire du code un maximum de fonctions qui réalisent une action

                            • Significative
                            • Non triviale.

                            Par exemple

                            int nombre_aleatoire_entre(int min, ont max);
                            
                            int demander_entier(char message[], int min, int max);


                            Si on veut compliquer un peu l'algorithme du jeu : pour chaque niveau fixer une limite au nombre de tentatives.

                            -
                            Edité par michelbillaud 20 mars 2023 à 8:23:06

                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 mars 2023 à 12:21:15

                              Merci à tous pour vos contributions !

                              Je l'ai nettoyé un peu hier j'ai trouvé des instructions qui doublonnaient, par exemple :

                               if   (difficulte==2)
                                        {
                                          printf("Veuillez entrer le nombre mystere  entre 1 et 100 :",&nombreMystere);
                                          scanf("%d",&nombreMystere);
                               
                                          do
                                              {
                                                  printf("Veuillez entrer le nombre mystere  entre 1 et 100 :",&nombreMystere);
                                                  scanf("%d",&nombreMystere);
                                              }
                                              while (nombreMystere>100);

                              Je ferai évoluer mon code à mesure que j'avance dans le cours.

                              -
                              Edité par Syntax_Error1978 20 mars 2023 à 12:21:35

                              • Partager sur Facebook
                              • Partager sur Twitter
                                20 mars 2023 à 12:26:02

                                Revois l'utilisation de la fonction printf car il est inutile d'envoyer &nombreMystere en second paramètre.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                ...
                                  20 mars 2023 à 16:24:46

                                  Comme je l'ai mentionné, il est déjà possible de simplifier le code même si on ne connait pas les fonctions.
                                  Je pense que ce serait un bon exercice. Ce sera plus facile de passer aux fonctions quand le code sera bien structuré.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  Le Tout est souvent plus grand que la somme de ses parties.

                                    20 mars 2023 à 16:28:52

                                    Non seulement ça doublons mais ça ne marche pas et ça pose la question de la manière de tester.

                                    Solution : pour les tests de bon fonctionnement  faire afficher le nombre aléatoire. Sinon on ne peut pas voir si les saisies et comparaisons ont fonctionné correctement.

                                    On enlève cet affichage de tricheur APRES les tests, quand on en est à la livraison au client.

                                    -
                                    Edité par michelbillaud 20 mars 2023 à 16:32:55

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    TP plus ou 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