- Programmazione » Programmazione » Guida C - Manuale programmazione con articoli e risorse interessanti
Il flusso elaborativo: while
while
Mediante l'istruzione while è possibile definire un ciclo ripetuto finché una data condizione risulta vera. Vediamo subito un esempio:
while(a < b) {
printf("a = %d
" ,a);
++a;
}
Le due righe comprese tra le graffe sono eseguite
finché la variabile a, incremento dopo
incremento, diventa uguale a b. A questo punto
l'esecuzione prosegue con la prima istruzione che segue
la graffa chiusa.
Vale la pena di addentrarsi un poco nell'algoritmo,
esaminando con maggiore dettaglio ciò che accade. Come
prima operazione viene valutato se a è minore
di b (la condizione deve essere espressa tra
parentesi tonde). Se essa risulta vera vengono eseguiti la
printf() e l'autoincremento di a, per
ritornare poi al confronto tra a e b. Se la
condizione è vera il ciclo è ripetuto,
altrimenti si prosegue, come già accennato, con quanto
segue la parentesi graffa chiusa.
Se ne trae, innanzitutto, che se al primo test la condizione
non è vera, il ciclo non viene eseguito neppure una
volta. Inoltre è indispensabile che all'interno
delle graffe accada qualcosa che determini le condizioni
necessarie per l'uscita dal ciclo: in questo caso i
successivi incrementi di a rendono falsa, prima o
poi, la condizione da cui tutto il ciclo while
dipende.
Esiste però un altro metodo per abbandonare un ciclo
al verificarsi di una certa condizione: si tratta
dell'istruzione break[4]. Esempio:
while(a < b) {
printf("a = %d
" ,a);
if(++a == 100)
break;
--c;
}
In questo caso a è incrementata e poi confrontata con il valore 100: se uguale, il ciclo è interrotto, altrimenti esso prosegue con il decremento di c. E' anche possibile escludere dall'esecuzione una parte del ciclo e forzare il ritorno al test:
while(a < b) {
if(a++ < c)
continue;
printf("a = %d
" ,a);
if(++a == 100)
break;
--c;
}
Nell'ultimo esempio presentato, a viene
confrontata con c ed incrementata. Se, prima
dell'incremento essa è minore di c il
flusso elaborativo ritorna al test dell'istruzione
while; la responsabile del salto forzato è
l'istruzione continue, che consente di iniziare
da capo una nuova iterazione. In caso contrario viene
chiamata printf() e, successivamente, viene
effettuato il nuovo test con eventuale uscita dal
ciclo.
I cicli while possono essere annidati:
while(a < b) {
if(a++ < c)
continue;
printf("a = %d
" ,a);
while(c < x)
++c;
if(++a == 100)
break;
--c;
}
All'interno del ciclo per (a < b) ve
n'è un secondo, per (c < x).
Già nella prima iterazione del ciclo
"esterno" , se la condizione (c < x)
è vera si entra in quello "interno" , che
viene interamente elaborato (cioè c è
incrementata finché assume valore pari ad x)
prima che venga eseguita la successiva istruzione del ciclo
esterno. In pratica, ad ogni iterazione del ciclo esterno
avviene una serie completa di iterazioni nel ciclo
interno.
Va sottolineato che eventuali istruzioni break o
continue presenti nel ciclo interno sono relative
esclusivamente a quest'ultimo: una break
produrrebbe l'uscita dal ciclo interno e una
continue il ritorno al test, sempre del ciclo
interno.
Si può ancora notare, infine, che il ciclo per (c
< x) si compone di una sola istruzione: proprio per
questo motivo è stato possibile omettere le parentesi
graffe.
- Articolo precedente Il flusso elaborativo: i cicli
- Articolo successivo Il flusso elaborativo: do while