Archives
Trending
Support
Login
clear text
XML
Django
JavaScript
MATLAB
C
C++
C#
Python
SQL
Shell
Bash
Markdown
YAML
JSON
HTML
CSS
PHP
Java
Ruby
Go
Rust
Swift
Kotlin
Arduino
TypeScript
Perl
Autohotkey
Lua
SQF
R
Scala
Haskell
Groovy
Dart
Clojure
VB.NET
Objective-C
PowerShell
Bash
CoffeeScript
Verilog
#include "tp3.h" #include
#include
#include
#include
#define TAILLE_MAT 20 #define TAILLE_NOM 26 static int nbEtu; // Creation d'un element d'une liste de notes T_Note *creerNote(float note, char *matiere){ T_Note* note_temp; if((note_temp = (T_Note*) malloc(sizeof(T_Note))) != NULL){ note_temp->note = note; if((note_temp->matiere = calloc(TAILLE_MAT, sizeof(char))) != NULL){ strncpy(note_temp->matiere, matiere, TAILLE_MAT); } else { exit(EXIT_FAILURE); } note_temp->note_suiv = NULL; return note_temp; } exit(EXIT_FAILURE); } // Creation d'un element d'une liste d'etudiants T_Etudiant *creerEtudiant(int idEtu, char *nom, char *prenom){ nbEtu++; T_Etudiant* etu_temp; if ((etu_temp = malloc(sizeof(T_Etudiant))) != NULL){ etu_temp->id = idEtu; if ((etu_temp->prenom = calloc(TAILLE_NOM, sizeof(char))) != NULL){ strncpy(etu_temp->prenom, prenom, TAILLE_NOM); } else { exit(EXIT_FAILURE); } if ((etu_temp->nom = calloc(TAILLE_NOM, sizeof(char))) != NULL){ strncpy(etu_temp->nom, nom, TAILLE_NOM); } else { exit(EXIT_FAILURE); } return etu_temp; } exit(EXIT_FAILURE); } T_ListeNotes ajouterNote(float note, char *matiere, T_ListeNotes listeNotes){ T_ListeNotes listeTemp = listeNotes; T_ListeNotes note_temp = creerNote(note, matiere); while(listeTemp != NULL){ if(!strcmp(listeTemp->matiere, matiere)){ printf("Attention, note modifiee !\n"); printf("Note precedente : %2.2f\n", listeTemp->note); listeTemp->note = note_temp->note; printf("Note actuelle : %2.2f\n", listeTemp->note); return listeNotes; } listeTemp = listeTemp->note_suiv; } note_temp->note_suiv = listeNotes; return note_temp; } // Ajout d'un note pour un etudiant dans une liste d'etudiants et renvois la liste modifiee T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu listeEtu){ char prenom[TAILLE_NOM]; char nom[TAILLE_NOM]; T_ListeEtu etu_temp = NULL; T_ListeEtu temp = listeEtu; T_ListeEtu precedent = NULL; // Tant qu'on ne pointe pas sur NULL on continue de // chercher l'étudiant while (temp != NULL){ // && listeEtu->etu_suiv != NULL){ if (temp->id == idEtu){ temp->notes = ajouterNote(note, matiere, temp->notes); temp->nbNotes += 1; temp->moyenne += (note - temp->moyenne) / temp->nbNotes; return listeEtu; } temp = temp->etu_suiv; } // On reprend la tete de la liste temp = listeEtu; // Si il n'est pas dans la liste on va le créer printf("Etudiant non trouver, veuillez donner son prenom : "); scanf("%s", prenom); printf("Son nom : "); scanf("%s", nom); etu_temp = creerEtudiant(idEtu, nom, prenom); etu_temp->notes = ajouterNote(note, matiere, etu_temp->notes); etu_temp->nbNotes = 1; etu_temp->moyenne += (note - etu_temp->moyenne) / etu_temp->nbNotes; // Cas vide // Si notre liste est vide on retourne // l'étudiant créer précédemment if (temp == NULL){ return etu_temp; } else { while ((temp != NULL) && etu_temp->id > temp->id){ precedent = temp; temp = temp->etu_suiv; } } // Si listeEtu était non vide mais que l'id tete était // plus grand, alors l'étudiant créer sera la nouvelle tete if (precedent == NULL){ etu_temp->etu_suiv = temp; temp = etu_temp; // On retourne temp pour avoir la nouvelle tete return temp; } else { precedent->etu_suiv = etu_temp; etu_temp->etu_suiv = temp; } return listeEtu; } // Suppression d'une note pour un etudiant dans une liste d'etudiants et renvois la liste modifiee T_ListeEtu supprimerNoteEtu(char *matiere, int idEtu, T_ListeEtu listeEtu){ T_ListeEtu temp = listeEtu; T_ListeEtu pEtuPrec = NULL; T_ListeNotes tempListeNote = NULL; T_ListeNotes pNotePrecedente = NULL; int mat = 0; while(temp != NULL){ if (temp->id == idEtu){ tempListeNote = temp->notes; while(tempListeNote != NULL){ if (!strcmp(tempListeNote->matiere, matiere)){ // Si on est à la tete des notes : if (pNotePrecedente == NULL){ tempListeNote = tempListeNote->note_suiv; temp->nbNotes--; temp->moyenne += (temp->moyenne - temp->notes->note) / temp->nbNotes; free(temp->notes->matiere); free(temp->notes); temp->notes = tempListeNote; // Sert à supprimer l'étudiant qui n'a plus de notes if (tempListeNote == NULL){ // Si c'est le premier etudiant if (pEtuPrec == NULL){ // On modifie directement la liste d'entrée listeEtu = listeEtu->etu_suiv; // On libère la mémoire free(temp->nom); free(temp->prenom); free(temp); } else { pEtuPrec->etu_suiv = temp->etu_suiv; free(temp->nom); free(temp->prenom); free(temp); } nbEtu--; } } else { // Cas note placé au milieu temp->nbNotes--; temp->moyenne += (temp->moyenne - temp->notes->note) / temp->nbNotes; pNotePrecedente->note_suiv = tempListeNote->note_suiv; free(tempListeNote->matiere); free(tempListeNote); } printf("Note supprimer\n"); return listeEtu; } pNotePrecedente = tempListeNote; tempListeNote = tempListeNote->note_suiv; mat = 1; } temp->notes = tempListeNote; } pEtuPrec = temp; temp = temp->etu_suiv; } if(mat){ printf("Matiere non presente pour l'Etudiant\n"); mat = 0; } else { printf("Etudiant non trouver\n"); } return listeEtu; } // Affichage d'une liste d'etudiants void afficherListeEtu(T_ListeEtu listeEtu){ T_ListeEtu temp = listeEtu; while (temp != NULL){ afficherEtu(temp); temp = temp->etu_suiv; } } // Affichage du classement des etudiants par ordre decroissant de la moyenne (nom, prenom, moyenne) void afficherClassement(T_ListeEtu listeEtu){ T_ListeEtu temp = listeEtu; afficherListeTrier(temp); } // Affichage des etudiants suivant leur reussite ou non dans une matière void afficherSousListes(T_ListeEtu listeEtu, char *matiere){ T_ListeEtu temp = listeEtu; T_ListeNotes tempNotes = temp->notes; T_ListeEtu *admis = NULL, *refuser = NULL, *non_present = NULL; int entrer = 0, i_admis = 0, i_refuser = 0, i_non_present = 0; int compt_admis = 0, compt_refuser = 0, compt_non_present = 0; if ((admis = malloc(nbEtu * sizeof(*admis))) == NULL) exit(EXIT_FAILURE); if ((refuser = malloc(nbEtu * sizeof(*refuser))) == NULL) exit(EXIT_FAILURE); if ((non_present = malloc(nbEtu * sizeof(*non_present))) == NULL) exit(EXIT_FAILURE); while(temp != NULL){ tempNotes = temp->notes; while(tempNotes !=NULL){ if (!strcmp(tempNotes->matiere, matiere)){ if ((tempNotes->note >= 0) && (tempNotes->note < 10)){ if (i_refuser < nbEtu){ refuser[i_refuser++] = temp; compt_refuser++; } else { printf("Dépassement de mémoire, index %d hors du tableau des refuser", i_refuser); exit(EXIT_FAILURE); } entrer = 1; break; } else if ((tempNotes->note >= 10) && (tempNotes->note <= 20)){ if (i_admis < nbEtu){ admis[i_admis++] = temp; compt_admis++; } else { printf("Dépassement de mémoire, index %d hors du tableau des admis", i_admis); exit(EXIT_FAILURE); } entrer = 1; break; } } tempNotes = tempNotes->note_suiv; } if (!entrer){ if (i_non_present < nbEtu){ non_present[i_non_present++] = temp; compt_non_present++; } else { printf("Dépassement de mémoire, index %d hors du tableau des non present", i_non_present); exit(EXIT_FAILURE); } } entrer = 0; temp = temp->etu_suiv; } printf("Admis :\n"); if (admis != NULL){ for(i_admis = 0; i_admis < compt_admis; i_admis++){ afficherEtu(*(admis + i_admis)); } } printf("Refuser :\n"); if (refuser != NULL){ for(i_refuser = 0; i_refuser < compt_refuser; i_refuser++){ afficherEtu(*(refuser + i_refuser)); } } printf("Non present :\n"); if (non_present != NULL){ for(i_non_present = 0; i_non_present < compt_non_present; i_non_present++){ afficherEtu(*(non_present + i_non_present)); } } free(admis); free(refuser); free(non_present); } // Affichage du menu de base void afficherMenu(){ system("clear"); printf("1. Creer la liste d'etudiants\n"); printf("2. Ajouter une note pour un etudiant\n"); printf("3. Supprimer une note pour un etudiant\n"); printf("4. Afficher la liste des etudiants\n"); printf("5. Afficher le classement\n"); printf("6. Ajouter les sous-listes pour une epreuve\n"); printf("7. Quitter\n"); } // Fonction rajouter pour afficher une liste de notes void afficherNotes(T_ListeNotes liste){ T_ListeNotes temp = liste; while(temp != NULL){ printf("%s : %2.2f\n", temp->matiere, temp->note); temp = temp->note_suiv; } } // Fonction de tri void afficherListeTrier(T_ListeEtu liste){ T_ListeEtu listeTemp = liste, maxEtu = NULL; T_ListeEtu *tabTemp; float max; int i = 0, j = 0, indexMax; tabTemp = malloc(nbEtu * sizeof(*tabTemp)); for (i = 0; i < nbEtu; i++, listeTemp = listeTemp->etu_suiv){ *(tabTemp + i) = listeTemp; } while(j < nbEtu){ for (i = j, indexMax = i, max = tabTemp[i]->moyenne, maxEtu = tabTemp[i]; i < nbEtu; i++){ if (max < tabTemp[i]->moyenne){ max = tabTemp[i]->moyenne; maxEtu = tabTemp[i]; indexMax = i; } } tabTemp[indexMax] = tabTemp[j]; tabTemp[j] = maxEtu; j++; } for (i = 0; i < nbEtu; i++){ afficherEtu(*(tabTemp+i)); } // On libère l'espace mémoire free(tabTemp); } void afficherEtu(T_ListeEtu listeEtu){ T_ListeEtu temp = listeEtu; printf("Etudiant n%d\n", temp->id); printf("Prénom : %s\n", temp->prenom); printf("Nom : %s\n", temp->nom); afficherNotes(temp->notes); }
Mark as private (unlisted)
for 30 minutes
for 6 hours
for 1 day
for 1 week
for 1 month
for 1 year
everlasting (like CCCP)