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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    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
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 actif
    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
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 actif
    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
    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 026
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    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 026
    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 actif
    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
    Par défaut
    Ah d'accord !

    Et bien il serait temps de l'apprendre non ?

    Merci pour ton aide ! Je met en résolu

+ 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