Partage
  • Partager sur Facebook
  • Partager sur Twitter

bug de condition

Sujet résolu
    12 décembre 2023 à 11:48:02

    Bonjour, j'ai fait un code basique car je suis en cours d'apprentissage du c++ et j'ai fait un code demandant à l'utilisateur s'il souhaite faire un calcul, mais le code ignore la condition et exécute directement le if et je ne comprends pas où est le problème dans le code, voilà le code pour plus de compréhension :
    ( c'est un fichier console )
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        string nomComplet("Aucun");
    
        string motDePasse("Aucun");
    
        cout << "Quel est votre nom ?" << endl;
    
        getline(cin, nomComplet);
    
        cout << "Definissez votre mot de passe" << endl;
    
        getline(cin, motDePasse);
    
        cout << "Votre nom est " << nomComplet << " et votre mot de passe : " << motDePasse << endl;
        string mdp("Aucun");
    
        cout << "Veiller entrer votre mot de passe : " << endl;
        cin >> mdp;
    
        while (mdp != motDePasse) cout << "Mot de passe invalide, veiller reessayer" << endl, cin >> mdp;
    
        if (mdp == motDePasse) cout << "Mot de passe valide, acces a la calculatrice autorise :" << endl;
        cout << endl;
        cout << "Bonjour " << nomComplet << " vous etes pret a faire vos calculs ?" << endl;
        string reponse("rien");
        cin >> reponse;
        if (reponse == "oui", "Oui") {cout << "Super ! ";}
         else {cout << "Ok, a la prochaine fois alors !", exit(0);}
        
        int a(0);
        int b(0);
        int resultat(0);
        cout << "alors maintenant donne moi une premiere valeur a additionner a la seconde : ";
        cin >> a;
        cout << "donne moi une seconde valeur a additionner : ";
        cin >> b;
        resultat = a + b;
        cout << "Bien, le resultat de votre calcul est " << resultat << " !" << endl;
        return 0;
    }
    
    Merci à ceux qui me délivrerons une réponse !

    -
    Edité par Nano-NimusPipo 12 décembre 2023 à 11:49:44

    • Partager sur Facebook
    • Partager sur Twitter
      12 décembre 2023 à 12:04:47

          //if (reponse == "oui", "Oui")  // Pas bon
          if (reponse == "oui" || reponse == "Oui")  // Ok
      • Partager sur Facebook
      • Partager sur Twitter
      ...
        12 décembre 2023 à 12:27:21

        Merci bcp pour votre réponse ça fonctionne mtn ^^
        • Partager sur Facebook
        • Partager sur Twitter
          12 décembre 2023 à 14:44:46

          C'est pas tout que ça fonctionne, il faut aussi comprendre pourquoi ça ne fonctionnait pas. Parce que ça se reproduira, forcément.

          Une bonne habitude, c'est de produire un programme qui teste juste un truc sur lequel on est en train de se poser des questions, en simplifiant. Ici on regarde

          	if (chaine == "a", "b") {

          pour différentes valeurs de chaine, ce qui nous fait 3 cas à tester

          int main() {
          	tester_avec("a");
          	tester_avec("b");
          	tester_avec("c");
          	return 0;
          }
          la fonction tester_avec, elle fait le test et nous dit le résultat

          void tester_avec(const std::string &chaine)
          {
          	std::cout << "la condition \""
          			  << chaine
          			  << "\" == \"a\", \"b\" est ";
          	
          	if (chaine == "a", "b") {
          		std::cout << "vraie" << std::endl;
          	} else {
          		std::cout << "fausse" << std::endl;		
          	}
          }
          

          On compile et on fait exécuter, ça donne

          $ make a
          g++     a.cc   -o a
          
          $ ./a 
          la condition "a" == "a", "b" est vraie
          la condition "b" == "a", "b" est vraie
          la condition "c" == "a", "b" est vraie
          


          Observation : la condition est vraie dans tous les cas ;

          En fait ça s'explique. Par la syntaxe de C/C++

          Dans le if, il y a un enchaînement (par la virgule) de deux expressions

          • if (expression1, expression2) {

          La première est la comparaison     reponse == "a", qui est vraie ou fausse, ça dépend

          La seconde est la constante "b".

          Le résultat d'un enchainement, c'est la valeur du dernier, donc ici la valeur "b". Donc la condition revient à

          • if ("b") {

          et c'est quoi ça ?   Et bien c'est une chaîne donc (en gros) un pointeur vers une zone qui contient le caractère b puis le caractère nul.   C'est pas le pointeur nullptr, donc c'est considéré comme true.  Donc la condition est toujours vraie.




          PS en cobol, on peut écrire if reponse = "oui", "non" or "peut-etre", avec le sens qu'on en attend. Cobol, c'est le meilleur langage du monde, en fait.  Le compilateur est intelligent, il comprend l'anglais et grâce à lui  il n'y aura plus besoin de programmeurs (depuis 1960).

          -
          Edité par michelbillaud 12 décembre 2023 à 14:58:42

          • Partager sur Facebook
          • Partager sur Twitter
            12 décembre 2023 à 15:00:04

            Okay merci bcp je prends en considération ton conseil, même si je ne comprends pas énormément le début de la réponse à la fin de ton message et à vrai dire j'ai juste voulu aller plus vite que la lumière avec mon imagination, car la réponse à mon prblm était dans le chapitre suivant du cours c++ que je suivais ^^' (celui de mathieu nebra et ranga gonnage)

            (j'avais pas actualisé la page mais dcp mtn je comprends mieux mrc, je vais plus me renseigner sur ce fameux cobol en tout cas ^^)

            -
            Edité par Nano-NimusPipo 12 décembre 2023 à 15:03:55

            • Partager sur Facebook
            • Partager sur Twitter
              12 décembre 2023 à 15:03:40

              > le début de la réponse à la fin de ton message

              c'est à dire ?

              Si c'est la partie sur Cobol, c'est une blague. Mais bon je peux expliquer

              • dans les années 50, les programmeurs faisaient leurs trucs en langage machine (assembleur si on veut). C'était lent, laborieux, et les chefs de service et autres PDG ne comprenaient absolument rien à ce qui produisaient les programmeurs (des lignes de la forme  lzwxu 33,45(2)), et surtout pourquoi ça leur prenait autant de temps (15 lignes par jour...) et en plus il fallait les pyer très cher pour faire ça.
              • donc on a inventé les langages de haut niveau, Fortran, Cobol, Algol etc. qui ont très nettement amélioré la productivité. Avec l'affirmation osée "maintenant y a plus besoin de programmeurs", surtout que Cobol était fait pour ressembler à de l'anglais et qu'un comptable (par exemple) est capable de vérifier qu'une série de tests correspond bien à ce qu'on veut que le programme fasse (pour les boucles c'est moins évident).
              • Donc en partie vraie, et surtout, on a eu beaucoup moins besoin de programmeurs.... de l'espèce rustique qu'on avait avant. Par contre, il en a fallu beaucoup plus
              • Toute ressemblance avec le blabla sur le No Code et Chat GPT qui va faire le boulot est parfaitement évidente

              -
              Edité par michelbillaud 12 décembre 2023 à 15:14:12

              • Partager sur Facebook
              • Partager sur Twitter
                12 décembre 2023 à 15:04:29

                ça :
                $ make a
                g++     a.cc   -o a
                $ ./a
                la condition "a" == "a", "b" est vraie
                la condition "b" == "a", "b" est vraie
                la condition "c" == "a", "b" est vraie
                • Partager sur Facebook
                • Partager sur Twitter
                  12 décembre 2023 à 15:15:21

                  Nano-NimusPipo a écrit:

                  ça :

                  $ make a
                  g++     a.cc   -o a
                  $ ./a
                  la condition "a" == "a", "b" est vraie
                  la condition "b" == "a", "b" est vraie
                  la condition "c" == "a", "b" est vraie


                  C'est la compilation (qui ne signale pas d'erreurs),

                  puis l'affichage qui se produit lors de l'exécution.

                  -
                  Edité par michelbillaud 12 décembre 2023 à 15:15:47

                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 décembre 2023 à 15:19:21

                    Ah okay j'avais pas compris que c'était la compilation, je pensais que ça faisais partie de l'affichage après exécution x)
                    sinon pour le Cobol je savais vraiment pas mrc, tu m'as appris un truc, au moins l'avantage des forums comparé à chat gpt c'est que les gens y sont cultivés, c'est cool ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 décembre 2023 à 17:48:50

                      Si Chat GPT me lisait, il serait cultivé aussi :-)

                      • Partager sur Facebook
                      • Partager sur Twitter

                      bug de condition

                      × 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