Ciclo do while in Java
- Il ciclo
do-while
in Java garantisce l'esecuzione del corpo del ciclo almeno una volta, valutando la condizione alla fine del ciclo. -
La sintassi del ciclo
do-while
è:do { // corpo del ciclo } while (condizione);
-
Il ciclo
do-while
è utile per situazioni in cui è necessario eseguire il corpo del ciclo almeno una volta, come nei menu di selezione.
Ciclo do-while
Come visto nella lezione precedente, se l'espressione condizionale che controlla un ciclo while
è inizialmente falsa, il corpo del ciclo non verrà eseguito affatto.
Tuttavia, a volte è necessario eseguire il corpo di un ciclo almeno una volta, anche se l'espressione condizionale è falsa fin dall'inizio. In altre parole, vi sono situazioni in cui occorre verificare l'espressione di terminazione alla fine del ciclo invece che all'inizio.
Fortunatamente, Java fornisce un ciclo che soddisfa proprio questa esigenza: il do-while
. Il ciclo do-while
esegue sempre il proprio corpo almeno una volta, perché l'espressione condizionale è posta in fondo al ciclo. La sua forma generale è
do {
// corpo del ciclo
} while (condizione);
A ogni iterazione, il ciclo do-while
esegue prima il corpo del ciclo e poi valuta l'espressione condizionale. Se l'espressione risulta vera, il ciclo si ripete; in caso contrario termina. Come per tutti i cicli di Java, condizione
deve essere un'espressione booleana.
Ecco una versione rielaborata del programma “tick” che dimostra il ciclo do-while
. Produce lo stesso output di prima.
// Dimostrazione del ciclo do-while.
class FaiMentre {
public static void main(String[] args) {
int contatore = 10;
do {
System.out.println("tick " + contatore);
contatore--;
} while (contatore > 0);
}
}
Il ciclo nel programma precedente, pur essendo tecnicamente corretto, può essere scritto in modo più efficiente nel modo seguente:
do {
System.out.println("tick " + contatore);
} while (--contatore > 0);
In questo esempio, l'espressione (--contatore > 0)
combina il decremento di contatore
e il test a zero in un'unica espressione. Il funzionamento è il seguente. Innanzitutto viene eseguita l'istruzione --contatore
, che decrementa contatore
e restituisce il nuovo valore. Questo valore viene poi confrontato con zero. Se è maggiore di zero, il ciclo continua; altrimenti termina.
Il ciclo do-while
è particolarmente utile quando si gestisce una selezione da menu, perché di solito occorre che il corpo di un ciclo di menu venga eseguito almeno una volta. Si consideri il programma seguente, che implementa un sistema di help molto semplice per le istruzioni di selezione e iterazione di Java:
// Uso di do-while per gestire una selezione da menu
class Menu {
public static void main(String[] args)
throws java.io.IOException {
char scelta;
do {
System.out.println("Aiuto su: ");
System.out.println(" 1. if");
System.out.println(" 2. switch");
System.out.println(" 3. while");
System.out.println(" 4. do-while");
System.out.println(" 5. for\n");
System.out.println("Scegli uno:");
scelta = (char) System.in.read();
} while (scelta < '1' || scelta > '5');
System.out.println("\n");
switch (scelta) {
case '1':
System.out.println("L'if:\n");
System.out.println("if(condizione) istruzione;");
System.out.println("else istruzione;");
break;
case '2':
System.out.println("Lo switch:\n");
System.out.println("switch(espressione) {");
System.out.println(" case costante:");
System.out.println(" sequenza di istruzioni");
System.out.println(" break;");
System.out.println(" //...");
System.out.println("}");
break;
case '3':
System.out.println("Il while:\n");
System.out.println("while(condizione) istruzione;");
break;
case '4':
System.out.println("Il do-while:\n");
System.out.println("do {");
System.out.println(" istruzione;");
System.out.println("} while (condizione);");
break;
case '5':
System.out.println("Il for:\n");
System.out.print("for(init; condizione; iterazione)");
System.out.println(" istruzione;");
break;
}
}
}
Ecco un esempio di esecuzione prodotto da questo programma:
Aiuto su:
1. if
2. switch
3. while
4. do-while
5. for
Scegli uno:
4
Il do-while:
do {
istruzione;
} while (condizione);
Nel programma, il ciclo do-while
viene utilizzato per verificare che l'utente abbia inserito una scelta valida. In caso contrario, viene riproposto il prompt. Poiché il menu deve essere visualizzato almeno una volta, il do-while
è il ciclo ideale per conseguire questo risultato.
Alcuni altri aspetti di questo esempio meritano attenzione: i caratteri vengono letti da tastiera chiamando System.in.read()
. Si tratta di una delle funzioni di input da console di Java. Sebbene i metodi di I/O da console di Java non vengano trattati in dettaglio fino al Capitolo 13, System.in.read()
viene usato qui per ottenere la scelta dell'utente. Legge caratteri dallo standard input (ritornati come interi, motivo per cui il valore di ritorno è stato convertito in char
). Per impostazione predefinita, l'input standard è bufferizzato per riga, quindi è necessario premere Invio prima che i caratteri digitati vengano inviati al programma.
L'input da console di Java può risultare un po' scomodo da gestire. Inoltre, la maggior parte dei programmi Java reali utilizza un'interfaccia grafica (GUI).
Tuttavia, in questo contesto è utile. Un altro punto da considerare: poiché viene usato System.in.read()
, il programma deve specificare la clausola throws java.io.IOException
. Questa riga è necessaria per gestire gli errori di input ed è parte delle funzionalità di gestione delle eccezioni di Java che vedremo nelle prossime lezioni.