diff --git a/main.exe b/main.exe index 8fc8b69..0dde0f8 100644 Binary files a/main.exe and b/main.exe differ diff --git a/singleFile.c b/singleFile.c index 7945a10..e577f60 100644 --- a/singleFile.c +++ b/singleFile.c @@ -16,6 +16,8 @@ struct listenerList; +//Structure permettant de stocker les conférences, le champs listeners correspond à une liste de pointeurs d'abonnés. + typedef struct conf { int id; @@ -35,6 +37,8 @@ typedef struct confList struct confList *next; } tConfList; +//Structure permettant de stocker les abonnés, le champs confs correspond à une liste de pointeurs de conférences. + typedef struct listener { int id; @@ -76,6 +80,8 @@ int participateToConf(ptConf confChain, ptListener listenerChain, int confId, in int confGradeAvg(ptConf conf); int confParticipations(ptConf conf); +//fonction permettant de trouver un id de conférence libre. + int findConfId(ptConf confChain) { ptConf px = confChain; @@ -94,6 +100,9 @@ int findConfId(ptConf confChain) return max + 1; } +//fonction permettant de créer une liste de conférences vide. +//nous ajoutons un élément vide afin de grandement décomplexifier la suppression de conférences. + ptConf newConfChain() { ptConf confChain = (ptConf)malloc(sizeof(tConf)); @@ -105,6 +114,8 @@ ptConf newConfChain() return confChain; } +//fonction permettant d'ajouter une conférence à une liste de conférences. + void addConf(ptConf confChain, int id, char title[], char speaker[], int day, int month, int year) { ptConf px = confChain; @@ -128,8 +139,12 @@ void addConf(ptConf confChain, int id, char title[], char speaker[], int day, in px->next->next = NULL; } +//fonction permettant de supprimer une conférence d'une liste de conférences. + void removeConf(ptConf confChain, int id) { + //on recherche la conférence à supprimer. + ptConf px = confChain; while (px->next != NULL && px->next->id != id) @@ -139,6 +154,8 @@ void removeConf(ptConf confChain, int id) if (px->next != NULL && px->next->id == id) { + //on supprime la conférence de tous les abonnés qui y ont participé. + ptListenerList py = px->next->listeners->next; while (py->next != NULL) @@ -147,12 +164,16 @@ void removeConf(ptConf confChain, int id) py = py->next; } + //on supprime la conférence de la liste de conférences. + ptConf tmp = px->next->next; free(px->next); px->next = tmp; } } +//fonction permettant de trouver un id d'abonné libre. + int findListenerId(ptListener listenerChain) { ptListener px = listenerChain; @@ -171,6 +192,9 @@ int findListenerId(ptListener listenerChain) return max + 1; } +//fonction permettant de créer une liste d'abonnés vide. +//nous ajoutons un élément vide afin de grandement décomplexifier la suppression d'abonnés. + ptListener newListenerChain() { ptListener listenerChain = (ptListener)malloc(sizeof(tListener)); @@ -184,6 +208,8 @@ ptListener newListenerChain() return listenerChain; } +//fonction permettant d'ajouter un abonné à une liste d'abonnés. + int addListener(ptListener listenerChain, int id, char name[], int age, int level) { if (level < 0 || level > 5) @@ -212,8 +238,12 @@ int addListener(ptListener listenerChain, int id, char name[], int age, int leve return 0; } +//fonction permettant de supprimer un abonné d'une liste d'abonnés. + void removeListener(ptListener listenerChain, int id) { + //on recherche l'abonné à supprimer. + ptListener px = listenerChain; while (px->next != NULL && px->next->id != id) @@ -223,6 +253,8 @@ void removeListener(ptListener listenerChain, int id) if (px->next != NULL && px->next->id == id) { + //on supprime l'abonné de toutes les conférences auxquelles il a participé. + ptConfList py = px->next->confs->next; while (py->next != NULL) @@ -231,6 +263,8 @@ void removeListener(ptListener listenerChain, int id) py = py->next; } + //on supprime l'abonné de la liste d'abonnés. + ptListener tmp = px->next->next; free(px->next); px->next = tmp; @@ -238,6 +272,8 @@ void removeListener(ptListener listenerChain, int id) } } +//fonction permettant d'ajouter une conférence à une liste de conférences. + void addConfToConfList(ptConfList confList, ptConf conf, int grade) { ptConfList px = confList; @@ -253,6 +289,8 @@ void addConfToConfList(ptConfList confList, ptConf conf, int grade) px->next->next = NULL; } +//fonction permettant de supprimer une conférence d'une liste de conférences. + void removeConfFromConfList(ptConfList confList, ptConf conf) { ptConfList px = confList; @@ -270,6 +308,8 @@ void removeConfFromConfList(ptConfList confList, ptConf conf) } } +//fonction permettant d'afficher une liste de conférences. + void printConfList(ptConfList confList) { ptConfList px = confList; @@ -283,6 +323,8 @@ void printConfList(ptConfList confList) printf("\n"); } +//fonction permettant d'ajouter un abonné à une liste d'abonnés. + void addListenerToListenerList(ptListenerList listenerList, ptListener listener, int grade) { ptListenerList px = listenerList; @@ -298,6 +340,8 @@ void addListenerToListenerList(ptListenerList listenerList, ptListener listener, px->next->next = NULL; } +//fonction permettant de supprimer un abonné d'une liste d'abonnés. + void removeListenerFromListenerList(ptListenerList listenerList, ptListener listener) { ptListenerList px = listenerList; @@ -315,6 +359,8 @@ void removeListenerFromListenerList(ptListenerList listenerList, ptListener list } } +//fonction permettant d'afficher une liste d'abonnés. + void printListenerList(ptListenerList listenerList) { ptListenerList px = listenerList; @@ -328,8 +374,12 @@ void printListenerList(ptListenerList listenerList) printf("\n"); } +//fonction permettant à un abonné de participer à une conférence. + int participateToConf(ptConf confChain, ptListener listenerChain, int confId, int listenerId, int grade) { + //on vérifie que la note est comprise entre 0 et 5 et que l'abonné n'a pas déjà participé à la conférence. + if (grade < 0 || grade > 5) { return -1; @@ -364,12 +414,16 @@ int participateToConf(ptConf confChain, ptListener listenerChain, int confId, in return -2; } + //on ajoute la conférence à la liste de conférences de l'abonné et l'abonné à la liste d'abonnés de la conférence. + addListenerToListenerList(px->listeners, py, grade); addConfToConfList(py->confs, px, grade); return 0; } +//fonction permettant de calculer la moyenne des notes d'une conférence. + int confGradeAvg(ptConf conf) { ptListenerList px = conf->listeners->next; @@ -392,6 +446,8 @@ int confGradeAvg(ptConf conf) } } +//fonction permettant de calculer le nombre de participants à une conférence. + int confParticipations(ptConf conf) { ptListenerList px = conf->listeners->next; @@ -417,18 +473,26 @@ void saveConf(ptConf confChain); void saveListeners(ptListener listenerChain); void saveRelations(ptConf confChain); +//fonction permettant de lire les conférences dans le fichier ./data/confs. + void readConfs(ptConf confChain) { + //on ouvre le fichier ./data/confs. + FILE *file = fopen("./data/confs", "r"); char line[100]; char *token; + //on vérifie que le fichier a bien été ouvert. + if (file == NULL) { printf("ça marche pas."); return; } + //on lit le fichier ligne par ligne et on ajoute les conférences à la liste de conférences. + while (fgets(line, sizeof(line), file)) { int id = atoi(strtok(line, ",")); @@ -441,21 +505,31 @@ void readConfs(ptConf confChain) addConf(confChain, id, title, speaker, day, month, year); } + //on ferme le fichier. + fclose(file); } +//fonction permettant de lire les abonnés dans le fichier ./data/listeners. + void readListeners(ptListener listenerChain) { + //on ouvre le fichier ./data/listeners. + FILE *file = fopen("./data/listeners", "r"); char line[100]; char *token; + //on vérifie que le fichier a bien été ouvert. + if (file == NULL) { printf("ça marche pas."); return; } + //on lit le fichier ligne par ligne et on ajoute les abonnés à la liste d'abonnés. + while (fgets(line, sizeof(line), file)) { int id = atoi(strtok(line, ",")); @@ -465,22 +539,32 @@ void readListeners(ptListener listenerChain) addListener(listenerChain, id, name, day, month); } + //on ferme le fichier. + fclose(file); } +//fonction permettant de lire les relations entre conférences et abonnés dans le fichier ./data/relations. + void readRelations(ptConf confChain, ptListener listenerChain) { + //on ouvre le fichier ./data/relations. + FILE *file = fopen("./data/relations", "r"); char line[100]; char *token1; char *token2; + //on vérifie que le fichier a bien été ouvert. + if (file == NULL) { printf("ça marche pas."); return; } + //on lit le fichier ligne par ligne et on ajoute les relations entre conférences et abonnés. + while (fgets(line, sizeof(line), file)) { int confId = atoi(strtok(line, ":")); @@ -491,39 +575,68 @@ void readRelations(ptConf confChain, ptListener listenerChain) } } + //on ferme le fichier. + fclose(file); } +//fonction permettant d'écrire les conférences dans le fichier ./data/confs. + void saveConf(ptConf confChain) { + //on ouvre le fichier ./data/confs. + FILE *file = fopen("./data/confs", "w"); ptConf px = confChain; + + //on écrit les conférences dans le fichier. + while (px->next != NULL) { fprintf(file, "%d,%s,%s,%d,%d,%d\n", px->id, px->title, px->speaker, px->day, px->month, px->year); px = px->next; } + + //on ferme le fichier. + fclose(file); } +//fonction permettant d'écrire les abonnés dans le fichier ./data/listeners. + void saveListeners(ptListener listenerChain) { + //on ouvre le fichier ./data/listeners. + FILE *file = fopen("./data/listeners", "w"); ptListener px = listenerChain; + + //on écrit les abonnés dans le fichier. + while (px->next != NULL) { fprintf(file, "%d,%s,%d,%d\n", px->id, px->name, px->age, px->level); px = px->next; } + + //on ferme le fichier. + fclose(file); } +//fonction permettant d'écrire les relations entre conférences et abonnés dans le fichier ./data/relations. + void saveRelations(ptConf confChain) { + //on ouvre le fichier ./data/relations. + FILE *file = fopen("./data/relations", "w"); ptConf px = confChain; ptListenerList py; printf("test"); + + //on écrit les relations entre conférences et abonnés dans le fichier. + while (px->next != NULL) { printf("test"); @@ -550,6 +663,9 @@ void saveRelations(ptConf confChain) px = px->next; } + + //on ferme le fichier. + fclose(file); } @@ -567,6 +683,8 @@ void menuConf(ptConf confChain, ptListener listenerChain); void menuAbo(ptConf confChain, ptListener listenerChain); void menu(ptConf confChain, ptListener listenerChain); +//fonction permettant de déplacer le curseur à des coordonnées données. + void goToCoords(int x, int y) { COORD coords; @@ -577,6 +695,8 @@ void goToCoords(int x, int y) SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coords); } +//fonction permettant de dessiner une ligne horizontale dans la console. + void drawHoryLine(char c, int lenght) { int i = 0; @@ -588,6 +708,8 @@ void drawHoryLine(char c, int lenght) } } +//fonction permettant de dessiner une ligne verticale dans la console. + void drawVertiLine(char c, int lenght) { CONSOLE_SCREEN_BUFFER_INFO info; @@ -605,6 +727,8 @@ void drawVertiLine(char c, int lenght) } } +//fonction permettant de dessiner un rectangle à partir d'un point de départ, d'une longueur et d'une hauteur. + void drawRectangle(int x, int y, int lenght, int height) { goToCoords(x, y); @@ -621,8 +745,12 @@ void drawRectangle(int x, int y, int lenght, int height) printf("%c", 188); } +//fonction permettant de dessiner un menu à partir d'un tableau de chaînes de caractères. + void drawMenu(char *options[], int lenght) { + //on calcule la longueur de la chaîne la plus longue. + int max = strlen(options[0]); int i; @@ -634,13 +762,19 @@ void drawMenu(char *options[], int lenght) } } + //on récupère la taille de la console. + CONSOLE_SCREEN_BUFFER_INFO info; GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info); int columns = info.srWindow.Right - info.srWindow.Left + 1; int rows = info.srWindow.Bottom - info.srWindow.Top + 1; + //on dessine le rectangle. + drawRectangle((columns - max - 4) / 2, 2, max + 4, lenght + 4); + //on écrit les options. + for (i = 0; i < lenght; i++) { goToCoords((columns - max - 4) / 2 + 2, 4 + i); @@ -648,40 +782,53 @@ void drawMenu(char *options[], int lenght) } } -/* - ( ) ( ) ) - ) ( ) ( ( - ( ) ( ) ) - _____________ - <_____________> ___ - | |/ _ \ - | | | | - | |_| | - ___| |\___/ -/ \___________/ \ -\_____________________/ -*/ +//+---------------------------+ +//| | +//| ( ) ( ) ) | +//| ) ( ) ( ( | +//| ( ) ( ) ) | +//| _____________ | +//| <_____________> ___ | +//| | |/ _ \ | +//| | | | | | +//| | |_| | | +//| ___| |\___/ | +//| / \___________/ \ | +//| \_____________________/ | +//| | +//+---------------------------+ + +//fonction permettant d'afficher un tasse. void tasse() { printf(" ( ) ( ) )\n ) ( ) ( (\n ( ) ( ) )\n _____________\n <_____________> ___\n | |/ _ \\\n | | | |\n | |_| |\n ___| |\\___/\n/ \\___________/ \\\n\\_____________________/\n"); } +//fonction permettant d'afficher le menu des conférences. + void menuConf(ptConf confChain, ptListener listenerChain) { + //on affiche le menu. + char *options[] = {"1/ Voir la liste des conferences", "2/ Ajouter une conference", "3/ Supprimer une conference", "4/ Supprimer les conferences inferieures a une date", "5/ Retour"}; system("cls"); drawMenu(options, 5); goToCoords(0, 13); tasse(); printf("\n"); + + //on récupère le choix de l'utilisateur. + printf("Que voulez-vous faire ? : "); int choice; scanf("%d", &choice); + //on effectue l'action correspondante. + switch (choice) { - case 1: + case 1: //on affiche la liste des conférences. { ptConf px = confChain->next; @@ -707,7 +854,7 @@ void menuConf(ptConf confChain, ptListener listenerChain) break; } - case 2: + case 2: //on ajoute une conférence. { int id, day, month, year; char title[30]; @@ -731,7 +878,7 @@ void menuConf(ptConf confChain, ptListener listenerChain) break; } - case 3: + case 3: //on supprime une conférence. { ptConf px = confChain->next; @@ -755,7 +902,7 @@ void menuConf(ptConf confChain, ptListener listenerChain) break; } - case 4: + case 4: //on supprime les conférences inférieures à une date. { ptConf px = confChain->next; @@ -802,7 +949,7 @@ void menuConf(ptConf confChain, ptListener listenerChain) menuConf(confChain, listenerChain); } - case 5: + case 5: //on retourne au menu principal. menu(confChain, listenerChain); break; @@ -811,21 +958,30 @@ void menuConf(ptConf confChain, ptListener listenerChain) } } +//fonction permettant d'afficher le menu des abonnés. + void menuAbo(ptConf confChain, ptListener listenerChain) { + //on affiche le menu. + char *options[] = {"1/ Voir la liste des abonnes", "2/ Ajouter un abonne", "3/ Suprimer un abonne", "4/ Retour"}; system("cls"); drawMenu(options, 4); goToCoords(0, 12); tasse(); printf("\n"); + + //on récupère le choix de l'utilisateur. + printf("Que voulez-vous faire ? : "); int choice; scanf("%d", &choice); + //on effectue l'action correspondante. + switch (choice) { - case 1: + case 1: //on affiche la liste des abonnés. { ptListener py = listenerChain->next; @@ -844,7 +1000,7 @@ void menuAbo(ptConf confChain, ptListener listenerChain) break; } - case 2: + case 2: //on ajoute un abonné. { int id, age, level; char name[20]; @@ -870,7 +1026,7 @@ void menuAbo(ptConf confChain, ptListener listenerChain) break; } - case 3: + case 3: //on supprime un abonné. { ptListener px = listenerChain->next; @@ -894,7 +1050,7 @@ void menuAbo(ptConf confChain, ptListener listenerChain) break; } - case 4: + case 4: //on retourne au menu principal. menu(confChain, listenerChain); break; @@ -903,29 +1059,38 @@ void menuAbo(ptConf confChain, ptListener listenerChain) } } +//fonction permettant d'afficher le menu principal. + void menu(ptConf confChain, ptListener listenerChain) { + //on affiche le menu. + char *options[] = {"1/ Gestion des conferences", "2/ Gestion des abonnes", "3/ Participer a une conference", "4/ Voir la meilleure conference", "5/ Quitter"}; system("cls"); drawMenu(options, 5); goToCoords(0, 13); tasse(); printf("\n"); + + //on récupère le choix de l'utilisateur. + printf("Que voulez-vous faire ? : "); int choice; scanf("%d", &choice); + //on effectue l'action correspondante. + switch (choice) { - case 1: + case 1: //on affiche le menu des conférences. menuConf(confChain, listenerChain); break; - case 2: + case 2: //on affiche le menu des abonnés. menuAbo(confChain, listenerChain); break; - case 3: + case 3: //on permet à un abonné de participer à une conférence. { ptConf px = confChain->next; ptListener py = listenerChain->next; @@ -966,7 +1131,7 @@ void menu(ptConf confChain, ptListener listenerChain) break; } - case 4: + case 4: //on affiche la meilleure conférence. { ptConf px = confChain -> next; int max = confGradeAvg(px); @@ -992,7 +1157,7 @@ void menu(ptConf confChain, ptListener listenerChain) break; } - case 5: + case 5: //on quitte le programme. break; default: @@ -1004,14 +1169,23 @@ void menu(ptConf confChain, ptListener listenerChain) //| Main function | //+----------------------------------------+ +//fonction main. + int main() { + //on initialise les listes de conférences et d'abonnés. + ptConf confChain = newConfChain(); ptListener listenerChain = newListenerChain(); + //on lit les fichiers de données. + readConfs(confChain); readListeners(listenerChain); readRelations(confChain, listenerChain); + + //on affiche le menu principal. + menu(confChain, listenerChain); return 0;