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

OK

parent 36d42c96
......@@ -2,12 +2,6 @@
#include <stdlib.h>
#include "tp3.h"
// libérer la mémoire
// améliorer l'affichage
// commenter
// rapporter
int main(){
......@@ -16,6 +10,7 @@ int main(){
T_ListeEtu liste = creerListe();
while(continuer){
printf("\n##############################################################\n");
printf("Choisissez une option : \n");
printf("1. Créer la liste d'étudiants\n");
printf("2. Ajouter une note pour un étudiant\n");
......@@ -28,6 +23,8 @@ int main(){
scanf("%d", &choix);
fflush(stdin);
printf("\n##############################################################\n");
if(choix == 1){
int i = 1;
......@@ -89,66 +86,12 @@ int main(){
scanf("%s", mat);
fflush(stdin);
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{
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;
}
No preview for this file type
No preview for this file type
#include "tp3.h"
// alloue la mémoire et crée une note
T_Note* creerNote(float note, char *matiere){
if(note>=0 && note<=20){
T_Note* nouveau = (T_Note*)malloc(sizeof(T_Note));
......@@ -11,7 +13,7 @@
}
/* -------------------------------------------------------------------*/
// alloue la mémoire pour une liste vide
T_ListeEtu creerListe(){
T_ListeEtu l = (T_ListeEtu)(malloc(sizeof(T_Etudiant)));
l->identifiant = -1;
......@@ -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* e = (T_Etudiant*)(malloc(sizeof(T_Etudiant)));
e->identifiant = idEtu;
......@@ -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_Note* nouveau = creerNote(note, matiere);
if(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 temp = listeEtu;
if(listeEtu->identifiant == -1){
if(listeEtu->identifiant == -1){ //Si la liste est vide on retourne l'étudiant
listeEtu = (T_ListeEtu)etu;
return listeEtu;
}
else{
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){
prec = temp;
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");
// on insère l'étudiant au bon endroit selon son id et sa position dans la chaîne.
}else if(temp->identifiant < etu->identifiant){
etu->suivant = NULL;
temp->suivant = etu;
......@@ -76,13 +83,11 @@ T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu){
}
else{
if(prec){
printf("etuid : %d\nprecid : %d\ntemp id : %d\n", etu->identifiant, prec->identifiant, temp->identifiant);
prec->suivant = etu;
etu->suivant = temp;
return listeEtu;
}
else {
printf("etuid : %d\ntemp id : %d\n", etu->identifiant, temp->identifiant);
if(temp->identifiant > etu->identifiant){
etu->suivant = temp;
return (T_ListeEtu)etu;
......@@ -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 prec;
T_ListeEtu temp = listeEtu;
......@@ -105,22 +110,20 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
char* mat = malloc(sizeof(char)*20);
strcpy(mat, matiere);
// on parcoure la chaîne.
while(temp && temp->identifiant != idEtu){
//if(temp->identifiant > idEtu) break;
prec = temp;
temp = temp->suivant;
}
//si l'étudiant existe on ajoute la note.
if(temp && temp->identifiant == idEtu){
temp->liste = ajouterNote(note,mat,temp->liste);
temp->nbrNotes++;
return listeEtu;
}
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* prenom = malloc(sizeof(char)*20);
......@@ -145,17 +148,19 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
/* -------------------------------------------------------------------*/
T_ListeEtu supprimerNoteEtu(char *matiere, int idEtu, T_ListeEtu listeEtu){
// suppression d'une note d'un étudiant
T_ListeEtu supprimerNoteEtu(char *matiere, int idEtu, T_ListeEtu listeEtu){
T_ListeEtu current = listeEtu;
T_ListeEtu previous = NULL;
// on parcoure la chaine
while(current->suivant && current->identifiant < idEtu){
previous = current;
current = current->suivant;
}
// cas où l'étudiant n'existe pas
if(current->identifiant != idEtu){
printf("L'étudiant n'existe pas.\n");
return listeEtu;
......@@ -164,16 +169,19 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
T_ListeNotes current_note = current->liste;
T_ListeNotes previous_note = NULL;
// on cherche la note qui correspond à la matière
while(strcmp(current_note->matiere, matiere) != 0 && current_note != NULL){
previous_note = current_note;
current_note = current_note->suivant;
}
// cas où la note n'existe pas
if(current_note == NULL){
printf("La note n'existe pas.\n");
return listeEtu;
}
// on supprime la note et on libère la mémoire
if(previous_note == NULL){
T_ListeNotes temp = current->liste;
current->liste = current->liste->suivant;
......@@ -186,6 +194,7 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
current->nbrNotes--;
// si l'étudiant n'a plus de note on le supprime et on libère la mémoire
if(current->nbrNotes == 0){
printf("\nSuppression de l'étudiant avec l'id %d car il n'a plus de notes.\n\n", current->identifiant);
if(previous == NULL){
......@@ -199,14 +208,11 @@ T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu liste
}
return listeEtu;
}
/* -------------------------------------------------------------------*/
}
/* -------------------------------------------------------------------*/
// affichage d'une liste d'étudiants avec leurs notes
void afficherListeEtu(T_ListeEtu listeEtu){
T_ListeEtu temp = listeEtu;
......@@ -228,6 +234,7 @@ void afficherListeEtu(T_ListeEtu listeEtu){
/* -------------------------------------------------------------------*/
// calcul de la moyenne d'un étudiant
float calculMoyenneEtu(T_Etudiant* etu){
int i;
float somme=0;
......@@ -241,7 +248,7 @@ float calculMoyenneEtu(T_Etudiant* etu){
/* -------------------------------------------------------------------*/
// calcul de la moyenne d'une liste d'étudiants
void calculMoyenne(T_ListeEtu liste){
while(liste){
liste->moyenne = calculMoyenneEtu(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){
//printf("\n------------ Affichage du classement -------------\n");
printf("\n------------ Affichage du classement -------------\n");
T_ListeEtu p_aux = listeEtu;
calculMoyenne(listeEtu);
//Rajouter tableau de booléen
// calcul de la moyenne de chaque étudiant
calculMoyenne(listeEtu);
if(p_aux == NULL){ //Si la liste est vide On renvoie directement "fin de la liste"
// cas où la liste est vide
if(p_aux == NULL){
printf("-- Fin de la liste --\n\n");
}
else {
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
while (p_aux != NULL) {
p_aux = p_aux->suivant;
nbEtu++;
}
T_ListeEtu *tabEtu = malloc(nbEtu*sizeof(T_ListeEtu)); //Tableau de nos étudiants
p_aux = listeEtu; //On "replace le curseur" au niveau de la tête de la liste
// on alloue un tableau d'étudiants
T_ListeEtu *tabEtu = malloc(nbEtu*sizeof(T_ListeEtu));
p_aux = listeEtu;
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;
p_aux = p_aux->suivant;
}
// on trie le tableau
for (i=0; i<nbEtu; i++) {
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];
tabEtu[i] = tabEtu[j];
tabEtu[j] = p_aux;
}
}
}
// affichage
printf("\nClassement des étudiants : \n");
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");
......@@ -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_Etudiant* e = creerEtudiant(idEtu, nom, prenom);
......@@ -318,28 +326,18 @@ T_ListeEtu ajouterEtu(int idEtu, char *nom, char *prenom, T_ListeEtu listeEtu){
/* -------------------------------------------------------------------*/
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;
}
}
/* -------------------------------------------------------------------*/
// création de sous listes pour une matière
void sousListes(T_ListeEtu listeEtu, char* matiere){
T_ListeEtu current = listeEtu;
// initialisation des listes
T_ListeEtu listeSucces = creerListe();
T_ListeEtu listeEchecs = creerListe();
T_ListeEtu listeNonInscrits = creerListe();
while(current != NULL){ //On parcours notre liste d'étudiants
// on parcoure notre liste d'étudiants
while(current != NULL){
T_ListeNotes currentNote = current->liste;
......@@ -348,7 +346,7 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){
currentNote = currentNote->suivant;
}
// on ajoute l'étudiant dans la bonne liste
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) listeSucces = ajouterEtu(current->identifiant, current->nom, current->prenom, listeSucces);
......@@ -356,6 +354,7 @@ void sousListes(T_ListeEtu listeEtu, char* matiere){
current = current->suivant;
}
// affichage
if(listeNonInscrits->identifiant == -1){
printf("\nTous les étudiant sont inscris.\n");
} else{
......@@ -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.");
while(listeEtu){
printf("Nom: %s, prenom: %s\n",listeEtu->nom, listeEtu->prenom);
listeEtu = listeEtu->suivant;
}
}
/* -------------------------------------------------------------------*/
// fonctions de libération de la mémoire
void libererEtu(T_Etudiant * etu){
T_ListeNotes current = etu->liste;
T_ListeNotes temp;
while(current){
temp = current;
current = current->suivant;
free(temp);
}
free(etu);
}
void libererListeEtu(T_ListeEtu liste){
T_ListeEtu current = liste;
T_ListeEtu temp;
while(current){
temp = current;
current = current->suivant;
libererEtu(temp);
free(temp);
}
}
\ No newline at end of file
......@@ -30,7 +30,6 @@ T_Note* creerNote(float note, char *matiere);
T_Etudiant *creerEtudiant(int idEtu, char *nom, char *prenom);
T_ListeNotes ajouterNote(float note, char *matiere, T_ListeNotes listeNotes);
T_ListeEtu triById(T_ListeEtu liste);
T_ListeEtu ajouterNoteEtu(float note, char *matiere, int idEtu, T_ListeEtu listeEtu);
T_ListeEtu ajouterEtuListe(T_Etudiant* etu, T_ListeEtu listeEtu);
......@@ -39,14 +38,16 @@ T_ListeEtu supprimerNoteEtu(char *matiere, int idEtu, T_ListeEtu listeEtu);
void afficherListeEtu(T_ListeEtu listeEtu);
void afficherListe(T_ListeEtu listeEtu);
T_ListeEtu ajouterEtu(int idEtu, char *nom, char *prenom, T_ListeEtu listeEtu);
T_ListeEtu creerListe();
float calculMoyenneEtu(T_Etudiant* etu);
void calculMoyenne(T_ListeEtu);
T_ListeEtu trierListeEtu(T_ListeEtu);
void afficherClassement(T_ListeEtu liste);
void sousListes(T_ListeEtu listeEtu, char* matiere);
void afficherSousListe(T_ListeEtu);
void libererEtu(T_Etudiant * etu);
void libererListeEtu(T_ListeEtu liste);
\ No newline at end of file
No preview for this file type
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment