|
|
#include "../header/sae.h"
|
|
|
|
|
|
/*
|
|
|
================================================
|
|
|
Partie 1
|
|
|
================================================
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
* @brief Fonction globale qui :
|
|
|
* - Charge les fichiers dans les structures adaptées
|
|
|
* - Appel la fonction du menu général (visiteur) avec les données enregistrées
|
|
|
* - Sauvegarde toutes les données dans les fichiers correspondants avant de terminer le logiciel
|
|
|
*/
|
|
|
void Globale(void)
|
|
|
{
|
|
|
printf(" \n ---> lancement de la fonction globale.... \n\n");
|
|
|
Log * tLog;
|
|
|
VilleIut *tIut[50] ;
|
|
|
|
|
|
int nbVilles;
|
|
|
int nbLog;
|
|
|
|
|
|
//Chargement des fichiers
|
|
|
tLog = chargementLog("../donnees/log.don", &nbLog);
|
|
|
//nbVilles = chargIutDon(tIut, 50, "../donnees/iut.don");
|
|
|
|
|
|
//Appel du menu visiteur
|
|
|
menuVisiteur(tLog, nbLog, tIut, nbVilles);
|
|
|
|
|
|
//Sauvegarde dans les fichiers
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Charge un fichier de logs dans un tableau de structures Log
|
|
|
* @param nomFichier [CHAINE DE CARACTERE] Le nom du fichier à charger
|
|
|
* @return Log* [TABLEAU DYNAMIQUE DE STRUCTURE] Le tableau de structures Log contenant les logs du fichier
|
|
|
*/
|
|
|
Log * chargementLog(char * nomFichier, int * nbLog)
|
|
|
{
|
|
|
FILE * fichier;
|
|
|
Log * tLog;
|
|
|
Log * tAnnexe;
|
|
|
|
|
|
int nbLogMax;
|
|
|
|
|
|
int i;
|
|
|
|
|
|
fichier = fopen(nomFichier, "r");
|
|
|
|
|
|
if (fichier == NULL)
|
|
|
{
|
|
|
printf("Erreur de fichier\n");
|
|
|
exit(1);
|
|
|
}
|
|
|
|
|
|
tLog = (Log *) malloc(sizeof(Log)*5);
|
|
|
nbLogMax = 5;
|
|
|
|
|
|
i = 0;
|
|
|
while (!feof(fichier))
|
|
|
{
|
|
|
// Taille physique insuffisante
|
|
|
if (i == nbLogMax)
|
|
|
{
|
|
|
tAnnexe = realloc(tLog, sizeof(Log)*(nbLogMax + 5));
|
|
|
|
|
|
// Test si le realloc n'a pas fonctionné
|
|
|
if (tAnnexe == NULL)
|
|
|
{
|
|
|
printf("Problème de realloc\n");
|
|
|
exit(1);
|
|
|
}
|
|
|
|
|
|
tLog = tAnnexe;
|
|
|
nbLogMax+= 5;
|
|
|
}
|
|
|
|
|
|
fscanf(fichier, "%s %s %s", tLog[i].utilisateur, tLog[i].mdp, tLog[i].status);
|
|
|
printf("%s\n", tLog[i].status);
|
|
|
i++;
|
|
|
}
|
|
|
|
|
|
*nbLog = i;
|
|
|
return tLog;
|
|
|
}
|
|
|
|
|
|
/*void test(VilleIut * tIut[], int nbVilles)
|
|
|
{
|
|
|
for (int i = 0 ; i <nbVilles ; i++)
|
|
|
{
|
|
|
printf("%s\n", tIut[i]->nom);
|
|
|
}
|
|
|
}*/
|
|
|
|
|
|
/**
|
|
|
* @brief Cette fonction affiche le menu des options disponibles pour un visiteur
|
|
|
* et demande à l'utilisateur de faire son choix en appelant la fonction
|
|
|
* choixMenuVisiteur. Selon le choix de l'utilisateur, la fonction appelle la fonction correspondante
|
|
|
* ou met fin à l'exécution de la fonction.
|
|
|
*/
|
|
|
void menuVisiteur(Log * tLog, int nbLog, VilleIut *tIut[], int nbVilles)
|
|
|
//void menuVisiteur(VilleIut *villeIut, int nbVilles)
|
|
|
{
|
|
|
int choix;
|
|
|
int actif = 1;
|
|
|
|
|
|
clean
|
|
|
|
|
|
while(actif)
|
|
|
{
|
|
|
choix = choixMenuVisiteur();
|
|
|
clean
|
|
|
switch(choix)
|
|
|
{
|
|
|
case 1:
|
|
|
//test(tIut, nbVilles);
|
|
|
afficheVillesIUT(tIut, nbVilles);
|
|
|
//printf("Affiche les Villes contenant des IUT (En attente d'une fonction de chargement fonctionnelle)\n");
|
|
|
break;
|
|
|
case 2:
|
|
|
printf("Affiche le nombre de place dans un departement (En attente de Guillaume)\n");
|
|
|
break;
|
|
|
case 3 :
|
|
|
printf("Affiche les departements d'un IUT donne (En attente de Loris)\n");
|
|
|
break;
|
|
|
case 4 :
|
|
|
printf("Affiche les IUT possedant un departement donne (En attente de Jean)\n");
|
|
|
break;
|
|
|
case 5 :
|
|
|
seConnecter(tLog, nbLog);
|
|
|
clean
|
|
|
break;
|
|
|
case 0 :
|
|
|
actif = 0;
|
|
|
break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Affiche le menu des options disponibles pour un visiteur.
|
|
|
*
|
|
|
* Cette fonction affiche à l'écran un menu proposant plusieurs options
|
|
|
* pour un visiteur du site. Le menu est présenté sous la forme d'une liste
|
|
|
* numérotée, avec un numéro associé à chaque option. Le visiteur peut
|
|
|
* faire son choix en saisissant le numéro correspondant à l'option souhaitée.
|
|
|
*
|
|
|
* Voici les options proposées dans le menu :
|
|
|
*
|
|
|
* - Afficher toutes les villes possédant un IUT
|
|
|
* - Afficher le nombre de places dans un département donné
|
|
|
* - Afficher les départements d'un IUT donné
|
|
|
* - Afficher les IUT possédant un département donné
|
|
|
* - Se connecter
|
|
|
* - Quitter
|
|
|
*
|
|
|
* @return Le choix de l'utilisateur, sous forme d'un entier
|
|
|
*/
|
|
|
int afficherMenuVisiteur(void) {
|
|
|
int choix;
|
|
|
|
|
|
printf("============================================================\n\t\t\tMENU VISITEUR\n============================================================\n\n");
|
|
|
|
|
|
printf("\t1. Afficher toutes les villes possedant un IUT\n");
|
|
|
printf("\t2. Afficher le nombre de places dans un departement donne\n");
|
|
|
printf("\t3. Afficher les departements d'un IUT donne\n");
|
|
|
printf("\t4. Afficher les IUT possedant un departement donne\n");
|
|
|
printf("\t5. Se connecter\n");
|
|
|
printf("\t0. Quitter\n");
|
|
|
printf("\nChoix : ");
|
|
|
|
|
|
scanf("%d%*c", &choix);
|
|
|
return choix;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Demande à l'utilisateur de faire un choix parmi les options du menu visiteur
|
|
|
*
|
|
|
* Cette fonction affiche le menu des options disponibles pour un visiteur
|
|
|
* et demande à l'utilisateur de faire son choix en saisissant un nombre compris
|
|
|
* entre 0 et 5. Si l'utilisateur saisit un nombre incorrect, il sera invité à
|
|
|
* resaisir son choix jusqu'à ce qu'il saisisse un nombre valide.
|
|
|
*
|
|
|
* @return int Le choix de l'utilisateur compris entre 0 et 5
|
|
|
*/
|
|
|
int choixMenuVisiteur(void)
|
|
|
{
|
|
|
int choix;
|
|
|
|
|
|
choix = afficherMenuVisiteur();
|
|
|
|
|
|
while (choix < 0 || choix > 5)
|
|
|
{
|
|
|
clean
|
|
|
printf("\nChoix incorrect.\n\n");
|
|
|
choix = afficherMenuVisiteur();
|
|
|
}
|
|
|
|
|
|
return choix;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Fonction de test pour la connection
|
|
|
*
|
|
|
*/
|
|
|
void seConnecterTest(void)
|
|
|
{
|
|
|
Log * tLog;
|
|
|
|
|
|
char mdp[30], utilisateur[30];
|
|
|
|
|
|
int indice, existe, nbLog, valide;
|
|
|
|
|
|
nbLog = 0;
|
|
|
tLog = chargementLog("../donnees/log.don", &nbLog); //TEMP
|
|
|
|
|
|
banniereConnection(); // Affichage
|
|
|
|
|
|
saisieNomUtilisateur(utilisateur); // Récupération du nom d'utilisateur
|
|
|
|
|
|
existe = existeUtilisateur(utilisateur, &indice, tLog, nbLog);
|
|
|
|
|
|
saisieMdp(mdp); // Récupération du mot de passe
|
|
|
|
|
|
valide = mdpValide(mdp, indice, tLog);
|
|
|
}
|
|
|
|
|
|
void seConnecter(Log * tLog, int nbLog)
|
|
|
{
|
|
|
char mdp[30], utilisateur[30];
|
|
|
int existe, indice, valide;
|
|
|
|
|
|
banniereConnection(); // Affichage
|
|
|
saisieNomUtilisateur(utilisateur); // Récupération du nom d'utilisateur
|
|
|
|
|
|
existe = existeUtilisateur(utilisateur, &indice, tLog, nbLog);
|
|
|
if(!existe)
|
|
|
{
|
|
|
printf("Utilisateur inexistant !\nAppuyez sur [entrée] pour continuer...");
|
|
|
scanf("%*c");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
saisieMdp(mdp);
|
|
|
|
|
|
valide = mdpValide(mdp, indice, tLog);
|
|
|
|
|
|
if(valide)
|
|
|
{
|
|
|
printf("Connection valide en tant que %s\n", tLog[indice].status);
|
|
|
printf("En attente de la fonction chargement\n");
|
|
|
scanf("%*c");
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
printf("Mot de passe invalide\nAppuyez sur [entrée] pour continuer...");
|
|
|
scanf("%*c");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Vérifie si un utilisateur existe dans le tableau de structures de log.
|
|
|
*
|
|
|
* @param utilisateur [CHAINE DE CARACTERES] Le nom de l'utilisateur à rechercher.
|
|
|
* @param indice [POINTEUR] Pointeur vers un entier qui sera modifié pour stocker l'indice de l'utilisateur s'il est trouvé.
|
|
|
* @param tLog [TABLEAU] Tableau de structures de log.
|
|
|
* @param nbLog [Taille Logique] Nombre d'éléments dans le tableau de structures de log.
|
|
|
*
|
|
|
* @return int 1 --> l'utilisateur existe | 0 --> l'utilisateur n'existe pas
|
|
|
*/
|
|
|
int existeUtilisateur(char * utilisateur, int * indice, Log * tLog, int nbLog)
|
|
|
{
|
|
|
for (int i = 0 ; i < nbLog ; i++)
|
|
|
{
|
|
|
if (strcmp(tLog[i].utilisateur,utilisateur) == 0)
|
|
|
{
|
|
|
*indice = i;
|
|
|
return 1;
|
|
|
}
|
|
|
}
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Valide si le mot de passe donné correspond au mot de passe enregistré dans la structure de log.
|
|
|
*
|
|
|
* @param mdp [CHAINE DE CARACTERES] Le mot de passe à valider.
|
|
|
* @param indice L'indice de la structure de log à utiliser pour la vérification.
|
|
|
* @param tLog [TABLEAU] Le tableau de structures de log.
|
|
|
*
|
|
|
* @return int 1 --> le mot de passe correspond | 0 --> le mot de passe ne correspond pas
|
|
|
*/
|
|
|
int mdpValide(char * mdp, int indice, Log * tLog)
|
|
|
{
|
|
|
if (strcmp(tLog[indice].mdp, mdp) == 0) return 1;
|
|
|
else return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Affichage de la bannière de connexion.
|
|
|
*/
|
|
|
void banniereConnection(void)
|
|
|
{
|
|
|
clean
|
|
|
printf("------------------------------------------------------------\n\t\t\tSE CONNECTER\n------------------------------------------------------------\n\n");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Saisie du nom d'utilisateur par l'utilisateur.
|
|
|
*
|
|
|
* Affiche une invite à l'écran et enregistre la saisie de l'utilisateur
|
|
|
* dans la chaîne de caractères passée en paramètre.
|
|
|
*
|
|
|
* @param utilisateur [POINTEUR] Pointeur vers la chaîne de caractères où enregistrer
|
|
|
* la saisie de l'utilisateur.
|
|
|
*/
|
|
|
void saisieNomUtilisateur(char * utilisateur)
|
|
|
{
|
|
|
printf("\tNom d'utilisateur : ");
|
|
|
scanf("%s%*c", utilisateur);
|
|
|
printf("\n");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Saisie du mot de passe par l'utilisateur.
|
|
|
*
|
|
|
* Affiche une invite à l'écran et enregistre la saisie de l'utilisateur
|
|
|
* dans la chaîne de caractères passée en paramètre.
|
|
|
*
|
|
|
* @param mdp [POINTEUR] Pointeur vers la chaîne de caractères où enregistrer
|
|
|
* la saisie de l'utilisateur.
|
|
|
*/
|
|
|
void saisieMdp(char * mdp)
|
|
|
{
|
|
|
printf("\tMot de passe : ");
|
|
|
scanf("%s%*c", mdp);
|
|
|
printf("\n");
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Modifie le nombre de places d'un département dans un IUT.
|
|
|
*
|
|
|
* @param villeIut tableau de pointeurs sur les structures VilleIut
|
|
|
* @param nbVilles nombre de villes dans le tableau villeIut
|
|
|
* @param ville nom de la ville où se trouve l'IUT
|
|
|
* @param nomDept nom du département à modifier
|
|
|
* @param nbP nouveau nombre de places
|
|
|
*
|
|
|
* @return 1 si le département a été trouvé et modifié, 0 sinon
|
|
|
*/
|
|
|
int modifiePlacesDept(VilleIut **villeIut, int nbVilles, char *ville, char *nomDept, int nbP)
|
|
|
{
|
|
|
// Recherche de la ville et du département
|
|
|
int i;
|
|
|
for (i = 0; i < nbVilles; i++)
|
|
|
{
|
|
|
if (strcmp(villeIut[i] -> nom, ville) == 0)
|
|
|
{
|
|
|
// Ville trouvée, recherche du département
|
|
|
MaillonDept *dept = villeIut[i] -> lDept;
|
|
|
|
|
|
while ( dept != NULL && strcmp( dept -> nomDept, nomDept) != 0)
|
|
|
{
|
|
|
dept = dept ->suiv;
|
|
|
}
|
|
|
if (dept != NULL)
|
|
|
{
|
|
|
// Département trouvé, modification du nombre de places
|
|
|
dept->nbP = nbP;
|
|
|
return 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// Département non trouvé
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Ville non trouvée
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Modifie le nom du responsable d'un département dans un IUT
|
|
|
*
|
|
|
* @param tVilleIut tableau de pointeurs sur les structures VilleIut
|
|
|
* @param nbVilles nombre de villes dans le tableau villeIut
|
|
|
* @param ville nom de la ville où se trouve l'IUT
|
|
|
* @param nomDept Nom du département où l'on modifie le nom du responsable
|
|
|
* @param nvNomResp nouveau nom de responsable
|
|
|
*
|
|
|
* @return 1 si le nom du responsable a été trouvé et modifié, 0 sinon
|
|
|
*/
|
|
|
int modifieChefDept(VilleIut *tVilleIut[], int nbVilles, char ville[], char nomDept[], char nvNomResp[])
|
|
|
{
|
|
|
// Recherche de la ville et du département
|
|
|
int i;
|
|
|
for (i = 0; i < nbVilles; i++)
|
|
|
{
|
|
|
if (strcmp(tVilleIut[i] -> nom, ville) == 0)
|
|
|
{
|
|
|
// Ville trouvée, recherche du département
|
|
|
MaillonDept *dept = tVilleIut[i] -> lDept;
|
|
|
|
|
|
while ( dept != NULL && strcmp( dept -> nomDept, nomDept) != 0)
|
|
|
{
|
|
|
dept = dept ->suiv;
|
|
|
}
|
|
|
if (dept != NULL)
|
|
|
{
|
|
|
// Département trouvé, modification du nom du responsable du département
|
|
|
strcpy(dept->resp, nvNomResp);
|
|
|
return 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
// Département non trouvé
|
|
|
return 0;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// Ville non trouvée
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Affiche les IUT possédant un département spécifique.
|
|
|
*
|
|
|
* @param villeIut tableau de pointeurs sur les structures VilleIut
|
|
|
* @param nbVilles nombre de villes dans le tableau villeIut
|
|
|
* @param nomDept nom du département à rechercher
|
|
|
*/
|
|
|
void afficheIUTDept(VilleIut **villeIut, int nbVilles, char *nomDept)
|
|
|
{
|
|
|
int i;
|
|
|
for (i = 0; i < nbVilles; i++)
|
|
|
{
|
|
|
// Parcours de la liste chaînée de départements de la ville
|
|
|
MaillonDept *dept = villeIut[i] -> lDept;
|
|
|
while (dept != NULL)
|
|
|
{
|
|
|
if (strcmp(dept->nomDept, nomDept) == 0)
|
|
|
{
|
|
|
// Département trouvé, affichage de la ville
|
|
|
printf("IUT de %s\n", villeIut[i] -> nom);
|
|
|
break;
|
|
|
}
|
|
|
dept = dept->suiv;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Affiche les villes qui ont des IUT.
|
|
|
* @param villeIut tableau de pointeurs sur les structures VilleIut
|
|
|
* @param nbVilles nombre de villes dans le tableau villeIut
|
|
|
*/
|
|
|
void afficheVillesIUT(VilleIut **villeIut, int nbVilles)
|
|
|
{
|
|
|
|
|
|
// ajout de test temporaire
|
|
|
// MaillonDept * temp = ( MaillonDept *) malloc ( sizeof( MaillonDept));
|
|
|
// if ( temp == NULL)
|
|
|
// {
|
|
|
// printf(" Erreur allocation memoire ( Jean ) \n");
|
|
|
// return;
|
|
|
// }
|
|
|
|
|
|
// villeIut[0] -> lDept = temp;
|
|
|
|
|
|
// strcpy( villeIut[0] -> lDept -> nomDept, " kawasaky ");
|
|
|
|
|
|
for (int i = 0; i < nbVilles; i++)
|
|
|
{
|
|
|
// Affichage du nom de la ville
|
|
|
printf("%s\n", villeIut[i]-> nom);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Affiche les IUT et le nombre de places associé pour un département donné
|
|
|
*
|
|
|
* @param tVilleIut tableau de pointeurs sur les structures VilleIut
|
|
|
* @param nbVilles nombre de villes dans le tableau villeIut
|
|
|
* @param nomDept nom du département à rechercher
|
|
|
*/
|
|
|
void afficheNbPlacesDep(VilleIut *tVilleIut[], int nbVilles, char nomDept[])
|
|
|
{
|
|
|
int i;
|
|
|
for (i = 0; i < nbVilles; i++)
|
|
|
{
|
|
|
// Parcours de la liste chaînée de départements de la ville
|
|
|
MaillonDept *dept = tVilleIut[i] -> lDept;
|
|
|
while (dept != NULL)
|
|
|
{
|
|
|
if (strcmp(dept->nomDept, nomDept) == 0)
|
|
|
{
|
|
|
// Département trouvé, affichage de la ville et de son nombre de places
|
|
|
printf("IUT de %s avec %d places.\n", tVilleIut[i] -> nom, tVilleIut[i] -> lDept -> nbP);
|
|
|
break;
|
|
|
}
|
|
|
dept = dept->suiv;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* Affiche et gère le menu administrateur.
|
|
|
*
|
|
|
* @param villeIut tableau de pointeurs sur les structures VilleIut
|
|
|
* @param nbVilles nombre de villes dans le tableau villeIut
|
|
|
*/
|
|
|
void menuAdmin(VilleIut **villeIut, int nbVilles)
|
|
|
{
|
|
|
int choix;
|
|
|
do
|
|
|
{
|
|
|
// Affichage du menu
|
|
|
printf("\nMenu administrateur:\n");
|
|
|
printf("1. Modifier le nombre de places d'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 la phase de candidature\n");
|
|
|
printf("5. Arrêter la phase de candidature\n");
|
|
|
printf("6. Modifier le nom du responsable d'un département\n");
|
|
|
printf("7. Quitter\n");
|
|
|
printf("\nVotre choix: ");
|
|
|
|
|
|
// Saisie du choix de l'utilisateur
|
|
|
scanf("%d%*c", &choix);
|
|
|
|
|
|
// Traitement du choix de l'utilisateur
|
|
|
switch (choix)
|
|
|
{
|
|
|
case 1:
|
|
|
// Modification du nombre de places d'un département
|
|
|
//modifiePlacesDept(villeIut, nbVilles);
|
|
|
break;
|
|
|
case 2:
|
|
|
// Création d'un département dans un IUT
|
|
|
//creeDeptIUT(villeIut, nbVilles);
|
|
|
break;
|
|
|
case 3:
|
|
|
// Suppression d'un département d'un IUT
|
|
|
//supprimeDeptIUT(villeIut, nbVilles);
|
|
|
break;
|
|
|
case 4:
|
|
|
// Lancement de la phase de candidature
|
|
|
//lanceCandidature();
|
|
|
break;
|
|
|
case 5:
|
|
|
// Arrêt de la phase de candidature
|
|
|
//arreteCandidature();
|
|
|
break;
|
|
|
case 6:
|
|
|
// Modification du nom du responsable d'un département
|
|
|
//modifieRespDept(villeIut, nbVilles);
|
|
|
break;
|
|
|
case 7:
|
|
|
// Quitter
|
|
|
//printf("Au revoir!\n");
|
|
|
break;
|
|
|
default:
|
|
|
// Choix non valide
|
|
|
//printf("Choix non valide.\n");
|
|
|
break;
|
|
|
}
|
|
|
} while (choix != 7);
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
================================================
|
|
|
Partie 2
|
|
|
================================================
|
|
|
*/
|
|
|
|
|
|
/**
|
|
|
* @brief Affiche les informations d'un candidat
|
|
|
* @param candidat Le candidat à afficher
|
|
|
*/
|
|
|
void afficherCandidat(Candidat candidat)
|
|
|
{
|
|
|
printf("Numéro du candidat : %d\n", candidat.numero);
|
|
|
printf("Nom : %s\n", candidat.nom);
|
|
|
printf("Prénom : %s\n", candidat.prenom);
|
|
|
printf("Notes : %.2f %.2f %.2f %.2f\n", candidat.notes[0], candidat.notes[1], candidat.notes[2], candidat.notes[3]);
|
|
|
printf("Nombre de choix : %d\n", candidat.nbChoix);
|
|
|
for (int i = 0; i < candidat.nbChoix; i++)
|
|
|
{
|
|
|
printf("Choix %d :\n", i + 1);
|
|
|
printf(" Ville : %s\n", candidat.choix[i].ville);
|
|
|
printf(" Département : %s\n", candidat.choix[i].departement);
|
|
|
printf(" Décision du département : %d\n", candidat.choix[i].decisionDepartement);
|
|
|
printf(" Validation : %d\n", candidat.choix[i].validationCandidat);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Affiche la liste des candidats
|
|
|
*
|
|
|
* @param candidats Le tableau de candidats à afficher
|
|
|
* @param nbCandidats Le nombre de candidats dans le tableau
|
|
|
*/
|
|
|
void afficherCandidats(Candidat *candidats, int nbCandidats)
|
|
|
{
|
|
|
for (int i = 0; i < nbCandidats; i++)
|
|
|
{
|
|
|
printf("\nCandidat %d :\n", i + 1);
|
|
|
afficherCandidat(candidats[i]);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
// ===============================================================================
|
|
|
// PARTIE 3
|
|
|
//===============================================================================
|
|
|
|
|
|
/**
|
|
|
* \brief Permet de convertir la liste de departement des VilleIut de la partie 1
|
|
|
dans la nouvelle version pour correspondre à la partie 3. Et la fonction
|
|
|
définie au passage le nombre maximal d'admis pour le département et sa
|
|
|
moyenne minimale à obtenir pour y accéder.
|
|
|
* \param ldept La liste de départements de la partie 1 pour une villeIut
|
|
|
* \return La nouvelle liste de départements adaptée à la partie 3.
|
|
|
*
|
|
|
*/
|
|
|
ListeDeptV2 configurationDeptV2( ListeDept ldept )
|
|
|
{
|
|
|
ListeDeptV2 lDeptV2 = NULL;
|
|
|
|
|
|
if ( ldept == NULL ) return lDeptV2;
|
|
|
|
|
|
while ( ldept != NULL )
|
|
|
{
|
|
|
MaillonDept * aux = ( MaillonDept * ) malloc ( sizeof( MaillonDept ));
|
|
|
if ( aux == NULL )
|
|
|
{
|
|
|
printf(" \n ---> Erreur d'allocation memoire... \n");
|
|
|
exit(1);
|
|
|
}
|
|
|
|
|
|
MaillonDeptV2 * mV2 = ( MaillonDeptV2 * ) malloc ( sizeof( MaillonDeptV2 ));
|
|
|
if ( mV2 == NULL)
|
|
|
{
|
|
|
printf("\n --> Erreur d'allocation memoire...\n");
|
|
|
exit(1);
|
|
|
}
|
|
|
|
|
|
printf(" \n Quelle est la moyenne minimale a avoir pour le departement %10s ? : ", ldept -> nomDept);
|
|
|
scanf("%d", mV2 -> moyMin);
|
|
|
|
|
|
printf(" \n Quel est le nombre maximal d'admis pour le departement %10s ", ldept -> nomDept);
|
|
|
scanf("%d", mV2 -> admisMax);
|
|
|
|
|
|
strcpy( ldept -> nomDept, mV2 -> nomDept );
|
|
|
strcpy( ldept -> resp, mV2 -> resp );
|
|
|
mV2 -> nbP = ldept -> nbP;
|
|
|
|
|
|
lDeptV2 -> lAdmis = NULL;
|
|
|
lDeptV2 -> lAttente = NULL;
|
|
|
|
|
|
mV2 -> suiv = lDeptV2;
|
|
|
lDeptV2 = mV2;
|
|
|
|
|
|
aux = ldept;
|
|
|
ldept = ldept -> suiv;
|
|
|
free(aux);
|
|
|
}
|
|
|
|
|
|
return lDeptV2;
|
|
|
}
|
|
|
|
|
|
// ==============================================================================
|
|
|
// Partie 4
|
|
|
// ==============================================================================
|
|
|
|
|
|
/**
|
|
|
* @brief Affiche une liste de candidats après l'avoir triée par ordre alphabétique
|
|
|
*
|
|
|
* @param lcand liste de candidats à trier et afficher
|
|
|
* @param type type de liste à afficher ( en attente ou admis )
|
|
|
* @param nomDept nom du departement dont est issu la liste
|
|
|
*/
|
|
|
void affichageListesDept( ListeCandidats lcand, char * type, char * nomDept )
|
|
|
{
|
|
|
lcand = trierListeCandidats( lcand );
|
|
|
|
|
|
printf( " Liste des candidats %s du departement %10s \n -------------------------------------------------------\n\n", type, nomDept);
|
|
|
|
|
|
while ( lcand != NULL)
|
|
|
{
|
|
|
printf(" | Nom : %10s | Prenom : %10s | Numero : %8s |\n",
|
|
|
lcand -> candidat.nom, lcand -> candidat.prenom, lcand -> candidat.numero);
|
|
|
|
|
|
lcand = lcand -> suiv;
|
|
|
}
|
|
|
}
|
|
|
/**
|
|
|
* @brief Trie par ordre alphabétique les candidats d'une liste
|
|
|
*
|
|
|
* @param l liste de candidats à trier.
|
|
|
*
|
|
|
* @return La liste triée
|
|
|
*/
|
|
|
ListeCandidats trierListeCandidats( ListeCandidats l )
|
|
|
{
|
|
|
ListeCandidats nvL;
|
|
|
|
|
|
while ( l != NULL )
|
|
|
{
|
|
|
nvL = insertionCroissanteCand( nvL, l );
|
|
|
l = l -> suiv;
|
|
|
}
|
|
|
|
|
|
return nvL;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Permet d'insérer un nouveau Maillon de candidats dans la liste par ordre alphabétique
|
|
|
* @param l la liste dont est issu le maillon à insérer
|
|
|
* @param nvL la nouvelle liste où est inséré le maillon
|
|
|
*
|
|
|
* @return La nouvelle liste avec le maillon au bon endroit
|
|
|
*/
|
|
|
ListeCandidats insertionCroissanteCand( ListeCandidats nvL, ListeCandidats l )
|
|
|
{
|
|
|
if ( l == NULL)
|
|
|
{
|
|
|
nvL = insertionTeteCand( nvL, l );
|
|
|
return nvL;
|
|
|
}
|
|
|
|
|
|
if ( strcmp( l -> candidat.nom, nvL -> candidat.nom ) < 0 )
|
|
|
{
|
|
|
nvL = insertionTeteCand( nvL, l );
|
|
|
return nvL;
|
|
|
}
|
|
|
|
|
|
if ( strcmp( l -> candidat.nom, nvL -> candidat.nom ) == 0 )
|
|
|
{
|
|
|
if ( strcmp( l -> candidat.prenom, nvL -> candidat.prenom ) < 0 )
|
|
|
{
|
|
|
nvL = insertionTeteCand( nvL, l );
|
|
|
return nvL;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
nvL -> suiv = insertionCroissanteCand( nvL -> suiv, l );
|
|
|
return nvL;
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* @brief Insère en tête de la nouvelle liste un nouveau maillon
|
|
|
* @param l liste d'où est issu le nouveau maillon à intégrer
|
|
|
* @param nvL Liste où est insérer le nouveau Maillon
|
|
|
* @return La nouvelle liste avec le maillon au bon endroit
|
|
|
*/
|
|
|
ListeCandidats insertionTeteCand( ListeCandidats nvL, ListeCandidats l )
|
|
|
{
|
|
|
MaillonCandidat * m = ( MaillonCandidat * ) malloc ( sizeof( MaillonCandidat ));
|
|
|
if ( m == NULL )
|
|
|
{
|
|
|
printf("\n -> Erreur allocation memoire...\n");
|
|
|
exit(1);
|
|
|
}
|
|
|
|
|
|
m -> candidat = l -> candidat;
|
|
|
m -> suiv = nvL;
|
|
|
nvL = m;
|
|
|
free( l );
|
|
|
|
|
|
return nvL;
|
|
|
} |