/**
 * @file main01.c
 * Projet sem03-td-C4
 * @author l'équipe pédagogique 
 * @version 1 14/12/05
 * @brief corrige du TD n°3 - Exercice 4
 * Structures de données et algorithmes - DUT1 Paris 5
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct {
  char* nom;
  int age;
} Personne;

/** 
 * @brief met tous les postes d'un tableau de pointeurs de Personne à 0
 * @param[in,out] personnes est le tableau à initialiser
 * @param[in] taille est le nombre de postes du tableau
 */
void initialiser(Personne** personnes, unsigned int taille) {
  unsigned int i;
  for (i = 0; i < taille; ++i)
    personnes[i] = 0;
}

/** 
 * @brief ajoute une Personne à un tableau de pointeurs de Personne
 *   l'indice de la personnes à ajouter est saisi et contrôlé
 * @param[in,out] personnes est le tableau
 * @param[in] taille est le nombre de postes du tableau
 */
void ajouter(Personne** personnes, unsigned int taille) {
  unsigned int i;
  printf("numéro de la personnes à ajouter : ");
  fflush(stdout);
  scanf("%d",&i);
  if (i < 0 || i >= taille || personnes[i] != 0)
    printf("indice non valable ou déjà affecté\n");
  else {
    char buffer[51];
    personnes[i] = (Personne*) malloc(sizeof(Personne));
  
    printf("nom : ");
    fflush(stdout);
    scanf("%50s", buffer);
    personnes[i]->nom = (char*) malloc(strlen(buffer) + 1);
    strcpy(personnes[i]->nom, buffer);
    printf("âge : ");
    fflush(stdout);
    scanf("%d", &personnes[i]->age);
  }
}

/** 
 * @brief affiche un tableau de pointeurs de Personne
 * @param[in] personnes est le tableau à afficher
 * @param[in] taille est le nombre de postes du tableau
 */
void afficher(Personne** personnes, unsigned int taille) {
  unsigned int i;
  for (i = 0; i < taille; ++i) {
    printf("[%d] ", i);
    if (personnes[i])
      printf("%s %d an(s)\n", personnes[i]->nom, personnes[i]->age);
    else
      printf("vide\n");
  }
  fflush(stdout);
}

/** 
 * @brief ôte une Personne d'un tableau de pointeurs de Personne
 *   l'indice de la personnes à ôter est saisi et contrôlé
 * @param[in,out] personnes est le tableau
 * @param[in] taille est le nombre de postes du tableau
 */
void oter(Personne** personnes, unsigned int taille) {
  unsigned int i;
  printf("numéro de la personnes à ôter : ");
  fflush(stdout);
  scanf("%d", &i);
  if (i<0 || i>= taille || personnes[i] ==0)
    printf("indice non valable ou non affecté\n");
  else {
    free(personnes[i]->nom);
    free(personnes[i]);
    personnes[i] = 0;
  }
}

/** 
 * @brief désalloue les postes d'un tableau de pointeurs de Personne
 * @param[in,out] personnes est le tableau
 * @param[in] taille est le nombre de postes du tableau
 */
void vider(Personne** personnes, unsigned int taille) {
  unsigned int i;
  for (i = 0; i < taille; ++i) {
    if (personnes[i]) {
      free(personnes[i]->nom);
      free(personnes[i]);
      personnes[i] = 0;
    }
  }
}

int main() {
  const int MAX_PERSONNES = 5;
  Personne* personnes[MAX_PERSONNES];

  initialiser(personnes, MAX_PERSONNES);
  int choix;
  do {
    printf("\n");
    printf("0: quitter\n");
    printf("1: afficher les personnes\n");
    printf("2: ajouter une personne\n");
    printf("3: supprimer une personne\n");
    fflush(stdout);
    scanf("%d", &choix);
    switch (choix) {
      case 1 : afficher(personnes, MAX_PERSONNES); break;
      case 2 : ajouter(personnes, MAX_PERSONNES); break;
      case 3 : oter(personnes, MAX_PERSONNES); break;
    }
  }
  while (choix != 0);
  vider(personnes, MAX_PERSONNES);
  return 0;
}
