/*! \file q3.c

 *  \author EISTI
 *  \version 0.1
 *
 *  \brief recherche dichotomique dans un tableau trié
 *
 */

#include <stdio.h>

/*! \fn void afficheTab(int tailleT, int t[])
 *  \author EISTI
 *  \version 0.1
 *  \date Fri Jan 15 15:33:01 2010
 *
 *  \brief Affiche un tableau d'entiers
 *
 *  \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 dichoIter(int taille, int t[], int val)
 *  \author Peio Loubiere <peio.loubiere@eisti.fr> 
 *  \version 0.1
 *  \date Fri Jan 15 15:36:00 2010
 *
 *  \brief recherche dichotomique itérative
 *
 *  \param taille taille du tableau
 *  \param t[] tableau d'entiers
 *  \param val valeur à rechercher
 *
 *  \return indice de la valeur
 */

int dichoIter(int taille, int t[], int val) {

  int mil, deb, fin;
  deb = 0;
  fin = taille;

  while(deb<=fin){
    mil = (deb+fin)/2;
    if(t[mil]==val)
	return mil;
    else if (t[mil]>val)
	fin = mil-1;
    else
	deb = mil+1;
  }
  return (-2);

}


/*! \fn int dichoRec(int deb, int fin, int t[], int val)
 *  \author EISTI
 *  \version 0.1
 *  \date Fri Jan 15 15:30:39 2010
 *
 *  \brief recherche dichotomique recursive
 *
 *  \param deb indice de début
 *  \param fin indice de fin
 *  \param t[] Tableau d'entiers à parcourir
 *  \param val valeur recherchée
 *
 *  \return indice où se trouve la valeur
 */
int dichoRec(int deb, int fin, int t[], int val){

  int mil;
  mil = (deb+fin)/2;

  if(deb>fin){
    return -1;
  }else if(t[mil]==val){
	 return mil;
	}else if (t[mil]>=val){
	  return dichoRec(deb,mil-1,t,val);
	}else{
	  return dichoRec(mil+1,fin,t,val);
	}
}


/*! \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 tab[5],i,res;

  for(i=0;i<5;i++){
    printf("\nSaisissez la valeur de la case %d : ",i);
    scanf("%d",&tab[i]);
  }
  printf("\n Votre saisie : \n ");
  afficheTab(5,tab);
  printf("le %d se trouve en position %d\n",5, dichoIter(5,tab,5)+1);
  //printf("le %d se trouve en position %d\n",5, dichoRec(0,5,tab,5)+1);

  //Fin du programme, Il se termine normalement, et donc retourne 0
  return (EXIT_SUCCESS);
} 


