diff --git a/file2.txt b/file2.txt new file mode 100644 index 0000000..a619b8e --- /dev/null +++ b/file2.txt @@ -0,0 +1,20 @@ +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024+ +14 7 2 2024+ +14 7 2 2024+ +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 +$ \ No newline at end of file diff --git a/main.c b/main.c index 104d584..0ccf155 100644 --- a/main.c +++ b/main.c @@ -6,11 +6,13 @@ int main() { printf("Starting\n"); srand(time(NULL)); - creneau* edt = import_creneaux("file.txt", 76); + //creneau* edt = import_creneaux("file.txt", 76); + creneau* edt = import_creneaux_oneweek("file2.txt", 19, 4); int len_creneau = 76; - colleur* dudes = import_colleurs("some_data.txt", 13, len_creneau); - int n_colleurs = 13; + //colleur* dudes = import_colleurs("some_data.txt", 13, len_creneau); + colleur* dudes = import_colleurs_oneweek("some_file2.txt", 12, 4, 19); + int n_colleurs = 12; // {char* name; int namelen; topic mat; date* disp; int n_disp;} colleur; diff --git a/output.csv b/output.csv index 81f9ea0..2986720 100644 --- a/output.csv +++ b/output.csv @@ -1,77 +1,77 @@ hour,day,month,year,length,group,colleur,matiere -12,5,2,2024,1,1,Herbaud,Anglais -13,5,2,2024,1,2,Colin,Physique -18,5,2,2024,1,0,none,none -17,6,2,2024,1,4,Poupy,Physique -18,6,2,2024,1,6,Carpintero,Maths -14,7,2,2024,1,7,Mullaert,Maths +12,5,2,2024,1,5,Le_Gourielec,Anglais +13,5,2,2024,1,2,Poupy,Physique +18,5,2,2024,1,6,Chevalier,Physique +17,6,2,2024,1,4,Carpintero,Maths +18,6,2,2024,1,7,Carpintero,Maths +14,7,2,2024,1,6,Rapin,Maths 14,7,2,2024,2,4,Jospin,Info 14,7,2,2024,2,0,none,none 14,7,2,2024,2,0,none,none -15,7,2,2024,1,3,Boully,Maths +15,7,2,2024,1,3,Carpintero,Maths 16,7,2,2024,1,3,Belaggoune,Anglais -17,7,2,2024,1,6,Chibani,Physique -18,7,2,2024,1,5,Le_Gourielec,Anglais -14,8,2,2024,1,4,Rapin,Maths -15,8,2,2024,1,2,Rapin,Maths -18,8,2,2024,1,7,Belaggoune,Anglais +17,7,2,2024,1,7,Le_Gourielec,Anglais +18,7,2,2024,1,0,none,none +14,8,2,2024,1,0,none,none +15,8,2,2024,1,2,Mullaert,Maths +18,8,2,2024,1,4,Poupy,Physique 16,9,2,2024,1,0,none,none 17,9,2,2024,1,0,none,none 18,9,2,2024,1,0,none,none -12,12,2,2024,1,7,Chibani,Physique -13,12,2,2024,1,0,none,none -18,12,2,2024,1,3,Colin,Physique -17,13,2,2024,1,5,Chevalier,Physique -18,13,2,2024,1,0,none,none -14,14,2,2024,1,6,Mann,Anglais +12,12,2,2024,1,5,Chibani,Physique +13,12,2,2024,1,6,Mann,Anglais +18,12,2,2024,1,1,Chevalier,Physique +17,13,2,2024,1,7,Chevalier,Physique +18,13,2,2024,1,3,Chibani,Physique +14,14,2,2024,1,0,none,none 14,14,2,2024,2,3,Jospin,Info -14,14,2,2024,2,7,Jospin,Info 14,14,2,2024,2,0,none,none -15,14,2,2024,1,7,Rapin,Maths -16,14,2,2024,1,5,Mullaert,Maths -17,14,2,2024,1,1,Rapin,Maths -18,14,2,2024,1,1,Chevalier,Physique +14,14,2,2024,2,7,Jospin,Info +15,14,2,2024,1,3,Boully,Maths +16,14,2,2024,1,4,Rapin,Maths +17,14,2,2024,1,0,none,none +18,14,2,2024,1,5,Boully,Maths 14,15,2,2024,1,2,Belaggoune,Anglais -15,15,2,2024,1,3,Rapin,Maths -18,15,2,2024,1,4,Boully,Maths -16,16,2,2024,1,0,none,none +15,15,2,2024,1,1,Boully,Maths +18,15,2,2024,1,4,Belaggoune,Anglais +16,16,2,2024,1,7,Carpintero,Maths 17,16,2,2024,1,0,none,none 18,16,2,2024,1,0,none,none -12,19,2,2024,1,0,none,none -13,19,2,2024,1,7,Herbaud,Anglais -18,19,2,2024,1,0,none,none -17,20,2,2024,1,4,Mullaert,Maths -18,20,2,2024,1,6,Boully,Maths -14,21,2,2024,1,0,none,none +12,19,2,2024,1,1,Belaggoune,Anglais +13,19,2,2024,1,4,Rapin,Maths +18,19,2,2024,1,2,Mullaert,Maths +17,20,2,2024,1,5,Boully,Maths +18,20,2,2024,1,6,Carpintero,Maths +14,21,2,2024,1,7,Herbaud,Anglais 14,21,2,2024,2,2,Jospin,Info 14,21,2,2024,2,6,Jospin,Info 14,21,2,2024,2,0,none,none -15,21,2,2024,1,1,Mullaert,Maths -16,21,2,2024,1,2,Chibani,Physique +15,21,2,2024,1,2,Poupy,Physique +16,21,2,2024,1,5,Herbaud,Anglais 17,21,2,2024,1,3,Belaggoune,Anglais -18,21,2,2024,1,5,Mann,Anglais -14,22,2,2024,1,4,Colin,Physique -15,22,2,2024,1,2,Mullaert,Maths -18,22,2,2024,1,1,Mann,Anglais -16,23,2,2024,1,5,Mullaert,Maths +18,21,2,2024,1,1,Rapin,Maths +14,22,2,2024,1,6,Chibani,Physique +15,22,2,2024,1,0,none,none +18,22,2,2024,1,4,Chevalier,Physique +16,23,2,2024,1,0,none,none 17,23,2,2024,1,0,none,none 18,23,2,2024,1,0,none,none -12,26,2,2024,1,7,Chevalier,Physique -13,26,2,2024,1,1,Rapin,Maths -18,26,2,2024,1,2,Belaggoune,Anglais -17,27,2,2024,1,6,Rapin,Maths -18,27,2,2024,1,3,Boully,Maths -14,28,2,2024,1,3,Poupy,Physique +12,26,2,2024,1,3,Poupy,Physique +13,26,2,2024,1,5,Chibani,Physique +18,26,2,2024,1,7,Rapin,Maths +17,27,2,2024,1,1,Chevalier,Physique +18,27,2,2024,1,3,Carpintero,Maths +14,28,2,2024,1,4,Herbaud,Anglais 14,28,2,2024,2,1,Jospin,Info 14,28,2,2024,2,5,Jospin,Info 14,28,2,2024,2,0,none,none -15,28,2,2024,1,2,Rapin,Maths -16,28,2,2024,1,4,Mann,Anglais -17,28,2,2024,1,5,Mullaert,Maths -18,28,2,2024,1,6,Mann,Anglais -14,29,2,2024,1,7,Carpintero,Maths -15,29,2,2024,1,5,Chevalier,Physique -18,29,2,2024,1,1,Chibani,Physique +15,28,2,2024,1,5,Boully,Maths +16,28,2,2024,1,6,Mullaert,Maths +17,28,2,2024,1,7,Poupy,Physique +18,28,2,2024,1,2,Carpintero,Maths +14,29,2,2024,1,1,Mullaert,Maths +15,29,2,2024,1,2,Belaggoune,Anglais +18,29,2,2024,1,6,Herbaud,Anglais 16,1,3,2024,1,0,none,none 17,1,3,2024,1,0,none,none 18,1,3,2024,1,0,none,none diff --git a/some_file2.txt b/some_file2.txt new file mode 100644 index 0000000..d7df74a --- /dev/null +++ b/some_file2.txt @@ -0,0 +1,265 @@ +Mullaert +MATH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Rapin +MATH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Carpintero +MATH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Boully +MATH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Chevalier +PHYSICS +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Poupy +PHYSICS +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Chibani +PHYSICS +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Belaggoune +ENGLISH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Mann +ENGLISH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Herbaud +ENGLISH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Le_Gourielec +ENGLISH +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +Jospin +INFO +12 5 2 2024 +13 5 2 2024 +18 5 2 2024 +17 6 2 2024 +18 6 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +14 7 2 2024 +15 7 2 2024 +16 7 2 2024 +17 7 2 2024 +18 7 2 2024 +14 8 2 2024 +15 8 2 2024 +18 8 2 2024 +16 9 2 2024 +17 9 2 2024 +18 9 2 2024 ++ +$ \ No newline at end of file diff --git a/structure.c b/structure.c index e44c96c..a10745e 100644 --- a/structure.c +++ b/structure.c @@ -67,7 +67,10 @@ int date_dist(date d1, date d2) { /* returns distance between d1 and d2 in days bool is_sorted(creneau* edt, int len) { for(int i = 1; i < len; i++) { if(date_dist(edt[i-1].date, edt[i].date) == -1) { - printf("Anomaly detected at lane %d (dates are not sorted in ascending order)\n", i); + printf("Anomaly detected at lane %d (dates are not sorted in ascending order) : \n", i); + printf("%d %d %d %d\n", edt[i-1].date.hour, edt[i-1].date.day, edt[i-1].date.month, edt[i-1].date.year); + printf("%d %d %d %d\n", edt[i].date.hour, edt[i].date.day, edt[i].date.month, edt[i].date.year); + printf("%d %d %d %d\n", edt[i+1].date.hour, edt[i+1].date.day, edt[i+1].date.month, edt[i+1].date.year); return false; } } @@ -252,5 +255,221 @@ colleur* import_colleurs(char* filename, int n_colleurs, int max_available) { fclose(ptr); free(word); + return res; +} + +date increment_date(date d, int inc) { + int remaining = inc; + date res = d; + int delta_day = 0; + while(remaining > 0) { + res.day++; + delta_day = (res.month == 1 || res.month == 3 || res.month == 5 || res.month == 7 || res.month == 8 || res.month == 10 || res.month == 12) - 2*(res.month == 2) + (res.month == 2 && res.year%4 == 0 && res.year%100 != 0); + // sweet jesus + if(res.day > 30 + delta_day) { + res.day = 1; + if(res.month == 12) { + res.month = 1; + res.year++; + } else { + res.month++; + } + } + remaining--; + } + return res; +} + +creneau* import_creneaux_oneweek(char* filename, int len_file, int n_weeks) { + // import creneau data from a file then copy paste it for specified amount of weeks + FILE* ptr = fopen(filename, "r"); + char c = fgetc(ptr); + + creneau* edt = malloc(sizeof(creneau)*len_file*n_weeks); + int i = 0; + int to_fill = 0; + + int buffer = 0; + + while(c != EOF && c != '$') { + if((int)(c) >= 48 && (int)(c) <= 57) { + buffer *= 10; + buffer += (int)(c) - 48; + } else { + if(to_fill == 0) { + //printf("%d\n", i); + edt[i].date.hour = buffer; + edt[i].group = 0; + edt[i].name = malloc(sizeof(char)*35); + edt[i].name[0] = 'n'; + edt[i].name[1] = 'o'; + edt[i].name[2] = 'n'; + edt[i].name[3] = 'e'; + edt[i].name[4] = '\0'; + edt[i].namelen = 4; + edt[i].mat = NOTHING; + edt[i].salle.building = 'N'; + edt[i].salle.id = 0; + edt[i].length = 1; + } else if(to_fill == 1) { + edt[i].date.day = buffer; + } else if(to_fill == 2) { + edt[i].date.month = buffer; + } else if(to_fill == 3) { + edt[i].date.year = buffer; + } else { + edt[i].length++; + } + to_fill++; + buffer = 0; + if(c == '\n') { + i++; + to_fill = 0; + } + } + c = fgetc(ptr); + } + fclose(ptr); + + for(int k = 1; k < n_weeks; k++) { + for(int i = 0; i < len_file; i++) { + edt[k*len_file+i].date = increment_date(edt[i].date, 7*k); + edt[k*len_file+i].group = 0; + edt[k*len_file+i].name = malloc(sizeof(char)*35); + edt[k*len_file+i].name[0] = 'n'; + edt[k*len_file+i].name[1] = 'o'; + edt[k*len_file+i].name[2] = 'n'; + edt[k*len_file+i].name[3] = 'e'; + edt[k*len_file+i].name[4] = '\0'; + edt[k*len_file+i].namelen = 4; + edt[k*len_file+i].mat = NOTHING; + edt[k*len_file+i].salle.building = 'N'; + edt[k*len_file+i].salle.id = 0; + edt[k*len_file+i].length = edt[i].length; + } + } + + /*for(int k = 0; k < len_file*n_weeks; k++) { + printf("%d %d %d %d\n", edt[k].date.hour, edt[k].date.day, edt[k].date.month, edt[k].date.year); + }*/ + + if(!is_sorted(edt, n_weeks*len_file)) { + assert(0); + } + printf("Imported creneaux successfully\n"); + return edt; +} + +void expand(colleur* guy, int id, int n_horaires, int n_weeks) { + date* horaires = guy[id].disp; + date* res = malloc(sizeof(date)*n_horaires*n_weeks); + for (int i = 0; i < n_horaires; i++) { + res[i] = horaires[i]; + } + for(int k = 1; k < n_weeks; k++) { + for(int i = 0; i < n_horaires; i++) { + res[k*n_horaires+i] = increment_date(res[i], 7*k); + } + } + + /*for(int i = 0; i < n_horaires*n_weeks; i++) { + printf("%d %d %d %d\n", res[i].hour, res[i].day, res[i].month, res[i].year); + } + printf("\n\n");*/ + + free(guy[id].disp); + guy[id].disp = res; + guy[id].n_disp = n_weeks*n_horaires; +} + +colleur* import_colleurs_oneweek(char* filename, int n_colleurs, int n_weeks, int len_oneweek) { + // same as before, but each colleur only set his/her creneaux for the 1st week + FILE* ptr = fopen(filename, "r"); + char c = fgetc(ptr); + // {char* name; int namelen; topic mat; date* disp; int n_disp;} + colleur* res = malloc(sizeof(colleur)*n_colleurs); + + char* word = malloc(sizeof(char)*30); + int wordlen = 0; + + int buffer = 0; + + int date_ptr = 0; + + int current = 0; // 0 = name, 1 = mat, 2+ = dates + int colleur_ptr = 0; + + while(c != EOF && c != '$') { + if(c == '\n') { + if(current == 0) { + word[wordlen] = '\0'; + res[colleur_ptr].name = malloc(sizeof(char)*30); + str_copy(word, wordlen, res[colleur_ptr].name); + res[colleur_ptr].namelen = wordlen; + } else if(current == 1) { + if(word[0] == 'M') { // math + res[colleur_ptr].mat = MATH; + } else if(word[0] == 'P') { // physics + res[colleur_ptr].mat = PHYSICS; + } else if(word[0] == 'E') { // english + res[colleur_ptr].mat = ENGLISH; + } else if(word[0] == 'I') { // info + res[colleur_ptr].mat = INFO; + } else { + word[wordlen] = '\0'; + printf("Wait that's illegal (%s)\n", word); + assert(0); + } + res[colleur_ptr].disp = malloc(sizeof(date)*len_oneweek); + } else { + res[colleur_ptr].disp[current-2].year = buffer; + } + current++; + wordlen = 0; + buffer = 0; + date_ptr = 0; + } else if(c == '+') { + res[colleur_ptr].n_disp = current-2; + current = 0; + colleur_ptr++; + + c = fgetc(ptr); // always a '\n', this to avoid some seg fault + } else { + if(current <= 1) { + word[wordlen] = c; + wordlen++; + } else { + if((int)(c) >= 48 && (int)(c) <= 57) { + buffer *= 10; + buffer += (int)(c) - 48; + } else { + if(date_ptr == 0) { + res[colleur_ptr].disp[current-2].hour = buffer; + } else if(date_ptr == 1) { + res[colleur_ptr].disp[current-2].day = buffer; + } else if(date_ptr == 2) { + res[colleur_ptr].disp[current-2].month = buffer; + } else { + printf("Oh no (%d)\n", date_ptr); + assert(0); + } + buffer = 0; + date_ptr++; + } + } + } + //printf("%c", c); + c = fgetc(ptr); + } + // {char* name; int namelen; topic mat; date* disp; int n_disp;} + + for(int c = 0; c < n_colleurs; c++) { + expand(res, c, len_oneweek, n_weeks); + } + + printf("Imported colleurs with no problems\n"); + fclose(ptr); + free(word); + return res; } \ No newline at end of file