1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
   | /*Comme strcmp: Retourne <0 si valeurATester est inférieur au nombre mystère,
>0 si valeurATester est supérieur au nombre mystère,
0 si égal.*/
int ComparerNombre(int valeurATester)
{
	int x;
	int saisieOK = 0;
	int resultat = 0;
	/*On saisit en boucle jusqu'à ce qu'on ait une valeur valide.*/
	do
	{
		printf("Est-il plus grand (1), plus petit (2) ou égal (3) à %d?\n", valeurATester);
		scanf("%d", &x);
		saisieOK = 1;
		switch(x)
		{
		case 1: 
			resultat = -1; /*Nombre mystère est plus grand -> valeurATester est plus petit*/
			break; 
		case 2:
			resultat = 1; /*Nombre mystère est plus petit -> valeurATester est plus grand*/
			break;
		case 3:
			resultat = 0; /*Nombre mysère est égal*/
			break;
		default:
			saisieOK = 0; /*Valeur inconnue*/
			getchar(); /*Pour éviter de reboucler si l'utilisateur a tapé une lettre*/
			break;
		}
	}
	while(!saisieOK);
	return resultat;
}
 
int TrouverDansIntervalle(int valeurMin, int valeurMax)
{
	int milieu = (valeurMax-valeurMin)/2 + valeurMin;
	int resCmp;
	if(milieu == valeurMin) /*peut arriver si valeurMax == valeurMin+1*/
		milieu = valeurMin+1; /*Pour éviter une recherche infinie*/
 
	printf("[Debug: Recherche dans [%d, %d], milieu est %d.]\n", valeurMin, valeurMax, milieu);
 
	resCmp = ComparerNombre(milieu);
	if(resCmp == 0)
		return milieu;
	else if(resCmp < 0) /*milieu est inférieur au nombre mystère, il faut donc rechercher dans la moitié supérieure*/
		return TrouverDansIntervalle(milieu, valeurMax);
	else /*milieu est supérieur au nombre mystère, il faut donc rechercher dans la moitié inférieure*/
		return TrouverDansIntervalle(valeurMin, milieu);
}
 
int main()
{
	int valeurTrouvee = TrouverDansIntervalle(0, 100);
	printf("C'est gagné, le chiffre mystère est %d \n", valeurTrouvee);
} | 
Partager