Soluzione dell'HomeWork1

Ho messo in linea gli esercizi da voi consegnati.

Questa è la mia (prolissa) soluzione.

  • Sicuramente si può fare di meglio smile
  • 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

Edit | Attach | Watch | Print version | History: r4 < r3 < r2 < r1 | Backlinks | Raw View | Raw edit | More topic actions
Topic revision: r4 - 2003-10-28 - AndreaSterbini






 
Questo sito usa cookies, usandolo ne accettate la presenza. (CookiePolicy)
Torna al Dipartimento di Informatica
This site is powered by the TWiki collaboration platform Powered by PerlCopyright © 2008-2024 by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TWiki? Send feedback