ajout de types opaques et correction des problèmes de compilation dues à la mise en place de l'encapsulation
continuous-integration/drone/push Build is failing Details

redesign/encapsulation
Maxime BATISTA 2 years ago
parent dba9b7513a
commit 9a8f97899b

@ -21,11 +21,7 @@ if make; then
if [ ! -d "stockage" ]; then
mkdir stockage
fi
for it in $(ls jdd); do
if [ ! -e stockage/$it ]; then
cp "jdd/$it" "stockage/$iut"
fi
done
cp -rn jdd/* stockage/
#on lance
./app $APPARGS

@ -1,12 +1,22 @@
#ifndef app_bundle_h
#define app_bundle_h
#ifndef app_env_h
#define app_env_h
#include "src/logique/candidature/candidature.h"
#include "src/logique/candidature/liste_candidature.h"
#include "src/logique/compte/compte.h"
#include "src/logique/formation/ville_iut.h"
#define NB_MAX_FORMATIONS 100
#define EMPLACEMENT_FICHIER_COMPTES "stockage/comptes.bin"
#define EMPLACEMENT_FICHIER_CANDIDATURES "stockage/candidatures.txt"
#define EMPLACEMENT_FICHIER_FORMATIONS "stockage/formations.txt"
#define EMPLACEMENT_FICHIER_PHASE "stockage/phase.txt"
#define EMPLACEMENT_DOSSIER_RESULTATS "stockage/resultats"
/**
* Enum représentant la phase.txt actuelle.
* Chaque phase.txt permet d'influencer les actions faisables sur une IUT.

@ -1,9 +1,5 @@
#include "src/application/application.h"
#define EMPLACEMENT_FICHIER_COMPTES "stockage/comptes.bin"
#define EMPLACEMENT_FICHIER_CANDIDATURES "stockage/candidatures.txt"
#define EMPLACEMENT_FICHIER_FORMATIONS "stockage/formations.txt"
#define EMPLACEMENT_FICHIER_PHASE "stockage/phase.txt"

@ -2,9 +2,10 @@
#include "src/application/menu/connexion.h"
#include "src/application/menu/candidat/consultation_voeux.h"
#include "src/application/menu/menu_principal.h"
#include "src/application/app_bundle.h"
#include "src/application/app_env.h"
#include "src/application/app_utils.h"
#include "src/logique/formation/tab_iut.h"
void globaleApp(void);

@ -2,15 +2,15 @@
void afficherVoeuxsCandidature(VilleIUT* iut, Candidature* candidature) {
ListeVoeux voeuxIUT = filtrerLVPourIut(&candidature->voeuxs, iut);
ListeVoeux voeuxIUT = filtrerLVPourIut(getVoeuxs(candidature), iut);
if (videLV(&voeuxIUT)) return;
while (!videLV(&voeuxIUT)) {
Voeux* voeux = teteLV(&voeuxIUT);
printf("%s (Jury: %s, Candidat: %s), ",
voeux->departement,
nomDecisionVoeux(voeux->decisionJury),
nomDecisionVoeux(voeux->decisionCandidat)
getNomDept(getDeptVoeux(voeux)),
nomDecisionVoeux(getDecisionJury(voeux)),
nomDecisionVoeux(getDecisionCandidat(voeux))
);
voeuxIUT = *queueLV(&voeuxIUT);
}
@ -19,11 +19,11 @@ void afficherVoeuxsCandidature(VilleIUT* iut, Candidature* candidature) {
}
void afficherListeCandidats(VilleIUT* iut, ListeCandidature* candidatures) {
printf("Liste des candidats ayant fait un voeux pour au moins un département de l'iut %s\n", iut->ville);
printf("Liste des candidats ayant fait un voeux pour au moins un département de l'iut %s\n", getNomVille(iut));
while (!videLCa(candidatures)) {
Candidature* candidature = teteLCa(candidatures);
Compte* candidat = candidature->candidat;
printf("%s %s (id: %d) : ", candidat->nom, candidat->prenom, candidat->identifiant);
Compte* candidat = getCompteCandidat(candidature);
printf("%s %s (id: %d) : ", getNom(candidat), getPrenom(candidat), getIDCompte(candidat));
afficherVoeuxsCandidature(iut, candidature);
candidatures = queueLCa(candidatures);
}
@ -31,15 +31,15 @@ void afficherListeCandidats(VilleIUT* iut, ListeCandidature* candidatures) {
void afficherListeCandidatsParDeps(VilleIUT* iut, ListeCandidature* candidatures) {
printf("Liste des candidats par départements triée par ordre alphabétique\n");
ListeDept ldept = iut->ldept;
ListeDept ldept = *getDepartements(iut);
while (!videLD(ldept)) {
Dep* dept = teteLD(ldept);
printf("%s:\n", dept->departement);
printf("%s:\n", getNomDept(dept));
ListeCandidature candidaturesPourDept = filtrerLCPourDept(candidatures, iut, dept);
ListeCandidature* aux = &candidaturesPourDept;
while (!videLCa(aux)) {
Compte* candidat = teteLCa(aux)->candidat;
printf("\t- %s %s (id: %d)\n", candidat->nom, candidat->prenom, candidat->identifiant);
Compte* candidat = getCompteCandidat(teteLCa(aux));
printf("\t- %s %s (id: %d)\n", getNom(candidat), getPrenom(candidat), getIDCompte(candidat));
aux = queueLCa(aux);
}
freeListeCandidature(&candidaturesPourDept);
@ -54,29 +54,31 @@ void afficherInformationsCandidat(VilleIUT* iut, ListeCandidature* candidatures)
Candidature* candidature = NULL;
while (!videLCa(candidatures)) {
Candidature* c = teteLCa(candidatures);
if (c->candidat->identifiant == idCandidat) {
if (getIDCompte(getCompteCandidat(c)) == idCandidat) {
candidature = c;
break;
}
candidatures = queueLCa(candidatures);
}
char* nomVille = getNomVille(iut);
if(candidature == NULL) {
printf("Le candidat n° %d n'existe pas ou n'est pas un candidat de l'iut %s\n", idCandidat, iut->ville);
printf("Le candidat n° %d n'existe pas ou n'est pas un candidat de l'iut %s\n", idCandidat, nomVille);
return;
}
Compte* candidat = candidature->candidat;
Compte* candidat = getCompteCandidat(candidature);
printf("Candidat n° %d :\n", idCandidat);
printf("- Nom : %s\n", candidat->nom);
printf("- Prenom : %s\n", candidat->prenom);
printf("- Voeuxs pour l'iut %s :\n", iut->ville);
ListeVoeux voeuxsIUT = filtrerLVPourIut(&candidature->voeuxs, iut);
printf("- Nom : %s\n", getNom(candidat));
printf("- Prenom : %s\n", getPrenom(candidat));
printf("- Voeuxs pour l'iut %s :\n", nomVille);
ListeVoeux voeuxsIUT = filtrerLVPourIut(getVoeuxs(candidature), iut);
int nbVoeuxs = longueurLV(&voeuxsIUT);
freeListeVoeux(&voeuxsIUT);
if (nbVoeuxs == 0) {
printf("Il n'y a pas de voeux pour l'iut %s\n", iut->ville);
printf("Il n'y a pas de voeux pour l'iut %s\n", nomVille);
return;
}
printf("%d voeux pour l'iut %s :\n\t", nbVoeuxs, iut->ville);
printf("%d voeux pour l'iut %s :\n\t", nbVoeuxs, nomVille);
afficherVoeuxsCandidature(iut, candidature);
}

@ -6,14 +6,14 @@ void modifierNbPlacesDept(VilleIUT* iut) {
char nomDept[TAILLE_NOM_DEPARTEMENT];
printf("Departement : ");
scanf("%s", nomDept);
Dep* dep = trouverDepartement(iut->ldept, nomDept);
Dep* dep = trouverDepartement(*getDepartements(iut), nomDept);
if (dep == NULL) {
printf("Le departement n'existe pas !\n");
return;
}
printf("Nombre de places : ");
scanf("%d%*c", &nbPlaces);
dep->nbP = nbPlaces;
setNbPlacesDispo(dep, nbPlaces);
}
void creerDept(VilleIUT* iut) {

@ -4,35 +4,35 @@
void afficherVoeux(Voeux* voeux, int id) {
if (id > 0)
printf("Voeux n° %d)\n", id);
printf("\tVille : %s\n", voeux->nomVille);
printf("\tDepartement : %s\n", voeux->departement);
printf("\tDécision du jury : %s\n", nomDecisionVoeux(voeux->decisionJury));
printf("\tVotre choix : %s\n", nomDecisionVoeux(voeux->decisionCandidat));
printf("\tVille : %s\n", getNomVille(getIUTVoeux(voeux)));
printf("\tDepartement : %s\n", getNomDept(getDeptVoeux(voeux)));
printf("\tDécision du jury : %s\n", nomDecisionVoeux(getDecisionJury(voeux)));
printf("\tVotre choix : %s\n", nomDecisionVoeux(getDecisionCandidat(voeux)));
}
void afficherVoeuxs(Candidature* candid) {
if (candid->voeuxAccepte != NULL) {
if (getVoeuxAccepte(candid) != NULL) {
printf("----------Voeux accepté----------\n");
afficherVoeux(candid->voeuxAccepte, 0);
afficherVoeux(getVoeuxAccepte(candid), 0);
}
printf("----------Voeux en attente de décision----------\n");
MaillonVoeux* mv = candid->voeuxs;
if (videLV(&mv)) {
ListeVoeux* mv = getVoeuxs(candid);
if (videLV(mv)) {
printf("La liste est vide.\n");
return;
}
int idxVoeux = 1;
while (!videLV(&mv)) {
afficherVoeux(mv->voeux, idxVoeux++);
mv = *queueLV(&mv);
while (!videLV(mv)) {
afficherVoeux(teteLV(mv), idxVoeux++);
mv = queueLV(mv);
}
}
Voeux* choisirVoeux(Candidature* candidature) {
int selection = -1;
ListeVoeux* lv = &candidature->voeuxs;
ListeVoeux* lv = getVoeuxs(candidature);
int nbVoeux = longueurLV(lv);
if (nbVoeux == 0)
return NULL;
@ -57,22 +57,23 @@ void suppressionVoeux(Candidature* candidature) {
Voeux* voeux = choisirVoeux(candidature);
if (voeux == NULL)
return;
supprimerVoeux(&candidature->voeuxs, voeux);
printf("Le voeux %s/%s a bien été supprimé\n", voeux->nomVille, voeux->departement);
supprimerVoeux(getVoeuxs(candidature), voeux);
printf("Le voeux %s/%s a bien été supprimé\n", getNomVille(getIUTVoeux(voeux)), getNomDept(getDeptVoeux(voeux)));
}
void ajoutVoeux(Candidature* candidature, VilleIUT* tiut[], int nb) {
VilleIUT* ville;
Dep* dept;
ListeVoeux* voeuxs = getVoeuxs(candidature);
if (selectionnerFormation(tiut, nb, &ville, &dept)) {
Voeux* voeux = nouvVoeux(ville->ville, dept->departement, NON_TRAITE, NON_TRAITE);
if (contientVoeux(&candidature->voeuxs, voeux)) {
Voeux* voeux = nouvVoeux(ville, dept);
if (contientVoeux(voeuxs, voeux)) {
freeVoeux(voeux);
if (choix("Le voeux existe déja, voulez-vous recommencer ?"))
ajoutVoeux(candidature, tiut, nb);
return;
}
ajouterVoeux(&candidature->voeuxs, voeux);
ajouterVoeux(voeuxs, voeux);
printf("Le voeux a été ajouté avec succés !\n");
}
}
@ -98,17 +99,18 @@ void modificationListeVoeux(Candidature* candidature, VilleIUT* tiut[], int nb)
}
void accepterVoeux(Candidature* candidature, Voeux* voeux) {
char* nomVille = voeux->nomVille;
char* nomDept = voeux->departement;
char* nomVille = getNomVille(getIUTVoeux(voeux));
char* nomDept = getNomDept(getDeptVoeux(voeux));
printf("Vous êtes sur le point d'accepter le voeux %s/%s\n", nomVille, nomDept);
printf("Une fois le voeux accepté, vous ne pourrez plus le modifier.\n");
Voeux* accepte = candidature->voeuxAccepte;
Voeux* accepte = getVoeuxAccepte(candidature) ;
if (accepte != NULL) {
char* accepteNomVille = accepte->nomVille;
char* accepteNomDept = accepte->departement;
char* accepteNomVille = getNomVille(getIUTVoeux(accepte));
char* accepteNomDept = getNomDept(getDeptVoeux(accepte));
printf("Vous avez déjà un voeux accepté : %s/%s\n", accepteNomVille, accepteNomDept);
printf("Si vous acceptez %s/%s, vous refuserez %s/%s automatiquement.\n", accepteNomVille, accepteNomDept, nomVille, nomDept);
printf("Si vous acceptez %s/%s, vous refuserez %s/%s automatiquement.\n", accepteNomVille, accepteNomDept,
nomVille, nomDept);
}
if (!choix("Êtes vous sur ?"))
@ -117,21 +119,19 @@ void accepterVoeux(Candidature* candidature, Voeux* voeux) {
if (accepte != NULL)
free(accepte); //on free l'ancien voeux accepté puisque refusé/supprimé
candidature->voeuxAccepte = voeux;
voeux->decisionCandidat = ACCEPTE;
supprimerVoeux(&candidature->voeuxs, voeux); //on supprime le voeux accepté de la liste des voeuxs en attente de décision.
accepterVoeux(candidature, voeux);
printf("Vous avez bien accepté le voeux %s/%s.\n", nomVille, nomDept);
}
void refuserVoeux(Candidature* candidature, Voeux* voeux) {
char* nomVille = voeux->nomVille;
char* nomDept = voeux->departement;
char* nomVille = getNomVille(getIUTVoeux(voeux));
char* nomDept = getNomDept(getDeptVoeux(voeux));
printf("Vous etes sur le point de refuser le voeux %s/%s.\n", nomVille, nomDept);
printf("Une fois le voeux refusé, il est supprimé définitivement.\n");
if (!choix("Etes vous sur ?"))
return;
supprimerVoeux(&candidature->voeuxs, voeux); //on supprime le voeux de la liste des voeuxs en attente de décision.
supprimerVoeux(getVoeuxs(candidature), voeux); //on supprime le voeux de la liste des voeuxs en attente de décision.
free(voeux); //on free le voeux puisqu'il est refusé donc supprimé.
printf("Vous avez bien supprimé le voeux %s/%s.\n", nomVille, nomDept);
}
@ -158,14 +158,14 @@ void decisionCandidatVoeux(Candidature* candidature, Voeux* voeux) {
}
void decisionCandidat(Candidature* candidature) {
if (videLV(&candidature->voeuxs))
if (videLV(getVoeuxs(candidature)))
return;
printf("Choisissez un voeux et donnez votre décision.\n");
printf("Vous ne pouvez pas accepter plusieurs voeuxs\n");
Voeux* voeux = choisirVoeux(candidature);
if (voeux == NULL)
return;
int decisionJury = voeux->decisionJury;
int decisionJury = getDecisionJury(voeux);
printf("Choix du jury : %s\n", nomDecisionVoeux(decisionJury));
if (decisionJury == REFUSE) {
printf("Le jury a refusé cette candidature, vous ne pouvez pas prendre de décision.\n");

@ -1,7 +1,7 @@
#include <stdlib.h>
#include "src/logique/candidature/candidature.h"
#include "src/application/menu/candidat/formations.h"
#include "src/application/app_bundle.h"
#include "src/application/app_env.h"
void consultationVoeuxs(Candidature* candidature, VilleIUT* tiut[], int nb, Phase phase);

@ -5,17 +5,17 @@ void afficherToutDept(ListeDept ldept, bool afficherResp)
{
while (!videLD(ldept)) {
Dep* dept = teteLD(ldept);
printf("\t- %s, %d places", dept->departement, dept->nbP);
printf("\t- %s, %d places", getNomDept(dept), getNbPlacesDispo(dept));
if (afficherResp)
printf(", chef : %s", dept->responsable);
printf(", chef : %s", getNomResponsable(dept));
printf("\n");
ldept = queueLD(ldept);
}
}
void afficherVilleIUT(VilleIUT* v, bool afficherChef) {
printf("%s : \n", v->ville);
afficherToutDept(v->ldept, false);
printf("%s : \n", getNomVille(v));
afficherToutDept(*getDepartements(v), false);
}
@ -41,13 +41,14 @@ VilleIUT* demmanderVille(VilleIUT* tiut[], int nb) {
}
Dep* demmanderDepartement(VilleIUT* ville) {
afficherToutDept(ville->ldept, false);
ListeDept ldept = *getDepartements(ville);
afficherToutDept(ldept, false);
char nom[32], choix = 'O';
Dep* dept = NULL;
while (choix == 'O') {
printf("Nom du département : ");
scanf("%s%*c", nom);
dept = trouverDepartement(ville->ldept, nom);
dept = trouverDepartement(ldept, nom);
if (dept != NULL)
break;
printf("Le département ne figure pas dans la liste des départements proposés par l'iut.\n");
@ -67,44 +68,45 @@ bool selectionnerFormation(VilleIUT* tiut[], int nb, VilleIUT** ville, Dep** dep
void afficherTout(VilleIUT *tab[], int nb)
{
for(int i=0; i<nb; i++)
/*for(int i=0; i<nb; i++)
{
if(tab[i]->ldept==NULL)
if(videLD(*getDepartements(tab[i])))
printf("%s : Pas de departement\n", tab[i]->ville);
else
printf("%s : %s %d places (chef %s)\n", tab[i]->ville, tab[i]->ldept->dept->departement, tab[i]->ldept->dept->nbP, tab[i]->ldept->dept->responsable);
}
}*/
}
void afficherVilleAvecIUT(VilleIUT *tab[], int nb)
{
for(int i=0; i<nb; i++)
/*for(int i=0; i<nb; i++)
if(tab[i]->ldept!=NULL)
printf("%s", tab[i]->ville);
printf("%s", tab[i]->ville);*/
}
void afficherVille(VilleIUT *tab[], int nb)
{
for(int i=0; i<nb; i++)
printf("%s", tab[i]->ville);
//for(int i=0; i<nb; i++)
// printf("%s", tab[i]->ville);
}
void afficherNbPlaceTotal(ListeDept ldept)
{
int i=0;
/*nt i=0;
while(!videLD(ldept))
{
i=i+ldept->dept->nbP;
ldept=ldept->suiv;
}
printf("Total de places dans tout les IUT : %d\n", i);
*/
}
void afficherNbPlaceTypeDept(ListeDept ldept, char *departement)
{
int i=0;
/*int i=0;
while(!videLD(ldept))
{
if(strcmp(ldept->dept->departement, departement)==0)
@ -113,41 +115,41 @@ void afficherNbPlaceTypeDept(ListeDept ldept, char *departement)
ldept=ldept->suiv;
}
printf("Nombre de places dans les départements %s : %d\n", departement, ldept->dept->nbP);
}
}*/
}
void afficherNbPlaceDept(VilleIUT *tab[], int nb, char *ville, char *departement)
{
for(int i=0; i<nb; i++)
/*for(int i=0; i<nb; i++)
{
if(strcmp(tab[i]->ville, ville)==0)
{
if(strcmp(tab[i]->ldept->dept->departement, departement)==0)
printf("Nombre de places dans le département %s : %d\n", departement, tab[i]->ldept->dept->nbP);
}
}
}*/
}
void afficherIutAvecDept(VilleIUT *tab[], int nb, char *departement)
{
for(int i=0; i<nb; i++)
/*for(int i=0; i<nb; i++)
{
if(tab[i]->ldept!=NULL)
{
if(strcmp(tab[i]->ldept->dept->departement, departement)==0)
printf("%s\n", tab[i]->ville);
}
}
}*/
}
void afficherRespDept(VilleIUT *tab[], char *ville, char *departement, int nb)
{
for(int i=0; i<nb; i++)
/*for(int i=0; i<nb; i++)
{
if(strcmp(tab[i]->ville, ville)==0)
{
if(strcmp(tab[i]->ldept->dept->departement, departement)==0)
printf("Responsable du département %s : %s\n", departement, tab[i]->ldept->dept->responsable);
}
}
}*/
}

@ -1,8 +1,12 @@
#ifndef formations_h
#define formations_h
#include "src/logique/formation/ville_iut.h"
#include "src/logique/formation/tab_iut.h"
#include "src/logique/formation/liste_dept.h"
#include "src/application/app_utils.h"
#ifndef formations_h
#include <stdbool.h>
#define formations_h
void afficherFormations(VilleIUT* tiut[], int nb);

@ -23,13 +23,13 @@ TypeCompte demmanderTypeCompte(void) {
}
}
Personnel* demmanderInfosPersonnel(TypeCompte type, VilleIUT* tiut[], int* nbVilles, bool* abandon) {
void demmanderInfosPersonnel(TypeCompte type, VilleIUT* tiut[], int* nbVilles, bool* abandon, VilleIUT** iut, Dep** dept) {
if (type == CANDIDAT) {
*abandon = false;
return NULL;
return;
}
VilleIUT* iut = NULL;
Dep* dept = NULL;
*iut = NULL;
*dept = NULL;
char nomVille[TAILLE_NOM_VILLE];
printf("Saisissez le nom de la ville de l'iut où vous travaillez : ");
fgets(nomVille, TAILLE_NOM_VILLE - 1, stdin);
@ -41,63 +41,59 @@ Personnel* demmanderInfosPersonnel(TypeCompte type, VilleIUT* tiut[], int* nbVil
if (type == ADMINISTRATEUR &&
choix("Voulez-vous créer l'iut ?")) {//si c'est un admin, alors on demmande si on veut créer l'iut
bool existe;
iut = creerVilleIUT(tiut, *nbVilles, NB_MAX_FORMATIONS, nomVille,
&existe); //ici, existe ne peut pas être true puisque l'on a vérifié avant si une ville existait déja
*iut = creerVilleIUT(tiut, *nbVilles, NB_MAX_FORMATIONS, nomVille,
&existe); //ici, existe ne peut pas être true puisque l'on a vérifié avant si une ville existait déja
*nbVilles += 1;
} else if (choix("Recommencer ?"))
return demmanderInfosPersonnel(type, tiut, nbVilles, abandon);
return demmanderInfosPersonnel(type, tiut, nbVilles, abandon, iut, dept);
else {
*abandon = true;
return NULL;
return;
}
} else {
iut = tiut[idxIut];
*iut = tiut[idxIut];
}
if (type == RECRUTEUR) {
char nomDept[TAILLE_NOM_DEPARTEMENT];
printf("Saisissez le nom du département dans lequel vous travaillez :");
fgets(nomDept, TAILLE_NOM_DEPARTEMENT - 1, stdin);
nomDept[strlen(nomDept) - 1] = '\0';
dept = trouverDepartement(iut->ldept, nomDept);
if (dept == NULL) {
*dept = getDepartement(*iut, nomDept);
if (*dept == NULL) {
printf("Le département %s pour l'iut %s n'existe pas, contactez un administrateur de votre iut pour créer le département.\n",
nomDept, nomVille);
*abandon = true;
return NULL;
return;
}
}
Personnel* personnel = (Personnel*) malloc(sizeof(Personnel));
if (personnel == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc Personnel");
personnel->iut = iut;
personnel->dept = dept;
*abandon = false;
return personnel;
}
Compte* enregistrement(ListeCompte* comptes, VilleIUT* tiut[], int* nbVilles) {
char nom[LONGUEUR_MAX_NOM];
char prenom[LONGUEUR_MAX_PRENOM];
char mdp[LONGUEUR_MAX_MDP];
printf("Nom ? ");
printf("Nom : ");
fgets(nom, LONGUEUR_MAX_NOM - 1, stdin);
nom[strlen(nom) - 1] = '\0';
printf("Prenom ? ");
printf("Prenom : ");
fgets(prenom, LONGUEUR_MAX_PRENOM - 1, stdin);
prenom[strlen(prenom) - 1] = '\0';
printf("Mot de passe ? ");
printf("Mot de passe : ");
fgets(mdp, LONGUEUR_MAX_MDP - 1, stdin);
mdp[strlen(mdp) - 1] = '\0';
TypeCompte type = demmanderTypeCompte();
VilleIUT* iut;
Dep* dept;
bool abandon;
Personnel* personnel = demmanderInfosPersonnel(type, tiut, nbVilles, &abandon);
demmanderInfosPersonnel(type, tiut, nbVilles, &abandon, &iut, &dept);
if (abandon)
return NULL;
Compte* compte = creerCompte(comptes, nom, prenom, type, personnel, mdp);
printf("Votre identifiant est : %d, retenez-le !\n", compte->identifiant);
Compte* compte = creerCompte(comptes, nom, prenom, type, iut, dept, mdp);
printf("Votre identifiant est : %d, retenez-le !\n", getIDCompte(compte));
return compte;
}

@ -1,6 +1,10 @@
#include "src/logique/compte/compte.h"
#include "src/application/app_bundle.h"
#include "src/application/app_env.h"
#include "src/application/app_utils.h"
#include "src/logique/formation/ville_iut.h"
#include "src/logique/compte/compte.h"
#include "src/logique/compte/gestion_compte.h"
/**
* Affiche un menu interractif qui permet de s'identifier parmis la liste des comptes.bin passés en paramètre
* \return le compte de l'utilisateur identifié

@ -1,8 +1,8 @@
#include "src/application/menu/menu_principal.h"
void printBienvenue(Compte* compte, Phase phase) {
printf("Bienvenue %s %s.\n", compte->nom, compte->prenom);
TypeCompte tc = compte->type;
printf("Bienvenue %s %s.\n", getNom(compte), getPrenom(compte));
TypeCompte tc = getType(compte);
printf("Vous êtes %s.\n", nomTypeCompte(tc));
printf("Phase actuelle : ");
switch (phase) {
@ -29,34 +29,25 @@ void saisieNote(char* prompt, float* note) {
}
Dossier* saisieDossier(void) {
Dossier* d = (Dossier*) malloc(sizeof(Dossier));
if (d == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau dossier.");
float maths, francais, anglais, specialite;
printf("Saisie de votre dossier : \n");
saisieNote("Maths :", &d->maths);
saisieNote("Francais :", &d->francais);
saisieNote("Anglais :", &d->anglais);
saisieNote("Spécialité :", &d->specialite);
return d;
saisieNote("Maths :", &maths);
saisieNote("Anglais :", &anglais);
saisieNote("Francais :", &francais);
saisieNote("Spécialité :", &specialite);
return nouvDossier(maths, anglais, francais, specialite);
}
Candidature* creerNouvCandidature(Compte* compte) {
printf("Création d'une nouvelle candidature.\n");
Dossier* d = saisieDossier();
Candidature* c = (Candidature*) malloc(sizeof(Candidature));
if (c == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc une nouvelle candidature");
c->candidat = compte;
c->dossier = d;
c->voeuxs= nouvListeVoeux();
return c;
return nouvCandidature(compte, saisieDossier());
}
Candidature* getCandidature(ListeCandidature* lc, Compte* compte) {
MaillonCandidature* mc = *lc;
while (!videLCa(&mc)) {
Candidature* c = mc->candidature;
if (c->candidat->identifiant == compte->identifiant)
Candidature* c = teteLCa(&mc);
if (getIDCompte(getCompteCandidat(c)) == getIDCompte(compte))
return c;
mc = *queueLCa(&mc);
}
@ -107,7 +98,7 @@ void menusRecruteur(Compte* compte, Bundle* bundle) {
printf("Cet outil n'est disponnible que pendant la phase de traitement des voeuxs.");
break;
}
examinationDesProfils(compte, &bundle->candidatures);
demarrerSessionExamen(compte, &bundle->candidatures);
break;
}
}
@ -116,7 +107,7 @@ void menusRecruteur(Compte* compte, Bundle* bundle) {
void menusAdmin(Compte* compte, Bundle* bundle) {
int choix;
ListeCandidature candidatures = bundle->candidatures;
VilleIUT* iut = compte->personnel->iut;
VilleIUT* iut = getIutPersonnel(compte);
while (true) {
printf("0) Quitter\n");
printf("1) Modifications départements\n");
@ -137,7 +128,7 @@ void menusAdmin(Compte* compte, Bundle* bundle) {
void menuPrincipal(Compte* compte, Bundle* bundle) {
printBienvenue(compte, bundle->phase);
switch (compte->type) {
switch (getType(compte)) {
case CANDIDAT:
menusCandidat(compte, bundle);
break;

@ -4,6 +4,9 @@
#include "src/application/menu/administration/informations.h"
#include "src/application/menu/administration/modifications.h"
#include "src/application/menu/recruteur/outil.h"
#include "src/application/app_bundle.h"
#include "src/application/app_env.h"
#include "src/logique/candidature/candidature.h"
#include "src/logique/candidature/liste_candidature.h"
void menuPrincipal(Compte* compte, Bundle* bundle);

@ -19,11 +19,16 @@ void afficherProfils(ListeProfil* profils) {
}
while (!videLP(profils)) {
Profil* profil = teteLP(profils);
Dossier* d = profil->dossier;
float math = d->maths, francais = d->francais, anglais = d->anglais, spe = d->specialite;
printf("\tid : %3d dossier: (math: %2.3f, francais: %2.3f, anglais: %2.3f, spe: %2.3f) note: %.3f ", profil->id, math,
francais, anglais, spe, profil->note);
if (profil->note == -1)
Dossier* d = getDossierProfil(profil);
int id = getIDProfil(profil);
float math = getNoteMaths(d),
francais = getNoteFrancais(d),
anglais = getNoteAnglais(d),
spe = getNoteSpecialite(d);
printf("\tid : %3d dossier: (math: %2.3f, francais: %2.3f, anglais: %2.3f, spe: %2.3f) note: %.3f ",
id, math,
francais, anglais, spe, getNote(profil));
if (getNote(profil) == -1)
printf("(non traité)");
printf("\n");
profils = queueLP(profils);
@ -34,9 +39,11 @@ void afficherProfils(ListeProfil* profils) {
void filtrerProfils(ListeProfil* source, float noteMinimum) {
while (!videLP(source)) {
Profil* profil = teteLP(source);
if (profil->note != -1 && profil->note < noteMinimum) { //si la note est -1 alors c'est que le dossier n'a pas encore été traité.
*profil->decision = REFUSE;
supprimerProfil(source, profil->id); //supprime le profil au cas où il y est déja.
float note = getNote(profil);
if (note != -1 &&
note < noteMinimum) { //si la note est -1 alors c'est que le dossier n'a pas encore été traité.
setDecision(profil, REFUSE);
supprimerProfil(source, getIDProfil(profil)); //supprime le profil au cas où il y est déja.
break;
}
source = queueLP(source);
@ -51,7 +58,7 @@ void notationAutomatique(ListeProfil* profils) {
ListeProfil* aux = profils;
while (!videLP(aux)) {
Profil* profil = teteLP(aux);
profil->note = moyenneGenerale(profil->dossier);
setNote(profil, moyenneGenerale(getDossierProfil(profil)));
aux = queueLP(aux);
}
trierLP(profils); //on retrie la liste de profils car les notes ont été modifiées.
@ -72,16 +79,22 @@ Profil* choisirProfil(ListeProfil* profils) {
}
void noterProfilManuellement(Profil* profil) {
printf("Candidat n°%d: \n", profil->id);
Dossier* d = profil->dossier;
float math = d->maths, francais = d->francais, anglais = d->anglais, spe = d->specialite;
int id = getIDProfil(profil);
Dossier* d = getDossierProfil(profil);
float note = getNote(profil);
float math = getNoteMaths(d),
francais = getNoteFrancais(d),
anglais = getNoteAnglais(d),
spe = getNoteSpecialite(d);
printf("Candidat n°%d: \n", id);
printf("Dossier scolaire : \n\tmath: %2.3f\n\tfrancais: %2.3f\n\tanglais: %2.3f\n\tspe: %2.3f\n",
math, francais, anglais, spe);
printf("\tMoyenne generale : %.2f\n", moyenneGenerale(d));
printf("Note actuelle : %.3f\n", profil->note);
printf("Note actuelle : %.3f\n", note);
printf("Inserez la note que vous souhaitez :");
scanf("%2f", &profil->note);
printf("Le profil %d a maintenant la note %.2f.\n", profil->id, profil->note);
scanf("%2f", &note);
setNote(profil, note);
printf("Le profil %d a maintenant la note %.2f.\n", id, note);
}
void notationManuelle(ListeProfil* profils) {
@ -103,23 +116,24 @@ void conclureResultatsExamen(ListeProfil* resultat, int limiteAdmisDoffice) {
while (!videLP(resultat)) {
Profil* profil = teteLP(resultat);
if (place <= limiteAdmisDoffice)
*profil->decision = ACCEPTE; //si la position du candidat est inférieure à la place des candidats admis d'office, alors on accepte
setDecision(profil, ACCEPTE); //si la position du candidat est inférieure à la place des candidats admis d'office, alors on accepte
else
*profil->decision = EN_ATTENTE; //sinon on est en attente.
setDecision(profil, EN_ATTENTE) ; //sinon on est en attente.
resultat = queueLP(resultat);
place++;
}
}
void afficherOutilExamen(Compte* compte, ListeProfil* profils) {
if (compte->type != RECRUTEUR) {
void examinationDesProfils(Compte* compte, ListeProfil* profils) {
if (getType(compte) != RECRUTEUR) {
printf("Vous n'etes pas autorisé à accéder à ce menu.\n");
return;
}
Personnel* personnel = compte->personnel;
VilleIUT* iut = getIutPersonnel(compte);
Dep* dep = getDepPersonnel(compte);
printf("Demarrage d'une nouvelle session de recrutement pour le departement %s de l'iut %s.\n\n",
personnel->iut->ville, personnel->dept->departement);
printf("Le departement contient actuellement %d places disponnibles.\n", personnel->dept->nbP);
getNomVille(iut), getNomDept(dep));
printf("Le departement contient actuellement %d places disponnibles.\n", getNbPlacesDispo(dep));
afficherProfils(profils);
int limiteAdmisDoffice;
float noteMinimum;
@ -136,12 +150,25 @@ void afficherOutilExamen(Compte* compte, ListeProfil* profils) {
afficherProfils(profils);
}
void examinationDesProfils(Compte* compte, ListeCandidature* candidatures) {
Personnel* personnel = compte->personnel;
VilleIUT* iut = personnel->iut;
Dep* dept = personnel->dept;
void libererResultats(ListeProfil* resultats) {
ListeProfil* aux = resultats;
while (!videLP(aux)) {
free(teteLP(aux));
aux = queueLP(aux);
}
freeListeProfil(resultats);
}
void conclureAdmissions(Dep* dept, ListeProfil admis) {
}
void demarrerSessionExamen(Compte* compte, ListeCandidature* candidatures) {
VilleIUT* iut = getIutPersonnel(compte);
Dep* dept = getDepPersonnel(compte);
ListeProfil profils = extraireProfils(candidatures, iut, dept);
afficherOutilExamen(compte, &profils);
//TODO sauvegarder les profils
examinationDesProfils(compte, &profils);
conclureAdmissions(dept, profils);
libererResultats(&profils);
}

@ -1,11 +1,18 @@
#include "src/logique/recrutement/profil.h"
#include "src/logique/recrutement/liste_profil.h"
#include "src/application/app_utils.h"
#include "src/application/app_env.h"
/**
* Affiche l'outil permettant au recruteur d'examiner les différents profils et de leurs attribuer une note
* \param[in] compte le compte du recruteur
* \param[in] profils liste des différents profils que le recruteur devra examiner.
* */
void afficherOutilExamen(Compte* compte, ListeProfil* profils);
void examinationDesProfils(Compte* compte, ListeProfil* profils);
void examinationDesProfils(Compte* compte, ListeCandidature* candidatures);
/**
* Demarre une session d'examen et met à jour les resultats d'admissions du département du recruteur.
* \param[in] compte le compte du recruteur
* \param[in] candidatures liste des différentes candidatures dont le recruteur examinera les voeuxs faits par apport à son département.
* */
void demarrerSessionExamen(Compte* compte, ListeCandidature* candidatures);

@ -1,128 +1,78 @@
#include "src/logique/candidature/candidature.h"
#include "src/logique/erreur.h"
float moyenneGenerale(Dossier* dossier) {
return (dossier->maths + dossier->anglais + dossier->francais + (dossier->specialite * 2)) / 5;
}
void freeCandidature(Candidature* c) {
free(c->dossier);
MaillonVoeux* mv = c->voeuxs;
while (!videLV(&mv)) {
freeVoeux(mv->voeux);
mv = *queueLV(&mv);
struct candidature {
/**
* Le compte du candidat
* */
Compte* candidat;
/**
* Le dossier du candidat, utilisé pendant la phase d'examination des voeuxs
* */
Dossier* dossier;
/**
* La liste des voeux de la candidature.
* Le candidat remplit cette liste pendant la phase de candidature,
* puis pendant la phase de consultation des resultats, la liste de voeuxs évolue
* selon les choix du jury et du candidat.
* */
ListeVoeux voeuxs;
/**
* l'unique voeux accepté par le jury et le candidat.
* (est NULL pendant la phase de candidature/examination des voeux, et tant que le candidat n'a pas accepté de voeux).
* NOTE: le voeux accepté ne devrait donc pas figurer dans la liste de voeuxs.
* */
Voeux* voeuxAccepte;
};
Candidature* nouvCandidature(Compte* candidat, Dossier* dossier) {
if (candidat->type != CANDIDAT)
fatal(ARGUMENT_INVALIDE, "impossible de créer une candidature pour un compte qui n'est pas un candidat.")
Candidature* c = (Candidature*) malloc(sizeof(Candidature));
if (c == NULL) {
fatal(ERREUR_MEMOIRE, "impossible de malloc une nouvelle Candidature.");
}
freeListeVoeux(&c->voeuxs);
free(c->voeuxAccepte);
free(c);
c->candidat = candidat;
c->dossier = d;
c->voeuxs = nouvListeVoeuxs();
c->voeuxAccepte = NULL;
}
ListeCandidature nouvListeCandidature(void) {
return NULL;
}
void ajouterCandidature(ListeCandidature* l, Candidature* c) {
char* nom = c->candidat->nom;
char* prenom = c->candidat->prenom;
int id = c->candidat->identifiant;
MaillonCandidature** m = l;
//on cherche le bon emplacement où insérer la candidature
while (*m != NULL) {
Compte* it = (*m)->candidature->candidat;
int cmpNom = strcmp(nom, it->nom);
int cmpPrenom = strcmp(prenom, it->prenom);
int cmpId = id - it->identifiant;
if (cmpNom < 0 || (cmpNom == 0 && cmpPrenom < 0) || (cmpNom == 0 && cmpPrenom == 0 && cmpId < 0))
break; //emplacement trouvé
m = &(*m)->suiv;
}
MaillonCandidature* nouv = (MaillonCandidature*) malloc(sizeof(MaillonCandidature));
if (nouv == NULL)
fatal(ERREUR_MEMOIRE, "impossible d'allouer un nouveau compte.");
nouv->candidature = c;
nouv->suiv = *m; //Le nouveau maillon pointe vers le maillon remplacé
*m = nouv; //le pointeur du maillon remplacé devient le nouveau maillon
Compte* getCompteCandidat(Candidature* c) {
return c->candidat;
}
bool supprimerCandidature(ListeCandidature* l, Candidature* c) {
if (videLCa(l))
return false;
char* nom = c->candidat->nom;
char* prenom = c->candidat->prenom;
int id = c->candidat->identifiant;
MaillonCandidature** m = l;
//on cherche le maillon qui contient la candidature.
// Si on trouve pas on retourne false
while (*m != NULL) {
Compte* it = (*m)->candidature->candidat;
int cmpNom = strcmp(nom, it->nom);
int cmpPrenom = strcmp(prenom, it->prenom);
int cmpId = id - it->identifiant;
if (cmpNom > 0 || (cmpNom == 0 && cmpPrenom > 0) || (cmpNom == 0 && cmpPrenom == 0 && cmpId > 0))
return false; //on a pas trouvé
if (cmpNom == 0 && cmpPrenom == 0 && cmpId == 0)
break; // on a trouvé
m = &(*m)->suiv;
}
if (*m == NULL) return false; // on a pas trouvé
MaillonCandidature* aux = *m;
*m = aux->suiv;
free(aux);
return true;
Dossier* getDossierCandidat(Candidature* c) {
return c->dossier;
}
ListeCandidature* queueLCa(ListeCandidature* l) {
if (videLCa(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return &(*l)->suiv;
ListeVoeux* getVoeuxs(Candidature* c) {
return &c->voeuxs;
}
Candidature* teteLCa(ListeCandidature* l) {
if (videLCa(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return (*l)->candidature;
Voeux* getVoeuxAccepte(Candidature* c) {
return c->voeuxAccepte;
}
bool videLCa(ListeCandidature* l) {
return *l == NULL;
void accepterVoeux(Candidature* c, Voeux* v) {
supprimerVoeux(&c->voeuxs, v);
v->decisionCandidat = ACCEPTE;
c->voeuxAccepte = v;
}
int longueurLCa(ListeCandidature* l) {
MaillonCandidature* m = *l;
int i = 0;
while (!videLCa(&m)) {
i++;
m = m->suiv;
}
return i;
}
void freeListeCandidature(ListeCandidature* l) {
MaillonCandidature* mv = *l, * aux;
while (mv != NULL) {
aux = mv;
mv = mv->suiv;
free(aux);
void freeCandidature(Candidature* c) {
free(c->dossier);
MaillonVoeux* mv = c->voeuxs;
while (!videLV(&mv)) {
freeVoeux(mv->voeux);
mv = *queueLV(&mv);
}
freeListeVoeux(&c->voeuxs);
free(c->voeuxAccepte);
free(c);
}
Dossier* lireDossier(FILE* f) {
Dossier* dossier = (Dossier*) malloc(sizeof(Dossier));
if (dossier == NULL) {
fclose(f);
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau dossier.");
}
fscanf(f, "%f %f %f %f", &dossier->francais, &dossier->maths, &dossier->anglais, &dossier->specialite);
return dossier;
}
Candidature* lireCandidature(ListeCompte* lc, FILE* f) {
int id, nbVoeux;
@ -138,7 +88,7 @@ Candidature* lireCandidature(ListeCompte* lc, FILE* f) {
exit(ELEMENT_INTROUVE);
}
Dossier* dossier = lireDossier(f);
int voeuxAccepte;
int voeuxAccepte;
fscanf(f, "%d%*c", &voeuxAccepte);
if (voeuxAccepte) //si il y a un voeux accepté
c->voeuxAccepte = lireVoeux(f);
@ -153,23 +103,6 @@ Candidature* lireCandidature(ListeCompte* lc, FILE* f) {
return c;
}
ListeCandidature chargerCandidatures(char* nomFichier, ListeCompte* lc) {
FILE* f = fopen(nomFichier, "r");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible de lire le fichier des candidatures");
int nbCandidat = 0;
ListeCandidature candids = nouvListeCandidature();
fscanf(f, "%d", &nbCandidat);
for (int i = 0; i < nbCandidat; i++)
ajouterCandidature(&candids, lireCandidature(lc, f));
fclose(f);
return candids;
}
void ecrireDossier(Dossier* d, FILE* f) {
fprintf(f, "%.2f %.2f %.2f %.2f\n", d->francais, d->maths, d->anglais, d->specialite);
}
void ecrireCandidature(Candidature* c, FILE* f) {
fprintf(f, "%d\n", c->candidat->identifiant);
@ -189,35 +122,4 @@ void ecrireCandidature(Candidature* c, FILE* f) {
}
}
void sauvegarderCandidatures(char* nomFichier, ListeCandidature* l) {
FILE* f = fopen(nomFichier, "w");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible d'ecrire dans le fichier des candidatures");
int nb = longueurLCa(l);
fprintf(f, "%d\n", nb);
MaillonCandidature* mc = *l;
for (int i = 0; i < nb; i++) {
ecrireCandidature(mc->candidature, f);
mc = mc->suiv;
}
fclose(f);
}
ListeCandidature filtrerLCPourDept(ListeCandidature* lc, VilleIUT* iut, Dep* dept) {
ListeCandidature filtre = nouvListeCandidature(); //contient toutes les candidatures qui ont un voeux pour le departement
while (!videLCa(lc)) {
Candidature* c = teteLCa(lc);
ListeVoeux* voeuxs = &c->voeuxs;
while (!videLV(voeuxs)) {
Voeux* voeux = teteLV(voeuxs);
if (strcmp(voeux->nomVille, iut->ville) == 0 && strcmp(voeux->departement, dept->departement) == 0) {
ajouterCandidature(&filtre, c);
break;
}
voeuxs = queueLV(voeuxs);
}
lc = queueLCa(lc);
}
return filtre;
}

@ -1,83 +1,32 @@
#ifndef candidature_h
#define candidature_h
#include "src/logique/compte/compte.h"
#include "src/logique/compte/liste_compte.h"
#include "src/logique/candidature/voeux.h"
#include "src/logique/candidature/liste_voeux.h"
#include "src/logique/candidature/dossier.h"
/**
* Dossier scolaire d'un candidat.
* Contient les moyennes en mathématiques, français, anglais et la spécialité du candidat.
* */
typedef struct {
float maths;
float francais;
float anglais;
float specialite;
} Dossier;
bool dossierEgal(Dossier* a, Dossier* b);
/**
* Structure représentant la candidature d'un candidat.
* */
typedef struct {
/**
* Le compte du candidat
* */
Compte* candidat;
/**
* Le dossier du candidat, utilisé pendant la phase d'examination des voeuxs
* */
Dossier* dossier;
/**
* La liste des voeux de la candidature.
* Le candidat remplit cette liste pendant la phase de candidature,
* puis pendant la phase de consultation des resultats, la liste de voeuxs évolue
* selon les choix du jury et du candidat.
* */
ListeVoeux voeuxs;
/**
* l'unique voeux accepté par le jury et le candidat.
* (est NULL pendant la phase de candidature/examination des voeux, et tant que le candidat n'a pas accepté de voeux).
* NOTE: le voeux accepté ne devrait donc pas figurer dans la liste de voeuxs.
* */
Voeux* voeuxAccepte;
} Candidature;
float moyenneGenerale(Dossier* dossier);
void freeCandidature(Candidature* c);
/**
* Definit une liste chainée triée sur le nom / prenom des candidats et leurs identifiants
* */
typedef struct maillonCandidature {
Candidature* candidature;
struct maillonCandidature* suiv;
} MaillonCandidature, * ListeCandidature;
ListeCandidature chargerCandidatures(char* nomFichier, ListeCompte* lc);
void sauvegarderCandidatures(char* nomFichier, ListeCandidature* l);
ListeCandidature nouvListeCandidature(void);
struct candidature;
typedef struct candidature Candidature;
void freeListeCandidature(ListeCandidature* l);
void ajouterCandidature(ListeCandidature* l, Candidature* v);
Candidature* nouvCandidature(Compte* candidat, Dossier* dossier);
bool supprimerCandidature(ListeCandidature* l, Candidature* v);
Compte* getCompteCandidat(Candidature* c);
Dossier* getDossierCandidat(Candidature* c);
ListeVoeux* getVoeuxs(Candidature* c);
Voeux* getVoeuxAccepte(Candidature* c);
void accepterVoeux(Candidature* c, Voeux* v);
ListeCandidature* queueLCa(ListeCandidature* l);
Candidature* lireCandidature(ListeCompte* lc, FILE* f);
void ecrireCandidature(Candidature* c, FILE* f);
Candidature* teteLCa(ListeCandidature* l);
int longueurLCa(ListeCandidature* l);
bool videLCa(ListeCandidature* l);
ListeCandidature filtrerLCPourDept(ListeCandidature* lc, VilleIUT* iut, Dep* dept);
void freeCandidature(Candidature* c);
#endif

@ -0,0 +1,54 @@
#include "src/logique/candidature/dossier.h"
struct dossier {
float maths;
float francais;
float anglais;
float specialite;
};
float ensureNote(float note) {
if (note < 0 || note > 20)
fatal(ARGUMENT_INVALIDE, "la note n'est pas comprise entre 0 et 20.");
return note;
}
Dossier* nouvDossier(float maths, float anglais, float francais, float specialite) {
Dossier* d = (Dossier*) malloc(sizeof(Dossier));
if (d == NULL) {
fclose(f);
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau dossier.");
}
d->maths = ensureNote(maths);
d->anglais = ensureNote(anglais);
d->francais = ensureNote(francais);
d->specialite = ensureNote(specialite);
}
float moyenneGenerale(Dossier* dossier) {
return (dossier->maths + dossier->anglais + dossier->francais + (dossier->specialite * 2)) / 5;
}
float getNoteMaths(Dossier* d) {
return d->maths;
}
float getNoteFrancais(Dossier* d) {
return d->fracais;
}
float getNoteAnglais(Dossier* d) {
return d->anglais;
}
float getNoteSpecialite(Dossier* d) {
return d->specialite;
}
void ecrireDossier(Dossier* d, FILE* f) {
fprintf(f, "%.2f %.2f %.2f %.2f\n", d->francais, d->maths, d->anglais, d->specialite);
}
Dossier* lireDossier(FILE* f) {
float fr, maths, anglais, spe;
fscanf(f, "%f %f %f %f", &maths, &anglais, fr, &spe);
return nouvDossier(maths, anglais, fr, spe);
}

@ -0,0 +1,18 @@
/**
* Dossier scolaire d'un candidat.
* Contient les moyennes en mathématiques, français, anglais et la spécialité du candidat.
* */
struct dossier;
typedef struct dossier Dossier;
Dossier* nouvDossier(float math, float anglais, float francais, float specialite);
float moyenneGenerale(Dossier* dossier);
float getNoteMaths(Dossier* d);
float getNoteFrancais(Dossier* d);
float getNoteAnglais(Dossier* d);
float getNoteSpecialite(Dossier* d);
void ecrireDossier(Dossier* d, FILE* f);
Dossier* lireDossier(FILE* f);

@ -0,0 +1,149 @@
#include "src/logique/candidature/liste_candidature.h"
struct maillonCandidature {
Candidature* candidature;
struct maillonCandidature* suiv;
};
ListeCandidature nouvListeCandidature(void) {
return NULL;
}
void ajouterCandidature(ListeCandidature* l, Candidature* c) {
char* nom = getNom(c->candidat);
char* prenom = getPrenom(c->candidat);
int id = getIDCompte(c->candidat);
MaillonCandidature** m = l;
//on cherche le bon emplacement où insérer la candidature
while (*m != NULL) {
Compte* it = (*m)->candidature->candidat;
int cmpNom = strcmp(nom, it->nom);
int cmpPrenom = strcmp(prenom, it->prenom);
int cmpId = id - it->identifiant;
if (cmpNom < 0 || (cmpNom == 0 && cmpPrenom < 0) || (cmpNom == 0 && cmpPrenom == 0 && cmpId < 0))
break; //emplacement trouvé
m = &(*m)->suiv;
}
MaillonCandidature* nouv = (MaillonCandidature*) malloc(sizeof(MaillonCandidature));
if (nouv == NULL)
fatal(ERREUR_MEMOIRE, "impossible d'allouer un nouveau compte.");
nouv->candidature = c;
nouv->suiv = *m; //Le nouveau maillon pointe vers le maillon remplacé
*m = nouv; //le pointeur du maillon remplacé devient le nouveau maillon
}
bool supprimerCandidature(ListeCandidature* l, Candidature* c) {
if (videLCa(l))
return false;
char* nom = c->candidat->nom;
char* prenom = c->candidat->prenom;
int id = c->candidat->identifiant;
MaillonCandidature** m = l;
//on cherche le maillon qui contient la candidature.
// Si on trouve pas on retourne false
while (*m != NULL) {
Compte* it = (*m)->candidature->candidat;
int cmpNom = strcmp(nom, it->nom);
int cmpPrenom = strcmp(prenom, it->prenom);
int cmpId = id - it->identifiant;
if (cmpNom > 0 || (cmpNom == 0 && cmpPrenom > 0) || (cmpNom == 0 && cmpPrenom == 0 && cmpId > 0))
return false; //on a pas trouvé
if (cmpNom == 0 && cmpPrenom == 0 && cmpId == 0)
break; // on a trouvé
m = &(*m)->suiv;
}
if (*m == NULL) return false; // on a pas trouvé
MaillonCandidature* aux = *m;
*m = aux->suiv;
free(aux);
return true;
}
ListeCandidature* queueLCa(ListeCandidature* l) {
if (videLCa(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return &(*l)->suiv;
}
Candidature* teteLCa(ListeCandidature* l) {
if (videLCa(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return (*l)->candidature;
}
bool videLCa(ListeCandidature* l) {
return *l == NULL;
}
int longueurLCa(ListeCandidature* l) {
MaillonCandidature* m = *l;
int i = 0;
while (!videLCa(&m)) {
i++;
m = m->suiv;
}
return i;
}
void freeListeCandidature(ListeCandidature* l) {
MaillonCandidature* mv = *l, * aux;
while (mv != NULL) {
aux = mv;
mv = mv->suiv;
free(aux);
}
}
ListeCandidature filtrerLCPourDept(ListeCandidature* lc, VilleIUT* iut, Dep* dept) {
ListeCandidature filtre = nouvListeCandidature(); //contient toutes les candidatures qui ont un voeux pour le departement
while (!videLCa(lc)) {
Candidature* c = teteLCa(lc);
ListeVoeux* voeuxs = &c->voeuxs;
while (!videLV(voeuxs)) {
Voeux* voeux = teteLV(voeuxs);
if (strcmp(voeux->nomVille, iut->ville) == 0 && strcmp(voeux->departement, dept->departement) == 0) {
ajouterCandidature(&filtre, c);
break;
}
voeuxs = queueLV(voeuxs);
}
lc = queueLCa(lc);
}
return filtre;
}
ListeCandidature chargerCandidatures(char* nomFichier, ListeCompte* lc) {
FILE* f = fopen(nomFichier, "r");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible de lire le fichier des candidatures");
int nbCandidat = 0;
ListeCandidature candids = nouvListeCandidature();
fscanf(f, "%d", &nbCandidat);
for (int i = 0; i < nbCandidat; i++)
ajouterCandidature(&candids, lireCandidature(lc, f));
fclose(f);
return candids;
}
void sauvegarderCandidatures(char* nomFichier, ListeCandidature* l) {
FILE* f = fopen(nomFichier, "w");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible d'ecrire dans le fichier des candidatures");
int nb = longueurLCa(l);
fprintf(f, "%d\n", nb);
MaillonCandidature* mc = *l;
for (int i = 0; i < nb; i++) {
ecrireCandidature(mc->candidature, f);
mc = mc->suiv;
}
fclose(f);
}

@ -0,0 +1,35 @@
#ifndef liste_candidature_h
#define liste_candidature_h
#include "src/logique/candidature/candidature.h"
#include "src/logique/formation/departement.h"
#include "src/logique/compte/liste_compte.h"
typedef struct candidature Candidature;
/**
* Definit une liste chainée triée sur le nom / prenom des candidats et leurs identifiants
* */
struct maillonCandidature;
typedef struct maillonCandidature MaillonCandidature, * ListeCandidature;
ListeCandidature nouvListeCandidature(void);
void freeListeCandidature(ListeCandidature* l);
void ajouterCandidature(ListeCandidature* l, Candidature* v);
bool supprimerCandidature(ListeCandidature* l, Candidature* v);
ListeCandidature* queueLCa(ListeCandidature* l);
Candidature* teteLCa(ListeCandidature* l);
int longueurLCa(ListeCandidature* l);
bool videLCa(ListeCandidature* l);
ListeCandidature filtrerLCPourDept(ListeCandidature* lc, VilleIUT* iut, Dep* dept);
ListeCandidature chargerCandidatures(char* nomFichier, ListeCompte* lc);
void sauvegarderCandidatures(char* nomFichier, ListeCandidature* l);
#endif

@ -0,0 +1,95 @@
#include "src/logique/candidature/liste_voeux.h"
ListeVoeux nouvListeVoeux(void) {
return NULL;
}
void ajouterVoeux(ListeVoeux* l, Voeux* v) {
if (!videLV(l)) {
ajouterVoeux(&(*l)->suiv, v);
return;
}
MaillonVoeux* m = (MaillonVoeux*) malloc(sizeof(MaillonVoeux));
if (m == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un maillon voeux\n");
m->suiv = NULL;
m->voeux = v;
*l = m;
}
void supprimerVoeux(ListeVoeux* l, Voeux* v) {
if (videLV(l))
return;
if (voeuxEgal(teteLV(l), v)) {
ListeVoeux queue = (*l)->suiv;
MaillonVoeux* tete = *l;
free(tete);
*l = queue;
return;
}
supprimerVoeux(queueLV(l), v);
}
ListeVoeux* queueLV(ListeVoeux* l) {
if (videLV(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return &(*l)->suiv;
}
Voeux* teteLV(ListeVoeux* l) {
if (videLV(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return (*l)->voeux;
}
bool videLV(ListeVoeux* l) {
return *l == NULL;
}
int longueurLV(ListeVoeux* l) {
MaillonVoeux* m = *l;
int i = 0;
while (!videLV(&m)) {
i++;
m = m->suiv;
}
return i;
}
void freeListeVoeux(ListeVoeux* l) {
MaillonVoeux* mv = *l, *aux;
while (mv != NULL) {
aux = mv;
mv = mv->suiv;
free(aux);
}
}
bool contientVoeux(ListeVoeux* lv, Voeux* v) {
MaillonVoeux* mv = *lv;
while (!videLV(&mv)) {
if (voeuxEgal(teteLV(&mv), v)) return true;
mv = *queueLV(&mv);
}
return false;
}
bool listeVoeuxEgal(ListeVoeux* a, ListeVoeux* b) {
int l = longueurLV(a);
if (l != longueurLV(b))
return false;
MaillonVoeux* at = *a;
MaillonVoeux* bt = *b;
for (int i = 0; i < l; i++) {
if (!voeuxEgal(at->voeux, bt->voeux)) return false;
at = at->suiv;
bt = bt->suiv;
}
return true;
}

@ -0,0 +1,33 @@
#include "src/logique/candidature/voeux.h"
#include <stdbool.h>
//Listes de voeux
typedef struct maillonVoeux {
Voeux* voeux;
struct maillonVoeux* suiv;
} MaillonVoeux, * ListeVoeux;
/*
* Manipulations sur les listes de voeux
*/
ListeVoeux nouvListeVoeux(void);
void ajouterVoeux(ListeVoeux* l, Voeux* v);
void supprimerVoeux(ListeVoeux* l, Voeux* v);
ListeVoeux* queueLV(ListeVoeux* l);
Voeux* teteLV(ListeVoeux* l);
bool videLV(ListeVoeux* l);
int longueurLV(ListeVoeux* l);
void freeListeVoeux(ListeVoeux* l);
bool contientVoeux(ListeVoeux* l, Voeux* v);
bool listeVoeuxEgal(ListeVoeux* a, ListeVoeux* b);
ListeVoeux filtrerLVPourIut(ListeVoeux* lv, VilleIUT* iut);

@ -1,5 +1,12 @@
#include "src/logique/candidature/voeux.h"
struct voeux {
VilleIUT* iut;
Dep* departement;
int decisionJury;
int decisionCandidat;
};
bool voeuxEgal(Voeux* v1, Voeux* v2) {
return v1 == v2 || (strcmp(v1->nomVille, v2->nomVille) == 0
&& strcmp(v1->departement, v2->departement) == 0
@ -7,21 +14,41 @@ bool voeuxEgal(Voeux* v1, Voeux* v2) {
&& v1->decisionCandidat == v2->decisionCandidat);
}
VilleIUT* getIUTVoeux(Voeux* v) {
return v->iut;
}
Dep* getDeptVoeux(Voeux* v) {
return v->departement;
}
int getDecisionCandidat(Voeux* v) {
return v->decisionCandidat;
}
void setDecisionCandidat(Voeux* v, int decision) {
if (decision != REFUSE && decision != ACCEPTE && decision != EN_ATTENTE)
fatal(ARGUMENT_INVALIDE, "la decision du candidat est invalide.");
v->decisionCandidat = decision;
}
int getDecisionJury(Voeux* v) {
return v->decisionJury;
}
void setDecisionJury(Voeux* v, int decision) {
if (decision != REFUSE && decision != ACCEPTE && decision != EN_ATTENTE)
fatal(ARGUMENT_INVALIDE, "la decision du jury est invalide.");
v->decisionJury = decision;
}
Voeux* nouvVoeux(char* nomVille, char* departement, int decisionJury, int decisionCandidat) {
Voeux* voeux = (Voeux*) malloc(sizeof(Voeux));
if (voeux == NULL)
Voeux* nouvVoeux(VilleIUT* iut, Dep* departement) {
Voeux* v = (Voeux*) malloc(sizeof(Voeux));
if (v == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de créer un nouveau voeux: problème de mémoire.");
char* nomVilleCpy = (char*) malloc(sizeof(char) * strlen(nomVille) + 1);
strcpy(nomVilleCpy, nomVille);
char* departementCpy = (char*) malloc(sizeof(char) * strlen(departement) + 1);
strcpy(departementCpy, departement);
voeux->nomVille = nomVilleCpy;
voeux->departement = departementCpy;
voeux->decisionJury = decisionJury;
voeux->decisionCandidat = decisionCandidat;
return voeux;
v->nomVille = iut;
v->departement = departement;
v->decisionJury = NON_TRAITE;
v->decisionCandidat = NON_TRAITE;
return v;
}
void freeVoeux(Voeux* v) {
@ -51,99 +78,7 @@ char* nomDecisionVoeux(int d) {
* */
ListeVoeux nouvListeVoeux(void) {
return NULL;
}
void ajouterVoeux(ListeVoeux* l, Voeux* v) {
if (!videLV(l)) {
ajouterVoeux(&(*l)->suiv, v);
return;
}
MaillonVoeux* m = (MaillonVoeux*) malloc(sizeof(MaillonVoeux));
if (m == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un maillon voeux\n");
m->suiv = NULL;
m->voeux = v;
*l = m;
}
void supprimerVoeux(ListeVoeux* l, Voeux* v) {
if (videLV(l))
return;
if (voeuxEgal(teteLV(l), v)) {
ListeVoeux queue = (*l)->suiv;
MaillonVoeux* tete = *l;
free(tete);
*l = queue;
return;
}
supprimerVoeux(queueLV(l), v);
}
ListeVoeux* queueLV(ListeVoeux* l) {
if (videLV(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return &(*l)->suiv;
}
Voeux* teteLV(ListeVoeux* l) {
if (videLV(l))
fatal(LISTE_VIDE, "tentative de récupérer la teteLD d'une liste videLD");
return (*l)->voeux;
}
bool videLV(ListeVoeux* l) {
return *l == NULL;
}
int longueurLV(ListeVoeux* l) {
MaillonVoeux* m = *l;
int i = 0;
while (!videLV(&m)) {
i++;
m = m->suiv;
}
return i;
}
void freeListeVoeux(ListeVoeux* l) {
MaillonVoeux* mv = *l, *aux;
while (mv != NULL) {
aux = mv;
mv = mv->suiv;
free(aux);
}
}
bool contientVoeux(ListeVoeux* lv, Voeux* v) {
MaillonVoeux* mv = *lv;
while (!videLV(&mv)) {
if (voeuxEgal(teteLV(&mv), v)) return true;
mv = *queueLV(&mv);
}
return false;
}
bool listeVoeuxEgal(ListeVoeux* a, ListeVoeux* b) {
int l = longueurLV(a);
if (l != longueurLV(b))
return false;
MaillonVoeux* at = *a;
MaillonVoeux* bt = *b;
for (int i = 0; i < l; i++) {
if (!voeuxEgal(at->voeux, bt->voeux)) return false;
at = at->suiv;
bt = bt->suiv;
}
return true;
}
Voeux* lireVoeux(FILE* f) {
Voeux* lireVoeux(FILE* f, VilleIUT* tiut[], int nbVilles) {
char nomVille[64];
char nomDepartement[32];
int decisionJury, decisionCandidat;

@ -13,64 +13,31 @@
#define NON_TRAITE 0
#define ACCEPTE 1
typedef struct {
char* nomVille;
char* departement;
int decisionJury;
int decisionCandidat;
} Voeux;
//Listes de voeux
typedef struct maillonVoeux {
Voeux* voeux;
struct maillonVoeux* suiv;
} MaillonVoeux, * ListeVoeux;
//fonction pour tester si un voeux v1 est egal a un voeux v2
bool voeuxEgal(Voeux* v1, Voeux* v2);
struct voeux;
typedef struct voeux Voeux;
/**
* Alloue dans la mémoire centrale un Voeux
* \param nomVille[in] le nom de la ville du voeux
* \param departement[in] le nom du département de la ville
* \param decisionJury[in] la décision du jury
* \param decisionCandidat[in] la décision du candidat
* */
Voeux* nouvVoeux(char* nomVille, char* departement, int decisionJury, int decisionCandidat);
Voeux* nouvVoeux(VilleIUT* iut, Dep* departement);
void freeVoeux(Voeux* v);
char* nomDecisionVoeux(int d);
/*
* Manipulations sur les listes de voeux
*/
ListeVoeux nouvListeVoeux(void);
void ajouterVoeux(ListeVoeux* l, Voeux* v);
VilleIUT* getIUTVoeux(Voeux* v);
Dep* getDeptVoeux(Voeux* v);
int getDecisionCandidat(Voeux* v);
void setDecisionCandidat(Voeux* v, int decision);
int getDecisionJury(Voeux* v);
void setDecisionJury(Voeux* v, int decision);
void supprimerVoeux(ListeVoeux* l, Voeux* v);
ListeVoeux* queueLV(ListeVoeux* l);
Voeux* teteLV(ListeVoeux* l);
bool videLV(ListeVoeux* l);
int longueurLV(ListeVoeux* l);
void freeListeVoeux(ListeVoeux* l);
bool contientVoeux(ListeVoeux* l, Voeux* v);
bool listeVoeuxEgal(ListeVoeux* a, ListeVoeux* b);
//fonction pour tester si un voeux v1 est egal a un voeux v2
bool voeuxEgal(Voeux* v1, Voeux* v2);
Voeux* lireVoeux(FILE* f);
Voeux* lireVoeux(FILE* f, VilleIUT* tiut[], int nbVilles);
void ecrireVoeux(Voeux* v, FILE* f);
ListeVoeux filtrerLVPourIut(ListeVoeux* lv, VilleIUT* iut);
char* nomDecisionVoeux(int d);
#endif

@ -3,7 +3,6 @@
#include <stdio.h>
#include <string.h>
char* nomTypeCompte(TypeCompte tc) {
switch (tc) {
case CANDIDAT:
@ -17,63 +16,85 @@ char* nomTypeCompte(TypeCompte tc) {
}
}
//minimum de fonctions requises par compte.c pour manipuler la liste des comptes.bin.
ListeCompte nouvListeComptes(void) {
return NULL;
struct personnel {
/**
* L'IUT dans lequel travaille ce membre du personnel
* */
const VilleIUT* iut;
/**
* Eventuellement le département où il est rattaché (NULL si il n'est pas rattaché à un département spécifique)
* Le département ne vaut pas null si le membre du personnel est un recruteur.
* S'il est administrateur, le département vaudra alors NULL.
* */
const Dep* dept;
};
struct compte {
char* nom;
char* prenom;
int identifiant;
TypeCompte type;
Personnel* personnel; //Vaut NULL si type = CANDIDAT
};
Compte* nouvCompte(char* nom, char* prenom, int id, TypeCompte type, VilleIUT* iut, Dep* dept) {
Compte* c = (Compte* c) malloc(sizeof(Compte));
if (c == NULL)
fatal(ERREUR_MEMOIRE, "impossible de creer un nouveau compte.");
c->nom = (char*) malloc(sizeof(char) * strlen(nom) + 1); //+1 pour le '\0';
strcpy(c->nom, nom);
c->prenom = (char*) malloc(sizeof(char) * strlen(prenom) + 1); //+1 pour le '\0';
strcpy(c->prenom, prenom);
c->id = id;
c->type = type;
Personnel* p = (Personnel*)malloc(sizeof(Personnel));
if (p == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un Personnel");
p->iut = iut;
p->dep = dept;
c->personnel = p;
return c;
}
ListeCompte* queueLC(ListeCompte* l) {
if (videLC(l))
fatal(LISTE_VIDE, "La liste de compte est vide.");
return &(*l)->suiv;
Compte* nouvCandidat(char* nom, char* prenom, int id) {
return nouvCompte(nom, prenom, id, CANDIDAT, NULL, NULL);
}
Compte* teteLC(ListeCompte* l) {
if (videLC(l))
fatal(LISTE_VIDE, "La liste de compte est vide.");
return (*l)->compte;
Compte* nouvAdministrateur(char* nom, char* prenom, int id, VilleIUT* iut) {
return nouvCompte(nom, prenom, id, ADMINISTRATEUR, iut, NULL);
}
int longueurLC(ListeCompte* l) {
MaillonCompte* mc = *l;
int nb = 0;
while (mc != NULL) {
nb++;
mc = mc->suiv;
}
return nb;
Compte* nouvRecruteur(char* nom, char* prenom, int id, VilleIUT* iut, Dep* dep) {
return nouvCompte(nom, prenom, id, RECRUTEUR, iut, dep);
}
bool videLC(ListeCompte* lc) {
return *lc == NULL;
}
//TODO expliquer pourquoi je fais la technique iterative et pas recursive ici (bcp d'elements possibles dans cette liste)
/**
* ajoute un compte s'il n'existe pas déja un compte portant le meme identifiant.
* \return true Si le nouveau compte a pu être inséré dans la liste, false s'il existe deja un compte avec le meme identifiant.
* */
bool ajouterCompte(ListeCompte* lc, int mdpHash, Compte* c) {
MaillonCompte** m = lc;
//on cherche le bon emplacement où insérer le compte
while (*m != NULL && (*m)->compte->identifiant < c->identifiant) {
m = &(*m)->suiv;
}
if (*m != NULL && (*m)->compte->identifiant == c->identifiant) //il existe un compte avec le meme identifiant
return false;
int getIDCompte(Compte* c) {
return c->id;
}
char* getNom(Compte* c) {
return c->nom;
}
char* getPrenom(Compte* c) {
return c->prenom;
}
TypeCompte getType(Compte* c) {
return c->type;
}
VilleIUT* getIutPersonnel(Compte* c) {
if (c->type == CANDIDAT)
fatal(ARGUMENT_INVALIDE, "impossible de get l'iut où travaille un compte de type candiat");
return c->personnel->iut;
}
MaillonCompte* nouv = (MaillonCompte*) malloc(sizeof(MaillonCompte));
if (nouv == NULL)
fatal(ERREUR_MEMOIRE, "impossible d'allouer un nouveau compte.");
nouv->compte = c;
nouv->hashmdp = mdpHash;
nouv->suiv = *m; //Le nouveau maillon pointe vers le maillon remplacé
*m = nouv; //le pointeur du maillon remplacé devient le nouveau maillon
return true;
Dep* getDepPersonnel(Compte* c) {
if (c->type != RECRUTEUR)
fatal(ARGUMENT_INVALIDE, "impossible de get l'iut où travaille un compte qui n'est pas un recruteur");
return c->personnel->dep;
}
void freeCompte(Compte* c) {
free(c->prenom);
free(c->nom);
@ -82,14 +103,6 @@ void freeCompte(Compte* c) {
free(c);
}
void freeListeCompte(ListeCompte* lc) {
MaillonCompte* m = *lc;
while (m != NULL) {
MaillonCompte* aux = m;
m = m->suiv;
free(aux);
}
}
Compte* lireCompte(FILE* f, VilleIUT* tiut[], int nbVilles) {
int tailleNom, taillePrenom;
@ -131,7 +144,7 @@ Compte* lireCompte(FILE* f, VilleIUT* tiut[], int nbVilles) {
if (c->personnel == NULL)
fatal(ERREUR_MEMOIRE, "pb malloc personnel");
switch(c->type) {
switch (c->type) {
case RECRUTEUR:
int tailleNomDept;
fread(&tailleNomDept, sizeof(int), 1, f);
@ -158,29 +171,6 @@ Compte* lireCompte(FILE* f, VilleIUT* tiut[], int nbVilles) {
return c;
}
ListeCompte chargerComptes(char* nomFich, VilleIUT* tiut[], int nbVilles) {
FILE* f = fopen(nomFich, "rb");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible de lire dans le fichier des comptes.bin..");
ListeCompte lc = nouvListeComptes();
int nb;
if (!fread(&nb, sizeof(int), 1, f)) { //le fichier est vide
fclose(f);
return lc;
}
int mdpHash;
for (int i = 0; i < nb; i++) {
Compte* c = lireCompte(f, tiut, nbVilles);
fread(&mdpHash, sizeof(int), 1, f);
ajouterCompte(&lc, mdpHash, c);
}
fclose(f);
return lc;
}
void ecrireCompte(Compte* c, FILE* f) {
int tailleNom = strlen(c->nom) + 1;
int taillePrenom = strlen(c->prenom) + 1;
@ -191,7 +181,8 @@ void ecrireCompte(Compte* c, FILE* f) {
fwrite(&c->identifiant, sizeof(int), 1, f);
fwrite(&c->type, sizeof(TypeCompte), 1, f);
switch (c->type) {
case CANDIDAT: break;
case CANDIDAT:
break;
case RECRUTEUR:
char* nomDept = c->personnel->dept->departement;
int tailleNomDept = strlen(nomDept) + 1;
@ -204,96 +195,3 @@ void ecrireCompte(Compte* c, FILE* f) {
fwrite(nomVille, sizeof(char), tailleNomVille, f);
}
}
void sauvegarderComptes(char* nomFich, ListeCompte* lc) {
FILE* f = fopen(nomFich, "wb");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible d'ecrire dans le fichier.");
MaillonCompte* m = *lc;
int l = longueurLC(lc);
fwrite(&l, sizeof(int), 1, f);
while (m != NULL) {
ecrireCompte(m->compte, f);
fwrite(&m->hashmdp, sizeof(int), 1, f);
m = m->suiv;
}
fclose(f);
}
Compte* trouverCompte(ListeCompte* lc, int identifiant) {
MaillonCompte* m = *lc;
while (m != NULL) {
if (m->compte->identifiant == identifiant)
return m->compte;
m = m->suiv;
}
return NULL;
}
int hashMdp(char* mdp) {
int len = strlen(mdp);
int hash = 1;
for (int i = 0; i < len; i++) {
hash *= (31 + mdp[i]) % 1000000007;
}
return hash;
}
int trouverIdentifiantValide(ListeCompte* lc) {
MaillonCompte* m = *lc;
int id = 1;
while (m != NULL && m->compte->identifiant == id++)
m = m->suiv;
return id;
}
Compte* creerCompte(ListeCompte* lc,
char* nom,
char* prenom,
TypeCompte type,
Personnel* personnel,
char* mdp) {
if (personnel != NULL) {
if (type == CANDIDAT) fatal(ARGUMENT_INVALIDE, "Un candidat ne peut être le personnel d'une IUT");
if (type == ADMINISTRATEUR && personnel->dept != NULL)
fatal(ARGUMENT_INVALIDE, "Un administrateur ne peut être rataché à un département spécifique.");
}
int identifiant = trouverIdentifiantValide(lc);
Compte* compte = (Compte*) malloc(sizeof(Compte));
if (compte == NULL)
fatal(ERREUR_MEMOIRE, "impossible de créer un nouveau compte.");
char* nomCopy = (char*) malloc(sizeof(char) * strlen(nom) + 1); //+1 pour le '\0';
strcpy(nomCopy, nom);
char* prenomCopy = (char*) malloc(sizeof(char) * strlen(prenom) + 1); //+1 pour le '\0';
strcpy(prenomCopy, prenom);
compte->nom = nomCopy;
compte->prenom = prenomCopy;
compte->identifiant = identifiant;
compte->type = type;
compte->personnel = personnel;
ajouterCompte(lc, hashMdp(mdp), compte);
return compte;
}
/**
* permet de trouver un compte dans le fichier des comptes.bin,
* avec un nom et prenom correspondant, pour le bon mot de passe
* */
Compte* debloquerCompte(ListeCompte* lc, int identifiant, char* mdp) {
MaillonCompte* m = *lc;
while (m != NULL) {
if (m->compte->identifiant == identifiant) break;
m = m->suiv;
}
if (m != NULL && m->hashmdp == hashMdp(mdp))
return m->compte;
return NULL;
}

@ -1,91 +1,48 @@
#ifndef compte_h
#define compte_h
#include <stdbool.h>
#include "src/logique/compte/compte.h"
#include "src/logique/formation/ville_iut.h"
#include "src/logique/formation/departement.h"
typedef enum {
CANDIDAT, RECRUTEUR, ADMINISTRATEUR
} TypeCompte;
#define LONGUEUR_MAX_NOM 32
#define LONGUEUR_MAX_PRENOM 32
#define LONGUEUR_MAX_MDP 64
char* nomTypeCompte(TypeCompte tc);
/**
* Détermine la structure d'un personnel travaillant pour une IUT
* Voire même dans un département spécifique.
* */
typedef struct {
/**
* L'IUT dans lequel travaille ce membre du personnel
* */
VilleIUT* iut;
/**
* Eventuellement le département où il est rattaché (NULL si il n'est pas rattaché à un département spécifique)
* Le département ne vaut pas null si le membre du personnel est un recruteur.
* S'il est administrateur, le département vaudra alors NULL.
* */
Dep* dept;
} Personnel;
typedef struct {
char* nom;
char* prenom;
int identifiant;
TypeCompte type;
Personnel* personnel; //Vaut NULL si type = CANDIDAT
} Compte;
void freeCompte(Compte* c);
/**
* Definit une liste chainé de compte.
* Cette liste est triée sur les identifiants des comptes.bin et n'accepte pas les doublons.
* */
typedef struct maillonCompte {
Compte* compte;
int hashmdp;
struct maillonCompte* suiv;
} MaillonCompte, *ListeCompte;
ListeCompte *queueLC(ListeCompte *l);
struct personnel;
typedef struct personnel Personnel;
Compte *teteLC(ListeCompte *l);
int longueurLC(ListeCompte *l);
bool videLC(ListeCompte *l);
#define LONGUEUR_MAX_NOM 32
#define LONGUEUR_MAX_PRENOM 32
#define LONGUEUR_MAX_MDP 64
ListeCompte chargerComptes(char* nomFich, VilleIUT* tiut[], int nbVilles);
struct compte;
typedef struct compte Compte;
void sauvegarderComptes(char* nomFich, ListeCompte* lc);
Compte* nouvCandidat(char* nom, char* prenom, int id);
Compte* nouvAdministrateur(char* nom, char* prenom, int id, VilleIUT* iut);
Compte* nouvRecruteur(char* nom, char* prenom, int id, VilleIUT* iut, Dep* dep);
/**
* Libère la liste <u>et aussi les comptes.bin qu'elle contient</u>
* */
void freeListeCompte(ListeCompte* lc);
int getIDCompte(Compte* c);
char* getNom(Compte* c);
char* getPrenom(Compte* c);
TypeCompte getType(Compte* c);
VilleIUT* getIutPersonnel(Compte* c);
Dep* getDepPersonnel(Compte* c);
/**
*
* */
Compte* creerCompte(ListeCompte* lc, char* nom, char* prenom, TypeCompte type, Personnel* personnel, char* mdp);
void freeCompte(Compte* c);
/**
* permet de trouver un compte dans le fichier des comptes,
* Le compte n'est réllement retourné que si le mot de passe est le bon
* */
Compte* debloquerCompte(ListeCompte* lc, int identifiant, char* mdp);
Compte* lireCompte(FILE* f, VilleIUT* tiut[], int nbVilles);
void ecrireCompte(Compte* c, FILE* f);
/**
* Trouve et retourne un compte comportant l'identifiant.
* */
Compte* trouverCompte(ListeCompte* lc, int identifiant);
#endif

@ -0,0 +1,72 @@
#include "src/logique/compte/gestion_compte.h"
int hashMdp(char* mdp) {
int len = strlen(mdp);
int hash = 1;
for (int i = 0; i < len; i++) {
hash *= (31 + mdp[i]) % 1000000007;
}
return hash;
}
Compte* trouverCompte(ListeCompte* lc, int identifiant) {
MaillonCompte* m = *lc;
while (m != NULL) {
if (m->compte->identifiant == identifiant)
return m->compte;
m = m->suiv;
}
return NULL;
}
int trouverIdentifiantValide(ListeCompte* lc) {
MaillonCompte* m = *lc;
int id = 1;
while (m != NULL && m->compte->identifiant == id++)
m = m->suiv;
return id;
}
Compte* creerCompte(ListeCompte* lc,
char* nom,
char* prenom,
TypeCompte type,
VilleIUT* iut,
Dep* dept,
char* mdp) {
int identifiant = trouverIdentifiantValide(lc);
Compte* compte;
switch (type) {
case CANDIDAT:
compte = nouvCandidat(nom, prenom, id);
break;
case ADMINISTRATEUR:
compte = nouvAdministrateur(nom, prenom, id, iut);
break;
case RECRUTEUR:
compte = nouvRecruteur(nom, prenom, id, iut, dept);
break;
}
ajouterCompte(lc, hashMdp(mdp), compte);
return compte;
}
/**
* permet de trouver un compte dans le fichier des comptes.bin,
* avec un nom et prenom correspondant, pour le bon mot de passe
* */
Compte* debloquerCompte(ListeCompte* lc, int identifiant, char* mdp) {
ListeCompte m = *lc;
while (!videLC(m)) {
if (getID(tete(m)) == identifiant) break;
m = queueLC(m);
}
if (m != NULL && m->hashmdp == hashMdp(mdp))
return m->compte;
return NULL;
}

@ -0,0 +1,18 @@
#include "src/logique/compte/liste_compte.h"
/**
*
* */
Compte* creerCompte(ListeCompte* lc, char* nom, char* prenom, TypeCompte type, VilleIUT* iut, Dep* dept, char* mdp);
/**
* permet de trouver un compte dans le fichier des comptes,
* Le compte n'est réllement retourné que si le mot de passe est le bon
* */
Compte* debloquerCompte(ListeCompte* lc, int identifiant, char* mdp);
/**
* Trouve et retourne un compte comportant l'identifiant.
* */
Compte* trouverCompte(ListeCompte* lc, int identifiant);

@ -0,0 +1,123 @@
#include "src/logique/compte/liste_compte.h"
#include "src/logique/compte/compte.h"
struct maillonCompte {
Compte* compte;
int hashmdp;
struct maillonCompte* suiv;
};
//minimum de fonctions requises par compte.c pour manipuler la liste des comptes.bin.
ListeCompte nouvListeComptes(void) {
return NULL;
}
ListeCompte* queueLC(ListeCompte* l) {
if (videLC(l))
fatal(LISTE_VIDE, "La liste de compte est vide.");
return &(*l)->suiv;
}
Compte* teteLC(ListeCompte* l) {
if (videLC(l))
fatal(LISTE_VIDE, "La liste de compte est vide.");
return (*l)->compte;
}
int longueurLC(ListeCompte* l) {
MaillonCompte* mc = *l;
int nb = 0;
while (mc != NULL) {
nb++;
mc = mc->suiv;
}
return nb;
}
bool videLC(ListeCompte* lc) {
return *lc == NULL;
}
//TODO expliquer pourquoi je fais la technique iterative et pas recursive ici (bcp d'elements possibles dans cette liste)
/**
* ajoute un compte s'il n'existe pas déja un compte portant le meme identifiant.
* \return true Si le nouveau compte a pu être inséré dans la liste, false s'il existe deja un compte avec le meme identifiant.
* */
bool ajouterCompte(ListeCompte* lc, int mdpHash, Compte* c) {
MaillonCompte** m = lc;
//on cherche le bon emplacement où insérer le compte
while (*m != NULL && (*m)->compte->identifiant < c->identifiant) {
m = &(*m)->suiv;
}
if (*m != NULL && (*m)->compte->identifiant == c->identifiant) //il existe un compte avec le meme identifiant
return false;
MaillonCompte* nouv = (MaillonCompte*) malloc(sizeof(MaillonCompte));
if (nouv == NULL)
fatal(ERREUR_MEMOIRE, "impossible d'allouer un nouveau compte.");
nouv->compte = c;
nouv->hashmdp = mdpHash;
nouv->suiv = *m; //Le nouveau maillon pointe vers le maillon remplacé
*m = nouv; //le pointeur du maillon remplacé devient le nouveau maillon
return true;
}
void freeListeCompte(ListeCompte* lc) {
MaillonCompte* m = *lc;
while (m != NULL) {
MaillonCompte* aux = m;
m = m->suiv;
free(aux);
}
}
ListeCompte chargerComptes(char* nomFich, VilleIUT* tiut[], int nbVilles) {
FILE* f = fopen(nomFich, "rb");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible de lire dans le fichier des comptes.bin..");
ListeCompte lc = nouvListeComptes();
int nb;
if (!fread(&nb, sizeof(int), 1, f)) { //le fichier est vide
fclose(f);
return lc;
}
int mdpHash;
for (int i = 0; i < nb; i++) {
Compte* c = lireCompte(f, tiut, nbVilles);
fread(&mdpHash, sizeof(int), 1, f);
ajouterCompte(&lc, mdpHash, c);
}
fclose(f);
return lc;
}
void sauvegarderComptes(char* nomFich, ListeCompte* lc) {
FILE* f = fopen(nomFich, "wb");
if (f == NULL)
fatal(OUVERTURE_FICHIER, "impossible d'ecrire dans le fichier.");
MaillonCompte* m = *lc;
int l = longueurLC(lc);
fwrite(&l, sizeof(int), 1, f);
while (m != NULL) {
ecrireCompte(m->compte, f);
fwrite(&m->hashmdp, sizeof(int), 1, f);
m = m->suiv;
}
fclose(f);
}

@ -0,0 +1,33 @@
#include "src/logique/compte/compte.h"
#include "src/logique/formation/ville_iut.h"
#include "src/logique/formation/tab_iut.h"
/**
* Definit une liste chainé de compte.
* Cette liste est triée sur les identifiants des comptes.bin et n'accepte pas les doublons.
* */
struct compte;
typedef struct compte Compte;
struct maillonCompte;
typedef struct maillonCompte MaillonCompte, * ListeCompte;
ListeCompte* queueLC(ListeCompte* l);
Compte* teteLC(ListeCompte* l);
int longueurLC(ListeCompte* l);
bool videLC(ListeCompte* l);
ListeCompte chargerComptes(char* nomFich, VilleIUT* tiut[], int nbVilles);
void sauvegarderComptes(char* nomFich, ListeCompte* lc);
/**
* Libère la liste <u>et aussi les comptes.bin qu'elle contient</u>
* */
void freeListeCompte(ListeCompte* lc);

@ -0,0 +1,53 @@
#include "src/logique/formation/departement.h"
struct dep {
/**
* Le nom du département.
* */
char departement[TAILLE_NOM_DEPARTEMENT];
/**
* Le nombre de places disponnibles en première année
* */
int nbP;
/**
* Le nom du responsable du département.
* */
char responsable[TAILLE_NOM_RESPONSABLE];
/**
* Les resultats d'admissions du centre d'examen du departement.
* */
ResultatsAdmission* admissions;
};
char* getNomDept(Dep* dept) {
return dept->departement;
}
int getNbPlacesDispo(Dep* dept) {
return dept->nbP;
}
void setNbPlacesDispo(Dep* dept, int nbPlaces) {
if (nbPlaces < 0)
fatal(ARGUMENT_INVALIDE, "le nombre de places disponnibles est inférieur.");
dept->nbP = nbPlaces;
}
char* getNomResponsable(Dep* dept) {
return dept->responsable;
}
void setNomResponsable(Dep* dept, char nomResp[TAILLE_NOM_RESPONSABLE]) {
strcpy(dept->responsable, nomResp);
}
Dep* lireDepartement(FILE* f) {
Dep* d = (Dep*) malloc(sizeof(Dep));
if (d == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau Departement.");
fscanf(f, "%s", d->departement);
fscanf(f, "%d%*c", &d->nbP);
fgets(d->responsable, 30, fe);
d->responsable[strlen(d->responsable) - 1] = '\0';
d->admissions = lireResultatsAdmission()
}

@ -0,0 +1,21 @@
#ifndef departement_h
#define departement_h
#define TAILLE_NOM_DEPARTEMENT 31
#define TAILLE_NOM_RESPONSABLE 31
/**
* Structure d'un département d'IUT.
* */
struct dep;
typedef struct dep Dep;
Dep* lireDepartement(FILE* f);
char* getNomDept(Dep* dept);
int getNbPlacesDispo(Dep* dept);
void setNbPlacesDispo(Dep* dept, int nbPlaces);
char* getNomResponsable(Dep* dept);
void setNomResponsable(Dep* dept, char nomResp[TAILLE_NOM_RESPONSABLE]);
#endif

@ -1,5 +0,0 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

@ -1,6 +1,8 @@
#include "liste_dept.h"
#include "src/logique/formation/liste_dept.h"
#include "src/logique/erreur.h"
ListeDept listeDeptNouv(void) {
return NULL;
}
@ -61,7 +63,7 @@ bool videLD(ListeDept l) {
return l == NULL;
}
Dep* trouverDepartement(ListeDept l, char *depart) {
Dep* trouverDepartement(ListeDept l, char* depart) {
if (videLD(l)) return NULL;
Dep* dept = l->dept;
int cmp = strcmp(depart, dept->departement);

@ -1,16 +1,9 @@
#include "src/logique/formation/iut.h"
#ifndef liste_dept_h
#define liste_dept_h
#define TAILLE_NOM_DEPARTEMENT 31
#define TAILLE_NOM_RESPONSABLE 31
#include "src/logique/formation/departement.h"
#include <stdbool.h>
typedef struct
{
char departement[TAILLE_NOM_DEPARTEMENT];
int nbP;
char responsable[TAILLE_NOM_RESPONSABLE];
} Dep;
typedef struct maillonDept{
Dep* dept;

@ -0,0 +1,130 @@
#include "src/logique/formation/tab_iut.h"
int indiceVilleInsertion(VilleIUT *tab[], char *nomVille, int nb)
{
int inf=0, sup=nb-1, m;
while(inf<=sup)
{
m=(inf+sup)/2;
int cmp = strcmp(tab[m]->ville, nomVille);
if(cmp==0)
return m;
else if(cmp < 0)
inf=m+1;
else sup=m-1;
}
return inf;
}
void insererVilleIUT(VilleIUT* tab[], int nbVilles, int nbmax, VilleIUT* iut) {
if (nbVilles == nbmax)
fatal(TABLEAU_PLEIN, "Le tableau des villes est plein");
int idx = indiceVilleInsertion(tab, iut->ville, nbVilles);
for (int i = nbVilles; i > idx; i--)
tab[i] = tab[i - 1];
tab[idx] = iut;
}
int chargerVillesIUT(char* nomFich, VilleIUT *tab[], int nbmax)
{
FILE *fe = fopen(nomFich, "r");
if(fe==NULL)
fatal(OUVERTURE_FICHIER, "Impossible de lire le fichier des formations");
int i = 0;
VilleIUT* vi;
vi=lireVilleIUT(fe);
while(!feof(fe))
{
if(i==nbmax)
{
fclose(fe);
fatal(TABLEAU_PLEIN, "Plus assez de place dans le tableau des formations !");
}
insererVilleIUT(tab, i, nbmax, vi);
i=i+1;
vi=lireVilleIUT(fe);
}
fclose(fe);
return i;
}
void libererVillesIUT(VilleIUT *tab[], int nb)
{
for(int i=0; i<nb; i++)
free(tab[i]);
}
void sauvegarderVilleIUT(VilleIUT* iut, FILE* f) {
fprintf(f, "%s\n%d\n", iut->ville, longueurLD(iut->ldept));
Dep* dep;
ListeDept ldept = iut->ldept;
while (!(videLD(ldept))) {
dep = teteLD(ldept);
fprintf(f, "%s\n%d\n%s\n", dep->departement, dep->nbP, dep->responsable);
ldept = queueLD(ldept);
}
}
int sauvegarderVillesIUT(char* nomFich, VilleIUT *tab[], int nb)
{
FILE *fe = fopen(nomFich, "w");
if(fe==NULL)
return -1; //TODO : code erreur
for(int i=0; i<nb; i++)
{
sauvegarderVilleIUT(tab[i], fe);
}
fclose(fe);
return 0; //TODO : code erreur
}
int indiceVille(VilleIUT *tab[], char *nomVille, int nb)
{
int inf=0, sup=nb-1, m;
while(inf<=sup)
{
m=(inf+sup)/2;
int cmp = strcmp(tab[m]->ville, nomVille);
if(cmp==0)
{
return m;
}
else if(cmp < 0)
inf=m+1;
else sup=m-1;
}
return -1;
}
VilleIUT* creerVilleIUT(VilleIUT *tab[], int nbVilles, int nbmax, char *nomVille, bool* existe) {
int idx = indiceVille(tab, nomVille, nbVilles);
if (idx != -1) {
*existe = true;
return tab[idx];
}
if (nbVilles == nbmax)
fatal(TABLEAU_PLEIN, "Le tableau des iuts est plein !");
*existe = false;
VilleIUT* iut = (VilleIUT*) malloc(sizeof(VilleIUT));
if (iut == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc une nouvelle VilleIUT");
strcpy(iut->ville, nomVille);
iut->ldept = listeDeptNouv();
insererVilleIUT(tab, nbVilles, nbmax, iut);
return iut;
}
bool villeExiste(VilleIUT* tab[], char* nomVille, int nbVilles) {
return indiceVille(tab, nomVille, nbVilles) != -1;
}
VilleIUT* trouverVille(VilleIUT* tab[], char* nomVille, int nbVilles) {
int idx = indiceVille(tab, nomVille, nbVilles);
if (idx == -1) return NULL;
return tab[idx];
}

@ -0,0 +1,17 @@
#ifndef tab_iut_h
#define tab_iut_h
#include "src/logique/formation/ville_iut.h"
#include <stdbool.h>
int chargerVillesIUT(char* nomFich, VilleIUT *tab[], int nbmax);
int sauvegarderVillesIUT(char* nomFich, VilleIUT *tab[], int nb);
void libererVillesIUT(VilleIUT *tab[], int nb);
int indiceVille(VilleIUT *tab[], char *nomVille, int nb);
bool villeExiste(VilleIUT* tab[], char* nomVille, int nb);
VilleIUT* trouverVille(VilleIUT* tab[], char* nomVille, int nb);
VilleIUT* creerVilleIUT(VilleIUT *tab[], int nbVilles, int nbmax, char *nomVille, bool* existe);
#endif

@ -1,155 +1,43 @@
#include "ville_iut.h"
#include "src/logique/formation/ville_iut.h"
#include "src/logique/formation/liste_dept.h"
struct villeIUT {
char ville[TAILLE_NOM_VILLE];
ListeDept ldept;
};
VilleIUT* lireVilleIUT(FILE *fe)
{
VilleIUT* vi = (VilleIUT*) malloc(sizeof(VilleIUT));
if (vi == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc une nouvelle VilleIUT");
int nbIut = 0;
vi->ldept = listeDeptNouv();
fscanf(fe, "%s", vi->ville);
fscanf(fe, "%d", &nbIut);
for(int i=0; i<nbIut; i++)
{
Dep* d = (Dep *) malloc(sizeof(Dep));
if (d == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau Departement.");
fscanf(fe, "%s", d->departement);
fscanf(fe, "%d%*c", &d->nbP);
fgets(d->responsable, 30, fe);
d->responsable[strlen(d->responsable) - 1] = '\0';
vi->ldept=insererLD(vi->ldept, d);
}
return vi;
}
int indiceVilleInsertion(VilleIUT *tab[], char *nomVille, int nb)
{
int inf=0, sup=nb-1, m;
while(inf<=sup)
{
m=(inf+sup)/2;
int cmp = strcmp(tab[m]->ville, nomVille);
if(cmp==0)
return m;
else if(cmp < 0)
inf=m+1;
else sup=m-1;
}
return inf;
}
void insererVilleIUT(VilleIUT* tab[], int nbVilles, int nbmax, VilleIUT* iut) {
if (nbVilles == nbmax)
fatal(TABLEAU_PLEIN, "Le tableau des villes est plein");
int idx = indiceVilleInsertion(tab, iut->ville, nbVilles);
for (int i = nbVilles; i > idx; i--)
tab[i] = tab[i - 1];
tab[idx] = iut;
}
int chargerVillesIUT(char* nomFich, VilleIUT *tab[], int nbmax)
{
FILE *fe = fopen(nomFich, "r");
if(fe==NULL)
fatal(OUVERTURE_FICHIER, "Impossible de lire le fichier des formations");
int i = 0;
VilleIUT* vi;
vi=lireVilleIUT(fe);
while(!feof(fe))
{
if(i==nbmax)
{
fclose(fe);
fatal(TABLEAU_PLEIN, "Plus assez de place dans le tableau des formations !");
}
insererVilleIUT(tab, i, nbmax, vi);
i=i+1;
vi=lireVilleIUT(fe);
}
fclose(fe);
return i;
ListeDept* getDepartements(VilleIUT* iut) {
return iut->ldept;
}
void libererVillesIUT(VilleIUT *tab[], int nb)
{
for(int i=0; i<nb; i++)
free(tab[i]);
Dep* getDepartement(VilleIUT* iut, char* nomDept) {
return trouverDepartement(iut->ldept, nomDept);
}
void sauvegarderVilleIUT(VilleIUT* iut, FILE* f) {
fprintf(f, "%s\n%d\n", iut->ville, longueurLD(iut->ldept));
Dep* dep;
ListeDept ldept = iut->ldept;
while (!(videLD(ldept))) {
dep = teteLD(ldept);
fprintf(f, "%s\n%d\n%s\n", dep->departement, dep->nbP, dep->responsable);
ldept = queueLD(ldept);
}
char* getNomVille(VilleIUT* iut) {
return iut->ville;
}
int sauvegarderVillesIUT(char* nomFich, VilleIUT *tab[], int nb)
{
FILE *fe = fopen(nomFich, "w");
if(fe==NULL)
return -1; //TODO : code erreur
for(int i=0; i<nb; i++)
{
sauvegarderVilleIUT(tab[i], fe);
}
fclose(fe);
return 0; //TODO : code erreur
VilleIUT* nouvVilleIUT(char* nomVille) {
VilleIUT* vi = (VilleIUT*) malloc(sizeof(VilleIUT));
if (vi == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc une nouvelle VilleIUT");
vi->ldept = listeDepNouv();
return vi;
}
int indiceVille(VilleIUT *tab[], char *nomVille, int nb)
{
int inf=0, sup=nb-1, m;
while(inf<=sup)
{
m=(inf+sup)/2;
int cmp = strcmp(tab[m]->ville, nomVille);
if(cmp==0)
{
return m;
}
else if(cmp < 0)
inf=m+1;
else sup=m-1;
VilleIUT* lireVilleIUT(FILE* fe) {
char nomVille[TAILLE_NOM_VILLE];
fscanf(fe, "%s", nomVille);
VilleIUT* vi = nouvVilleIUT(nomVille);
int nbIut = 0;
fscanf(fe, "%d", &nbIut);
for (int i = 0; i < nbIut; i++) {
Dep* d = lireDepartement(fe);
vi->ldept = insererLD(vi->ldept, d);
}
return -1;
return vi;
}
VilleIUT* creerVilleIUT(VilleIUT *tab[], int nbVilles, int nbmax, char *nomVille, bool* existe) {
int idx = indiceVille(tab, nomVille, nbVilles);
if (idx != -1) {
*existe = true;
return tab[idx];
}
if (nbVilles == nbmax)
fatal(TABLEAU_PLEIN, "Le tableau des iuts est plein !");
*existe = false;
VilleIUT* iut = (VilleIUT*) malloc(sizeof(VilleIUT));
if (iut == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc une nouvelle VilleIUT");
strcpy(iut->ville, nomVille);
iut->ldept = listeDeptNouv();
insererVilleIUT(tab, nbVilles, nbmax, iut);
return iut;
}
bool villeExiste(VilleIUT* tab[], char* nomVille, int nbVilles) {
return indiceVille(tab, nomVille, nbVilles) != -1;
}
VilleIUT* trouverVille(VilleIUT* tab[], char* nomVille, int nbVilles) {
int idx = indiceVille(tab, nomVille, nbVilles);
if (idx == -1) return NULL;
return tab[idx];
}

@ -1,27 +1,19 @@
#include "liste_dept.h"
#include "iut.h"
#include "../erreur.h"
#ifndef ville_iut_h
#define ville_iut_h
#define TAILLE_NOM_VILLE 31
typedef struct {
char ville[TAILLE_NOM_VILLE];
ListeDept ldept;
} VilleIUT;
#include "src/logique/erreur.h"
#include "src/logique/formation/liste_dept.h"
#define TAILLE_NOM_VILLE 31
int chargerVillesIUT(char* nomFich, VilleIUT *tab[], int nbmax);
int sauvegarderVillesIUT(char* nomFich, VilleIUT *tab[], int nb);
void libererVillesIUT(VilleIUT *tab[], int nb);
struct villeIUT;
typedef struct villeIUT VilleIUT;
ListeDept* getDepartements(VilleIUT* iut);
Dep* getDepartement(VilleIUT* iut, char* nomDept);
char* getNomVille(VilleIUT* iut);
int indiceVille(VilleIUT *tab[], char *nomVille, int nb);
bool villeExiste(VilleIUT* tab[], char* nomVille, int nb);
VilleIUT* trouverVille(VilleIUT* tab[], char* nomVille, int nb);
VilleIUT* creerVilleIUT(VilleIUT *tab[], int nbVilles, int nbmax, char *nomVille, bool* existe);
VilleIUT* nouvVilleIUT(char* nomVille);
VilleIUT* lireVilleIUT(FILE *fe);
#endif

@ -0,0 +1,89 @@
#include "src/logique/recrutement/admissions.h"
struct resultatsAdmission {
/**
* Le nombre de places restant disponnibles dans le département.
* */
int* nbPlacesDispo;
/**
* La place minimum dans la file d'attente qu'il faut pour que les candidats
* en attente puissent être accepté par l'iut.
* */
int placeMinimumFAAdmis;
/**
* Contient la liste des candidats acceptés par l'iut.
* NOTE: lorsque le candidat refuse la proposition, il est supprimé de la liste.
* La taille de cette liste ne peut dépasser le nombre de places du département.
* */
ListeProfil accepte;
/**
* File des profil en attente.
* Lorsqu'un candidat accepte une proposition, son profil est supprimé de toutes les files d'attentes.
* */
FileProfil attente;
};
FILE* ouvrirFichierResultats(char* emplacement, char* nomVille, char* nomDep, char* prefix) {
char* fileName = (char*) malloc(sizeof(char) * (strlen(emplacement)
+ 1
+ strlen(prefix)
+ strlen(nomVille)
+ 1
+ strlen(nomDep)));
strcpy(fileName, emplacement);
strcat(fileName, "/");
strcat(fileName, prefix);
strcat(fileName, nomVille);
strcat(fileName, "_");
strcat(fileName, nomDep);
FILE* f = fopen(fileName, "w");
if (f == NULL) {
fprintf(stderr, "Impossible d'ouvrir le fichier %s en ecriture.", fileName);
exit(OUVERTURE_FICHIER);
}
return f;
}
void sauvegarderResultatsAdmission(ResultatsAdmission* resultats, char* emplacement, char* nomVille, char* nomDept) {
FILE* accepte = ouvrirFichierResultats(emplacement, nomVille, nomDept, "accepte_");
FILE* attente = ouvrirFichierResultats(emplacement, nomVille, nomDept, "attente_");
/*int placeEnAttente = 0;
while (!videLP(resultat)) {
Profil* p = teteLP(resultat);
int id = p->id;
switch (*p->decision) {
case ACCEPTE:
fprintf(accepte, "%d\n", id);
break;
case EN_ATTENTE:
fprintf(attente, "%d %d\n", id, ++placeEnAttente);
break;
}
resultat = queueLP(resultat);
}*/
fclose(accepte);
fclose(attente);
}
ResultatsAdmission* lireResultatsAdmission(char* emplacement, char* nomVille, char* nomDept, int* nbPlacesDispo) {
return NULL;
}
ResultatsAdmission* nouvResultatsAdmissions(int* nbPlacesDispo, int placeMinimumFAAdmis) {
ResultatsAdmission* admissions = (ResultatsAdmission*) malloc(sizeof(ResultatsAdmission));
admissions->placeMinimumFAAdmis = placeMinimumFAAdmis;
admissions->nbPlacesDispo = nbPlacesDispo;
admissions->accepte = nouvListeProfil();
admissions->attente = nouvFileProfil();
return admissions;
}
bool mettreEnAttente(ResultatsAdmission* adm, Profil* p) {
return false;
}
bool transfererVersAcceptes(ResultatsAdmission* adm, Profil* p) {
return false;
}

@ -0,0 +1,24 @@
#ifndef admissions_h
#define admissions_h
#include "src/logique/recrutement/profil.h"
#include "src/logique/recrutement/file_profil.h"
#include "src/logique/recrutement/liste_profil.h"
/**
* Definit une structure représentant le résultat des decisons du centre d'examen de l'iut
* du département d'un IUT.
* */
struct resultatsAdmission;
typedef struct resultatsAdmission ResultatsAdmission;
void sauvegarderResultatsAdmission(ResultatsAdmission* resultats, char* emplacement, char* nomVille, char* nomDept);
ResultatsAdmission* lireResultatsAdmission(char* emplacement, char* nomVille, char* nomDept, int* nbPlacesDispo);
ResultatsAdmission* nouvResultatsAdmissions(int* nbPlacesDispo, int placeMinimumFAAdmis);
bool mettreEnAttente(ResultatsAdmission* adm, Profil* p);
bool transfererVersAcceptes(ResultatsAdmission* adm, Profil* p);
#endif

@ -0,0 +1,31 @@
#include "src/logique/recrutement/file_profil.h"
FileProfil nouvFileProfil() {
return NULL;
}
bool videFP(FileProfil* fp) {
return *fp == NULL;
}
void offerProfil(FileProfil* fp, Profil* p) {
MaillonProfil* mp = (MaillonProfil*)malloc(sizeof(MaillonProfil));
if (mp == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc un nouveau maillon profil.");
mp->profil = p;
mp->suiv = *fp;
*fp = mp;
}
Profil* pollProfil(FileProfil* fp) {
if (videFP(fp))
return NULL;
MaillonProfil* tete = (*fp)->suiv;
Profil* p = tete->profil;
free(tete);
return p;
}
void freeFileProfil(FileProfil* fp) {
while (pollProfil(fp) != NULL);
}

@ -0,0 +1,17 @@
#include "src/logique/recrutement/profil.h"
/**
* Définit une File FIFO de profils
* */
typedef MaillonProfil* FileProfil;
FileProfil nouvFileProfil();
bool videFP(FileProfil* fp);
void offerProfil(FileProfil* fp, Profil* p);
Profil* pollProfil(FileProfil* fp);
void freeFileProfil(FileProfil* fp);

@ -0,0 +1,108 @@
#include "src/logique/recrutement/profil.h"
ListeProfil nouvListeProfil() {
return NULL;
}
void freeListeProfil(ListeProfil* lp) {
while (!videLP(lp)) {
free(aux);
aux = queueLP(aux);
}
}
void ajouterProfils(ListeProfil* lp, Candidature* candid, VilleIUT* iut, Dep* dept) {
ListeVoeux* lv = &candid->voeuxs;
while (!videLV(lv)) {
Voeux* v = teteLV(lv);
if (strcmp(v->nomVille, iut->ville) == 0 && strcmp(v->departement, dept->departement) == 0) {
ajouterProfil(lp, nouvProfil(candid->candidat->identifiant, candid->dossier, &v->decisionJury));
}
lv = queueLV(lv);
}
}
ListeProfil extraireProfils(ListeCandidature* lc, VilleIUT* iut, Dep* dept) {
ListeProfil lp = nouvListeProfil();
while (!videLCa(lc)) {
Candidature* candid = teteLCa(lc);
ajouterProfils(&lp, candid, iut, dept);
lc = queueLCa(lc);
}
return lp;
}
Profil* trouverProfil(ListeProfil* lp, int id) {
while (!videLP(lp)) {
Profil* p = teteLP(lp);
if (getID(p) == id)
return p;
lp = queueLP(lp);
}
return NULL;
}
bool videLP(ListeProfil* lp) {
return *lp == NULL;
}
Profil* teteLP(ListeProfil* lp) {
return (*lp)->profil;
}
ListeProfil* queueLP(ListeProfil* lp) {
return &(*lp)->suiv;
}
void ajouterProfil(ListeProfil* lp, Profil* p) {
MaillonProfil* mp = (MaillonProfil*) malloc(sizeof(MaillonProfil));
if (mp == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau MaillonProfil");
ListeProfil* pos = lp; //recherche du maillon avec une note inférieure à la note du profil en ajout.
while (!videLP(pos)) {
if (teteLP(pos)->note <= p->note)
break;
pos = queueLP(pos);
}
mp->profil = p;
mp->suiv = *pos;
*pos = mp;
}
bool supprimerProfil(ListeProfil* lp, int id) {
if (videLP(lp))
return false;
MaillonProfil** pos = NULL;
ListeProfil* aux = lp;
//recherche du maillon avec une note inférieure à la note du profil en ajout.
while (!videLP(aux)) {
if (teteLP(aux)->id == id) {
pos = aux;
break;
}
aux = queueLP(aux);
}
if (pos == NULL)
return false;
*aux = (*aux)->suiv;
free(*aux);
return true;
}
void trierLP(ListeProfil* lp) {
if (videLP(lp))
return;
ListeProfil* aux = lp;
MaillonProfil* max = *aux;
while (!videLP(aux)) {
if ((*aux)->profil->note > max->profil->note)
max = *aux;
aux = queueLP(aux);
}
//le contennu de la tete de la liste echange avec le contenu du maillon maximum
MaillonProfil aux2 = *max;
*max = **lp;
**lp = aux2;
trierLP(queueLP(lp));
}

@ -0,0 +1,36 @@
#ifndef liste_profil_h
#define liste_profil_h
#include "src/logique/recrutement/profil.h"
#include "src/logique/formation/liste_dept.h"
#include "src/logique/candidature/liste_candidature.h"
#include "src/logique/formation/ville_iut.h"
/**
* Définit une Liste chainée triée par ordre décroissant sur la note de chaque profil.
* */
typedef MaillonProfil* ListeProfil;
ListeProfil nouvListeProfil();
void freeListeProfil(ListeProfil* lp);
ListeProfil extraireProfils(ListeCandidature* lc, VilleIUT* iut, Dep* dept);
Profil* trouverProfil(ListeProfil* lp, int id);
bool videLP(ListeProfil* lp);
Profil* teteLP(ListeProfil* lp);
ListeProfil* queueLP(ListeProfil* lp);
void ajouterProfil(ListeProfil* lp, Profil* p);
bool supprimerProfil(ListeProfil* lp, int id);
void trierLP(ListeProfil* lp);
#endif

@ -1,108 +1,51 @@
#include "src/logique/candidature/candidature.h"
#include "src/logique/recrutement/profil.h"
ListeProfil nouvListeProfil() {
return NULL;
}
struct profil {
int id; //l'identifiant du candidat
Dossier* dossier; //le dossier scolaire du candidat
int* decision; //La décision prise par le jury, pointeur vers Voeux#decisionJury
float note; //la note attribuée par le jury pour ce profil.
};
void ajouterProfils(ListeProfil* lp, Candidature* candid, VilleIUT* iut, Dep* dept) {
ListeVoeux* lv = &candid->voeuxs;
while (!videLV(lv)) {
Voeux* v = teteLV(lv);
if (strcmp(v->nomVille, iut->ville) == 0 && strcmp(v->departement, dept->departement) == 0) {
Profil* profil = (Profil*) malloc(sizeof(Profil));
if (profil == NULL)
fatal(ERREUR_MEMOIRE, "Impossible de malloc un nouveau profil");
profil->id = candid->candidat->identifiant;
profil->dossier = candid->dossier;
profil->decision = &v->decisionJury;
profil->note = -1;
ajouterProfil(lp, profil);
}
lv = queueLV(lv);
}
}
ListeProfil extraireProfils(ListeCandidature* lc, VilleIUT* iut, Dep* dept) {
ListeProfil lp = nouvListeProfil();
while (!videLCa(lc)) {
Candidature* candid = teteLCa(lc);
ajouterProfils(&lp, candid, iut, dept);
lc = queueLCa(lc);
}
return lp;
Profil* nouvProfil(int id, Dossier* dossier, int* decision) {
Profil* p = (Profil*) malloc(sizeof(Profil));
if (p == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau profil");
p->id = id;
p->dossier = dossier;
p->decision = decision;
p->note = -1;
return p;
}
Profil* trouverProfil(ListeProfil* lp, int id) {
while (!videLP(lp)) {
Profil* p = teteLP(lp);
if (p->id == id)
return p;
lp = queueLP(lp);
}
return NULL;
}
bool videLP(ListeProfil* lp) {
return *lp == NULL;
}
Profil* teteLP(ListeProfil* lp) {
return (*lp)->profil;
int getIDProfil(Profil* p) {
return p->id;
}
ListeProfil* queueLP(ListeProfil* lp) {
return &(*lp)->suiv;
Dossier* getDossierProfil(Profil* p) {
return p->dossier;
}
void ajouterProfil(ListeProfil* lp, Profil* p) {
MaillonProfil* mp = (MaillonProfil*) malloc(sizeof(MaillonProfil));
if (mp == NULL)
fatal(ERREUR_MEMOIRE, "impossible de malloc un nouveau MaillonProfil");
ListeProfil* pos = lp; //recherche du maillon avec une note inférieure à la note du profil en ajout.
while (!videLP(pos)) {
if (teteLP(pos)->note <= p->note)
break;
pos = queueLP(pos);
}
mp->profil = p;
mp->suiv = *pos;
*pos = mp;
int getDecision(Profil* p) {
return *p->decision;
}
bool supprimerProfil(ListeProfil* lp, int id) {
if (videLP(lp))
return false;
MaillonProfil** pos = NULL;
ListeProfil* aux = lp;
//recherche du maillon avec une note inférieure à la note du profil en ajout.
while (!videLP(aux)) {
if (teteLP(aux)->id == id) {
pos = aux;
break;
}
aux = queueLP(aux);
}
if (pos == NULL)
return false;
*aux = (*aux)->suiv;
free(*aux);
return true;
void setDecision(Profil* p, int decision) {
if (decision != REFUSE && decision != EN_ATTENTE && decision != ACCEPTE)
fatal(ARGUMENT_INVALIDE, "impossible de set une decision sur le profil: type de décision inconnu.");
*p->decision = decision;
}
void trierLP(ListeProfil* lp) {
if (videLP(lp))
return;
float getNote(Profil* p) {
return p->note;
}
ListeProfil* aux = lp;
MaillonProfil* max = *aux;
while (!videLP(aux)) {
if ((*aux)->profil->note > max->profil->note)
max = *aux;
aux = queueLP(aux);
}
//le contennu de la tete de la liste echange avec le contenu du maillon maximum
MaillonProfil aux2 = *max;
*max = **lp;
**lp = aux2;
trierLP(queueLP(lp));
void setNote(Profil* p, float note) {
if (note < 0 || note > 20)
fatal(ARGUMENT_INVALIDE, "impossible de set une note sur le profil: la note est en dehors des limites ([0;20])");
p->note = note;
}

@ -1,36 +1,35 @@
#ifndef profil_h
#define profil_h
#include "src/logique/candidature/candidature.h"
#include "src/logique/candidature/dossier.h"
#include "src/logique/candidature/voeux.h"
#include <stdbool.h>
typedef struct {
int id; //l'identifiant du candidat
Dossier* dossier; //le dossier scolaire du candidat
int* decision; //La décision prise par le jury, pointeur vers Voeux#decisionJury
float note; //la note attribuée par le jury pour ce profil.
} Profil;
/**
* Définit la structure d'un profil soumit à examen.
* */
struct profil;
typedef struct profil Profil;
/**
* Définit une liste chainée triée par ordre décroissant sur la note de chaque profil.
* Definit un maillon contenant un profil.
* */
typedef struct maillonProfil {
Profil* profil;
struct maillonProfil* suiv;
} MaillonProfil, *ListeProfil;
ListeProfil nouvListeProfil();
ListeProfil extraireProfils(ListeCandidature* lc, VilleIUT* iut, Dep* dept);
Profil* trouverProfil(ListeProfil* lp, int id);
bool videLP(ListeProfil* lp);
} MaillonProfil;
Profil* teteLP(ListeProfil* lp);
ListeProfil* queueLP(ListeProfil* lp);
Profil* nouvProfil(int id, Dossier* dossier, int* decision);
void ajouterProfil(ListeProfil* lp, Profil* p);
bool supprimerProfil(ListeProfil* lp, int id);
//getters et setters
int getIDProfil(Profil* p);
Dossier* getDossierProfil(Profil* p);
int getDecision(Profil* p);
void setDecision(Profil* p, int decision);
float getNote(Profil* p);
void setNote(Profil* p, float note);
void trierLP(ListeProfil* lp);
#endif

@ -1 +1 @@
2 <- 0 = phase de candidature, 1 = phase d'examen des voeuxs, 2 = phase de consultation des résultats.
0 <- 0 = phase de candidature, 1 = phase d'examen des voeuxs, 2 = phase de consultation des résultats.