Ripetere più volte l’esecuzione di una sequenza
Controllo in coda
do { istr1; istr2; ... } while(A > 0);
Dopo aver eseguito le istruzioni istr1, istr2, … decide se ripetere la loro esecuzione o continuare con le istruzioni successive (la sequenza controllata è stata eseguita comunque una volta).
Osservazione: le istruzioni controllate devono necessariamente provocare una modifica di A, altrimenti l’iterazione non avrebbe mai termine.
Se si controlla l’esecuzione di una sola istruzione
do istr1; while(A > 0);
Controllo in testa
Si può prevedere la possibilità che la sequenza non venga eseguita per nulla, allora è necessaria una decisione ulteriore in testa…
if(A > 0) do { istr1; istr2; . . . } while(A > 0);
Decide (selezione singola) se eseguire o meno il blocco costituito da una ripetizione (con decisione in coda).
Il codice può essere semplificato riorganizzando il tutto, tramite while()
while(A > 0) { istr1; istr2; . . . }
Decide se eseguire le istruzioni istr1, istr2, … o proseguire con le successive; in caso di risposta affermativa ritornerà a ripetere il test.
Se viene controllata l’esecuzione di una sola istruzione
while(A > 0) istr1;
Ciclo precalcolato
Il ciclo con controllo in testa assume spesso una forma standardizzata
i=1; while(i <= N) { istr1; istr2; . . . i++; }
dove
- una variabile intera è utilizzata come indice all’interno della sequenza - i
- il valore iniziale della variabile è assegnato prima del ciclo - 1
- il valore della variabile è modificato ad ogni passo - i++
- la ripetizione termina se la variabile supera un certo valore fissato - N
In questi casi tutta la scrittura è convenientemente riassunta nella struttura di controllo for
for(i=1; i <= N; i++) { istr1; istr2; . . . }
Se il valore della variabile è decrementato
for(i=N; i >= 1; i--) { istr1; istr2; . . . }
All’interno delle parentesi tonde c'è una grande flessibilità
for(int i=0; ...; ...) // dichiara e inizializza for(i=0, j=10; ...; ...) // inizializza due indici for(...; ...; i++, j--) // modifica due indici for( ; ...; ...) // non inizializza for(...; ...; ) // non modifica for( ; ; ) // vuoto...