Advertisement
SilLAwNeD

nf16 tp3 tp3.c

Nov 14th, 2018
513
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.87 KB | None | 0 0
  1. #include "tp3.h"
  2. #include <string.h>
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <unistd.h>
  6. #define TAILLE_MAT 20
  7. #define TAILLE_NOM 26
  8.  
  9. static int nbEtu;
  10.  
  11. // Creation d'un element d'une liste de notes
  12. T_Note *creerNote(float note, char *matiere){
  13.     T_Note* note_temp;
  14.  
  15.     if((note_temp = (T_Note*) malloc(sizeof(T_Note))) != NULL){
  16.       note_temp->note = note;
  17.       if((note_temp->matiere = calloc(TAILLE_MAT, sizeof(char))) != NULL){
  18.         strncpy(note_temp->matiere, matiere, TAILLE_MAT);
  19.       } else {
  20.         exit(EXIT_FAILURE);
  21.       }
  22.       note_temp->note_suiv = NULL;
  23.       return note_temp;
  24.     }
  25.     exit(EXIT_FAILURE);
  26. }
  27.  
  28. // Creation d'un element d'une liste d'etudiants
  29. T_Etudiant *creerEtudiant(int idEtu, char *nom, char *prenom){
  30.     nbEtu++;
  31.  
  32.     T_Etudiant* etu_temp;
  33.  
  34.     if ((etu_temp = malloc(sizeof(T_Etudiant))) != NULL){
  35.       etu_temp->id = idEtu;
  36.       if ((etu_temp->prenom = calloc(TAILLE_NOM, sizeof(char))) != NULL){
  37.         strncpy(etu_temp->prenom, prenom, TAILLE_NOM);
  38.       } else {
  39.         exit(EXIT_FAILURE);
  40.       }
  41.       if ((etu_temp->nom = calloc(TAILLE_NOM, sizeof(char))) != NULL){
  42.         strncpy(etu_temp->nom, nom, TAILLE_NOM);
  43.       } else {
  44.         exit(EXIT_FAILURE);
  45.       }
  46.  
  47.       return etu_temp;
  48.     }
  49.     exit(EXIT_FAILURE);
  50. }
  51.  
  52. T_ListeNotes ajouterNote(float note, char *matiere, T_ListeNotes listeNotes){
  53.     T_ListeNotes listeTemp = listeNotes;
  54.     T_ListeNotes note_temp = creerNote(note, matiere);
  55.  
  56.     while(listeTemp != NULL){
  57.       if(!strcmp(listeTemp->matiere, matiere)){
  58.         printf("Attention, note modifiee !\n");
  59.         printf("Note precedente : %2.2f\n", listeTemp->note);
  60.         listeTemp->note = note_temp->note;
  61.         printf("Note actuelle : %2.2f\n", listeTemp->note);
  62.         return listeNotes;
  63.       }
  64.       listeTemp = listeTemp->note_suiv;
  65.     }
  66.     note_temp->note_suiv = listeNotes;
  67.  
  68.     return note_temp;
  69. }
  70.  
  71. // Ajout d'un note pour un etudiant dans une liste d'etudiants et renvois la liste modifiee
  72. T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu listeEtu){
  73.     char prenom[TAILLE_NOM];
  74.     char nom[TAILLE_NOM];
  75.     T_ListeEtu etu_temp = NULL;
  76.     T_ListeEtu temp = listeEtu;
  77.     T_ListeEtu precedent = NULL;
  78.  
  79.     // Tant qu'on ne pointe pas sur NULL on continue de
  80.     // chercher l'étudiant
  81.     while (temp != NULL){ // && listeEtu->etu_suiv != NULL){
  82.         if (temp->id == idEtu){
  83.             temp->notes = ajouterNote(note, matiere, temp->notes);
  84.             temp->nbNotes += 1;
  85.             temp->moyenne += (note - temp->moyenne) / temp->nbNotes;
  86.             return listeEtu;
  87.         }
  88.         temp = temp->etu_suiv;
  89.     }
  90.     // On reprend la tete de la liste
  91.     temp = listeEtu;
  92.  
  93.     // Si il n'est pas dans la liste on va le créer
  94.     printf("Etudiant non trouver, veuillez donner son prenom : ");
  95.     scanf("%s", prenom);
  96.     printf("Son nom : ");
  97.     scanf("%s", nom);
  98.     etu_temp = creerEtudiant(idEtu, nom, prenom);
  99.     etu_temp->notes = ajouterNote(note, matiere, etu_temp->notes);
  100.     etu_temp->nbNotes = 1;
  101.     etu_temp->moyenne += (note - etu_temp->moyenne) / etu_temp->nbNotes;
  102.  
  103.     // Cas vide
  104.     // Si notre liste est vide on retourne
  105.     // l'étudiant créer précédemment
  106.     if (temp == NULL){
  107.         return etu_temp;
  108.     } else {
  109.       while ((temp != NULL) && etu_temp->id > temp->id){
  110.           precedent = temp;
  111.           temp = temp->etu_suiv;
  112.       }
  113.     }
  114.  
  115.     // Si listeEtu était non vide mais que l'id tete était
  116.     // plus grand, alors l'étudiant créer sera la nouvelle tete
  117.     if (precedent == NULL){
  118.       etu_temp->etu_suiv = temp;
  119.       temp = etu_temp;
  120.       // On retourne temp pour avoir la nouvelle tete
  121.       return temp;
  122.     } else {
  123.       precedent->etu_suiv = etu_temp;
  124.       etu_temp->etu_suiv = temp;
  125.     }
  126.  
  127.     return listeEtu;
  128. }
  129.  
  130. // Suppression d'une note pour un etudiant dans une liste d'etudiants et renvois la liste modifiee
  131. T_ListeEtu supprimerNoteEtu(char *matiere, int idEtu, T_ListeEtu listeEtu){
  132.     T_ListeEtu temp = listeEtu;
  133.     T_ListeEtu pEtuPrec = NULL;
  134.     T_ListeNotes tempListeNote = NULL;
  135.     T_ListeNotes pNotePrecedente = NULL;
  136.     int mat = 0;
  137.  
  138.     while(temp != NULL){
  139.       if (temp->id == idEtu){
  140.         tempListeNote = temp->notes;
  141.         while(tempListeNote != NULL){
  142.           if (!strcmp(tempListeNote->matiere, matiere)){
  143.             // Si on est à la tete des notes :
  144.             if (pNotePrecedente == NULL){
  145.               tempListeNote = tempListeNote->note_suiv;
  146.               temp->nbNotes--;
  147.               temp->moyenne += (temp->moyenne - temp->notes->note) / temp->nbNotes;
  148.               free(temp->notes->matiere);
  149.               free(temp->notes);
  150.               temp->notes = tempListeNote;
  151.               // Sert à supprimer l'étudiant qui n'a plus de notes
  152.               if (tempListeNote == NULL){
  153.                 // Si c'est le premier etudiant
  154.                 if (pEtuPrec == NULL){
  155.                   // On modifie directement la liste d'entrée
  156.                   listeEtu = listeEtu->etu_suiv;
  157.                   // On libère la mémoire
  158.                   free(temp->nom);
  159.                   free(temp->prenom);
  160.                   free(temp);
  161.                 } else {
  162.                   pEtuPrec->etu_suiv = temp->etu_suiv;
  163.                   free(temp->nom);
  164.                   free(temp->prenom);
  165.                   free(temp);
  166.                 }
  167.                 nbEtu--;
  168.               }
  169.  
  170.             } else {
  171.               // Cas note placé au milieu
  172.               temp->nbNotes--;
  173.               temp->moyenne += (temp->moyenne - temp->notes->note) / temp->nbNotes;
  174.               pNotePrecedente->note_suiv = tempListeNote->note_suiv;
  175.               free(tempListeNote->matiere);
  176.               free(tempListeNote);
  177.             }
  178.             printf("Note supprimer\n");
  179.             return listeEtu;
  180.           }
  181.           pNotePrecedente = tempListeNote;
  182.           tempListeNote = tempListeNote->note_suiv;
  183.           mat = 1;
  184.         }
  185.         temp->notes = tempListeNote;
  186.       }
  187.       pEtuPrec = temp;
  188.       temp = temp->etu_suiv;
  189.     }
  190.  
  191.     if(mat){
  192.       printf("Matiere non presente pour l'Etudiant\n");
  193.       mat = 0;
  194.     } else {
  195.       printf("Etudiant non trouver\n");
  196.     }
  197.     return listeEtu;
  198. }
  199.  
  200. // Affichage d'une liste d'etudiants
  201. void afficherListeEtu(T_ListeEtu listeEtu){
  202.   T_ListeEtu temp = listeEtu;
  203.   while (temp != NULL){
  204.     afficherEtu(temp);
  205.     temp = temp->etu_suiv;
  206.   }
  207. }
  208.  
  209. // Affichage du classement des etudiants par ordre decroissant de la moyenne (nom, prenom, moyenne)
  210. void afficherClassement(T_ListeEtu listeEtu){
  211.   T_ListeEtu temp = listeEtu;
  212.  
  213.   afficherListeTrier(temp);
  214. }
  215.  
  216. // Affichage des etudiants suivant leur reussite ou non dans une matière
  217. void afficherSousListes(T_ListeEtu listeEtu, char *matiere){
  218.   T_ListeEtu temp = listeEtu;
  219.   T_ListeNotes tempNotes = temp->notes;
  220.   T_ListeEtu *admis = NULL, *refuser = NULL, *non_present = NULL;
  221.   int entrer = 0, i_admis = 0, i_refuser = 0, i_non_present = 0;
  222.   int compt_admis = 0, compt_refuser = 0, compt_non_present = 0;
  223.  
  224.   if ((admis = malloc(nbEtu * sizeof(*admis))) == NULL)
  225.     exit(EXIT_FAILURE);
  226.   if ((refuser = malloc(nbEtu * sizeof(*refuser))) == NULL)
  227.     exit(EXIT_FAILURE);
  228.   if ((non_present = malloc(nbEtu * sizeof(*non_present))) == NULL)
  229.     exit(EXIT_FAILURE);
  230.  
  231.   while(temp != NULL){
  232.     tempNotes = temp->notes;
  233.     while(tempNotes !=NULL){
  234.       if (!strcmp(tempNotes->matiere, matiere)){
  235.         if ((tempNotes->note >= 0) && (tempNotes->note < 10)){
  236.           if (i_refuser < nbEtu){
  237.             refuser[i_refuser++] = temp;
  238.             compt_refuser++;
  239.           } else {
  240.             printf("Dépassement de mémoire, index %d hors du tableau des refuser", i_refuser);
  241.             exit(EXIT_FAILURE);
  242.           }
  243.           entrer = 1;
  244.           break;
  245.         } else if ((tempNotes->note >= 10) && (tempNotes->note <= 20)){
  246.           if (i_admis < nbEtu){
  247.             admis[i_admis++] = temp;
  248.             compt_admis++;
  249.           } else {
  250.             printf("Dépassement de mémoire, index %d hors du tableau des admis", i_admis);
  251.             exit(EXIT_FAILURE);
  252.           }
  253.           entrer = 1;
  254.           break;
  255.         }
  256.       }
  257.       tempNotes = tempNotes->note_suiv;
  258.     }
  259.     if (!entrer){
  260.       if (i_non_present < nbEtu){
  261.         non_present[i_non_present++] = temp;
  262.         compt_non_present++;
  263.       } else {
  264.         printf("Dépassement de mémoire, index %d hors du tableau des non present", i_non_present);
  265.         exit(EXIT_FAILURE);
  266.       }
  267.     }
  268.     entrer = 0;
  269.     temp = temp->etu_suiv;
  270.   }
  271.  
  272.   printf("Admis :\n");
  273.   if (admis != NULL){
  274.     for(i_admis = 0; i_admis < compt_admis; i_admis++){
  275.       afficherEtu(*(admis + i_admis));
  276.     }
  277.   }
  278.   printf("Refuser :\n");
  279.   if (refuser != NULL){
  280.     for(i_refuser = 0; i_refuser < compt_refuser; i_refuser++){
  281.       afficherEtu(*(refuser + i_refuser));
  282.     }
  283.   }
  284.   printf("Non present :\n");
  285.   if (non_present != NULL){
  286.     for(i_non_present = 0; i_non_present < compt_non_present; i_non_present++){
  287.       afficherEtu(*(non_present + i_non_present));
  288.     }
  289.   }
  290.  
  291.   free(admis);
  292.   free(refuser);
  293.   free(non_present);
  294. }
  295.  
  296. // Affichage du menu de base
  297. void afficherMenu(){
  298.     system("clear");
  299.     printf("1. Creer la liste d'etudiants\n");
  300.     printf("2. Ajouter une note pour un etudiant\n");
  301.     printf("3. Supprimer une note pour un etudiant\n");
  302.     printf("4. Afficher la liste des etudiants\n");
  303.     printf("5. Afficher le classement\n");
  304.     printf("6. Ajouter les sous-listes pour une epreuve\n");
  305.     printf("7. Quitter\n");
  306. }
  307.  
  308. // Fonction rajouter pour afficher une liste de notes
  309. void afficherNotes(T_ListeNotes liste){
  310.   T_ListeNotes temp = liste;
  311.   while(temp != NULL){
  312.     printf("%s : %2.2f\n", temp->matiere, temp->note);
  313.     temp = temp->note_suiv;
  314.   }
  315. }
  316.  
  317. // Fonction de tri
  318. void afficherListeTrier(T_ListeEtu liste){
  319.   T_ListeEtu listeTemp = liste, maxEtu = NULL;
  320.   T_ListeEtu *tabTemp;
  321.   float max;
  322.   int i = 0, j = 0, indexMax;
  323.  
  324.   tabTemp = malloc(nbEtu * sizeof(*tabTemp));
  325.  
  326.   for (i = 0; i < nbEtu; i++, listeTemp = listeTemp->etu_suiv){
  327.     *(tabTemp + i) = listeTemp;
  328.   }
  329.  
  330.   while(j < nbEtu){
  331.     for (i = j, indexMax = i, max = tabTemp[i]->moyenne, maxEtu = tabTemp[i]; i < nbEtu; i++){
  332.       if (max < tabTemp[i]->moyenne){
  333.         max = tabTemp[i]->moyenne;
  334.         maxEtu = tabTemp[i];
  335.         indexMax = i;
  336.       }
  337.     }
  338.     tabTemp[indexMax] = tabTemp[j];
  339.     tabTemp[j] = maxEtu;
  340.     j++;
  341.   }
  342.  
  343.   for (i = 0; i < nbEtu; i++){
  344.     afficherEtu(*(tabTemp+i));
  345.   }
  346.  
  347.   // On libère l'espace mémoire
  348.   free(tabTemp);
  349. }
  350.  
  351. void afficherEtu(T_ListeEtu listeEtu){
  352.   T_ListeEtu temp = listeEtu;
  353.   printf("Etudiant n%d\n", temp->id);  
  354.   printf("Prénom : %s\n", temp->prenom);
  355.   printf("Nom : %s\n", temp->nom);
  356.   afficherNotes(temp->notes);
  357. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement