Skip to content

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:

while (condizione) {
    //Corpo del ciclo while
}

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ì:

do {
    //Corpo del ciclo while

} while (condizione);

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:

for (inizializzazione contatore; condizione; modifica contatore) {

}

ad esempio:

for (i = 0; i < 10; i++) {
    //Corpo del ciclo

}
  • 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 testa i contro il numero 10. Il ciclo sarà eseguito per la prima volta con i=0 e poi continuerà finché i è minore di 10. Visto che alla prima volta i è 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'istruzione i++ è una abbreviazione di i = i + 1, che mostra più chiaramente la modifica della variabile i. Non vi è vincolo sul tipo di modifica: la variabile si può modificare anche sommando valori maggiori di uno (es. i = i + 2, abbreviato in i+=2 o i = i * 3 abbreviato in i*=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 ciclo false, altrimenti si genererà un ciclo infinito.