I cicli
I cicli in programmazione permettono di ripetere le stesse istruzioni per un certo numero di volte che dipende da una condizione. Finch´ la condizione è vera, il codice che fa parte del corpo del ciclo è rieseguito. L'esecuzione del ciclo termina nel momento in cui la condizione non è più vera. In C esistono 3 tipi diversi di cicli:
- while: “mentre” in italiano (e in flowgorithm), permette di specificare una condizione all'inizio del ciclo;
- do...while: variante del while (“fai” in flowgorithm), permette di specificare una condizione al termine del ciclo;
- for: “per” in italiano (e in flowgorithm), permette di introdurre un ciclo dove il test è effettuato su una variabile contatore, che identifica l'iterazione corrente del ciclo. A differenza del while e del do...while, dove la condizione può essere specificata su una variabile qualsiasi, nel ciclo
for
la condizione riguarda solitamente la variabile contatore e quindi il numero di iterazione che il ciclo deve effettuare.
Ciclo while
Il ciclo while è strutturato nel modo seguente:
Tutto ciò che è compreso tra parentesi graffe fa parte del corpo del ciclo e, quindi, sarà ri-eseguito nel caso in cui condizione
risulti true
.
La particolarità di questo ciclo è che condizione
è posta all'inizio del ciclo e quindi il codice che fa parte del ciclo non sarà mai eseguito se al momento del primo test di condizione
, condizione
risulta false
.
Un esempio di utilizzo del ciclo while potrebbe essere la richiesta all'utente del re-inserimento di un valore perchè la prima volta era stato inserito un valore errato:
printf("Inserire un numero diverso da 0:");
scanf("%d",&n);
while (n == 0) {
printf("Numero errato. Inserire un numero diverso da 0:");
scanf("%d", &n);
}
In questo caso, il messaggio di errore non è stampato se l'utente inserisce già la prima volta un numero diverso da zero. In caso contrario, il ciclo sarà ri-eseguito finchè il numero inserito sarà uguale a zero.
Ciclo do...while
Il ciclo do...while
è una variante del ciclo while
dove la condizione, al posto che essera posta prima del ciclo, è posta al termine. In alcuni casi può essere più comodo l'utilizzo del do...while
piuttosto che il while
, ad esempio quando si è certi che si vuole eseguire un set di istruzioni almeno una volta e che, nel caso la condizione posta al termine sia soddisfatta, si voglia rieseguire lo stesso blocco. Il ciclo do...while
può essere molto utile nel caso di un algoritmo che prevede la richiesta ripetitiva di un'opzione ad un utente, tipo in un menù di scelta. Il blocco do...while
si scrive così:
Come nel caso del while
, il corpo del ciclo è ri-eseguito ogni qualvolta in cui condizione
risulta true
. Tuttavia, il corpo del ciclo è eseguito sempre almeno una volta, in quanto l'istruzione do
non serve per bloccare l'esecuzione, ma solo per indicare l'inizio del corpo.
Riscriviamo il codice dell'esempio precedente:
printf("Inserire un numero diverso da 0:");
scanf("%d",&n);
while (n == 0) {
printf("Numero errato. Inserire un numero diverso da 0:");
scanf("%d", &n);
}
usando il do...while
:
do {
printf("Inserire un numero diverso da 0:");
scanf("%d",&n);
if (n == 0) {
printf("Numero errato");
}
} while (n == 0);
Come si può notare non sono più necessarie due istruzioni di scanf
come nel caso del while
. Tuttavia, diviene necessario un blocco if
per stampare un messaggio di errore, in quanto se l'utente alla prima richiesta inserisce un numero diverso da zero, il messaggio non va stampato.
Ciclo for
Il ciclo for
funziona in modo diverso rispetto ai precedenti: esso, infatti, non controlla una variabile qualsiasi nella condizione, ma una variabile intera detta contatore. Le variabili contatore si occupano di contare il numero di iterazioni, ovvero di ripetizioni, fatte dal ciclo.
Il C, come altri linguaggi di programmazione, inizia i conteggi dal numero zero. Solitamente, quindi, la prima iterazione del ciclo è considerata l'iterazione numero zero, ma può essere modificata a piacimento qualora il problema che si sta risolvendo lo richieda. Al termine di ogni iterazione, la variabile contatore è modificata e ri-testata contro la condizione del ciclo. Come nel caso di while
e do...while
il corpo del ciclo è ri-eseguito finché la condizione risulta true
.
Il ciclo for
ha la seguente struttura:
ad esempio:
- Inizializzazione contatore: all'inizio del ciclo, la variabile
i
è inizializzata a zero. Come sopra indicato, essa può essere inizializzata a qualsiasi valore anche negativo, purché si tratti di un intero; - Condizione:
i < 10
si testai
contro il numero 10. Il ciclo sarà eseguito per la prima volta coni=0
e poi continuerà finchéi
è minore di 10. Visto che alla prima voltai
è uguale a zero e all'ultima iterazione i vale 9, il ciclo eseguirà un totale di 10 iterazioni; - Modifica del contatore: l'istruzione
i++
si usa per incrementare di una unità il contatore al termine di ogni iterazione. In particolare, l'istruzionei++
è una abbreviazione dii = i + 1
, che mostra più chiaramente la modifica della variabilei
. Non vi è vincolo sul tipo di modifica: la variabile si può modificare anche sommando valori maggiori di uno (es.i = i + 2
, abbreviato ini+=2
oi = i * 3
abbreviato ini*=3
) o anche sottraendo delle unità dal contatore. L'importante è che nonostante la modifica che si va ad effettuare, questa modifica abbia senso e porti la variabile, infine, a rendere la condizione del ciclofalse
, altrimenti si genererà un ciclo infinito.