Loading...
Searching...
No Matches
trois.c
Go to the documentation of this file.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <strings.h> // strcasecmp : insensitive case
#include "trois.h"
#include "../IV/quatre.c"
void calculerNoteGlobale(ListeCandidats liste, int nbCandidats) {
int i;
float noteGlobale;
for(i=0; i<nbCandidats; i++) {
noteGlobale = ((liste[i]->moyenneMath)*5
+ (liste[i]->moyenneFrancais)*10
+ (liste[i]->moyenneAnglais)*5
+ (liste[i]->moyenneSpecialite)*16)/36;
liste[i]->noteGlobale = noteGlobale;
}
}
void afficherCandidaturesByDept(ListeCandidats liste, int nbCandidats, char* searchIUT, char* searchDept) {
int i, j;
char decision[LEN_MAX], validation[LEN_MAX];
ListeCandidatures candidatures;
Candidature* candidature;
ListeCandidats listeTriee = (ListeCandidats) malloc(nbCandidats*sizeof(Candidat*));
if(listeTriee == NULL) {
perror("malloc");
exit(errno);
}
for(i=0; i<nbCandidats; i++) {
memcpy(&listeTriee[i], &liste[i], sizeof(Candidat*));
}
qsort(listeTriee, nbCandidats, sizeof(Candidat*), compareCandidats);
for(i=0; i<nbCandidats; i++) {
candidatures = listeTriee[i]->listeCandidatures;
for(j=0; j<listeTriee[i]->nbCandidatures; j++) {
candidature = candidatures[j];
if(strcasecmp(candidature->ville, searchIUT) == 0) {
if(strcasecmp(candidature->departement, searchDept) == 0) {
switch (candidature->decision) {
case 0:
strcpy(decision, "en cours de traitement");
break;
case 1:
strcpy(decision, "admis");
break;
case -1:
strcpy(decision, "refusé");
break;
case 2:
strcpy(decision, "sur liste d'attente");
break;
default:
strcpy(decision, "inconnu");
break;
}
switch (candidature->validation) {
case 0:
strcpy(validation, "n'a pas encore décidé");
break;
case 1:
strcpy(validation, "refuse la proposition");
break;
case -1:
strcpy(validation, "accepte");
break;
default:
strcpy(validation, "inconnu");
break;
}
printf("\n\e[4;37mCandidature de '%s %s' pour le département '%s' à l'IUT '%s' :\n\e[0m"
" - Décision du département : %s,\n - Décision du candidat : %s,\n - Note globale : %.2f\n\n",
listeTriee[i]->nom, listeTriee[i]->prenom, candidature->departement, candidature->ville, decision, validation, listeTriee[i]->noteGlobale);
}
}
}
}
free(listeTriee);
}
void merge(ListeCandidats liste, int start, int middle, int end) {
int i, j, k=start;
int n1 = middle - start + 1;
int n2 = end - middle;
Candidat* left[n1], *right[n2];
for (i = 0; i < n1; i++)
left[i] = liste[start + i];
for (j = 0; j < n2; j++)
right[j] = liste[middle + 1 + j];
i = 0;
j = 0;
while (i < n1 && j < n2) {
if (left[i]->noteGlobale >= right[j]->noteGlobale)
liste[k++] = left[i++];
else
liste[k++] = right[j++];
}
while (i < n1)
liste[k++] = left[i++];
while (j < n2)
liste[k++] = right[j++];
}
void triDichotomiqueFusion(ListeCandidats liste, int start, int end) {
if (start < end) {
int middle = (start + end) / 2;
triDichotomiqueFusion(liste, start, middle);
triDichotomiqueFusion(liste, middle + 1, end);
merge(liste, start, middle, end);
}
}
void afficherCandidatTraite(Candidat candidat) {
printf("\tCandidat n°%d, '%s %s' :"
"\n\t - Note globale : %.2f\n\n",
candidat.id, candidat.prenom, candidat.nom,
candidat.noteGlobale);
}
void traiterCandidatures(ListeCandidats liste, int nbCandidats, int nbCandidatsAccept, float noteMini, int checkQueue) {
int i, j, k, nbCandidatsMatch = 0, nbAdmis=0, nbAttente=0, nbRefuse=0;
char dept[LEN_MAX], ville[LEN_MAX], fNameAdmis[100], fNameAttente[100];
FILE* fAdmis, *fAttente;
FileAttente* file;
CandidatTraite* candidat = (CandidatTraite*) malloc(sizeof(CandidatTraite));
Candidature* candidature;
ListeCandidatures candidatures;
ListeCandidats listeCandidatsMatch;
Candidat listeAdmis[nbCandidatsAccept], listeAttente[nbCandidatsAccept], listeRefuses[nbCandidatsAccept];
strcpy(dept, "Informatique");
strcpy(ville, "Clermont-Ferrand");
if(checkQueue == 1) {
file = lireCandidatsAttente(dept, ville);
if(file->nbAttente > 0) {
printf("\n\n\e[4;37mCandidats acceptés :\e[0m\n\n");
for(i=0; i<nbCandidatsAccept; i++) {
*candidat = defiler(file);
ajouterCandidatAdmis(dept, ville, candidat);
nbAdmis++;
printf("\tCandidat '%s %s' :"
"\n\t - Note globale : %.2f\n\n",
candidat->prenom, candidat->nom,
candidat->noteGlobale);
printf("\n");
if(strcmp(candidat->nom, "") != 0 && strcmp(candidat->prenom, "") != 0) {
for(j=0; j<nbCandidats; j++) {
if(strcmp(liste[j]->nom, candidat->nom) == 0 && strcmp(liste[j]->prenom, candidat->prenom)) {
candidatures = liste[j]->listeCandidatures;
for(k=0; k<liste[j]->nbCandidatures; k++)
if(candidatures[k]->ville == ville
&& candidatures[k]->departement == dept) {
candidatures[k]->decision = 1;
break;
}
}
}
}
}
printf("\e[1;32m%d candidats ont été admis depuis la file d'attente.\n\n\e[0m",
nbAdmis);
ecrireCandidatsAttente(dept, ville, file);
} else
printf("\n\e[1;32mAucun candidat n'a été admis puisque la file d'attente est vide.\n\n\e[0m");
} else {
listeCandidatsMatch = (ListeCandidats) malloc(nbCandidats*sizeof(Candidat*));
for(i=0; i<nbCandidats; i++) {
candidatures = liste[i]->listeCandidatures;
for(j=0; j<liste[i]->nbCandidatures; j++) {
candidature = candidatures[j];
if(strcasecmp(candidature->ville, ville) == 0)
if(strcasecmp(candidature->departement, dept) == 0)
if(candidature->decision == 0)
listeCandidatsMatch[nbCandidatsMatch++] = liste[i];
}
}
calculerNoteGlobale(listeCandidatsMatch, nbCandidatsMatch); // Calcul des notes de chaque candidat
triDichotomiqueFusion(listeCandidatsMatch, 0, nbCandidatsMatch-1); // Trie les candidats selon leur noteGlobale
for(i=0; i<nbCandidatsMatch; i++) {
if(listeCandidatsMatch[i]->noteGlobale >= noteMini) {
if(nbAdmis < nbCandidatsAccept) {
for(j=0; j<listeCandidatsMatch[i]->nbCandidatures; j++)
if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->ville, ville) == 0)
if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->departement, dept) == 0)
listeCandidatsMatch[i]->listeCandidatures[j]->decision = 1;
listeAdmis[nbAdmis++] = *listeCandidatsMatch[i];
} else {
for(j=0; j<listeCandidatsMatch[i]->nbCandidatures; j++)
if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->ville, ville) == 0)
if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->departement, dept) == 0)
listeCandidatsMatch[i]->listeCandidatures[j]->decision = 2;
listeAttente[nbAttente++] = *listeCandidatsMatch[i];
}
} else {
for(j=0; j<listeCandidatsMatch[i]->nbCandidatures; j++)
if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->ville, ville) == 0)
if(strcasecmp(listeCandidatsMatch[i]->listeCandidatures[j]->departement, dept) == 0)
listeCandidatsMatch[i]->listeCandidatures[j]->decision = -1;
listeRefuses[nbRefuse++] = *listeCandidatsMatch[i];
}
}
strcpy(fNameAdmis, "donnees/");
strcat(fNameAdmis, ville);
strcat(fNameAdmis, "_");
strcat(fNameAdmis, dept);
strcat(fNameAdmis, "_Admis.don");
fAdmis = fopen(fNameAdmis, "w");
if(fAdmis == NULL) {
perror("fopen");
exit(errno);
}
if(nbAdmis > 0)
fprintf(fAdmis, "%d\n", nbAdmis);
printf("\n\n\e[4;37mCandidats acceptés :\e[0m\n\n");
for(i=0; i<nbAdmis; i++) {
afficherCandidatTraite(listeAdmis[i]);
printf("\n");
fprintf(fAdmis, "%s\n%s\n%.2f %.2f %.2f %.2f %.2f\n",
listeAdmis[i].nom, listeAdmis[i].prenom,
listeAdmis[i].moyenneMath, listeAdmis[i].moyenneFrancais,
listeAdmis[i].moyenneAnglais, listeAdmis[i].moyenneSpecialite,
listeAdmis[i].noteGlobale);
}
fclose(fAdmis);
if(nbAdmis == 0)
printf("\tAucun candidat accepté.\n\n");
strcpy(fNameAttente, "donnees/");
strcat(fNameAttente, ville);
strcat(fNameAttente, "_");
strcat(fNameAttente, dept);
strcat(fNameAttente, "_Attente.don");
fAttente = fopen(fNameAttente, "w");
if(fAttente == NULL) {
perror("fopen");
exit(errno);
}
if(nbAttente > 0)
fprintf(fAttente, "%d\n", nbAttente);
printf("\e[4;37mCandidats en liste d'attente :\e[0m\n\n");
for(i=0; i<nbAttente; i++) {
afficherCandidatTraite(listeAttente[i]);
printf("\n\n");
fprintf(fAttente, "%s\n%s\n%.2f %.2f %.2f %.2f %.2f\n",
listeAttente[i].nom, listeAttente[i].prenom,
listeAttente[i].moyenneMath, listeAttente[i].moyenneFrancais,
listeAttente[i].moyenneAnglais, listeAttente[i].moyenneSpecialite,
listeAttente[i].noteGlobale);
}
fclose(fAttente);
if(nbAttente == 0)
printf("\tAucun candidat en liste d'attente.\n\n");
printf("\e[4;37mCandidats refusés :\e[0m\n\n");
for(i=0; i<nbRefuse; i++) {
afficherCandidatTraite(listeRefuses[i]);
printf("\n\n");
}
if(nbRefuse == 0)
printf("\tAucun candidat refusé.\n\n");
printf("\e[1;32m%d candidats ont été admis, %d mis en file d'attente et %d refusés.\n\n\e[0m",
nbAdmis, nbAttente, nbRefuse);
free(listeCandidatsMatch);
}
}
compareCandidats
int compareCandidats(const void *p1, const void *p2)
Compare deux candidats suivant l'ordre alphabetique.
Definition: deux.c:323
lireCandidatsAttente
FileAttente * lireCandidatsAttente(char *dept, char *ville)
Definition: quatre.c:227
defiler
CandidatTraite defiler(FileAttente *file)
Definition: quatre.c:211
ajouterCandidatAdmis
void ajouterCandidatAdmis(char *dept, char *ville, CandidatTraite *candidat)
Definition: quatre.c:311
ecrireCandidatsAttente
void ecrireCandidatsAttente(char *dept, char *ville, FileAttente *file)
Definition: quatre.c:264
Candidat
Definition: structures.h:27
Candidat::moyenneAnglais
float moyenneAnglais
Definition: structures.h:30
Candidat::noteGlobale
float noteGlobale
Definition: structures.h:30
Candidat::id
int id
Definition: structures.h:28
Candidat::nom
char nom[LEN_MAX]
Definition: structures.h:29
Candidat::moyenneMath
float moyenneMath
Definition: structures.h:30
Candidat::prenom
char prenom[LEN_MAX]
Definition: structures.h:29
Candidat::nbCandidatures
int nbCandidatures
Definition: structures.h:31
Candidat::listeCandidatures
ListeCandidatures listeCandidatures
Definition: structures.h:32
CandidatTraite
Definition: structures.h:39
CandidatTraite::prenom
char prenom[LEN_MAX]
Definition: structures.h:40
CandidatTraite::noteGlobale
float noteGlobale
Definition: structures.h:41
CandidatTraite::nom
char nom[LEN_MAX]
Definition: structures.h:40
Candidature
Definition: structures.h:20
Candidature::departement
char departement[LEN_MAX]
Definition: structures.h:21
Candidature::ville
char ville[LEN_MAX]
Definition: structures.h:21
Candidature::validation
int validation
Definition: structures.h:22
Candidature::decision
int decision
Definition: structures.h:22
FileAttente
Definition: structures.h:49
FileAttente::nbAttente
int nbAttente
Definition: structures.h:52
LEN_MAX
#define LEN_MAX
Definition: structures.h:1
ListeCandidats
Candidat ** ListeCandidats
Definition: structures.h:35
merge
void merge(ListeCandidats liste, int start, int middle, int end)
Fonction de tri dichotomique.
Definition: trois.c:93
afficherCandidaturesByDept
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
afficherCandidatTraite
void afficherCandidatTraite(Candidat candidat)
Affiche les information d'un candidat.
Definition: trois.c:128
traiterCandidatures
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
triDichotomiqueFusion
void triDichotomiqueFusion(ListeCandidats liste, int start, int end)
Algorithme de tri dichotomique.
Definition: trois.c:119
calculerNoteGlobale
void calculerNoteGlobale(ListeCandidats liste, int nbCandidats)
Calcul la note globale en fonction des coéfficients prédéfinis.
Definition: trois.c:9
trois.h