Debug complet, ne lit plus dans un string, affichage du nombre de personnes dopées

This commit is contained in:
Yohan Boujon 2022-11-27 23:53:28 +01:00
parent 2d6c53d2d6
commit 2fb5d11074
5 changed files with 106 additions and 35 deletions

View file

@ -4,7 +4,7 @@ SRC=src/
EXEC=main
CLEAN=clean
all: clean $(EXEC) exec
all: $(EXEC) exec
main: liste.o coureur.o readfile.o
$(CC) $(CFLAGS) -o $@ $^

View file

@ -4,7 +4,7 @@
#include "coureur.h" //inclure le fichier "coureur.h" qui contien les libs et la structure coureur
#define TEMPSMAX 300
#define TEMPSMIN 80
#define TEMPSDOP 70
#define TEMPSDOP 78
struct element{ //definition de la structure qui element qui sera encaspule/chaine
coureur * coureurActuel; //"contient" l'adresse d'une structure coureur
@ -26,9 +26,9 @@ void allerDebut(liste * l); //mettre le poit
void allerFin(liste * l); //mettre le poiteur courant sur l'element de fin d'une liste
void avancer(liste * l); //mettre le poiteur courant sur l'element suivant de la liste dans la qu'elle qu'il pointe
coureur * coureurCourant(liste * l); //rien a foutre ici
void effacerCoureur(liste * listeActuel,coureur * coureurSuppr);//enleve un element d'une liste a partir de l'adresse d'un courreur, sans briser le chainage
bool effacerCoureur(liste * listeActuel,coureur * coureurSuppr);//enleve un element d'une liste a partir de l'adresse d'un courreur, sans briser le chainage
bool doesCoureurExist(liste* l,coureur * c);
void effacerListe(liste * destination, liste * source);
int effacerListe(liste * destination, liste * source);
int tailleListe(liste l); //retourne le nombre d'elements chaine d'une liste
coureur * getCoureur(liste l,int nb); //retourne le courreur contenue dans l'element nb d'une liste (on considere un element 0)
void invertCoureur(liste * l,int nb); //inverse l'element nb et nb+1 dans une liste (on considere un element 0)

View file

@ -6,11 +6,12 @@
#include <stdbool.h>
#include "liste.h"
int getNbLines(FILE * readFile);
int getNbLines(void);
int getFileSize(FILE * readFile);
void getStringFromFile(FILE * readFile,int nbLines,char * returnString,int * size);
liste getStringFromFile(int nbLines,int * size, int * stepsNb,int * teamsNb);
char * getLine(char * string,int line);
liste string2Liste(char * string,int nbLines);
void string2Coureur(char * string,char * nom, char * prenom, int * dossard);
void deleteLineFeed(char * string);
void printHexString(char * string);
#endif

View file

@ -5,13 +5,8 @@ int main(void)
{
int size, stepsNb, teamsNb, listeTaille, dopageCount=0;
srand(time(NULL));
FILE * f=fopen ("fichier_coureurs.txt","r");
char * fileString = (char *)(malloc(getFileSize(f)*sizeof(char)));
int fileLines = getNbLines(f);
getStringFromFile(f,fileLines,fileString,&size);
stepsNb = atoi(getLine(fileString,1));
teamsNb = atoi(getLine(fileString,2));
liste l = string2Liste(fileString,fileLines);
int fileLines = getNbLines();
liste l = getStringFromFile(fileLines,&size,&stepsNb,&teamsNb);
liste dopageList = initListe();
listeTaille = tailleListe(l);
@ -27,7 +22,6 @@ int main(void)
if(temptemps < TEMPSMIN)
{
ajoutListe(&dopageList,coureurTemp);
dopageCount++;
}
}
allerDebut(&l);
@ -35,10 +29,11 @@ int main(void)
allerDebut(&l);
printf(" --- AVANT : ---\n");
printlist(l);
effacerListe(&l,&dopageList);
dopageCount=effacerListe(&l,&dopageList);
printf("\n --- APRES : ---\n");
triListe(&l,tailleListe(l));
printlist(l);
printf("\n --- NOMBRE DE PERSONNES DOPEES : %d ---\n",dopageCount);
return 0;
}
@ -171,11 +166,11 @@ coureur * coureurCourant(liste * l)
* @param listeActuel Liste ou l'on suppr un element
* @param coureurSuppr le coureur qui doit etre dans l'element pour le supprimer
*/
void effacerCoureur(liste * listeActuel,coureur * coureurSuppr)
bool effacerCoureur(liste * listeActuel,coureur * coureurSuppr)
{
if(!doesCoureurExist(listeActuel,coureurSuppr))
{
return;
return false;
}
struct element *eParcours =listeActuel->debut;
struct element * ePrevious;
@ -194,6 +189,7 @@ void effacerCoureur(liste * listeActuel,coureur * coureurSuppr)
ePrevious->suiv=eParcours->suiv;
free(eParcours);
}
return true;
}
bool doesCoureurExist(liste* l,coureur * c)
@ -210,14 +206,19 @@ bool doesCoureurExist(liste* l,coureur * c)
return false;
}
void effacerListe(liste * destination, liste * source)
int effacerListe(liste * destination, liste * source)
{
int returnValue=0;
struct element * eCourant = source->debut;
while(eCourant->suiv != source->fin->suiv)
{
effacerCoureur(destination,eCourant->coureurActuel);
if(effacerCoureur(destination,eCourant->coureurActuel))
{
returnValue++;
}
eCourant=eCourant->suiv;
}
return returnValue;
}
/**

View file

@ -7,9 +7,15 @@
* @param readFile le fichier en question
* @return int nombre de ligne
*/
int getNbLines(FILE * readFile)
int getNbLines(void)
{
int c,count=0;
FILE * readFile=fopen ("fichier_coureurs.txt","r");
if (readFile == NULL)
{
printf("Le fichier ne peut pas être ouvert!\n");
return -1;
}
do{
c=getc(readFile);
if(c == 0xa)
@ -17,31 +23,72 @@ int getNbLines(FILE * readFile)
count++;
}
}while(c!=0xffffffff);
fclose(readFile);
return count+1;
}
/**
* @brief Converti les caractères d'un fichier dans un string pour pouvoir
* le manipuler plus simplement
* @brief Converti les caractères d'un fichier dans la liste de coureur.
*
* @param readFile le fichier à lire
* @param nbLines son nombre de ligne
* @param returnString une chaîne de caractère vide à modifier
* @param nbLines nombre de ligne du fichier qui va être lu
* @param size renvoie la taille de la chaîne de caractère
* @param stepsNb int * renvoi le nombre d'étapes
* @param teamsNb int * renvoi le nombre d'équipes
* @return liste de coureurs
*/
void getStringFromFile(FILE * readFile,int nbLines,char * returnString,int * size)
liste getStringFromFile(int nbLines,int * size, int * stepsNb,int * teamsNb)
{
int i;
char temp[MAXLINE];
liste l = initListe();
FILE * readFile=fopen("fichier_coureurs.txt","r");
if (readFile == NULL)
{
printf("Le fichier ne peut pas être ouvert!\n");
return l;
}
int i,j=0;
char * team = (char *)(malloc(MAXLINE*sizeof(char)));
char *temp =(char *)(malloc(MAXLINE*(sizeof(char))));
*size=0;
strcpy(returnString,"");
fseek(readFile,0,0);
for(i=0;i<nbLines;i++)
{
fgets(temp,100,readFile);
*size+=strlen(temp);
strcat(returnString,temp);
char * nom = (char *)(malloc(MAXLINE*sizeof(char)));
char * prenom = (char *)(malloc(MAXLINE*sizeof(char)));
int dossard=0;
fgets(temp,MAXLINE,readFile);
deleteLineFeed(temp);
switch(i)
{
case 0:
*stepsNb = atoi(temp);
break;
case 1:
*teamsNb = atoi(temp);
break;
default :
switch(j)
{
case 0:
strcpy(team,temp);
break;
default:
//printHexString(temp);
string2Coureur(temp,nom,prenom,&dossard);
coureur * coureurTemp = creerCoureur(nom,prenom,dossard,team,0);
ajoutListe(&l,coureurTemp);
}
j++;
if(j>5)
{
j=0;
}
free(nom);
free(prenom);
}
*size+=strlen(temp);
}
fclose(readFile);
return l;
}
/**
@ -60,7 +107,8 @@ int getFileSize(FILE * readFile)
}
/**
* @brief Debug uniquement : récupère une ligne, non optimisé donc inutilisable
* @brief /!\/!\/!\ Debug uniquement /!\/!\/!\ :
* récupère une ligne, non optimisé donc inutilisable
*
* @param string la chaîne de caractère à analyser
* @param line int la ligne à récupérer
@ -87,7 +135,8 @@ char * getLine(char * string,int line)
}
/**
* @brief Renvoi une liste à partir d'une chaîne de caractère contenant
* @brief /!\/!\/!\ INUTILISE CAR OBSELETE /!\/!\/!\ :
* Renvoi une liste à partir d'une chaîne de caractère contenant
* les équipes ainsi que les coureurs avec leur nom, leur prénom et numéro de dossard
*
* @param string chaîne de caractère
@ -138,7 +187,7 @@ void string2Coureur(char * string,char * nom, char * prenom, int * dossard)
{
int i=0,j=0,k=0;
char * temp = (char *)(malloc(MAXLINE*sizeof(char)));
while(string[j]!='\0'){
while(string[j]!='\0' && string[j]!='\n'){
k=0;
while(string[j] != ',' && string[j]!='\0'){
temp[k] = string[j];
@ -166,7 +215,27 @@ void string2Coureur(char * string,char * nom, char * prenom, int * dossard)
}
/**
* @brief Debug uniquement, permet d'observer les valeurs de chaque caractère.
* @brief Supprime les retours à la ligne dans les chaînes de caractère.
* Attention ! les remplace par le caractère signifiant la fin de la chaîne.
*
* @param string chaîne de caractère
*/
void deleteLineFeed(char * string)
{
int i=0;
while(string[i]!='\0')
{
if(string[i]=='\n')
{
string[i]='\0';
}
i++;
}
}
/**
* @brief /!\/!\/!\ Debug uniquement /!\/!\/!\ :
* Permet d'observer les valeurs de chaque caractère.
* la taille n'est pas demandée pour observer au delà de l'espace mémoire donné
*
* @param string un tableau de caractère