conf-database/singleFile.c
2023-11-30 16:12:33 +01:00

1011 lines
No EOL
23 KiB
C

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
//+----------------------------------------+
//| Conf management |
//+----------------------------------------+
struct listenerList;
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;
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);
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;
}
ptConf newConfChain()
{
ptConf confChain = (ptConf)malloc(sizeof(tConf));
confChain->next = (ptConf)malloc(sizeof(tConf));
confChain->next->next = NULL;
confChain->id = -1;
return confChain;
}
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;
}
void removeConf(ptConf confChain, int id)
{
ptConf px = confChain;
while (px->next != NULL && px->next->id != id)
{
px = px->next;
}
if (px->next != NULL && px->next->id == id)
{
ptListenerList py = px->next->listeners->next;
while (py->next != NULL)
{
removeConfFromConfList(py->listener->confs, px->next);
py = py->next;
}
ptConf tmp = px->next->next;
free(px->next);
px->next = tmp;
}
}
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;
}
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;
}
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;
}
void removeListener(ptListener listenerChain, int id)
{
ptListener px = listenerChain;
while (px->next != NULL && px->next->id != id)
{
px = px->next;
}
if (px->next != NULL && px->next->id == id)
{
ptConfList py = px->next->confs->next;
while (py->next != NULL)
{
removeListenerFromListenerList(py->conf->listeners, px->next);
py = py->next;
}
ptListener tmp = px->next->next;
free(px->next);
px->next = tmp;
px->next->prev = px;
}
}
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;
}
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;
}
}
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");
}
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;
}
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;
}
}
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");
}
int participateToConf(ptConf confChain, ptListener listenerChain, int confId, int listenerId, int grade)
{
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;
}
addListenerToListenerList(px->listeners, py, grade);
addConfToConfList(py->confs, px, grade);
return 0;
}
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;
}
}
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);
void readConfs(ptConf confChain)
{
FILE *file = fopen("./data/confs", "r");
char line[100];
char *token;
if (file == NULL)
{
printf("ça marche pas.");
return;
}
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);
}
fclose(file);
}
void readListeners(ptListener listenerChain)
{
FILE *file = fopen("./data/listeners", "r");
char line[100];
char *token;
if (file == NULL)
{
printf("ça marche pas.");
return;
}
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);
}
fclose(file);
}
void readRelations(ptConf confChain, ptListener listenerChain)
{
FILE *file = fopen("./data/relations", "r");
char line[100];
char *token1;
char *token2;
if (file == NULL)
{
printf("ça marche pas.");
return;
}
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));
}
}
fclose(file);
}
void saveConf(ptConf confChain)
{
FILE *file = fopen("./data/confs", "w");
ptConf px = confChain;
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;
}
fclose(file);
}
void saveListeners(ptListener listenerChain)
{
FILE *file = fopen("./data/listeners", "w");
ptListener px = listenerChain;
while (px->next != NULL)
{
fprintf(file, "%d,%s,%d,%d\n", px->id, px->name, px->age, px->level);
px = px->next;
}
fclose(file);
}
void saveRelations(ptConf confChain)
{
FILE *file = fopen("./data/relations", "w");
ptConf px = confChain;
ptListenerList py;
printf("test");
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;
}
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);
void goToCoords(int x, int y)
{
COORD coords;
coords.X = x;
coords.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coords);
}
void drawHoryLine(char c, int lenght)
{
int i = 0;
while (i != lenght)
{
printf("%c", c);
i++;
}
}
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++;
}
}
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);
}
void drawMenu(char *options[], int lenght)
{
int max = strlen(options[0]);
int i;
for (i = 0; i < lenght; i++)
{
if (strlen(options[i]) > max)
{
max = strlen(options[i]);
}
}
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;
drawRectangle((columns - max - 4) / 2, 2, max + 4, lenght + 4);
for (i = 0; i < lenght; i++)
{
goToCoords((columns - max - 4) / 2 + 2, 4 + i);
printf("%s", options[i]);
}
}
/*
( ) ( ) )
) ( ) ( (
( ) ( ) )
_____________
<_____________> ___
| |/ _ \
| | | |
| |_| |
___| |\___/
/ \___________/ \
\_____________________/
*/
void tasse()
{
printf(" ( ) ( ) )\n ) ( ) ( (\n ( ) ( ) )\n _____________\n <_____________> ___\n | |/ _ \\\n | | | |\n | |_| |\n ___| |\\___/\n/ \\___________/ \\\n\\_____________________/\n");
}
void menuConf(ptConf confChain, ptListener listenerChain)
{
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");
printf("Que voulez-vous faire ? : ");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:
{
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:
{
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:
{
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:
{
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:
menu(confChain, listenerChain);
break;
default:
break;
}
}
void menuAbo(ptConf confChain, ptListener listenerChain)
{
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");
printf("Que voulez-vous faire ? : ");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:
{
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:
{
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:
{
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:
menu(confChain, listenerChain);
break;
default:
break;
}
}
void menu(ptConf confChain, ptListener listenerChain)
{
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");
printf("Que voulez-vous faire ? : ");
int choice;
scanf("%d", &choice);
switch (choice)
{
case 1:
menuConf(confChain, listenerChain);
break;
case 2:
menuAbo(confChain, listenerChain);
break;
case 3:
{
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:
{
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:
break;
default:
break;
}
}
//+----------------------------------------+
//| Main function |
//+----------------------------------------+
int main()
{
ptConf confChain = newConfChain();
ptListener listenerChain = newListenerChain();
readConfs(confChain);
readListeners(listenerChain);
readRelations(confChain, listenerChain);
menu(confChain, listenerChain);
return 0;
}