L'iterazione pre-condizionale (while ... )

Nell'iterazione a controllo in coda, poiché il controllo sulla condizione viene eseguito dopo le istruzioni che compongono il corpo del ciclo, è evidente che queste sono sempre eseguite almeno una volta. A volte accade che le istruzioni da ripetere non debbano essere eseguite neanche una volta, in questi casi è opportuno effettuare il controllo prima delle istruzioni del ciclo e ricorrere all'iterazione a controllo in testa.

Supponiamo di dover risolvere il seguente problema:

Nei pressi di una sorgente è collocata una cisterna destinata a raccogliere l'acqua sorgiva. La cisterna è riempita da un individuo che, utilizzando delle taniche, raccoglie l'acqua alla sorgente e la porta alla cisterna. Poiché la capacità delle taniche è variabile, e non si riesce a riempirle perfettamente, l'individuo non sa quanti viaggi dovrà fare per raggiungere il livello d'acqua richiesto nella cisterna. A complicare ulteriormente il calcolo interviene la quantità di acqua già presente nella cisterna al momento in cui si inizia il lavoro. Occorre aiutare l'addetto al rifornimento scrivendo un programma che gli consenta di controllare quando ha raggiunto o superato il livello d'acqua richiesto nella cisterna.

Un semplice programma per risolvere il problema e che utilizza l'iterazione a controllo in testa ed è il seguente:
#include 
#include         
#include 

int main()
{     // contenuto: quantità attuale di acqua
      // obiettivo: quantità desiderata di acqua
      // litri: quantità di acqua nella tanica
      int contenuto, obiettivo, litri;

      printf("Quantita' iniziale di acqua: ",contenuto);
      scanf("%d",&contenuto);
      printf("Quantita' desiderata di acqua: ",contenuto);
      scanf("%d",&obiettivo);
      int i=0;
      while (contenuto < obiettivo)
      {     printf("Viaggio %5d - Litri d'acqua nella tanica: ", ++i);
            scanf("%d", &litri);
            contenuto += litri;
      }
      printf ("Puo' bastare \n");
      printf ("Sono bastati %3d viaggi. Il livello e' ora di %5d l.\n", i, contenuto);
                           
      system("PAUSE");
      return 0;
}

Con l'uso dell'iterazione a controllo in testa è possibile controllare da subito che l'acqua nella cisterna non sia già sufficiente. Il comando che controlla l'esecuzione delle istruzioni da reiterare è

while (contenuto < obiettivo)

Osserviamo l'uso di un contatore i, che tiene traccia del numero di iterazioni effettuate (di conseguenza all'inizio deve essere 0), che ha il solo scopo di arricchire le informazioni per l'output. L'istruzione

printf("Viaggio %5d - Litri d'acqua nella tanica: ", ++i);
incrementa il valore della variabile prima di visualizzarlo (pre-incremento).

L'istruzione

int i=0;
ci consente di notare come il C permetta la dichiarazione delle variabili (con eventuale assegnazione del valore iniziale) non solo nella parte iniziale del codice, ma anche tra i comandi da eseguire. La visibilità della variabile, in questo caso, è limitata solo alle righe del blocco di codice racchiuso tra { e } in cui la dichiarazione è fatta (in pratica la variabile nel resto del programma non esiste e può essere dichiarata nuovamente). Questa possibilità fa emergere una serie di opportunità che vedremo negli esempi che seguiranno. Per ora è sufficiente studiare come il seguente codice:
#include 
#include 
#include 

int main()
{     int a;
      
      a = 5;
      {   int i = 2;
          i +=a;
          printf("i ora vale : %2d\n",i);
      }
      {   int i;
          i =a;
          printf("i ora vale : %2d\n",i);
      }
      system("PAUSE");
      return 0;
}
produca come output:
i ora vale :  7
i ora vale :  5
Premere un tasto per continuare . . . 

Scrivi email per il tutor dei corsi
Scrivi email per l'amministratore del sito

Torna all'indice del corso
Ultima modifica: 06/04/2010