From 6d363c7becf68b3076dd6da038119f9886db311a Mon Sep 17 00:00:00 2001 From: Lukian LEIZOUR Date: Wed, 6 Dec 2023 19:22:05 +0100 Subject: [PATCH] commit --- .gitignore | 1 - singleFile.c | 1192 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 1192 insertions(+), 1 deletion(-) create mode 100644 singleFile.c diff --git a/.gitignore b/.gitignore index 94c44fe..d5417f3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ -singleFile.c main.exe .vscode/ dataBackup/ \ No newline at end of file diff --git a/singleFile.c b/singleFile.c new file mode 100644 index 0000000..e577f60 --- /dev/null +++ b/singleFile.c @@ -0,0 +1,1192 @@ +//+--------------------------------------------------------------------------------+ +//| | +//| Ce projet réalisé par Victor PASGRIMAUD et Lukian LEIZOUR avant le 01/12/2023. | +//| Il permet de stocker des conférences ainsi que des abonnés qui y participent. | +//| | +//+--------------------------------------------------------------------------------+ + +#include +#include +#include +#include + +//+----------------------------------------+ +//| Conf management | +//+----------------------------------------+ + +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; + char title[30]; + char speaker[20]; + int day; + int month; + int year; + struct listenerList *listeners; + struct conf *next; +} tConf; + +typedef struct confList +{ + struct conf *conf; + int grade; + 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; + char name[20]; + int age; + int level; + struct confList *confs; + struct listener *prev; + struct listener *next; +} tListener; + +typedef struct listenerList +{ + struct listener *listener; + int grade; + struct listenerList *next; +} tListenerList; + +typedef tConf *ptConf; +typedef tListener *ptListener; +typedef tConfList *ptConfList; +typedef tListenerList *ptListenerList; + +int findConfId(ptConf confChain); +ptConf newConfChain(); +void addConf(ptConf confChain, int id, char title[], char speaker[], int day, int month, int year); +void removeConf(ptConf confChain, int id); +int findListenerId(ptListener listenerChain); +ptListener newListenerChain(); +int addListener(ptListener listenerChain, int id, char name[], int age, int level); +void removeListener(ptListener listenerChain, int id); +void addConfToConfList(ptConfList confList, ptConf conf, int grade); +void removeConfFromConfList(ptConfList confList, ptConf conf); +void printConfList(ptConfList confList); +void addListenerToListenerList(ptListenerList listenerList, ptListener listener, int grade); +void removeListenerFromListenerList(ptListenerList listenerList, ptListener listener); +void printListenerList(ptListenerList listenerList); +int participateToConf(ptConf confChain, ptListener listenerChain, int confId, int listenerId, int grade); +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; + int max = 0; + + while (px->next != NULL) + { + if (px->id > max) + { + max = px->id; + } + + px = px->next; + } + + 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)); + + confChain->next = (ptConf)malloc(sizeof(tConf)); + confChain->next->next = NULL; + confChain->id = -1; + + 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; + + while (px->next != NULL) + { + px = px->next; + } + + px->id = id; + px->day = day; + px->month = month; + px->year = year; + strcpy(px->title, title); + strcpy(px->speaker, speaker); + px->listeners = (ptListenerList)malloc(sizeof(tListenerList)); + px->listeners->next = (ptListenerList)malloc(sizeof(tListenerList)); + px->listeners->listener = NULL; + px->listeners->next->next = NULL; + px->next = (ptConf)malloc(sizeof(tConf)); + 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) + { + px = px->next; + } + + 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) + { + removeConfFromConfList(py->listener->confs, px->next); + 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; + int max = 0; + + while (px->next != NULL) + { + if (px->id > max) + { + max = px->id; + } + + px = px->next; + } + + 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)); + + listenerChain->prev = NULL; + listenerChain->next = (ptListener)malloc(sizeof(tListener)); + listenerChain->next->prev = listenerChain; + listenerChain->next->next = NULL; + listenerChain->id = -1; + + 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) + { + return -1; + } + + ptListener px = listenerChain; + + while (px->next != NULL) + { + px = px->next; + } + + px->id = id; + strcpy(px->name, name); + px->age = age; + px->level = level; + px->confs = (ptConfList)malloc(sizeof(tConfList)); + px->confs->next = (ptConfList)malloc(sizeof(tConfList)); + px->confs->conf = NULL; + px->confs->next->next = NULL; + px->next = (ptListener)malloc(sizeof(tListener)); + px->next->next = NULL; + px->next->prev = px; + 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) + { + px = px->next; + } + + 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) + { + removeListenerFromListenerList(py->conf->listeners, px->next); + py = py->next; + } + + //on supprime l'abonné de la liste d'abonnés. + + ptListener tmp = px->next->next; + free(px->next); + px->next = tmp; + px->next->prev = px; + } +} + +//fonction permettant d'ajouter une conférence à une liste de conférences. + +void addConfToConfList(ptConfList confList, ptConf conf, int grade) +{ + ptConfList px = confList; + + while (px->next != NULL) + { + px = px->next; + } + + px->conf = conf; + px->next = (ptConfList)malloc(sizeof(tConfList)); + px->grade = 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; + + while (px->next != NULL && px->next->conf != conf) + { + px = px->next; + } + + if (px->next != NULL && px->next->conf == conf) + { + ptConfList tmp = px->next->next; + free(px->next); + px->next = tmp; + } +} + +//fonction permettant d'afficher une liste de conférences. + +void printConfList(ptConfList confList) +{ + ptConfList px = confList; + + printf("Participation aux conferences : "); + while (px->next != NULL) + { + printf("%s(%d) ", px->conf->title, px->grade); + px = px->next; + } + printf("\n"); +} + +//fonction permettant d'ajouter un abonné à une liste d'abonnés. + +void addListenerToListenerList(ptListenerList listenerList, ptListener listener, int grade) +{ + ptListenerList px = listenerList; + + while (px->next != NULL) + { + px = px->next; + } + + px->listener = listener; + px->next = (ptListenerList)malloc(sizeof(tListenerList)); + px->grade = grade; + 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; + + while (px->next != NULL && px->next->listener != listener) + { + px = px->next; + } + + if (px->next != NULL && px->next->listener == listener) + { + ptListenerList tmp = px->next->next; + free(px->next); + px->next = tmp; + } +} + +//fonction permettant d'afficher une liste d'abonnés. + +void printListenerList(ptListenerList listenerList) +{ + ptListenerList px = listenerList; + + printf("Participants : "); + while (px->next != NULL) + { + printf("%s(%d) ", px->listener->name, px->grade); + px = px->next; + } + 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; + } + + ptConf px = confChain; + ptListener py = listenerChain; + ptListenerList pz; + + while (px->next != NULL && px->id != confId) + { + px = px->next; + } + + pz = px->listeners->next; + while (pz->next != NULL) + { + if (pz->listener->id == listenerId) + { + return -2; + } + pz = pz->next; + } + + while (py->next != NULL && py->id != listenerId) + { + py = py->next; + } + + if (px->id != confId || py->id != listenerId) + { + 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; + int total = 0, nb = 0; + + while (px->next != NULL) + { + total += px->grade; + nb++; + px = px->next; + } + + if (nb != 0) + { + return total / nb; + } + else + { + return -1; + } +} + +//fonction permettant de calculer le nombre de participants à une conférence. + +int confParticipations(ptConf conf) +{ + ptListenerList px = conf->listeners->next; + int nb = 0; + + while (px->next != NULL) + { + nb++; + px = px->next; + } + + return nb; +} + +//+----------------------------------------+ +//| Files management | +//+----------------------------------------+ + +void readConfs(ptConf confChain); +void readListeners(ptListener listenerChain); +void readRelations(ptConf confChain, ptListener listenerChain); +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, ",")); + char *title = strtok(NULL, ","); + char *speaker = strtok(NULL, ","); + int day = atoi(strtok(NULL, ",")); + int month = atoi(strtok(NULL, ",")); + int year = atoi(strtok(NULL, ",")); + + 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, ",")); + char *name = strtok(NULL, ","); + int day = atoi(strtok(NULL, ",")); + int month = atoi(strtok(NULL, ",")); + 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, ":")); + + while ((token1 = strtok(NULL, ";")) != NULL && (token2 = strtok(NULL, ",")) != NULL) + { + participateToConf(confChain, listenerChain, confId, atoi(token1), atoi(token2)); + } + } + + //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"); + py = px->listeners->next; + + if (py->next != NULL) + { + fprintf(file, "%d:", px->id); + } + + while (py->next != NULL) + { + fprintf(file, "%d;%d", py->listener->id, py->grade); + if (py->next->next != NULL) + { + fprintf(file, ","); + } + else + { + fprintf(file, "\n"); + } + py = py->next; + } + + px = px->next; + } + + //on ferme le fichier. + + fclose(file); +} + +//+----------------------------------------+ +//| Screen manager | +//+----------------------------------------+ + +void goToCoords(int x, int y); +void drawHoryLine(char c, int lenght); +void drawVertiLine(char c, int lenght); +void drawRectangle(int x, int y, int lenght, int height); +void drawMenu(char *options[], int lenght); +void tasse(); +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; + + coords.X = x; + coords.Y = 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; + + while (i != lenght) + { + printf("%c", c); + i++; + } +} + +//fonction permettant de dessiner une ligne verticale dans la console. + +void drawVertiLine(char c, int lenght) +{ + CONSOLE_SCREEN_BUFFER_INFO info; + GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info); + int x = info.dwCursorPosition.X; + int y = info.dwCursorPosition.Y; + + int i = 0; + + while (i != lenght) + { + goToCoords(x, y + i); + printf("%c", c); + i++; + } +} + +//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); + printf("%c", 201); + drawHoryLine(205, lenght - 2); + printf("%c", 187); + goToCoords(x, y + 1); + drawVertiLine(186, height - 2); + goToCoords(x + lenght - 1, y + 1); + drawVertiLine(186, height - 2); + goToCoords(x, y + height - 1); + printf("%c", 200); + drawHoryLine(205, lenght - 2); + 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; + + for (i = 0; i < lenght; i++) + { + if (strlen(options[i]) > max) + { + max = strlen(options[i]); + } + } + + //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); + printf("%s", options[i]); + } +} + +//+---------------------------+ +//| | +//| ( ) ( ) ) | +//| ) ( ) ( ( | +//| ( ) ( ) ) | +//| _____________ | +//| <_____________> ___ | +//| | |/ _ \ | +//| | | | | | +//| | |_| | | +//| ___| |\___/ | +//| / \___________/ \ | +//| \_____________________/ | +//| | +//+---------------------------+ + +//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: //on affiche la liste des conférences. + { + ptConf px = confChain->next; + + while (px->next != NULL) + { + printf("Id : %d\nTitre : %s\nConferencier : %s\n", px->id, px->title, px->speaker); + printf("Date : %d/%d/%d\n", px->day, px->month, px->year); + printf("Nombre de participants : %d\n", confParticipations(px)); + if (px->listeners->next->next != NULL) + { + printListenerList(px->listeners->next); + } + int avg; + if ((avg = confGradeAvg(px) != -1)) + { + printf("Moyenne des notes : %d\n", confGradeAvg(px)); + } + printf("\n"); + px = px->next; + } + system("pause"); + menuConf(confChain, listenerChain); + break; + } + + case 2: //on ajoute une conférence. + { + int id, day, month, year; + char title[30]; + char speaker[20]; + + id = findConfId(confChain); + printf("Titre de la conference : "); + scanf("%29s", &title); + printf("Nom du conferencier : "); + scanf("%19s", &speaker); + printf("Jour : "); + scanf("%d", &day); + printf("Mois : "); + scanf("%d", &month); + printf("Annee : "); + scanf("%d", &year); + + addConf(confChain, id, title, speaker, day, month, year); + saveConf(confChain->next); + menuConf(confChain, listenerChain); + break; + } + + case 3: //on supprime une conférence. + { + ptConf px = confChain->next; + + printf("\n"); + while (px->next != NULL) + { + printf("%d : %s\n", px->id, px->title); + px = px->next; + } + printf("\n"); + + int id; + + printf("Id de la conference a supprimer : "); + scanf("%d", &id); + + removeConf(confChain, id); + saveConf(confChain->next); + saveRelations(confChain->next); + menuConf(confChain, listenerChain); + break; + } + + case 4: //on supprime les conférences inférieures à une date. + { + ptConf px = confChain->next; + + printf("\n"); + while (px->next != NULL) + { + printf("%s : %d/%d/%d\n", px->title, px->day, px->month, px->year); + px = px->next; + } + printf("\n"); + + int day, month, year, time; + printf("Jour : "); + scanf("%d", &day); + printf("Mois : "); + scanf("%d", &month); + printf("Annee : "); + scanf("%d", &year); + + time = day + 31 * month + 365 * year; + + px = confChain; + + while (px->next != NULL) + { + if ((px->day + px->month * 31 + px->year * 365) < time && px != confChain) + { + ptConf py = px->next; + removeConf(confChain, px->id); + px = py; + } + else if ((px->day + px->month * 31 + px->year * 365) < time && px == confChain) + { + removeConf(confChain, px->id); + } + else + { + px = px->next; + } + } + + saveConf(confChain->next); + saveRelations(confChain->next); + menuConf(confChain, listenerChain); + } + + case 5: //on retourne au menu principal. + menu(confChain, listenerChain); + break; + + default: + break; + } +} + +//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: //on affiche la liste des abonnés. + { + ptListener py = listenerChain->next; + + while (py->next != NULL) + { + printf("Id : %d\nNom: %s\nAge: %d\nNiveau: %d\n", py->id, py->name, py->age, py->level); + if (py->confs->next->next != NULL) + { + printConfList(py->confs->next); + } + printf("\n"); + py = py->next; + } + system("pause"); + menuAbo(confChain, listenerChain); + break; + } + + case 2: //on ajoute un abonné. + { + int id, age, level; + char name[20]; + + id = findListenerId(listenerChain); + printf("Nom : "); + scanf("%19s", &name); + printf("Age : "); + scanf("%d", &age); + printf("Niveau : "); + scanf("%d", &level); + + if (addListener(listenerChain, id, name, age, level) != -1) + { + saveListeners(listenerChain->next); + } + else + { + printf("Le niveau de l'abonne doit etre compris entre 0 et 5.\n\n"); + system("pause"); + } + menuAbo(confChain, listenerChain); + break; + } + + case 3: //on supprime un abonné. + { + ptListener px = listenerChain->next; + + printf("\n"); + while (px->next != NULL) + { + printf("%d : %s\n", px->id, px->name); + px = px->next; + } + printf("\n"); + + int id; + + printf("Id de l'abonne a supprimer : "); + scanf("%d", &id); + + removeListener(listenerChain, id); + saveListeners(listenerChain->next); + saveRelations(confChain->next); + menuAbo(confChain, listenerChain); + break; + } + + case 4: //on retourne au menu principal. + menu(confChain, listenerChain); + break; + + default: + break; + } +} + +//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: //on affiche le menu des conférences. + menuConf(confChain, listenerChain); + break; + + case 2: //on affiche le menu des abonnés. + menuAbo(confChain, listenerChain); + break; + + case 3: //on permet à un abonné de participer à une conférence. + { + ptConf px = confChain->next; + ptListener py = listenerChain->next; + + printf("\n"); + while (px->next != NULL) + { + printf("%d : %s\n", px->id, px->title); + px = px->next; + } + printf("\n"); + while (py->next != NULL) + { + printf("%d : %s\n", py->id, py->name); + py = py->next; + } + printf("\n"); + + int confId, listenerId, grade; + printf("Entrez l'ID de la conference : "); + scanf("%d", &confId); + printf("Entrez l'ID du participant : "); + scanf("%d", &listenerId); + printf("Entrez la note attribuee par le participant : "); + scanf("%d", &grade); + + if (participateToConf(confChain, listenerChain, confId, listenerId, grade) != -1) + { + saveRelations(confChain->next); + } + else + { + printf("La note doit etre comprise entre 0 et 5 et l'abonne ne doit pas avoir deja participe a la conference\n\n"); + system("pause"); + } + + menu(confChain, listenerChain); + break; + } + + case 4: //on affiche la meilleure conférence. + { + ptConf px = confChain -> next; + int max = confGradeAvg(px); + ptConf confMax = px; + + while (px->next != NULL) + { + int tmp = confGradeAvg(px); + if (tmp > max) + { + confMax = px; + max = tmp; + } + + px = px->next; + } + + printf("La conference la mieux notee est : %s\n\n", confMax->title); + + system("pause"); + menu(confChain, listenerChain); + + break; + } + + case 5: //on quitte le programme. + break; + + default: + break; + } +} + +//+----------------------------------------+ +//| 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; +} \ No newline at end of file