My Project
Loading...
Searching...
No Matches
trois.c
Go to the documentation of this file.
1#include <stdio.h>
2#include <stdlib.h>
3#include <string.h>
4#include <errno.h>
5#include <strings.h> // strcasecmp : insensitive case
6#include "trois.h"
7#include "../IV/quatre.c"
8
9void calculerNoteGlobale(ListeCandidats liste, int nbCandidats) {
10 int i;
11 float noteGlobale;
12 for(i=0; i<nbCandidats; i++) {
13 noteGlobale = ((liste[i]->moyenneMath)*5
14 + (liste[i]->moyenneFrancais)*10
15 + (liste[i]->moyenneAnglais)*5
16 + (liste[i]->moyenneSpecialite)*16)/36;
17
18 liste[i]->noteGlobale = noteGlobale;
19 }
20}
21
22void afficherCandidaturesByDept(ListeCandidats liste, int nbCandidats, char* searchIUT, char* searchDept) {
23 int i, j;
24 char decision[LEN_MAX], validation[LEN_MAX];
25 ListeCandidatures candidatures;
26 Candidature* candidature;
27
28 ListeCandidats listeTriee = (ListeCandidats) malloc(nbCandidats*sizeof(Candidat*));
29
30 if(listeTriee == NULL) {
31 perror("malloc");
32 exit(errno);
33 }
34
35 for(i=0; i<nbCandidats; i++) {
36 memcpy(&listeTriee[i], &liste[i], sizeof(Candidat*));
37 }
38
39 qsort(listeTriee, nbCandidats, sizeof(Candidat*), compareCandidats);
40
41 for(i=0; i<nbCandidats; i++) {
42 candidatures = listeTriee[i]->listeCandidatures;
43
44 for(j=0; j<listeTriee[i]->nbCandidatures; j++) {
45 candidature = candidatures[j];
46
47 if(strcasecmp(candidature->ville, searchIUT) == 0) {
48 if(strcasecmp(candidature->departement, searchDept) == 0) {
49 switch (candidature->decision) {
50 case 0:
51 strcpy(decision, "en cours de traitement");
52 break;
53 case 1:
54 strcpy(decision, "admis");
55 break;
56 case -1:
57 strcpy(decision, "refusé");
58 break;
59 case 2:
60 strcpy(decision, "sur liste d'attente");
61 break;
62 default:
63 strcpy(decision, "inconnu");
64 break;
65 }
66
67 switch (candidature->validation) {
68 case 0:
69 strcpy(validation, "n'a pas encore décidé");
70 break;
71 case 1:
72 strcpy(validation, "refuse la proposition");
73 break;
74 case -1:
75 strcpy(validation, "accepte");
76 break;
77 default:
78 strcpy(validation, "inconnu");
79 break;
80 }
81
82 printf("\n\e[4;37mCandidature de '%s %s' pour le département '%s' à l'IUT '%s' :\n\e[0m"
83 " - Décision du département : %s,\n - Décision du candidat : %s,\n - Note globale : %.2f\n\n",
84 listeTriee[i]->nom, listeTriee[i]->prenom, candidature->departement, candidature->ville, decision, validation, listeTriee[i]->noteGlobale);
85 }
86 }
87 }
88 }
89
90 free(listeTriee);
91}
92
93void merge(ListeCandidats liste, int start, int middle, int end) {
94 int i, j, k=start;
95 int n1 = middle - start + 1;
96 int n2 = end - middle;
97 Candidat* left[n1], *right[n2];
98
99 for (i = 0; i < n1; i++)
100 left[i] = liste[start + i];
101 for (j = 0; j < n2; j++)
102 right[j] = liste[middle + 1 + j];
103
104 i = 0;
105 j = 0;
106 while (i < n1 && j < n2) {
107 if (left[i]->noteGlobale >= right[j]->noteGlobale)
108 liste[k++] = left[i++];
109 else
110 liste[k++] = right[j++];
111 }
112
113 while (i < n1)
114 liste[k++] = left[i++];
115 while (j < n2)
116 liste[k++] = right[j++];
117}
118
119void triDichotomiqueFusion(ListeCandidats liste, int start, int end) {
120 if (start < end) {
121 int middle = (start + end) / 2;
122 triDichotomiqueFusion(liste, start, middle);
123 triDichotomiqueFusion(liste, middle + 1, end);
124 merge(liste, start, middle, end);
125 }
126}
127
129 printf("\tCandidat n°%d, '%s %s' :"
130 "\n\t - Note globale : %.2f\n\n",
131 candidat.id, candidat.prenom, candidat.nom,
132 candidat.noteGlobale);
133}
134
135void traiterCandidatures(ListeCandidats liste, int nbCandidats, int nbCandidatsAccept, float noteMini, int checkQueue) {
136 int i, j, k, nbCandidatsMatch = 0, nbAdmis=0, nbAttente=0, nbRefuse=0;
137 char dept[LEN_MAX], ville[LEN_MAX], fNameAdmis[100], fNameAttente[100];
138 FILE* fAdmis, *fAttente;
139
140 FileAttente* file;
141 CandidatTraite* candidat = (CandidatTraite*) malloc(sizeof(CandidatTraite));
142
143 Candidature* candidature;
144 ListeCandidatures candidatures;
145 ListeCandidats listeCandidatsMatch;
146
147 Candidat listeAdmis[nbCandidatsAccept], listeAttente[nbCandidatsAccept], listeRefuses[nbCandidatsAccept];
148
149 strcpy(dept, "Informatique");
150 strcpy(ville, "Clermont-Ferrand");
151
152 if(checkQueue == 1) {
153 file = lireCandidatsAttente(dept, ville);
154
155 if(file->nbAttente > 0) {
156 printf("\n\n\e[4;37mCandidats acceptés :\e[0m\n\n");
157
158 for(i=0; i<nbCandidatsAccept; i++) {
159 *candidat = defiler(file);
160 ajouterCandidatAdmis(dept, ville, candidat);
161 nbAdmis++;
162
163 printf("\tCandidat '%s %s' :"
164 "\n\t - Note globale : %.2f\n\n",
165 candidat->prenom, candidat->nom,
166 candidat->noteGlobale);
167 printf("\n");
168
169 if(strcmp(candidat->nom, "") != 0 && strcmp(candidat->prenom, "") != 0) {
170 for(j=0; j<nbCandidats; j++) {
171 if(strcmp(liste[j]->nom, candidat->nom) == 0 && strcmp(liste[j]->prenom, candidat->prenom)) {
172 candidatures = liste[j]->listeCandidatures;
173 for(k=0; k<liste[j]->nbCandidatures; k++)
174 if(candidatures[k]->ville == ville
175 && candidatures[k]->departement == dept) {
176 candidatures[k]->decision = 1;
177 break;
178 }
179 }
180 }
181 }
182 }
183
184 printf("\e[1;32m%d candidats ont été admis depuis la file d'attente.\n\n\e[0m",
185 nbAdmis);
186 ecrireCandidatsAttente(dept, ville, file);
187 } else
188 printf("\n\e[1;32mAucun candidat n'a été admis puisque la file d'attente est vide.\n\n\e[0m");
189 } else {
190 listeCandidatsMatch = (ListeCandidats) malloc(nbCandidats*sizeof(Candidat*));
191
192 for(i=0; i<nbCandidats; i++) {
193 candidatures = liste[i]->listeCandidatures;
194
195 for(j=0; j<liste[i]->nbCandidatures; j++) {
196 candidature = candidatures[j];
197
198 if(strcasecmp(candidature->ville, ville) == 0)
199 if(strcasecmp(candidature->departement, dept) == 0)
200 if(candidature->decision == 0)
201 listeCandidatsMatch[nbCandidatsMatch++] = liste[i];
202 }
203 }
204
205 calculerNoteGlobale(listeCandidatsMatch, nbCandidatsMatch); // Calcul des notes de chaque candidat
206 triDichotomiqueFusion(listeCandidatsMatch, 0, nbCandidatsMatch-1); // Trie les candidats selon leur noteGlobale
207
208 for(i=0; i<nbCandidatsMatch; i++) {
209 if(listeCandidatsMatch[i]->noteGlobale >= noteMini) {
210 if(nbAdmis < nbCandidatsAccept) {
211 for(j=0; j<listeCandidatsMatch[i]->nbCandidatures; j++)
212 if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->ville, ville) == 0)
213 if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->departement, dept) == 0)
214 listeCandidatsMatch[i]->listeCandidatures[j]->decision = 1;
215
216 listeAdmis[nbAdmis++] = *listeCandidatsMatch[i];
217 } else {
218 for(j=0; j<listeCandidatsMatch[i]->nbCandidatures; j++)
219 if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->ville, ville) == 0)
220 if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->departement, dept) == 0)
221 listeCandidatsMatch[i]->listeCandidatures[j]->decision = 2;
222
223 listeAttente[nbAttente++] = *listeCandidatsMatch[i];
224 }
225 } else {
226 for(j=0; j<listeCandidatsMatch[i]->nbCandidatures; j++)
227 if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->ville, ville) == 0)
228 if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->departement, dept) == 0)
229 listeCandidatsMatch[i]->listeCandidatures[j]->decision = -1;
230
231 listeRefuses[nbRefuse++] = *listeCandidatsMatch[i];
232 }
233 }
234
235 strcpy(fNameAdmis, "donnees/");
236 strcat(fNameAdmis, ville);
237 strcat(fNameAdmis, "_");
238 strcat(fNameAdmis, dept);
239 strcat(fNameAdmis, "_Admis.don");
240
241 fAdmis = fopen(fNameAdmis, "w");
242
243 if(fAdmis == NULL) {
244 perror("fopen");
245 exit(errno);
246 }
247
248 if(nbAdmis > 0)
249 fprintf(fAdmis, "%d\n", nbAdmis);
250
251 printf("\n\n\e[4;37mCandidats acceptés :\e[0m\n\n");
252 for(i=0; i<nbAdmis; i++) {
253 afficherCandidatTraite(listeAdmis[i]);
254 printf("\n");
255
256 fprintf(fAdmis, "%s\n%s\n%.2f %.2f %.2f %.2f %.2f\n",
257 listeAdmis[i].nom, listeAdmis[i].prenom,
258 listeAdmis[i].moyenneMath, listeAdmis[i].moyenneFrancais,
259 listeAdmis[i].moyenneAnglais, listeAdmis[i].moyenneSpecialite,
260 listeAdmis[i].noteGlobale);
261 }
262
263 fclose(fAdmis);
264
265 if(nbAdmis == 0)
266 printf("\tAucun candidat accepté.\n\n");
267
268 strcpy(fNameAttente, "donnees/");
269 strcat(fNameAttente, ville);
270 strcat(fNameAttente, "_");
271 strcat(fNameAttente, dept);
272 strcat(fNameAttente, "_Attente.don");
273
274 fAttente = fopen(fNameAttente, "w");
275
276 if(fAttente == NULL) {
277 perror("fopen");
278 exit(errno);
279 }
280
281 if(nbAttente > 0)
282 fprintf(fAttente, "%d\n", nbAttente);
283
284 printf("\e[4;37mCandidats en liste d'attente :\e[0m\n\n");
285 for(i=0; i<nbAttente; i++) {
286 afficherCandidatTraite(listeAttente[i]);
287 printf("\n\n");
288
289 fprintf(fAttente, "%s\n%s\n%.2f %.2f %.2f %.2f %.2f\n",
290 listeAttente[i].nom, listeAttente[i].prenom,
291 listeAttente[i].moyenneMath, listeAttente[i].moyenneFrancais,
292 listeAttente[i].moyenneAnglais, listeAttente[i].moyenneSpecialite,
293 listeAttente[i].noteGlobale);
294 }
295
296 fclose(fAttente);
297
298 if(nbAttente == 0)
299 printf("\tAucun candidat en liste d'attente.\n\n");
300
301 printf("\e[4;37mCandidats refusés :\e[0m\n\n");
302 for(i=0; i<nbRefuse; i++) {
303 afficherCandidatTraite(listeRefuses[i]);
304 printf("\n\n");
305 }
306
307 if(nbRefuse == 0)
308 printf("\tAucun candidat refusé.\n\n");
309
310 printf("\e[1;32m%d candidats ont été admis, %d mis en file d'attente et %d refusés.\n\n\e[0m",
311 nbAdmis, nbAttente, nbRefuse);
312
313 free(listeCandidatsMatch);
314 }
315}
int compareCandidats(const void *p1, const void *p2)
Compare deux candidats suivant l'ordre alphabetique.
Definition: deux.c:323
FileAttente * lireCandidatsAttente(char *dept, char *ville)
Definition: quatre.c:227
CandidatTraite defiler(FileAttente *file)
Definition: quatre.c:211
void ajouterCandidatAdmis(char *dept, char *ville, CandidatTraite *candidat)
Definition: quatre.c:311
void ecrireCandidatsAttente(char *dept, char *ville, FileAttente *file)
Definition: quatre.c:264
float moyenneAnglais
Definition: structures.h:30
float noteGlobale
Definition: structures.h:30
int id
Definition: structures.h:28
char nom[LEN_MAX]
Definition: structures.h:29
float moyenneMath
Definition: structures.h:30
char prenom[LEN_MAX]
Definition: structures.h:29
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
char departement[LEN_MAX]
Definition: structures.h:21
char ville[LEN_MAX]
Definition: structures.h:21
int validation
Definition: structures.h:22
int decision
Definition: structures.h:22
int nbAttente
Definition: structures.h:52
#define LEN_MAX
Definition: structures.h:1
Candidat ** ListeCandidats
Definition: structures.h:35
void merge(ListeCandidats liste, int start, int middle, int end)
Fonction de tri dichotomique.
Definition: trois.c:93
void afficherCandidaturesByDept(ListeCandidats liste, int nbCandidats, char *searchIUT, char *searchDept)
Affiche les candidatures pour un seul département dans un IUT.
Definition: trois.c:22
void afficherCandidatTraite(Candidat candidat)
Affiche les information d'un candidat.
Definition: trois.c:128
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
void triDichotomiqueFusion(ListeCandidats liste, int start, int end)
Algorithme de tri dichotomique.
Definition: trois.c:119
void calculerNoteGlobale(ListeCandidats liste, int nbCandidats)
Calcul la note globale en fonction des coéfficients prédéfinis.
Definition: trois.c:9