Si parla di cicli annidati (o nested in inglese) quando un ciclo si trova all'interno di un altro ciclo. Si consideri l'esempio seguente:
Il risultato dell'esecuzione visualizzato sullo schermo è il seguente:
i= 0 j= 0
i= 0 j= 1
i= 0 j= 2
i= 1 j= 0
i= 1 j= 1
i= 1 j= 2
i= 2 j= 0
i= 2 j= 1
i= 2 j= 2
i= 3 j= 0
i= 3 j= 1
i= 3 j= 2
i= 4 j= 0
i= 4 j= 1
i= 4 j= 2
Cerchiamo di capire meglio. Il ciclo for esterno viene eseguito la prima volta con i=0. A questo punto si entra nel ciclo for interno, che viene eseguito la prima volta con j=0. Questo produce la prima linea visualizzata:
i= 0 j= 0
A questo punto l'esecuzione del for interno prosegue finché j non supera il valore 2. Questo produce la seguente visualizzazione:
i= 0 j= 1
i= 0 j= 2
Ora il for interno è terminato e l'esecuzione riprende dal for esterno incrementando j (j=1). A questo punto viene nuovamente eseguito il for interno per tre volte e questo produce la visualizzazione di:
i= 1 j= 0
i= 1 j= 1
i= 1 j= 2
Il meccanismo si ripete: il ciclo for interno termina, viene incrementata la variabile j del ciclo esterno (j=2) e di nuovo viene ripetuto per tre volte il ciclo interno.
La situazione può essere paragonata a due ingranaggi indentati fra loro, uno più grande (che rappresenta il ciclo esterno) e uno più piccolo (il ciclo interno). A ogni singola rotazione dell'ingranaggio grande (cioè a ogni singola ripetizione del ciclo esterno) corrispondono molte rotazioni dell'ingranaggio piccolo (cioè molte ripetizioni del ciclo interno).
Consideriamo ora un esempio pratico di utilizzo dei cicli annidati. Consideriamo nuovamente il programma per verificare se un dato numero è primo già visto precedentemente:
Vogliamo modificare il programma in modo che visualizzi tutti i numeri primi compresi fra 2 e 100. Per fare questo dobbiamo introdurre un ciclo esterno che incrementi la variabile numero da 1 fino a 100. Inoltre bisogna introdurre qualche piccola modifica alle visualizzazioni, in questo modo:
divisore=2;
while (divisore<numero)
{
resto = numero%divisore;
if (resto==0)
break;
divisore = divisore+1;
}
if (divisore == numero)
cout<<numero<<"\n";
}
E' interessante osservare che abbiamo "mescolato" un ciclo for esterno con un ciclo while interno: in C non esiste nessuna regola che obblighi a usare lo stesso tipo di ciclo!
Come ultimo esempio di cicli annidati consideriamo un programma per la visualizzazione della tabella delle moltiplicazioni di tutti i numeri fino a 10.
for (riga=1; riga<=10;riga++)
{
for (colonna=1;colonna<=10;colonna++)
{
prod = riga*colonna;
cout<<prod<<"\t";
}
cout<<"\n";
}
Il ciclo esterno incrementa le righe della tabellina, mentre il ciclo interno incrementa le colonne. Ogni 10 colonne (dieci ripetizioni del ciclo interno) viene completata una riga della tabella. Si noti l'uso del carattere speciale "\t" che indica una tabulazione (TAB), usata per distanziare in modo regolare i numeri visualizzati.
Il risultato dell'esecuzione del programma è il seguente:
Sito realizzato in base al template offerto da
http://www.graphixmania.it