In questa lezione ci eserciteremo con i cicli for annidati in C, cioè studieremo le iterazioni eseguite dentro un’altra iterazione.
Innanzitutto notiamo che nei cicli annidati, il ciclo più esterno esegue N volte il ciclo più interno. Infatti, al suo primo passo, il ciclo esterno mette in esecuzione quello interno. Questo a sua volta esegue il proprio blocco di codice fino alla conclusione. Dopo, al secondo passo, il ciclo esterno rimette in esecuzione quello interno. Ciò si ripete finché il ciclo esterno non termina.
Facciamo subito degli esempi per capirne il funzionamento.
Primo esempio sui cicli for annidati in C
Nel primo esempio che propongo in questa lezione stamperemo 3 righe e 5 colonne con i seguenti dati:
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
Il ciclo più esterno viene eseguito quindi 3 volte, l’indice i infatti parte da 0 e arriva a 2. Il ciclo più interno viene eseguito 5 volte infatti l’indice j va da 0 a 4.
Ogni ciclo esterno scrive nella prima riga una sequenza di 5 numeri. La prima volta stampa: (i+1) (i +1) (i +1) (i +1) (i +1) cioè 1 1 1 1 1, dopo va a capo e incrementa i di 1, quindi stampa 2 2 2 2 2, dopo va nuovamente a capo e incrementa i di 1 quindi stampa 3 3 3 3 3.
Poi i diventa 4 e il test (i<3) non è più valido, quindi il programma esce anche dal ciclo for esterno.
Ecco dunque il listato completo che produce 3 righe e 5 colonne:
#include <stdio.h>
main()
{
int i, j;
for(i=0;i<3;i++) {
for (j=0;j<5;j++)
printf("%d ", i+1);
printf("\n");//va a capo
}
system("PAUSE");
}
Secondo esempio sui cicli annidati
In questo secondo esempio vogliamo produrre questo output:
0 1 2 3 4 5 6 7 8 9
10 11....
E così via fino a 100. Quindi vogliamo stampare i numeri da 0 a 100 e andare a capo ogni 10 numeri.
Utilizzeremo questa istruzione i*10+j anche per capire meglio l’uso degli indici.
for(i=0;i<10;i++) { // i=0 test vero
for (j=0;j<10;j++) //j=0 test vero
printf(“%4d “, i*10+j); // stampiamo i*10+j=0*10+0=0
printf(“\n”); //va a capo
Quindi si ripete il ciclo interno
for (j=0;j<10;j++) //i=0 e j=1
printf(“%4d “, i*10+j); // stampiamo i*10+j=0*10+1=1
….
Continuiamo così fino a stampare il 9.
Dopo infatti il ciclo interno si interrompe perchè il test 10<10 è falso.
Allora i si incrementa di 1, quindi avremo:
for(i=0;i<10;i++) { // i=1 test vero
for (j=0;j<10;j++) //j=0 test vero
printf(“%4d “, i*10+j); // stampiamo i*10+j=1*10+0=10
printf(“\n”); //va a capo
….
Si continua il ciclo interno fino a stampare il numero 19.
Al termine stamperemo tutti i numeri da 0 a 100.
Ecco quindi il listato completo:
#include <stdio.h>
main()
{
int i, j;
for(i=0;i<10;i++) {
for (j=0;j<10;j++)
printf("%4d ", i*10+j);
printf("\n");//stampa la prima riga
}
system("PAUSE");
}
Gli esercizi proposti erano solo dei semplici esempi per mostrarvi l’uso dei cicli for annidati in C. Continueremo ad esercitarci anche nelle prossime lezioni.
Alcuni link utili
Allocazione dinamica della memoria con malloc
Esercitazione sulle struct in C
Realizzare un menù di scelta in C
Come sommare gli elementi della cornice esterna
Ricerca elementi in una matrice