From 66cab0e4ceb3d5444c9b53e34733473540cb3eef Mon Sep 17 00:00:00 2001 From: Lukian LEIZOUR Date: Thu, 30 Nov 2023 16:48:36 +0100 Subject: [PATCH] commit --- main.exe | Bin 53949 -> 54723 bytes singleFile.c | 228 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 201 insertions(+), 27 deletions(-) diff --git a/main.exe b/main.exe index 8fc8b69698154cebebb7d1492a54527b90a30984..0dde0f89fc6c3457e54eccd4d20aa3a3777df678 100644 GIT binary patch delta 7794 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 delta 7572 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 = 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;