---++ Soluzione dell'HomeWork1 * Vedi anche HomeWork1, DomandeHomework1, RisultatiHomework1. Ho messo in linea gli esercizi da voi [[http://twiki.dsi.uniroma1.it/~andrea/Prog1_AA0304][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*) <blockquote style="background:lightgray"> <verbatim> #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; } </verbatim> </blockquote> ---+++ 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". <blockquote style="background:lightgray"> <verbatim> #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; } </verbatim> </blockquote> -- Users.AndreaSterbini - 10 Oct 2003 * Set ALLOWTOPICCHANGE = Users.DocentiProg1Group
This topic: Programmazione1/AA0506/PZ
>
WebHome
>
DomandeHomework1
>
SoluzioneHomework1
Topic revision: r4 - 2003-10-28 - AndreaSterbini
Copyright © 2008-2025 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki?
Send feedback