Soluzione dell'HomeWork1
Ho messo in linea gli esercizi da voi
consegnati
.
Questa è la mia (prolissa) soluzione.
- Sicuramente si può fare di meglio
- Ho inserito delle stampe sul stderr che permettono di capire ciò che succede senza disturbare l'output (stdout)
#include <stdio.h>
#define MINVAL 0
#define MAXVAL 1000
int main (int argc, char * args[]) {
// definizione delle variabili
int min=MINVAL,
max=MAXVAL,
med,
risposta=0,
n=0;
// disattivo la bufferizzazione dell'output
setvbuf(stdout, NULL, _IONBF , 0);
// leggo minimo e massimo
scanf("%d%d",&min,&max);
// ripeto finchè ci sono almeno 2 valori nell'intervallo
while (min<max) {
// calcolo il punto medio
med = min---+((max-min)/2); // questo evita overflow inutili
// stampo su stderr dei messaggi informativi
fprintf(stderr, "Provo con: %d (%d,%d)\n",med,min,max);
// propongo il punto medio in output
printf("%d\n",med);
// leggo la risposta
scanf("%d",&risposta);
// a seconda della risposta
switch (risposta) {
// se il numero da indovinare è minore
case -1:
n---++; // conto il numero di tentativi
max=med-1; // aggiorno il massimo
break; // continuo il ciclo
// se il numero da indovinare è stato trovato!
case 0:
n---++; // conto il numero di tentativi
fprintf(stderr,"Trovato in %d mosse!\n",n);
return 0; // esco dalla funzione main (e quindi dal programma)
// se il numero da indovinare è maggiore
case 1:
n---++; // conto il numero di tentativi
min=med---+1; // aggiorno il minimo
break; // continuo il ciclo
// altrimenti
default:
// input errato
fprintf(stderr,"Rispondi solo -1, 0 o 1\n");
}
}
fprintf(stderr,"Dev'essere per forza %d (%d mosse)\n",min,n);
// se c'e' un solo valore lo propongo
printf("%d\n",min);
// e leggo la risposta
scanf("%d",&risposta);
// esco senza errori
return 0;
}
Soluzione "minima"
Questa seconda soluzione "minima" non usa l'istruzione
switch/case e chiarisce perchè ho insistito a leggere la riposta anche nel caso di un solo numero "papabile".
#include <stdio.h>
#define MINVAL 0
#define MAXVAL 1000
int main (int argc, char * args[]) {
int min=MINVAL, max=MAXVAL, med, risposta;
setvbuf(stdout, NULL, _IONBF , 0);
scanf("%d%d",&min,&max);
do {
med = min---+((max-min)/2);
printf("%d\n",med);
scanf("%d",&risposta);
if (risposta == -1) {
max=med-1;
} else {
min=med---+1;
}
} while (0 != risposta);
return 0;
}
--
AndreaSterbini - 10 Oct 2003