09. Ciclo for

L'istruzione for in C può essere utilizzata in alternativa al ciclo while. Da un punto di vista funzionale questa istruzione è equivalente al while ma ha una serie di caratteristiche che la rendono più flessibile, migliorando anche la leggibilità dei programmi.

A differenza del while, che prevede un solo parametro, il ciclo for si predispone a riceve tre differenti parametri:

  • il primo parametro serve ad inizializzare una o più variabili all'ingresso del for;

  • il secondo parametro è un'espressione logica, analoga al parametro del while;

  • il terzo parametro include le istruzioni da eseguire al termine di ogni iterazione (tipicamente si effettua l'aggiornamento di un indice).


Esempio 1

Il seguente programma chiede all'utente di inserire un numero naturale N e conta quanti sono i multipli di 3 o di 5 o di 7.


#include <stdio.h>

int main()

{

int i, N, conteggio=0;

printf("Inserire un nunero naturale\n");

scanf("%d", &N);

for (i=1; i<=N; i++){

if (i%3==0 || i%5==0 || i%7==0)

conteggio++;

}

printf("Nei primi %d numeri naturali sono presenti %d multipli di 3 o di 5 o di 7", N, conteggio);

return 0;

}



for (i=1; i<=N; i++){

...

}

Questa istruzione implementa un ciclo del tutto equivalente al seguente:


i=1;

while (i<=N) {

...

i++;

}

L'istruzione for, all'interno della parentesi, prevede tre parametri (in questo esempio contrassegnati con altrettanti colori):

  • Primo parametro (in blu): è utilizzato per inizializzare una variabile, tipicamente un indice, all'ingresso nel for. E' possibile inizializzare più di una variabile; in questo caso occorre separare le variabili con la virgola (vedere gli esempi successivi presenti in questa pagina). Le istruzioni di inizializzazione vengono eseguite appena si incontra un for, prima di effettuare il test di ingresso nel for stesso (secondo parametro)

  • Secondo parametro (in rosso): è il test di ingresso nel for, analogo al test di ingresso nel while. Se il test è verificato si accede al for, diversamente si procede con la prima istruzione successiva al for, in questo esempio è la printf() posta subito dopo la parentesi graffa chiusa

  • Terzo parametro (in verde): è l'istruzione di aggiornamento dell'indice (tipicamente un'istruzione di incremento o decremento) che viene eseguita come ultima istruzione dopo ogni ciclo. L'operazione di aggiornamento dell'indice avviene prima di ripetere il test di ingresso nel for. E' possibile aggiornare più di un indice; in questo caso le istruzioni devono essere separate da virgola (vedere gli esempi successivi presenti in questa pagina)

I parametri di inizializzazione e incremento possono essere omessi senza creare ambiguità (occorre comunque inserire il carattere ";" prima di passare al parametro successivo).

Esempio 2

Il seguente programma stampa il contenuto di un array inizializzato da programma, effettua l'inversione delle celle a due a due (swap) e quindi stampa il nuovo contenuto dell'array.


#include <stdio.h>

int main()

{

int i, j, appo, a[10]={0,1,2,3,4,5,6,7,8,9};

printf("Array iniziale: \n");

for (i=0; i<10; i++)

printf("%d ", a[i]);

for (i=0, j=9; i<5; i++, j--){

appo=a[i];

a[i]=a[j];

a[j]=appo;

}

printf("\n\nArray finale: \n");

for (i=0; i<10; i++)

printf("%d ", a[i]);

return 0;

}



for (i=0, j=9; i<5; i++, j--){

...

}

Il primo parametro del for (in blu) inizializza le variabili i e j.

Il secondo parametro (in rosso) è il test di ingresso nel for.

Il terzo parametro (in verde) aggiorna le variabili i e j.


Esempio 3

#include <stdio.h>

int main()

{

int N;

printf("Inserire un nunero naturale N: ");

scanf("%d", &N);

for (; 1; N++)

if (N%3==0 && N%5==0 && N%7==0)

break;

// un numero e' multiplo di 3, 5 e 7 <=> e' multiplo di 105=3*5*7

printf("Il primo numero maggiore di N multiplo di 105 e': %d\n", N);

return 0;

}



for (; 1; N++)

Questo ciclo for non fa uso di parentesi graffe perché al suo interno è presente una sola istruzione (istruzione if).

Notare che non è presente il parametro di inizializzazione ma sono presenti il secondo e il terzo parametro.

Il test (in rosso) è un test sempre verificato. Il programma non va in loop, cioè non effettua cicli all'infinito, per la presenza dell'istruzione break.

L'incremento è rappresentato in verde.

break;

L'istruzione break, analogamente a quanto accade nel ciclo while, provoca l'uscita dal ciclo; il programma continua eseguendo l'istruzione successiva al for, in questo caso la printf().