Exercice langage C examen partie administrateur

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');
}

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *