diff --git a/files/devis.txt b/files/devis.txt index 9d9c56f..73c8857 100644 --- a/files/devis.txt +++ b/files/devis.txt @@ -1,10 +1,10 @@ -Plomberie -Pros De L’eau +Plomberie +Pros De L’eau 12, Av. la république – 63000 – Clermont-Ferrand 500000 35 25000 -Electricité +Electricite Electro Maître 50, zone industrielle sud – 15000 – Aurillac 450000 @@ -22,12 +22,12 @@ comusolisme 70000 10 10000 -Structure +Structure Eiffage Construction Auvergne 300000 40 20000 -Peinture +Peinture Pingeon et Fils 52, Boulevard Lafayette – 63000 – Clermont-Ferrand 5000 @@ -42,9 +42,9 @@ Léon Grosse Murs illiCO travaux 37, bis Avenue Marx Dormoy – 63000 – Clermont-Ferrand -Finitions +Finitions SGP finition 4, Rue de Chignat – 63000 – Clermont-Ferrand 100 10 -5000 +5000 \ No newline at end of file diff --git a/includes/charge.h b/includes/charge.h index 7471069..736948c 100644 --- a/includes/charge.h +++ b/includes/charge.h @@ -4,14 +4,16 @@ // Chargements char *readAdress(FILE *flot); -Devis loadDevis(Offre *tabTravaux[]); +Offre *initTabTravaux(void); +Offre *loadOffre(void); +Devis loadDevis(FILE *devisFile, Offre tabTravaux[]); Tache **loadTaches(Offre *tabTravaux[]); Precedence *loadPrec(int *tmax, int *tlog); // Recherches et tri -int rechTravaux(char *travauxName, 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); @@ -21,8 +23,8 @@ void triFusionListeDevis(ListeDevis *ldevis, int tlog); // Foncctions 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); diff --git a/includes/main.h b/includes/main.h index debfd8b..995dd2d 100644 --- a/includes/main.h +++ b/includes/main.h @@ -5,5 +5,5 @@ #include "charge.h" -#define tmaxTravaux 8 +#define TMAXTRAV 8 diff --git a/includes/structures.h b/includes/structures.h index 5da93ab..e35356b 100644 --- a/includes/structures.h +++ b/includes/structures.h @@ -1,6 +1,9 @@ +// 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[32]; + char *nomE; char *adresse; int capital; int duree; @@ -43,4 +46,10 @@ typedef struct { char travauxPrec[30]; char travauxSucc[30]; -} Precedence; \ No newline at end of file +} Precedence; + +typedef struct fileAtt +{ + Tache *tac; //Demander si on peut pointeur -> moins lourd + struct fileAtt *nxt; +} ListeAttente; \ No newline at end of file diff --git a/srcs/charge.c b/srcs/charge.c index 6854c4f..3487234 100644 --- a/srcs/charge.c +++ b/srcs/charge.c @@ -2,61 +2,110 @@ /*---------------devis---------------*/ -// Chargement de l'adresse depuis un fichier -char *readAdress(FILE *flot) +// Chargement d'une chaine de caracteres depuis un fichier +char *readFromFile(FILE *file) { - char *adresse, *s, aux[5]; - int i=0, tmax=5; - adresse = (char *)malloc(sizeof(char)*tmax); - fgets(adresse, 5, flot); + char *str; + char *buf; + int len = 0; + int size = 5; + int add = 5; - while (adresse[i]!='\n') - { - if (i==tmax - 1) - { - tmax+=5; - s = (char *)realloc(adresse, tmax*sizeof(char)); - if (s==NULL) - { - printf("\033[0;31mErreur: \033[0mreallocation pour str adresse\n"); - exit(1); - } - adresse=s; - fgets(aux, 5, flot); - strcat(adresse, aux); - } - i++; - } - adresse[strlen(adresse)-1]='\0'; - return adresse; + str = malloc(size); + if (!str) + exit(1); + + while (str[len] != '\n') + { + len = strlen(str); + if (len >= size - 1) + { + size += add; + buf = realloc(str, size); + if (!buf) + { + free(str); + exit(1); + } + str = buf; + } + fgets(str + len, size - len, file); + len = strlen(str) - 1; + } + str[len] = '\0'; + return (str); } // Chargement d'un devis depuis un fichier -Devis loadDevis(Offre *tabTravaux[]) +Devis loadDevis(FILE *devisFile, Offre *tabTravaux) { - Devis d; - FILE *devisFile; - devisFile=fopen("files/devis.txt","r"); - if (devisFile == NULL) - { - printf("\033[0;31mErreur: \033[0mOuverture de devis.txt\n"); - exit(1); - } - char travaux[16]; - int index; - fscanf(devisFile, "%s", travaux); - index = rechTravaux(travaux, tabTravaux); - if (index==-1) - { - printf("\033[0;31mErreur: \033[0mCes travaux ne sont pas prévus !\n"); - exit(1); - } - fgets(d.nomE, 32, devisFile); - d.nomE[strlen(d.nomE)-1] = '\0'; - d.adresse = readAdress(devisFile); - fscanf(devisFile, "%d\n%d\n%d", &d.capital, &d.duree, &d.prix); - fclose(devisFile); - return d; + 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); + + return (d); +} + +// l'initialisation est temporaire, je ne savais pas comment tu voulais la faire -> à partir du file + +// initialisation des travaux +Offre *initTabTravaux(void) +{ + Offre *tabTravaux; + + tabTravaux = (Offre *)malloc(TMAXTRAV * sizeof(Offre)); + if (!tabTravaux) + { + printf("\033[0;31mErreur: \033[0mmalloc tableau tabTravaux\n"); + exit(1); + } + + // Initialisation de chaque élément du tableau + tabTravaux[0] = newOffre("Electricite"); + tabTravaux[1] = newOffre("Finitions"); + tabTravaux[2] = newOffre("Fondation"); + tabTravaux[3] = newOffre("Murs"); + tabTravaux[4] = newOffre("Peinture"); + tabTravaux[5] = newOffre("Plomberie"); + tabTravaux[6] = newOffre("Sols"); + tabTravaux[7] = newOffre("Structure"); + + return (tabTravaux); +} + +// Chagement des ofrres depuis le fichier devis.txt +Offre *loadOffre(void) +{ + Offre *tabTravaux = initTabTravaux(); + + FILE *devisFile; + + devisFile = fopen("files/devis.txt", "r"); + if (!devisFile) + exit(1); + + while (!feof(devisFile)) + loadDevis(devisFile, tabTravaux); + + return (tabTravaux); } @@ -72,7 +121,7 @@ Tache **loadTaches(Offre *tabTravaux[]) printf("\033[0;31mErreur: \033[0mmalloc tableau tache\n"); exit(1); } - for (i=0; idev = (Devis){"Devis6", "Adresse1", 100, 5, 50}; - offre1.ldevis->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); - offre1.ldevis->suiv->dev = (Devis){"Devis3", "Adresse3", 80, 3, 150}; - offre1.ldevis->suiv->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); - offre1.ldevis->suiv->suiv->dev = (Devis){"Devis8", "Adresse2", 120, 7, 10}; - offre1.ldevis->suiv->suiv->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); - offre1.ldevis->suiv->suiv->suiv->dev = (Devis){"Devis5", "Adresse5", 90, 4, 60}; - offre1.ldevis->suiv->suiv->suiv->suiv = (ListeDevis)malloc(sizeof(struct maillonDevis)); - offre1.ldevis->suiv->suiv->suiv->suiv->dev = (Devis){"Devis2", "Adresse2", 110, 6, 15}; - offre1.ldevis->suiv->suiv->suiv->suiv->suiv = NULL; + Offre *tabTravaux; - printf("Avant le tri : \n"); - displayOffre(&offre1); + tabTravaux = loadOffre(); - return (0); + for (int i = 0; i < TMAXTRAV; i++) + { + displayOffre(&tabTravaux[i]); + printf("\n"); + } + + return 0; } diff --git a/srcs/sort.c b/srcs/sort.c index 444dd53..ed4be32 100644 --- a/srcs/sort.c +++ b/srcs/sort.c @@ -1,19 +1,22 @@ + + #include "../includes/main.h" /*-------------recherches-------------*/ // 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=tmaxTravaux-1, mid; + int deb=0, end=TMAXTRAV-1, mid; + 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; @@ -27,7 +30,7 @@ void minTravaux(Offre *tabTravaux[]) { int i; ListeDevis l, minl; - for (i=0; ildevis; minl=l; diff --git a/srcs/structures.c b/srcs/structures.c index 2558373..edbecab 100644 --- a/srcs/structures.c +++ b/srcs/structures.c @@ -8,12 +8,6 @@ ListeDevis newListeDevis(void) return NULL; } -// Initialise une liste de travaux -Liste newListe(void) -{ - return NULL; -} - // Initialise une nouvelle offre Offre newOffre(char *travauxName) { @@ -23,6 +17,12 @@ Offre newOffre(char *travauxName) return o; } +// Initialise une liste (pour les successeurs) +Liste newListe(void) +{ + return NULL; +} + /*------------verifications------------*/ // Verifie l'integrite d'une liste de devis @@ -39,7 +39,7 @@ Booleen emptyOffre(Offre *o) /*-------------insertions---------------*/ -// Insere un devis dans la liste de devis +// Insere un devis en tete de la liste des devis ListeDevis insert(ListeDevis l, Devis d) { MaillonDevis *md; @@ -54,7 +54,8 @@ ListeDevis insert(ListeDevis l, Devis d) return md; } -// Insere une liste dans le tableau de travaux +// Insere en queue de liste (les successeurs) + Liste insertSucc(Liste l, char travaux[]) { MaillonSucc *ms; @@ -149,3 +150,6 @@ void displayListeDevis(ListeDevis l) l=l->suiv; } } + +// Partie 4 (à trier) + diff --git a/tests/test_sort.c b/tests/test_sort.c index 08e7266..70f0cad 100644 --- a/tests/test_sort.c +++ b/tests/test_sort.c @@ -1,5 +1,6 @@ #include "../includes/main.h" + //test tri fusion int main(void) {