Partage
  • Partager sur Facebook
  • Partager sur Twitter

Affichage en trop d'un mot dans la console

Mot non demandé à être affiché s'affichant dans la console

Sujet résolu
    11 juin 2023 à 9:42:27

    Bonjour

    Après avoir fini de construire le code d'un quiz qui consiste à saisir un mot, l'afficher, le mélanger et demander à le réécrire tant qu'il n'a pas été saisi comme à l'origine, j'ai remarqué que le mot saisi au départ s'affichait deux fois alors que visiblement cela n'est demandé nulle part dans ledit code :

    #include <iostream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    
    using namespace std;
    
    
    void melangerLettres(string *mot);
    
    int main()
    {
        //1 : On demande de saisir un mot
        cout << "Saisissez un mot a l abri des regards : ";
        string motMystere;
        cin >> motMystere;
    
        //2 : On mélange les lettres du mot
        string *motMelange(nullptr);
        motMelange = new string(motMystere);
        melangerLettres(motMelange);
    
        //3 : On demande à l'utilisateur quel est le mot mystère
        string motUtilisateur;
        while(motUtilisateur != motMystere)
        {
            cout << "Quel est ce mot ? " << *motMelange << endl;
            cin >> motUtilisateur;
            if (motUtilisateur == motMystere)
            {
               cout << "Bravo !" << endl;
            }
            else
            {
               cout << "Ce n'est pas le mot !" << endl;
            }
        }
        delete motMelange;
        motMelange = 0;
    
        return 0;
    }
    
    void melangerLettres(string *mot)
    {
        string melange;
        int position(0);
        std::cout << *mot << endl;
    
       //Tant qu'on n'a pas extrait toutes les lettres du mot
        while (mot->size() != 0)
        {
            //On choisit un numéro de lettre au hasard dans le mot
            position = rand() % mot->size();
            //On ajoute la lettre dans le mot mélangé
            melange += mot->at(position);
            //On retire cette lettre du mot mystère
            //Pour ne pas la prendre une deuxième fois
            mot->erase(position, 1);
        }
        //On assigne le mot mélangé au pointeur
        *mot = melange;
    }

    J'ai également testé le code proposé comme corrigé mais le résultat fût le même :

    //
    //  main.cpp
    //  Priority
    //
    //  Created by Ranga Gonnage on 15/12/2021.
    //
    
    #include <iostream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    
    #include "main.hpp"
    
    using namespace std;
    
    void melangerLettres(string *mot)
    {
        string melange;
        int position(0);
        std::cout << *mot << endl;
    
       //Tant qu'on n'a pas extrait toutes les lettres du mot
        while (mot->size() != 0)
        {
            //On choisit un numéro de lettre au hasard dans le mot
            position = rand() % mot->size();
            //On ajoute la lettre dans le mot mélangé
            melange += mot->at(position);
            //On retire cette lettre du mot mystère
            //Pour ne pas la prendre une deuxième fois
            mot->erase(position, 1);
        }
        //On assigne le mot mélangé au pointeur
        *mot = melange;
    }
    
    int main()
    {
        string motMystere, motUtilisateur, *motMelange(nullptr);
        
    
        //Initialisation des nombres aléatoires
        srand(time(0));
    
        //1 : On demande de saisir un mot
        cout << "Saisissez un mot à l’abri des regards : ";
        cin >> motMystere;
        
        motMelange = new string(motMystere);
    
        //2 : On récupère le mot avec les lettres mélangées dans motMelange
        melangerLettres(motMelange);
    
        //3 : On demande à l'utilisateur quel est le mot mystère
        while (motUtilisateur != motMystere)
        {
            cout << endl << "Quel est ce mot ? " << *motMelange << endl;
            cin >> motUtilisateur;
    
            if (motUtilisateur == motMystere)
            {
                cout << "Bravo !" << endl;
            }
            else
            {
                cout << "Ce n'est pas le mot !" << endl;
            }
        }
        //On recommence tant qu'il n'a pas trouvé
        
        delete motMelange;
    
        return 0;
    }


    Pourtant au début du quiz une image montre qu'un code n'a affiché le mot de départ qu'une seule fois :

    De plus en essayant le code suivant qui demande le prénom de l'utilisateur puis le nombre pi pour vérifié s'il se comporte pareil, chaque saisi s'affiche qu'une seule fois comme voulu après que l'utilisateur les ait écrit contrairement aux deux précédents :

    #include <iostream>
    using namespace std;
    int main()
    {
        cout << "Quel est votre prenom ?" << endl;
        string nomUtilisateur("Sans nom"); //On crée une case mémoire pour contenir une chaine de caractères
        cin >> nomUtilisateur; //On remplit cette case avec ce qu'écrit l'utilisateur
    
        cout << "Combien vaut pi ?" << endl;
        double piUtilisateur(-1.); //On crée une case mémoire pour stocker un nombre réel
        cin >> piUtilisateur; //Et on remplit cette case avec ce qu'écrit l'utilisateur
    
        cout << "Vous vous appelez " << nomUtilisateur << " et vous pensez que pi vaut " << piUtilisateur << "." << endl;
    
        return 0;
    }
    
    

    Comment pourrait-on modifier le premier code de sorte que la saisi de l'utilisateur ne s'affiche qu'une seule fois comme avec le code ci-dessus ?

    Cordialement



    -
    Edité par 1Stark 11 juin 2023 à 9:46:00

    • Partager sur Facebook
    • Partager sur Twitter
      11 juin 2023 à 10:03:33

      Ligne 48 tu premier code ou ligne 21 du deuxième code, tu penses afficher quoi ?

      Aussi, pourquoi utiliser ce pointeur sur string (Les pointeurs sont à éviter en C++), tu pouvais très bien faire en sorte que ta fonction prenne un string en entrée (mot en clair) et retourne un string (du mot mélangé).

      A savoir qu'il existe aussi en C++ un algorithme qui permet de mélanger un container : std:shuffle

      -
      Edité par rouIoude 11 juin 2023 à 10:22:58

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        11 juin 2023 à 13:14:20

        Il a été stupide de ma part de ne pas l'avoir vu. Je tente d'écrire une version du même code sans pointeur mais je ne suis pas certain de bien utiliser std::shuffle pour des string sachant que ma tentative de changer le code ne marche pas :

        #include <iostream>
        #include <string>
        #include <ctime>
        #include <cstdlib>
        #include <vector> //pour la version sans pointeur
        
        using namespace std;
        
        void melangerLettres(string *mot);
        
        int main()
        {
            //1 : On demande de saisir un mot
            cout << "Saisissez un mot a l abri des regards : ";
            string motMystere;
            cin >> motMystere;
        
            //2 : On mélange les lettres du mot
            string motMelange;
            motMelange = motMystere;
            motMelange = melangerLettres(motMelange);
        
            //3 : On demande à l'utilisateur quel est le mot mystère
            string motUtilisateur;
            while(motUtilisateur != motMystere)
            {
                cout << "Quel est ce mot ? " << *motMelange << endl;
                cin >> motUtilisateur;
                if (motUtilisateur == motMystere)
                {
                   cout << "Bravo !" << endl;
                }
                else
                {
                   cout << "Ce n'est pas le mot !" << endl;
                }
            }
            delete motMelange;
            motMelange = 0;
        
            return 0;
        }
        
        void melangerLettres(string mot)
        {
            std::shuffle(mot.begin(), mot.end());
            shuf(mot);
        }

        Il semblerait que std::shuffle nécessite une façon spéciale pour être utiliser avec des string. Quelle est-elle ?

        Cordialement

        • Partager sur Facebook
        • Partager sur Twitter
          11 juin 2023 à 13:38:50

          À défaut d'utiliser std::shuffle, on pourrait programmer directement l'algorithme de Fisher-Yates:


           


          void melangerLettres(std::string &mot) {

              for(int i {0}; i < mot.size(); i++) {


                  std::swap(mot[i], mot[rand()%mot.size()]);


              }


          }

          -
          Edité par PierrotLeFou 11 juin 2023 à 13:40:03

          • Partager sur Facebook
          • Partager sur Twitter

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

            11 juin 2023 à 14:39:51

            1Stark a écrit:

            Il semblerait que std::shuffle nécessite une façon spéciale pour être utiliser avec des string. Quelle est-elle ?

            Non, c'est juste que tu as oublié un paramètre (la graine) :

            std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});

            Attention ligne 27, motMelange n'est plus un pointeur.

            -
            Edité par rouIoude 11 juin 2023 à 14:42:37

            • Partager sur Facebook
            • Partager sur Twitter
            ...
              11 juin 2023 à 15:05:37

              Voici le nouveau code avec deux nouvelles versions de la fonction :

              #include <iostream>
              #include <string>
              #include <ctime>
              #include <cstdlib>
              
              using namespace std;
              
              void melangerLettres(string mot);
              
              int main()
              {
                  //1 : On demande de saisir un mot
                  cout << "Saisissez un mot a l abri des regards : ";
                  string motMystere;
                  cin >> motMystere;
              
                  //2 : On mélange les lettres du mot
                  string motMelange;
                  motMelange = motMystere;
                  motMelange = melangerLettres(motMelange);
                  //melangerLettres(motMelange);
              
                  //3 : On demande à l'utilisateur quel est le mot mystère
                  string motUtilisateur;
                  while(motUtilisateur != motMystere)
                  {
                      cout << "Quel est ce mot ? " << motMelange << endl;
                      cin >> motUtilisateur;
                      if (motUtilisateur == motMystere)
                      {
                         cout << "Bravo !" << endl;
                      }
                      else
                      {
                         cout << "Ce n'est pas le mot !" << endl;
                      }
                  }
                  delete motMelange;
                  motMelange = 0;
              
                  return 0;
              }
              
              //void melangerLettres(string mot)
              //{
              //    std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
              //    shuf(mot);
              //}
              
              void melangerLettres(std::string &mot)
              {
                  for(int i {0}; i < mot.size(); i++)
                  {
                      std::swap(mot[i], mot[rand()%mot.size()]);
                  }
              }

              J'ai beau commenter une version de la fonction et décommenter l'autre j'ai toujours une erreur au niveau de l'appel de la fonction alors qu'apparemment elle a été normalement écrit :

              Aurais-je oublié quelque chose ?

              Cordialement

              -
              Edité par 1Stark 11 juin 2023 à 15:08:54

              • Partager sur Facebook
              • Partager sur Twitter
                11 juin 2023 à 15:10:14

                Ta fonction a un prototype qui renvoi void et a son appel tu récupère une valeur renvoyé, c'est pas cohérent !

                En plus le prototype de la déclaration et différent de celui de la définition !

                -
                Edité par rouIoude 11 juin 2023 à 15:19:09

                • Partager sur Facebook
                • Partager sur Twitter
                ...
                  11 juin 2023 à 15:16:17

                  J'ai modifié la fonction utilisant std::shuffle comme ceci :

                  string melangerLettres(string mot)
                  {
                      std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
                      shuf(mot);
                      return mot;
                  }

                  Mais désormais, j'ai une autre erreur s'affichant au niveau du delete : 

                  Cordialement

                  -
                  Edité par 1Stark 11 juin 2023 à 15:16:38

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 juin 2023 à 15:18:46

                    Tu n'as plus de pointeur  --> plus de new -->  donc plus de delete !

                    PS c'est quoi la fonction shuf ?

                    -
                    Edité par rouIoude 11 juin 2023 à 15:27:21

                    • Partager sur Facebook
                    • Partager sur Twitter
                    ...
                      11 juin 2023 à 15:42:22

                      @rouIoude Il s'agit du résultat d'une erreur dû au fait que j'ai oublié de l'enlever en extrayant le shuffle d'un autre code :

                      #include <iostream>
                      #include <vector>
                      #include <algorithm>
                      void shuf(std::vector<int> const &v)
                      {
                      for (int i: vec) {
                      std::cout << i << ' ';
                      }
                      }
                      int main()
                      {
                      std::vector<int> vec = { 1, 27, 38, 42, 50, 69, 72, 87, 99 };
                      std::shuffle(vec.begin(), vec.end());
                      shuf(vec);
                      return 0;
                      }

                      Voici le code modifié selon les explications :

                      #include <iostream>
                      #include <string>
                      #include <ctime>
                      #include <cstdlib>
                      
                      using namespace std;
                      
                      void melangerLettres(string mot);
                      
                      int main()
                      {
                          //1 : On demande de saisir un mot
                          cout << "Saisissez un mot a l abri des regards : ";
                          string motMystere;
                          cin >> motMystere;
                      
                          //2 : On mélange les lettres du mot
                          string motMelange;
                          motMelange = motMystere;
                          //motMelange = melangerLettres(motMelange);
                          melangerLettres(motMelange);
                      
                          //3 : On demande à l'utilisateur quel est le mot mystère
                          string motUtilisateur;
                          while(motUtilisateur != motMystere)
                          {
                              cout << "Quel est ce mot ? " << motMelange << endl;
                              cin >> motUtilisateur;
                              if (motUtilisateur == motMystere)
                              {
                                 cout << "Bravo !" << endl;
                              }
                              else
                              {
                                 cout << "Ce n'est pas le mot !" << endl;
                              }
                          }
                          //delete motMelange;
                          //motMelange = 0;
                      
                          return 0;
                      }
                      
                      string melangerLettres(string mot)
                      {
                          std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
                          return mot;
                      }
                      
                      //void melangerLettres(std::string &mot)
                      //{
                      //    for(int i {0}; i < mot.size(); i++)
                      //    {
                      //        std::swap(mot[i], mot[rand()%mot.size()]);
                      //    }
                      //}
                      

                      Lorsque je commente "motMelange = melangerLettres(motMelange);" et décommente "melangerLettres(motMelange);" j'ai une erreur au niveau de la fonction :

                      Et lorsque je commente "melangerLettres(motMelange);" et décommente "motMelange = melangerLettres(motMelange);" j'ai directement une erreur à sa ligne :

                      Cordialement

                      -
                      Edité par 1Stark 12 juin 2023 à 12:22:16

                      • Partager sur Facebook
                      • Partager sur Twitter
                        11 juin 2023 à 15:51:27

                        Le prototype de la déclaration de ta fonction et différent de celui de la définition.

                        Il me semble l'avoir déjà dit dans un autre contexte :

                        rouIoude a écrit:

                        En plus le prototype de la déclaration et différent de celui de la définition !

                        Aussi, il te manque des includes pour shuffle et mt19937 

                        #include <algorithm>
                        #include <random>

                        Tu en a d'autres devenus inutiles.

                        -
                        Edité par rouIoude 11 juin 2023 à 15:55:33

                        • Partager sur Facebook
                        • Partager sur Twitter
                        ...
                          11 juin 2023 à 17:44:18

                          Au temps pour moi. Voici le code :

                          #include <iostream>
                          #include <string>
                          #include <algorithm>
                          #include <random>
                          
                          using namespace std;
                          
                          string melangerLettres(string mot);
                          
                          int main()
                          {
                              //1 : On demande de saisir un mot
                              cout << "Saisissez un mot a l abri des regards : ";
                              string motMystere;
                              cin >> motMystere;
                          
                              //2 : On mélange les lettres du mot
                              string motMelange;
                              //motMelange = motMystere;
                              motMelange = melangerLettres(motMelange);
                              //melangerLettres(motMelange);
                          
                              //3 : On demande à l'utilisateur quel est le mot mystère
                              string motUtilisateur;
                              while(motUtilisateur != motMystere)
                              {
                                  cout << "Quel est ce mot ? " << motMelange << endl;
                                  cin >> motUtilisateur;
                                  if (motUtilisateur == motMystere)
                                  {
                                     cout << "Bravo !" << endl;
                                  }
                                  else
                                  {
                                     cout << "Ce n'est pas le mot !" << endl;
                                  }
                              }
                              //delete motMelange;
                              //motMelange = 0;
                          
                              return 0;
                          }
                          
                          string melangerLettres(string mot)
                          {
                              std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
                              return mot;
                          }
                          
                          //void melangerLettres(std::string &mot)
                          //{
                          //    for(int i {0}; i < mot.size(); i++)
                          //    {
                          //        std::swap(mot[i], mot[rand()%mot.size()]);
                          //    }
                          //}

                          Cette fois-ci, il se lance mais le mot mélangé n'apparait pas alors que dans la boucle while, il est indiqué qu'il devrait apparaître : 

                          Cordialement

                          -
                          Edité par 1Stark 11 juin 2023 à 17:45:27

                          • Partager sur Facebook
                          • Partager sur Twitter
                            11 juin 2023 à 17:57:14

                            motMelange est une string vide et donc tu mélanges une string vide et affiche une string vide donc rien !
                            • Partager sur Facebook
                            • Partager sur Twitter
                            ...
                              11 juin 2023 à 18:20:18

                              Merci de la correction, les erreurs passés m'avaient poussé à commenter la ligne "motMelange = motMystere;" que j'avais finalement oublié : 

                              #include <iostream>
                              #include <string>
                              #include <algorithm>
                              #include <random>
                              
                              using namespace std;
                              
                              string melangerLettres(string mot);
                              
                              int main()
                              {
                                  //1 : On demande de saisir un mot
                                  cout << "Saisissez un mot a l abri des regards : ";
                                  string motMystere;
                                  cin >> motMystere;
                              
                                  //2 : On mélange les lettres du mot
                                  string motMelange;
                                  motMelange = motMystere;
                                  motMelange = melangerLettres(motMelange);
                                  //melangerLettres(motMelange);
                              
                                  //3 : On demande à l'utilisateur quel est le mot mystère
                                  string motUtilisateur;
                                  while(motUtilisateur != motMystere)
                                  {
                                      cout << "Quel est ce mot ? " << motMelange << endl;
                                      cin >> motUtilisateur;
                                      if (motUtilisateur == motMystere)
                                      {
                                         cout << "Bravo !" << endl;
                                      }
                                      else
                                      {
                                         cout << "Ce n'est pas le mot !" << endl;
                                      }
                                  }
                                  //delete motMelange;
                                  //motMelange = 0;
                              
                                  return 0;
                              }
                              
                              string melangerLettres(string mot)
                              {
                                  std::shuffle(mot.begin(), mot.end(), std::mt19937{std::random_device{}()});
                                  return mot;
                              }
                              
                              //void melangerLettres(std::string &mot)
                              //{
                              //    for(int i {0}; i < mot.size(); i++)
                              //    {
                              //        std::swap(mot[i], mot[rand()%mot.size()]);
                              //    }
                              //}

                              Désormais le code est bien opérationnel avec la fonction string melangerLettres(string mot) :


                              Cordialement

                              • Partager sur Facebook
                              • Partager sur Twitter
                                11 juin 2023 à 18:31:57

                                tu pouvais simplifier les lignes 18 à 20 :

                                    string motMelange;
                                    motMelange = motMystere;
                                    motMelange = melangerLettres(motMelange);

                                en 

                                string motMelange = melangerLettres(motMystere);

                                puisque tu fais ton mot mélangé à partir de motMystere.

                                -
                                Edité par rouIoude 11 juin 2023 à 18:32:21

                                • Partager sur Facebook
                                • Partager sur Twitter
                                ...

                                Affichage en trop d'un mot dans la console

                                × 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