IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Tester si l'utilisateur a saisi un nombre


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 51
    Points : 59
    Points
    59
    Par défaut Tester si l'utilisateur a saisi un nombre
    Bonjour,

    J'essaye de réaliser un exercice en C++ mais je n'arrive pas à tester le type d'une variable.
    Mon programme demande à l'utilisateur de saisir un mot mais si ce mot est un chiffre (ou en contient un) alors il doit en saisir un nouveau.
    Il me semble que dans tout les cas c'est une chaine de caractère que l'utilisateur saisi (via cin >>) : qu'on ai "bonjour" ou "55" c'est une chaine (si je ne me trompe pas)
    J'ai crée un tableau avec tout les chiffres de 1 à 9 et je compare chaque lettre du mot saisi avec les valeurs contenues dans ce tableau. Si je trouve une égalité c'est que le mot contient au moins un chiffre et donc je demande à l'utilisateur de ressaisir un nouveau mot.

    Quelqu'un pourrait il m'aider à trouver mon erreur ? J'ai essayer plusieurs solutions mais apparemment il n'existe pas de fonction qui donne directement le type d'une variable ou d'un objet, contrairement à d'autres langages...

    De plus si quelqu'un connait une méthode efficace pour tester le type des variables ou peut me donner des "conseils de codage" je suis preneur.

    Voilà mon code source :

    fichier principal (methode main donc ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>
    #include <string>
    #include <vector>
    #include "choixMot.h"
     
    using namespace std;
     
    int main()
    {
        string motMystere("");
        cout << "Bonjour ! Veuillez saisir le mot que vous voulez faire deviner" << endl;
        motMystere = choixMot();
        cout << "Le mot mystere est : " << motMystere << endl;
        cout << "Vous pouvez a present commencer a jouer !" << endl;
     
        return 0;
    }
    Une fonction et son prototype :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include "choixMot.h"
    #include <string>
    #include <iostream>
    #include <vector>
    using namespace std;
     
    string choixMot()
    {
        bool estUneChaine(true);
        string motMystere("");
        vector<int> tableau(10);
        for(int i=0; i<10; i++)
        {
            tableau[i] = i;
        }
        do
        {
            cout << "Saisissez le mot : " << endl;
            estUneChaine = true;
            getline(cin, motMystere);
            for(int i=0; i<motMystere.size(); i++)
            {
                if(find(tableau.begin(), tableau.end(), motMystere[i])!=tableau.end())
                {
                    estUneChaine = false;
                }
            }
        }while((estUneChaine==false) && motMystere.size() > 100);
        return motMystere;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef CHOIXMOT_H_INCLUDED
    #define CHOIXMOT_H_INCLUDED
    #include <string>
    #include <vector>
     
    std::string choixMot();
     
    #endif // CHOIXMOT_H_INCLUDED

    PS : Je débute avec ce langage et je développe sous Code Blocks (8.02)

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Bonjour,

    Tu as quelques fonctions du C (et qui peuvent être réutilisée en C++) qui pourront t'aider et qui seront sûrement plus simple que ce que tu fais : http://man.developpez.com/man3/isalpha.3.php

    Sinon, n'oublie pas que les caractères sont des entiers, si tu veux savoir si un caractère appartient à un ensemble de caractère consécutifs (ex : 0 à 9) tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool estDansEnsemble(char debut, char fin, char car)
    {
                 return car >= debut && car <= fin;
    }

    EDIT : plutôt que de faire un for pour parcourir ta chaîne, tu peux faire un find_if avec un foncteur et tu regardes s'il retourne end() ou non.

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 51
    Points : 59
    Points
    59
    Par défaut
    Génial, ça marche. Merci pour ta réponse.

    En fait j'avais déjà essayé d'utiliser la fonction isdigit() mais je n'avais pas tester la valeur de retour (qui doit être égale à 0 si le paramètre n'est pas un entier). Bref...

    Pour ce qui est des foncteurs je n'en suis pas encore là. Mais c'est au programme^^

    Sinon tu dis que les caractères sont des entiers ? Es tu vraiment sûr ou c'est une erreur de frappe ?

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Un char n'est pas un caractère mais un entier comme un int, un short etc.

    Par contre on associe à la valeur du char des caractères (code ASCII).
    Par exemple 'a' est remplacé par le compilateur par 63 ou plutôt 0x3E en hexadécimal.

    /!\ Tu peux aussi avoir des caractères sur plusieurs octets suivant l'encodage.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 51
    Points : 59
    Points
    59
    Par défaut
    Ok d'accord je comprend mieux. Merci.
    Dans le code on peut quand même stocker des lettres ('a', 'B', etc...) ça me rassure^^.

    Je comprend mieux ce code donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool estDansEnsemble(char debut, char fin, char car)
    {
                 return car >= debut && car <= fin;
    }
    J'aurais juste une petite dernière question avant de passer le sujet en résolu (si tu le veux bien) : 'a' est converti par le compilateur en 63. Mais ça n'a aucun rapport avec le code ASCII si ? Je cherche depuis tout à l'heure sur Google et je ne trouve que des tables avec 'a' = 97. Pourrais tu me dire ou je peux trouver la bonne table stp ?

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Non, c'est juste que je ne connais pas la table ASCII par coeur
    Bon 'A' = 65, j'étais pas trop loin ^^

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 51
    Points : 59
    Points
    59
    Par défaut
    Ah d'accord !

    Et bien il serait temps de l'apprendre non ?

    Merci pour ton aide ! Je met en résolu

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Ce qui est moche, c'est qu'il existe pas mal de trucs sympas, mais rien qui permette de vérifier si une chaine de caractères est partiellement composée de chiffres.

    Cependant, il est tout à fait possible, si tu récupère l'entrée utilisateur dans une std::string, d'avoir assez facilement ce genre de fonctionnalité...

    En effet, il existe deux versions de isdigit (l'une adaptée aux éventuelles locales, l'autre ne prenant qu'un entier), mais s'il faut les utiliser "telles quelles", il va falloir commencer à jouer avec de bind et autres joyeusetés.

    L'idée est donc de créer son propre foncteur sous la forme de
    // nécessite l'inclusion de cctype
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    struct MyTest
    {
        bool operator()(char c)
        {
              return std::isdigit(c);
        }
    };
    Une fois ce foncteur fait il devient assez facile d'utiliser find_if (disponible par inclusion de <algorithm> ) sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::string str;
    std::cin>> str;
    if(std::find_if(str.begin(),str.end(),MyTest() ) != str.end())
    {
        std::cout<<"vous ne pouvez pas introduire de chiffre";
    }
    On peut noter qu'il devrait y avoir moyen de faire quelque chose de fort similaire avec les expressions lambda de C++11 (pour autant que tu puisses les utiliser) , mais il me semble important d'insister sur le fait que les lambda doivent être utilisées avec la plus grande prudence car elle ne font "que" faciliter l'écriture, mais risquent de compliquer la relecture (voire inciter à réécrire 20 fois le code)...

    Mais je verrais bien quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bool hasDigit(std::string const & str)
    {
        return std::find_if(str.begin(),str.end(),
                            [] (char const & c)
                            {return std::isdigit(c);})!=str.end();
    }
    qui serait alors utilisé sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        std::string str;
        std::cin >>str;
        if(hasDigit(str))
        {
            std::cout<<"vous ne pouvez pas introduire de chiffre";
        }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Free Pascal] Comment tester que l'utilisateur a saisi un chiffre
    Par antezi dans le forum Free Pascal
    Réponses: 2
    Dernier message: 25/04/2013, 10h40
  2. [Débutant] Saisie de nombre par l'utilisateur en matlab
    Par bsangoku dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/04/2010, 07h39
  3. Réponses: 11
    Dernier message: 07/02/2009, 01h31
  4. [JFormattedTextField] Saisie des nombres
    Par n00bi dans le forum Composants
    Réponses: 2
    Dernier message: 20/06/2005, 14h23
  5. Tester qu'une variable varchar est un nombre
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/06/2005, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo