You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
268 lines
6.5 KiB
268 lines
6.5 KiB
#include "../header/sae.h"
|
|
|
|
/**
|
|
* @brief Charge les données d'un fichier dans un tableau de pointeur de VilleIut
|
|
* @param nomFichier [CHAINE DE CARACTERES] Nom du fichier contenant les données
|
|
* @param nbIut [POINTEUR - Taille Logique] Nombre d'IUT
|
|
* @param nbMax [POINTEUR - Taille Physique Dynamique]
|
|
* @return Tableau de pointeur de VilleIut rempli avec les données du fichier
|
|
*/
|
|
VilleIut ** chargeIutDon(char nomFichier[], int * nbIut, int * nbMax)
|
|
{
|
|
FILE * fichier;
|
|
VilleIut ** tIut;
|
|
int i = 0;
|
|
|
|
fichier = fopen(nomFichier, "r");
|
|
|
|
if (fichier == NULL)
|
|
{
|
|
printf("Error: Ouverture du fichier %s impossible\n", nomFichier);
|
|
exit(1);
|
|
}
|
|
|
|
// Si tout s'est bien passé dans l'ouverture de fichier
|
|
|
|
tIut = initialiseTabIut();
|
|
|
|
*nbMax = 5;
|
|
|
|
i = 0;
|
|
while (!feof(fichier))
|
|
{
|
|
// Taille max atteinte ?
|
|
if (i+1 == *nbMax)
|
|
{
|
|
tailleSupTabIut(tIut, nbMax); // Augmentation de la taille avec un realloc
|
|
}
|
|
|
|
tIut[i] = lireIut(fichier); // Lecture d'un IUT
|
|
|
|
i++;
|
|
}
|
|
|
|
*nbIut = i-1;
|
|
fclose(fichier);
|
|
return tIut;
|
|
}
|
|
|
|
/**
|
|
* @brief Initialise un tableau de pointeur de VilleIut
|
|
* @return Tableau de pointeur de VilleIut
|
|
*/
|
|
VilleIut ** initialiseTabIut(void)
|
|
{
|
|
VilleIut ** tIut = (VilleIut **) malloc(sizeof(VilleIut *)*5);
|
|
|
|
if (tIut == NULL)
|
|
{
|
|
printf("Error: Probleme d'allocation dynamique du tableau\n");
|
|
exit(1);
|
|
}
|
|
|
|
return tIut;
|
|
}
|
|
|
|
/**
|
|
* @brief Augmente la taille d'un tableau de pointeur de VilleIut
|
|
* @param tIut Tableau de pointeur de VilleIut
|
|
* @param nbMax [POINTEUR - Taille Physique Dynamique] Nouvelle taille max
|
|
*/
|
|
void tailleSupTabIut(VilleIut ** tIut, int *nbMax)
|
|
{
|
|
VilleIut **aux;
|
|
|
|
*nbMax+=5;
|
|
aux = (VilleIut **) realloc(tIut, *nbMax);
|
|
if (aux == NULL)
|
|
{
|
|
printf("Error : Probleme de realloc\n");
|
|
exit(1);
|
|
}
|
|
|
|
tIut = aux;
|
|
}
|
|
|
|
/**
|
|
* @brief Lit les données d'un IUT dans un fichier et les stocke dans une VilleIut
|
|
* @param fichier [FICHIER] Données de l'IUT
|
|
* @return une VilleIut rempli avec les données lues
|
|
*/
|
|
VilleIut * lireIut (FILE * fichier)
|
|
{
|
|
VilleIut * iut;
|
|
|
|
iut = initialiseIut();
|
|
|
|
lectureIut(iut, fichier);
|
|
|
|
return iut;
|
|
}
|
|
|
|
/**
|
|
* @brief Initialise une VilleIut
|
|
* @return VilleIut initialisé
|
|
*/
|
|
VilleIut * initialiseIut(void)
|
|
{
|
|
VilleIut * iut;
|
|
|
|
iut = (VilleIut *)malloc(sizeof(VilleIut));
|
|
if (iut == NULL)
|
|
{
|
|
printf("Error : Probleme d'allocation dynamique de l'IUT\n");
|
|
exit(1);
|
|
}
|
|
|
|
return iut;
|
|
}
|
|
|
|
/**
|
|
* @brief Lit les données d'un IUT dans un fichier et les stocke dans une VilleIut
|
|
* @param iut [POINTEUR] Pointeur vers une VilleIut où stocker les données
|
|
* @param fichier [FICHIER] Données de l'IUT
|
|
*/
|
|
void lectureIut(VilleIut * iut, FILE * fichier)
|
|
{
|
|
fscanf(fichier, "%s", iut->nom);
|
|
|
|
iut->lDept = lireDep(fichier);
|
|
}
|
|
|
|
/**
|
|
* @brief Lit les données d'un département dans un fichier et les stocke dans une liste chaînée
|
|
* @param fichier [FICHIER] Données du département
|
|
* @return une liste chaînée contenant les données du département
|
|
*/
|
|
ListeDept lireDep(FILE * fichier)
|
|
{
|
|
ListeDept ldept;
|
|
|
|
ldept = initialiseDep();
|
|
|
|
lectureDep(ldept, fichier);
|
|
}
|
|
|
|
/**
|
|
* @brief Initialise une liste chaînée de départements
|
|
* @return la liste chaînée initialisée
|
|
*/
|
|
ListeDept initialiseDep(void)
|
|
{
|
|
ListeDept ldept = (MaillonDept *) malloc(sizeof(MaillonDept));
|
|
if (ldept == NULL)
|
|
{
|
|
printf("Erreur : Erreur de malloc ldept\n");
|
|
exit(1);
|
|
}
|
|
|
|
return ldept;
|
|
}
|
|
|
|
/**
|
|
* @brief Lit les données d'un département dans un fichier et les stocke dans une structure de Departement
|
|
* @param ldept Liste chaînée où stocker les données
|
|
* @param fichier [FICHIER] Données du département
|
|
*/
|
|
void lectureDep(ListeDept ldept, FILE * fichier)
|
|
{
|
|
// Lecture des données du département
|
|
fscanf(fichier, "%s %d ", ldept->nomDept, &ldept->nbP);
|
|
fgets(ldept->resp, 30, fichier);
|
|
ldept->resp[strlen(ldept->resp)-1] = '\0';
|
|
ldept->suiv = NULL;
|
|
}
|
|
|
|
/**
|
|
* @brief Fonction de test de chargement
|
|
*/
|
|
void testCharge(void)
|
|
{
|
|
int nbIut, nbMax;
|
|
VilleIut ** tIut = chargeIutDon("../donnees/iut.don", &nbIut, &nbMax);
|
|
fusionIut(tIut, &nbIut);
|
|
|
|
for (int i = 0; i < nbIut; i++)
|
|
{
|
|
printf("\nVille : %s\n", tIut[i]->nom);
|
|
afficherListe(tIut[i]->lDept);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Fusionne la liste de département de toutes les villes du même nom de tIut
|
|
*
|
|
* @param tIut Tableau de pointeur de VilleIut
|
|
* @param nbIut [Taille Logique]
|
|
*/
|
|
void fusionIut(VilleIut ** tIut, int *nbIut)
|
|
{
|
|
int indice;
|
|
|
|
for (int i = 0; i < *nbIut; i++)
|
|
{
|
|
if(existe(tIut[i]->nom, tIut, *nbIut, i, &indice))
|
|
{
|
|
fusion(tIut, *nbIut, i, indice);
|
|
(*nbIut)--;
|
|
i--;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @brief Verifie l'existance d'une VilleIut dans le tableau de pointeur de VilleIut
|
|
*
|
|
* @param nom [CHAINE DE CARACTERES]
|
|
* @param tIut Tableau de pointeur de VilleIut
|
|
* @param nbIut [Taille Logique]
|
|
* @param iDepart Indice à partir du quel rechercher
|
|
* @param indice Indice de la valeur si trouvée
|
|
* @return int 1 -> Trouvé | 0 -> Inexistante
|
|
*/
|
|
int existe(char * nom, VilleIut ** tIut, int nbIut, int iDepart, int * indice)
|
|
{
|
|
for (int i = iDepart+1; i < nbIut; i++)
|
|
{
|
|
if (strcmp(nom, tIut[i]->nom) == 0)
|
|
{
|
|
*indice = i;
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/**
|
|
* @brief Fusionne la liste de département de deux VilleIut du même nom
|
|
*
|
|
* @param tIut Tableau de pointeur de VilleIut
|
|
* @param nbIut [Taille Logique]
|
|
* @param i Indice liste d'accueil
|
|
* @param j Indice ville à supprimer
|
|
*/
|
|
void fusion(VilleIut ** tIut, int nbIut, int i, int j)
|
|
{
|
|
ListeDept aux;
|
|
aux = tIut[i]->lDept;
|
|
tIut[i]->lDept = tIut[j]->lDept;
|
|
tIut[i]->lDept->suiv = aux;
|
|
|
|
supprimerIut(tIut, nbIut, j);
|
|
}
|
|
|
|
/**
|
|
* @brief Supprime une ville du tableau de pointeur de VilleIut
|
|
*
|
|
* @param tIut Tableau de pointeur de VilleIut
|
|
* @param nbIut [Taille Logique]
|
|
* @param j Indice ville à supprimer
|
|
*/
|
|
void supprimerIut(VilleIut ** tIut, int nbIut, int j)
|
|
{
|
|
for (int i = j ; i < nbIut-1 ; i++)
|
|
{
|
|
tIut[i] = tIut[i+1];
|
|
}
|
|
} |