Barninga Z
a- a+

Il flusso elaborativo: while

while

Mediante l'istruzione while è possibiledefinire un ciclo ripetuto finché una data condizionerisulta vera. Vediamo subito un esempio: 

while(a < b) {  printf("a = %d" ,a);  ++a;    }

Le due righe comprese tra le graffe sono eseguitefinché la variabile a, incremento dopoincremento, diventa uguale a b. A questo puntol'esecuzione prosegue con la prima istruzione che seguela graffa chiusa. 

Vale la pena di addentrarsi un poco nell'algoritmo,esaminando con maggiore dettaglio ciò che accade. Comeprima operazione viene valutato se a è minoredi b (la condizione deve essere espressa traparentesi tonde). Se essa risulta vera vengono eseguiti laprintf() e l'autoincremento di a, perritornare poi al confronto tra a e b. Se lacondizione è vera il ciclo è ripetuto,altrimenti si prosegue, come già accennato, con quantosegue la parentesi graffa chiusa. 

Se ne trae, innanzitutto, che se al primo test la condizionenon è vera, il ciclo non viene eseguito neppure unavolta. Inoltre è indispensabile che all'internodelle graffe accada qualcosa che determini le condizioninecessarie per l'uscita dal ciclo: in questo caso isuccessivi incrementi di a rendono falsa, prima opoi, la condizione da cui tutto il ciclo whiledipende. 

Esiste però un altro metodo per abbandonare un cicloal verificarsi di una certa condizione: si trattadell'istruzione break[4]. Esempio: 

while(a < b) {  printf("a = %d" ,a);  if(++a == 100)break;  --c;    }

In questo caso a è incrementata e poiconfrontata con il valore 100: se uguale, il cicloè interrotto, altrimenti esso prosegue con ildecremento di c. E' anche possibile escluderedall'esecuzione una parte del ciclo e forzare il ritornoal test: 

while(a < b) {  if(a++ < c)continue;  printf("a = %d" ,a);  if(++a == 100)break;  --c;    }

Nell'ultimo esempio presentato, a vieneconfrontata con c ed incrementata. Se, primadell'incremento essa è minore di c ilflusso elaborativo ritorna al test dell'istruzionewhile; la responsabile del salto forzato èl'istruzione continue, che consente di iniziareda capo una nuova iterazione. In caso contrario vienechiamata printf() e, successivamente, vieneeffettuato il nuovo test con eventuale uscita dalciclo. 

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) ven'è un secondo, per (c < x).Già nella prima iterazione del ciclo"esterno" , se la condizione (c < x)è vera si entra in quello "interno" , cheviene interamente elaborato (cioè c èincrementata finché assume valore pari ad x)prima che venga eseguita la successiva istruzione del cicloesterno. In pratica, ad ogni iterazione del ciclo esternoavviene una serie completa di iterazioni nel ciclointerno. 

Va sottolineato che eventuali istruzioni break ocontinue presenti nel ciclo interno sono relativeesclusivamente a quest'ultimo: una breakprodurrebbe l'uscita dal ciclo interno e unacontinue il ritorno al test, sempre del ciclointerno. 

Si può ancora notare, infine, che il ciclo per (c< x) si compone di una sola istruzione: proprio perquesto motivo è stato possibile omettere le parentesigraffe.

 



Ti potrebbe interessare anche

commenta la notizia