Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fignolage de mon quiz

aidez moi a le perfectionner plz

    7 juin 2006 à 15:43:51

    Salut,

    Je viens de finir mon premier programme : un Quiz !
    Et jen suis très fier ! :)
    Je me suis inspiré du TP sur le pendu (la partie dictionnaire).

    Et je voudrais que vous m'aidiez a le fignoler c'est a dire : me dire sil y a quelque chose que je pourrai racourcir ou si il y a quelque chose que jaurai pu faire d'une facon plus simple (meilleure) ou me dire s'il vous trouvez des bugs ect ...

    Et jai aussi quelque problemes : Quand mon prog demande de choisir entre histoire ou maths a l'aide d'un scanf et que jentre une lettre mon prog bug; comment faire pour regler ce probleme? Peut etre faut il utiliser une fonctions équivalente a scanf vu kil parait qu'elle est pas terrible celle la !

    Et je voudrais savoir aussi si mon code est portable (sur linux, windows et mac) ? Je sais que system ("PAUSE") n'est valable que sur windows alors jai voulu le remplacer par getchar mais le programme continue comme si de rien n'etais o_O

    Et au fait meme s'il est portable, il faut le recompiler sur la plateformes ou on va l'utilisé, nan ?
    C'est donc le code source qui est portable et non l'executable, je me trompe ? (jai du voir ca sur ce forum je crois mais jsui plus sur du tout)

    Voila jespere que quelqu'un pourra répondre a toute mes interrogation ! :)

    Voici mon code source :

    // Quiz realise par Hugo
    // Termine le 07/06/06 a 12h30
    // Avec l'aide du cours de Mateo21 sur www.siteduzero.com

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>

    #define SYSTEM(cate) catego = cate;\
                         for (i=1; i < 11; i++)\
                         {\
                         printf ("\n   Question numero %d :", i);\
                         piocherQuestion(question, reponse, cate);\
                         questionner (question, reponse, &points);\
                         }\
                         nombreSeries++;\
                         printf ("\n\nVous avez totalise %d point(s) en %d serie(s)!\n\n", points, nombreSeries);\
                         printf ("Tapez 1 pour refaire une serie de questions ou 0 pour quitter le quiz : ");\
                         scanf ("%d", &continuerPartie);\
                         puts ("\n");

    int piocherQuestion(char *questionPiochee, char *reponsePiochee, int catego);
    long nombreAleatoire(long nombreMax);
    void questionner (char *question, char *reponse, int *points);
    void clean (char *chaine, FILE *fichier);

    int main(int argc, char *argv[])
    {
        int choixCate = 0, points = 0, continuerPartie = 1, nombreSeries = 0, catego = 0, i;
        char question[500] = {0}, reponse[3] = {0};

            puts ("     --- Quiz ---\n");

        do{
            printf ("Voici les differentes categories :\n 1-Histoire\n 2-Maths\nVotre choix : ");
            scanf ("%d", &choixCate);

            if (choixCate == 1)
            {
                SYSTEM(1)
            }
            else if (choixCate == 2)
            {
                SYSTEM(2)
            }
            else
                puts ("\nErreur : choisissez une categorie en tapant le nombre qui lui correspond.\n exemple : '1' pour histoire, '2' pour maths ...\n");

        } while(continuerPartie);
            return 0;
    }

    int piocherQuestion(char *questionPiochee, char *reponsePiochee, int catego)
    {
        FILE* questions = NULL;
        FILE* reponses = NULL;

        long nombreQuestions = 0, numQuestionChoisie = 0, numReponseChoisie = 0;
        int caractereLu = 0;

        if (catego == 1)
            questions = fopen("questionsHistoire.txt", "r");
        if (catego == 2)
            questions = fopen("questionsMaths.txt", "r");

        if (questions == NULL)
        {
            printf("\nImpossible de charger le dictionnaire de questions.");
            return 0;
        }

        if (catego == 1)
            reponses = fopen("reponsesHistoire.txt", "r");
        if (catego == 2)
            reponses = fopen("reponsesMaths.txt", "r");

        if (reponses == NULL)
        {
            printf("\nImpossible de charger le dictionnaire de reponses.");
            return 0;
        }

        do
        {
            caractereLu = fgetc(questions);
            if (caractereLu == '\n')
                nombreQuestions++;
        } while(caractereLu != EOF);

        numQuestionChoisie = nombreAleatoire(nombreQuestions);
        numReponseChoisie = numQuestionChoisie;

        rewind(questions);

        while (numQuestionChoisie > 0)
        {
            caractereLu = fgetc(questions);
            if (caractereLu == '\n')
                numQuestionChoisie--;
        }

        rewind(reponses);

        while (numReponseChoisie > 0)
        {
            caractereLu = fgetc(reponses);
            if (caractereLu == '\n')
                numReponseChoisie--;
        }

        fgets (questionPiochee, 500, questions);
        clean (questionPiochee, questions);
        fclose(questions);

        fgets (reponsePiochee, 3, reponses);
        clean (reponsePiochee, reponses);
        fclose(reponses);

        return 1;
    }

    long nombreAleatoire(long nombreMax)
    {
        srand(time(NULL));
        return (rand() % nombreMax);
    }

    void questionner (char *question, char *reponse, int *points)
    {
        char reponsedonnee[3] = {0};
        int comp = 0;

        printf("\n%s\n", question);

        printf ("\n   Quel est la bonne reponse ? ");
        scanf ("%s", reponsedonnee);

        comp = strcmp(reponse, reponsedonnee);

        if (comp == 0)
        {
            puts ("Bravo, c'est la bonne reponse !\n");
            *points = *points + 1;
        }

        else
            printf ("Perdu, la bonne reponse etait la reponse %s.\n\n", reponse);

        system ("PAUSE");
    }

    void clean (char *chaine, FILE *fichier)
    {
       char *p = strchr (chaine, '\n');
       if (p != NULL)
       {
          *p = 0;
       }
       else
       {
            int c;
            while ((c = fgetc(fichier)) != '\n' && c != EOF);
       }
    }




    Et les fichiers qui vont avec :

    questionsHisoire.txt
    Quel est la date de naissance de Louis 14 ? 1/ 1743 2/ 1643 3/ 1689 4/ 1789
    En quelle annee est mort Louis 15 ? 1/ 1774 2/ 1874 3/ 1747 4/1847
    A quellle date fut fixee le sacre de Napoleon ? 1/ 02/12/1804 2/ 03/12 1804 3/ 02/02/1804 4 03/02/1804
    En quelle anne Pasteur mis au points le vaccin contre la rage ? 1/ 1785 2/1875 3/ 1885 4/ 1775
    En quelle annee la bicyclette fut inventee ? 1/ 1877 2/ 1767 3/ 1777 4/ 1867
    Quelle est la date de la prise de la bastille ? 1/ 14/07/1789 2/ 14/07/1889 3/ 15/07/1789 4/ 15/07/1889
    Quand fut creer le louis d or ? 1/ 1650 2/ 1550 3/ 1540 4/ 1640
    En quelle annee fut etabli la loi de l inertie ? 1/ 1540 2/ 1440 3/ 1340 4/ 1240
    Quand fut sacre Louis 1er ? 1/ XX/10/916 2/ XX/10/816 3/ XX/09/816 4/ XX/09/916

    reponsesHisoire.txt
    2
    1
    1
    3
    4
    1
    4
    3
    2

    Et ca serait cool si vous arriviez a me trouvez des questions et réponses pour différentes matières genre la géographie, l'histoire, la phisique et la chimie, les maths ...

    Mais bon faut pas trop en demander non plus quand meme :p



    • Partager sur Facebook
    • Partager sur Twitter
      7 juin 2006 à 17:17:48

      En ce qui concerne la "portatibilité" en effet si tu veux par exemple faire une version Linux de ce prog : il faut le recompiler sous Linux (il n'y a pas de .exe sous linux au sens windosien du terme).

      En revanche comme tu le dit
      system("PAUSE");
      n'est utilisable que sous windows (encore que j'ai un doute) : system() existe sous Linux mais les paramètres sont différents.

      Pour les améliorations : j'ai pas lu ton code.

      ton scanf() plante ? dans ce cas utilise fgets().
      • Partager sur Facebook
      • Partager sur Twitter
        7 juin 2006 à 17:20:13

        On est tellement habitué à ce problème de scanf qu'on le mets même sans qu'on nous l'ait demandé à ce que je vois ... pas vrai Tab :lol:
        (au fait Tab, c'est system("PAUSE") )
        • Partager sur Facebook
        • Partager sur Twitter
          7 juin 2006 à 17:24:50

          bien dit :lol: !
          c'est edité merci ;)

          pour fgets c'est
          fgets(chaine,taille,stdin);
          • Partager sur Facebook
          • Partager sur Twitter
            7 juin 2006 à 17:28:28

            C'est quoi cette horrible macro en début de code ???
            • Partager sur Facebook
            • Partager sur Twitter
              7 juin 2006 à 18:02:19

              Pour la jolie macro en debut de code jvoi pas pourquoi tu la qualifie d'horrible ! Moi jla trouve très belle et ca allège le code au lieu de le mettre 2 fois je le met qu'une seule fois, nan, c'est pas bien ? :)

              Sinon, moi je veux bien utiliser fgets mais alors je ne peut plus utiliser un int pour stocker, nan ? Si je suis obliger d'utiliser un tableau de char ca m'embete car apres pour comparer ca sera la bordel dans mon code. :colere2:
              • Partager sur Facebook
              • Partager sur Twitter
                7 juin 2006 à 18:25:28

                pas tant que ça : deux lignes de plus en utilisant strcmp() ou une fois que tu as ton nombre dans ta chaîne utilise atoi() afin d'avoir un int.
                • Partager sur Facebook
                • Partager sur Twitter
                  7 juin 2006 à 18:45:36

                  Tu aurais tout simplement dû faire une fonction... c'est fait pour ça après tout...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    7 juin 2006 à 18:48:20

                    bonne remarque tu crée une fonction de récupération qui enregistre et compare d'un coup !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      7 juin 2006 à 19:41:53

                      tu pourrai m'expliker comment fonctionne la fonction "atoi()" silteuplait ? :)

                      Car jai pas envie de m'embeter a recréer une fonction pour comparer et tout !
                      • Partager sur Facebook
                      • Partager sur Twitter
                        7 juin 2006 à 19:54:54


                        int atoi(const char *chaine)
                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 juin 2006 à 20:08:54

                          Citation : M@teo21

                          Le prototype est en quelque sorte le mode d'emploi d'une fonction [...]


                          :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            7 juin 2006 à 21:26:34

                            Citation : tebonb


                            int atoi(const char *chaine)

                            Oui mais non...

                            Moi aussi j'utilisais atoi avant, atoi c'est mal car la fonction ne fait aucun test qui vérifie si la chaine est valide (présence du '\0', présence de chiffres) et s'il y a un débordement, bah ça fait boom.

                            Le mieux reste strtol (voir man strtol ou le post-it de rz0 sur les fonctions standards).

                            Sinon, pour convertir une chaîne en un entier, réel ou autre chose, on peut utiliser sscanf (voir man sscanf ou post-it de rz0 :p ).

                            Kr00pS
                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 juin 2006 à 21:52:02

                              Bah on peux vérifier nous même si la chaine est bien valide avant d'appeler atoi je ne vois pas le probléme. Sinon, comme tu le dis, il est aussi possible d'utiliser sscanf


                              sscanf(chaine,"%d",&nombre);
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 juin 2006 à 12:17:15

                                Citation : tebonb

                                Bah on peux vérifier nous même si la chaine est bien valide avant d'appeler atoi je ne vois pas le probléme. Sinon, comme tu le dis, il est aussi possible d'utiliser sscanf


                                sscanf(chaine,"%d",&nombre);

                                Autant prendre les bonnes habitudes dès le début, et c'est beaucoup plus simple d'utilisation que atoi et ses tests.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Fignolage de mon quiz

                                × 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