Virtoprofessor: mrcardo, un apprentissage rapide de vos leçons :d (questions, reponses)

Description

Yo!
Voila je prépare un projet qui se nomme VirtoProfessor qui est composé de plusieurs virtuals professeurs avec des roles précis et ici je met à votre disposition, le professeur MrCardo qui vous interroge sur ce que vous voulez (Question->Reponse).
MrCardo est loin d'etre terminer mais je vous donne le code source pour me donner votre avis.

Comment ça marche ?

C'est trés simple! Vous créer un fichier texte de n'importe qu'elle extension, cela n'a pas d'importance, ensuite dans ce fichier vous placez vos questions et reponses de cette façon:

Test.txt :
Combient font 2*2+1+1 ?
6
Combient font 2*5 ?
10

Ensuite vous glissez ce fichier sur MrCardo.exe et vous parametrez le test.

Ciao!

Source / Exemple :


#include <vector>
#include <string.h>
#include <time.h>
#include <cstdio>
#include <cstdlib>

using namespace std;

unsigned int aleatoire(const unsigned int min, const unsigned int max) // Fonction qui retourn un nombre entre min et max (min et max inclus)
{
    return (unsigned int)(min+((float) rand()/RAND_MAX*(max - min + 1)));
}

bool strcompare(const char *str1, const char *str2, bool casse=false) // Fonction qui compare 2 chaines de caracteres avec ou sans casse
{
    unsigned int max=strlen(str1);
    if(max!=strlen(str2))
    {
        return false;
    }
    for(unsigned int i=0; i<max; i++)
    {
        if((!casse && tolower(str1[i])!=tolower(str2[i])) || (casse && str1[i]!=str2[i]))
            return false;
    }
    return true;
}

int main(int nb_args, char** argv)
{
    srand(time(NULL));

    if( nb_args<2 ) // Si aucun fichier n'est passer aux parametres de l'exe, on quitte
    {
        fprintf(stderr,"\n\n # Aucun fichier ! Au revoir !\n\n");
        fflush(stdin);
        getchar();
        return EXIT_FAILURE;
    }
    for (unsigned int i_file=1; true; i_file++)
    {
        FILE* file_datas = fopen(argv[i_file],"rb");
        if ( file_datas == NULL ) // Si le fichier n'existe pas ou protegé contre la lecture
        {
            fprintf(stderr,"\n\n # Le fichier n%u (%s) est introuvable ! ",i_file,argv[i_file]);
            if ((nb_args-i_file)==1) // On abondonne le fichier et on passe au suivant s'il existe
            {
                break;
            }
            fprintf(stdout,"\n\n # Passage au fichier n%u\n\n",i_file+1);
            continue;
        }
        vector<vector<char> > questions, reponses; // vector pour les questions, et un autre pour les reponses
        vector<bool> aff_rep, aff_ques; // Variables pour sauvegarder l'index des questions et reponses et eviter les repetitions s'il est desactivé
        vector<char> line; // Variable pour stocker la ligne du fichier
        bool syntaxe_correct = true; // La variable d'etat du fichier
        int params[7] = {0}; // Le tableau de parametres du test
        system("CLS"); // Vidage de stdout
        fprintf(stdout,"\n\n # Poser les questions au hasard (1=Oui,0=Non) ? ");
        fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
        fscanf(stdin,"%d",&params[0]); // Recuperation du 1er parametre
        system("CLS"); // Vidage de stdout
        if(params[0]) // Si l'hasard est activer on demande s'il faut activation l'"AntiRepeat"
        {
            fprintf(stdout,"\n\n # Activer l'option Anti-Repeat (1=Oui,0=Non) ? ");
            fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
            fscanf(stdin,"%d",&params[1]); // Recuperation du 2eme parametre
        }
        system("CLS"); // Vidage du stdout
        fprintf(stdout,"\n\n # Poser toutes les questions disponibles (0=Oui,nombre) ? ");
        fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
        fscanf(stdin,"%d",&params[2]); // Recuperation du 3eme parametre
        system("CLS"); // Vidage de stdout
        if(!params[2]) // Si les questions doivent etre posés au complet
        {
            fprintf(stdout,"\n\n # Faire le test en boucle (1=Oui,0=Non) ? ");
            fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
            fscanf(stdin,"%d",&params[3]); // Recuperation du 4eme parametre
        }
        system("CLS"); // Vidage de stdout
        fprintf(stdout,"\n\n # Respecter la cAsSE (1=Oui,0=Non) ? ");
        fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
        fscanf(stdin,"%d",&params[6]); // Recuperation du 7eme parametre
        system("CLS"); // Vidage de stdout
        fprintf(stdout,"\n\n # Choisissez une option:\n 1-Poser logiquement les questions\n 2-Inverser\n%s = ",(params[0])?" 3-Les deux\n":"\n = ");
        fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
        fscanf(stdin,"%d",&params[4]); // Recuperation du 5eme parametre
        fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
        system("CLS"); // Vidage de stdout
        fprintf(stdout,"\n\n # Afficher les reponses (1=Oui,0=Non) ? ");
        fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
        fscanf(stdin,"%d",&params[5]); // Recuperation du 6eme parametre
        fflush(stdin); // Vidage du stdin pour pas reprendre les caracteres qui dépassé avant
        system("CLS"); // Vidage de stdout
        /* Boucle de remplissage */
        for (bool rep=false; !feof(file_datas);) // rep = Variable qui nous permettra de passer des reponses aux questions dans la boucle
        {
            if ( params[1] ) // Si l'AntiRepeat est activer
            {
                aff_rep.push_back(false); // On ajoute un element dans le vector avec comme valeur FALSE (c'est a dire non affiché)
                aff_ques.push_back(false); // Pareil
            }

            while(line.push_back(fgetc(file_datas)),true) // Une boucle infini (=Elle ne se termine pas à cause de sa condition mais plutôt à cause de ses instructions)
            {
                if ( line.back()=='\n' || line.back()==EOF ) // Si on arrive au caractere '\n' ou EOF cela veut dire qu'on se trouve NORMALEMENT à la fin de la ligne ou du fichier
                {
                    if ( line.back()==EOF && !rep ) // Si le curseur est arrivé à la fin alors que c'est une question la syntaxe du fichier est alors declaré incorrect!
                    {
                        fprintf(stderr,"Le fichier est incorrect !\n\n");
                        syntaxe_correct = false;
                        break;
                    }
                    line[(line.back()=='\n')?line.size()-2:line.size()-1]='\0'; // On affecte la fin de la ligne
                    break;// On quitte la ligne pour passer à la suivante
                }
            }
            if ( !syntaxe_correct )
            {
                break;
            }
            ((!rep)?questions:reponses).push_back(line); // On ajoute la ligne aux questions ou reponses selon la var rep
            rep=(rep)?false:true; // Si cette var est true on la passe à false et vice versa
            line.clear(); // On vide le vector pour la ligne suivante
        }
        fclose(file_datas);// On ferme le fichier ouvert
        if ( !syntaxe_correct ) // Si la syntaxe du fichier est incorrect, on passe au fichier suivant s'il existe, sinon on quitte
        {
            if ( (nb_args-i_file)==1 ) // S'il n y a pas de fichiers suivant, on quitte
            {
                break;
            }
            else // Sinon on passe au fichier suivant
            {
                continue;
            }
        }
        for(unsigned int i_show=0; i_show<((params[2]>0)?params[2]:questions.size()) || params[3];) // Boucle de teste
        {
            if(params[3] && (((params[2]>0)?params[2]:questions.size())-i_show)<=0) // Si le test est terminer et que l'utilisateur à choisis le test en boucle alors on prépare le suivant
            {
                fprintf(stdout,"\n >Test terminer!\n");
                i_show=0; // Le curseur de l'avancement est mis à zero
                for(unsigned int i=0;params[1] && i<aff_ques.size();i++) // Reinstialisation des varaible de l'antiRepeat
                {
                    aff_ques[i] = false;
                    aff_rep[i] = false;
                }
                fflush(stdin);
                getchar();
                system("CLS");
            }
            unsigned int index = i_show; // index, cette variable va contenire le curseur de l'avancement si l'option hasard n'a pas était choisis sinon un nombre au hasard
            bool ques_rep = (params[4]<3)?(params[4]<=1):(aleatoire(0,1)); // variable qui definis qu'elle partie va etre afficher, la question ou la reponse selon ce que l'utilisateur à choisis
            if(params[0]) // Si le hasard est activer...
            {
                if(params[1]) //On verifie si l'antiRepeat est activer
                {
                    do{
                        index = aleatoire(0,questions.size()-1);
                    }while(((ques_rep)?(aff_ques[index]):(aff_rep[index])));
                    ((ques_rep)?(aff_ques[index]):(aff_rep[index])) = true;
                }
            }
            // Affichage de la question ou reponse selon le resultat de la var ques_rep
            fprintf(stdout,"\n\n ---TEST %d/%d---\n\n\n   >%s\n   = ",i_show+1,questions.size(),(ques_rep)?(&questions[index][0]):(&reponses[index][0]));
            vector<char> stduser; // Vector pour l'entrée clavier
            fflush(stdin);
            do{
                stduser.push_back(getchar());
            }while(stduser.back()!='\n' && stduser.back()!=EOF);
            stduser.back()='\0';
            system("CLS");
            // On compare la reponse ou la question avec la question ou la reponse (selon ques_rep) avec ou sans casse (selon le choix de l'utilisateur)
            if(strcompare(&stduser[0],(ques_rep)?(&reponses[index][0]):(&questions[index][0]),params[6]))
            {
                fprintf(stdout,"\n\n ---TEST %d/%d---\n\n\n   MrCardo> Bonne reponse !\n",i_show+1,questions.size());
            }
            else
            {
                // Affichage de la reponse si l'utilisateur la souhaité
                fprintf(stdout,"\n\n ---TEST %d/%d---\n\n\n   MrCardo> Mauvaise reponse%s%s\n",i_show+1,questions.size(),(params[5])?"!\n   La bonne reponse est : ":" ",(params[5])?(ques_rep)?(&reponses[index][0]):(&questions[index][0]):"!");
            }
            fflush(stdin);
            getchar();
            system("CLS");
            i_show++;
        }
        if ( (nb_args-i_file)==1 ) // S'il n y a plus de fichier on quitte
        {
            break;
        }
    }
    getchar();
    return EXIT_SUCCESS;
}

Conclusion :


Voila, voila! Vous avez tous et j'attend vos commentaires...

Codes Sources

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.