Commit fdefda76d576ca4755878a22eedbc1b95526c012
1 parent
327283e2
commit final
Showing
7 changed files
with
1078 additions
and
151 deletions
Show diff stats
@@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
1 | +Choix de l'utilisateur: | ||
2 | + | ||
3 | +appuyer sur 1 : affiche les réalisateurs | ||
4 | + | ||
5 | +appuyer sur 2 : cherche un réalisateur | ||
6 | + | ||
7 | + le programme demande son nom et son prénom | ||
8 | + | ||
9 | +appuyer sur 3: affiche le réalisateur | ||
10 | + | ||
11 | +appuyer sur 4 : efface le réalisateur | ||
12 | + | ||
13 | +appuyer sur 5 : ajoute un film au réalisateur | ||
14 | + | ||
15 | +appuyer sur 6 : efface un film au réalisateur | ||
16 | + | ||
17 | +appuyer sur 7 : ajoute un réalisateur | ||
18 | + | ||
19 | +appuyer sur 8 : quitter le programme | ||
20 | + | ||
21 | +Pour utiliser un autre fichier que "very_small_example.list", remplacer le fichier utilisé par celui désiré dans la fonction "void init" localisée dans le fichier "fonction.c". | ||
0 | \ No newline at end of file | 22 | \ No newline at end of file |
@@ -0,0 +1,48 @@ | @@ -0,0 +1,48 @@ | ||
1 | +<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> | ||
2 | +<CodeBlocks_project_file> | ||
3 | + <FileVersion major="1" minor="6" /> | ||
4 | + <Project> | ||
5 | + <Option title="fin" /> | ||
6 | + <Option pch_mode="2" /> | ||
7 | + <Option compiler="gcc" /> | ||
8 | + <Build> | ||
9 | + <Target title="Debug"> | ||
10 | + <Option output="bin/Debug/fin" prefix_auto="1" extension_auto="1" /> | ||
11 | + <Option object_output="obj/Debug/" /> | ||
12 | + <Option type="1" /> | ||
13 | + <Option compiler="gcc" /> | ||
14 | + <Compiler> | ||
15 | + <Add option="-g" /> | ||
16 | + </Compiler> | ||
17 | + </Target> | ||
18 | + <Target title="Release"> | ||
19 | + <Option output="bin/Release/fin" prefix_auto="1" extension_auto="1" /> | ||
20 | + <Option object_output="obj/Release/" /> | ||
21 | + <Option type="1" /> | ||
22 | + <Option compiler="gcc" /> | ||
23 | + <Compiler> | ||
24 | + <Add option="-O2" /> | ||
25 | + </Compiler> | ||
26 | + <Linker> | ||
27 | + <Add option="-s" /> | ||
28 | + </Linker> | ||
29 | + </Target> | ||
30 | + </Build> | ||
31 | + <Compiler> | ||
32 | + <Add option="-Wall" /> | ||
33 | + </Compiler> | ||
34 | + <Unit filename="fonction.c"> | ||
35 | + <Option compilerVar="CC" /> | ||
36 | + </Unit> | ||
37 | + <Unit filename="fonction.h" /> | ||
38 | + <Unit filename="main.c"> | ||
39 | + <Option compilerVar="CC" /> | ||
40 | + </Unit> | ||
41 | + <Extensions> | ||
42 | + <code_completion /> | ||
43 | + <envvars /> | ||
44 | + <debugger /> | ||
45 | + <lib_finder disable_auto="1" /> | ||
46 | + </Extensions> | ||
47 | + </Project> | ||
48 | +</CodeBlocks_project_file> |
@@ -0,0 +1,402 @@ | @@ -0,0 +1,402 @@ | ||
1 | +#include "fonction.h" | ||
2 | + | ||
3 | +/**Hash functions**/ | ||
4 | + | ||
5 | +int hash(char *word) | ||
6 | +{ | ||
7 | + int i = 0; | ||
8 | + int nombreHache = 0; | ||
9 | + | ||
10 | + | ||
11 | + for (i = 0 ; word[i] != '\0' ; i++) | ||
12 | + { | ||
13 | + | ||
14 | + nombreHache += word[i]; | ||
15 | + | ||
16 | + } | ||
17 | + | ||
18 | + return nombreHache %= TABLE_SIZE; | ||
19 | +} | ||
20 | +// initialisation du tableau, chaque element dans le tableau est un pointeur de réalisateur | ||
21 | + | ||
22 | +void initTable(tableReal table) | ||
23 | +{ | ||
24 | + int e; | ||
25 | + for(e = 0;e<TABLE_SIZE;e++) | ||
26 | + { | ||
27 | + table[e] = NULL; | ||
28 | + } | ||
29 | +} | ||
30 | + | ||
31 | +int hashNum(char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
32 | +{ | ||
33 | + char concat[LINE_MAX]; | ||
34 | + int actualReal = 0; | ||
35 | + memcpy(concat,nom,strlen(nom)+1); | ||
36 | + strcat(concat,prenom); | ||
37 | + actualReal = hash(concat); | ||
38 | + | ||
39 | + return actualReal; | ||
40 | +} | ||
41 | + | ||
42 | +// Fonction permettant de trouver le réalisateur dans la table | ||
43 | + | ||
44 | +ptrealisateur findReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
45 | +{ | ||
46 | + int actualReal = hashNum(nom,prenom); | ||
47 | + ptrealisateur pt = table[actualReal]; | ||
48 | + | ||
49 | + while( (strcmp(pt->nom,nom) != 0 && strcmp(pt->prenom,prenom) != 0) ) | ||
50 | + { | ||
51 | + if(pt == NULL) | ||
52 | + { | ||
53 | + printf("%s %s ne fait pas parti de liste \n",nom,prenom); | ||
54 | + break; | ||
55 | + } | ||
56 | + pt = pt->suivant; | ||
57 | + if(strcmp(pt->nom,nom) == 0 && strcmp(pt->prenom,prenom) == 0) | ||
58 | + printf("%s %s fait parti de liste \n",nom,prenom); | ||
59 | + } | ||
60 | + | ||
61 | + return pt; | ||
62 | +} | ||
63 | + | ||
64 | +// permet de copier une partie du chaîne dans une autre. | ||
65 | + | ||
66 | +int readPartOfLine(int a,int b,char line[LINE_MAX],char part[LINE_MAX]) | ||
67 | +{ | ||
68 | + int debut = a; | ||
69 | + int endAv = b; | ||
70 | + int av = 0; | ||
71 | + while(debut < endAv) | ||
72 | + { | ||
73 | + part[av] = line[debut]; | ||
74 | + debut++; | ||
75 | + av++; | ||
76 | + } | ||
77 | + part[av] = '\0'; | ||
78 | + return debut; | ||
79 | + | ||
80 | +} | ||
81 | + | ||
82 | +//repérer la position de la fin de chaîne de caractére | ||
83 | +int findEnd(char line[LINE_MAX]) | ||
84 | +{ | ||
85 | + int av = 0; | ||
86 | + while(line[av] != '\n') | ||
87 | + av++; | ||
88 | + return av; | ||
89 | +} | ||
90 | + | ||
91 | +//permet de lire la chaîne de caractére qui correspond à une oeuvre | ||
92 | + | ||
93 | +void readElement(char element[LINE_MAX],ptoeuvres film) | ||
94 | +{ | ||
95 | + | ||
96 | + int begin = 0; | ||
97 | + if(element[0] == '\t') | ||
98 | + begin = 2; | ||
99 | + int Pbegin = strpbrk(element,"(") - element; | ||
100 | + int Pend =strpbrk(element,")") - element; | ||
101 | + int end = findEnd(element); | ||
102 | + | ||
103 | + readPartOfLine(begin,Pbegin,element,film->title); | ||
104 | + | ||
105 | + readPartOfLine(Pbegin+1,Pend,element,film->annee); | ||
106 | + | ||
107 | + readPartOfLine(Pend+1,end,element,film->commentaire); | ||
108 | + | ||
109 | + | ||
110 | + | ||
111 | +} | ||
112 | + | ||
113 | +// initialisation des oeuvres | ||
114 | + | ||
115 | +void initOeuvre(ptoeuvres oe) | ||
116 | +{ | ||
117 | + | ||
118 | + | ||
119 | + int e; | ||
120 | + for(e = 0;e<LINE_MAX;e++) | ||
121 | + { | ||
122 | + oe->annee[e] = malloc(sizeof(char)); | ||
123 | + oe->commentaire[e] = malloc(sizeof(char)); | ||
124 | + oe->title[e] = malloc(sizeof(char)); | ||
125 | + } | ||
126 | + oe->suivant = NULL; | ||
127 | + | ||
128 | + | ||
129 | +} | ||
130 | +// Permet de lire le fichier contenant la liste des réalisateurs | ||
131 | +//repere les réalisateurs par l'existence d'une virgule dans la ligne en cours de lecture | ||
132 | + | ||
133 | +void readFile(FILE *file, tableReal database) | ||
134 | +{ | ||
135 | + | ||
136 | + int actualReal = 0; | ||
137 | + int virgule = 0; | ||
138 | + int tab = 0; | ||
139 | + int end = 0; | ||
140 | + int av = 0; | ||
141 | + | ||
142 | + char line[LINE_MAX]; | ||
143 | + char element[LINE_MAX]; | ||
144 | + char nom[LINE_MAX]; | ||
145 | + char prenom[LINE_MAX]; | ||
146 | + | ||
147 | + char *ret; | ||
148 | + | ||
149 | + Oeuvres initOe; | ||
150 | + ptoeuvres ptInitOe = NULL; | ||
151 | + | ||
152 | + | ||
153 | + while(av == 0) | ||
154 | + { | ||
155 | + | ||
156 | + if(fgets(line,LINE_MAX,file) != NULL) | ||
157 | + { | ||
158 | + | ||
159 | + | ||
160 | + ret = strpbrk(line,","); | ||
161 | + if(ret != NULL) | ||
162 | + { | ||
163 | + virgule = ret - line; | ||
164 | + tab = strpbrk(line,"\t") - line; | ||
165 | + end = findEnd(line); | ||
166 | + readPartOfLine(0,virgule,line,nom); | ||
167 | + readPartOfLine(virgule+1,tab,line,prenom); | ||
168 | + | ||
169 | + int actualReal = hashNum(nom,prenom); | ||
170 | + | ||
171 | + database[actualReal] = malloc(sizeof(Realisateur)); | ||
172 | + readPartOfLine(0,virgule,line,database[actualReal]->nom); | ||
173 | + readPartOfLine(virgule+1,tab,line,database[actualReal]->prenom); | ||
174 | + | ||
175 | + | ||
176 | + database[actualReal]->filmographie = malloc(sizeof(Oeuvres)); | ||
177 | + ptInitOe = database[actualReal]->filmographie; | ||
178 | + | ||
179 | + initOeuvre(ptInitOe); | ||
180 | + readPartOfLine(tab+1,end,line,element); | ||
181 | + readElement(element,ptInitOe); | ||
182 | + | ||
183 | + | ||
184 | + } | ||
185 | + else if(strcmp(line,"\n") != 0) | ||
186 | + { | ||
187 | + | ||
188 | + ptInitOe->suivant = malloc(sizeof(Oeuvres)); | ||
189 | + ptInitOe = ptInitOe->suivant; | ||
190 | + initOeuvre(ptInitOe); | ||
191 | + readElement(line,ptInitOe); | ||
192 | + } | ||
193 | + } | ||
194 | + else | ||
195 | + av = 1; | ||
196 | + | ||
197 | + | ||
198 | + | ||
199 | + } | ||
200 | + | ||
201 | +} | ||
202 | + | ||
203 | +// afficher un film | ||
204 | + | ||
205 | +void afficherFilm(ptoeuvres oe) | ||
206 | +{ | ||
207 | + printf("titre : %s, annee : %s, commentaire : %s \n",oe->title,oe->annee,oe->commentaire); | ||
208 | + | ||
209 | +} | ||
210 | + | ||
211 | +//afficher tous les realisateurs | ||
212 | + | ||
213 | +void afficherTable(tableReal table) | ||
214 | +{ | ||
215 | + int e; | ||
216 | + ptoeuvres oe; | ||
217 | + for(e=0;e<TABLE_SIZE;e++) | ||
218 | + { | ||
219 | + if(table[e] != NULL) | ||
220 | + { | ||
221 | + oe = table[e]->filmographie; | ||
222 | + printf("nom : %s, prenom : %s \n",table[e]->nom,table[e]->prenom); | ||
223 | + while(oe != NULL) | ||
224 | + { | ||
225 | + afficherFilm(oe); | ||
226 | + oe = oe->suivant; | ||
227 | + | ||
228 | + } | ||
229 | + | ||
230 | + | ||
231 | + } | ||
232 | + | ||
233 | + } | ||
234 | +} | ||
235 | + | ||
236 | +// Permet d'afficher le réalisateur voulu ainsi que sa filmographie | ||
237 | + | ||
238 | +void afficherReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
239 | +{ | ||
240 | + ptrealisateur pt = findReal(table,nom,prenom); | ||
241 | + ptoeuvres ptOe = 0; | ||
242 | + if(pt != NULL) | ||
243 | + { | ||
244 | + ptOe = pt->filmographie; | ||
245 | + while(ptOe != NULL) | ||
246 | + { | ||
247 | + afficherFilm(ptOe); | ||
248 | + ptOe = ptOe->suivant; | ||
249 | + } | ||
250 | + | ||
251 | + } | ||
252 | + | ||
253 | + | ||
254 | + | ||
255 | +} | ||
256 | + | ||
257 | +// on ajouter un realisateur dans le tableau | ||
258 | + | ||
259 | +void addReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
260 | +{ | ||
261 | + if(findReal(table,nom,prenom) == NULL) | ||
262 | + { | ||
263 | + | ||
264 | + printf("ajout en court \n",nom,prenom); | ||
265 | + int actualReal = hashNum(nom,prenom); | ||
266 | + if(table[actualReal] == NULL) | ||
267 | + { | ||
268 | + | ||
269 | + table[actualReal] = malloc(sizeof(Realisateur)); | ||
270 | + memcpy(table[actualReal]->nom,nom,strlen(nom)+1); | ||
271 | + memcpy(table[actualReal]->prenom,prenom,strlen(prenom)+1); | ||
272 | + table[actualReal]->suivant = NULL; | ||
273 | + } | ||
274 | + else{ | ||
275 | + ptrealisateur pt = table[actualReal]->suivant; | ||
276 | + while(pt != NULL) | ||
277 | + pt = pt->suivant; | ||
278 | + pt = malloc(sizeof(Realisateur)); | ||
279 | + memcpy(pt->nom,nom,strlen(nom)+1); | ||
280 | + memcpy(pt->prenom,prenom,strlen(prenom)+1); | ||
281 | + pt->suivant = NULL; | ||
282 | + | ||
283 | + | ||
284 | + } | ||
285 | + | ||
286 | + | ||
287 | + } | ||
288 | + | ||
289 | + | ||
290 | +} | ||
291 | + | ||
292 | +// ajouter un film d'un realisateur donné | ||
293 | + | ||
294 | +void addFilm(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX] ) | ||
295 | +{ | ||
296 | + ptrealisateur pt = findReal(table,nom,prenom); | ||
297 | + ptoeuvres ptOe = 0; | ||
298 | + ptOe = pt->filmographie; | ||
299 | + int X = 0; | ||
300 | + char anne[LINE_MAX]; | ||
301 | + char tittle[LINE_MAX]; | ||
302 | + char commentaire[LINE_MAX]; | ||
303 | +if(ptOe != NULL) | ||
304 | +{ | ||
305 | + while(ptOe->suivant != NULL) | ||
306 | + { | ||
307 | + ptOe = ptOe->suivant; | ||
308 | + } | ||
309 | +} | ||
310 | +else X = 1; | ||
311 | + | ||
312 | + ptoeuvres newOe = malloc(sizeof(Oeuvres)); | ||
313 | + initOeuvre(newOe); | ||
314 | + printf("ajouter un film : \ntitre : "); | ||
315 | + scanf("%s",&tittle); | ||
316 | + printf("annee : "); | ||
317 | + scanf("%s",&anne); | ||
318 | + printf("commentaire : "); | ||
319 | + scanf("%s",&commentaire); | ||
320 | + memcpy(newOe->commentaire,commentaire,strlen(commentaire)+1); | ||
321 | + memcpy(newOe->title,tittle,strlen(tittle)+1); | ||
322 | + memcpy(newOe->annee,anne,strlen(anne)+1); | ||
323 | +if(X == 0) | ||
324 | + ptOe->suivant = newOe; | ||
325 | +else | ||
326 | + pt->filmographie = newOe; | ||
327 | +} | ||
328 | + | ||
329 | +int eraseFilm(ptrealisateur real,char title[LINE_MAX]) | ||
330 | +{ | ||
331 | + ptoeuvres previousOe = real->filmographie; | ||
332 | + ptoeuvres nextOe = real->filmographie->suivant; | ||
333 | + if(previousOe == NULL) | ||
334 | + return 1; | ||
335 | + if(nextOe == NULL) | ||
336 | + { | ||
337 | + if(strcmp(previousOe->title,title) == 0) | ||
338 | + { | ||
339 | + real->filmographie = NULL; | ||
340 | + } | ||
341 | + return 1; | ||
342 | + } | ||
343 | + | ||
344 | + | ||
345 | +if(nextOe != NULL) | ||
346 | +{ | ||
347 | + | ||
348 | + | ||
349 | + while(strcmp(nextOe->title,title) != 0 && (previousOe != NULL && nextOe != nextOe)) | ||
350 | + { | ||
351 | + previousOe = nextOe; | ||
352 | + nextOe = nextOe->suivant; | ||
353 | + if(nextOe == NULL) | ||
354 | + return 1; | ||
355 | + } | ||
356 | + previousOe->suivant = nextOe->suivant; | ||
357 | + free(nextOe); | ||
358 | +} | ||
359 | +else | ||
360 | +{ | ||
361 | + if(strcmp(nextOe->title,title) == 0) | ||
362 | + { | ||
363 | + free(nextOe); | ||
364 | + previousOe->suivant = NULL; | ||
365 | + return 1; | ||
366 | + } | ||
367 | + else if(strcmp(previousOe->title,title) == 0) | ||
368 | + { | ||
369 | + real->filmographie = nextOe; | ||
370 | + free(previousOe); | ||
371 | + return 1; | ||
372 | + } | ||
373 | + | ||
374 | + | ||
375 | +} | ||
376 | + printf("%s n'existe pas \n",title); | ||
377 | + | ||
378 | + | ||
379 | + return 0; | ||
380 | + | ||
381 | +} | ||
382 | + | ||
383 | +// supprimer un film d'un réalisateur donné | ||
384 | + | ||
385 | +void eraseReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
386 | +{ | ||
387 | + ptrealisateur pt = findReal(table,nom,prenom); | ||
388 | + ptoeuvres ptOe = pt->filmographie->suivant; | ||
389 | + if(pt != NULL) | ||
390 | + { | ||
391 | + printf("effacement en court \n"); | ||
392 | + while(pt->filmographie != NULL) | ||
393 | + { | ||
394 | + pt->filmographie = ptOe->suivant; | ||
395 | + ptOe = ptOe->suivant; | ||
396 | + } | ||
397 | + table[hashNum(nom,prenom)] = NULL; | ||
398 | + free(ptOe); | ||
399 | + free(pt); | ||
400 | + } | ||
401 | + | ||
402 | +} |
@@ -0,0 +1,66 @@ | @@ -0,0 +1,66 @@ | ||
1 | +#ifndef FONCTION_H_INCLUDED | ||
2 | +#define FONCTION_H_INCLUDED | ||
3 | +#define TABLE_SIZE 100 | ||
4 | +#define LINE_MAX 1000 | ||
5 | +#include <stdio.h> | ||
6 | +#include <stdlib.h> | ||
7 | +#include <string.h> | ||
8 | + | ||
9 | + | ||
10 | + typedef struct Oeuvres Oeuvres; | ||
11 | + struct Oeuvres | ||
12 | + { | ||
13 | + char title[LINE_MAX]; | ||
14 | + char annee[LINE_MAX]; | ||
15 | + char commentaire[LINE_MAX]; | ||
16 | + Oeuvres *suivant; | ||
17 | + | ||
18 | + }; | ||
19 | + | ||
20 | + | ||
21 | + typedef Oeuvres *ptoeuvres; | ||
22 | + | ||
23 | + | ||
24 | + typedef struct Realisateur Realisateur; | ||
25 | + struct Realisateur | ||
26 | + { | ||
27 | + char nom[LINE_MAX]; | ||
28 | + char prenom[LINE_MAX]; | ||
29 | + ptoeuvres filmographie; | ||
30 | + Realisateur *suivant; | ||
31 | + }; | ||
32 | + | ||
33 | + typedef Realisateur *ptrealisateur; | ||
34 | + typedef ptrealisateur tableReal[TABLE_SIZE]; | ||
35 | + | ||
36 | + | ||
37 | + int hash(char *word); | ||
38 | + void initTable(tableReal table); | ||
39 | + int hashNum(char nom[LINE_MAX],char prenom[LINE_MAX]); | ||
40 | + | ||
41 | + | ||
42 | + int findEnd(char line[LINE_MAX]); | ||
43 | + | ||
44 | + void initOeuvre(ptoeuvres oe); | ||
45 | + | ||
46 | + int readPartOfLine(int a,int b,char line[LINE_MAX],char part[LINE_MAX]); | ||
47 | + void readElement(char element[LINE_MAX],ptoeuvres film); | ||
48 | + void readFile(FILE *file, tableReal database); | ||
49 | + | ||
50 | + ptrealisateur findReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]); | ||
51 | + | ||
52 | + void afficherFilm(ptoeuvres oe); | ||
53 | + void afficherTable(tableReal table); | ||
54 | + void afficherReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]); | ||
55 | + | ||
56 | + void addReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]); | ||
57 | + void addFilm(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX] ); | ||
58 | + | ||
59 | + int eraseFilm(ptrealisateur real,char title[LINE_MAX]); | ||
60 | + void eraseReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]); | ||
61 | + | ||
62 | + | ||
63 | + | ||
64 | + | ||
65 | + | ||
66 | +#endif // FONCTION_H_INCLUDED |
main.c deleted
@@ -1,151 +0,0 @@ | @@ -1,151 +0,0 @@ | ||
1 | -#include "fonction.h" | ||
2 | - | ||
3 | -//explication de l'utilisation du menu | ||
4 | - | ||
5 | -void commande() | ||
6 | -{ | ||
7 | - printf("que voulez vous faire ? \n1 = afficher les realisteurs\n2 = chercher et selectionner un realisteur\n3 = afficher le realisateur selectionner\n4 = effacer le realisateur selectionner\n5 = ajouter un film au realisateur selectionner\n6 = effacer un film au realisateur selectioner\n7 = ajouter un realisateur\n8 = quitter \n"); | ||
8 | -} | ||
9 | - | ||
10 | -// Menu du programme | ||
11 | - | ||
12 | -void menu(tableReal table) | ||
13 | -{ | ||
14 | - int QUITTER = 0; | ||
15 | - int choix = 0; | ||
16 | - char nom[LINE_MAX]; | ||
17 | - char prenom[LINE_MAX]; | ||
18 | - char nomNew[LINE_MAX]; | ||
19 | - char prenomNew[LINE_MAX]; | ||
20 | - char titre[LINE_MAX]; | ||
21 | - ptrealisateur pt = NULL; | ||
22 | - commande(); | ||
23 | - | ||
24 | - while(QUITTER==0) | ||
25 | - { | ||
26 | - while(choix == 0) | ||
27 | - { | ||
28 | - scanf("%d",&choix); | ||
29 | - if(choix > 8 || choix < 0) | ||
30 | - choix = 0; | ||
31 | - system("cls"); | ||
32 | - } | ||
33 | - switch(choix) | ||
34 | - { | ||
35 | - | ||
36 | - case 1: // afficher un realisateur | ||
37 | - { | ||
38 | - commande(); | ||
39 | - afficherTable(table); | ||
40 | - choix = 0; | ||
41 | - break; | ||
42 | - } | ||
43 | - case 2: // chercher un realisateur | ||
44 | - { | ||
45 | - commande(); | ||
46 | - printf("chercher, nom : "); | ||
47 | - scanf("%s",&nom); | ||
48 | - printf("prenom : "); | ||
49 | - scanf("%s",&prenom); | ||
50 | - pt = findReal(table,nom,prenom); | ||
51 | - choix = 0; | ||
52 | - break; | ||
53 | - } | ||
54 | - case 3: //afficher un realisteur selectionne | ||
55 | - { | ||
56 | - commande(); | ||
57 | - if(pt != NULL) | ||
58 | - afficherReal(table,pt->nom,pt->prenom); | ||
59 | - else | ||
60 | - printf("pas de realisateur selectionner !"); | ||
61 | - | ||
62 | - choix = 0; | ||
63 | - break; | ||
64 | - } | ||
65 | - case 4: // supprimer un realisateur selectionne | ||
66 | - { | ||
67 | - commande(); | ||
68 | - if(pt != NULL) | ||
69 | - eraseReal(table,pt->nom,pt->prenom); | ||
70 | - else | ||
71 | - printf("pas de realisateur selectionner !"); | ||
72 | - | ||
73 | - choix = 0; | ||
74 | - break; | ||
75 | - } | ||
76 | - | ||
77 | - case 5: // ajouter un film dans le realisateur selectionne | ||
78 | - { | ||
79 | - commande(); | ||
80 | - if(pt != NULL) | ||
81 | - addFilm(table,pt->nom,pt->prenom); | ||
82 | - else | ||
83 | - printf("pas de realisateur selectionner !"); | ||
84 | - | ||
85 | - choix = 0; | ||
86 | - break; | ||
87 | - } | ||
88 | - case 6: //supprimer un film dans le realisateur selectionne | ||
89 | - { | ||
90 | - commande(); | ||
91 | - if(pt != NULL) | ||
92 | - { | ||
93 | - printf("nom du film à effacer :"); | ||
94 | - scanf("%s",titre); | ||
95 | - eraseFilm(pt,titre); | ||
96 | - } | ||
97 | - else | ||
98 | - printf("pas de realisateur selectionner !"); | ||
99 | - | ||
100 | - choix = 0; | ||
101 | - break; | ||
102 | - } | ||
103 | - case 7: // ajouter un realisateur | ||
104 | - { | ||
105 | - commande(); | ||
106 | - printf("ajouter : nom : "); | ||
107 | - scanf("%s",&nomNew); | ||
108 | - printf("prenom : "); | ||
109 | - scanf("%s",&prenomNew); | ||
110 | - addReal(table,nomNew,prenomNew); | ||
111 | - | ||
112 | - choix = 0; | ||
113 | - break; | ||
114 | - } | ||
115 | - case 8: // quitter | ||
116 | - { | ||
117 | - printf("bye bitches !"); | ||
118 | - QUITTER = 1; | ||
119 | - break; | ||
120 | - } | ||
121 | - | ||
122 | - | ||
123 | - } | ||
124 | - | ||
125 | - | ||
126 | - } | ||
127 | - | ||
128 | - | ||
129 | -} | ||
130 | - | ||
131 | -// Initialisation de tous les paramètres | ||
132 | - | ||
133 | -void init() | ||
134 | -{ | ||
135 | - | ||
136 | - tableReal table; | ||
137 | - initTable(table); | ||
138 | - FILE* fichier = NULL; | ||
139 | - fichier = fopen("very_small_example.list", "r+"); | ||
140 | - readFile(fichier,table); | ||
141 | - fclose(fichier); | ||
142 | - | ||
143 | - menu(table); | ||
144 | - | ||
145 | -} | ||
146 | -int main() | ||
147 | -{ | ||
148 | - | ||
149 | - init(); | ||
150 | - return 0; | ||
151 | -} |
@@ -0,0 +1,541 @@ | @@ -0,0 +1,541 @@ | ||
1 | +#include <stdio.h> | ||
2 | +#include <stdlib.h> | ||
3 | +#define LINE_MAX 1000 | ||
4 | +#define TABLE_SIZE 100 | ||
5 | +#include <string.h> | ||
6 | + | ||
7 | + | ||
8 | +int hash(char *word) | ||
9 | +{ | ||
10 | + int i = 0; | ||
11 | + int nombreHache = 0; | ||
12 | + | ||
13 | + | ||
14 | + for (i = 0 ; word[i] != '\0' ; i++) | ||
15 | + { | ||
16 | + | ||
17 | + nombreHache += word[i]; | ||
18 | + | ||
19 | + } | ||
20 | + | ||
21 | + return nombreHache %= TABLE_SIZE; | ||
22 | +} | ||
23 | + | ||
24 | +typedef struct Oeuvres Oeuvres; | ||
25 | +struct Oeuvres | ||
26 | +{ | ||
27 | + char title[LINE_MAX]; | ||
28 | + char annee[LINE_MAX]; | ||
29 | + char commentaire[LINE_MAX]; | ||
30 | + Oeuvres *suivant; | ||
31 | + | ||
32 | +}; | ||
33 | + | ||
34 | + | ||
35 | +typedef Oeuvres *ptoeuvres; | ||
36 | + | ||
37 | + | ||
38 | +typedef struct Realisateur Realisateur; | ||
39 | +struct Realisateur | ||
40 | +{ | ||
41 | + char nom[LINE_MAX]; | ||
42 | + char prenom[LINE_MAX]; | ||
43 | + ptoeuvres filmographie; | ||
44 | + Realisateur *suivant; | ||
45 | +}; | ||
46 | + | ||
47 | +typedef Realisateur *ptrealisateur; | ||
48 | +typedef ptrealisateur tableReal[TABLE_SIZE]; | ||
49 | + | ||
50 | + | ||
51 | + | ||
52 | +void initTable(tableReal table) | ||
53 | +{ | ||
54 | + int e; | ||
55 | + for(e = 0;e<TABLE_SIZE;e++) | ||
56 | + { | ||
57 | + table[e] = NULL; | ||
58 | + } | ||
59 | +} | ||
60 | +int hashNum(char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
61 | +{ | ||
62 | + char concat[LINE_MAX]; | ||
63 | + int actualReal = 0; | ||
64 | + memcpy(concat,nom,strlen(nom)+1); | ||
65 | + strcat(concat,prenom); | ||
66 | + actualReal = hash(concat); | ||
67 | + | ||
68 | + return actualReal; | ||
69 | +} | ||
70 | +ptrealisateur findReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
71 | +{ | ||
72 | + int actualReal = hashNum(nom,prenom); | ||
73 | + ptrealisateur pt = table[actualReal]; | ||
74 | + | ||
75 | + while( (strcmp(pt->nom,nom) != 0 && strcmp(pt->prenom,prenom) != 0) ) | ||
76 | + { | ||
77 | + if(pt == NULL) | ||
78 | + { | ||
79 | + printf("%s %s ne fait pas parti de liste \n",nom,prenom); | ||
80 | + break; | ||
81 | + } | ||
82 | + pt = pt->suivant; | ||
83 | + if(strcmp(pt->nom,nom) == 0 && strcmp(pt->prenom,prenom) == 0) | ||
84 | + printf("%s %s fait parti de liste \n",nom,prenom); | ||
85 | + } | ||
86 | + | ||
87 | + return pt; | ||
88 | +} | ||
89 | +int readPartOfLine(int a,int b,char line[LINE_MAX],char part[LINE_MAX]) | ||
90 | +{ | ||
91 | + int debut = a; | ||
92 | + int endAv = b; | ||
93 | + int av = 0; | ||
94 | + while(debut < endAv) | ||
95 | + { | ||
96 | + part[av] = line[debut]; | ||
97 | + debut++; | ||
98 | + av++; | ||
99 | + } | ||
100 | + part[av] = '\0'; | ||
101 | + return debut; | ||
102 | + | ||
103 | +} | ||
104 | +int findEnd(char line[LINE_MAX]) | ||
105 | +{ | ||
106 | + int av = 0; | ||
107 | + while(line[av] != '\n') | ||
108 | + av++; | ||
109 | + return av; | ||
110 | +} | ||
111 | +void readElement(char element[LINE_MAX],ptoeuvres film) | ||
112 | +{ | ||
113 | + | ||
114 | + int begin = 0; | ||
115 | + if(element[0] == '\t') | ||
116 | + begin = 2; | ||
117 | + int Pbegin = strpbrk(element,"(") - element; | ||
118 | + int Pend =strpbrk(element,")") - element; | ||
119 | + int end = findEnd(element); | ||
120 | + | ||
121 | + readPartOfLine(begin,Pbegin,element,film->title); | ||
122 | + | ||
123 | + readPartOfLine(Pbegin+1,Pend,element,film->annee); | ||
124 | + | ||
125 | + readPartOfLine(Pend+1,end,element,film->commentaire); | ||
126 | + | ||
127 | + | ||
128 | + | ||
129 | +} | ||
130 | +void initOeuvre(ptoeuvres oe) | ||
131 | +{ | ||
132 | + | ||
133 | + | ||
134 | + int e; | ||
135 | + for(e = 0;e<LINE_MAX;e++) | ||
136 | + { | ||
137 | + oe->annee[e] = malloc(sizeof(char)); | ||
138 | + oe->commentaire[e] = malloc(sizeof(char)); | ||
139 | + oe->title[e] = malloc(sizeof(char)); | ||
140 | + } | ||
141 | + oe->suivant = NULL; | ||
142 | + | ||
143 | + | ||
144 | +} | ||
145 | + | ||
146 | +void readFile(FILE *file, tableReal database) | ||
147 | +{ | ||
148 | + | ||
149 | + int actualReal = 0; | ||
150 | + int virgule = 0; | ||
151 | + int tab = 0; | ||
152 | + int end = 0; | ||
153 | + int av = 0; | ||
154 | + | ||
155 | + char line[LINE_MAX]; | ||
156 | + char element[LINE_MAX]; | ||
157 | + char nom[LINE_MAX]; | ||
158 | + char prenom[LINE_MAX]; | ||
159 | + | ||
160 | + char *ret; | ||
161 | + | ||
162 | + Oeuvres initOe; | ||
163 | + ptoeuvres ptInitOe = NULL; | ||
164 | + | ||
165 | + | ||
166 | + while(av == 0) | ||
167 | + { | ||
168 | + | ||
169 | + if(fgets(line,LINE_MAX,file) != NULL) | ||
170 | + { | ||
171 | + | ||
172 | + | ||
173 | + ret = strpbrk(line,","); | ||
174 | + if(ret != NULL) | ||
175 | + { | ||
176 | + virgule = ret - line; | ||
177 | + tab = strpbrk(line,"\t") - line; | ||
178 | + end = findEnd(line); | ||
179 | + readPartOfLine(0,virgule,line,nom); | ||
180 | + readPartOfLine(virgule+1,tab,line,prenom); | ||
181 | + | ||
182 | + int actualReal = hashNum(nom,prenom); | ||
183 | + | ||
184 | + database[actualReal] = malloc(sizeof(Realisateur)); | ||
185 | + readPartOfLine(0,virgule,line,database[actualReal]->nom); | ||
186 | + readPartOfLine(virgule+1,tab,line,database[actualReal]->prenom); | ||
187 | + | ||
188 | + | ||
189 | + database[actualReal]->filmographie = malloc(sizeof(Oeuvres)); | ||
190 | + ptInitOe = database[actualReal]->filmographie; | ||
191 | + | ||
192 | + initOeuvre(ptInitOe); | ||
193 | + readPartOfLine(tab+1,end,line,element); | ||
194 | + readElement(element,ptInitOe); | ||
195 | + | ||
196 | + | ||
197 | + } | ||
198 | + else if(strcmp(line,"\n") != 0) | ||
199 | + { | ||
200 | + | ||
201 | + ptInitOe->suivant = malloc(sizeof(Oeuvres)); | ||
202 | + ptInitOe = ptInitOe->suivant; | ||
203 | + initOeuvre(ptInitOe); | ||
204 | + readElement(line,ptInitOe); | ||
205 | + } | ||
206 | + } | ||
207 | + else | ||
208 | + av = 1; | ||
209 | + | ||
210 | + | ||
211 | + | ||
212 | + } | ||
213 | + | ||
214 | +} | ||
215 | +void afficherFilm(ptoeuvres oe) | ||
216 | +{ | ||
217 | + printf("titre : %s, annee : %s, commentaire : %s \n",oe->title,oe->annee,oe->commentaire); | ||
218 | + | ||
219 | +} | ||
220 | +void afficherTable(tableReal table) | ||
221 | +{ | ||
222 | + int e; | ||
223 | + ptoeuvres oe; | ||
224 | + for(e=0;e<TABLE_SIZE;e++) | ||
225 | + { | ||
226 | + if(table[e] != NULL) | ||
227 | + { | ||
228 | + oe = table[e]->filmographie; | ||
229 | + printf("nom : %s, prenom : %s \n",table[e]->nom,table[e]->prenom); | ||
230 | + while(oe != NULL) | ||
231 | + { | ||
232 | + afficherFilm(oe); | ||
233 | + oe = oe->suivant; | ||
234 | + | ||
235 | + } | ||
236 | + | ||
237 | + | ||
238 | + } | ||
239 | + | ||
240 | + } | ||
241 | +} | ||
242 | +void afficherReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
243 | +{ | ||
244 | + ptrealisateur pt = findReal(table,nom,prenom); | ||
245 | + ptoeuvres ptOe = 0; | ||
246 | + if(pt != NULL) | ||
247 | + { | ||
248 | + ptOe = pt->filmographie; | ||
249 | + while(ptOe != NULL) | ||
250 | + { | ||
251 | + afficherFilm(ptOe); | ||
252 | + ptOe = ptOe->suivant; | ||
253 | + } | ||
254 | + | ||
255 | + } | ||
256 | + | ||
257 | + | ||
258 | + | ||
259 | +} | ||
260 | +void addReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
261 | +{ | ||
262 | + if(findReal(table,nom,prenom) == NULL) | ||
263 | + { | ||
264 | + | ||
265 | + printf("ajout en court \n",nom,prenom); | ||
266 | + int actualReal = hashNum(nom,prenom); | ||
267 | + if(table[actualReal] == NULL) | ||
268 | + { | ||
269 | + | ||
270 | + table[actualReal] = malloc(sizeof(Realisateur)); | ||
271 | + memcpy(table[actualReal]->nom,nom,strlen(nom)+1); | ||
272 | + memcpy(table[actualReal]->prenom,prenom,strlen(prenom)+1); | ||
273 | + table[actualReal]->suivant = NULL; | ||
274 | + } | ||
275 | + else{ | ||
276 | + ptrealisateur pt = table[actualReal]->suivant; | ||
277 | + while(pt != NULL) | ||
278 | + pt = pt->suivant; | ||
279 | + pt = malloc(sizeof(Realisateur)); | ||
280 | + memcpy(pt->nom,nom,strlen(nom)+1); | ||
281 | + memcpy(pt->prenom,prenom,strlen(prenom)+1); | ||
282 | + pt->suivant = NULL; | ||
283 | + | ||
284 | + | ||
285 | + } | ||
286 | + | ||
287 | + | ||
288 | + } | ||
289 | + | ||
290 | + | ||
291 | +} | ||
292 | +void addFilm(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX] ) | ||
293 | +{ | ||
294 | + ptrealisateur pt = findReal(table,nom,prenom); | ||
295 | + ptoeuvres ptOe = 0; | ||
296 | + ptOe = pt->filmographie; | ||
297 | + int X = 0; | ||
298 | + char anne[LINE_MAX]; | ||
299 | + char tittle[LINE_MAX]; | ||
300 | + char commentaire[LINE_MAX]; | ||
301 | +if(ptOe != NULL) | ||
302 | +{ | ||
303 | + while(ptOe->suivant != NULL) | ||
304 | + { | ||
305 | + ptOe = ptOe->suivant; | ||
306 | + } | ||
307 | +} | ||
308 | +else X = 1; | ||
309 | + | ||
310 | + ptoeuvres newOe = malloc(sizeof(Oeuvres)); | ||
311 | + initOeuvre(newOe); | ||
312 | + printf("ajouter un film : \ntitre : "); | ||
313 | + scanf("%s",&tittle); | ||
314 | + printf("annee : "); | ||
315 | + scanf("%s",&anne); | ||
316 | + printf("commentaire : "); | ||
317 | + scanf("%s",&commentaire); | ||
318 | + memcpy(newOe->commentaire,commentaire,strlen(commentaire)+1); | ||
319 | + memcpy(newOe->title,tittle,strlen(tittle)+1); | ||
320 | + memcpy(newOe->annee,anne,strlen(anne)+1); | ||
321 | +if(X == 0) | ||
322 | + ptOe->suivant = newOe; | ||
323 | +else | ||
324 | + pt->filmographie = newOe; | ||
325 | +} | ||
326 | + | ||
327 | +int eraseFilm(ptrealisateur real,char title[LINE_MAX]) | ||
328 | +{ | ||
329 | + ptoeuvres previousOe = real->filmographie; | ||
330 | + ptoeuvres nextOe = real->filmographie->suivant; | ||
331 | + if(previousOe == NULL) | ||
332 | + return 1; | ||
333 | + if(nextOe == NULL) | ||
334 | + { | ||
335 | + if(strcmp(previousOe->title,title) == 0) | ||
336 | + { | ||
337 | + real->filmographie = NULL; | ||
338 | + } | ||
339 | + return 1; | ||
340 | + } | ||
341 | + | ||
342 | + | ||
343 | +if(nextOe != NULL) | ||
344 | +{ | ||
345 | + | ||
346 | + | ||
347 | + while(strcmp(nextOe->title,title) != 0 && (previousOe != NULL && nextOe != nextOe)) | ||
348 | + { | ||
349 | + previousOe = nextOe; | ||
350 | + nextOe = nextOe->suivant; | ||
351 | + if(nextOe == NULL) | ||
352 | + return 1; | ||
353 | + } | ||
354 | + previousOe->suivant = nextOe->suivant; | ||
355 | + free(nextOe); | ||
356 | +} | ||
357 | +else | ||
358 | +{ | ||
359 | + if(strcmp(nextOe->title,title) == 0) | ||
360 | + { | ||
361 | + free(nextOe); | ||
362 | + previousOe->suivant = NULL; | ||
363 | + return 1; | ||
364 | + } | ||
365 | + else if(strcmp(previousOe->title,title) == 0) | ||
366 | + { | ||
367 | + real->filmographie = nextOe; | ||
368 | + free(previousOe); | ||
369 | + return 1; | ||
370 | + } | ||
371 | + | ||
372 | + | ||
373 | +} | ||
374 | + printf("%s n'existe pas \n",title); | ||
375 | + | ||
376 | + | ||
377 | + return 0; | ||
378 | + | ||
379 | +} | ||
380 | + | ||
381 | + | ||
382 | + | ||
383 | +void eraseReal(tableReal table,char nom[LINE_MAX],char prenom[LINE_MAX]) | ||
384 | +{ | ||
385 | + ptrealisateur pt = findReal(table,nom,prenom); | ||
386 | + ptoeuvres ptOe = pt->filmographie->suivant; | ||
387 | + if(pt != NULL) | ||
388 | + { | ||
389 | + printf("effacement en court \n"); | ||
390 | + while(pt->filmographie != NULL) | ||
391 | + { | ||
392 | + pt->filmographie = ptOe->suivant; | ||
393 | + ptOe = ptOe->suivant; | ||
394 | + } | ||
395 | + table[hashNum(nom,prenom)] = NULL; | ||
396 | + free(ptOe); | ||
397 | + free(pt); | ||
398 | + } | ||
399 | + | ||
400 | +} | ||
401 | +void commande() | ||
402 | +{ | ||
403 | + printf("que voulez vous faire ? \n1 = afficher les realisteurs\n2 = chercher et selectionner un realisteur\n3 = afficher le realisateur selectionner\n4 = effacer le realisateur selectionner\n5 = ajouter un film au realisateur selectionner\n6 = effacer un film au realisateur selectioner\n7 = ajouter un realisateur\n8 = quitter \n"); | ||
404 | +} | ||
405 | +void menu(tableReal table) | ||
406 | +{ | ||
407 | + int QUITTER = 0; | ||
408 | + int choix = 0; | ||
409 | + char nom[LINE_MAX]; | ||
410 | + char prenom[LINE_MAX]; | ||
411 | + char nomNew[LINE_MAX]; | ||
412 | + char prenomNew[LINE_MAX]; | ||
413 | + char titre[LINE_MAX]; | ||
414 | + ptrealisateur pt = NULL; | ||
415 | + commande(); | ||
416 | + | ||
417 | + while(QUITTER==0) | ||
418 | + { | ||
419 | + while(choix == 0) | ||
420 | + { | ||
421 | + scanf("%d",&choix); | ||
422 | + if(choix > 8 || choix < 0) | ||
423 | + choix = 0; | ||
424 | + system("cls"); | ||
425 | + } | ||
426 | + switch(choix) | ||
427 | + { | ||
428 | + | ||
429 | + case 1: | ||
430 | + { | ||
431 | + commande(); | ||
432 | + afficherTable(table); | ||
433 | + choix = 0; | ||
434 | + break; | ||
435 | + } | ||
436 | + case 2: | ||
437 | + { | ||
438 | + commande(); | ||
439 | + printf("chercher, nom : "); | ||
440 | + scanf("%s",&nom); | ||
441 | + printf("prenom : "); | ||
442 | + scanf("%s",&prenom); | ||
443 | + pt = findReal(table,nom,prenom); | ||
444 | + choix = 0; | ||
445 | + break; | ||
446 | + } | ||
447 | + case 3: | ||
448 | + { | ||
449 | + commande(); | ||
450 | + if(pt != NULL) | ||
451 | + afficherReal(table,pt->nom,pt->prenom); | ||
452 | + else | ||
453 | + printf("pas de realisateur selectionner !"); | ||
454 | + | ||
455 | + choix = 0; | ||
456 | + break; | ||
457 | + } | ||
458 | + case 4: | ||
459 | + { | ||
460 | + commande(); | ||
461 | + if(pt != NULL) | ||
462 | + eraseReal(table,pt->nom,pt->prenom); | ||
463 | + else | ||
464 | + printf("pas de realisateur selectionner !"); | ||
465 | + | ||
466 | + choix = 0; | ||
467 | + break; | ||
468 | + } | ||
469 | + | ||
470 | + case 5: | ||
471 | + { | ||
472 | + commande(); | ||
473 | + if(pt != NULL) | ||
474 | + addFilm(table,pt->nom,pt->prenom); | ||
475 | + else | ||
476 | + printf("pas de realisateur selectionner !"); | ||
477 | + | ||
478 | + choix = 0; | ||
479 | + break; | ||
480 | + } | ||
481 | + case 6: | ||
482 | + { | ||
483 | + commande(); | ||
484 | + if(pt != NULL) | ||
485 | + { | ||
486 | + printf("nom du film à effacer :"); | ||
487 | + scanf("%s",titre); | ||
488 | + eraseFilm(pt,titre); | ||
489 | + } | ||
490 | + else | ||
491 | + printf("pas de realisateur selectionner !"); | ||
492 | + | ||
493 | + choix = 0; | ||
494 | + break; | ||
495 | + } | ||
496 | + case 7: | ||
497 | + { | ||
498 | + commande(); | ||
499 | + printf("ajouter : nom : "); | ||
500 | + scanf("%s",&nomNew); | ||
501 | + printf("prenom : "); | ||
502 | + scanf("%s",&prenomNew); | ||
503 | + addReal(table,nomNew,prenomNew); | ||
504 | + | ||
505 | + choix = 0; | ||
506 | + break; | ||
507 | + } | ||
508 | + case 8: | ||
509 | + { | ||
510 | + printf("au revoir !"); | ||
511 | + QUITTER = 1; | ||
512 | + break; | ||
513 | + } | ||
514 | + | ||
515 | + | ||
516 | + } | ||
517 | + | ||
518 | + | ||
519 | + } | ||
520 | + | ||
521 | + | ||
522 | +} | ||
523 | +void init() | ||
524 | +{ | ||
525 | + | ||
526 | + tableReal table; | ||
527 | + initTable(table); | ||
528 | + FILE* fichier = NULL; | ||
529 | + fichier = fopen("very_small_example.list", "r+"); | ||
530 | + readFile(fichier,table); | ||
531 | + fclose(fichier); | ||
532 | + | ||
533 | + menu(table); | ||
534 | + | ||
535 | +} | ||
536 | +int main() | ||
537 | +{ | ||
538 | + | ||
539 | + init(); | ||
540 | + return 0; | ||
541 | +} |
No preview for this file type