1. Introduzione
Nella programmazione spesso bisogna fare le stesse cose tante volte di fila. Per esempio:
- Scorrere tutti gli elementi di una lista.
- Leggere valori dalla tastiera finché l'utente non inserisce quello giusto.
- Calcolare la somma di tutti i numeri da 1 a 100.
- Chiedere la password all'utente finché non la inserisce correttamente.
Se provi a fare tutto questo senza cicli, il codice diventa lungo, noioso e impossibile da scalare. Immagina di scrivere una calcolatrice e di sommare i numeri da 1 a 10 a mano:
int sum = 0;
sum += 1;
sum += 2;
sum += 3;
// ... e così per 10 volte. Eh già.
Ti annoierai prima di finire! La soluzione sono i cicli. Ti permettono di descrivere le ripetizioni in modo chiaro e compatto. Oggi vediamo il ciclo più base, ma dannatamente utile — il while.
2. Introduzione al ciclo while
Sintassi e schema base
Il ciclo while è il "pappagallo" della programmazione: ripete lo stesso pezzo di codice finché una certa condizione è vera. Appena la condizione diventa falsa, il pappagallo si zittisce (il ciclo finisce).
while (condizione)
{
// Corpo del ciclo
}
while con blocco di comandi
Diagramma
Ecco un semplice diagramma a blocchi per capire come funziona il ciclo while:
3. Esempi: il ciclo while in azione
Contatore classico
Facciamo un programmino che conta da 1 a 5 e stampa i numeri:
int i = 1;
while (i <= 5)
{
Console.WriteLine($"Passo n° {i}");
i++; // Non dimenticare di aumentare il contatore!
}
// Stampa:
// Passo n° 1
// Passo n° 2
// Passo n° 3
// Passo n° 4
// Passo n° 5
Attenzione: se ti dimentichi di aumentare la variabile i, il ciclo non finirà mai (il nostro pappagallo diventa immortale e ripete all'infinito). Questo si chiama ciclo infinito — roba che fa paura.
Input da tastiera fino al valore giusto
Spesso il ciclo serve per "spremere" l'utente finché non dà la risposta giusta:
string password = "";
while (password != "qwerty")
{
Console.Write("Inserisci la password: ");
password = Console.ReadLine();
}
Console.WriteLine("Benvenuto!");
Qui il programma chiede di inserire la password finché non scrivi la magica "qwerty". Occhio: se togli la riga password = Console.ReadLine();, il ciclo diventa di nuovo infinito (continua a chiedere la password ma non legge mai l'input — si blocca per sempre come un robot rotto).
4. Tipi e scenari d'uso del ciclo while
Ciclo while normale
Questo ciclo, come visto sopra, controlla la condizione prima della prima iterazione. Se la condizione è falsa subito — il corpo del ciclo non viene eseguito nemmeno una volta.
Esempio: condizione falsa subito
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // Non verrà mai eseguito!
}
Che, in effetti, è logico. Proprio come scritto qui.
Cicli while annidati
A volte serve un ciclo dentro un altro ciclo. Per esempio, scorrere tutte le righe e in ognuna controllare tutti i caratteri. Per ora è un po' un'avventura, ma ecco un esempio semplice:
int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 2)
{
Console.WriteLine($"i = {i}, j = {j}");
j++;
}
i++;
}
// i = 1, j = 1
// i = 1, j = 2
// i = 2, j = 1
// i = 2, j = 2
// i = 3, j = 1
// i = 3, j = 2
Vedremo meglio i cicli annidati tra qualche lezione, volevo solo spaventarti un po' :)
Ciclo infinito
A volte i cicli finiscono, a volte — vivono per sempre.
while (true)
{
Console.WriteLine("Sono eterno!");
}
Si usa raramente, di solito per qualche processo in background (tipo un server), ma capita anche nella pratica.
5. Come non fare cavolate: errori comuni con while
In programmazione il ciclo è come l'elettricità: figo, ma bisogna conoscere le regole di sicurezza.
Problema 1: ciclo infinito per distrazione
Spessissimo chi inizia si dimentica di aggiornare la variabile da cui dipende la condizione. Così il ciclo va "all'infinito" e devi chiudere il programma a forza (tipo con Ctrl + C).
int i = 1;
while (i <= 5)
{
Console.WriteLine(i);
// i++; // OPS! Dimenticato di aumentare i
}
Problema 2: condizione sbagliata
A volte lo sviluppatore si scava la fossa da solo: la condizione, al contrario, non è mai vera. Così il ciclo non parte proprio.
int i = 10;
while (i < 5)
{
Console.WriteLine(i); // Questo codice non verrà mai eseguito.
i++;
}
Problema 3: errore con i tipi di dato
Nella condizione del ciclo ci deve sempre essere un'espressione booleana — cioè il risultato deve essere true o false.
int number = 5;
while (number) // Errore! Si aspettava un bool, non un int.
{
number--;
}
GO TO FULL VERSION