PROGRAMMIAMO
C++ - Cicli annidati (nested)
Cicli annidati (nested)

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:

for (i=0;i<5;i++)
    {
   for (j=0;j<3;j++)
      {
      cout<<"i= "<<i<<" j= "<<j<<"\n";
      }
    }

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).

Calcolo dei numeri primi

Consideriamo ora un esempio pratico di utilizzo dei cicli annidati. Consideriamo nuovamente il programma per verificare se un dato numero è primo già visto precedentemente:

divisore=2;

while (divisore<numero)
    {
   resto = numero%divisore;

   if (resto==0)
      {
      cout<<"Il numero "<<numero<<" non è primo\n";
      break;
      }

   divisore = divisore+1;
    }

if (divisore == numero)
   cout<<"Il numero "<<numero<<" è primo\n";

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:

for (numero=2; numero<=100;numero++)
   {

   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!

Tabella pitagorica delle moltiplicazioni

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:

 

link precedente - successiva link

Sito realizzato in base al template offerto da

http://www.graphixmania.it