1. Introduzione
Nella programmazione spesso bisogna eseguire le stesse azioni molte volte di seguito. Ad esempio:
- Scorrere tutti gli elementi di una lista.
- Leggere valori da tastiera finché l'utente non inserisce quello richiesto.
- Calcolare la somma di tutti i numeri da 1 a 100.
- Richiedere all'utente la password finché non è corretta.
Se si prova a realizzare tutto ciò senza cicli, il risultato sarà prolisso, noioso e non scalabile. Immaginate di scrivere un programma-calcolatrice e decidere di sommare i numeri da 1 a 10 manualmente:
int sum = 0;
sum = sum + 1;
sum = sum + 2;
sum = sum + 3;
// ... e così 10 volte. Eh già.
Vi annoierete prima di finire! La soluzione — i cicli. Permettono di descrivere la ripetizione delle azioni in modo conciso e chiaro. Oggi conosceremo il ciclo più basilare, ma dannatamente utile — while.
2. Conoscere il ciclo while
Sintassi e schema di base
Il ciclo while è un «pappagallo» nel mondo della programmazione: ripete lo stesso frammento di codice finché una certa condizione è vera. Non appena la condizione smette di essere vera, il pappagallo tace (il ciclo termina).
Sintassi:
while (uslovie)
{
// Corpo del ciclo
}
Diagramma
Ecco un semplice diagramma di flusso per capire come funziona il ciclo while:
3. Esempi: il ciclo while in azione
Contatore classico
Scriviamo un semplice programma che conta da 1 a 5 e stampa i numeri:
int i = 1;
while (i <= 5)
{
System.out.println("Passo n° " + i);
i++; // Non dimenticate di incrementare il contatore!
}
// Stamperà:
// Passo n° 1
// Passo n° 2
// Passo n° 3
// Passo n° 4
// Passo n° 5
Attenzione: se vi dimenticate di incrementare la variabile i, il ciclo non terminerà mai (il nostro pappagallo diventerà immortale e ripeterà per sempre). Questo si chiama ciclo infinito — una cosa che fa paura.
Input da tastiera fino al valore richiesto
Spesso un ciclo viene usato per «spingere» l'utente fino alla risposta corretta:
String password = "";
while (!password.equals("qwerty"))
{
System.out.print("Inserisci la password: ");
password = console.nextLine();
}
System.out.println("Benvenuto!");
Qui il programma chiede di inserire la password finché non digitate la magica "qwerty". Non dimenticate: se rimuovete la riga password = console.nextLine();, il ciclo tornerà a essere infinito (continuerà a chiedere la password ma non leggerà l'input — rimarrà bloccato per sempre, come un robot rotto).
4. Tipi e scenari d'uso del ciclo while
Ciclo while semplice
Questo ciclo, come mostrato sopra, verifica la condizione prima della prima iterazione. Se la condizione è falsa subito — il corpo del ciclo non verrà eseguito nemmeno una volta.
Esempio: condizione falsa fin dall'inizio
int i = 10;
while (i < 5)
{
System.out.println(i); // Non verrà eseguito mai!
}
Il che, in effetti, è logico. Proprio come è scritto qui.
Cicli while annidati
A volte serve un ciclo dentro un altro ciclo. Ad esempio, scorrere tutte le righe e, in ciascuna di esse, controllare tutti i caratteri. A questo punto è più un'avventura, ma ecco un esempio semplice:
int i = 1;
while (i <= 3)
{
int j = 1;
while (j <= 2)
{
System.out.println("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
Approfondiremo i cicli annidati tra un paio di lezioni, volevo solo spaventarvi un po' :)
Ciclo infinito
A volte i cicli finiscono, altre — vivono per sempre.
while (true)
{
System.out.println("Sono eterno!");
}
Si usa di rado, di solito per qualche processo in background (ad esempio, il lavoro di un server), ma capita anche nella pratica.
5. Come non fare sciocchezze: errori comuni con while
In programmazione un ciclo è come l'elettricità: è fantastico, ma bisogna conoscerne le regole di sicurezza.
Problema 1: ciclo infinito per distrazione
Moltissimi principianti si dimenticano di aggiornare la variabile da cui dipende la condizione. Di conseguenza il ciclo gira «all'infinito» e bisogna interrompere il programma forzatamente (per esempio, con la combinazione Ctrl + C).
int i = 1;
while (i <= 5)
{
System.out.println(i);
// i++; // Ops! Dimenticati di incrementare i
}
Problema 2: condizione impostata in modo errato
A volte lo sviluppatore si scava la fossa da solo: la condizione, al contrario, non è mai vera. Di conseguenza il ciclo non viene eseguito affatto.
int i = 10;
while (i < 5)
{
System.out.println(i); // Questo codice non verrà mai eseguito.
i++;
}
Problema 3: errore con i tipi di dati
Nella condizione del ciclo deve sempre esserci un'espressione booleana — cioè il risultato del calcolo deve essere true o false.
int number = 5;
while (number) // Errore! Ci si aspettava un boolean, non un int.
{
number--;
}
GO TO FULL VERSION