int fnb_quest(FILE * fq);
/* mode utilisateur, compte le nombre de questions d'un fichier de
structure Question */
Question fune_quest(FILE * fq, int index);
/* mode utilisateur, retourne la question a la place (index) du
fichier (fq) */
void fqcm(char * util, char * nomficQCM);
/* mode utilisateur, pose les questions du fichier (nomficQCM) a
l'utilisateur (util) enregistre la session dans un fichier
"resu", donne le resultat du test a la fin */
void ftrace(char * util);
/* mode utilisateur, affiche la trace des questions et des reponses
d'un utilisateur de nom (util) enregistre dans un fichier de
resultat "resu" s'il existe */
char menu_util(void);
/* menu utilisateur :
(a) afficher sa derniere session,
(b) faire un test qcm,
(c) quitter */
void gestion_util(void);
/* mode utilisateur, gestion des fonctionnalites utilisateur */
int main (void)
{
char calu[3];
do
{
printf("(a) mode administrateur,\n");
printf("(u) mode utilisateur,\n");
printf("(q) quitter,\n");
printf("votre choix :");
fgets(calu, 3, stdin);
switch(calu[0])
{
case 'a':
case 'A':
gestion_admin();
break;
case 'u':
case 'U':
gestion_util();
break;
case 'q':
case 'Q':
printf("fin du programme \n\n");
break;
default :
printf("\nmauvaise saisie recommencer !!\n");
}
}
while( calu[0] !='q' && calu[0] != 'Q');
return 0;
}
Question tsaisie_quest(int num)
{
Question q;
printf("Question %d: ", num);
fgets(q.quest, MLIGNE-1, stdin);
printf("Reponse 1 : ");
fgets(q.rep1, MLIGNE-1, stdin);
printf("Reponse 2 : ");
fgets(q.rep2, MLIGNE-1, stdin);
printf("Reponse 3 : ");
fgets(q.rep3, MLIGNE-1, stdin);
printf("Reponse 4 : ");
fgets(q.rep4, MLIGNE-1, stdin);
do
{
printf("Numero de la solution (1 a 4) : ");
scanf("%d", &q.solrep);
if (q.solrep < 1 || q.solrep > 4)
{
printf("erreur de saisie\n");
}
}
while (q.solrep < 1 || q.solrep > 4);
return q;
}
void fenr_quest(Question * pq, FILE * fq)
{
fwrite(pq, sizeof(Question), 1, fq);
}
int fcreer_qcm(char * nomfic)
{
FILE *fq;
Question q;
char rep[3];
int nquest, ret;
fq = fopen(nomfic, "a+");
if (fq == NULL)
{
printf("Erreur d'ouverture de %s\n", nomfic);
return 0;
}
fseek(fq, -1l*sizeof(Question), SEEK_END);
ret = fread(&q, sizeof(Question), 1, fq);
if (ret == 0)
{
nquest = 0;
}
else
{
nquest = q.numquest;
}
rep[0] = 'o';
while (rep[0] == 'o' || rep[0] == 'O')
{
nquest++;
q = tsaisie_quest(nquest);
q.numquest = nquest;
fenr_quest(&q, fq);
getchar();
printf("Encore (o/n): ");
fgets(rep, 3, stdin);
}
fclose(fq);
return 1;
}
int faff_qcm(char * nomfic)
{
FILE *fq;
Question q;
fq = fopen(nomfic, "r");
if (fq == NULL)
{
printf("Fichier %s inexistant\n", nomfic);
perror("fopen");
return 0;
}
fread(&q, sizeof(Question), 1, fq);
while (! feof(fq))
{
faff_quest(stdout, &q);
printf("\n\tSolution : %d\n", q.solrep);
fread(&q, sizeof(Question), 1, fq);
}
fclose(fq);
return 1;
}
int frech_quest(Question * qret, FILE * fq, int numquest)
{
int ret = -1, rang = 0;
if (fq == NULL)
{
return -1;
}
rewind(fq);
fread(qret, sizeof(Question), 1, fq);
while (! feof(fq))
{
rang++;
if (qret->numquest == numquest)
{
ret = rang;
break;
}
fread(qret, sizeof(Question), 1, fq);
}
if (ret > 0)
{
fseek(fq, -1l * sizeof(Question), SEEK_CUR);
}
return ret;
}
void fmodif_quest(Question * qamodif)
{
int choix;
do
{
printf("\nMenu Modification question %d:\n", qamodif->numquest);
do
{
printf("\n\t(1) Modifier question\n");
printf("\t(2) Modifier reponse 1\n");
printf("\t(3) Modifier reponse 2\n");
printf("t(4) Modifier reponse 3\n");
printf("\t(5) Modifier reponse 4\n");
printf("\t(6) Modifier numero solution\n");
printf("\t(7) Sauvegarder\n\n");
printf("\tVotre choix : ");
scanf("%d", &choix);
}
while (choix <1 || choix > 7);
getchar();
switch (choix)
{
case 1:
printf("Ancienne question : \"%s\"\n", qamodif->quest);
printf("Nouvelle question : ");
fgets(qamodif->quest, MLIGNE-1, stdin);
break;
case 2:
printf("Ancienne reponse 1 : \"%s\"\n", qamodif->rep1);
printf("Nouvelle reponse 1 : ");
fgets(qamodif->rep1, MLIGNE-1, stdin);
break;
case 3:
printf("Ancienne reponse 2 : \"%s\"\n", qamodif->rep2);
printf("Nouvelle reponse 2 : ");
fgets(qamodif->rep2, MLIGNE-1, stdin);
break;
case 4:
printf("Ancienne reponse 3 : \"%s\"\n", qamodif->rep3);
printf("Nouvelle reponse 3 : ");
fgets(qamodif->rep3, MLIGNE-1, stdin);
break;
case 5:
printf("Ancienne reponse 4 : \"%s\"\n", qamodif->rep4);
printf("Nouvelle reponse 4 : ");
fgets(qamodif->rep4, MLIGNE-1, stdin);
break;
case 6:
printf("Ancien numero de solution : %d\n", qamodif->solrep);
printf("Nouveau numero de solution : ");
scanf("%d", &qamodif->solrep);
break;
case 7:
default:
break;
}
}
while (choix != 7);
}
int fmodif_qcm(char * nomfic)
{
FILE *fq;
Question q;
int noq, ret;
fq = fopen(nomfic, "r+");
if (fq == NULL)
{
printf("Fichier %s inexistant\n", nomfic);
perror("fopen");
return 0;
}
do
{
printf("Numero de la question a modifier (-1 pour terminer) : ");
scanf("%d", &noq);
if (noq < 0)
{
break;
}
ret = frech_quest(&q, fq, noq);
if (ret < 0)
{
continue;
}
fmodif_quest(&q);
fenr_quest(&q, fq);
} while (noq > 0);
fclose(fq);
return 1;
}
char menu_admin(void)
{
char calu[3];
printf("\nMenu administrateur :\n");
printf("\t(a) consulter un fichier qcm\n");
printf("\t(b) creer ou ajouter dans un fichier qcm\n");
printf("\t(c) modification d'un fichier qcm\n");
printf("\t(q) quitter.\n\n");
printf("\tVotre choix : ");
fgets(calu, 3, stdin);
return calu[0];
}
/* mode administrateur, gestion des fonctionnalites de l'administrateur */
void gestion_admin()
{
char calu;
char nomficQCM[MNAME];
do
{
calu = menu_admin();
switch(calu)
{
case 'a':
printf("\nNom du fichier : ");
fgets(nomficQCM, MNAME-1, stdin);
nomficQCM[strlen(nomficQCM)-1] = 0;
faff_qcm(nomficQCM);
break;
case 'b':
printf("\ncreer ou ajouter dans un fichier qcm\n");
printf("\nNom du fichier : ");
fgets(nomficQCM, MNAME-1, stdin);
nomficQCM[strlen(nomficQCM)-1] = 0;
fcreer_qcm(nomficQCM);
break;
case 'c':
printf("modification d'un fichier qcm\n");
printf("\nNom du fichier : ");
fgets(nomficQCM, MNAME-1, stdin);
nomficQCM[strlen(nomficQCM)-1] = 0;
fmodif_qcm(nomficQCM);
break;
case 'q':
printf("sortie du mode administrateur \n\n");
break;
default :
printf("\nmauvaise saisie recommencer !!\n");
}
} while( calu != 'q');
}
/***** PARTIE UTILISATEUR *******/
void faff_quest(FILE *faff, Question *tq)
{
fprintf(faff, "\nQUESTION numero %d : %s", tq->numquest, tq->quest);
fprintf(faff, "\n\tREPONSE 1 : %s", tq->rep1);
fprintf(faff, "\n\tREPONSE 2 : %s", tq->rep2);
fprintf(faff, "\n\tREPONSE 3 : %s", tq->rep3);
fprintf(faff, "\n\tREPONSE 4 : %s", tq->rep4);
}
int fnb_quest(FILE *fq)
{
int i= 0;
long sQuestion = sizeof(Question);
Question tq;
fseek(fq, 0, SEEK_SET);
while(fread(&tq, sQuestion, 1, fq) != 0)
i++;
return i;
}
Question fune_quest(FILE *fq, int index)
{
long sQuestion = sizeof(Question);
Question tq;
fseek(fq, index*sQuestion, SEEK_SET);
if (fread(&tq, sQuestion, 1, fq) != 1)
{
printf("\nERREUR DE LECTURE DU FICHIER\n");
memset(&tq, 0l, sQuestion);
}
return tq;
}
void fqcm(char *UTIL, char *nomficQCM)
{
FILE *fqcm;
FILE *fresu;
Question tq;
char nomficRESU[MNAME] = "resu";
int i, n;
int rep, cptrep = 0;
strcat(nomficRESU, UTIL);
fqcm = fopen(nomficQCM, "r");
fresu = fopen(nomficRESU, "w");
if ((fqcm == NULL) || (fresu == NULL))
{
printf("\nERREUR D'OUVERTURE DU FICHIER - ABANDON\n");
return;
}
else
{
n= fnb_quest(fqcm);
for(i = 0; i < n; i++)
{
tq = fune_quest(fqcm, i);
faff_quest(stdout, &tq);
printf("\nVOTRE REPONSE : ");
scanf(" %d", &rep);
if(rep != tq.solrep)
printf("\nMAUVAISE REPONSE");
else
{
printf("\nBONNE REPONSE");
cptrep++;
}
faff_quest(fresu,&tq);
fprintf(fresu,"\nVOTRE REPONSE : %d", rep);
}
printf("\nFICHIER : %s, Bonnes reponses/ total des questions : %d/%d\n",nomficQCM, cptrep, n );
fprintf(fresu,"\nFICHIER : %s, Bonnes reponses/ total des questions : %d/%d\n",nomficQCM, cptrep, n );
fclose(fqcm);
fclose(fresu);
}
}
void ftrace(char *UTIL)
{
FILE *fresu;
int i =0;
char nomficRESU[MNAME] = "resu";
char lignelue[MLIGNE];
strcat(nomficRESU,UTIL);
fresu = fopen(nomficRESU, "r");
if (fresu == NULL)
{
printf("\nERREUR D'OUVERTURE DE FICHIER, ABANDON\n");
return;
}
else
{
printf("\nTRACE DE L'UTILISATEUR : %s\n", UTIL);
while(fgets(lignelue, MLIGNE-1, fresu) != NULL)
{
i++;
printf("%d : %s", i, lignelue);
}
printf("\n***********FIN DE TRACE**********\n");
fclose(fresu);
}
}
char menu_util(void)
{
char calu;
printf("\nMenu utilisateur :\n\t(a) afficher sa derniere session,\n\t(b) faire un test QCM,");
printf("\n\t(c) quitter.\n\n\tVotre choix : ");
scanf(" %c", &calu);
return calu;
}
void gestion_util(void)
{
char calu;
char nomficQCM[MNAME];
char nomUTIL[MNAME];
printf("\nDonner votre nom d'utilisateur\n");
scanf("%s", nomUTIL);
do
{
calu = menu_util();
switch(calu)
{
case 'a': printf("\nDerniere session de l'utilisateur : %s\n", nomUTIL);
ftrace(nomUTIL);
break;
case 'b': printf("\nCreation d'une nouvelle session pour : %s\n", nomUTIL);
printf("\nDonnez le nom du fichier de questions : \n");
scanf(" %s", nomficQCM);
fqcm(nomUTIL, nomficQCM);
break;
case 'c': printf("sortie de l'application en utilisateur \n\n");
break;
default : printf("\nmauvaise saisie recommencer !!\n");
}
} while( calu != 'c');
}