You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
4892 lines
99 KiB
4892 lines
99 KiB
/**
|
|
* \file sae102.h
|
|
* \author Erwan. M & Corentin. L
|
|
* \date 11/12/22
|
|
* \brief Résumé : Fichier .c regroupant les fonctions du programme
|
|
*/
|
|
|
|
#include "sae102.h"
|
|
/**
|
|
* \brief Charge le fichier iut.don et l'insère dans le tableau tiut
|
|
* \param[in, out] tiut Tableau qui regroupe les iut
|
|
* \param[in] tmax Taille logique du tableau tiut
|
|
* \return int
|
|
*
|
|
* Fonction qui insère les données présents dans le fichier iut.don dans le tableau tiut.
|
|
* Elle retourne -1 si il y a eu un problème d'ouverture du fichier, -2 si le tableau est plein, sinon la taille logique.
|
|
*/
|
|
|
|
int chargerFichier(VilleIUT *tiut[], int tmax){
|
|
|
|
int i = 0, trouve;
|
|
|
|
VilleIUT vIUT;
|
|
|
|
FILE *flot;
|
|
|
|
flot=fopen("iut.don","r");
|
|
|
|
if(flot == NULL){
|
|
|
|
printf("Problème ouverture fichier.\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
vIUT = lireVille(flot);
|
|
|
|
while(!feof(flot)){
|
|
|
|
if (i == tmax){
|
|
|
|
printf("Tableaux pleins !\n");
|
|
|
|
fclose(flot);
|
|
|
|
return -2;
|
|
|
|
}
|
|
|
|
tiut[i] = (VilleIUT*) malloc (sizeof(VilleIUT));
|
|
|
|
if (tiut[i] == NULL){
|
|
|
|
printf("Problème malloc\n");
|
|
|
|
fclose(flot);
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
trouve = insertionVille(tiut, vIUT, i);
|
|
|
|
if (trouve == 0)
|
|
|
|
i = i + 1;
|
|
|
|
vIUT = lireVille(flot);
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
printf("\033[1;32m"); // Vert
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
// afficher(tiut, i);
|
|
|
|
printf("Chargement fichier [iut.don] terminé.\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Charge le fichier candidats.bin et l'insère dans la liste de candidats
|
|
* \param[in, out] liste Liste de candidats
|
|
* \param[in, out] tlog Taille de la liste de candidats
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui insère les données présents dans le fichier candidats.bin dans la liste de candidats.
|
|
* Elle quitte le programme si il y a eu un problème d'ouverture du fichier, sinon la liste.
|
|
*/
|
|
|
|
ListeCandidats chargerBinCandidats(ListeCandidats liste, int *tlog){
|
|
|
|
Candidat c;
|
|
|
|
FILE *flot;
|
|
|
|
flot = fopen("candidats.bin","rb");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Problème ouverture fichier [candidats.bin].\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
fread(tlog, sizeof(int), 1, flot);
|
|
|
|
c = lireBinCandidat(flot);
|
|
|
|
while(!feof(flot)){
|
|
|
|
liste = insertionCandidat(liste, c);
|
|
|
|
c = lireBinCandidat(flot);
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
printf("\033[1;32m"); // Vert
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("Chargement fichier [candidats.bin] terminé.\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Charge le fichier candidats.don et l'insère dans la liste de candidats
|
|
* \param[in, out] liste Liste de candidats
|
|
* \param[in, out] tlog Taille de la liste de candidats
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui insère les données présents dans le fichier candidats.don dans la liste de candidats.
|
|
* Elle quitte le programme si il y a eu un problème d'ouverture du fichier, sinon la liste.
|
|
*/
|
|
|
|
ListeCandidats chargerTxtCandidats(ListeCandidats liste, int *tlog){
|
|
|
|
Candidat c;
|
|
|
|
int i;
|
|
|
|
FILE *flot;
|
|
|
|
flot = fopen("candidats.don","r");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Problème ouverture fichier [candidats.don].\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
fscanf(flot, "%d", tlog);
|
|
|
|
for (i = 0 ; i < *tlog ; i++){
|
|
|
|
c = lireTxtCandidat(flot);
|
|
|
|
liste = insertionCandidat(liste, c);
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
printf("\033[1;32m"); // Vert
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("Chargement fichier [candidats.don] terminé.\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
* \brief Supprime l'élement en tête d'une liste de candidats
|
|
* \param[in, out] liste Liste de candidats
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui supprime le candidat en tête de la liste.
|
|
*/
|
|
|
|
ListeCandidats supprimerEnTeteCandidats(ListeCandidats l){
|
|
|
|
MaillonCandidat *aux;
|
|
|
|
if (l == NULL){
|
|
|
|
printf("Opération interdite\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
aux = l;
|
|
|
|
l = l -> suiv;
|
|
|
|
free(aux);
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime l'élement en tête d'une liste de candidats
|
|
* \param[in, out] liste Liste de candidats
|
|
* \param[in] numCandid numéro du candidat
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui supprime le candidat entré en paramètres, elle fait de la récursivité pour chercher le candidat.
|
|
*/
|
|
|
|
ListeCandidats supprimerCandidats(ListeCandidats l, int numCandid){
|
|
|
|
if (l == NULL) return l;
|
|
|
|
if (numCandid == l -> c.numCandid) return supprimerEnTeteCandidats(l);
|
|
|
|
l -> suiv = supprimerCandidats(l -> suiv, numCandid);
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche un candidat
|
|
* \param[in] c Candidat
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche un candidat avec ses notes et ses choix. Elle ne retourne rien.
|
|
*/
|
|
|
|
|
|
void afficher1Candidat(Candidat c){
|
|
|
|
printf("Numéro candidat : %d\nNom : %s\nPrénom : %s\n", c.numCandid, c.nom, c.prenom);
|
|
|
|
printf("Maths : %.2f\tFrançais : %.2f\tAnglais : %.2f\tSpécialité : %.2f\n", c.notes[0], c.notes[1], c.notes[2], c.notes[3]);
|
|
|
|
affichageChoix(c.choix);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Sauvegarde la liste de candidats dans un fichier binaire
|
|
* \param[in] liste Liste de candidats
|
|
* \param[in] tlog taille de la liste
|
|
* \param[in] nomFichier Nom du fichier
|
|
* \return void
|
|
*
|
|
* Fonction qui enregistre la liste de candidats dans un fichier binaire. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sauverCandidats(ListeCandidats liste, int tlog, char* nomFichier){
|
|
|
|
FILE *flot;
|
|
|
|
int longueur;
|
|
|
|
flot = fopen(nomFichier, "wb");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Problème lors de l'ouverture du fichier\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
fwrite(&tlog, sizeof(int), 1, flot);
|
|
|
|
while (liste != NULL){
|
|
|
|
fwrite(&liste -> c.numCandid, sizeof(int), 1, flot);
|
|
|
|
fwrite(liste -> c.nom, sizeof(char), 30, flot);
|
|
|
|
fwrite(liste -> c.prenom, sizeof(char), 30, flot);
|
|
|
|
fwrite(liste -> c.notes, sizeof(float), 4, flot);
|
|
|
|
longueur = longueurListeChoix(liste -> c.choix);
|
|
|
|
fwrite(&longueur, sizeof(int), 1, flot);
|
|
|
|
sauverChoix(flot, liste -> c.choix);
|
|
|
|
free(&liste -> c);
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Sauvegarde la liste de choix dans un fichier binaire
|
|
* \param[in] liste Liste de choix du candidat
|
|
* \param[in] flot Nom du fichier
|
|
* \return void
|
|
*
|
|
* Fonction qui enregistre les choix d'un candidat dans un fichier binaire, elle est liée avec la fonction sauverCandidats. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sauverChoix(FILE *flot, ListeChoix liste){
|
|
|
|
if (liste == NULL){
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
fwrite(liste -> c.ville, sizeof(char), 30, flot);
|
|
|
|
fwrite(liste -> c.departement, sizeof(char), 30, flot);
|
|
|
|
fwrite(&(liste -> c).decision, sizeof(int), 1, flot);
|
|
|
|
fwrite(&(liste -> c).validation, sizeof(int), 1, flot);
|
|
|
|
sauverChoix(flot, liste -> suiv);
|
|
|
|
free(&liste -> c);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Lit un candidat dans un fichier binaire
|
|
* \param[in] flot Nom du fichier
|
|
* \return Candidat
|
|
*
|
|
* Fonction qui lit un candidat dans un fichier binaire. Elle retourne un candidat.
|
|
*/
|
|
|
|
Candidat lireBinCandidat(FILE* flot){
|
|
|
|
Candidat c;
|
|
|
|
int nbChoix;
|
|
|
|
fread(&c.numCandid, sizeof(int), 1, flot);
|
|
|
|
fread(c.nom, sizeof(char), 30, flot);
|
|
|
|
fread(c.prenom, sizeof(char), 30, flot);
|
|
|
|
fread(c.notes, sizeof(float), 4, flot);
|
|
|
|
fread(&nbChoix, sizeof(int), 1, flot);
|
|
|
|
c.choix = lireBinChoix(flot, nbChoix);
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Lit un candidat dans un fichier texte
|
|
* \param[in] flot Nom du fichier
|
|
* \return Candidat
|
|
*
|
|
* Fonction qui lit un candidat dans un fichier texte. Elle retourne un candidat.
|
|
*/
|
|
|
|
Candidat lireTxtCandidat(FILE* flot){
|
|
|
|
Candidat c;
|
|
|
|
int nbChoix, i;
|
|
|
|
fscanf(flot, "%d%*c", &c.numCandid);
|
|
|
|
fgets(c.nom, 28, flot);
|
|
|
|
c.nom[strlen(c.nom) - 1] = '\0';
|
|
|
|
fgets(c.prenom, 28, flot);
|
|
|
|
c.prenom[strlen(c.prenom) - 1] = '\0';
|
|
|
|
for (i = 0 ; i < 4 ; i++)
|
|
|
|
fscanf(flot, "%f", &c.notes[i]);
|
|
|
|
fscanf(flot, "%d", &nbChoix);
|
|
|
|
c.choix = lireTxtChoix(flot, nbChoix);
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Lit les choix d'un candidat dans un fichier binaire
|
|
* \param[in] flot Nom du fichier
|
|
* \param[in] nbChoix Nombre de choix du candidat
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui lit les choix d'un candidat dans un fichier binaire. Elle retourne une liste de choix.
|
|
*/
|
|
|
|
ListeChoix lireBinChoix(FILE* flot, int nbChoix){
|
|
|
|
ListeChoix liste;
|
|
|
|
liste = listeChoixNouv();
|
|
|
|
int i;
|
|
|
|
Choix choix;
|
|
|
|
for (i = 0 ; i < nbChoix ; i++){
|
|
|
|
fread(choix.ville, sizeof(char), 30, flot);
|
|
|
|
fread(choix.departement, sizeof(char), 30, flot);
|
|
|
|
fread(&choix.decision, sizeof(int), 1, flot);
|
|
|
|
fread(&choix.validation, sizeof(int), 1, flot);
|
|
|
|
liste = ajouterChoix(liste, choix);
|
|
|
|
}
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Lit les choix d'un candidat dans un fichier texte
|
|
* \param[in] flot Nom du fichier
|
|
* \param[in] nbChoix Nombre de choix du candidat
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui lit les choix d'un candidat dans un fichier texte. Elle retourne une liste de choix.
|
|
*/
|
|
|
|
ListeChoix lireTxtChoix(FILE* flot, int nbChoix){
|
|
|
|
ListeChoix liste;
|
|
|
|
liste = listeChoixNouv();
|
|
|
|
int i;
|
|
|
|
Choix choix;
|
|
|
|
for (i = 0 ; i < nbChoix ; i++){
|
|
|
|
fscanf(flot, "%s", choix.ville);
|
|
|
|
fscanf(flot, "%s", choix.departement);
|
|
|
|
fscanf(flot, "%d", &choix.decision);
|
|
|
|
fscanf(flot, "%d", &choix.validation);
|
|
|
|
liste = ajouterChoix(liste, choix);
|
|
|
|
}
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Ajoute un choix dans la liste de choix du candidat
|
|
* \param[in] liste Liste des choix du candidat
|
|
* \param[in] choix choix à insérer
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui ajoute un choix dans la liste de choix du candidat. Elle quitte le programme si il y a un problème malloc, sinon elle retourne une liste de choix.
|
|
*/
|
|
|
|
ListeChoix ajouterChoix(ListeChoix liste, Choix choix){
|
|
|
|
MaillonChoix *m;
|
|
|
|
m = (MaillonChoix*) malloc (sizeof(MaillonChoix));
|
|
|
|
if (m == NULL){
|
|
|
|
printf("Problème malloc\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
m -> c = choix;
|
|
|
|
m -> suiv = liste; //ajoute en tête
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Insère un candidat dans la liste de candidats
|
|
* \param[in] liste Liste des choix du candidat
|
|
* \param[in] c candidat à insérer
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui ajoute un candidat dans la liste de candidats. Elle quitte le programme si il y a un problème malloc, sinon elle retourne une liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats insertionCandidat(ListeCandidats liste, Candidat c){
|
|
|
|
MaillonCandidat *m;
|
|
|
|
m = (MaillonCandidat*) malloc (sizeof(MaillonCandidat));
|
|
|
|
if (m == NULL){
|
|
|
|
printf("Problème malloc\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
m -> c = c;
|
|
|
|
m -> suiv = liste;
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Initialise une liste de candidats
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui initialise une liste de candidats. Elle retourne donc une liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats listeCandidatsNouv(){
|
|
|
|
ListeCandidats l;
|
|
|
|
l = NULL;
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Initialise une liste de choix
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui initialise une liste de choix. Elle retourne donc une liste de choix.
|
|
*/
|
|
|
|
ListeChoix listeChoixNouv(){
|
|
|
|
ListeChoix l;
|
|
|
|
l = NULL;
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche les candidats dans la liste
|
|
* \param[in] liste Liste des candidats
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche les candidats dans la liste de candidats, avec leurs notes et leurs choix. Ne retourne rien.
|
|
*/
|
|
|
|
|
|
void affichageCandidats(ListeCandidats liste){
|
|
|
|
if (liste == NULL)
|
|
|
|
return;
|
|
|
|
printf("Numéro candidat : %d\nNom : %s\nPrénom : %s\n", liste -> c.numCandid, liste -> c.nom, liste -> c.prenom);
|
|
|
|
printf("Maths : %.2f\tFrançais : %.2f\tAnglais : %.2f\tSpécialité : %.2f\n", liste -> c.notes[0], liste -> c.notes[1], liste -> c.notes[2], liste -> c.notes[3]);
|
|
|
|
affichageChoix(liste -> c.choix);
|
|
|
|
affichageCandidats(liste -> suiv);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche les choix dans la liste
|
|
* \param[in] liste Liste des choix
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche les choix des candidats. Ne retourne rien.
|
|
*/
|
|
|
|
void affichageChoix(ListeChoix liste){
|
|
|
|
if (liste == NULL){
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
printf("Ville : %s\tDépartement : %s\tDécision : %d\tValidation : %d\n", liste -> c.ville, liste -> c.departement, liste -> c.decision, liste -> c.validation);
|
|
|
|
affichageChoix(liste -> suiv);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Insère une ville dans tiut
|
|
* \param[in, out] tiut Tableau des iut
|
|
* \param[in] vIUT Ville à insérer
|
|
* \param[in] tlog taille de tiut
|
|
* \return int
|
|
*
|
|
* Fonction qui insère une ville dans le teableau tiut. Elle quitte le programme si il y a un problème malloc, sinon elle retourne trouve (si la ville existe déjà ou non).
|
|
*/
|
|
|
|
int insertionVille(VilleIUT* tiut[], VilleIUT vIUT, int tlog){
|
|
|
|
int position, trouve;
|
|
|
|
position = rechercheVille(tiut, vIUT.ville, tlog, &trouve);
|
|
|
|
if (trouve == 0){
|
|
|
|
decalageADroite(tiut, tlog, position);
|
|
|
|
tiut[position] = (VilleIUT *) malloc (sizeof(VilleIUT));
|
|
|
|
if (tiut[position] == NULL){
|
|
|
|
printf("Problème malloc\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
strcpy(tiut[position] -> ville, vIUT.ville);
|
|
|
|
tiut[position] -> ldept = inserer(tiut[position] -> ldept, vIUT.ldept -> departement, vIUT.ldept -> nbP, vIUT.ldept -> nomResp);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
tiut[position] -> ldept = inserer(tiut[position] -> ldept, vIUT.ldept -> departement, vIUT.ldept -> nbP, vIUT.ldept -> nomResp);
|
|
|
|
return trouve;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Décale à droite tiut
|
|
* \param[in, out] tiut Tableau des iuts
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in] index Limite du décalage
|
|
* \return void
|
|
*
|
|
* Fonction qui décale à droite les éléments du tableau tiut. Elle ne retourne rien.
|
|
*/
|
|
|
|
void decalageADroite(VilleIUT *tiut[], int tlog, int index){
|
|
|
|
int i;
|
|
|
|
for (i = tlog; i > index ; i--)
|
|
|
|
tiut[i] = tiut[i - 1];
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche une ville dans tiut
|
|
* \param[in, out] tiut Tableau des iuts
|
|
* \param[in, out] ville Ville à rechercher
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in, out] trouve Si la ville est trouvée ou non
|
|
* \return int
|
|
*
|
|
* Fonction qui fait une recherche dichotomique pour trouver une ville entrée en paramètres. Elle retourne l'emplacement de cette dernière.
|
|
*/
|
|
|
|
int rechercheVille(VilleIUT** tiut, char ville[], int tlog, int *trouve){
|
|
|
|
int sup = tlog-1, inf = 0, m;
|
|
|
|
while(sup >= inf){
|
|
|
|
m = (sup + inf) / 2;
|
|
|
|
if (strcmp(tiut[m] -> ville, ville) == 0){
|
|
|
|
*trouve = 1;
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
if (strcmp(tiut[m] -> ville, ville) > 0)
|
|
|
|
sup = m - 1;
|
|
|
|
else
|
|
|
|
inf = m + 1;
|
|
|
|
}
|
|
|
|
*trouve = 0;
|
|
|
|
return inf;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Calcule une note pour chaque candidats
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] tlog Taille de la liste
|
|
* \return void
|
|
*
|
|
* Fonction qui calcule une note moyenne pour les candidats et créer ensuite un fichier. Elle ne retourne rien.
|
|
*/
|
|
|
|
void attributionNote(ListeCandidats liste, int tlog){
|
|
|
|
int res;
|
|
|
|
res = ecritureNoteMoyenne(liste, tlog);
|
|
|
|
if(res == -1) return ;
|
|
|
|
printf("\033[1;32m"); // Vert
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("Chargement fichier [notesCandidats.don] terminé.\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Écrit dans un fichier une note moyenne pour les candidats
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] tlog Taille de la liste
|
|
* \return int
|
|
*
|
|
* Fonction qui créer un fichier qui regroupe les notes moyennes des candidats, elle est liée à la fonction attributionNote. Elle retourne -1 si il y a un problème d'ouverture, sinon 0.
|
|
*/
|
|
|
|
int ecritureNoteMoyenne(ListeCandidats liste, int tlog){
|
|
|
|
int i;
|
|
|
|
float noteMoyenne;
|
|
|
|
FILE* flot;
|
|
|
|
flot = fopen("notesCandidats.don", "w");
|
|
|
|
if(flot==NULL){
|
|
|
|
printf("Problème écriture fichier [notesCandidats.don]\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
for(i = 0 ; i < tlog ; i++) {
|
|
|
|
noteMoyenne = (liste -> c.notes[0] * 2 + liste -> c.notes[1] + liste -> c.notes[2] * 2 + liste -> c.notes[3] * 4) / 9;
|
|
|
|
fprintf(flot, "%d\n%.2f\n", liste->c.numCandid, noteMoyenne);
|
|
|
|
liste=liste->suiv;
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche un département dans une ville
|
|
* \param[in, out] tiut Tableau des iut
|
|
* \param[in] ville Ville à rechercher
|
|
* \param[in] departement Département à rechercher
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in, out] trouve Si le département est trouvé ou non.
|
|
* \return int
|
|
*
|
|
* Fonction qui recherche un département dans une ville, elle est liée à la fonction rechercheVille et rechercheDept. Elle retourne -1 si le département n'est pas trouvé, sinon son emplacement dans la liste de département.
|
|
*/
|
|
|
|
int rechercheDepartement(VilleIUT* tiut[], char ville[], char departement[], int tlog, int *trouve){
|
|
|
|
int posville, compteur = 0, trouve2 = 0;
|
|
|
|
posville = rechercheVille(tiut, ville, tlog, &trouve2);
|
|
|
|
if (trouve2 == 1)
|
|
|
|
return rechercheDept (tiut[posville] -> ldept, departement, trouve, compteur);
|
|
|
|
printf("Ville introuvable ! Réessayez !\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche un département dans une ville trouvée
|
|
* \param[in] l Liste des départements
|
|
* \param[in] departement Departement à rechercher
|
|
* \param[in] trouve Si le département est trouvé ou non
|
|
* \param[in] compteur Emplacement du département dans la liste
|
|
* \return int
|
|
*
|
|
* Fonction qui recherche un département dans une ville trouvée précedemment, elle est liée à la fonction rechercheDepartement. Elle retourne son emplacement dans la liste de département.
|
|
*/
|
|
|
|
int rechercheDept(ListeDept l, char departement[], int *trouve, int compteur){
|
|
|
|
if (l == NULL){
|
|
|
|
*trouve = 0;
|
|
|
|
return compteur;
|
|
|
|
}
|
|
|
|
if (strcmp(departement, l -> departement) < 0){
|
|
|
|
*trouve = 0;
|
|
|
|
return compteur;
|
|
|
|
}
|
|
|
|
if (strcmp(departement, l -> departement) == 0){
|
|
|
|
*trouve = 1;
|
|
|
|
return compteur;
|
|
|
|
}
|
|
|
|
return rechercheDept(l -> suiv, departement, trouve, compteur + 1);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Calcule la longueur d'une liste de choix
|
|
* \param[in] liste Liste des choix
|
|
* \return int
|
|
*
|
|
* Fonction qui calcule la longueur d'une liste de choix. Elle retourne sa longueur.
|
|
*/
|
|
|
|
int longueurListeChoix(ListeChoix liste){
|
|
|
|
if (liste == NULL) return 0;
|
|
|
|
return 1 + longueurListeChoix(liste -> suiv);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Calcule la longueur d'une liste de candidats
|
|
* \param[in] liste Liste des candidats
|
|
* \return int
|
|
*
|
|
* Fonction qui calcule la longueur d'une liste de candidats. Elle retourne sa longueur.
|
|
*/
|
|
|
|
int longueurListeCandidats(ListeCandidats liste){
|
|
|
|
if (liste == NULL) return 0;
|
|
|
|
return 1 + longueurListeCandidats(liste -> suiv);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Lit une ville dans tiut
|
|
* \param[in] flot Nom du fichier
|
|
* \return VilleIUT
|
|
*
|
|
* Fonction qui lit une ville avec ses informations dans un fichier donné. Elle quitte le programme si il y a un problème malloc, sinon elle retourne la ville.
|
|
*/
|
|
|
|
VilleIUT lireVille(FILE* flot){
|
|
|
|
VilleIUT vIUT;
|
|
|
|
vIUT.ldept = (ListeDept)malloc(sizeof(MaillonDept));
|
|
|
|
if (vIUT.ldept == NULL){
|
|
|
|
printf("Problème malloc\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
fscanf(flot, "%s %s %d", vIUT.ville, vIUT.ldept -> departement, &vIUT.ldept -> nbP);
|
|
|
|
fgets(vIUT.ldept -> nomResp, 22, flot);
|
|
|
|
vIUT.ldept -> nomResp[strlen(vIUT.ldept -> nomResp) - 1] = '\0';
|
|
|
|
// printf("%s\t%s\t%d\t%s\n", vIUT.ville, vIUT.ldept->departement, vIUT.ldept->nbP, vIUT.ldept->nomResp);
|
|
|
|
return vIUT;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Sauvegarde tiut dans iut.don
|
|
* \param[in] tiut Tableau des iut
|
|
* \return void
|
|
*
|
|
* Fonction qui sauvegarde le tableau tiut dans le fichier iut.don. Elle quitte le programme si il y a un problème d'ouverture. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sauvegarder(VilleIUT *tiut[], int tlog){
|
|
|
|
int i;
|
|
|
|
FILE* flot;
|
|
|
|
flot = fopen("iut.don", "w");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Problème lors de l'ouverture du fichier binaire en écriture\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
for (i = 0; i < tlog ; i++){
|
|
|
|
sauvegarderListe(tiut[i] -> ldept, flot, tiut[i] -> ville);
|
|
|
|
free(tiut[i] -> ldept);
|
|
|
|
free(tiut[i]);
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Sauvegarde la liste des départements dans iut.don
|
|
* \param[in] l Liste des départements
|
|
* \param[in] flot Nom du fichier
|
|
* \param[in] ville Ville de l'iut
|
|
* \return void
|
|
*
|
|
* Fonction qui sauvegarde la liste des départements dans le fichier iut.don. Elle est liée à la fonction sauvegarder. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sauvegarderListe(ListeDept l, FILE* flot, char* ville){
|
|
|
|
if (l == NULL)
|
|
|
|
return;
|
|
|
|
fprintf(flot, "%s ", ville);
|
|
|
|
fprintf(flot, "%s %d %s\n", l -> departement, l -> nbP, l -> nomResp);
|
|
|
|
sauvegarderListe(l -> suiv, flot, ville);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche le tableau tiut
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche les informations du tableau tiut. Elle est liée à la fonction afficherListe. Elle ne retourne rien.
|
|
*/
|
|
|
|
void afficher(VilleIUT* tiut[], int tlog){
|
|
|
|
int i;
|
|
|
|
for (i = 0 ; i < tlog ; i++){
|
|
|
|
printf("%s\t", tiut[i] -> ville);
|
|
|
|
afficherListe(tiut[i] -> ldept);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche la liste de départements
|
|
* \param[in] l Liste des départements
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche les départements de la liste entrée en paramètres. Elle est liée à la fonction afficher. Elle ne retourne rien.
|
|
*/
|
|
|
|
void afficherListe(ListeDept l){
|
|
|
|
if (l == NULL){
|
|
|
|
printf("\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
printf("%s\t%d\t%s\t|\t", l -> departement, l -> nbP, l -> nomResp);
|
|
|
|
afficherListe(l -> suiv);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Lit le fichier phase.don
|
|
* \param[in] void
|
|
* \return int
|
|
*
|
|
* Fonction qui lit le fichier phase.don pour savoir la phase en cours. Elle retourne l'état de la phase (0:Inactif, 1:Actif).
|
|
*/
|
|
|
|
int phaseCandid(void){
|
|
|
|
int etat;
|
|
|
|
FILE* flot;
|
|
|
|
flot=fopen("phase.don", "r");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Problème ouverture fichier phase.\n");
|
|
|
|
return -1;
|
|
}
|
|
|
|
fscanf(flot, "%d", &etat);
|
|
|
|
fclose(flot);
|
|
|
|
return etat;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Switch pour la phase de candidature
|
|
* \param[in] etat État de la phase
|
|
* \return int
|
|
*
|
|
* Fonction qui fait un switch pour changer la phase de candidature. Elle ne retourne rien.
|
|
*/
|
|
|
|
void switchPhase(int *etat){
|
|
|
|
int choix;
|
|
|
|
clear();
|
|
|
|
switch (*etat){
|
|
|
|
case 1:
|
|
|
|
printf("Etat actuel : Actif\n");
|
|
|
|
printf("Voulez-vous arrêter la phase de candidature ?\n\n");
|
|
|
|
printf("(0) Non\n");
|
|
|
|
printf("(1) Oui\n");
|
|
|
|
choix=fonctionChoix();
|
|
|
|
if(choix == 1){
|
|
|
|
modifFichierPhase(0);
|
|
|
|
*etat = 0;
|
|
|
|
clear();
|
|
|
|
printf("Phase de candidature arrêtée !\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if(choix == 0){
|
|
|
|
clear();
|
|
|
|
printf("Modification annulée.\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
affichageErreurSaisie();
|
|
|
|
break;
|
|
|
|
case 0:
|
|
|
|
printf("Etat actuel : Inactif\n");
|
|
|
|
printf("Voulez-vous lancer la phase de candidature ?\n\n");
|
|
|
|
printf("(0) Non\n");
|
|
|
|
printf("(1) Oui\n");
|
|
|
|
choix=fonctionChoix();
|
|
|
|
if(choix == 1){
|
|
|
|
modifFichierPhase(1);
|
|
|
|
*etat = 1;
|
|
|
|
clear();
|
|
|
|
printf("Phase de candidature lancée !\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
else if(choix == 0){
|
|
|
|
clear();
|
|
|
|
printf("Modification annulée.\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
affichageErreurSaisie();
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Change l'état de la phase
|
|
* \param[in] etat État de la phase
|
|
* \return int
|
|
*
|
|
* Fonction qui change la phase de candidature et l'écrit dans le fichier phase.don. Elle ne retourne rien.
|
|
*/
|
|
|
|
void modifFichierPhase(int etat){
|
|
|
|
FILE *flot;
|
|
|
|
flot=fopen("phase.don", "w");
|
|
|
|
fprintf(flot, "%d", etat);
|
|
|
|
fclose(flot);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Switch pour le menu administrateur
|
|
* \param[in] choix choix de l'utilisateur
|
|
* \param[in] tiut Tableau des iuts
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in] etatPhase État de la phase
|
|
* \param[in] liste Liste des candidats
|
|
* \return void
|
|
*
|
|
* Fonction qui fait un switch pour le menu administrateur. Elle ne retourne rien.
|
|
*/
|
|
|
|
void switchAdministrateur(int choix, VilleIUT** tiut, int tlog, int *etatPhase, ListeCandidats liste){
|
|
|
|
char departement[22], ville[32], nomResp[22], nomCandid[30], prenomCandid[30], nomDep[30], nomVille[30];
|
|
|
|
int trouve, trouve2, res, res2, i, position, positionTab, nbP;
|
|
|
|
switch (choix){
|
|
|
|
case 1:
|
|
|
|
clear();
|
|
|
|
res2 = saisieVille(ville, tiut, tlog);
|
|
|
|
if (res2 == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
clear();
|
|
|
|
res = saisieDept(departement);
|
|
|
|
if (res == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
positionTab = rechercheVille(tiut, ville, tlog, &trouve);
|
|
|
|
position = rechercheDepartement(tiut, ville, departement, tlog, &trouve);
|
|
|
|
if (trouve == 1){
|
|
|
|
nbP = saisieNbPlace();
|
|
|
|
modifNbPlaces(tiut, positionTab, position, nbP);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Département inexistant !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
res2 = saisieVille(ville, tiut, tlog);
|
|
|
|
if (res2 == -1){
|
|
|
|
printf("Saisie annulée !\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
res = saisieDept(departement);
|
|
|
|
if (res == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
positionTab = rechercheVille(tiut, ville, tlog, &trouve);
|
|
|
|
position = rechercheDepartement(tiut, ville, departement, tlog, &trouve2);
|
|
|
|
if (trouve == 1 && trouve2 == 0){
|
|
|
|
nbP = saisieNbPlace();
|
|
|
|
scanf("%*c");
|
|
|
|
res2 = saisieNvResp(nomResp);
|
|
|
|
if (nbP == -1 || res2 == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
tiut[positionTab] -> ldept = inserer(tiut[positionTab] -> ldept, departement, nbP, nomResp);
|
|
|
|
}
|
|
|
|
else if (trouve == 1 && trouve2 == 1){
|
|
|
|
clear();
|
|
|
|
printf("Département déjà existant !\n");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Ville inexistante !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
res2 = saisieVille(ville, tiut, tlog);
|
|
|
|
if (res2 == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
res = saisieDept(departement);
|
|
|
|
if (res == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
positionTab = rechercheVille(tiut, ville, tlog, &trouve);
|
|
|
|
position = rechercheDepartement(tiut, ville, departement, tlog, &trouve2);
|
|
|
|
if (trouve == 1 && trouve2 == 1){
|
|
|
|
tiut[positionTab] -> ldept = supprimer(tiut[positionTab] -> ldept, departement);
|
|
|
|
if (tiut[positionTab] -> ldept == NULL)
|
|
|
|
for (i = positionTab; i < tlog - 1 ; i++)
|
|
|
|
tiut[i] = tiut[i + 1];
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Département ou ville inexistant(e) !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
clear();
|
|
|
|
*etatPhase = phaseCandid();
|
|
|
|
switchPhase(etatPhase);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
res2 = saisieVille(ville, tiut, tlog);
|
|
|
|
if (res2 == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
res = saisieDept(departement);
|
|
|
|
if (res == -1){
|
|
|
|
printf("Saisie annulée\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
positionTab = rechercheVille(tiut, ville, tlog, &trouve);
|
|
|
|
position = rechercheDepartement(tiut, ville, departement, tlog, &trouve);
|
|
|
|
if (trouve == 1){
|
|
|
|
res = saisieNvResp(nomResp);
|
|
|
|
modifResp(tiut, positionTab, position, nomResp);
|
|
|
|
}
|
|
|
|
else{
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Département inexistant !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n\n");
|
|
|
|
afficher(tiut, tlog);
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
clear();
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Nom du candidat : ");
|
|
|
|
fgets(nomCandid, 30, stdin);
|
|
|
|
nomCandid[strlen(nomCandid)-1] = '\0';
|
|
|
|
printf("Prénom du candidat : ");
|
|
|
|
fgets(prenomCandid, 30, stdin);
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
prenomCandid[strlen(prenomCandid)-1] = '\0';
|
|
|
|
rechercheCandidat(liste, nomCandid, prenomCandid, &trouve);
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
if(trouve == -1) printf("Erreur : Candidat inexistant !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
clear();
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Nom de la ville : ");
|
|
|
|
fgets(nomVille, 30, stdin);
|
|
|
|
nomVille[strlen(nomVille)-1] = '\0';
|
|
|
|
printf("Nom du département : ");
|
|
|
|
fgets(nomDep, 30, stdin);
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
nomDep[strlen(nomDep)-1] = '\0';
|
|
|
|
rechercheDeptTousCandidat(liste, nomVille, nomDep);
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
rechercheDepartement(tiut, nomVille, nomDep, tlog, &trouve);
|
|
|
|
if(trouve == 0) printf("Erreur : Département inexistant !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
clear();
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
affichageErreurSaisie();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche les candidats qui ont une candidature pour un département en particulier
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] nomVille Nom de la ville
|
|
* \param[in] nomDep Nom du département
|
|
* \return void
|
|
*
|
|
* Fonction qui recherche les candidats qui ont une candidature pour un département en particulier. Elle ne retourne rien.
|
|
*/
|
|
|
|
void rechercheDeptTousCandidat(ListeCandidats liste, char* nomVille, char* nomDep){
|
|
|
|
while(liste !=NULL){
|
|
|
|
rechercheDeptCandidatE(liste->c.choix, nomVille, nomDep, liste);
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affichage du menu principal
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche le menu principal. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageMenuPrincipal(void){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\tMENU PRINCIPAL\t\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("-------------------------------\n\n");
|
|
|
|
printf("(1) Utilisateur\n");
|
|
|
|
printf("(2) Administrateur\n");
|
|
|
|
printf("\n(9) Quitter\n");
|
|
|
|
}
|
|
/**
|
|
* \brief Affichage du menu principal + utilisateur responsable
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche le menu principal et l'utilisateur responsable. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageMenuPrincipal2(void){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\tMENU PRINCIPAL\t\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("-------------------------------\n\n");
|
|
|
|
printf("(1) Utilisateur\n");
|
|
|
|
printf("(2) Administrateur\n");
|
|
|
|
printf("(3) Responsable\n");
|
|
|
|
printf("\n(9) Quitter\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Switch pour le menu principal
|
|
* \param[in] choix Choix de l'utilisateur
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in, out] etatPhase État actuel de la phase
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente Liste des candidats en attente
|
|
* \return void
|
|
*
|
|
* Fonction qui fait un switch pour le menu principal. Elle ne retourne rien.
|
|
*/
|
|
|
|
void switchPrincipal(int choix, VilleIUT **tiut, int tlog, int *etatPhase, ListeCandidats liste, ListeCandidats *admis, File *attente){
|
|
|
|
switch (choix){
|
|
|
|
case 1:
|
|
|
|
clear();
|
|
|
|
sousMenuUtilisateur(tiut, tlog, liste, admis, attente, etatPhase);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
clear();
|
|
|
|
sousMenuAdministrateur(tiut, tlog, etatPhase, liste); // Sous Menu Administrateur
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
clear();
|
|
|
|
if (*etatPhase == 0)
|
|
|
|
affichageErreurSaisie();
|
|
|
|
else
|
|
|
|
sousMenuResponsable(liste, admis, attente);
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
clear();
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
affichageErreurSaisie();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* \brief Menu responsable
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente Liste des candidats en attente
|
|
* \return void
|
|
*
|
|
* Fonction qui gère le menu responsable. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sousMenuResponsable(ListeCandidats liste, ListeCandidats *admis, File *attente){
|
|
|
|
int choix;
|
|
|
|
char motDePasseResponsable[25];
|
|
|
|
printf("Mot de passe responsable : ");
|
|
|
|
scanf("%*c");
|
|
|
|
fgets(motDePasseResponsable, 25, stdin);
|
|
|
|
motDePasseResponsable[strlen(motDePasseResponsable)-1] = '\0';
|
|
|
|
if(strcmp("Je suis responsable", motDePasseResponsable) != 0){
|
|
|
|
affichageErreurMdp();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
clear();
|
|
|
|
while(choix != 9){
|
|
|
|
affichageSousMenuResponsable();
|
|
|
|
choix = fonctionChoix();
|
|
|
|
switchResponsable(choix, liste, admis, attente);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Switch pour le menu responsable
|
|
* \param[in] choix Choix de l'utilisateur
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente Liste des candidats en attente
|
|
* \return void
|
|
*
|
|
* Fonction qui fait un switch pour le menu responsable. Elle ne retourne rien.
|
|
*/
|
|
|
|
void switchResponsable(int choix, ListeCandidats liste, ListeCandidats *admis, File *attente){
|
|
|
|
int maxAdmis, tabNumCandidat[30];
|
|
|
|
int tlog3, i, trouve, res, trouveVoeu, trouveCandidat;
|
|
|
|
float noteMin, tabMoyennes[30];
|
|
|
|
char nom[30], prenom[30], ville[30], departement[22];
|
|
|
|
ListeCandidats listeCandidatsClermont, save = listeCandidatsNouv();
|
|
|
|
switch (choix){
|
|
|
|
case 1:
|
|
|
|
clear();
|
|
|
|
listeCandidatsClermont = rechercheVoeux(liste);
|
|
|
|
affichageCandidats(listeCandidatsClermont);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
clear();
|
|
|
|
listeCandidatsClermont = rechercheVoeux(liste);
|
|
|
|
save = listeCandidatsClermont;
|
|
|
|
listeCandidatsClermont = triFusion(listeCandidatsClermont);
|
|
|
|
affichageCandidats(listeCandidatsClermont);
|
|
|
|
listeCandidatsClermont=save;
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
clear();
|
|
|
|
tlog3=lectureMoyennes(tabNumCandidat, tabMoyennes);
|
|
|
|
for(i=0;i<tlog3;i++) printf("Numéro candidat : %d\nMoyenne : %.2f\n", tabNumCandidat[i], tabMoyennes[i]);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
clear();
|
|
|
|
printf("Note minimum : ");
|
|
|
|
scanf("%f",¬eMin);
|
|
|
|
clear();
|
|
|
|
printf("Maximum admis : ");
|
|
|
|
scanf("%d",&maxAdmis);
|
|
|
|
tlog3=lectureMoyennes(tabNumCandidat, tabMoyennes);
|
|
|
|
clear();
|
|
|
|
gestionCandidats(liste, tlog3, noteMin, maxAdmis);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
clear();
|
|
|
|
printf("Note minimum : ");
|
|
|
|
scanf("%f",¬eMin);
|
|
|
|
clear();
|
|
|
|
printf("Maximum admis : ");
|
|
|
|
scanf("%d",&maxAdmis);
|
|
|
|
tlog3 = lectureMoyennes(tabNumCandidat, tabMoyennes);
|
|
|
|
clear();
|
|
|
|
liste = changeDecision(liste, tlog3, noteMin, maxAdmis, admis, attente);
|
|
|
|
break;
|
|
|
|
case 6:
|
|
|
|
clear();
|
|
|
|
printf("- Liste des candidats admis : - \n\n");
|
|
|
|
affichageCandidats(*admis);
|
|
|
|
printf("\n- File des candidats en attente : - \n\n");
|
|
|
|
afficherFile(*attente);
|
|
|
|
break;
|
|
|
|
case 7:
|
|
|
|
clear();
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Nom du candidat : ");
|
|
|
|
fgets(nom, 30, stdin);
|
|
|
|
nom[strlen(nom)-1] = '\0';
|
|
|
|
printf("Prénom du candidat : ");
|
|
|
|
fgets(prenom, 30, stdin);
|
|
|
|
prenom[strlen(prenom)-1] = '\0';
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
rechercheCandidat(liste, nom, prenom, &trouve);
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
if(trouve == -1) printf("Erreur : Candidat non trouvé !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
break;
|
|
|
|
case 8:
|
|
|
|
clear();
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Nom du candidat : ");
|
|
|
|
fgets(nom, 30, stdin);
|
|
|
|
nom[strlen(nom)-1] = '\0';
|
|
|
|
printf("Prénom du candidat : ");
|
|
|
|
fgets(prenom, 30, stdin);
|
|
|
|
prenom[strlen(prenom)-1] = '\0';
|
|
|
|
printf("Ville du voeu : ");
|
|
|
|
fgets(ville, 30, stdin);
|
|
|
|
ville[strlen(ville)-1] = '\0';
|
|
|
|
printf("Département du voeu : ");
|
|
|
|
fgets(departement, 22, stdin);
|
|
|
|
departement[strlen(departement)-1] = '\0';
|
|
|
|
res = rechercheCandidatAdmis(liste, nom, prenom, &trouveCandidat, &trouveVoeu, ville, departement);
|
|
|
|
if (trouveCandidat == 0){
|
|
|
|
printf("Candidat non trouvé\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (trouveVoeu == 0){
|
|
|
|
printf("Voeu non trouvé\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
clear();
|
|
|
|
switch (res){
|
|
|
|
case 1:
|
|
|
|
printf("%s %s a été admis(e) !\n", nom, prenom);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
printf("%s %s est en file d'attente !\n", nom, prenom);
|
|
|
|
break;
|
|
|
|
case -1:
|
|
|
|
printf("%s %s a été refusé(e) !\n", nom, prenom);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
clear();
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
affichageErreurSaisie();
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche un candidat dans la liste donnée
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] nom Nom du candidat
|
|
* \param[in] prenom Prénom du candidat
|
|
* \param[in, out] trouve Si le candidat est dans la liste ou non
|
|
* \return int
|
|
*
|
|
* Fonction qui recherche un candidat dans la liste entrée en paramètres. Elle retourne l'emplacement du candidat dans la liste.
|
|
*/
|
|
|
|
int rechercheCandidat(ListeCandidats liste, char* nom, char* prenom, int *trouve){
|
|
|
|
int pos=0;
|
|
|
|
while(liste != NULL) {
|
|
|
|
if((strcmp(liste->c.nom, nom) == 0) && (strcmp(liste->c.prenom, prenom) == 0)){
|
|
|
|
afficher1Candidat(liste->c);
|
|
|
|
*trouve=1;
|
|
|
|
return pos;
|
|
|
|
}
|
|
|
|
pos = pos+1;
|
|
|
|
liste=liste->suiv;
|
|
|
|
}
|
|
|
|
*trouve=-1;
|
|
|
|
return pos;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Gère les candidats en fonction de la note minimum et le maximum d'admis
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] tlog Taille de la liste des candidats
|
|
* \param[in] noteMin Note minimum pour être accepté
|
|
* \param[in] maxAdmis Maximum admis dans l'iut
|
|
* \return void
|
|
*
|
|
* Fonction qui gère les candidats en fonction de la note minimum et le maximum d'admis, puis affiche les résultats. Elle ne retourne rien.
|
|
*/
|
|
|
|
void gestionCandidats(ListeCandidats liste, int tlog, float noteMin, int maxAdmis){
|
|
|
|
int nbValide = 0;
|
|
|
|
ListeCandidats listeC = listeCandidatsNouv(), admis = listeCandidatsNouv();
|
|
|
|
File attente = filenouv();
|
|
|
|
while(noteMin <= 0){
|
|
|
|
printf("La note minimum n'est pas définie ou est égal à 0.\n");
|
|
|
|
printf("Note minimum : ");
|
|
|
|
scanf("%f", ¬eMin);
|
|
|
|
}
|
|
|
|
while(maxAdmis <= 0){
|
|
|
|
printf("Le maximum doit être supérieur à 0.\n");
|
|
|
|
printf("Maximum admis : ");
|
|
|
|
scanf("%d", &maxAdmis);
|
|
|
|
clear();
|
|
|
|
}
|
|
|
|
listeC = rechercheVoeux(liste);
|
|
|
|
if(tlog == -1) return;
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\tClassement\n------------------------------\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
admis = changerDecisionAdmis(listeC, maxAdmis, noteMin, &attente);
|
|
|
|
affichageCandidats(admis);
|
|
|
|
afficherFile(attente);
|
|
|
|
nbValide = longueurListeCandidats(admis);
|
|
|
|
if(nbValide == tlog) printf("Tous les candidats sont au-dessus de la note minimum !\n");
|
|
|
|
if(nbValide == 0) printf("Il n'y a aucun candidat au-dessus de la note minimum...\n");
|
|
|
|
printf("Nombre de candidats : %d\n", nbValide);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Change la décision dans la liste de candidats
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] tlog Taille de la liste des candidats
|
|
* \param[in] noteMin Note minimum pour être accepté
|
|
* \param[in] maxAdmis Maximum admis dans l'iut
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente Liste des candidats en attente
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui change la décision dans la liste suite à la note minimum et le maximum d'admis. Elle retourne la liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats changeDecision(ListeCandidats liste, int tlog, float noteMin, int maxAdmis, ListeCandidats *admis, File *attente){
|
|
|
|
ListeCandidats listeC = listeCandidatsNouv(), aux;
|
|
|
|
while(noteMin <= 0){
|
|
|
|
printf("La note minimum n'est pas définie ou est égal à 0.\n");
|
|
|
|
printf("Note minimum : ");
|
|
|
|
scanf("%f", ¬eMin);
|
|
|
|
}
|
|
|
|
while(maxAdmis <= 0){
|
|
|
|
printf("Le maximum doit être supérieur à 0.\n");
|
|
|
|
printf("Maximum admis : ");
|
|
|
|
scanf("%d%*c", &maxAdmis);
|
|
|
|
clear();
|
|
|
|
}
|
|
|
|
listeC = rechercheVoeux(liste);
|
|
|
|
aux = copierListeCandidats(listeC);
|
|
|
|
if(tlog == -1) exit(1);
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
liste = remettreAZeroListe(admis, liste);
|
|
|
|
liste = remettreAZero(attente, liste);
|
|
|
|
*admis = changerDecisionAdmis(aux, maxAdmis, noteMin, attente);
|
|
|
|
liste = actualiseDecisionListe(*admis, liste, 1);
|
|
|
|
liste = actualiseDecision(*attente, liste, 2);
|
|
|
|
liste = refuser(listeC, liste, noteMin);
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Efface la liste d'attente
|
|
* \param[in, out] file File d'attente liée aux candidats
|
|
* \param[in] ListeC Liste des candidats
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui efface la liste d'attente liée aux candidats. Elle retourne la nouvelle liste des candidats.
|
|
*/
|
|
|
|
ListeCandidats remettreAZero(File *file, ListeCandidats listeC){
|
|
|
|
int longueurAdmis = longueurFile(*file);
|
|
|
|
int i;
|
|
|
|
for (i = 0 ; i < longueurAdmis ; i++){
|
|
|
|
listeC = listerCandidats(*file, listeC, 0);
|
|
|
|
(*file) -> c.choix = remetChoixZero((*file) -> c.choix);
|
|
|
|
*file = (*file) -> suiv;
|
|
|
|
}
|
|
|
|
freeFile(*file);
|
|
|
|
*file = filenouv();
|
|
|
|
return listeC;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Efface la liste d'admis
|
|
* \param[in, out] listeAdmis Liste des candidats admis
|
|
* \param[in] ListeC Liste des candidats
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui efface la liste d'admis liée aux candidats. Elle retourne la nouvelle liste des candidats.
|
|
*/
|
|
|
|
ListeCandidats remettreAZeroListe(ListeCandidats *listeAdmis, ListeCandidats listeC){
|
|
|
|
int longueurAdmis = longueurListeCandidats(*listeAdmis);
|
|
|
|
int i;
|
|
|
|
for (i = 0 ; i < longueurAdmis ; i++){
|
|
|
|
listeC = listerListeCandidats(*listeAdmis, listeC, 0);
|
|
|
|
(*listeAdmis) -> c.choix = remetChoixZero((*listeAdmis) -> c.choix);
|
|
|
|
*listeAdmis = (*listeAdmis) -> suiv;
|
|
|
|
}
|
|
|
|
freeListe(*listeAdmis);
|
|
|
|
*listeAdmis = listeCandidatsNouv();
|
|
|
|
return listeC;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Efface la file en paramètres
|
|
* \param[in] file File à vider
|
|
* \return void
|
|
*
|
|
* Fonction qui efface la file entrée en paramètres. Elle ne retourne rien.
|
|
*/
|
|
|
|
void freeFile(File file){
|
|
|
|
MaillonFile *maillonSuivant;
|
|
|
|
int longueur = longueurFile(file), i;
|
|
|
|
for (i = 0 ; i < longueur ; i++){
|
|
|
|
maillonSuivant = (file) -> suiv;
|
|
|
|
free(file);
|
|
|
|
file = maillonSuivant;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Efface la liste des candidats en paramètres
|
|
* \param[in] liste Liste des candidats à vider
|
|
* \return void
|
|
*
|
|
* Fonction qui efface la liste des candidats entrée en paramètres. Elle ne retourne rien.
|
|
*/
|
|
|
|
void freeListe(ListeCandidats liste){
|
|
|
|
MaillonCandidat *maillonSuivant;
|
|
|
|
int longueur = longueurListeCandidats(liste), i;
|
|
|
|
for (i = 0 ; i < longueur ; i++){
|
|
|
|
maillonSuivant = (liste) -> suiv;
|
|
|
|
free(liste);
|
|
|
|
liste = maillonSuivant;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Remet à zéro la liste des choix en paramètres
|
|
* \param[in] liste Liste des choix à vider
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui remet à zéro la liste des choix entrée en paramètres. Elle retourne la nouvelle liste de choix.
|
|
*/
|
|
|
|
ListeChoix remetChoixZero(ListeChoix liste){
|
|
|
|
ListeChoix aux;
|
|
|
|
aux = liste;
|
|
|
|
while (liste != NULL){
|
|
|
|
liste = modifieDecision(liste, 0);
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Copie la liste des candidats
|
|
* \param[in] liste Liste des candidats à copier
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui copie la liste des candidats entrée en paramètres. Elle quitte le programme si il y a un problème malloc, sinon elle retourne la liste de candidats.
|
|
*/
|
|
|
|
|
|
ListeCandidats copierListeCandidats(ListeCandidats liste){
|
|
|
|
if (liste == NULL) return NULL;
|
|
|
|
MaillonCandidat *copie = malloc(sizeof(MaillonCandidat));
|
|
|
|
if (copie == NULL) {
|
|
|
|
printf("Erreur lors de l'allocation de mémoire pour la copie de la liste de candidats");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
copie -> c = liste -> c;
|
|
|
|
copie -> suiv = copierListeCandidats(liste -> suiv);
|
|
|
|
return copie;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Refuse le candidat en dessous de la note minimum
|
|
* \param[in] listeC Liste des candidats
|
|
* \param[in] liste Liste à retourner
|
|
* \param[in] noteMin Note minimum
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui parcourt la liste de candidats pour refuser les candidats en dessous de la note minimum. Elle retourne la nouvelle liste de candidats.
|
|
*/
|
|
|
|
|
|
ListeCandidats refuser(ListeCandidats listeC, ListeCandidats liste, float noteMin){
|
|
|
|
while (listeC != NULL){
|
|
|
|
if (((listeC -> c.notes[0] * 2 + listeC -> c.notes[1] + listeC -> c.notes[2] * 2 + listeC -> c.notes[3] * 4) / 9) < noteMin)
|
|
|
|
liste = listerRefuse(listeC, liste, -1);
|
|
|
|
listeC = listeC -> suiv;
|
|
|
|
}
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Refuse les candidats en dessous de la note minimum dans la liste
|
|
* \param[in] listeC Liste des candidats
|
|
* \param[in] liste Liste à retourner
|
|
* \param[in] decision Décision du département
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui parcourt la liste de candidats pour lister les candidats refusés. Elle retourne la liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats listerRefuse(ListeCandidats listeC, ListeCandidats liste, int decision){
|
|
|
|
ListeCandidats aux;
|
|
|
|
aux = liste;
|
|
|
|
while (liste != NULL){
|
|
|
|
if (listeC -> c.numCandid == liste -> c.numCandid)
|
|
|
|
liste -> c.choix = modifieDecision(liste -> c.choix, decision);
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Actualise les décisions liées aux candidat
|
|
* \param[in] file File des candidats en attente
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] decision Décision à insérer
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui actualise les décisions liées au candidat (Si le candidat refuse, on actualise la file d'attente). Elle retourne la nouvelle liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats actualiseDecision(File file, ListeCandidats liste, int decision){
|
|
|
|
int i;
|
|
|
|
for (i = 0 ; i < longueurFile(file) ; i++){
|
|
|
|
liste = listerCandidats(file, liste, decision);
|
|
|
|
file = file -> suiv;
|
|
|
|
}
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Actualise les décisions liées aux candidats dans la liste
|
|
* \param[in] listeAdmis Liste des candidats admis
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] decision Décision à insérer
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui actualise les décisions liées aux candidats (Si un candidat refuse, on actualise la file d'attente). Elle retourne la nouvelle liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats actualiseDecisionListe(ListeCandidats listeAdmis, ListeCandidats liste, int decision){
|
|
|
|
int i, longueur;
|
|
|
|
longueur = longueurListeCandidats(listeAdmis);
|
|
|
|
for (i = 0 ; i < longueur ; i++){
|
|
|
|
liste = listerListeCandidats(listeAdmis, liste, decision);
|
|
|
|
listeAdmis = listeAdmis -> suiv;
|
|
|
|
}
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Actualise les décisions des départements piur le candidat
|
|
* \param[in] file File des candidats en attente
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] decision Décision à insérer
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui actualise les décisions des départements pour le candidat. Elle retourne la nouvelle liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats listerCandidats(File file, ListeCandidats liste, int decision){
|
|
|
|
ListeCandidats aux;
|
|
|
|
aux = liste;
|
|
|
|
while (liste != NULL){
|
|
|
|
if (file -> c.numCandid == liste -> c.numCandid)
|
|
|
|
liste -> c.choix = modifieDecision(liste -> c.choix, decision);
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Actualise les décisions des départements dans la liste
|
|
* \param[in] listeAdmis Liste des candidats admis
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] decision Décision à insérer
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui actualise les décisions des départements dans la liste. Elle retourne la nouvelle liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats listerListeCandidats(ListeCandidats listeAdmis, ListeCandidats liste, int decision){
|
|
|
|
ListeCandidats aux;
|
|
|
|
aux = liste;
|
|
|
|
while (liste != NULL){
|
|
|
|
if (listeAdmis -> c.numCandid == liste -> c.numCandid)
|
|
|
|
liste -> c.choix = modifieDecision(liste -> c.choix, decision);
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Modifie les décisions des départements dans la liste de choix
|
|
* \param[in] liste Liste des choix
|
|
* \param[in] decision Décision à modifier
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui modifie les décisions des départements dans la liste. Elle retourne la nouvelle liste de choix.
|
|
*/
|
|
|
|
ListeChoix modifieDecision(ListeChoix liste, int decision){
|
|
|
|
ListeChoix aux;
|
|
|
|
aux = liste;
|
|
|
|
int longueur = longueurListeChoix(liste), i;
|
|
|
|
for (i = 0 ; i < longueur ; i++){
|
|
|
|
if (strcmp(liste -> c.departement, "Informatique") == 0 && strcmp(liste -> c.ville, "Clermont-Ferrand") == 0)
|
|
|
|
liste -> c.decision = decision;
|
|
|
|
/*
|
|
|
|
//TEST
|
|
|
|
if (strcmp(liste -> c.departement, "Biologie") == 0 && strcmp(liste -> c.ville, "Clermont-Ferrand") == 0)
|
|
|
|
liste -> c.decision = decision;
|
|
|
|
//FIN TEST
|
|
|
|
*/
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Change les candidats (admis ou non)
|
|
* \param[in] listeC Liste des candidats
|
|
* \param[in] maxAdmis Maximum admis
|
|
* \param[in] noteMin Note minimum
|
|
* \param[in, out] attente File d'attente
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui change les candidats (admis ou non) dans la liste des candidats. Elle retourne la nouvelle liste de candidats admis.
|
|
*/
|
|
|
|
ListeCandidats changerDecisionAdmis(ListeCandidats listeC, int maxAdmis, int noteMin, File* attente){
|
|
|
|
int i, j, pge, longueur;
|
|
|
|
Candidat cpge;
|
|
|
|
ListeCandidats admis = listeCandidatsNouv();
|
|
|
|
for (j = 0 ; j < maxAdmis ; j++){
|
|
|
|
cpge = plusGrand(listeC, &pge);
|
|
|
|
if (pge >= noteMin){
|
|
|
|
admis = insererCandidats(admis, cpge);
|
|
|
|
listeC = supprimerCandidats(listeC, cpge.numCandid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
longueur = longueurListeCandidats(listeC);
|
|
|
|
for (i = 0 ; i < longueur ; i++){
|
|
|
|
cpge = plusGrand(listeC, &pge);
|
|
|
|
if (pge >= noteMin){
|
|
|
|
*attente = adjonctionEnQueueFile(*attente, cpge);
|
|
|
|
listeC = supprimerCandidats(listeC, cpge.numCandid);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return admis;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Cherche le candidat avec la meilleure moyenne
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in, out] pge Plus grand élément
|
|
* \return Candidat
|
|
*
|
|
* Fonction qui cherche le candidat qui a la meilleure moyenne dans la liste. Elle retourne le candidat.
|
|
*/
|
|
|
|
Candidat plusGrand(ListeCandidats liste, int *pge){
|
|
|
|
*pge = 0;
|
|
|
|
Candidat cpge;
|
|
|
|
while(liste != NULL){
|
|
|
|
if (((liste -> c.notes[0] * 2 + liste -> c.notes[1] + liste -> c.notes[2] * 2 + liste -> c.notes[3] * 4) / 9) >= *pge){
|
|
|
|
*pge = (liste -> c.notes[0] * 2 + liste -> c.notes[1] + liste -> c.notes[2] * 2 + liste -> c.notes[3] * 4) / 9;
|
|
|
|
cpge = liste -> c;
|
|
|
|
}
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return cpge;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Lit les moyennes de chaque candidats dans le fichier notesCandidats.don
|
|
* \param[in, out] tabNumCandidat Tableau des numéros des candidats
|
|
* \param[in, out] tabMoyennes Tableau des moyennes des candidats
|
|
* \return int
|
|
*
|
|
* Fonction qui lit les moyennes de chaque candidats dans le fichier notesCandidats.don. Elle retourne -1 si il y a un problème d'ouverture, sinon elle retourne le nombre de candidats.
|
|
*/
|
|
|
|
int lectureMoyennes(int tabNumCandidat[30], float tabMoyennes[30]){
|
|
|
|
FILE* flot;
|
|
|
|
int i=0;
|
|
|
|
flot=fopen("notesCandidats.don", "r");
|
|
|
|
if(flot == NULL) {
|
|
|
|
printf("Problème ouverture fichier [notesCandidats.don]\n");
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
while(!feof(flot)){
|
|
|
|
fscanf(flot, "%d\n%f\n", &tabNumCandidat[i], &tabMoyennes[i]);
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche l'erreur de saisie
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche une erreur si l'utilisateur a rentré une saisie invalide. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageErreurSaisie(void){
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Saisie incorrecte.\n\a"); // \a -> Cloche
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche le menu administrateur
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche le menu administrateur. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageMenuAdministrateur(void){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\tMENU ADMINISTRATEUR\t\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("-------------------------------\n\n");
|
|
|
|
printf("(1) Modifier le nombre de places dans un département\n");
|
|
|
|
printf("(2) Créer un département dans un IUT\n");
|
|
|
|
printf("(3) Supprimer un département d'un IUT\n");
|
|
|
|
printf("(4) Lancer et arrêter la phase de candidature\n");
|
|
|
|
printf("(5) Modifier le nom du responsable d'un département\n");
|
|
|
|
printf("(6) Afficher toutes les informations\n");
|
|
|
|
printf("(7) Afficher un candidat en particulier\n");
|
|
|
|
printf("(8) Afficher les candidats présents dans un département\n");
|
|
|
|
printf("\n(9) Retour\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche mot de passe incorrect
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche une erreur si l'utilisateur a rentré un mot de passe incorrect. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageErreurMdp(void){
|
|
|
|
clear();
|
|
|
|
printf("---------------------------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Mot de passe incorrect. ");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("Retour au menu principal.\n\a"); // \a -> Cloche
|
|
|
|
printf("---------------------------------------------------\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Menu principal
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction principale du programme, c'est le menu principal. Elle ne retourne rien.
|
|
*/
|
|
|
|
void menuPrincipal(void){
|
|
|
|
int choix, tlog, etatPhase, tlog2, tlogAdmis;
|
|
|
|
VilleIUT *tiut[20];
|
|
|
|
ListeCandidats liste, admis = listeCandidatsNouv();
|
|
|
|
File attente = filenouv();
|
|
|
|
tlog = chargerFichier(tiut, 200);
|
|
|
|
if (tlog == -2 || tlog == -1) return;
|
|
|
|
admis = chargerBinListe(admis, "admis.bin", &tlogAdmis);
|
|
|
|
attente = chargerBinFile(attente, "attente.bin");
|
|
|
|
etatPhase = phaseCandid();
|
|
|
|
liste = listeCandidatsNouv();
|
|
|
|
/* PARTIE RESERVEE AU DEBUGGAGE
|
|
|
|
//liste = chargerTxtCandidats(liste, &tlog2);
|
|
|
|
//sauverCandidats(liste, tlog2);*/
|
|
|
|
liste = listeCandidatsNouv();
|
|
|
|
liste = chargerBinCandidats(liste, &tlog2);
|
|
|
|
attributionNote(liste, tlog2);
|
|
|
|
while(choix != 9){
|
|
|
|
if (etatPhase == 0)
|
|
|
|
affichageMenuPrincipal();
|
|
|
|
else
|
|
|
|
affichageMenuPrincipal2();
|
|
|
|
choix = fonctionChoix();
|
|
|
|
switchPrincipal(choix, tiut, tlog, &etatPhase, liste, &admis, &attente);
|
|
|
|
}
|
|
|
|
sauverFile(attente, "attente.bin");
|
|
|
|
printf("Fichier [attente.bin] sauvegardé !\n");
|
|
|
|
sauverCandidats(admis, tlogAdmis, "admis.bin");
|
|
|
|
printf("Fichier [admis.bin] sauvegardé !\n");
|
|
|
|
sauvegarder(tiut, tlog);
|
|
|
|
printf("Ficher [iut.don] sauvegardé !\n");
|
|
|
|
sauverCandidats(liste, tlog2, "candidats.bin");
|
|
|
|
printf("Ficher [candidats.bin] sauvegardé !\n");
|
|
|
|
printf("Programme réalisé par Corentin LEMAIRE et Erwan MENAGER.\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Menu administrateur
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in, out] etatPhase État actuel de la phase
|
|
* \param[in] liste Liste des candidats
|
|
* \return void
|
|
*
|
|
* Fonction qui gère le menu administrateur. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sousMenuAdministrateur(VilleIUT **tiut, int tlog, int *etatPhase, ListeCandidats liste){
|
|
|
|
int choix;
|
|
|
|
char motDePasseAdmin[20];
|
|
|
|
printf("Mot de passe administrateur : ");
|
|
|
|
scanf("%*c");
|
|
|
|
fgets(motDePasseAdmin, 20, stdin);
|
|
|
|
motDePasseAdmin[strlen(motDePasseAdmin)-1] = '\0';
|
|
|
|
if(strcmp("M.Hasbani>", motDePasseAdmin) != 0){
|
|
|
|
affichageErreurMdp();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
clear(); // Clear terminal
|
|
|
|
while(choix != 9){
|
|
|
|
affichageMenuAdministrateur();
|
|
|
|
choix = fonctionChoix();
|
|
|
|
switchAdministrateur(choix, tiut, tlog, etatPhase, liste);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Choix de l'utilisateur
|
|
* \param[in] void
|
|
* \return int
|
|
*
|
|
* Fonction qui gère la saisie de l'utilisateur. Elle retourne la saisie de ce dernier.
|
|
*/
|
|
|
|
int fonctionChoix(void){
|
|
|
|
int choix;
|
|
|
|
printf("\nVotre choix : ");
|
|
|
|
scanf("%d", &choix);
|
|
|
|
return choix;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Permet de saisir une ville
|
|
* \param[in] ville Ville saisie
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \return int
|
|
*
|
|
* Fonction qui permet de saisir une ville et de vérifier si elle existe. Elle retourne -1 si le nom n'existe pas, 0 sinon.
|
|
*/
|
|
|
|
int saisieVille(char ville[], VilleIUT** tiut, int tlog){
|
|
|
|
int trouve;
|
|
|
|
printf("Nom de la ville : ");
|
|
|
|
scanf("%*c");
|
|
|
|
fgets(ville, 22, stdin);
|
|
|
|
if (strcmp(ville,"-1") == 0 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
rechercheVille(tiut, ville, tlog, &trouve);
|
|
|
|
while (strcmp(ville, " \n") == 0 || strcmp(ville, "\n") == 0){
|
|
|
|
printf("Nom incorrect, réessayez !\n");
|
|
|
|
printf("Quel département voulez-vous modifier ? ");
|
|
|
|
fgets(ville, 22, stdin);
|
|
|
|
if (strcmp(ville,"-1") == 0 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
ville[strlen(ville) - 1] = '\0';
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Permet de saisir un département
|
|
* \param[in] departement Département saisie
|
|
* \return int
|
|
*
|
|
* Fonction qui permet de saisir un département et de vérifier si il existe. Elle retourne -1 si le nom n'existe pas, 0 sinon.
|
|
*/
|
|
|
|
int saisieDept(char departement[]){
|
|
|
|
printf("Quel département voulez-vous modifier ? ");
|
|
|
|
fgets(departement, 22, stdin);
|
|
|
|
if (strcmp(departement,"-1") == 0 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
while (strcmp(departement, " \n") == 0 || strcmp(departement, "\n") == 0){
|
|
|
|
printf("Nom incorrect, réessayez !\n");
|
|
|
|
printf("Quel département voulez-vous modifier ? ");
|
|
|
|
fgets(departement, 22, stdin);
|
|
|
|
if (strcmp(departement,"-1") == 0 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
departement[strlen(departement) - 1] = '\0';
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Permet de saisir un nombre de places
|
|
* \param[in] void
|
|
* \return int
|
|
*
|
|
* Fonction qui permet de saisir un nombre de places. Elle retourne -1 si l'utilisateur entre -1, sinon elle retourne le nombre de places.
|
|
*/
|
|
|
|
int saisieNbPlace(void){
|
|
|
|
int nbP;
|
|
|
|
printf("Nombre de places : ");
|
|
|
|
scanf("%d", &nbP);
|
|
|
|
if (nbP == -1 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
while(nbP < 0){
|
|
|
|
printf("Nombre de places incorrect, réessayez !\n");
|
|
|
|
printf("Nombre de places : ");
|
|
|
|
scanf("%d", &nbP);
|
|
|
|
if (nbP == -1 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return nbP;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Permet de saisir un nouveau responsable
|
|
* \param[in] resp Responsable saisie
|
|
* \return int
|
|
*
|
|
* Fonction qui permet de saisir un nouveau responsable. Elle retourne -1 si l'utilisateur entre -1, 0 sinon.
|
|
*/
|
|
|
|
int saisieNvResp(char resp[]){
|
|
|
|
printf("Nom du nouveau responsable : ");
|
|
|
|
fgets(resp, 22, stdin);
|
|
|
|
if (strcmp(resp,"-1") == 0 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
while (strcmp(resp, " \n") == 0 || strcmp(resp, "\n") == 0){
|
|
|
|
printf("Nom du responsable incorrect, réessayez !\n");
|
|
|
|
printf("Nom du nouveau responsable : ");
|
|
|
|
fgets(resp, 22, stdin);
|
|
|
|
if (strcmp(resp,"-1") == 0 ){
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
resp[strlen(resp) - 1] = '\0';
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche menu utilisateur
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche le menu utilisateur. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageSousMenuUtilisateur(void){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\tMENU UTILISATEUR\t\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("-------------------------------\n\n");
|
|
|
|
printf("(1) Voir les villes où il y a un IUT\n");
|
|
|
|
printf("(2) Voir les départements d'un IUT\n");
|
|
|
|
printf("(3) Voir le nombre de places en première année d'un département d'un IUT\n");
|
|
|
|
printf("(4) Voir les IUT possédant un département en particulier\n");
|
|
|
|
printf("(5) Mes candidatures\n");
|
|
|
|
printf("\n(9) Retour\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche menu responsable
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche le menu responsable. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageSousMenuResponsable(void){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\tMENU RESPONSABLE\t\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("Clermont-Ferrand | Informatique\n");
|
|
|
|
printf("-------------------------------\n\n");
|
|
|
|
printf("(1) Afficher tous les candidats\n");
|
|
|
|
printf("(2) Afficher tous les candidats triés par ordre alphabétique\n");
|
|
|
|
printf("(3) Afficher les moyennes des candidats\n");
|
|
|
|
printf("(4) Afficher les candidats au-dessus de la note minimum\n");
|
|
|
|
printf("(5) Lancer les admissions\n");
|
|
|
|
printf("(6) Consulter les files d'admis et d'attente\n");
|
|
|
|
printf("(7) Afficher un candidat en particulier\n");
|
|
|
|
printf("(8) Voir la décision d'un candidat pour un voeu\n");
|
|
|
|
printf("\n(9) Retour\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche les villes
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche les villes présentes dans le tableau tiut. Elle ne retourne rien.
|
|
*/
|
|
|
|
void afficherVillesIUT(VilleIUT **tiut, int tlog){
|
|
|
|
int pos;
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
for (pos = 0 ; pos < tlog ; pos++)
|
|
|
|
printf("N°%d : %s\n", pos + 1, tiut[pos]->ville);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche les départements de la ville
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] pos Position de la ville
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche les départements de la ville du tableau tiut. Elle ne retourne rien.
|
|
*/
|
|
|
|
void afficherDepartementsIUT(VilleIUT **tiut, int pos){
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
afficherListe(tiut[pos] -> ldept);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Switch pour le menu utilisateur
|
|
* \param[in] choix Choix de l'utilisateur
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente Liste des candidats en attente
|
|
* \param[in, out] etatPhase État actuel de la phase
|
|
* \return void
|
|
*
|
|
* Fonction qui fait le switch pour le menu utilisateur. Elle ne retourne rien.
|
|
*/
|
|
|
|
void switchUtilisateur(int choix, VilleIUT **tiut, int tlog, ListeCandidats liste, ListeCandidats *admis, File *attente, int *etatPhase){
|
|
|
|
int pos, trouve = 0, i;
|
|
|
|
char ville[30], departement[30], nom[30], prenom[30];
|
|
|
|
switch (choix){
|
|
|
|
case 1:
|
|
|
|
afficherVillesIUT(tiut, tlog);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
printf("Ville de l'IUT : ");
|
|
|
|
scanf("%s", ville);
|
|
|
|
pos = rechercheVille(tiut, ville, tlog, &trouve);
|
|
|
|
if (trouve == 0){
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Ville inexistante !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
afficherDepartementsIUT(tiut, pos);
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
nbPDepartement(tiut, tlog);
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
printf("Département recherché : ");
|
|
|
|
scanf("%s", departement);
|
|
|
|
clear();
|
|
|
|
printf("\t%s\n", departement);
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
rechercheTousDepartement(tiut, tlog, departement, &trouve);
|
|
|
|
if (trouve != 1){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Département inexistant !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
clear();
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Nom du candidat : ");
|
|
|
|
fgets(nom, 30, stdin);
|
|
|
|
nom[strlen(nom)-1] = '\0';
|
|
|
|
printf("Prénom du candidat : ");
|
|
|
|
fgets(prenom, 30, stdin);
|
|
|
|
clear();
|
|
|
|
printf("\tVotre profil\n");
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
prenom[strlen(prenom)-1] = '\0';
|
|
|
|
pos = rechercheCandidat(liste, nom, prenom, &trouve);
|
|
|
|
if(trouve == -1) {
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Candidat non trouvé !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
for (i = 0 ; i < pos ; i ++) liste = liste -> suiv;
|
|
|
|
sousMenuCandidature(liste -> c, tiut, tlog, admis, attente, etatPhase);
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
clear(); // Clear terminal
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
clear(); // Clear terminal
|
|
|
|
affichageErreurSaisie();
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* \brief Menu candidature
|
|
* \param[in] c Candidat
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente Liste des candidats en attente
|
|
* \param[in, out] etatPhase État actuel de la phase
|
|
* \return void
|
|
*
|
|
* Fonction qui gère le menu candidature. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sousMenuCandidature(Candidat c, VilleIUT** tiut, int tlog, ListeCandidats *admis, File *attente, int *etatPhase){
|
|
|
|
int choix = 0;
|
|
|
|
while (choix != 9){
|
|
|
|
affichageSousMenuCandidature();
|
|
|
|
choix = fonctionChoix();
|
|
|
|
switchCandidature(choix, c, tiut, tlog, admis, attente, etatPhase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche le menu candidature
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche le menu candidature. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageSousMenuCandidature(void){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;37m"); // Gras
|
|
|
|
printf("\tMENU CANDIDATURE\t\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
printf("-------------------------------\n\n");
|
|
|
|
printf("(1) Mon profil\n");
|
|
|
|
printf("(2) Ajouter une candidature\n");
|
|
|
|
printf("(3) Supprimer une candidature\n");
|
|
|
|
printf("(4) Voir les décisions\n");
|
|
|
|
printf("(5) Valider un voeu\n");
|
|
|
|
printf("\n(9) Retour\n");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Switch pour le menu candidature
|
|
* \param[in] choix Choix de l'utilisateur
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente Liste des candidats en attente
|
|
* \param[in, out] etatPhase État actuel de la phase
|
|
* \return void
|
|
*
|
|
* Fonction qui fait le switch pour le menu candidature. Elle ne retourne rien.
|
|
*/
|
|
|
|
void switchCandidature(int choix, Candidat c, VilleIUT** tiut, int tlog, ListeCandidats *admis, File *attente, int *etatPhase) {
|
|
|
|
int trouve, trouve2, trouve3, decision, validation;
|
|
|
|
char ville[30], departement[30], nvVille[30];
|
|
|
|
Choix nvChoix;
|
|
|
|
switch(choix){
|
|
|
|
case 1:
|
|
|
|
clear();
|
|
|
|
printf("\tVotre profil \n");
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
afficher1Candidat(c);
|
|
|
|
break;
|
|
|
|
case 2:
|
|
|
|
clear();
|
|
|
|
if(*etatPhase == 0){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Phase de candidature inactive !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Ville : ");
|
|
|
|
fgets(ville, 30, stdin);
|
|
|
|
ville[strlen(ville)-1] = '\0';
|
|
|
|
strcpy(nvChoix.ville,ville);
|
|
|
|
printf("Département : ");
|
|
|
|
fgets(departement, 30, stdin);
|
|
|
|
departement[strlen(departement)-1] = '\0';
|
|
|
|
strcpy(nvChoix.departement,departement);
|
|
|
|
nvChoix.decision=0;
|
|
|
|
nvChoix.validation=0;
|
|
|
|
trouve=rechercheVille(tiut, ville, tlog, &trouve2);
|
|
|
|
if(trouve != 1) {
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Département ou ville inexistant(e) !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
rechercheTousDepartement(tiut, tlog, nvVille, &trouve3);
|
|
|
|
c.choix=ajouterChoix(c.choix, nvChoix);
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("Voeux ajouté !\n");
|
|
|
|
break;
|
|
|
|
case 3:
|
|
|
|
clear();
|
|
|
|
if(*etatPhase == 0){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Phase de candidature inactive !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Ville : ");
|
|
|
|
fgets(ville, 30, stdin);
|
|
|
|
ville[strlen(ville)-1] = '\0';
|
|
|
|
strcpy(nvChoix.ville, ville);
|
|
|
|
printf("Département : ");
|
|
|
|
fgets(departement, 30, stdin);
|
|
|
|
departement[strlen(departement)-1] = '\0';
|
|
|
|
ListeChoix save = c.choix;
|
|
|
|
c.choix = supprimerVoeuxCandidat(c.choix, ville, departement, &trouve);
|
|
|
|
//printf("%s\n", trouve);
|
|
|
|
if(trouve == 2){
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("Candidature effacée !\n");
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Candidature inexistante !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
}
|
|
|
|
c.choix = save;
|
|
|
|
break;
|
|
|
|
case 4:
|
|
|
|
clear();
|
|
|
|
printf("------------Admis-------------\n\n");
|
|
|
|
affichageCandidatAdmis(c, 1);
|
|
|
|
printf("----------En attente-----------\n\n");
|
|
|
|
affichageCandidatAdmis(c, 2);
|
|
|
|
printf("------------Refusé-------------\n\n");
|
|
|
|
affichageCandidatAdmis(c, -1);
|
|
|
|
break;
|
|
|
|
case 5:
|
|
|
|
clear();
|
|
|
|
scanf("%*c");
|
|
|
|
printf("Ville : ");
|
|
|
|
fgets(ville, 30, stdin);
|
|
|
|
ville[strlen(ville)-1] = '\0';
|
|
|
|
printf("Département : ");
|
|
|
|
fgets(departement, 30, stdin);
|
|
|
|
departement[strlen(departement)-1] = '\0';
|
|
|
|
trouve = rechercheCandidatVoeu(c.choix, ville, departement, &validation, &decision);
|
|
|
|
if (trouve == 0){
|
|
|
|
printf("Voeu non présent !\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (decision != 1){
|
|
|
|
printf("Vous n'êtes pas admis dans cette formation !\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (validation != 0){
|
|
|
|
printf("Vous avez déjà validé vos voeux !\n");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
c.choix = validerVoeux(c.choix, ville, departement, admis, attente, c.numCandid);
|
|
|
|
break;
|
|
|
|
case 9:
|
|
|
|
clear();
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
clear();
|
|
|
|
affichageErreurSaisie();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche un voeux précis
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in] ville Nom de la ville
|
|
* \param[in] departement Nom du département
|
|
* \param[in, out] validation Validation du candidat
|
|
* \param[in, out] decision Decision du département
|
|
* \return int
|
|
*
|
|
* Fonction qui recherche un voeux entré en paramètres. Elle retourne 0 si elle n'a rien trouvé, 1 sinon.
|
|
*/
|
|
|
|
int rechercheCandidatVoeu(ListeChoix liste, char* ville, char* departement, int *validation, int *decision){
|
|
|
|
if (liste == NULL) return 0;
|
|
|
|
if((strcmp(liste -> c.ville, ville) == 0) && (strcmp(liste -> c.departement, departement) == 0)){
|
|
|
|
*decision = liste -> c.decision;
|
|
|
|
*validation = liste -> c.validation;
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
return rechercheCandidatVoeu(liste -> suiv, ville, departement, validation, decision);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche les candidats admis
|
|
* \param[in] c Candidat
|
|
* \param[in] decision Décision du département
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche les candidats admis. Elle ne retourne rien.
|
|
*/
|
|
|
|
void affichageCandidatAdmis(Candidat c, int decision){
|
|
|
|
ListeChoix save = listeChoixNouv();
|
|
|
|
save = c.choix;
|
|
|
|
while (c.choix !=NULL){
|
|
|
|
if (c.choix -> c.decision == decision)
|
|
|
|
printf("%s\t%s\n\n", c.choix -> c.ville, c.choix -> c.departement);
|
|
|
|
c.choix = c.choix -> suiv;
|
|
|
|
}
|
|
|
|
c.choix = save;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime un voeux d'un candidat
|
|
* \param[in] choix Liste des choix du candidat
|
|
* \param[in] ville Ville du voeux du candidat
|
|
* \param[in] departement Département du voeux du candidat
|
|
* \param[in, out] trouve Liste des candidats
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui supprime un voeux d'un candidat entré en paramètres. Elle retourne la liste des choix de ce dernier.
|
|
*/
|
|
|
|
ListeChoix supprimerVoeuxCandidat(ListeChoix choix, char* ville, char* departement, int *trouve){
|
|
|
|
if(choix == NULL) return choix;
|
|
|
|
if((strcmp(choix->c.ville, ville) == 0) && (strcmp(choix->c.departement, departement) == 0)) {
|
|
|
|
*trouve = 2;
|
|
|
|
return supprimerVoeuxCandidatEnTete(choix);
|
|
|
|
}
|
|
|
|
choix -> suiv = supprimerVoeuxCandidat(choix->suiv, ville, departement, trouve);
|
|
|
|
return choix;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime un voeux en tête
|
|
* \param[in] choix Liste des choix du candidat
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui supprime un voeux en tête d'un candidat entré en paramètres. Elle retourne la liste des choix de ce dernier.
|
|
*/
|
|
|
|
ListeChoix supprimerVoeuxCandidatEnTete(ListeChoix choix){
|
|
|
|
MaillonChoix *aux;
|
|
|
|
if(choix == NULL){
|
|
|
|
printf("Opération interdite\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
aux = choix;
|
|
|
|
choix=choix->suiv;
|
|
|
|
free(aux);
|
|
|
|
return choix;
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche un département dans tous les iut
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in] departement Département
|
|
* \param[in, out] trouve2 Si le département est trouvé ou non
|
|
* \return void
|
|
*
|
|
* Fonction qui recherche un département dans tous les iut existants. Elle ne retourne rien.
|
|
*/
|
|
|
|
void rechercheTousDepartement(VilleIUT** tiut, int tlog, char* departement, int *trouve2){
|
|
|
|
int i, trouve;
|
|
|
|
for (i = 0 ; i < tlog - 1 ; i ++){
|
|
|
|
rechercheDepartement(tiut, tiut[i] -> ville, departement, tlog, &trouve);
|
|
|
|
if (trouve == 1){
|
|
|
|
printf("%s\n", tiut[i] -> ville);
|
|
|
|
*trouve2 = 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche le nombre de places d'un département
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche le nombre de places d'un département précis. Elle ne retourne rien.
|
|
*/
|
|
|
|
void nbPDepartement(VilleIUT** tiut, int tlog){
|
|
|
|
int pos, trouve;
|
|
|
|
char ville[30], departement[30];
|
|
|
|
printf("Ville de l'IUT : ");
|
|
|
|
scanf("%s", ville);
|
|
|
|
pos=rechercheVille(tiut, ville, tlog, &trouve);
|
|
|
|
if (trouve == 0){
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Ville inexistante !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
printf("Département de l'IUT de %s : ", ville);
|
|
|
|
scanf("%s", departement);
|
|
|
|
rechercheDepartement(tiut, ville, departement, tlog, &trouve);
|
|
|
|
clear();
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
if (trouve == 0){
|
|
|
|
printf("\033[1;31m"); // Rouge
|
|
|
|
printf("Erreur : Département inexistant !\n");
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
printf("Nombre de places : %d\n", tiut[pos]->ldept->nbP);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Menu utilisateur
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] tlog Taille de tiut
|
|
* \param[in] liste Liste des candidats
|
|
* \param[in, out] admis Liste des candidat admis
|
|
* \param[in, out] attente File d'attente
|
|
* \param[in, out] etatPhase État actuel de la phase
|
|
* \return void
|
|
*
|
|
* Fonction qui gère le menu utilisateur. Elle ne retourne rien.
|
|
*/
|
|
|
|
void sousMenuUtilisateur(VilleIUT **tiut, int tlog, ListeCandidats liste, ListeCandidats *admis, File *attente, int *etatPhase){
|
|
|
|
int choix = 0;
|
|
|
|
while (choix != 9){
|
|
|
|
affichageSousMenuUtilisateur();
|
|
|
|
choix = fonctionChoix();
|
|
|
|
switchUtilisateur(choix, tiut, tlog, liste, admis, attente, etatPhase);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Insère un département dans la liste
|
|
* \param[in] l Liste des départements
|
|
* \param[in] departement Département
|
|
* \param[in] nbP Nombre de places
|
|
* \param[in] nomResp Nom du responsable
|
|
* \return ListeDept
|
|
*
|
|
* Fonction qui insère un département. Elle retourne la nouvelle liste.
|
|
*/
|
|
|
|
ListeDept inserer(ListeDept l, char* departement, int nbP, char* nomResp){
|
|
|
|
if (l == NULL)
|
|
|
|
return insererEnTete(l, departement, nbP, nomResp);
|
|
|
|
if (strcmp(departement, l -> departement) < 0)
|
|
|
|
return insererEnTete(l, departement, nbP, nomResp);
|
|
|
|
if (strcmp(departement, l -> departement) == 0)
|
|
|
|
return l;
|
|
|
|
l -> suiv = inserer(l->suiv, departement, nbP, nomResp);
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Insère un département en tête de liste
|
|
* \param[in] l Liste des départements
|
|
* \param[in] departement Département
|
|
* \param[in] nbP Nombre de places
|
|
* \param[in] nomResp Nom du responsable
|
|
* \return ListeDept
|
|
*
|
|
* Fonction qui insère un département en tête de liste. Elle retourne la nouvelle liste.
|
|
*/
|
|
|
|
ListeDept insererEnTete(ListeDept l, char* departement, int nbP, char* nomResp){
|
|
|
|
MaillonDept *m;
|
|
|
|
m = (MaillonDept *)malloc(sizeof(MaillonDept));
|
|
|
|
if (m == NULL)
|
|
|
|
{
|
|
|
|
printf("Problème malloc\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
strcpy(m -> departement, departement);
|
|
|
|
m -> nbP = nbP;
|
|
|
|
strcpy(m -> nomResp, nomResp);
|
|
|
|
m -> suiv = l;
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime un département dans la liste
|
|
* \param[in] l Liste des départements
|
|
* \param[in] departement Département
|
|
* \return ListeDept
|
|
*
|
|
* Fonction qui supprime un département. Elle retourne la nouvelle liste.
|
|
*/
|
|
|
|
ListeDept supprimer(ListeDept l, char* departement){
|
|
|
|
if (l == NULL)
|
|
|
|
return l;
|
|
|
|
if (strcmp(departement, l -> departement) < 0)
|
|
|
|
return l;
|
|
|
|
if (strcmp(departement, l -> departement) == 0)
|
|
|
|
return supprimerEnTete(l);
|
|
|
|
l -> suiv = supprimer(l->suiv, departement);
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime un département en tête de liste
|
|
* \param[in] l Liste des départements
|
|
* \return ListeDept
|
|
*
|
|
* Fonction qui supprime un département en tête de liste. Elle retourne la nouvelle liste.
|
|
*/
|
|
|
|
ListeDept supprimerEnTete(ListeDept l){
|
|
|
|
MaillonDept *aux;
|
|
|
|
if (l == NULL){
|
|
|
|
printf("Opération interdite !\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
aux = l;
|
|
|
|
l = l -> suiv;
|
|
|
|
free(aux);
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Modifie le nombre de places d'un département
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] positionTab Position du département dans le tableau
|
|
* \param[in] position Position du département
|
|
* \param[in] nbP Département
|
|
* \return void
|
|
*
|
|
* Fonction qui modifie le nombre de places d'un département. Elle ne retourne rien.
|
|
*/
|
|
|
|
void modifNbPlaces(VilleIUT* tiut[], int positionTab, int position, int nbP){
|
|
|
|
int i;
|
|
|
|
for (i = 0 ; i < position ; i ++){
|
|
|
|
tiut[positionTab] -> ldept = tiut[positionTab] -> ldept -> suiv;
|
|
|
|
}
|
|
|
|
tiut[positionTab] -> ldept -> nbP = nbP;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Modifie le nom du responsable d'un département
|
|
* \param[in] tiut Tableau des iut
|
|
* \param[in] positionTab Position du département dans le tableau
|
|
* \param[in] position Position du département
|
|
* \param[in] nomResp Nom du responsable
|
|
* \return void
|
|
*
|
|
* Fonction qui modifie le nom du responsable d'un département. Elle ne retourne rien.
|
|
*/
|
|
|
|
void modifResp(VilleIUT* tiut[], int positionTab, int position, char* nomResp){
|
|
|
|
int i;
|
|
|
|
for (i = 0 ; i < position ; i ++){
|
|
|
|
tiut[positionTab] -> ldept = tiut[positionTab] -> ldept -> suiv;
|
|
|
|
}
|
|
|
|
strcpy(tiut[positionTab] -> ldept -> nomResp, nomResp);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Efface l'affichage actuel
|
|
* \param[in] void
|
|
* \return void
|
|
*
|
|
* Fonction qui efface l'affichage actuel. Elle ne retourne rien.
|
|
*/
|
|
|
|
void clear(void){
|
|
|
|
printf("\e[1;1H\e[2J");
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Initialise une nouvelle file
|
|
* \param[in] void
|
|
* \return File
|
|
*
|
|
* Fonction qui initialise une nouvelle file. Elle retourne donc cette dernière.
|
|
*/
|
|
|
|
|
|
File filenouv(void){
|
|
|
|
File f;
|
|
|
|
f = NULL;
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Ajoute un candidat en file
|
|
* \param[in] f File
|
|
* \param[in] c Candidat à ajouter
|
|
* \return File
|
|
*
|
|
* Fonction qui ajoute un candidat en file. Elle retourne donc la nouvelle file.
|
|
*/
|
|
|
|
File adjonctionEnQueueFile(File f, Candidat c){
|
|
|
|
MaillonFile *m;
|
|
|
|
m = (MaillonFile *) malloc (sizeof(MaillonFile));
|
|
|
|
if (m == NULL){
|
|
|
|
printf("Pb malloc\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
m -> c = c;
|
|
|
|
if (videFile(f)){
|
|
|
|
f = m;
|
|
|
|
m -> suiv = m;
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
m -> suiv = f -> suiv;
|
|
|
|
f -> suiv = m;
|
|
|
|
f = m;
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Supprime un candidat en file
|
|
* \param[in] f File
|
|
* \return File
|
|
*
|
|
* Fonction qui ajoute un candidat en file. Elle retourne donc la nouvelle file.
|
|
*/
|
|
|
|
|
|
File suppressionEnTeteFile(File f){
|
|
|
|
MaillonFile *aux;
|
|
|
|
if (videFile(f)){
|
|
|
|
printf("Opération interdite\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
if (f == f -> suiv){
|
|
|
|
free(f);
|
|
|
|
return filenouv();
|
|
|
|
}
|
|
|
|
aux = f -> suiv;
|
|
|
|
f -> suiv = aux -> suiv;
|
|
|
|
free(aux);
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche le candidat en tête de file
|
|
* \param[in] f File
|
|
* \return Candidat
|
|
*
|
|
* Fonction qui affiche le candidat en tête de file. Elle retourne un candidat.
|
|
*/
|
|
|
|
|
|
Candidat teteFile(File f){
|
|
|
|
if (videFile(f)) {
|
|
|
|
printf("Opération interdite !\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
return f -> suiv -> c;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Calcule la longueur d'une file
|
|
* \param[in] f File
|
|
* \return int
|
|
*
|
|
* Fonction qui calcule la longueur d'une file. Elle retourne donc la longueur de cette dernière.
|
|
*/
|
|
|
|
int longueurFile(File f){
|
|
|
|
MaillonFile *c;
|
|
|
|
int compteur = 0;
|
|
|
|
if (videFile(f))
|
|
|
|
return 0;
|
|
|
|
c = f;
|
|
|
|
while(c != f -> suiv){
|
|
|
|
compteur = compteur + 1;
|
|
|
|
f = f -> suiv;
|
|
|
|
}
|
|
|
|
return compteur + 1;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Vérifie si une file est vide
|
|
* \param[in] f File
|
|
* \return bool
|
|
*
|
|
* Fonction qui vérifie si une file est vide. Elle retourne donc true ou false.
|
|
*/
|
|
|
|
bool videFile(File f){
|
|
|
|
if (f == NULL) return true;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Affiche une file
|
|
* \param[in] f File
|
|
* \return void
|
|
*
|
|
* Fonction qui affiche une file. Elle ne retourne rien.
|
|
*/
|
|
|
|
void afficherFile(File f){
|
|
|
|
int i;
|
|
|
|
for (i = 0; i < longueurFile(f); i++){
|
|
|
|
afficher1Candidat(f -> suiv -> c);
|
|
|
|
f = f -> suiv;
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
ListeCandidats rechercheVoeux(ListeCandidats l){
|
|
|
|
ListeCandidats listeC = listeCandidatsNouv();
|
|
|
|
int trouve;
|
|
|
|
while (l != NULL) {
|
|
|
|
trouve = rechercheDeptCandidat(l -> c.choix);
|
|
|
|
if (trouve == 1)
|
|
|
|
listeC = insertionCandidat(listeC, l -> c);
|
|
|
|
l = l -> suiv;
|
|
|
|
}
|
|
|
|
return listeC;
|
|
|
|
}
|
|
|
|
void rechercheDeptCandidatE(ListeChoix lChoix, char* nomVille, char* nomDep, ListeCandidats liste){
|
|
|
|
while (lChoix != NULL){
|
|
|
|
if ((strcmp(lChoix -> c.ville, nomVille) == 0) && (strcmp(lChoix -> c.departement, nomDep) == 0)) {
|
|
|
|
afficher1Candidat(liste->c);
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
}
|
|
|
|
lChoix = lChoix -> suiv;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
int rechercheDeptCandidat(ListeChoix l){
|
|
|
|
while (l != NULL){
|
|
|
|
if ((strcmp(l -> c.ville, "Clermont-Ferrand\0") == 0) && (strcmp(l -> c.departement, "Informatique\0") == 0))
|
|
|
|
return 1;
|
|
|
|
l = l -> suiv;
|
|
|
|
}
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Tri selection
|
|
* \param[in, out] tabNumCandidat Tableau des numéros des candidats
|
|
* \param[in, out] tabMoyennes Tableau des moyennes des candidats
|
|
* \param[in] tlog Taille de tabNumCandidat et tabMoyennes
|
|
* \return void
|
|
*
|
|
* Fonction qui trie les deux tableaux en paramètres. Elle ne retourne rien.
|
|
*/
|
|
|
|
void triSelection(int tabNumCandidat[30], float tabMoyennes[30], int tlog){
|
|
|
|
int i,j,c;
|
|
|
|
float c2;
|
|
|
|
for(i=0;i<tlog-1;i++)
|
|
|
|
for(j=i+1;j<tlog;j++)
|
|
|
|
if ( tabMoyennes[i] < tabMoyennes[j] ) {
|
|
|
|
c = tabNumCandidat[i];
|
|
|
|
c2 = tabMoyennes[i];
|
|
|
|
tabNumCandidat[i] = tabNumCandidat[j];
|
|
|
|
tabMoyennes[i] = tabMoyennes[j];
|
|
|
|
tabNumCandidat[j] = c;
|
|
|
|
tabMoyennes[j] = c2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Sauvegarde la file dans un fichier
|
|
* \param[in] file File à sauvegarder
|
|
* \param[in] nomFichier Nom du fichier
|
|
* \return void
|
|
*
|
|
* Fonction qui sauvegarde la file dans un fichier entré en paramètres. Elle quitte le programme si il y a un problème d'ouverture, sinon elle ne retourne rien.
|
|
*/
|
|
|
|
void sauverFile(File file, char* nomFichier){
|
|
|
|
FILE* flot;
|
|
|
|
int longueur = longueurFile(file), i, j, longueur2;
|
|
|
|
flot = fopen(nomFichier, "wb");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Pb ouverture fichier : %s\n", nomFichier);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
fwrite(&longueur, sizeof(int), 1, flot);
|
|
|
|
for (i = 0 ; i < longueur ; i++){
|
|
|
|
file = file -> suiv;
|
|
|
|
fwrite(&file -> c.numCandid, sizeof(int), 1, flot);
|
|
|
|
fwrite(file -> c.nom, sizeof(char), 30, flot);
|
|
|
|
fwrite(file -> c.prenom, sizeof(char), 30, flot);
|
|
|
|
fwrite(file -> c.notes, sizeof(float), 4, flot);
|
|
|
|
longueur2 = longueurListeChoix(file -> c.choix);
|
|
|
|
fwrite(&longueur2, sizeof(int), 1, flot);
|
|
|
|
for (j = 0 ; j < longueur2 ; j++){
|
|
|
|
fwrite(file -> c.choix -> c.ville, sizeof(char), 30, flot);
|
|
|
|
fwrite(file -> c.choix -> c.departement, sizeof(char), 30, flot);
|
|
|
|
fwrite(&file -> c.choix -> c.decision, sizeof(int), 1, flot);
|
|
|
|
fwrite(&file -> c.choix -> c.validation, sizeof(int), 1, flot);
|
|
|
|
file -> c.choix = file -> c.choix -> suiv;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
libererFile(file);
|
|
|
|
fclose(flot);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Libère en entier la file
|
|
* \param[in] file File à libérer
|
|
* \param[in] departement Département
|
|
* \return void
|
|
*
|
|
* Fonction qui libère en entier la file entrée en paramètres. Elle ne retourne rien.
|
|
*/
|
|
|
|
void libererFile(File file){
|
|
|
|
if (file == NULL || file -> c.choix == NULL){
|
|
|
|
return;
|
|
}
|
|
|
|
MaillonFile *aux;
|
|
|
|
int i, longueur = longueurFile(file);
|
|
|
|
if (longueur == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
for (i = 0 ; i < longueur ; i ++){
|
|
|
|
aux = file -> suiv;
|
|
|
|
file -> suiv = aux -> suiv;
|
|
|
|
free(aux);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Charge un fichier binaire dans une file
|
|
* \param[in] file File
|
|
* \param[in] nomFichier Nom du fichier
|
|
* \return File
|
|
*
|
|
* Fonction qui charge un fichier binaire dans une file. Elle quitte le programme si il y a un problème d'ouverture, sinon elle retourne la file.
|
|
*/
|
|
|
|
File chargerBinFile(File file, char* nomFichier){
|
|
|
|
Candidat c;
|
|
|
|
FILE *flot;
|
|
|
|
int longueur;
|
|
|
|
flot = fopen(nomFichier ,"rb");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Problème ouverture fichier [%s].\n", nomFichier);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
fread(&longueur, sizeof(int), 1, flot);
|
|
|
|
c = lireBinCandidat(flot);
|
|
|
|
while(!feof(flot)){
|
|
|
|
file = adjonctionEnQueueFile(file, c);
|
|
|
|
c = lireBinCandidat(flot);
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
printf("\033[1;32m"); // Vert
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("Chargement fichier [%s] terminé.\n",nomFichier);
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return file;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Charge un fichier binaire dans une liste de candidats
|
|
* \param[in] liste Liste de candidats
|
|
* \param[in] nomFichier Nom du fichier
|
|
* \param[in, out] tlog Taille de la liste
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui charge un fichier binaire dans une liste de candidats. Elle quitte le programme si il y a un problème d'ouverture, sinon elle retourne la liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats chargerBinListe(ListeCandidats liste, char* nomFichier, int *tlog){
|
|
|
|
Candidat c;
|
|
|
|
FILE *flot;
|
|
|
|
flot = fopen(nomFichier ,"rb");
|
|
|
|
if (flot == NULL){
|
|
|
|
printf("Problème ouverture fichier [%s].\n", nomFichier);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
fread(tlog, sizeof(int), 1, flot);
|
|
|
|
c = lireBinCandidat(flot);
|
|
|
|
while(!feof(flot)){
|
|
|
|
liste = insererCandidats(liste, c);
|
|
|
|
c = lireBinCandidat(flot);
|
|
|
|
}
|
|
|
|
fclose(flot);
|
|
|
|
printf("\033[1;32m"); // Vert
|
|
|
|
printf("-------------------------------\n");
|
|
|
|
printf("Chargement fichier [%s] terminé.\n", nomFichier);
|
|
|
|
printf("\033[0m"); // Reset couleur
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Insère un candidat en tête de liste
|
|
* \param[in] l Liste de candidats
|
|
* \param[in] c Candidat
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui insère un candidat en tête de liste. Elle quitte le programme si il y a un problème malloc, sinon elle retourne la liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats insererEnTeteListeCandidats(ListeCandidats l, Candidat c){
|
|
|
|
MaillonCandidat *m;
|
|
|
|
m = (MaillonCandidat *)malloc(sizeof(MaillonCandidat));
|
|
|
|
if (m == NULL)
|
|
|
|
{
|
|
|
|
printf("Problème malloc\n");
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
m -> c = c;
|
|
|
|
m -> suiv = l;
|
|
|
|
return m;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Insère un candidat dans une liste
|
|
* \param[in] l Liste de candidats
|
|
* \param[in] c Candidat
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui insère un candidat dans une liste. Elle retourne la liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats insererCandidats(ListeCandidats l, Candidat c){
|
|
|
|
if (l == NULL)
|
|
|
|
return insererEnTeteListeCandidats(l, c);
|
|
|
|
if (c.numCandid < l -> c.numCandid)
|
|
|
|
return insererEnTeteListeCandidats(l, c);
|
|
|
|
if (c.numCandid == l -> c.numCandid)
|
|
|
|
return l;
|
|
|
|
l -> suiv = insererCandidats(l->suiv, c);
|
|
|
|
return l;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Valide 1 voeux d'un candidat
|
|
* \param[in] liste Liste de candidats
|
|
* \param[in] ville Nom de la ville
|
|
* \param[in] departement Nom du département
|
|
* \param[in] decision Décision du département
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui valide 1 voeux d'un candidat. Elle est liée à la fonction validerVoeux. Elle retourne la nouvelle liste des choix.
|
|
*/
|
|
|
|
ListeChoix validationVoeux(ListeChoix liste, char *ville, char *departement, int decision){
|
|
|
|
ListeChoix aux;
|
|
|
|
aux = liste;
|
|
|
|
while (liste != NULL){
|
|
|
|
if (strcmp(ville, liste -> c.ville) == 0 && strcmp(departement, liste -> c.departement) == 0){
|
|
|
|
liste -> c.validation = decision;
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Valide 1 voeux d'un candidat
|
|
* \param[in] liste Liste de candidats
|
|
* \param[in] ville Nom de la ville
|
|
* \param[in] departement Nom du département
|
|
* \param[in, out] admis Liste des candidats admis
|
|
* \param[in, out] attente File d'attente
|
|
* \param[in] numCandid Numéro du candidat
|
|
* \return ListeChoix
|
|
*
|
|
* Fonction qui valide 1 voeux d'un candidat. Elle est liée à la fonction validationVoeux. Elle retourne la nouvelle liste des choix.
|
|
*/
|
|
|
|
ListeChoix validerVoeux(ListeChoix liste, char *ville, char *departement, ListeCandidats *admis, File *attente, int numCandid){
|
|
|
|
ListeChoix aux;
|
|
|
|
aux = liste;
|
|
|
|
while (liste != NULL){
|
|
|
|
if (strcmp(ville, liste -> c.ville) == 0 && strcmp(departement, liste -> c.departement) == 0)
|
|
|
|
liste = validationVoeux(liste, liste -> c.ville, liste -> c.departement, 1);
|
|
|
|
else {
|
|
|
|
if (liste -> c.decision == 1 && strcmp(liste -> c.ville, "Clermont-Ferrand") == 0 && strcmp(liste -> c.departement, "Informatique") == 0){
|
|
|
|
*admis = supprimerCandidats(*admis, numCandid);
|
|
|
|
*admis = insererCandidats(*admis, teteFile(*attente));
|
|
|
|
if (longueurFile(*attente) > 0)
|
|
|
|
*attente = suppressionEnTeteFile(*attente);
|
|
|
|
}
|
|
|
|
liste = validationVoeux(liste, liste -> c.ville, liste -> c.departement, -1);
|
|
|
|
}
|
|
|
|
liste = liste -> suiv;
|
|
|
|
}
|
|
|
|
return aux;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Divise une liste en deux
|
|
* \param[in] liste Liste de candidats
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui divise une liste en deux. Elle est liée à la fonction triFusion. Elle retourne la liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats diviserFusion(ListeCandidats liste){
|
|
|
|
ListeCandidats sousListe = liste, sousListe2 = liste;
|
|
|
|
while (sousListe->suiv && sousListe->suiv->suiv){
|
|
|
|
sousListe = sousListe->suiv->suiv;
|
|
|
|
sousListe2 = sousListe2->suiv;
|
|
|
|
}
|
|
|
|
ListeCandidats temp = sousListe2->suiv;
|
|
|
|
sousListe2->suiv = NULL;
|
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Fusion des deux sous-listes
|
|
* \param[in] liste Sous-liste 1
|
|
* \param[in] liste2 Sous-liste 2
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui fusionne les deux sous-listes du tri par fusion. Elle est liée à la fonction triFusion. Elle retourne la liste de candidats.
|
|
*/
|
|
|
|
ListeCandidats fusionListes(ListeCandidats liste, ListeCandidats liste2){
|
|
|
|
if (liste == NULL) return liste2;
|
|
|
|
if (liste2 == NULL) return liste;
|
|
|
|
//Si même nom, compare prénom
|
|
if (strcmp(liste->c.nom, liste2->c.nom) == 0){
|
|
|
|
if(strcmp(liste->c.prenom, liste2->c.prenom) < 0){
|
|
|
|
liste->suiv = fusionListes (liste->suiv, liste2);
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (strcmp(liste->c.nom, liste2->c.nom) < 0){
|
|
|
|
liste->suiv = fusionListes(liste->suiv, liste2);
|
|
|
|
return liste;
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
liste2->suiv = fusionListes(liste, liste2->suiv);
|
|
|
|
return liste2;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Tri fusion
|
|
* \param[in] liste Liste de candidats à trier
|
|
* \return ListeCandidats
|
|
*
|
|
* Fonction qui fait un tri par fusion pour la liste de candidats. Elle retourne la liste de candidats triée.
|
|
*/
|
|
|
|
ListeCandidats triFusion(ListeCandidats liste){
|
|
|
|
if (liste->suiv == NULL)
|
|
|
|
return liste;
|
|
|
|
ListeCandidats liste2 = diviserFusion(liste);
|
|
|
|
liste = triFusion(liste);
|
|
|
|
liste2 = triFusion(liste2);
|
|
|
|
return fusionListes(liste, liste2);
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche 1 candidat puis 1 voeux en particulier
|
|
* \param[in] liste Liste de candidats
|
|
* \param[in] nom Nom du candidat
|
|
* \param[in] prenom Prénom du candidat
|
|
* \param[in, out] trouveCandidat Si le candidat est trouvé
|
|
* \param[in, out] trouveVoeu Si le voeux est trouvé
|
|
* \param[in] ville Ville
|
|
* \param[in] departement Département
|
|
* \return int
|
|
*
|
|
* Fonction qui recherche 1 candidat puis 1 voeux entrés en paramètres. Elle retourne 0 si le candidat n'existe pas, sinon elle retourne la décision du département.
|
|
*/
|
|
|
|
int rechercheCandidatAdmis(ListeCandidats liste, char *nom, char *prenom, int *trouveCandidat, int *trouveVoeu, char *ville, char *departement){
|
|
|
|
if (liste == NULL){
|
|
|
|
*trouveCandidat = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (strcmp(liste -> c.nom, nom) == 0 && strcmp(liste -> c.prenom, prenom) == 0){
|
|
|
|
*trouveCandidat = 1;
|
|
|
|
return recherche1Voeu(liste -> c.choix, ville, departement, trouveVoeu);
|
|
|
|
}
|
|
|
|
return rechercheCandidatAdmis(liste -> suiv, nom, prenom, trouveCandidat, trouveVoeu, ville, departement);
|
|
|
|
}
|
|
|
|
/**
|
|
* \brief Recherche 1 voeux dans une liste de choix
|
|
* \param[in] liste Liste
|
|
* \param[in] ville Ville
|
|
* \param[in] departement Département
|
|
* \param[in, out] trouveVoeu Si le voeux est trouvé ou non
|
|
* \return int
|
|
*
|
|
* Fonction qui recherche 1 voeux dans une liste de choix. Elle retourne 0 si le voeux n'existe pas, sinon elle retourne la décision du département.
|
|
*/
|
|
|
|
int recherche1Voeu(ListeChoix liste, char *ville, char *departement, int *trouveVoeu){
|
|
|
|
if (liste == NULL){
|
|
|
|
*trouveVoeu = 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
if (strcmp(liste -> c.ville, ville) == 0 && strcmp(liste -> c.departement, departement) == 0){
|
|
|
|
*trouveVoeu = 1;
|
|
|
|
return liste -> c.decision;
|
|
|
|
}
|
|
|
|
return recherche1Voeu(liste -> suiv, ville, departement, trouveVoeu);
|
|
|
|
} |