Commit 48030556 authored by Anthony Bocquet's avatar Anthony Bocquet
Browse files

OK

parent 36d42c96
...@@ -2,12 +2,6 @@ ...@@ -2,12 +2,6 @@
#include <stdlib.h> #include <stdlib.h>
#include "tp3.h" #include "tp3.h"
// libérer la mémoire
// améliorer l'affichage
// commenter
// rapporter
int main(){ int main(){
...@@ -16,6 +10,7 @@ int main(){ ...@@ -16,6 +10,7 @@ int main(){
T_ListeEtu liste = creerListe(); T_ListeEtu liste = creerListe();
while(continuer){ while(continuer){
printf("\n##############################################################\n");
printf("Choisissez une option : \n"); printf("Choisissez une option : \n");
printf("1. Créer la liste d'étudiants\n"); printf("1. Créer la liste d'étudiants\n");
printf("2. Ajouter une note pour un étudiant\n"); printf("2. Ajouter une note pour un étudiant\n");
...@@ -28,6 +23,8 @@ int main(){ ...@@ -28,6 +23,8 @@ int main(){
scanf("%d", &choix); scanf("%d", &choix);
fflush(stdin); fflush(stdin);
printf("\n##############################################################\n");
if(choix == 1){ if(choix == 1){
int i = 1; int i = 1;
...@@ -89,66 +86,12 @@ int main(){ ...@@ -89,66 +86,12 @@ int main(){
scanf("%s", mat); scanf("%s", mat);
fflush(stdin); fflush(stdin);
sousListes(liste, mat); sousListes(liste, mat);
}else if(choix == 7){
T_ListeEtu temp = liste;
for(temp; temp != NULL; temp = temp->suivant){
printf("\n%d\n", temp->identifiant);
}
liste = ajouterEtuListe(creerEtudiant(3, "c", "c"), liste);
afficherListeEtu(liste);
} }
else{ else{
continuer = 0; continuer = 0;
//libérer la mémoire libererListeEtu(liste);
} }
} }
/*
ajouterNoteEtu(1, "SR01", 1, liste);
ajouterNoteEtu(2, "NF16", 1, liste);
ajouterNoteEtu(3, "LO21", 1, liste);
ajouterNoteEtu(5, "SR01", 2, liste);
ajouterNoteEtu(6, "NF16", 2, liste);
ajouterNoteEtu(7, "LO21", 2, liste);
ajouterNoteEtu(12, "SR01", 3, liste);
ajouterNoteEtu(14, "NF16", 3, liste);
ajouterNoteEtu(20, "LO21", 3, liste);
ajouterNoteEtu(20, "SR01", 4, liste);
ajouterNoteEtu(14, "NF16", 4, liste);
ajouterNoteEtu(20, "LO21", 4, liste);
*/
/*
liste = supprimerNoteEtu("NF16", 1, liste);
liste = supprimerNoteEtu("SR01", 1, liste);
liste = supprimerNoteEtu("LO21", 1, liste);
*/
//liste = trierListeEtu(liste);
//sousListes(liste, "SR01");
/*
for(int i = 0; i < liste->nbrNotes; i++){
printf("%d\n", liste->liste->note);
liste->liste = liste->liste->suivant;
}*/
//calculMoyenne(liste);
//afficherClassement(liste);
return 0; return 0;
} }
No preview for this file type
No preview for this file type
#include "tp3.h" #include "tp3.h"
// alloue la mémoire et crée une note
T_Note* creerNote(float note, char *matiere){ T_Note* creerNote(float note, char *matiere){
if(note>=0 && note<=20){ if(note>=0 && note<=20){
T_Note* nouveau = (T_Note*)malloc(sizeof(T_Note)); T_Note* nouveau = (T_Note*)malloc(sizeof(T_Note));
...@@ -11,7 +13,7 @@ ...@@ -11,7 +13,7 @@
} }
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// alloue la mémoire pour une liste vide
T_ListeEtu creerListe(){ T_ListeEtu creerListe(){
T_ListeEtu l = (T_ListeEtu)(malloc(sizeof(T_Etudiant))); T_ListeEtu l = (T_ListeEtu)(malloc(sizeof(T_Etudiant)));
l->identifiant = -1; l->identifiant = -1;
...@@ -19,7 +21,7 @@ T_ListeEtu creerListe(){ ...@@ -19,7 +21,7 @@ T_ListeEtu creerListe(){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// alloue la mémoire et crée un étudiant
T_Etudiant *creerEtudiant(int idEtu, char *nom, char *prenom){ T_Etudiant *creerEtudiant(int idEtu, char *nom, char *prenom){
T_Etudiant* e = (T_Etudiant*)(malloc(sizeof(T_Etudiant))); T_Etudiant* e = (T_Etudiant*)(malloc(sizeof(T_Etudiant)));
e->identifiant = idEtu; e->identifiant = idEtu;
...@@ -34,7 +36,7 @@ T_Etudiant *creerEtudiant(int idEtu, char *nom, char *prenom){ ...@@ -34,7 +36,7 @@ T_Etudiant *creerEtudiant(int idEtu, char *nom, char *prenom){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// ajoute une note à une liste de notes passée en paramètre
T_ListeNotes ajouterNote(float note, char *matiere, T_ListeNotes listeNotes){ T_ListeNotes ajouterNote(float note, char *matiere, T_ListeNotes listeNotes){
T_Note* nouveau = creerNote(note, matiere); T_Note* nouveau = creerNote(note, matiere);
if(listeNotes) if(listeNotes)
...@@ -50,25 +52,30 @@ T_ListeNotes ajouterNote(float note, char *matiere, T_ListeNotes listeNotes){ ...@@ -50,25 +52,30 @@ T_ListeNotes ajouterNote(float note, char *matiere, T_ListeNotes listeNotes){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// ajoute un étudiant dans une liste en respectant l'ordre des id croissants
T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu){ T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu){
T_ListeEtu temp = listeEtu; T_ListeEtu temp = listeEtu;
if(listeEtu->identifiant == -1){ if(listeEtu->identifiant == -1){ //Si la liste est vide on retourne l'étudiant
listeEtu = (T_ListeEtu)etu; listeEtu = (T_ListeEtu)etu;
return listeEtu; return listeEtu;
} }
else{ else{
T_ListeEtu prec = NULL; T_ListeEtu prec = NULL;
// on parcoure la liste jusqu'à dépasser l'id ou arriver en fin de liste
while(temp->suivant && temp->identifiant < etu->identifiant){ while(temp->suivant && temp->identifiant < etu->identifiant){
prec = temp; prec = temp;
temp = temp->suivant; temp = temp->suivant;
} }
if(temp->identifiant == etu->identifiant){
if(temp->identifiant == etu->identifiant){// cas où l'étudiant existe déjà.
printf("\nL'étudiant existe déjà.\n"); printf("\nL'étudiant existe déjà.\n");
// on insère l'étudiant au bon endroit selon son id et sa position dans la chaîne.
}else if(temp->identifiant < etu->identifiant){ }else if(temp->identifiant < etu->identifiant){
etu->suivant = NULL; etu->suivant = NULL;
temp->suivant = etu; temp->suivant = etu;
...@@ -76,13 +83,11 @@ T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu){ ...@@ -76,13 +83,11 @@ T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu){
} }
else{ else{
if(prec){ if(prec){
printf("etuid : %d\nprecid : %d\ntemp id : %d\n", etu->identifiant, prec->identifiant, temp->identifiant);
prec->suivant = etu; prec->suivant = etu;
etu->suivant = temp; etu->suivant = temp;
return listeEtu; return listeEtu;
} }
else { else {
printf("etuid : %d\ntemp id : %d\n", etu->identifiant, temp->identifiant);
if(temp->identifiant > etu->identifiant){ if(temp->identifiant > etu->identifiant){
etu->suivant = temp; etu->suivant = temp;
return (T_ListeEtu)etu; return (T_ListeEtu)etu;
...@@ -97,7 +102,7 @@ T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu){ ...@@ -97,7 +102,7 @@ T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// ajout d'une note à un étudiant
T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu listeEtu){ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu listeEtu){
T_ListeEtu prec; T_ListeEtu prec;
T_ListeEtu temp = listeEtu; T_ListeEtu temp = listeEtu;
...@@ -105,22 +110,20 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste ...@@ -105,22 +110,20 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
char* mat = malloc(sizeof(char)*20); char* mat = malloc(sizeof(char)*20);
strcpy(mat, matiere); strcpy(mat, matiere);
// on parcoure la chaîne.
while(temp && temp->identifiant != idEtu){ while(temp && temp->identifiant != idEtu){
//if(temp->identifiant > idEtu) break;
prec = temp; prec = temp;
temp = temp->suivant; temp = temp->suivant;
} }
//si l'étudiant existe on ajoute la note.
if(temp && temp->identifiant == idEtu){ if(temp && temp->identifiant == idEtu){
temp->liste = ajouterNote(note,mat,temp->liste); temp->liste = ajouterNote(note,mat,temp->liste);
temp->nbrNotes++; temp->nbrNotes++;
return listeEtu; return listeEtu;
} }
else{ else{
//sinon on crée l'étudiant, on lui ajoute la note et on l'insère dans la liste en respectant l'ordre des id
char* nom = malloc(sizeof(char)*20); char* nom = malloc(sizeof(char)*20);
char* prenom = malloc(sizeof(char)*20); char* prenom = malloc(sizeof(char)*20);
...@@ -145,17 +148,19 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste ...@@ -145,17 +148,19 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// suppression d'une note d'un étudiant
T_ListeEtu supprimerNoteEtu(char *matiere, int idEtu, T_ListeEtu listeEtu){ T_ListeEtu supprimerNoteEtu(char *matiere, int idEtu, T_ListeEtu listeEtu){
T_ListeEtu current = listeEtu; T_ListeEtu current = listeEtu;
T_ListeEtu previous = NULL; T_ListeEtu previous = NULL;
// on parcoure la chaine
while(current->suivant && current->identifiant < idEtu){ while(current->suivant && current->identifiant < idEtu){
previous = current; previous = current;
current = current->suivant; current = current->suivant;
} }
// cas où l'étudiant n'existe pas
if(current->identifiant != idEtu){ if(current->identifiant != idEtu){
printf("L'étudiant n'existe pas.\n"); printf("L'étudiant n'existe pas.\n");
return listeEtu; return listeEtu;
...@@ -164,16 +169,19 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste ...@@ -164,16 +169,19 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
T_ListeNotes current_note = current->liste; T_ListeNotes current_note = current->liste;
T_ListeNotes previous_note = NULL; T_ListeNotes previous_note = NULL;
// on cherche la note qui correspond à la matière
while(strcmp(current_note->matiere, matiere) != 0 && current_note != NULL){ while(strcmp(current_note->matiere, matiere) != 0 && current_note != NULL){
previous_note = current_note; previous_note = current_note;
current_note = current_note->suivant; current_note = current_note->suivant;
} }
// cas où la note n'existe pas
if(current_note == NULL){ if(current_note == NULL){
printf("La note n'existe pas.\n"); printf("La note n'existe pas.\n");
return listeEtu; return listeEtu;
} }
// on supprime la note et on libère la mémoire
if(previous_note == NULL){ if(previous_note == NULL){
T_ListeNotes temp = current->liste; T_ListeNotes temp = current->liste;
current->liste = current->liste->suivant; current->liste = current->liste->suivant;
...@@ -182,10 +190,11 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste ...@@ -182,10 +190,11 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
else{ else{
previous_note->suivant = current_note->suivant; previous_note->suivant = current_note->suivant;
free(current_note); free(current_note);
} }
current->nbrNotes--; current->nbrNotes--;
// si l'étudiant n'a plus de note on le supprime et on libère la mémoire
if(current->nbrNotes == 0){ if(current->nbrNotes == 0){
printf("\nSuppression de l'étudiant avec l'id %d car il n'a plus de notes.\n\n", current->identifiant); printf("\nSuppression de l'étudiant avec l'id %d car il n'a plus de notes.\n\n", current->identifiant);
if(previous == NULL){ if(previous == NULL){
...@@ -199,14 +208,11 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste ...@@ -199,14 +208,11 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
} }
return listeEtu; return listeEtu;
} }
/* -------------------------------------------------------------------*/
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// affichage d'une liste d'étudiants avec leurs notes
void afficherListeEtu(T_ListeEtu listeEtu){ void afficherListeEtu(T_ListeEtu listeEtu){
T_ListeEtu temp = listeEtu; T_ListeEtu temp = listeEtu;
...@@ -228,6 +234,7 @@ void afficherListeEtu(T_ListeEtu listeEtu){ ...@@ -228,6 +234,7 @@ void afficherListeEtu(T_ListeEtu listeEtu){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// calcul de la moyenne d'un étudiant
float calculMoyenneEtu(T_Etudiant* etu){ float calculMoyenneEtu(T_Etudiant* etu){
int i; int i;
float somme=0; float somme=0;
...@@ -241,7 +248,7 @@ float calculMoyenneEtu(T_Etudiant* etu){ ...@@ -241,7 +248,7 @@ float calculMoyenneEtu(T_Etudiant* etu){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// calcul de la moyenne d'une liste d'étudiants
void calculMoyenne(T_ListeEtu liste){ void calculMoyenne(T_ListeEtu liste){
while(liste){ while(liste){
liste->moyenne = calculMoyenneEtu(liste); liste->moyenne = calculMoyenneEtu(liste);
...@@ -252,53 +259,54 @@ void calculMoyenne(T_ListeEtu liste){ ...@@ -252,53 +259,54 @@ void calculMoyenne(T_ListeEtu liste){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// affichage du classement des étudiants en fonction de leur moyenne
void afficherClassement(T_ListeEtu listeEtu){ void afficherClassement(T_ListeEtu listeEtu){
//printf("\n------------ Affichage du classement -------------\n"); printf("\n------------ Affichage du classement -------------\n");
T_ListeEtu p_aux = listeEtu; T_ListeEtu p_aux = listeEtu;
// calcul de la moyenne de chaque étudiant
calculMoyenne(listeEtu); calculMoyenne(listeEtu);
//Rajouter tableau de booléen
// cas où la liste est vide
if(p_aux == NULL){ //Si la liste est vide On renvoie directement "fin de la liste" if(p_aux == NULL){
printf("-- Fin de la liste --\n\n"); printf("-- Fin de la liste --\n\n");
} }
else { else {
int nbEtu = 0; int nbEtu = 0;
while (p_aux != NULL) { //On compte le nombre d'étudiant présent dans notre liste pour allouer la mémoire en fonction // on compte le nombre d'étudiant présent dans notre liste pour allouer la mémoire en fonction
p_aux = p_aux->suivant; while (p_aux != NULL) {
nbEtu++; p_aux = p_aux->suivant;
} nbEtu++;
}
// on alloue un tableau d'étudiants
T_ListeEtu *tabEtu = malloc(nbEtu*sizeof(T_ListeEtu)); //Tableau de nos étudiants T_ListeEtu *tabEtu = malloc(nbEtu*sizeof(T_ListeEtu));
p_aux = listeEtu; //On "replace le curseur" au niveau de la tête de la liste p_aux = listeEtu;
int i,j; int i,j;
for(i=0; i<nbEtu; i++){ //On remplit le tableau // on remplit le tableau
for(i=0; i<nbEtu; i++){
tabEtu[i] = p_aux; tabEtu[i] = p_aux;
p_aux = p_aux->suivant; p_aux = p_aux->suivant;
} }
// on trie le tableau
for (i=0; i<nbEtu; i++) { for (i=0; i<nbEtu; i++) {
for (j=i; j<nbEtu; j++) { for (j=i; j<nbEtu; j++) {
if(tabEtu[j]->moyenne < tabEtu[i]->moyenne){ //On trie le tableau par ordre décroissant if(tabEtu[j]->moyenne < tabEtu[i]->moyenne){
p_aux= tabEtu[i]; p_aux= tabEtu[i];
tabEtu[i] = tabEtu[j]; tabEtu[i] = tabEtu[j];
tabEtu[j] = p_aux; tabEtu[j] = p_aux;
} }
} }
} }
// affichage
printf("\nClassement des étudiants : \n"); printf("\nClassement des étudiants : \n");
for(i = nbEtu -1 ; i >= 0; i--){ for(i = nbEtu -1 ; i >= 0; i--){
printf("%.2f %s %s\n", tabEtu[i]->moyenne, tabEtu[i]->nom, tabEtu[i]->prenom); //On affiche finalement les éléments du tableau trié printf("%.2f %s %s\n", tabEtu[i]->moyenne, tabEtu[i]->nom, tabEtu[i]->prenom);
} }
printf("-- Fin de la liste --\n"); printf("-- Fin de la liste --\n");
...@@ -308,7 +316,7 @@ void afficherClassement(T_ListeEtu listeEtu){ ...@@ -308,7 +316,7 @@ void afficherClassement(T_ListeEtu listeEtu){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// ajouter un étudiant en tête d'une liste peu importe l'ordre des id
T_ListeEtu ajouterEtu(int idEtu, char *nom, char *prenom, T_ListeEtu listeEtu){ T_ListeEtu ajouterEtu(int idEtu, char *nom, char *prenom, T_ListeEtu listeEtu){
T_Etudiant* e = creerEtudiant(idEtu, nom, prenom); T_Etudiant* e = creerEtudiant(idEtu, nom, prenom);
...@@ -318,28 +326,18 @@ T_ListeEtu ajouterEtu(int idEtu, char *nom, char *prenom, T_ListeEtu listeEtu){ ...@@ -318,28 +326,18 @@ T_ListeEtu ajouterEtu(int idEtu, char *nom, char *prenom, T_ListeEtu listeEtu){
/* -------------------------------------------------------------------*/ /* -------------------------------------------------------------------*/
// création de sous listes pour une matière
void afficherListe(T_ListeEtu listeEtu){
printf("\nClassement des étudiants dans l'ordre décroissant de leur moyenne: \n");
while(listeEtu){
printf("Nom: %s, prenom: %s, Moyenne: %.2f\n",listeEtu->nom, listeEtu->prenom, listeEtu->moyenne);
listeEtu = listeEtu->suivant;
}
}
/* -------------------------------------------------------------------*/
void sousListes(T_ListeEtu listeEtu, char* matiere){ void sousListes(T_ListeEtu listeEtu, char* matiere){
T_ListeEtu current = listeEtu; T_ListeEtu current = listeEtu;
// initialisation des listes
T_ListeEtu listeSucces = creerListe(); T_ListeEtu listeSucces = creerListe();
T_ListeEtu listeEchecs = creerListe(); T_ListeEtu listeEchecs = creerListe();
T_ListeEtu listeNonInscrits = creerListe(); T_ListeEtu listeNonInscrits = creerListe();
// on parcoure notre liste d'étudiants
while(current != NULL){ //On parcours notre liste d'étudiants while(current != NULL){
T_ListeNotes currentNote = current->liste; T_ListeNotes currentNote = current->liste;
...@@ -348,7 +346,7 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){ ...@@ -348,7 +346,7 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){
currentNote = currentNote->suivant; currentNote = currentNote->suivant;
} }
// on ajoute l'étudiant dans la bonne liste
if(currentNote == NULL) listeNonInscrits = ajouterEtu(current->identifiant, current->nom, current->prenom, listeNonInscrits); if(currentNote == NULL) listeNonInscrits = ajouterEtu(current->identifiant, current->nom, current->prenom, listeNonInscrits);
else if (currentNote->note < 10.0) listeEchecs = ajouterEtu(current->identifiant, current->nom, current->prenom, listeEchecs); else if (currentNote->note < 10.0) listeEchecs = ajouterEtu(current->identifiant, current->nom, current->prenom, listeEchecs);
else if (currentNote->note >= 10.0) listeSucces = ajouterEtu(current->identifiant, current->nom, current->prenom, listeSucces); else if (currentNote->note >= 10.0) listeSucces = ajouterEtu(current->identifiant, current->nom, current->prenom, listeSucces);
...@@ -356,6 +354,7 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){ ...@@ -356,6 +354,7 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){
current = current->suivant; current = current->suivant;
} }
// affichage
if(listeNonInscrits->identifiant == -1){ if(listeNonInscrits->identifiant == -1){
printf("\nTous les étudiant sont inscris.\n"); printf("\nTous les étudiant sont inscris.\n");
} else{ } else{
...@@ -378,11 +377,42 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){ ...@@ -378,11 +377,42 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){
} }
} }
/* -------------------------------------------------------------------*/
void afficherSousListe(T_ListeEtu listeEtu){ //fonction d'affichage pour sousListes
void afficherSousListe(T_ListeEtu listeEtu){
if(listeEtu == NULL) printf("\nAucun étudiant dans la liste."); if(listeEtu == NULL) printf("\nAucun étudiant dans la liste.");
while(listeEtu){ while(listeEtu){
printf("Nom: %s, prenom: %s\n",listeEtu->nom, listeEtu->prenom); printf("Nom: %s, prenom: %s\n",listeEtu->nom, listeEtu->prenom);
listeEtu = listeEtu->suivant; listeEtu = listeEtu->suivant;
}