From f1c13170913e8bb987c6554f2653a16bd301a754 Mon Sep 17 00:00:00 2001 From: yoboujon Date: Thu, 1 Dec 2022 00:43:53 +0100 Subject: [PATCH] =?UTF-8?q?Affiche=20les=20=C3=A9quipes=20=C3=A9limin?= =?UTF-8?q?=C3=A9es=20et=20affiche=20la=20liste=20des=20=C3=A9quipes=20du?= =?UTF-8?q?=201er=20au=20dernier?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- header/coureur.h | 1 + header/liste.h | 8 +- src/coureur.c | 29 +++++-- src/liste.c | 214 +++++++++++++++++++++++++++++++++++++++++------ 4 files changed, 215 insertions(+), 37 deletions(-) diff --git a/header/coureur.h b/header/coureur.h index d323542..40809f0 100644 --- a/header/coureur.h +++ b/header/coureur.h @@ -17,4 +17,5 @@ typedef struct{ //definition de la structure coureur * creerCoureur(char nom[],char prenom[],int dossard, char equipe[],int temps);//Creation d'un coureur en memoire avec recupération de son adrresse avec le parametrage de c'est different champs void ajouterTemps(int leTemps,coureur * leCoureur); //Modifier le temps d'un coureur a partir de son adresse et d'une valeur de cumule void afficherCoureur(coureur * leCoureur); //Afficher le temps d'un coureur stocker en seconde sous forme d'heures, de minutes et de secondes ( a partir de l'adresse de sa structure de définition) +void formatSecond(int secondsIN, int* hour, int* minute, int* second); #endif \ No newline at end of file diff --git a/header/liste.h b/header/liste.h index bed8fc1..fe8c2ad 100644 --- a/header/liste.h +++ b/header/liste.h @@ -2,9 +2,9 @@ #define HEADER_LISTE #include #include "coureur.h" //inclure le fichier "coureur.h" qui contien les libs et la structure coureur -#define TEMPSMAX 300 +#define TEMPSMAX 400 #define TEMPSMIN 80 -#define TEMPSDOP 77 +#define TEMPSDOP 70 struct element{ //definition de la structure qui element qui sera encaspule/chaine coureur * coureurActuel; //"contient" l'adresse d'une structure coureur @@ -40,5 +40,9 @@ int * teamsCount(char ** teamNames, int sizeCol, liste list); void removeTeam(char ** teamNames, int sizeCol, liste * list, int * coureursInTeams, int lessThanCoureurCount); struct element * getElementCourant(liste l); void printTeamsDetails(char ** teamsNames, int * coureurInTeams, int teamsNB); +void printTeamsDetailsFor(int num, char ** teamsNames, int * coureurInTeams, int teamsNB); +int * keepOnlyCoureur(int maxCoureur, liste * list, char ** teamNames, int sizeCol); +void triTemps(int * temps, int taille,char ** teams); +void printTeamsTimes(int * temps, char ** teams, int taille, int ignore); int test(void); #endif \ No newline at end of file diff --git a/src/coureur.c b/src/coureur.c index 4d4164b..59d4d72 100644 --- a/src/coureur.c +++ b/src/coureur.c @@ -43,19 +43,32 @@ void ajouterTemps(int leTemps,coureur * leCoureur) /** * @brief Afficher le temps d'un coureur stocker en seconde sous forme d'heures, de minutes et de secondes ( a partir de l'adresse de sa structure): - -initilisation de 3 variable tampon - -calcul d'heures qui renvoie uniquement la partie entier - -calcul de minutes qui renvoie uniquement la partie entier avec la prise en compte des heures soustraite en minutes - -calcul de seconde qui renvoie uniquement la partie entier avec la prise en compte des heures soustraite en secondes et des minutes en secondes + -initilisation de 3 variable temporaires * @param leCoureur Represente le coureur dont on souhaite affichée le temps */ void afficherCoureur(coureur * leCoureur) { - int heure,minute,seconde; - heure = (int)(leCoureur->temps)/3600; - minute = (int)((leCoureur->temps-heure*3600)/60); - seconde = leCoureur->temps-(heure*3600+minute*60); + int heure,minute,seconde; + formatSecond(leCoureur->temps, &heure, &minute, &seconde); printf("Nom : %s\tPrenom : %s\tDossard : %d\tEquipe : %s\tTemps : %d:%d:%d\n",leCoureur->nom,leCoureur->prenom,leCoureur->dossard,leCoureur->equipe,heure,minute,seconde); +} + +/** + * @brief Convertion des seconds à un format heures,minutes et secondes + * -calcul d'heures qui renvoie uniquement la partie entier + * -calcul de minutes qui renvoie uniquement la partie entier avec la prise en compte des heures soustraite en minutes + * -calcul de seconde qui renvoie uniquement la partie entier avec la prise en compte des heures soustraite en secondes et des minutes en secondes + * + * @param secondsIN les secondes à rentrer + * @param hour les heures en sortie + * @param minute les minutes en sortie + * @param second les secondes en sortie + */ +void formatSecond(int secondsIN, int* hour, int* minute, int* second) +{ + *hour = (int)(secondsIN)/3600; + *minute = (int)((secondsIN-(*hour)*3600)/60); + *second = secondsIN-((*hour)*3600+(*minute)*60); } \ No newline at end of file diff --git a/src/liste.c b/src/liste.c index 88d610e..382a4e5 100644 --- a/src/liste.c +++ b/src/liste.c @@ -28,22 +28,24 @@ int main(void) allerDebut(&l); } allerDebut(&l); + printf("\n --- LISTE DES PARTICIPANTS --- \n"); + printlist(l); char ** tabTeam = initMatrix(teamsNb,MAXLINE); readTeams(tabTeam,teamsNb,MAXLINE,l); dopageCount=effacerListe(&l,&dopageList); int * teamCount = teamsCount(tabTeam,teamsNb,l); - printf("\n --- TEAMS AND TEAMS COUNT : --- \n"); - printTeamsDetails(tabTeam,teamCount,teamsNb); - printlist(l); - printf("\n --- TROIS COUREURS RESTANTS --- : \n"); - keepOnlyCoureur(3,&l,tabTeam,teamsNb); - printlist(l); - printf("\n --- COUREURS SUPPRIMEES --- : \n"); - removeTeam(tabTeam,teamsNb,&l,teamCount,MAXTEAMATES); printf("\n --- CLASSEMENT GENERAL : ---\n"); triListe(&l,tailleListe(l)); printlist(l); printf("\n --- NOMBRE DE PERSONNES DOPEES : %d ---\n",dopageCount); + printf("\n --- ELIMINATION DES EQUIPES --- : \n"); + removeTeam(tabTeam,teamsNb,&l,teamCount,MAXTEAMATES); + teamCount = teamsCount(tabTeam,teamsNb,l); + printTeamsDetailsFor(0,tabTeam,teamCount,teamsNb); + printf("\n --- CLASSEMENT FINAL : --- : \n"); + int * timeTeam = keepOnlyCoureur(MAXTEAMATES,&l,tabTeam,teamsNb); + triTemps(timeTeam,teamsNb,tabTeam); + printTeamsTimes(timeTeam,tabTeam,teamsNb,0); return 0; } @@ -206,6 +208,13 @@ bool effacerCoureur(liste * listeActuel,coureur * coureurSuppr, bool returnSuiv) return true; } +/** + * @brief Cherche si un coureur existe dans une liste + * + * @param l la liste en question + * @param c le coureur cherché + * @return true / false + */ bool doesCoureurExist(liste* l,coureur * c) { struct element * eDebut = l->debut; @@ -220,6 +229,13 @@ bool doesCoureurExist(liste* l,coureur * c) return false; } +/** + * @brief A partir d'une liste source supprime tous les éléments en commun + * + * @param destination liste à modifier + * @param source liste des éléments à supprimer + * @return int nombre d'éléments supprimés + */ int effacerListe(liste * destination, liste * source) { int returnValue=0; @@ -376,6 +392,15 @@ char ** initMatrix(int sizeCol,int sizeLine) return matrix; } +/** + * @brief Detecte si une chaîne de caractères est présente dans un + * tabealu de chaîne de caractères + * + * @param matrix tableau de chaîne de caractères + * @param string chaîne de caractère + * @param size nombre de lignes + * @return true / false + */ bool isStringInMatrix(char ** matrix, char * string, int size) { for(int i=0;icourant; @@ -432,9 +483,9 @@ void removeTeam(char ** teamNames, int sizeCol, liste * list, int * coureursInTe { for(int i=0;icoureurActuel->equipe)) == 0 && (coureursInTeams[i]<=lessThanCoureurCount)) + if((strcmp(teamNames[i],elementCourant->coureurActuel->equipe)) == 0 && (coureursInTeams[i]coureurActuel); + //afficherCoureur(elementCourant->coureurActuel); effacerCoureur(list,elementCourant->coureurActuel,false); elementCourant=getElementCourant(*list); } @@ -443,11 +494,24 @@ void removeTeam(char ** teamNames, int sizeCol, liste * list, int * coureursInTe } } +/** + * @brief Récupère l'élément courant de la liste + * + * @param l liste + * @return struct element* + */ struct element * getElementCourant(liste l) { return l.courant; } +/** + * @brief Affiche les équipes et le nombre de coureurs + * + * @param teamsNames les noms de chaque équipe + * @param coureurInTeams nombre de coureur dans chaque équipe + * @param teamsNB nombre d'équipes + */ void printTeamsDetails(char ** teamsNames, int * coureurInTeams, int teamsNB) { for(int i=0;icourant; - struct element * elementFin = list->fin; - while(elementCourant->suiv != elementFin->suiv) + for(int i=0;icoureurActuel->equipe) == 0) + if(coureurInTeams[i] == num) { - if(j>=maxCoureur) - { - effacerCoureur(list,elementCourant->coureurActuel,true); - elementCourant=getElementCourant(*list); - } - j++; + printf("Team [%d] : %s\n",i,teamsNames[i]); } - else{ - k++; - j=1; - } - elementCourant=elementCourant->suiv; } } +/** + * @brief Supprime les coureurs s'il y a plus de maxCoureur + * + * @param maxCoureur nombre de coureur max dans une équipe + * @param list liste à analyser + * @param teamNames nom des équipes + * @param sizeCol taille de la colonne des équipe/nombre d'équipes + */ +int * keepOnlyCoureur(int maxCoureur, liste * list, char ** teamNames, int sizeCol) +{ + int * teamsCount = (int *)(malloc(sizeCol*sizeof(int))); + int * secondsPerTeam = (int *)(malloc(sizeCol*sizeof(int))); + memset(teamsCount, 0, sizeCol*sizeof(int)); + memset(secondsPerTeam, 0, sizeCol*sizeof(int)); + struct element * elementCourant = list->courant; + struct element * elementFin = list->fin; + for(int i=0;isuiv != elementFin->suiv) + { + if(strcmp(teamNames[i],elementCourant->coureurActuel->equipe) == 0) + { + if(teamsCount[i]>=maxCoureur) + { + effacerCoureur(list,elementCourant->coureurActuel,true); + elementCourant=getElementCourant(*list); + } + else + { + secondsPerTeam[i]+=elementCourant->coureurActuel->temps; + } + teamsCount[i]+=1; + } + elementCourant=elementCourant->suiv; + } + elementCourant=list->debut; + } + allerDebut(list); + return secondsPerTeam; +} + +/** + * @brief Tri une liste de int ainsi qu'une liste de chaîne de caractère associé + * + * @param temps liste de int + * @param taille taille de cette liste + * @param teams liste de chaîne de caractère (doit être de la même taille) + */ +void triTemps(int * temps, int taille,char ** teams) +{ + int tabTemp; + char * stringTemp = (char *)(malloc(MAXLINE*sizeof(char))); + bool tabOrdered = true; + for(int i=taille-1;i>1;i--) + { + for(int j=0;j<=i-1;j++) + { + if(temps[j+1] < temps[j]) + { + tabTemp = temps[j+1]; + stringTemp = teams[j+1]; + temps[j+1] = temps[j]; + teams[j+1] = teams[j]; + temps[j] = tabTemp; + teams[j] = stringTemp; + tabOrdered = false; + } + } + if(tabOrdered) + { + return; + } + } +} + +/** + * @brief Affiche le temps ainsi que les équipes + * + * @param temps liste de temps en int + * @param teams liste de chaîne de caractères, les équipes + * @param taille taille des deux listes (doivent être égales) + * @param ignore le chiffre qui doit être ignoré (si vous voulez le désactiver, choisissez un nombre impossible) + */ +void printTeamsTimes(int * temps, char ** teams, int taille, int ignore) +{ + for(int i=0;i