L'iterazione post-condizionale (do ... while)

L'iterazione a controllo in coda (do ... while ....)

Per comprendere il funzionamento del comando while, partiamo da un esempio e approfittiamo per scoprire qualche nuovo aspetto della programmazione in C.

Questa volta l'obiettivo è di indagare sul genere (sesso) degli individui che accedono in un particolare locale. Gli individui, passando, introducono da tastiera la loro età e poi scelgono il sesso di appartenenza. A fine giornata la raccolta dei dati è interrotta dall'immissione del valore 0 alla richiesta di introdurre l'età, e il programma restituisce il numero di visitatori maschi con la media delle età e il numero di visitatrici con la media delle età.

#include 
#include 
#include 

int main()
{   // Dichiarazione delle variabili
    int eta, sesso, sommam = 0, contam =0, sommaf = 0, contaf = 0;
    float mediam, mediaf;
    
    // Acquisizione dei dati
    do
    { printf("Età del visitatore: ");
      scanf("%d",&eta);
      if (eta)

         scanf("%d",&sesso);
         if (sesso == 1)
         { sommam += eta;
           contam++;
         }
         else
          {  sommaf += eta;
             contaf++;   
          }
      }
    }
    while (eta);
    
     // Calcolo dei valori richiesti
    mediam = sommam / (float)contam;
    mediaf = sommaf / (float)contaf;
    
    // Visualizzazione dei risultati
    printf(" I maschi sono %4d e la media della loro eta' e' : %5.2f \n", contam, mediam);
    printf("I femmine sono %4d e la media della loro eta' e' : %5.2f \n", contaf, mediaf);
 
    system("PAUSE");
    return 0;
}

Osserviamo subito il ciclo do .... while .... Tutto quello che è compreso tra la parentesi graffa aperta dopo il do e la parentesi graffa chiusa immediatamente prima di while (eta); è definito corpo del ciclo. L'esecutore rimane "intrappolato" tra queste due parentesi, ripetendo continuamente le istruzioni al loro interno, sin quando eta diventa falso (ricordiamo che, per il C, falso e zero sono la stessa cosa). L'immissione del valore 0 alla richiesta dell'età

scanf("%d",&eta);
causerà il salto delle istruzioni successive che sono subordinate al verificarsi della condizione controllata dall'istruzione:
if (eta) 
Successivamente è visualizzato un rudimentale menù di scelta
Genere visitatore
	1.Maschio
	2.Femmina
e il genere è acquisto, con l'istruzione
scanf("%d",&sesso);
attraverso l'indicazione del numero corrispondente (1 per maschio, per femmina).

Il controllo successivo sulla variabile immessa

if (sesso == 1)
consente l'esecuzione delle istruzioni
sommam += eta;
contam++;
se la variabile sesso è uguale a 1 (maschio), o delle istruzioni
sommaf += eta;
contaf++;  
se la variabile sesso non è uguale a 1 (femmina).

Possiamo subito fare delle interessanti considerazioni:
  • Il simbolo =, quando utilizzato nelle assegnazioni, non ha significato di uguaglianza in senso matematico ma di assegnazione verso sinistra del valore calcolato alla sua destra. Va quindi distinto dall'uguaglianza vera e propria verificata nel controlli che è quindi indicata con l'operatore ==.In queste istruzioni sono evidenti:
    • l'uso dell'operatore di assegnazione = per costruire un'espressione: sommam += eta e sommaf +=eta che aggiungono rispettivamente il valore della variabile eta a quello di sommam e di sommaf (si sarebbe potuto scrivere anche sommam = sommam + eta e sommaf = sommaf + eta);
    • 'uso dell'operaotre unario di incremento ++ che incrementa il valore dell'operando. contaf++ e contam++ incrementano di uno rispettivamente i valori delle variabili contaf e contam (avevamo già visto questo operatore con la stessa funzione nell'espressione i++ utilizzata nel controllo del ciclo for).

      Nota: l'operatore ++, negli esempi utilizzati finora, è stato sempre posto dopo il nome della variabile. In questo caso viene prima utilizzato il valore della variabile e poi se ne effettua l'incremento. Quando l'operatore precede la variabile l'incremento avviene prima dell'uso. In conseguenza di questo è evidente che le due espressioni a=b++ e a=++b, pur producendo lo stesso effetto su b, non assegnano ad a lo stesso valore.

Con le variabili contaf e contam e con le variabili sommaf e sommam abbiamo introdotto due concetti fondamentali della programmazione: quello di contatore e quello di accumulatore (o sommatore)

Il contatore è evidentemente una variabile che viene incrementata (solitamente di 1) ogni volta che si verifica un evento e indicherà, alla fine delle iterazioni, con il suo valore il numero di occorrenze dell'evento.

L'accumulatore (o sommatore) è invece una variabile destinata a contenere la somma di una serie di valori inseriti. É simile alla variabile contatore ma l'incremento può essere variabile.

É importante osservare che già al loro primo uso queste variabili devono avere un valore, è quindi opportuno inizializzarle prima di usarle (l'inizializzazione più frequente le vede poste a 0). Nel nostro esempio l'inizializzazione è avvenuta già in fase di dichiarazione con l'istruzione:

int eta, sesso, sommam = 0, contam =0, sommaf = 0, contaf = 0;

Un ultima riflessione è dedicata alle due istruzioni che calcolano la media delle età:

mediam = sommam / (float)contam;
mediaf = sommaf / (float)contaf;
spicca l'uso dell'operatore di cast (float). Per le regole di conversione dei tipi descritte nella scheda omonima, l'espressione sommam / contam (come anche sommaf / contaf) produce un risultato temporaneo intero che viene assegnato alla variabile mediam (o mediaf) quando ormai la parte decimale è persa. Il problema è risolvibile trasformando uno dei due operandi in valore float e ottenendo così una divisione fra reali che non perde la parte decimale.

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

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