Ciclo For in C#
- Il ciclo
for
in C# è un costrutto di programmazione che consente di eseguire un blocco di codice un numero specifico di volte. - La sintassi del ciclo
for
include tre parti principali: inizializzazione, condizione e aggiornamento. - Il ciclo
for
è utile quando si conosce in anticipo il numero di iterazioni che devono essere eseguite. - È possibile utilizzare più variabili nel ciclo
for
e aggiornare le variabili del ciclo in modi diversi, come l'incremento o la moltiplicazione.
Il Ciclo for
I cicli for
sono leggermente più complicati dei cicli while
e do-while
ma d'altra parte possono risolvere compiti più complicati con meno codice.
Un ciclo for
è un costrutto di programmazione che ha la forma seguente:
Come si può osservare dalla figura, un ciclo for ha quattro parti principali:
- A: Blocco di Inizializzazione
- B: Condizione di Controllo
- C: Operazione di Fine Iterazione
- D: Istruzioni
A breve spiegheremo in dettaglio ciascuna di queste parti. Adesso concentriamoci sulla struttura generale di un ciclo for e sulla sua sintassi:
for (inizializzazione; condizione; aggiornamento)
{
corpo_del_ciclo;
}
Ad esempio, un ciclo for che esegue il corpo del ciclo 10 volte può essere scritto come segue:
for (int i = 0; i < 10; i++)
{
// Corpo del ciclo
}
Scomponiamo il ciclo for in parti separate:
-
La parte di inizializzazione viene eseguita una sola volta all'inizio del ciclo.
Nell'esempio sopra,
int i = 0
è la parte di inizializzazione, che dichiara e inizializza la variabile del cicloi
a 0. -
La condizione di controllo viene valutata prima di ogni iterazione del ciclo. Se la condizione è vera, il corpo del ciclo viene eseguito; se è falsa, il ciclo termina.
Nell'esempio sopra,
i < 10
è la condizione di controllo. Il ciclo continuerà a eseguire il corpo finchéi
sarà minore di 10. -
L'operazione di fine iterazione viene eseguita alla fine di ogni iterazione del ciclo, dopo che il corpo del ciclo è stato eseguito.
Nell'esempio sopra,
i++
è l'operazione di fine iterazione, che incrementa il valore dii
di 1 ad ogni iterazione. -
Il corpo del ciclo contiene le istruzioni che vengono eseguite ad ogni iterazione del ciclo.
Il fatto di avere un contatore del ciclo distingue un ciclo for
dagli altri tipi di cicli.
Molto spesso il contatore cambia da un valore iniziale dato a uno finale in ordine crescente, per esempio da 1 a 100. Il numero di iterazioni di un dato ciclo for
è solitamente noto prima che la sua esecuzione inizi. Infatti, tipicamente, il ciclo for
viene utilizzato quando si conosce in anticipo il numero di iterazioni che devono essere eseguite.
Un ciclo for
può avere una o più variabili del ciclo che si muovono in ordine crescente o decrescente o con un passo. È possibile che una variabile del ciclo aumenti e l'altra diminuisca. È persino possibile fare un ciclo da 2 a 1024 in passi di moltiplicazione per 2, poiché l'aggiornamento delle variabili del ciclo può contenere non solo addizione, ma qualsiasi espressione aritmetica.
Inoltre, nessuno degli elementi di un ciclo for
è obbligatorio. Possiamo scrivere un ciclo for
senza inizializzazione, condizione o aggiornamento.
Ad esempio, possiamo omettere tutte le parti del ciclo for
e scrivere un ciclo infinito:
for ( ; ; )
{
// Corpo del ciclo
}
Ora analizziamo in dettaglio le parti separate di un ciclo for.
Inizializzazione del Ciclo for
I cicli for
possono avere un'espressione di inizializzazione:
for (int numero = 0; /* condizione */; /* aggiornamento */ )
{
// La variabile numero è visibile qui e può essere utilizzata
}
// Qui numero non può essere utilizzata
L'espressione di inizializzazione viene eseguita solo una volta, appena prima di entrare nel ciclo.
Solitamente il blocco di inizializzazione viene utilizzato per dichiarare la variabile contatore (chiamata anche variabile di ciclo) e per impostare il suo valore iniziale. Questa variabile è "visibile" e può essere utilizzata solo all'interno del ciclo. Nel blocco di inizializzazione è possibile dichiarare e inizializzare più di una variabile.
Condizione del Ciclo for
I cicli for
possono avere una condizione del ciclo:
for (int num = 0; num < 10; /* aggiornamento */ )
{
// Corpo del ciclo
}
La condizione (condizione del ciclo) viene valutata una volta prima di ogni iterazione del ciclo, proprio come nei cicli while
. Se il risultato è true
il corpo del ciclo viene eseguito, se il risultato è false
viene saltato e il ciclo termina (il programma continua immediatamente dopo l'ultima riga del corpo del ciclo).
Espressione di Aggiornamento del Ciclo for
L'ultimo elemento di un ciclo for
contiene un'espressione che aggiorna la variabile del ciclo:
for (int num = 0; num < 10; num++)
{
// Corpo del ciclo
}
Questo codice viene eseguito ad ogni iterazione, dopo che il corpo del ciclo è stato eseguito. Viene più comunemente utilizzato per aggiornare il valore della variabile contatore.
Corpo del Ciclo for
Il corpo del ciclo contiene un blocco con codice sorgente. Le variabili del ciclo, dichiarate nel blocco di inizializzazione del ciclo, sono disponibili al suo interno.
Ad esempio, se abbiamo un ciclo for che dichiara una variabile contatore i
, possiamo usarla nel corpo del ciclo:
for (int i = 0; i < 10; i++)
{
Console.WriteLine("i = " + i);
}
Al di fuori del ciclo, la variabile i
non è più visibile e non può essere utilizzata. Questo è un esempio di scope (ambito) delle variabili in C#.
Esempio
Ecco un esempio completo di un ciclo for
che stampa i numeri da 0 a 10:
for (int i = 0; i <= 10; i++)
{
Console.Write(i + " ");
}
Il risultato della sua esecuzione è il seguente:
0 1 2 3 4 5 6 7 8 9 10
Ecco un altro esempio più complicato di un ciclo for
, in cui abbiamo due variabili i
e somma
, che inizialmente hanno il valore di 1, ma vengono aggiornate consecutivamente ad ogni iterazione del ciclo:
for (int i = 1, somma = 1; i <= 128; i = i * 2, somma += i)
{
Console.WriteLine("i={0}, somma={1}", i, somma);
}
Come si può osservare, le espressioni di inizializzazione e aggiornamento possono contenere più variabili. L'importante è che le espressioni siano separate da virgole. In questo esempio, la variabile i
viene moltiplicata per 2 ad ogni iterazione, mentre la variabile somma
viene aggiornata aggiungendo il valore di i
alla somma corrente.
Il risultato dell'esecuzione di questo ciclo è il seguente:
i=1, somma=1
i=2, somma=3
i=4, somma=7
i=8, somma=15
i=16, somma=31
i=32, somma=63
i=64, somma=127
i=128, somma=255
Esempio: Potenza di un Numero Intero
Come ulteriore esempio scriveremo un programma che eleva un numero
Per questo scopo useremo un ciclo for
:
Console.Write("n = ");
int n = int.Parse(Console.ReadLine());
Console.Write("m = ");
int m = int.Parse(Console.ReadLine());
decimal risultato = 1;
for (int i = 0; i < m; i++)
{
risultato *= n;
}
Console.WriteLine("n^m = " + risultato);
Prima inizializziamo il risultato (risultato = 1
). Il ciclo inizia impostando un valore iniziale per la variabile contatore (int i = 0
). Definiamo la condizione per l'esecuzione del ciclo (i < m
). In questo modo il ciclo sarà eseguito da 0
a m-1
cioè esattamente m
volte. Durante ogni esecuzione del ciclo moltiplichiamo il risultato per n
e così n
sarà elevato alla potenza successiva (1, 2, …, m
) ad ogni iterazione. Infine stampiamo il risultato per vedere se il programma funziona correttamente.
Ecco come appare il risultato del programma per n = 2 e m = 10:
n = 2
m = 10
n^m = 1024
Ciclo for
con più variabili
Come abbiamo già visto, nel costrutto di un ciclo for
possiamo utilizzare più variabili contemporaneamente. Ecco un esempio in cui abbiamo due contatori.
Uno dei contatori si muove verso l'alto a partire da 1 e l'altro si muove verso il basso a partire da 10:
for (int piccolo=1, grande=10; piccolo<grande; piccolo++, grande--)
{
Console.WriteLine(piccolo + " " + grande);
}
La condizione per la terminazione del ciclo è la sovrapposizione dei contatori, ossia quando il contatore piccolo
diventa uguale o maggiore del contatore grande
. Durante ogni iterazione del ciclo, il contatore piccolo
aumenta di 1 e il contatore grande
diminuisce di 1.
Provando ad eseguire il programma, vedremo che il ciclo termina quando i due contatori si sovrappongono. Il risultato dell'esecuzione del programma è il seguente:
1 10
2 9
3 8
4 7
5 6
Istruzione continue
L'istruzione continue
ferma l'iterazione corrente del ciclo interno, senza terminare il ciclo.
Con il seguente esempio esamineremo come utilizzare questo operatore.
Calcoleremo la somma di tutti i numeri interi dispari nell'intervallo for
:
Console.Write("n = ");
int n = int.Parse(Console.ReadLine());
int somma = 0;
for (int i = 1; i <= n; i += 2)
{
if (i % 7 == 0)
{
continue;
}
somma += i;
}
Console.WriteLine("somma = " + somma);
Prima inizializziamo la variabile del ciclo con un valore di 1 poiché questo è il primo numero intero dispari nell'intervallo i
non ha ancora superato n
(i <= n
).
Nell'espressione per aggiornare la variabile la aumentiamo di 2 per passare solo attraverso i numeri dispari. All'interno del corpo del ciclo controlliamo se il numero corrente è divisibile per 7. Se è così chiamiamo l'istruzione continue
, che salta il resto del corpo del ciclo (salta l'aggiunta del numero corrente alla somma). Se il numero non è divisibile per sette, continua con l'aggiornamento della somma con il numero corrente.
Il risultato dell'esempio per n = 11 è il seguente:
n = 11
somma = 29