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