Iterazioni

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

  1. una variabile intera è utilizzata come indice all’interno della sequenza - i
  2. il valore iniziale della variabile è assegnato prima del ciclo - 1
  3. il valore della variabile è modificato ad ogni passo - i++
  4. 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...