diff --git a/SAE2 b/SAE2 index 072c679..2bb40e7 100755 Binary files a/SAE2 and b/SAE2 differ diff --git a/files/devis.txt b/files/devis.txt index 0197698..387546f 100644 --- a/files/devis.txt +++ b/files/devis.txt @@ -43,6 +43,9 @@ Léon Grosse Murs illiCO travaux 37, bis Avenue Marx Dormoy – 63000 – Clermont-Ferrand +6200 +102 +2000 Finitions SGP finition 4, Rue de Chignat – 63000 – Clermont-Ferrand diff --git a/includes/charge.h b/includes/charge.h index d79d854..2d08d65 100644 --- a/includes/charge.h +++ b/includes/charge.h @@ -15,11 +15,12 @@ Precedence *loadPrec(int *tmax, int *tlog); int rechTravaux(char *travauxName, Offre **tabTravaux); void minTravaux(Offre **tabTravaux); -void freeListeDevis(ListeDevis *ldevis); -void fusionDevisElements(ListeDevis *R, int *tlogR, ListeDevis *S, int *tlogS, ListeDevis *mergedList, ListeDevis *last, int *k); -void gestionElementsRestants(ListeDevis *mergedList, ListeDevis *last, ListeDevis *source, int *tlogSource, int *k); -void fusionMaillonDevis(ListeDevis R, int tlogR, ListeDevis S, int tlogS, ListeDevis *T); -void triFusionListeDevis(ListeDevis ldevis, int tlog); +void freeListeDevis(ListeDevis *ldevis); +void fusionDevisElements(ListeDevis *R, int *tlogR, ListeDevis *S, int *tlogS, ListeDevis *mergedList, ListeDevis *last, int *k); +void gestionElementsRestants(ListeDevis *mergedList, ListeDevis *last, ListeDevis *source, int *tlogSource, int *k); +void fusionMaillonDevis(ListeDevis R, int tlogR, ListeDevis S, int tlogS, ListeDevis *T); +void triFusionListeDevis(ListeDevis *ldevis, int tlog); + // Fonctions de base diff --git a/includes/structures.h b/includes/structures.h index bc8b754..d4ba177 100644 --- a/includes/structures.h +++ b/includes/structures.h @@ -1,6 +1,3 @@ -// on ne nous a pas donner de longueur pour la chaine de char de nomE -// il faudrait utiliser la meme methode que pour adresse - typedef struct { char *nomE; diff --git a/obj/charge.o b/obj/charge.o index b224f47..9fafc36 100644 Binary files a/obj/charge.o and b/obj/charge.o differ diff --git a/obj/main.o b/obj/main.o index 164a57f..d9ff0c8 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/sort.o b/obj/sort.o index d5e4174..c17d825 100644 Binary files a/obj/sort.o and b/obj/sort.o differ diff --git a/obj/structures.o b/obj/structures.o index 25aeab3..4e4a982 100644 Binary files a/obj/structures.o and b/obj/structures.o differ diff --git a/srcs/charge.c b/srcs/charge.c index fd94ab6..da4c91c 100644 --- a/srcs/charge.c +++ b/srcs/charge.c @@ -5,7 +5,6 @@ // initialisation des travaux Offre **initTabTravaux(void) { - printf("\n*-*-* INITTABTRAVAUX *-*-*\n"); Offre **tabTravaux; tabTravaux = (Offre **)malloc(TMAXTRAV* sizeof(Offre *)); @@ -33,68 +32,57 @@ Offre **initTabTravaux(void) // Chargement d'une chaine de caracteres depuis un fichier char *readFromFile(FILE *file) { - printf("\n*-*-* READFROMFILE *-*-*\n"); - char *str, *buf, s[6]; - int i=0, tmax = 5; - str = (char *)malloc(tmax*sizeof(char)); - if (str == NULL) - { - printf("\033[0;31mErreur: \033[0mmalloc readFromFile"); + char *str; + char *buf; + int len = 0; + int size = 5; + int add = 5; + + str = (char *)malloc(size * sizeof(char)); + if (!str) exit(1); - } - fgets(str, tmax, file); - while(str[strlen(str)-1]!='\n') + + while (str[len] != '\n') { - if (i==tmax) + len = strlen(str); + if (len >= size - 1) { - tmax+=5; - buf=realloc(str, tmax*sizeof(char)); - if (buf==NULL) + size += add; + buf = realloc(str, size); + if (!buf) { - printf("\033[0;31mErreur: \033[0mrealloc readFromFile"); free(str); exit(1); } - fgets(s, 5, file); - strcat(str, s); + str = buf; } - i++; + fgets(str + len, size - len, file); + len = strlen(str) - 1; } - str[strlen(str)-1] = '\0'; - return str; + str[len] = '\0'; + return (str); } // Chargement d'un devis depuis un fichier void loadDevis(FILE *devisFile, Offre **tabTravaux) { - printf("\n*-*-* LOADDEVIS *-*-*\n"); int index; char *travaux; Devis d; - MaillonDevis *nouveauMaillon; travaux = readFromFile(devisFile); index = rechTravaux(travaux, tabTravaux); if (index == -1) exit(1); - - nouveauMaillon = (MaillonDevis *)malloc(sizeof(MaillonDevis)); - if (!nouveauMaillon) - { - printf("\033[0;31mErreur: \033[0mallocation mémoire pour nouveauMaillon\n"); - exit(1); - } d.nomE = readFromFile(devisFile); d.adresse = readFromFile(devisFile); fscanf(devisFile, "%d\n%d\n%d%*c", &d.capital, &d.duree, &d.prix); - nouveauMaillon->dev = d; tabTravaux[index]->ldevis = insert(tabTravaux[index]->ldevis, d); } // Chagement des offres depuis le fichier devis.txt Offre **loadOffre(void) { - printf("\n*-*-* LOADOFFRE *-*-*\n"); Offre **tabTravaux = initTabTravaux(); FILE *devisFile; diff --git a/srcs/main.c b/srcs/main.c index c9bfbaa..cf899f3 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -7,8 +7,7 @@ int main() tabTravaux = loadOffre(); for (int i = 0; i < TMAXTRAV; i++) { - displayOffre(tabTravaux[i]); - printf("\n"); + triFusionListeDevis(&tabTravaux[i]->ldevis, lenListeDevis(tabTravaux[i]->ldevis)); } minTravaux(tabTravaux); diff --git a/srcs/sort.c b/srcs/sort.c index 6ab1077..e387327 100644 --- a/srcs/sort.c +++ b/srcs/sort.c @@ -6,7 +6,6 @@ // Retourne l'indice de l'offre dans le tableau si elle est trouvée, sinon retourne -1 int rechTravaux(char *travauxName, Offre **tabTravaux) { - printf("\n*-*-* RECHTRAVAUX *-*-*\n"); //On utilise la taille max de travaux car travaux est un tableau constant, sa taille max est égale à sa taille logique. int deb=0, end=TMAXTRAV-1, mid; @@ -29,39 +28,39 @@ int rechTravaux(char *travauxName, Offre **tabTravaux) // Affiche chaque offre gardee avec le devis ayant le prix le plus bas void minTravaux(Offre *tabTravaux[]) { - printf("\n*-*-* MINTRAVAUX *-*-*\n"); - int i; - MaillonDevis *minDev, *md, *s; - for(i=0; ildevis; - minDev=md; - while(minDev->suiv != NULL) - { - if ((md->dev).prix < (minDev->dev).prix) - { - s=minDev; - minDev=md; - } - else if ((md->dev).prix > (minDev->dev).prix) - s=md; - else - { - if ((md->dev).capital < (minDev->dev).capital) - { - s=minDev; - minDev=md; - } - else // On met else et pas else if car on ne peut pas garder 2 égaux, il faut qd même en supprimer un - s=md; - } - md=md->suiv; - del(s); - displayOffre(tabTravaux[i]); - } - displayOffre(tabTravaux[i]); - - } + int i; + MaillonDevis *minDev, *md, *s; + for (i = 0; i < TMAXTRAV; i++) + { + md = NULL; + s = NULL; + minDev = tabTravaux[i]->ldevis; + if (!md && minDev->suiv) + md = minDev->suiv; + while (md) + { + if ((md->dev).prix < (minDev->dev).prix || (((md->dev).prix == (minDev->dev).prix) && ((md->dev).capital > (minDev->dev).capital))) + { + s = minDev; + minDev = md; + md = md->suiv; + } + else if ((md->dev).prix == (minDev->dev).prix && ((md->dev).capital == (minDev->dev).capital)) + { + printf("deux offres minimales !!!\n"); + exit (1); + } + else + { + s = md; + md = md->suiv; + } + del(s); + } + minDev->suiv = NULL; + tabTravaux[i]->ldevis = minDev; + displayOffre(tabTravaux[i]); + } } @@ -73,7 +72,6 @@ void minTravaux(Offre *tabTravaux[]) // Libère la mémoire d'une liste de devis void freeListeDevis(ListeDevis *ldevis) { - printf("\n*-*-* FREELISTEDEVIS *-*-*\n"); ListeDevis current = *ldevis; ListeDevis next; @@ -89,7 +87,6 @@ void freeListeDevis(ListeDevis *ldevis) // Boucle principale de fusion de listes de devis void fusionDevisElements(ListeDevis *R, int *tlogR, ListeDevis *S, int *tlogS, ListeDevis *mergedList, ListeDevis *last, int *k) { - printf("\n*-*-* FUSIONDEVISELEMENTS *-*-*\n"); ListeDevis *current; while (*tlogR > 0 && *tlogS > 0) @@ -124,7 +121,6 @@ void fusionDevisElements(ListeDevis *R, int *tlogR, ListeDevis *S, int *tlogS, L // Gère les éléments restants après les itérations principales de fusion void gestionElementsRestants(ListeDevis *mergedList, ListeDevis *last, ListeDevis *source, int *tlogSource, int *k) { - printf("\n*-*-* GESTIONELEMENTSRESTANTS *-*-*\n"); while (*tlogSource > 0) { if (!*mergedList) @@ -145,7 +141,6 @@ void gestionElementsRestants(ListeDevis *mergedList, ListeDevis *last, ListeDevi // Fusionne deux listes de devis triées en une seule liste triée void fusionMaillonDevis(ListeDevis R, int tlogR, ListeDevis S, int tlogS, ListeDevis *T) { - printf("\n*-*-* FUSIONMAILLONDEVIS *-*-*\n"); ListeDevis last; ListeDevis mergedList; int k; @@ -161,14 +156,13 @@ void fusionMaillonDevis(ListeDevis R, int tlogR, ListeDevis S, int tlogS, ListeD } // Tri fusion sur une liste de devis -void triFusionListeDevis(ListeDevis ldevis, int tlog) +void triFusionListeDevis(ListeDevis *ldevis, int tlog) { - printf("\n*-*-* TRIFUSIONLISTEDEVIS *-*-*\n"); ListeDevis p; ListeDevis q; ListeDevis qTemp; - p = ldevis; + p = *ldevis; q = p->suiv; if (tlog <= 1) return; @@ -180,8 +174,8 @@ void triFusionListeDevis(ListeDevis ldevis, int tlog) qTemp = p->suiv; p->suiv = NULL; triFusionListeDevis(ldevis, tlog / 2); - triFusionListeDevis(qTemp, tlog - tlog / 2); + triFusionListeDevis(&qTemp, tlog - tlog / 2); ListeDevis mergedList = NULL; - fusionMaillonDevis(ldevis, tlog / 2, qTemp, tlog - tlog / 2, &mergedList); - ldevis = mergedList; -} + fusionMaillonDevis(*ldevis, tlog / 2, qTemp, tlog - tlog / 2, &mergedList); + *ldevis = mergedList; +} \ No newline at end of file diff --git a/srcs/structures.c b/srcs/structures.c index 36ec87b..2dd74ca 100644 --- a/srcs/structures.c +++ b/srcs/structures.c @@ -5,14 +5,12 @@ // Initialise une liste de devis ListeDevis newListeDevis(void) { - printf("\n*-*-* NEWLISTEDEVIS *-*-*\n"); return NULL; } // Initialise une nouvelle offre Offre *newOffre(char *travauxName) { - printf("\n*-*-* NEWOFFRE *-*-*\n"); Offre *o; o = (Offre *)malloc(sizeof(Offre)); strcpy(o->travaux, travauxName); @@ -23,7 +21,6 @@ Offre *newOffre(char *travauxName) // Initialise une liste (pour les successeurs) Liste newListe(void) { - printf("\n*-*-* NEWLISTE *-*-*\n"); return NULL; } @@ -32,14 +29,12 @@ Liste newListe(void) // Verifie l'integrite d'une liste de devis Booleen emptyListe(ListeDevis l) { - printf("\n*-*-* EMPTYLISTE *-*-*\n"); return l==NULL; } // Vérifie l'intégrité de l'offre Booleen emptyOffre(Offre *o) { - printf("\n*-*-* EMPTYOFFRE *-*-*\n"); return emptyListe(o->ldevis); } @@ -48,7 +43,6 @@ Booleen emptyOffre(Offre *o) // Insere un devis en tete de la liste des devis ListeDevis insert(ListeDevis l, Devis d) { - printf("\n*-*-* INSERT *-*-*\n"); MaillonDevis *md; md = (MaillonDevis *)malloc(sizeof(MaillonDevis)); if (md == NULL) @@ -65,7 +59,6 @@ ListeDevis insert(ListeDevis l, Devis d) Liste insertSucc(Liste l, char travaux[]) { - printf("\n*-*-* INSERTSUCC *-*-*\n"); MaillonSucc *ms; ms = (MaillonSucc *)malloc(sizeof(MaillonSucc)); if (ms == NULL) @@ -84,35 +77,37 @@ Liste insertSucc(Liste l, char travaux[]) // Supprime le premier maillon de la liste de devis ListeDevis del(ListeDevis l) { - printf("\n*-*-* DEL *-*-*\n"); - MaillonDevis *md; - if (l==NULL) - { - printf("\033[0;31mErreur: \033[0msuppression dans une liste vide\n"); - exit(1); - } - if (l->suiv==NULL) - return newListeDevis(); - md=l; - l=l->suiv; - free(md->dev.nomE); - free(md->dev.adresse); - free(md); - md=NULL; - printf("\n\nADRESSE md %s\n", md->dev.adresse); - printf("\n\nNOM md %s\n", md->dev.nomE); - printf("\n\nADRESSE l %s\n", l->dev.adresse); - printf("\n\nNOM l %s\n", l->dev.nomE); - - return l; + MaillonDevis *md; + if (l == NULL) + { + printf("\033[0;31mErreur: \033[0msuppression dans une liste vide\n"); + exit(1); + } + + md = l; + l = l->suiv; + + if (md->suiv == NULL) + { + free(md->dev.nomE); + free(md->dev.adresse); + free(md); + return newListeDevis(); + } + + free(md->dev.nomE); + free(md->dev.adresse); + free(md); + return l; } + + /*---------------calculs----------------*/ // Calcule la longueur de la liste de devis int lenListeDevis(ListeDevis l) { - printf("\n*-*-* LENLISTEDEVIS *-*-*\n"); int len=0; while (l) { @@ -124,7 +119,6 @@ int lenListeDevis(ListeDevis l) int lenMaxNomEntreprise(ListeDevis ldevis) { - printf("\n*-*-* LENMAXNOMENTREPRISE *-*-*\n"); int maxLen; int len; @@ -142,7 +136,6 @@ int lenMaxNomEntreprise(ListeDevis ldevis) // Calcule le nombre de precedences pour un travail donne int nombrePred(char travaux[], Precedence prec[], int tlog) { - printf("\n*-*-* NOMBREPRED *-*-*\n"); int nbPred = 0, i; for (i=0; itravaux); + printf("\n%s\n", o->travaux); displayListeDevis(o->ldevis); } // Affiche les details de la liste de devis void displayListeDevis(ListeDevis l) { - printf("\n*-*-* DISPLAYLISTEDEVIS *-*-*\n"); while(l != NULL) { displayDevis(l->dev); @@ -195,7 +184,6 @@ void displayListeDevis(ListeDevis l) // Fonction pour afficher le devis d'une entreprise donnée pour un type de travaux donné void afficherDevisEntreprise(Offre **tabTravaux) { - printf("\n*-*-* AFFICHERDEVISENTREPRISE *-*-*\n"); int indiceTravaux; int maxlen; char typeTravaux[30];