Exercice langage C : Examen partie partie administrateur

1) Faire une fonction de prototype int fnb_quest(FILE *fq) qui compte le nombre de question d'un fichier précédemment ouvert en lecture. On pensera à compter le nombre de blocs d'octets de type TQCM, lus.

2) Faire une fonction de prototype TQCM fune_quest(FILE *fq, int ind) qui retourne la question placée à l'ind in du fichier fq précédemment ouvert en lecture.

3) Faire une fonction de prototype void fqcm(char *UTIL, char *nomficQCM) qui pose les questions du fichier nomficQCM à l'utilisateur dont le nom UTIL est passé en paramètre. Cette fonction enregistre dans un fichier nommé resu la trace des questions et des réponses de l'utilisateur UTIL. Ce fichier de trace sera écrit directement en mode texte avec la fonction fprintf. Le fichier resuUTIL sera effacé s'il existait.

4) Faire une fonction de prototype void ftrace(char *UTIL) qui permet d'afficher la dernière trace de l'utilisateur UTIL. La dernière trace si elle existe est un ficher enregistré sous le nom resuUTIL, UTIL étant le nom donné par l'utilisateur.

5) Faire une fonction de prototype char menu_util(void) qui permet l'affichage à l'écran du dialogue suivant et qui récupère et retourne le choix de l'utilisateur.

menu utilisateur :

(a) afficher sa dernière session,

(b) faire une nouvelle session,

(c) quitter

6) Faire une fonction de prototype void gestion_util(void) qui gère les fonctionnalités du mode utilisateur.

Avant d'afficher le menu de choix, l'utilisateur devra entrer son nom. Ce nom sera mémorisé et utilisé dans toute la session pour gérer le fichier trace.

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 4)
{
printf("erreur de saisie\n");
}
}
while (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 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 {
break;
}
ret = frech_quest(&q, fq, noq);
if (ret {
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 {
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');
}

Article publié le 24 Février 2012 Mise à jour le Samedi, 17 Décembre 2022 22:35 par GC Team