/*! \file q8.c

 *  \author EISTI
 *  \version 0.1
 *
 *  \brief normalise un tableau
 *
 */

#include <stdio.h>
#include <stdlib.h>
#define N 10

/*! \fn void afficheTab(int tailleT, int t[])
 *  \author EISTI
 *  \version 0.1
 *  \date Fri Jan 15 15:57:52 2010
 *
 *  \brief Affiche un tableau d'entier
 *
 *  \param tailleT taille du tableau
 *  \param t[] tableau à afficher
 *
 */
void afficheTab(int tailleT, int t[]) {

  int i;

  for(i=0;i<tailleT;i++){
    printf("| %d ",t[i]);
  }
  printf("|\n ");

}

/*! \fn int max(int tailleT, int t[])
 *  \author EISTI
 *  \version 0.1
 *  \date Fri Jan 15 16:01:05 2010
 *
 *  \brief Récupère la valeur maximum d'un tableau
 *
 *  \param tailleT taille du tableau
 *  \param t[] tableau d'entiers à parcourir
 *
 *  \return valeur maximale du tableau
 */

int max(int tailleT, int t[]) {

  int i,max;
  
  max = t[0];
  for(i=1;i<tailleT;i++){
    if(max<t[i])
      max=t[i];
  }
  return(max);
}


/*! \fn int min(int tailleT, int t[])
 *  \author EISTI
 *  \version 0.1
 *  \date Fri Jan 15 16:01:05 2010
 *
 *  \brief Récupère la valeur minimum d'un tableau
 *
 *  \param tailleT taille du tableau
 *  \param t[] tableau d'entiers à parcourir
 *
 *  \return valeur minimale du tableau
 */
int min(int tailleT, int t[]){
  int i,min;
  
  min = t[0];
  for(i=1;i<tailleT;i++){
    min = (min>t[i])?t[i]:min;
  }
  return(min);
}

/*! \fn void triCasier(int taille, int t[])
 *  \author EISTI
 *  \version 0.1
 *  \date Fri Jan 15 16:01:05 2010
 *
 *  \brief trie un tableau par la méthode des casiers
 *
 *  \param taille taille du tableau
 *  \param t[] tableau à trier
 *
 */
void triCasier(int taille, int t[]){

  int i, m, M, pos, tailleTmp, *tTemp;

	m = min(taille,t);//max du tableau
	M = max(taille,t);//min du tableau
	tailleTmp = (M-m)+1;//taille du tableau de nombre de chaque element
	
	tTemp = malloc(tailleTmp*sizeof(int)); //allocation de la memoire

	if(tTemp==NULL){// si l'allocation résussit
		// erreur d'allocation, on quitte le programme
		perror("Erreur d'allocation mémoire");
		exit(-1);
	}

	//initialisation à 0 du tableau de nombre de chaque element
	for(i=0;i<tailleTmp;i++){
		tTemp[i] = 0;
	}
	//on remplit le tableau de nombre de chaque element
	for(i=0;i<taille;i++){
		tTemp[t[i]-m]++;
	}

	pos=0;
	//remplissage trié du tableau
	for(i=0;i<tailleTmp;i++){
		while(tTemp[i]>0){
			t[pos] = m + i;
			tTemp[i]--;
			pos++;
		}
	}
}


/*! \fn int main (int argc, char** argv)
 *  \author EISTI
 *  \version 0.1
 *  \date Fri Jan 15 15:29:37 2010
 *
 *  \brief Fonction principale
 *
 *
 * \param argc : Nombre d'argument
 * \param argv : Tableau des arguments
 * \return 0 : le programme doit se terminer normalement
 *
 * \remarks 
 */
int main(int argc, char** argv){
  int t1[N],i;

  //saisie du 1er tableau
  for(i=0;i<5;i++){
    printf("\nSaisissez la valeur de la case %d : ",i);
    scanf("%d",&t1[i]);
  }

	//affichage des tableaux saisis
  printf("\n Votre saisie : \n ");
  afficheTab(5,t1);

  //tri casier
  triCasier(5,t1);
  printf("\n Résultat : \n ");
  // affichage du tableau trie
  afficheTab(5,t1);
	//quitte la fonction
	return (EXIT_SUCCESS);
}
