From d37424d117f9f0171b9dd65b467387dd4b325e9b Mon Sep 17 00:00:00 2001 From: Lukian LEIZOUR Date: Thu, 30 Nov 2023 16:50:08 +0100 Subject: [PATCH] commit --- main.exe | Bin 54723 -> 0 bytes singleFile.c | 1192 -------------------------------------------------- 2 files changed, 1192 deletions(-) delete mode 100644 main.exe delete mode 100644 singleFile.c diff --git a/main.exe b/main.exe deleted file mode 100644 index 85df1ac1a7f20c094b654c4b467bd4aeb50fd00d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54723 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 UVeS%PC4$eveALuGVQwr$f4d_K -#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