My Project
Loading...
Searching...
No Matches
quatre.c
Go to the documentation of this file.
1
11#include <stdio.h>
12#include <stdlib.h>
13#include <string.h>
14#include <errno.h>
15#include <strings.h> // strcasecmp : insensitive case
16#include <unistd.h> // access : vérifier si fichier existe
17#include "quatre.h"
18
19
20void menuCandidat_suivreCandidature(ListeCandidats liste, int nbCandidats, Candidat* candidat) {
21 int i, j, k, mustReply = 0, nbPropositions = 0;
22 char reponse1, reponse2, poubelle;
23 FileAttente* file;
24 CandidatTraite* candidatAdmis = (CandidatTraite*) malloc(sizeof(CandidatTraite));
25 ListeCandidatures listeCandidatures;
26
27 if(candidatAdmis == NULL) {
28 perror("malloc");
29 exit(errno);
30 }
31
32 // Création d'une liste qui va contenir les candidatures pour lesquelles le candidat a été accepté
33 // (pour le moment, seul une proposition peut être faite étant donné que seul le département Informatique de Clermont-Ferrand est habilité à donner une réponse)
34 ListeCandidatures propositions = (ListeCandidatures) malloc(candidat->nbCandidatures*sizeof(Candidature*));
35
36 if(propositions == NULL) {
37 perror("malloc");
38 exit(errno);
39 }
40
41 if(candidat->nbCandidatures == 0)
42 fprintf(stderr, "\e[0;91mErreur : vous n'avez aucune candidature en cours, merci de réessayer plus tard.\n\e[0m");
43 else
45
46 for(i=0; i<candidat->nbCandidatures; i++)
47 if(candidat->listeCandidatures[i]->decision == 1 && candidat->listeCandidatures[i]->validation == 0) {
48 mustReply = 1;
49 propositions[nbPropositions++] = candidat->listeCandidatures[i];
50 }
51
52 if(mustReply == 1) {
53 printf("Vous avez %d candidature(s) contenant une proposition d'admission, souhaitez-vous y répondre ? (O/N) : ", nbPropositions);
54 scanf("%*c%c", &reponse1);
55
56 for(i=0; i<nbPropositions; i++) {
57 if(reponse1 == 'o' || reponse1 == 'O') {
58 afficherCandidatures(propositions+i, 1);
59
60 printf("\nSouhaitez-vous accepter ou refuser cette proposition ? (A/R) : ");
61 scanf("%*c%c", &reponse2);
62
63 if(reponse2 == 'a' || reponse2 == 'A'){
64 printf("\n\e[1;32mProposition pour le département '%s' à l'IUT '%s' acceptée !\e[0m\n",
65 propositions[i]->departement, propositions[i]->ville);
66
67 for(j=0; j<candidat->nbCandidatures; j++) {
68 candidat->listeCandidatures[j]->decision = -1;
69 candidat->listeCandidatures[j]->validation = -1;
70 }
71
72 propositions[i]->decision = 1;
73 propositions[i]->validation = 1;
74
75 break;
76 } else {
77 if(reponse2 == 'r' || reponse2 == 'R') {
78 printf("\n\e[1;32mProposition pour le département '%s' à l'IUT '%s' refusée !\e[0m\n",
79 propositions[i]->departement, propositions[i]->ville);
80
81 propositions[i]->validation = -1;
82
83 file = lireCandidatsAttente(propositions[i]->departement, propositions[i]->ville);
84 *candidatAdmis = defiler(file);
85 ecrireCandidatsAttente(propositions[i]->departement, propositions[i]->ville, file);
86 ajouterCandidatAdmis(propositions[i]->departement, propositions[i]->ville, candidatAdmis);
87
88 if(strcmp(candidatAdmis->nom, "") != 0 && strcmp(candidatAdmis->prenom, "") != 0) {
89 for(j=0; j<nbCandidats; j++) {
90 if(strcmp(liste[j]->nom, candidatAdmis->nom) == 0
91 && strcmp(liste[j]->prenom, candidatAdmis->prenom) == 0) {
92 listeCandidatures = liste[j]->listeCandidatures;
93 for(k=0; k<liste[j]->nbCandidatures; k++)
94 if(listeCandidatures[k]->ville == propositions[i]->ville
95 && listeCandidatures[k]->departement == propositions[i]->departement) {
96 listeCandidatures[k]->decision = 1;
97 break;
98 }
99 }
100 }
101 }
102 } else {
103 while ((poubelle = getchar()) != '\n' && poubelle != EOF);
104 fprintf(stderr, "\n\e[0;91mErreur : la réponse saisie est incorrecte. Merci de réessayer plus tard.\n\e[0m");
105 break;
106 }
107 }
108 } else {
109 if(reponse1 == 'n' || reponse1 == 'N')
110 printf("\n\t\e[1mTrès bien. Vous pouvez toujours donner votre réponse ultérieurement.\e[0m\n");
111 else {
112 while ((poubelle = getchar()) != '\n' && poubelle != EOF);
113 fprintf(stderr, "\n\e[0;91mErreur : la réponse saisie est incorrecte. Merci de réessayer plus tard.\n\e[0m");
114 break;
115 }
116 }
117 }
118 }
119
120 free(propositions);
121 free(candidatAdmis);
122}
123
124void menuResponsable_traiterCandidatures(VilleIUT** tiut, int nbVilles, ListeCandidats liste, int nbCandidats) {
125 char dept[LEN_MAX], ville[LEN_MAX], choix, poubelle;
126 int nbCandidatsAccept, pos, verif, checkQueue = 0;
127 ListeDept ldept;
128
129 strcpy(dept, "Informatique");
130 strcpy(ville, "Clermont-Ferrand");
131
132 printf("\n\e[3;32mLes deux prochaines lignes sont affichées à titre informatif\e[0m\n\n");
133 printf("Entrez le nom de la ville que vous souhaitez traiter : %s\n", ville);
134 printf("Quel département souhaitez-vous modifier ? : %s\n", dept);
135
136 printf("\n\e[1;32mTraitement des candidatures pour le département '%s' de l'IUT '%s'\n\n\e[0m", dept, ville);
137
138 printf("Combien de candidats souhaitez-vous accepter ? : ");
139 if(scanf("%d", &nbCandidatsAccept) == 0) {
140 while ((poubelle = getchar()) != '\n' && poubelle != EOF);
141 fprintf(stderr, "\n\e[0;91mErreur : la valeur entrée est invalide, merci de réessayer plus tard.\n\n\e[0m");
142 return;
143 }
144
145 pos = rechercherVille(tiut, nbVilles, ville);
146
147 ldept = tiut[pos]->ldept;
148
149 while(ldept != NULL && strcmp(ldept->departement, dept) != 0)
150 ldept = ldept->suiv;
151
152 if(ldept->noteMinimale == -1) {
153 printf("\n\e[1;91mAttention, après avoir entré cette valeur, elle ne sera plus modifiable !\e[0m\n\nQuelle est la note minimale pour l'acception du candidat ? : ");
154 verif = scanf("%f", &ldept->noteMinimale);
155 while((ldept->noteMinimale) < 0 || (ldept->noteMinimale) > 20 || verif == 0) {
156 fprintf(stderr, "\e[0;91mLa note entrée est incorrecte\n\e[0mEntrez une note minimale entre 0 et 20 : ");
157 verif = scanf("%f", &ldept->noteMinimale);
158 }
159 } else {
160 checkQueue = 1;
161 }
162
163 printf("\nMerci de confirmer : Il faut accepter %d candidat avec une note minimale de %.2f (O/N) ? : ", nbCandidatsAccept, ldept->noteMinimale);
164
165 scanf("%*c%c", &choix);
166
167 if(choix == 'n' || choix == 'N')
168 printf("\n\e[1mAnnulation de l'opération.\e[0m\n\n");
169 else
170 if(choix == 'o' || choix == 'O')
171 traiterCandidatures(liste, nbCandidats, nbCandidatsAccept, ldept->noteMinimale, checkQueue);
172 else {
173 while ((poubelle = getchar()) != '\n' && poubelle != EOF);
174 fprintf(stderr, "\n\e[0;91mErreur : la valeur entrée est invalide, merci de réessayer plus tard.\n\n\e[0m");
175 }
176
177}
178
180 FileAttente* file = (FileAttente*) malloc(sizeof(FileAttente));
181
182 if(file == NULL) {
183 perror("malloc");
184 exit(errno);
185 }
186
187 file->tete = NULL;
188 file->queue = NULL;
189 file->nbAttente = 0;
190
191 return file;
192}
193
195 return file->tete == NULL;
196}
197
198void enfiler(FileAttente *file, CandidatTraite candidat) {
199 Maillon* nouveauMaillon = (Maillon*) malloc(sizeof(Maillon));
200 nouveauMaillon->candidat = candidat;
201 nouveauMaillon->suivant = NULL;
202
203 if (estVide(file))
204 file->tete = nouveauMaillon;
205 else
206 file->queue->suivant = nouveauMaillon;
207
208 file->queue = nouveauMaillon;
209}
210
212 CandidatTraite candidat = {"", "", 0, 0, 0, 0, 0};
213 Maillon *tete;
214
215 if (!estVide(file)) {
216 tete = file->tete;
217
218 candidat = tete->candidat;
219 file->tete = tete->suivant;
220 file->nbAttente = file->nbAttente-1;
221 free(tete);
222 }
223
224 return candidat;
225}
226
227FileAttente* lireCandidatsAttente(char* dept, char* ville) {
228 FileAttente* fileCandidats = creerFile();
229 CandidatTraite candidat;
230 int i;
231
232 char fNameAttente[100];
233
234 strcpy(fNameAttente, "donnees/");
235 strcat(fNameAttente, ville);
236 strcat(fNameAttente, "_");
237 strcat(fNameAttente, dept);
238 strcat(fNameAttente, "_Attente.don");
239
240 if(access(fNameAttente, F_OK) != -1) {
241 FILE *fAttente = fopen(fNameAttente, "r");
242
243 if(fAttente == NULL) {
244 perror("fopen");
245 exit(errno);
246 }
247
248 fscanf(fAttente, "%d\n", &fileCandidats->nbAttente);
249
250 for(i=0; i<fileCandidats->nbAttente; i++) {
251 fscanf(fAttente, "%[^\n]\n%[^\n]\n%f %f %f %f %f\n",
252 candidat.nom, candidat.prenom, &candidat.moyenneMath, &candidat.moyenneFrancais,
253 &candidat.moyenneAnglais, &candidat.moyenneSpecialite, &candidat.noteGlobale);
254
255 enfiler(fileCandidats, candidat);
256 }
257
258 fclose(fAttente);
259 }
260
261 return fileCandidats;
262}
263
264void ecrireCandidatsAttente(char* dept, char* ville, FileAttente* file) {
265 Maillon* parcourir = file->tete;
266 char fNameAttente[100];
267
268 strcpy(fNameAttente, "donnees/");
269 strcat(fNameAttente, ville);
270 strcat(fNameAttente, "_");
271 strcat(fNameAttente, dept);
272 strcat(fNameAttente, "_Attente.don");
273
274 FILE *fAttente = fopen(fNameAttente, "w");
275
276 if(fAttente == NULL) {
277 perror("fopen");
278 exit(errno);
279 }
280
281 if(file->nbAttente > 0)
282 fprintf(fAttente, "%d\n", file->nbAttente);
283
284 while(parcourir != NULL) {
285 fprintf(fAttente, "%s\n%s\n%f %f %f %f %f\n",
286 parcourir->candidat.nom, parcourir->candidat.prenom, parcourir->candidat.moyenneMath, parcourir->candidat.moyenneFrancais,
287 parcourir->candidat.moyenneAnglais, parcourir->candidat.moyenneSpecialite, parcourir->candidat.noteGlobale);
288
289 parcourir = parcourir->suivant;
290 }
291
292 fclose(fAttente);
293}
294
295
296int compareCandidatsTraite(const void* p1, const void* p2) {
297 CandidatTraite* c1 = *(ListeAdmis) p1;
298 CandidatTraite* c2 = *(ListeAdmis) p2;
299
300 char nomComplet1[60];
301 strcpy(nomComplet1, c1->nom);
302 strcat(nomComplet1, c1->prenom);
303
304 char nomComplet2[60];
305 strcpy(nomComplet2, c2->nom);
306 strcat(nomComplet2, c2->prenom);
307
308 return strcmp(nomComplet1, nomComplet2);
309}
310
311void ajouterCandidatAdmis(char* dept, char* ville, CandidatTraite* candidat) {
312 ListeAdmis liste;
313 int nbAdmis, i;
314
315 char fNameAdmis[100];
316
317 strcpy(fNameAdmis, "donnees/");
318 strcat(fNameAdmis, ville);
319 strcat(fNameAdmis, "_");
320 strcat(fNameAdmis, dept);
321 strcat(fNameAdmis, "_Admis.don");
322
323 FILE *fAdmis = fopen(fNameAdmis, "r");
324
325 if(fAdmis == NULL) {
326 perror("fopen");
327 exit(errno);
328 }
329
330 fscanf(fAdmis, "%d\n", &nbAdmis);
331
332 liste = (ListeAdmis) malloc((nbAdmis+1)*sizeof(CandidatTraite*));
333
334 if(liste == NULL) {
335 perror("malloc");
336 exit(errno);
337 }
338
339 for(i=0; i<nbAdmis; i++) {
340 liste[i] = (CandidatTraite*) malloc(sizeof(CandidatTraite));
341
342 if(liste[i] == NULL) {
343 perror("malloc");
344 exit(errno);
345 }
346
347 fscanf(fAdmis, "%[^\n]\n%[^\n]\n%f %f %f %f %f\n",
348 liste[i]->nom, liste[i]->prenom, &liste[i]->moyenneMath, &liste[i]->moyenneFrancais,
349 &liste[i]->moyenneAnglais, &liste[i]->moyenneSpecialite, &liste[i]->noteGlobale);
350 }
351
352 fclose(fAdmis);
353
354 fAdmis = fopen(fNameAdmis, "w");
355
356 if(fAdmis == NULL) {
357 perror("fopen");
358 exit(errno);
359 }
360
361 nbAdmis += 1;
362 liste[nbAdmis-1] = candidat;
363
364 fprintf(fAdmis, "%d\n", nbAdmis);
365
366 for(i=0; i<nbAdmis; i++) {
367 fprintf(fAdmis, "%s\n%s\n%f %f %f %f %f\n",
368 liste[i]->nom, liste[i]->prenom, liste[i]->moyenneMath, liste[i]->moyenneFrancais,
369 liste[i]->moyenneAnglais, liste[i]->moyenneSpecialite, liste[i]->noteGlobale);
370 }
371
372 fclose(fAdmis);
373 free(liste);
374}
375
376void afficherCandidatsAdmis(char* dept, char* ville) {
377 ListeAdmis liste;
378 int nbAdmis, i;
379
380 char fNameAdmis[100];
381
382 strcpy(fNameAdmis, "donnees/");
383 strcat(fNameAdmis, ville);
384 strcat(fNameAdmis, "_");
385 strcat(fNameAdmis, dept);
386 strcat(fNameAdmis, "_Admis.don");
387
388 if(access(fNameAdmis, F_OK) != -1) {
389 FILE *fAdmis = fopen(fNameAdmis, "r");
390
391 if(fAdmis == NULL) {
392 perror("fopen");
393 exit(errno);
394 }
395
396 fscanf(fAdmis, "%d\n", &nbAdmis);
397
398 liste = (ListeAdmis) malloc(nbAdmis*sizeof(CandidatTraite*));
399
400 if(liste == NULL) {
401 perror("malloc");
402 exit(errno);
403 }
404
405 for(i=0; i<nbAdmis; i++) {
406 liste[i] = (CandidatTraite*) malloc(sizeof(CandidatTraite));
407
408 if(liste[i] == NULL) {
409 perror("malloc");
410 exit(errno);
411 }
412
413 fscanf(fAdmis, "%[^\n]\n%[^\n]\n%f %f %f %f %f\n",
414 liste[i]->nom, liste[i]->prenom, &liste[i]->moyenneMath, &liste[i]->moyenneFrancais,
415 &liste[i]->moyenneAnglais, &liste[i]->moyenneSpecialite, &liste[i]->noteGlobale);
416 }
417
418 qsort(liste, nbAdmis, sizeof(CandidatTraite*), compareCandidatsTraite);
419
420 for(i=0; i<nbAdmis; i++) {
421 printf("\e[4;37mCandidat '%s %s' :\e[0m"
422 "\n - Moyenne en mathématiques : %.2f\n - Moyenne en français : %.2f"
423 "\n - Moyenne en anglais : %.2f\n - Moyenne en spécialité : %.2f"
424 "\n - Note globale attribuée : %.2f\n\n",
425 liste[i]->nom, liste[i]->prenom, liste[i]->moyenneMath, liste[i]->moyenneFrancais,
426 liste[i]->moyenneAnglais, liste[i]->moyenneSpecialite, liste[i]->noteGlobale);
427 }
428
429 fclose(fAdmis);
430 free(liste);
431 } else
432 fprintf(stderr, "\n\e[1;91mErreur : les candidatures n'ont pas encore été traitées, merci de réessayer plus tard.\n\n\e[0m");
433
434}
435
437 int i=0;
438 Maillon* parcourir = file->tete;
439
440 if(!estVide(file))
441 while(parcourir != NULL) {
442 printf("\e[4;37mCandidat '%s %s' (position %d/%d) :\e[0m"
443 "\n - Moyenne en mathématiques : %.2f\n - Moyenne en français : %.2f"
444 "\n - Moyenne en anglais : %.2f\n - Moyenne en spécialité : %.2f"
445 "\n - Note globale attribuée : %.2f\n\n",
446 parcourir->candidat.nom, parcourir->candidat.prenom, ++i, file->nbAttente, parcourir->candidat.moyenneMath, parcourir->candidat.moyenneFrancais,
447 parcourir->candidat.moyenneAnglais, parcourir->candidat.moyenneSpecialite, parcourir->candidat.noteGlobale);
448 parcourir = parcourir->suivant;
449 }
450 else
451 fprintf(stderr, "\n\e[1;91mErreur : les candidatures n'ont pas encore été traitées ou aucun candidat n'est en attente, merci de réessayer plus tard.\n\n\e[0m");
452
453}
void afficherCandidatures(ListeCandidatures candidatures, int nbCandidatures)
Affiche récursivement toutes les candidatures d'un seul candidat.
Definition: deux.c:160
FileAttente * creerFile(void)
Definition: quatre.c:179
FileAttente * lireCandidatsAttente(char *dept, char *ville)
Definition: quatre.c:227
void menuCandidat_suivreCandidature(ListeCandidats liste, int nbCandidats, Candidat *candidat)
Permet de voir les candidatures et les décisions prises.
Definition: quatre.c:20
CandidatTraite defiler(FileAttente *file)
Definition: quatre.c:211
void menuResponsable_traiterCandidatures(VilleIUT **tiut, int nbVilles, ListeCandidats liste, int nbCandidats)
Permet d'accepter un certain nombre de candidat ayant une note minimale.
Definition: quatre.c:124
void enfiler(FileAttente *file, CandidatTraite candidat)
Definition: quatre.c:198
void afficherCandidatsAttente(FileAttente *file)
Definition: quatre.c:436
void ajouterCandidatAdmis(char *dept, char *ville, CandidatTraite *candidat)
Definition: quatre.c:311
void afficherCandidatsAdmis(char *dept, char *ville)
Definition: quatre.c:376
int compareCandidatsTraite(const void *p1, const void *p2)
Definition: quatre.c:296
void ecrireCandidatsAttente(char *dept, char *ville, FileAttente *file)
Definition: quatre.c:264
int estVide(FileAttente *file)
Definition: quatre.c:194
Partie 4 de la SAE 1.02.
int nbCandidatures
Definition: structures.h:31
ListeCandidatures listeCandidatures
Definition: structures.h:32
char prenom[LEN_MAX]
Definition: structures.h:40
float noteGlobale
Definition: structures.h:41
char nom[LEN_MAX]
Definition: structures.h:40
float moyenneAnglais
Definition: structures.h:41
float moyenneSpecialite
Definition: structures.h:41
float moyenneMath
Definition: structures.h:41
float moyenneFrancais
Definition: structures.h:41
int validation
Definition: structures.h:22
int decision
Definition: structures.h:22
int nbAttente
Definition: structures.h:52
Maillon * tete
Definition: structures.h:50
Maillon * queue
Definition: structures.h:51
char departement[LEN_MAX]
Definition: structures.h:5
struct MaillonDept * suiv
Definition: structures.h:9
float noteMinimale
Definition: structures.h:8
CandidatTraite candidat
Definition: structures.h:45
struct Maillon * suivant
Definition: structures.h:46
ListeDept ldept
Definition: structures.h:16
#define LEN_MAX
Definition: structures.h:1
Candidature ** ListeCandidatures
Definition: structures.h:25
CandidatTraite ** ListeAdmis
Definition: structures.h:55
void traiterCandidatures(ListeCandidats liste, int nbCandidats, int nbCandidatsAccept, float noteMini, int checkQueue)
Permet de traiter les candidatures et met les candidats dans des fichiers txt suivant s'ils sont admi...
Definition: trois.c:135
int rechercherVille(VilleIUT **tiut, int nbVilles, char *searchIUT)
Fonction de recherche pour trouver la position de la ville recherchée dans le tableau tiut.
Definition: un.c:735