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 :

QCM dans une console


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut QCM dans une console
    Bonjour ,

    Je suis débutant en c++ et je voulais créer une console qui serait un petit quiz. Voila le code que j'ai mis (sans les entete et tout le bastringue, que le code^^) :

    [AVANT TOUT CE CODE J'AI INITIALISE 4 VARIABLES : int reponse1,reponse2,reponse3;
    int score=0;] VOILA LE CODE :
    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
     
    cout<<"\tBonjour et bienvenu dans ce quiz!";
    	cout<<endl<<endl<<endl<<endl;
    	cout<<"Question 1 : Qui etait Jean Rostand? : ";
    	cout<<endl<<endl;
    	cout<<"1 Un ecrivain?";
    	cout<<endl;
    	cout<<"2 Un biologiste?";
    	cout<<endl;
    	cout<<"3 Un peintre?";
    	cout<<endl;
    	cout<<"Votre reponse : ";
    	cin>>reponse1;
    if(reponse1=2)
    score++;
     
     
     
    	cout<<endl<<endl<<endl<<endl;
    	cout<<"Question 2 : En quel annee fut execute Charles Ier?";
    	cout<<endl<<endl;
    	cout<<"1 En 1649";
    	cout<<endl;
    	cout<<"2 En 1712";
    	cout<<endl;
    	cout<<"3 En 1612";
    	cout<<endl;
    	cout<<"Votre reponse :";
    	cin>>reponse2;
    if(reponse2=1)
    score++;
     
    	cout<<endl<<endl<<endl<<endl;
    	cout<<"Question 3 : Combien de touche possede un piano droit?";
    	cout<<endl<<endl;
    	cout<<"1 88, comme le piano a queu";
    	cout<<endl;
    	cout<<"2 61, moins que le piano a queu";
    	cout<<endl;
    	cout<<"3 88, plus que le piano a queu";
    	cout<<endl;
    	cout<<"Votre reponse :";
    	cin>>reponse3;
    if(reponse3=1)
    score++;
     
    cout<<endl<<endl;
     
    if(score=3)
    {
    cout<<"Super";
    }
    else
    {
    cout<<"Tu n'as pas tout juste";
    }
     
    system("pause");
    }
    Voila mon PROBLEME et que quand je fait ce quizz, même si je fait des fautes, IL ME MET TOUJOURS SUPER!!!!

    Que dois-je faire?
    Merci d'avance

    Tom

  2. #2
    Membre éprouvé Avatar de sardik
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    135
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2009
    Messages : 135
    Par défaut
    if(score=3)
    Le "=" signifie une affectation et toi tu veux faire un test.

    Il faut donc mettre :


  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Âge : 30
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 4
    Par défaut Merci
    Bonjour,

    C'est vrai ca! Il faut mettre 2 ==! ^^' Merci Sardik.
    A+
    Tom

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut, et bienvenue sur le forum

    Ceci dit, écrire tout "en dur", ce n'est peut être pas vraiment l'idéal

    Ne serait-ce que parce que le quizz va poser systématiquement les mêmes questions dans le même ordre et que, quand on y pense, tu réécris la même chose en permanence

    Ce que je te proposerais bien, c'est de créer une structure (ce pourrait être un classe, histoire d'encapsuler les données ) que nous nommerions, par exemple, question qui prendrait une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Question
    {
        std::string intitulé;
        std::vector<std::string> choix;
        size_t reponse;
    };
    si tu débutes en C++, et que tu te demande ce que peut être std::string et std::vector, disons que
    • std::string est la classe fournie par le standard pour la gestion de chaines de caractères
    • std::vector est la classe fournie par le standard pour la gestion de tableaux dynamiques d'objets contigus en mémoire (l'équivalent sécurisé et d'usage plus facile des tableaux du C)...

    grâce à cette structure, tu va pouvoir apporter énormément de dynamisme à ton quizz

    En effet, tu pourras décider d'écrire les questions "en dur" dans une fonction d'initialisation et les placer dans un... tableau de questions, mais c'est moins sympa que l'alternative qui consiste à écrire tes question dans un fichier qui pourrait prendre une forme proche dede

    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
    question_1    (1)
    nombre_choix  (2)
    choix_1       (3)
    choix_2       (3)
    ...
    choix_n       (3)
    reponse       (4)
    question_2
    question_1
    nombre_choix
    choix_1
    choix_2
    ...
    choix_n
    ...
    question_n
    nombre_choix
    choix_1
    choix_2
    ...
    choix_n
    dans lequel
    • (1) correspond à l'intitulé
    • (2) correspond au nombre de choix pour la question (de 2 à ...)
    • (3) correspond aux différents choix que tu veux donner (il en faut nombre_choix, pour bien faire
    • (4) correspond à l'index du choix qui représente la bonne réponse (attention, le premier choix a l'index 0 )


    Tu pourrais alors envisager une fonction d'initialisation proche de
    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
    /* Fonction qui  va remplir le quizz des questions qu'elle trouve
     * dans un fichier 
     * param: in / out std::vector<Quetion>& quizz: le tableau de questions
     *        à remplir
     */
    void initialize(std::vector<Question>& quizz)
    {
        /* ouvrons le fichier dans lequel se trouve les questions*/
        std::ifstream ifs("questions.txt")
        /* nous aurons besoin d'une chaine représentant la question */
        std::string question;
        /* tant que nous arrivons à lire une question */
        while(std::getline(ifs,question))
        {
            /* nous créons une question */
            Question toadd;
            /* nous définisson l'intitulé avec la question lue */
            toadd.intitule = question;
            /* nous lisons le nombre de possibilités */
            int nChoix;
            cin>>nChoix;
            /* nous lisons les différentes possibilités que nous plaçons 
             * dans le tableau ad hoc
             */
            for(size_t i=0;i<nChoix;++i)
            {
                std::string pos;
                std::getline(ifs,pos);
                toadd.choix.push_back(pos);
            }
            /* nous lisons l'index de la bonne réponse */
            ifs>>toadd.reponse;
            /* nous plaçons la question dans le quizz */
            quizz.push_back(toadd);
        }
    }
    Cette fonction pourrait être d'avantage sécurisée pour la lecture, voire utiliser la fantastique bibliothèque boost::serialize, mais j'essaye de rester simple malgré tout

    L'affichage de la question et la récupération du choix de l'utilisateur pourrait prendre une forme proche de
    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
    size_t affichage(Question const & question)
    {
        std::cout<<question.intitule<<std::endl,
        /* affichons les choix possibles */
        for(size_t i = 0;i<question.choix.size();++i)
            std::cout<< i<<"- "<<question.choix[i]<<std::endl;
        std::cout<<std::endl<<"votre choix : ";
        size_t choix = question.choix.size();
        /* il faut que le choix soit valide (l'utilisateur est par défaut un
         * imbécile distrait, il peut vouloir introduire 999 ou 5 alors que 
         * tu n'as que 3 choix ;))
         */
        while(choix>= question.choix.size())
        {
            std::cout<<std::endl<<"votre choix : ";
            /* nous refusons tout ce qui n'est pas une entrée numérique 
             * car l'utiliisateur, qui est toujours un imbécile distrait,
             * pourrait vouloir introduire "salut"
             */
            while(! (cin>>choix) )
            {
                cin.clear();
                cin.ignore( numeric_limits<streamsize>::max(), '\n' );
            }
            /* si la valeur ne correspond pas à un choix valide, nous tapons
             * sur les doigts de l'utilisateur
             */
            if(choix>= question.choix.size())
                std::cout<<"veuillez entrer un choix entre 0 et "
                         <<question.choix.size()-1<<std::end;
        }
        /* le choix est validé (non vérifié, ce n'est pas le but de la fonction)
         * nous pouvons le renvoyer ;)
         */
        return choix;
    }
    Enfin, il ne resterait plus qu'à gérer le quizz, en choisissant les questions au hasard, et en gardant une trace des résultats de l'utilisateur...

    Cela pourrait se faire sous une forme proche de
    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
    void game(std::vector<Question> const& quizz)
    {
        /* nous  aurons besoin d'un caractère permettant de 
         * savoir si on pose une question de plus
         */
        char encore= '\0';
        /* ainsi que du nombre de questions posées et du nombre de bonne 
         * réponses
         */
        int posee = 0;
        int bonne = 0;
        /* initialisons notre générateur de nombres aléatoires */
        srand( time(NULL) );
        while(encore!='n' && encore !='N')
        {
            /*choisissons un indice de question au hasard */
            size_t ind =(size_t) ((float) rand() / RAND_MAX * quizz.size());
            /* passons la main à l'affichage de la question, et récupérons le 
             * choix de l'utilisateur
             */
           size_t choix=affichage(quizz[ind]);
           /* vérifions la réponse de l'utisateur */
           if(choix==quiz[ind].reponse)
           {
               std::cout<<"correct"<<std::endl;
               bonne++;
           }
           else
           {
               std::cout<<"incorrect... la bonne reponse etait : "
                        <<quizz[ind].choix[reponse]<<std::endl;
           }
           posee++;
           /* demandons à l'utilisateur s'il veut continuer */
           while((encore!='n' && encore!:'N') || (encore!='o' && encore!='O'))
           {
               cout<<"Voulez vous continuer ( O / N ):";
               while(!(cin>>encore))
               {
                   cin.clear();
                   cin.ignore( numeric_limits<streamsize>::max(), '\n' );
                }
                if(encore!='n' && encore!:'N' && encore!='o' && encore!='O')
                    std::cout<<"Veuillez choisir entre O et N uniquement"<<std::endl;
           }
        }
        /* et affichons les résultats... le pourcentage ne peut être
         * calculé que s'il y a au moins une bonne réponse ;)
         */
        std::cout<<"Je vous ai pose "<<posee<<" questions."<<std::endl
                 <<"Vous avez repondu correctement a "<<bonne<<" d'entre elles"
                 <<std::endl;
        if(bonne>0)
            std::cout<<"cela vous fait une moyenne de "
                     << ((float)posee/(float)bonne*100) "% de bonnes reponses"
                     <<std::endl;
    }
    Le tout étant "mis en musique" dans la fonction main sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main()
    {
        std::vector<Question> quizz;
        initialize(quizz);
        game(quizz);
        cout << "Appuyez sur entrée pour continuer...";
        cin.ignore( numeric_limits<streamsize>::max(), '\n' );
        return 0;
    }
    (aucun code n'a été testé, les commentaires devraient te permettre de comprendre ce qui est fait )
    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. Couleur dans une console
    Par P'tite Nélodie dans le forum C
    Réponses: 6
    Dernier message: 05/04/2006, 19h42
  2. Lancer un programme c depuis java dans une console
    Par moise44 dans le forum Général Java
    Réponses: 5
    Dernier message: 04/04/2006, 20h04
  3. Ctrl -] ne passe pas dans une console avec vim
    Par Celelibi dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 10/03/2006, 13h35
  4. Accents dans une console windows
    Par JolyLoic dans le forum Windows
    Réponses: 8
    Dernier message: 20/10/2004, 00h57
  5. [VB.NET] Tabulation dans une console
    Par jacma dans le forum Windows Forms
    Réponses: 5
    Dernier message: 30/09/2004, 09h50

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