diff --git a/SAE2 b/SAE2 index abb0c72..8605816 100755 Binary files a/SAE2 and b/SAE2 differ diff --git a/files/devis.txt b/files/devis.txt index 9d13031..0197698 100644 --- a/files/devis.txt +++ b/files/devis.txt @@ -24,6 +24,7 @@ comusolisme 10000 Structure Eiffage Construction Auvergne +12, avenue Joseph Girod – 63000 – Clermont-Ferrand 300000 40 20000 @@ -89,4 +90,4 @@ RéussiteFinale 18, Rue de la Réussite – 63300 – Thiers 120000 25 -15000 \ No newline at end of file +1500 \ No newline at end of file diff --git a/includes/charge.h b/includes/charge.h index eba0d0d..d79d854 100644 --- a/includes/charge.h +++ b/includes/charge.h @@ -4,39 +4,39 @@ // Chargements char *readAdress(FILE *flot); -Offre *initTabTravaux(void); -Offre *loadOffre(void); -Devis loadDevis(FILE *devisFile, Offre tabTravaux[]); -Tache **loadTaches(Offre *tabTravaux[]); +Offre **initTabTravaux(void); +Offre **loadOffre(void); +void loadDevis(FILE *devisFile, Offre **tabTravaux); +Tache **loadTaches(Offre **tabTravaux); Precedence *loadPrec(int *tmax, int *tlog); // Recherches et tri -int rechTravaux(char *travauxName, Offre tabTravaux[]); -void minTravaux(Offre *tabTravaux[]); +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 triFusionListeDevis(ListeDevis ldevis, int tlog); // Fonctions de base -int lenListeDevis(ListeDevis l); -int nombrePred(char travaux[], Precedence prec[], int tlog); +int lenListeDevis(ListeDevis l); +int nombrePred(char travaux[], Precedence prec[], int tlog); void displayDevis(Devis d); void displayOffre(Offre *o); void displayListeDevis(ListeDevis l); -Offre newOffre(char *travauxName); +Offre *newOffre(char *travauxName); Booleen emptyListe(ListeDevis l); Booleen emptyOffre(Offre *o); Liste newListe(void); Liste insertSucc(Liste l, char travaux[]); Liste lstSucc(char travaux[], Precedence prec[], int tlog); -ListeDevis delete(ListeDevis l); +ListeDevis del(ListeDevis l); ListeDevis insert(ListeDevis l, Devis d); ListeDevis newListeDevis(void); -int longueurMaxNomEntreprise(ListeDevis ldevis); -void afficherDevisEntreprise(Offre *tabTravaux); +int longueurMaxNomEntreprise(ListeDevis ldevis); +void afficherDevisEntreprise(Offre **tabTravaux); diff --git a/obj/charge.o b/obj/charge.o index 181886e..071a33a 100644 Binary files a/obj/charge.o and b/obj/charge.o differ diff --git a/obj/main.o b/obj/main.o index 689e6e0..164a57f 100644 Binary files a/obj/main.o and b/obj/main.o differ diff --git a/obj/sort.o b/obj/sort.o index fe7a29e..1ba95ce 100644 Binary files a/obj/sort.o and b/obj/sort.o differ diff --git a/obj/structures.o b/obj/structures.o index 9e36f24..614a21b 100644 Binary files a/obj/structures.o and b/obj/structures.o differ diff --git a/srcs/charge.c b/srcs/charge.c index c31ceb5..b72173c 100644 --- a/srcs/charge.c +++ b/srcs/charge.c @@ -3,11 +3,11 @@ // l'initialisation est temporaire, je ne savais pas comment tu voulais la faire // initialisation des travaux -Offre *initTabTravaux(void) +Offre **initTabTravaux(void) { - Offre *tabTravaux; + Offre **tabTravaux; - tabTravaux = (Offre *)malloc(TMAXTRAV* sizeof(Offre)); + tabTravaux = (Offre **)malloc(TMAXTRAV* sizeof(Offre *)); if (!tabTravaux) { printf("\033[0;31mErreur: \033[0mmalloc tableau tabTravaux\n"); @@ -24,7 +24,7 @@ Offre *initTabTravaux(void) tabTravaux[6] = newOffre("Sols"); tabTravaux[7] = newOffre("Structure"); - return (tabTravaux); + return tabTravaux; } /*---------------devis---------------*/ @@ -32,39 +32,38 @@ Offre *initTabTravaux(void) // Chargement d'une chaine de caracteres depuis un fichier char *readFromFile(FILE *file) { - char *str; - char *buf; - int len = 0; - int size = 5; - int add = 5; - - str = malloc(size); - if (!str) + 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"); exit(1); - - while (str[len] != '\n') + } + fgets(str, tmax, file); + while(str[strlen(str)-1]!='\n') { - len = strlen(str); - if (len >= size - 1) + if (i==tmax) { - size += add; - buf = realloc(str, size); - if (!buf) + tmax+=5; + buf=realloc(str, tmax*sizeof(char)); + if (buf==NULL) { + printf("\033[0;31mErreur: \033[0mrealloc readFromFile"); free(str); exit(1); } - str = buf; + fgets(s, 5, file); + strcat(str, s); } - fgets(str + len, size - len, file); - len = strlen(str) - 1; + printf("%s\n",str); + i++; } - str[len] = '\0'; - return (str); + return str; } // Chargement d'un devis depuis un fichier -Devis loadDevis(FILE *devisFile, Offre *tabTravaux) +void loadDevis(FILE *devisFile, Offre **tabTravaux) { int index; char *travaux; @@ -86,20 +85,18 @@ Devis loadDevis(FILE *devisFile, Offre *tabTravaux) 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); - - return (d); + tabTravaux[index]->ldevis = insert(tabTravaux[index]->ldevis, d); } // Chagement des ofrres depuis le fichier devis.txt -Offre *loadOffre(void) +Offre **loadOffre(void) { - Offre *tabTravaux = initTabTravaux(); + Offre **tabTravaux = initTabTravaux(); FILE *devisFile; devisFile = fopen("files/devis.txt", "r"); - if (!devisFile) + if (!devisFile) //ERREUR exit(1); while (!feof(devisFile)) diff --git a/srcs/main.c b/srcs/main.c index 2c527f2..c9bfbaa 100644 --- a/srcs/main.c +++ b/srcs/main.c @@ -2,18 +2,16 @@ int main() { - Offre *tabTravaux; + Offre **tabTravaux; tabTravaux = loadOffre(); - for (int i = 0; i < TMAXTRAV; i++) { - triFusionListeDevis(&tabTravaux[i].ldevis, lenListeDevis(tabTravaux[i].ldevis)); - displayOffre(&tabTravaux[i]); + displayOffre(tabTravaux[i]); printf("\n"); } - afficherDevisEntreprise(tabTravaux); + minTravaux(tabTravaux); return 0; } diff --git a/srcs/sort.c b/srcs/sort.c index cc073db..2aa6daa 100644 --- a/srcs/sort.c +++ b/srcs/sort.c @@ -4,7 +4,7 @@ // Recherche d'une offre dans le tableau de travaux // Retourne l'indice de l'offre dans le tableau si elle est trouvée, sinon retourne -1 -int rechTravaux(char *travauxName, Offre *tabTravaux) +int rechTravaux(char *travauxName, Offre **tabTravaux) { //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; @@ -12,9 +12,9 @@ int rechTravaux(char *travauxName, Offre *tabTravaux) while(deb<=end) { mid = (deb+end) /2; - if (strcmp(travauxName, tabTravaux[mid].travaux)==0) + if (strcmp(travauxName, tabTravaux[mid]->travaux)==0) return mid; - if (strcmp(travauxName, tabTravaux[mid].travaux) < 0) + if (strcmp(travauxName, tabTravaux[mid]->travaux) < 0) end=mid-1; else deb=mid+1; @@ -29,27 +29,42 @@ int rechTravaux(char *travauxName, Offre *tabTravaux) void minTravaux(Offre *tabTravaux[]) { int i; - ListeDevis l, minl; - for (i=0; ildevis; - minl=l; - while(l) + md = tabTravaux[i]->ldevis; + minDev=md; + while(minDev->suiv != NULL) { - if(l->dev.prix < minl->dev.prix) + if ((md->dev).prix < (minDev->dev).prix) { - l=delete(minl); - minl=l; + s=minDev; + minDev=md; } - else - l=delete(l); - l=l->suiv; + 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; + } + displayOffre(tabTravaux[i]); + md=md->suiv; + del(s); + printf("HELLO3\n"); } displayOffre(tabTravaux[i]); + } } + /*---------------tri------------------*/ //on la met dans struct.c ? @@ -141,13 +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) { ListeDevis p; ListeDevis q; ListeDevis qTemp; - p = *ldevis; + p = ldevis; q = p->suiv; if (tlog <= 1) return; @@ -159,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; } diff --git a/srcs/structures.c b/srcs/structures.c index 507573e..02d652e 100644 --- a/srcs/structures.c +++ b/srcs/structures.c @@ -9,11 +9,12 @@ ListeDevis newListeDevis(void) } // Initialise une nouvelle offre -Offre newOffre(char *travauxName) +Offre *newOffre(char *travauxName) { - Offre o; - strcpy(o.travaux, travauxName); - o.ldevis=newListeDevis(); + Offre *o; + o = (Offre *)malloc(sizeof(Offre)); + strcpy(o->travaux, travauxName); + o->ldevis=newListeDevis(); return o; } @@ -74,7 +75,7 @@ Liste insertSucc(Liste l, char travaux[]) /*------------suppressions-------------*/ // Supprime le premier maillon de la liste de devis -ListeDevis delete(ListeDevis l) +ListeDevis del(ListeDevis l) { MaillonDevis *md; if (l==NULL) @@ -85,8 +86,12 @@ ListeDevis delete(ListeDevis l) if (l->suiv==NULL) return newListeDevis(); md=l; + printf("HELLO\n"); l=l->suiv; + free(md->dev.nomE); + free(md->dev.adresse); free(md); + printf("HELLO2\n"); return l; } @@ -170,7 +175,7 @@ void displayListeDevis(ListeDevis l) } // Fonction pour afficher le devis d'une entreprise donnée pour un type de travaux donné -void afficherDevisEntreprise(Offre *tabTravaux) +void afficherDevisEntreprise(Offre **tabTravaux) { int indiceTravaux; int maxlen; @@ -189,12 +194,12 @@ void afficherDevisEntreprise(Offre *tabTravaux) return; } - maxlen = lenMaxNomEntreprise(tabTravaux[indiceTravaux].ldevis); + maxlen = lenMaxNomEntreprise(tabTravaux[indiceTravaux]->ldevis); nomEntreprise = malloc((maxlen + 1) * sizeof(char)); printf("Saisir le nom de l'entreprise : "); fgets(nomEntreprise, maxlen + 1, stdin); - ListeDevis listeDevis = tabTravaux[indiceTravaux].ldevis; + ListeDevis listeDevis = tabTravaux[indiceTravaux]->ldevis; while (listeDevis) { if (strcmp(listeDevis->dev.nomE, nomEntreprise) == 0)