Partage
  • Partager sur Facebook
  • Partager sur Twitter

Vérifier le nombre de charactères

Sujet résolu
    6 novembre 2018 à 17:28:18

    Salut,

    Tout d'abord, je me lance dans le c++, je me débrouille surement pas très bien. J'en suis quasiment à la fin du premier chapitre et je me suis lancé un petit défi de convertir des unités de temps. En gros, j'ai mon programme (TimeConverter) qui va demander à l'utilisateur de sélectionner une lettre correspondante à ce qu'il veut convertir puis entrer le nombre et enfin afficher la valeur de base convertie.

    Tout fonctionne nickel pour le moment mais le seul problème est du côté du choix. En gros, je vérifie que l'utilisateur a bien rentrer un charactère correspondant à ceux voulus et si oui, il fait ce qu'il faut mais si non, il redemande en boucle (boucle while). Et quand l'utilisateur entre 2 charactères au lieu d'un, cela fait un bug que voici

    Et voici mon code : 

    #include <iostream>
    #include "TimeConverter.h"
    
    using namespace std;
    
    int main()
    {
        char choix('r');
        double hours, minutes, seconds;
    
        cout << "Bienvenue sur le logiciel TimeConverter par Winxglo." << endl;
        cout << "Tout d'abord, veuillez choisir quelle type de conversion vous souhaitez faire (pour cela, tapez le nombre correspondant a la conversion souhaitee) : " << endl;
        cout << "a) Heures en minutes" << endl;
        cout << "b) Heures en secondes" << endl;
        cout << "c) Minutes en heures" << endl;
        cout << "d) Minutes en secondes" << endl;
        cout << "e) Secondes en heures" << endl;
        cout << "f) Secondes en minutes" << endl;
    
        while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')
        {
            cout << "Veuillez choisir entre les choix disponibles." << endl;
            cin >> choix;
        }
    
        switch(choix)
            {
            case 'a':
                cout << "Veuillez choisir un nombre d'heures a convertir en minutes : ";
                cin >> hours;
                cout << "Vous avez choisis " << hours << "h. Cela fait donc " << hoursToMinutes(hours) << " minutes." << endl;
                cout << "Ok" << endl;
                break;
            case 'b':
                cout << "Veuillez choisir un nombre d'heures a convertir en secondes : ";
                cin >> hours;
                cout << "Vous avez choisis " << hours << "h. Cela fait donc " << hoursToSeconds(hours) << " secondes." << endl;
                cout << "Ok" << endl;
                break;
            case 'c':
                cout << "Veuillez choisir un nombre de minutes a convertir en heures : ";
                cin >> minutes;
                cout << "Vous avez choisis " << minutes << "mn. Cela fait donc " << minutesToHours(minutes) << " heures." << endl;
                cout << "Ok" << endl;
                break;
            case 'd':
                cout << "Veuillez choisir un nombre de minutes a convertir en secondes : ";
                cin >> minutes;
                cout << "Vous avez choisis " << minutes << "mn. Cela fait donc " << minutesToSeconds(minutes) << " secondes." << endl;
                cout << "Ok" << endl;
                break;
            case 'e':
                cout << "Veuillez choisir un nombre de secondes a convertir en heures : ";
                cin >> seconds;
                cout << "Vous avez choisis " << seconds << "s. Cela fait donc " << secondsToHours(seconds) << " heures." << endl;
                cout << "Ok" << endl;
                break;
            case 'f':
                cout << "Veuillez choisir un nombre de secondes a convertir en minutes : ";
                cin >> seconds;
                cout << "Vous avez choisis " << seconds << "s. Cela fait donc " << secondsToMinutes(seconds) << " minutes." << endl;
                cout << "Ok" << endl;
                break;
            default:
                cout << "default" << endl;
                cin >> seconds;
                cout << "Pas ok" << endl;
                break;
            }
    
            cout << "Fin";
    
        return 0;
    }
    

    Voilà, si jamais vous avez la solution je suis preneur. Merci par avance et bonne journée/soirée :)

    (Si vous avez des conseils à me donner niveau opti ou autre, je suis preneur :)).

    -
    Edité par Winxglo 6 novembre 2018 à 17:29:02

    • Partager sur Facebook
    • Partager sur Twitter
    Jeune lycéen passionné par l'informatique et les jeux vidéos.
      6 novembre 2018 à 17:39:49

      Hola !

      Voici un indice, remplace 'ab' par 'a3' et regarde la sortie et le type de ta variable "hours".

      • Partager sur Facebook
      • Partager sur Twitter
        6 novembre 2018 à 17:48:13

        while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')

        Condition fausse. choix ne peut pas valoir a et b et c et d ...
        • Partager sur Facebook
        • Partager sur Twitter
          6 novembre 2018 à 17:53:16

          Zérotisme a écrit:

          while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')


          Condition fausse. choix ne peut pas valoir a et b et c et d ...

          Non, il vérifie que choix est différent de a ET différent de b ET différent de c etc...

          • Partager sur Facebook
          • Partager sur Twitter
            6 novembre 2018 à 17:54:48

            Je présume que je doit mettre OU (||) mais quand je veux tester, cela m'affiche un message d'erreur.
            • Partager sur Facebook
            • Partager sur Twitter
            Jeune lycéen passionné par l'informatique et les jeux vidéos.
              6 novembre 2018 à 17:54:54

              LilyKianii a écrit:

              Zérotisme a écrit:

              while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')


              Condition fausse. choix ne peut pas valoir a et b et c et d ...

              Non, il vérifie que choix est différent de a ET différent de b ET différent de c etc...

              Donc le seul choix possible ne doit pas etre une de ces lettres ... 
              si je choisi a , alors le premiere condition est vrai mais la deuxieme fausse .. 
              choix ne peut pas etre egal a tous ca en meme temps donc la condition sera forcement toujours faux .. choix == a mais choix != b donc on boucle ..

              la seul;e facon que la condition donne vrai serait de taper 'z' ou autre lettres que a - g

              La raison pourquoi 'ab' passe bien c'est parce que cin >> choix va prendre un caractere soit : 'a' et passe dans la premiere condition du switch laissant 'b' dans le buffer ( d'ou le pourquoi qu'il ne peut pas input une valeur par apres .. )

              -
              Edité par CrevetteMagique 6 novembre 2018 à 17:58:40

              • Partager sur Facebook
              • Partager sur Twitter
                6 novembre 2018 à 17:57:36

                Zérotisme a écrit:

                LilyKianii a écrit:

                Zérotisme a écrit:

                while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')


                Condition fausse. choix ne peut pas valoir a et b et c et d ...

                Non, il vérifie que choix est différent de a ET différent de b ET différent de c etc...

                Donc le seul choix possible ne doit pas etre une de ces lettres ... 
                si je choisi a , alors le premiere condition est vrai mais la deuxieme fausse .. 
                choix ne peut pas etre egal a tous ca en meme temps donc la condition sera forcement toujours faux .. choix == a mais choix != b donc on boucle ..

                la seul;e facon que la condition donne vrai serait de taper 'z' ou autre lettres que a - g

                -
                Edité par Zérotisme il y a moins de 30s

                Pourtant, cela marche bien quand je rentre uniquement une lettre et la bonne.

                • Partager sur Facebook
                • Partager sur Twitter
                Jeune lycéen passionné par l'informatique et les jeux vidéos.
                  6 novembre 2018 à 17:58:14

                  Zérotisme a écrit:

                  LilyKianii a écrit:

                  Zérotisme a écrit:

                  while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')


                  Condition fausse. choix ne peut pas valoir a et b et c et d ...

                  Non, il vérifie que choix est différent de a ET différent de b ET différent de c etc...

                  Donc le seul choix possible ne doit pas etre une de ces lettres ... 
                  si je choisi a , alors le premiere condition est vrai mais la deuxieme fausse .. 
                  choix ne peut pas etre egal a tous ca en meme temps donc la condition sera forcement toujours faux .. choix == a mais choix != b donc on boucle ..

                  Oui, effectivement mais ce n'est pas le cas dans l'exemple donné plus haut. Mais oui.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 novembre 2018 à 17:59:13

                    Winxglo a écrit:

                    Zérotisme a écrit:

                    LilyKianii a écrit:

                    Zérotisme a écrit:

                    while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')


                    Condition fausse. choix ne peut pas valoir a et b et c et d ...

                    Non, il vérifie que choix est différent de a ET différent de b ET différent de c etc...

                    Donc le seul choix possible ne doit pas etre une de ces lettres ... 
                    si je choisi a , alors le premiere condition est vrai mais la deuxieme fausse .. 
                    choix ne peut pas etre egal a tous ca en meme temps donc la condition sera forcement toujours faux .. choix == a mais choix != b donc on boucle ..

                    la seul;e facon que la condition donne vrai serait de taper 'z' ou autre lettres que a - g

                    -
                    Edité par Zérotisme il y a moins de 30s

                    Pourtant, cela marche bien quand je rentre uniquement une lettre et la bonne

                    LilyKianii a écrit:

                    Zérotisme a écrit:

                    LilyKianii a écrit:

                    Zérotisme a écrit:

                    while(choix != 'a' && choix != 'b' && choix != 'c' && choix != 'd' && choix != 'e' && choix != 'f' && choix != 'g')


                    Condition fausse. choix ne peut pas valoir a et b et c et d ...

                    Non, il vérifie que choix est différent de a ET différent de b ET différent de c etc...

                    Donc le seul choix possible ne doit pas etre une de ces lettres ... 
                    si je choisi a , alors le premiere condition est vrai mais la deuxieme fausse .. 
                    choix ne peut pas etre egal a tous ca en meme temps donc la condition sera forcement toujours faux .. choix == a mais choix != b donc on boucle ..

                    Oui, effectivement mais ce n'est pas le cas dans l'exemple donné plus haut. Mais oui.

                    J'ai editer pour l'explication de l'exemple "ab"

                    Jserais curieux de voir un exemple avec photo de l'execution quand tu choisi 'b' par exemple .. la condition est fausse et mal former ..



                    -
                    Edité par CrevetteMagique 6 novembre 2018 à 18:01:29

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 novembre 2018 à 18:00:18

                      Donc je doit supprimer la deuxième lettre du buffer pour ne garder que la première ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Jeune lycéen passionné par l'informatique et les jeux vidéos.
                        6 novembre 2018 à 18:03:07

                        tu peut mettre un : std::cin.ignore(INT_MAX, '\n'); ce qui effacera tous ce qui a dans le buffer. Par contre ca empechera pas l'utilisateur d'entrer 2 caracteres ou plus ..
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 novembre 2018 à 18:05:40

                          Enfaîte, si il entre deux caractère ou plus, je m'en moque un peu. Je veux seulement pouvoir lire que le premier donc pour cela, je doit supprimer tout ce qui suit la première lettre ? Au début, je m'était dit que je ferais un tableau pour pouvoir vérifier tout ça, mais ça me paraît compliqué.
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Jeune lycéen passionné par l'informatique et les jeux vidéos.
                            6 novembre 2018 à 18:09:00

                            Winxglo a écrit:

                            Enfaîte, si il entre deux caractère ou plus, je m'en moque un peu. Je veux seulement pouvoir lire que le premier donc pour cela, je doit supprimer tout ce qui suit la première lettre ? Au début, je m'était dit que je ferais un tableau pour pouvoir vérifier tout ça, mais ça me paraît compliqué.

                            tu peut toujorus recuperer un string et prendre que le premier caractere. Ca va aussi t'eviter les probleme de buffer ( si t'a encore un probleme de buffer , ajoute la ligne que je t'ai donner suite a ta premiere lecture , ca voudrais dire que le '\n' est rester dans le buffer )

                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 novembre 2018 à 18:55:32

                              Bon finalement je suis partit sur quelque chose de plus simple : j'ai modifié le type en int et j'ai vérifié si il était égale ou inférieur à zéro ou si il était supérieur au nombre maximum. Enfin bon, tout fonctionne bien, merci pour votre aide :)
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Jeune lycéen passionné par l'informatique et les jeux vidéos.
                                7 novembre 2018 à 12:15:22

                                Les entrées au claviers etaient déjà un sacré casse-tête en C, ca l'est toujours en C++.
                                Ce dont tu as besoin s'appelle les saisies sécurisées:
                                http://sdz.tdct.org/sdz/la-saisie-securisee-en-c.html

                                • Partager sur Facebook
                                • Partager sur Twitter

                                Vérifier le nombre de charactères

                                × 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