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.
|