Partage
  • Partager sur Facebook
  • Partager sur Twitter

Boucle do...while a deux conditions (C++)

Sortir d'une boucle en respectant une des deux conditions (ou)

    28 novembre 2018 à 20:11:36

    Bonjour à tous!

    Je me suis lancé il y'a peu sur le cours proposé par OC sur le langage C++ avec une grande motivation.

    Je suis arrivé au premier exercice de la semaine 1 (qui consiste à deviner un mot dont les lettres ont été mélangées) et je bloque complètement sur une chose qui doit être simple:

    Je ne réussis pas a faire respecter deux conditions différentes sur un do...while. J'ai conscience d'avoir deux variables de type différents en condition, peut etre est-ce la le réel problème?

    Si oui, alors après avoir longuement cherché, je ne trouve toujours pas la solution alternative... 

    Voici le code:

    #include <iostream>
    #include <string>
    #include <ctime>
    #include <cstdlib>
    using namespace std;
    
    string melangerLettres(string mot)
    {
        string melange;
        int position(0);
    
        while(mot.size() != 0)
        {
            position = rand() % mot.size();
            melange += mot[position];
            mot.erase(position, 1);
        }
        return melange;
    }
    
    
    int main()
    {
        int rejouer(0);
        string motMystere, motMelange, motUtilisateur;
    
        do
        {
        unsigned int nombreCoups(5);
    
        cout << "Veuillez choisir un mot Mystere : " << endl;
        cin >> motMystere;
    
        cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
        cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
        cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
    
        srand(time(0));
    
        motMelange = melangerLettres(motMystere);
    
    
            do
            {
            cout << endl << "Quel est ce mot : " << motMelange << " ?" << endl;
            cin >> motUtilisateur;
    
    
                if(motUtilisateur == motMystere)
                {
                    cout << endl << "Bravo, vous avez trouve le mot Mystere !" << endl << endl;
                }
                else if(nombreCoups == 0)
                {
                    cout << endl << "Vous avez perdu... Retentez votre chance !" << endl << endl;
                    cout << "La solution etait pourtant simple : " << motMystere << endl << endl;
                }
                else
                {
                    cout << endl << "Vous n'avez pas trouve la bonne reponse " << endl << endl;
                    cout << "Attention il vous reste " << nombreCoups << " coups!" << endl;
                    nombreCoups--;
                }
    
            }while((motUtilisateur != motMystere)||(nombreCoups >= 0));
    
    
    
            cout << "Souhaitez vous refaire une partie? " << endl;
            cout << "1) Oui" << endl;
            cout << "2) Non" << endl;
            cin >> rejouer;
    
           do
           {
            if( (rejouer < 1) || (rejouer > 2))
            {
                cout << "Veuillez entrer 1 ou 2. " << endl;
                cin >> rejouer;
                nombreCoups = 5;
            }
            }while( (rejouer < 1) || (rejouer > 2));
    
            }while(rejouer == 1);
    
        cout << endl << "Merci d'avoir joue avec nous !" << endl;
    
        return(0);
    }
    

    Si quelqu'un pouvait m'aiguiller à ce sujet, ce serait vraiment top!

    Merci d'avance et bonne soirée à vous! 

    • Partager sur Facebook
    • Partager sur Twitter
      28 novembre 2018 à 20:57:56

      Bonjour,

      Un while de fin va renvoyer au do de début.
      Ton premier while ligne 65 va renvoyer ligne 43 si l'utilisateur n'a pas trouvé ou bien s'il reste des coups (donc même s'il a trouvé on continue!! revois ton test.)

      Ton second while ligne 82 va renvoyer au do ligne 74 tant que rejouer n'est pas 1 ou 2. Là c'est okay, on va redemander.

      Ton troisième while ligne 84 va renvoyer au do ligne 27 tant que l'utilisateur veut rejourer. Là aussi c'est okay, mais difficile à lire à cause de l'indentation.

      L'erreur ne semble pas due à la mauvaise compréhension des do while mais serait sur le test de ton premier while. Il faut recommencer tant qu'on n'a pas trouvé  ------- que l'on a encore droit des des coups.
      en remplaçant ------- par le bon mot (est-ce OU ou est-ce ET ?)

      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        28 novembre 2018 à 21:13:13

        Salut

        Je me suis lancé il y'a peu sur le cours proposé par OC sur le langage C++ avec une grande motivation.

        Je viens te prévenir, le cours de OC est devenu obsolète depuis des années... il n'est plus à jour et t'apprendra des mauvaises pratiques.

        Pour commencer l'usage de using namespace std qui est une mauvaise pratique.

        srand/rand sont des fonctions dépréciés du C, sans parler qu'en C++ il y a la fonction std::shuffle, "shuffle" qui veut dire mélanger, est exactement faite pour ça.

        Je te conseille de lire le cours http://guillaume.belz.free.fr/doku.php?id=programmez_avec_le_langage_c qui n'est pas "terminé", mais à jour et t'apprendra pas mal de choses.

        Il y a aussi https://zestedesavoir.com/tutoriels/822/la-programmation-en-c-moderne/ qui s'est inspiré du cours cité plus haut, malgré qu'il ne soit pas "terminé" non plus.

        Un tuto venant du cours C++ moderne sur les nombre aléatoires : http://guillaume.belz.free.fr/doku.php?id=nombres_aleatoires

        • Partager sur Facebook
        • Partager sur Twitter
          28 novembre 2018 à 21:23:12

          Hello,

          nombreCoups >= 0

          Cette condition sera toujours vrai car nombreCoups est de type non-signé, donc toujours supérieur ou égal à 0. Et comme dit @Dalfab, l'opérateur choisi n'est peut-être pas le bon (ET ou OU, tel est la question ^^).

          Et qu'est ce que c'est que ce truc ? :lol: :

          cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
          cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
          cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;

          Utilise une boucle si tu veux répéter quelque chose :

          for(std::size_t i = 0; i < 10; ++i)
              std::cout << '\n';

          -
          Edité par Guit0Xx 28 novembre 2018 à 21:27:31

          • Partager sur Facebook
          • Partager sur Twitter

          ...

            28 novembre 2018 à 23:17:25

            Bonjour merci pour vos réponses!

            Ils pourraient quand même le dire que le cours est obsolète...

            @GuitoXx , il s'agit là de faire sortir le premier mot entré du champ de vision afin que le second joueur ne le voit pas. C'est il me semble ce qui était conseillé dans le TP mot Mystere.

            1
            2
            3
            cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
            cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
            cout << endl << endl << endl << endl << endl << endl << endl << endl << endl << endl;
            

            @XxAnoth-ChaxX :  Bon ba du coup je vais voir tout ce que tu m'as envoyé et m'y remettre!

            Merci en tout cas pour votre aide!

            • Partager sur Facebook
            • Partager sur Twitter
              29 novembre 2018 à 16:43:08

              Ils pourraient quand même le dire que le cours est obsolète...

              Du moment que ça leur rapporte de l'argent ils vont surement pas le dire

              @GuitoXx , il s'agit là de faire sortir le premier mot entré du champ de vision afin que le second joueur ne le voit pas. C'est il me semble ce qui était conseillé dans le TP mot Mystere.

              Oui ça il le sait ^^, c'est juste que tu peux remplacer ça par une boucle comme il l'a écrit, c'est mieux car si tu voulais faire un espace de 1000 lignes c'est plus pratique d'écrire tout simplement "1000" dans la boucle.

              • Partager sur Facebook
              • Partager sur Twitter
                9 décembre 2018 à 23:56:18

                salut pour éviter que le second joueur puisse voir le mot tu peux(si tu es sous Windows) utiliser

                system("cls")//efface le contenu de la console


                • Partager sur Facebook
                • Partager sur Twitter

                Boucle do...while a deux conditions (C++)

                × 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