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 :

Extraire les chiffres d'un nombre.


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 40
    Points : 28
    Points
    28
    Par défaut Extraire les chiffres d'un nombre.
    Bonjour à tous,

    Je suis entrain de m'amuser à faire une sorte de MasterMind avec des chiffres sur la console. Je bute sur l'extraction du nombre saisi en chiffre.

    Je m'explique, si l'utilisateur saisi 123, par la méthode tableau je souhaiterai avoir :
    resultat(1) = 1
    resultat(2) = 2
    resultat(3) = 3

    Je débute en C++ merci de m'aider car je galère depuis un moment.
    Le code ci dessous est surement pas génial mais comme dit au dessus je débute

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <time.h>
    #include <string>
    #include <sstream>
     
    using namespace std;
     
    int main()
    {
        int const lenCombinaison(3);
        int const lenReponse(3);
        int codeSecret[lenCombinaison];
        int combi[lenReponse];
        srand(time(NULL));
        int nombre_aleatoire(0);
        int nombreJoueur(1);
        int proposiJoueur(0);
        int position(0);
        int rejouerUtilisateur (0);
     
        /* INTRODUCTION DU JEUX */
        cout << "" << endl << endl << endl;
        cout << "*****************************" << endl;
        cout << "*****************************" << endl << endl << endl;
        cout  << "        MASTERMIND ..." << endl << endl;
        cout << "*****************************" << endl;
        cout << "*****************************" << endl << endl << endl;
     
        /* DEFINITION DES REGLES ET SYMBOLES */
        cout << "Pour gagner : deviner la combinaison de " << lenCombinaison << " chiffres." << endl << endl;
        cout << "Si un I apparait, le chiffre correspondant est correct et bien place" << endl;
        cout << "Si un O apparait, le chiffre correspondant n'est pas bien place mais il se trouve dans la combinaison" << endl;
        cout << "Si un X apparait, le chiffre n'est pas dans la combinaison" << endl << endl << endl;
     
        /* ICI ON POURRAIT METTRE UNE INVITATION SUR LE NOMBRE DE JOUEUR */
     
     
        /* CREATION DE LA COMBINAISON SECRETE */
        for (int i(0);i<lenCombinaison;++i){
            for(int b=1; b<2; ++b){
                nombre_aleatoire= rand();
                    for (int a(0);nombre_aleatoire>10;++a){
                        nombre_aleatoire = nombre_aleatoire / 2;
                    }
                     codeSecret[i] = nombre_aleatoire / 2;
            }
        }
     
        /* JOUEUR JOUE */
        cout << "A vous de jouer, saisissez votre combinaison : ";
        cin  >> proposiJoueur;
     
        /* ON DECORTIQUE POUR VERIFIER SI GAGNER OU PERDU */
        for(int d=1; d<lenReponse+1; ++d){
            combi[d] = proposiJoueur[d];
            cout << "Chiffre saisi en " << d << "position : " << combi << endl;
        }
     
     
        cout << "Pour rejouer, saisir 1 sinon cliquez sur 0.";
        cin  >> rejouerUtilisateur;
     
     
     
        return 0;
    }
    Merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 582
    Points
    41 582
    Par défaut
    Tu fais la même chose que si tu voulais recoder son affichage: Divisions par 10 et modulo 10.

    Ou si tu es vraiment paresseux, tu le convertis directement en chaîne avec un ostringstream, puis tu récupères chaque chiffre en y soustrayant le caractère '0' (48 en ASCII).

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 128
    Points : 33 049
    Points
    33 049
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    la console te permet de récupérer son input dans un std::string.
    Par chance, il s'agit déjà d'un tableau ! De caractères certes. Pour les transformer en int, tu peux te contenter d'une soustraction par '0' (moyennant de t'assurer qu'il s'agit bien d'un nombre).

    Bon par contre je vois pas bien l'intérêt..
    Si tu sais déjà saisir des entiers, pourquoi ne pas faire que de la saisie d'entiers et simplement les comparer ?

  4. #4
    Membre émérite
    Avatar de VivienD
    Homme Profil pro
    Développeur logiciel
    Inscrit en
    Octobre 2009
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur logiciel
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 523
    Points : 2 278
    Points
    2 278
    Par défaut
    Le mieux dans ton cas serait de travailler directement avec des chaînes de caractères (char* ou std::string; c'est comme bon te semble), donc sans passer des variables entières intermédiaires, et ce, même pour retenir la combinaison-mystère. Ainsi ça te sera plus facile pour comparer les entrées de l'utilisateur et la combinaison à découvrir.

    Sur ce, bonne soirée et bonne année 2014.

    PS: Je te conseille de t'attarder un peu sur le code ASCII; ce codage sert toujours dans le monde de la programmation.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour à tous et bonne année 2014,

    Après recherche, j'ai réussi à faire ce que je souhaitai grâce au modulo.

    Je vous met le code ci dessous, mon but en faite et de me familiariser avec les premières bases avant de passer à la suite et je me suis mit donc en tête de faire ceci. Je regarde actuellement pour mettre un second joueur (ou plus) et surtout la mise en place de niveau (facile = 3 chiffres;moyen = 4 chiffres ...).

    Merci pour vos réponses

    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
     
     
    #include <iostream>
    #include <ctime>
    #include <cstdlib>
    #include <time.h>
    #include <string>
    #include <sstream>
     
    using namespace std;
     
    void introduction()
    {
        int const lenCombinaison(3);
        string grandeLigneEtoile("*****************************************************************");
        string petiteLigneEtoile("               ***************************************");
            cout << "" << endl;
            cout << petiteLigneEtoile << endl << petiteLigneEtoile << endl << "               ****                               ****" << endl ;
            cout << "               ****         MASTERMIND ...        ****" << endl << "               ****                               ****" << endl;
            cout << petiteLigneEtoile << endl << petiteLigneEtoile << endl << endl;
     
            /* DEFINITION DES REGLES ET SYMBOLES */
            cout << grandeLigneEtoile << endl  << "****   " << "Pour gagner : deviner la combinaison de " << lenCombinaison << " chiffres.   ****" << endl;
            cout << grandeLigneEtoile << endl << "****           I ->  chiffre correct et bien place           ****" << endl << "****            O -> se trouve dans la combinaison           ****" << endl ;
            cout << "****              X ->  pas dans la combinaison              ****" << endl << grandeLigneEtoile << endl << endl << grandeLigneEtoile << endl << "                QUE LE JEUX COMMENCE  !!!" << endl ;
    }
    void ligneEtoilee()
    {
     
        cout << "*****************************************************************" << endl;
    }
     
    int main()
    {
            int const lenCombinaison(3);
            int const lenReponse(lenCombinaison);
            int codeSecret[lenCombinaison];
            int combi[lenReponse];
            bool encoreUneErreurMini;
            srand(time(NULL));
            int nombre_aleatoire(0);
            int nombreJoueur(1);
            int proposiJoueur(0);
            int rejouerUtilisateur (0);
            int chiffreAestTrouve(0);
            int chiffreBestTrouve(0);
            int chiffreCestTrouve(0);
            int essai(0);
            int record(0);
            string messageaa;
            string messagebb;
            string messagecc;
            int nombre (0);
            int chifgg (0);
            int effgrdt (0);
     
     
            introduction(); /* Message d'intro du jeux + règles du jeux. */
     
            /* ICI ON POURRAIT METTRE UNE INVITATION SUR LE NOMBRE DE JOUEUR */
     
     
    do
    { /* DEBUT DE LA BOUCLE POUR REJOUER */
     
            /* CREATION DE LA COMBINAISON SECRETE */
            for (int i(1);i<lenCombinaison+1;++i){
                for(int b=1; b<2; ++b){
                    nombre_aleatoire= rand();
                        for (int a(0);nombre_aleatoire>10;++a){
                            nombre_aleatoire = nombre_aleatoire / 2,14549849486;
                        }
                         codeSecret[i] = nombre_aleatoire / 2,4468464648;
                         /*cout <<  codeSecret[i] << endl;*/
                }
            }
     
        do
        { /* DEBUT DE LA BOUCLE POUR PLUSIEURS ESSAIS
     
            /* JOUEUR JOUE */
            essai = ++essai;
            cout << "Coup No " << essai << ", saisissez votre combinaison : ";
            cin  >> proposiJoueur;
     
            /* ON DECORTIQUE POUR AVOIR UN CHIFFRE PAR NOMBRE */
            for(int d=1; d<lenReponse+1; ++d){
                    if (d == 1 && lenCombinaison == 3)
                    {
                        combi[d] = proposiJoueur / 100;
                    }
                    if (d == 2 && lenCombinaison == 3)
                    {
                        combi[d] = (proposiJoueur % 100) / 10;
                    }
                    if (d == 3 && lenCombinaison == 3)
                    {
                        combi[d] = (proposiJoueur % 10);
                    }
            }
     
             /* ON COMPARE CHAQUE CHIFFRE POUR VERIFIER SI LA COMBINAISON EST BONNE */
     
            for(int k=1; k<lenReponse+1; ++k){
                if (combi[k] == codeSecret[k])
                {
                        if (k == 1)
                        {
                            chiffreAestTrouve = 1;
                            messageaa = "I " ;
                        }
                        if (k == 2)
                        {
                            chiffreBestTrouve = 1;
                            messagebb = "I " ;
                        }
                        if (k == 3)
                        {
                            chiffreCestTrouve = 1;
                            messagecc = "I " ;
                        }
                }
                else
                {
                    if (k == 1)
                    {
                        if (combi[k] == codeSecret[2] ||combi[k] == codeSecret[3])
                        {
                        chiffreAestTrouve = 0;
                        messageaa = "O " ;
                        }
                        else
                        {
                        chiffreAestTrouve = 0;
                        messageaa = "X " ;
                        }
                    }
                    if (k == 2)
                    {
                        if (combi[k] == codeSecret[1] ||combi[k] == codeSecret[3])
                        {
                        chiffreBestTrouve = 0;
                        messagebb = "O " ;
                        }
                        else
                        {
                        chiffreBestTrouve = 0;
                        messagebb = "X " ;
                        }
                    }
                    if (k == 3)
                    {
                        if (combi[k] == codeSecret[1] ||combi[k] == codeSecret[2])
                        {
                        chiffreCestTrouve = 0;
                        messagecc = "O " ;
                        }
                        else
                        {
                        chiffreCestTrouve = 0;
                        messagecc = "X " ;
                        }
                    }
                }
            }
            cout << "                                                    " << messageaa << " " << messagebb  << " " << messagecc << endl;
     
            ligneEtoilee();
     
        }while (chiffreAestTrouve != 1  || chiffreBestTrouve != 1 || chiffreCestTrouve !=1) ;
     
            cout << "OUI ! La combinaison gagnante était bien : " << codeSecret[1] << "" << codeSecret[2] << "" << codeSecret[3] << endl << endl;
            cout << "Combinaison trouvée en  " << essai << " essai(s). Essayez battre votre score !" << endl << endl;
     
                if (record == 0)
            {
                int record (essai);
                cout << "" << essai << " coup(s), record enregistré !" << endl << endl;
            }
            else
            {
                if (record > essai)
                {
                    record = essai;
                    cout << "Nouveau record de " << essai << " coup(s) enregistrés ! Felicitation !" << endl << endl;
                }
                else
                {
                   cout << "Vous n'avez pas battu votre record de " << record << " coup(s) !" << endl << endl;
                }
            }
            essai = 0;
            cout << "Pour rejouer, saisir 1 sinon 0." << endl << endl;
            cin  >> rejouerUtilisateur;
     
    }while (rejouerUtilisateur == 1);
     
        return 0;
    }

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Oula attention à l'opérateur virgule !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (int a(0);nombre_aleatoire>10;++a){
        nombre_aleatoire = nombre_aleatoire / 2,14549849486;
        // nombre_aleatoire == 14549849486 -> overflow
        // nombre_aleatoire == 5
    }
    codeSecret[i] = nombre_aleatoire / 2,4468464648;
    // codeSecret[i] == 4468464648 -> overflow
    // codeSecret[i] == 3
    Les nombres à virgules sont notés float f = 1.234f; ou double d = 1.234;.
    La condition devrait aussi être while(nombre_aleatoire>=10){ (10 prend 2 caractères et n'est donc pas distinguable (ce mot existe ?) de "1 0".

    Attention aussi au fait que les tableaux commencent à l'indice 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /* CREATION DE LA COMBINAISON SECRETE */
    for (int i(1);i<lenCombinaison+1;++i){
    // devrait être
    for (int i(0);i<lenCombinaison;++i){

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 40
    Points : 28
    Points
    28
    Par défaut
    Bonjour Iradrille,


    Les nombres à virgules sont notés float f = 1.234f; ou double d = 1.234;.
    En faite j'ai fait exprès de le mettre en INT et pas en double ou float car je souhaite récupérer un chiffre entier.

    La condition devrait aussi être while(nombre_aleatoire>=10){ (10 prend 2 caractères et n'est donc pas distinguable (ce mot existe ?) de "1 0".
    Je prend note et modifie, merci :-)

    Attention aussi au fait que les tableaux commencent à l'indice 0
    J'avais bien pris en compte ce paramètre qui m’agace assez souvent d'ailleurs. je l’agrémente de 1 pour avoir mon nombre de coup sans y ajouter 1 par la suite. Mon code n'étant pas lourd, je le comprend mais je vais effectivement prendre l'habitude de travailler autrement.


    Merci pour tes conseil

    A bientot.

    Koci

  8. #8
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par kocipia Voir le message
    En faite j'ai fait exprès de le mettre en INT et pas en double ou float car je souhaite récupérer un chiffre entier.
    Pas sur que tu ais compris ce que je voullais dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nombre_aleatoire = nombre_aleatoire / 2,14549849486;
    Est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nombre_aleatoire / 2; // ne sert à rien
    nombre_aleatoire = 5;
    (Bien qu'étant une façon assez sale de la faire car exploitant les overflow sur les int.)

    edit : correction

Discussions similaires

  1. Extraire les chiffres d'un nombre
    Par sali2801 dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 07/12/2010, 14h41
  2. Récupérer tous les chiffres d'un nombre
    Par AnozerOne dans le forum Mathématiques
    Réponses: 7
    Dernier message: 16/01/2009, 00h56
  3. Décomposer les chiffres d'un nombre en variables
    Par kryogen dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/04/2008, 13h46
  4. [MySQL] extraire les chiffres d'une chaine
    Par megane dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/08/2006, 14h29
  5. [Tableaux] Extraire les chiffres dans une chaîne
    Par Digiduck dans le forum Langage
    Réponses: 8
    Dernier message: 16/08/2006, 14h33

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