Ciclo do...while
do-while: quando eseguire almeno una volta
Section titled “do-while: quando eseguire almeno una volta”A volte vuoi che il tuo programma faccia qualcosa almeno una volta, e poi decida se ripeterlo.
Per esempio: mostra il menu all’utente, poi chiedi se vuole continuare. Il menu deve apparire sempre almeno una volta, anche prima di sapere cosa vuole l’utente.
Il ciclo do...while fa esattamente questo: esegue il blocco, poi controlla la condizione.
La struttura del do...while
Section titled “La struttura del do...while”do { // codice da eseguire almeno una volta} while (condizione);Nota il punto e virgola dopo la parentesi tonda finale — è obbligatorio e facile da dimenticare.
Confronto con il while normale
Section titled “Confronto con il while normale”Il while controlla la condizione prima di eseguire il blocco. Se la condizione è già falsa, non esegue mai nulla:
int x = 10;while (x < 5) { cout << "while: " << x << endl; // non viene mai stampato}Il do...while esegue il blocco almeno una volta, poi controlla:
int y = 10;do { cout << "do-while: " << y << endl; // viene stampato una volta} while (y < 5);Output:
do-while: 10Anche se y = 10 non è minore di 5, il blocco viene eseguito lo stesso la prima volta.
Il caso d’uso classico: validare l’input
Section titled “Il caso d’uso classico: validare l’input”Il do...while è perfetto quando vuoi chiedere qualcosa all’utente e ripetere finché non inserisce un valore corretto:
int numero;
do { cout << "Inserisci un numero tra 1 e 10: "; cin >> numero;
if (numero < 1 || numero > 10) { cout << "Valore non valido, riprova." << endl; }} while (numero < 1 || numero > 10);
cout << "Hai inserito: " << numero << endl;Con il while normale, dovresti leggere l’input anche prima del ciclo (duplicando il codice). Con do...while il codice è più pulito.
Menu interattivo
Section titled “Menu interattivo”Il do...while è ideale per i menu: il menu deve sempre apparire almeno una volta, e si ripete finché l’utente non sceglie di uscire.
#include <iostream>using namespace std;
int main() { int scelta;
do { // Il menu viene mostrato all'inizio di ogni giro cout << "\n=== Menu ===" << endl; cout << "1. Saluta" << endl; cout << "2. Conta fino a 5" << endl; cout << "3. Esci" << endl; cout << "Scelta: "; cin >> scelta;
switch (scelta) { case 1: cout << "Ciao! Come stai?" << endl; break; case 2: for (int i = 1; i <= 5; i++) { cout << i << " "; } cout << endl; break; case 3: cout << "Arrivederci!" << endl; break; default: cout << "Scelta non valida." << endl; }
} while (scelta != 3); // ripete finché l'utente non sceglie "Esci"
return 0;}Contatore con do...while
Section titled “Contatore con do...while”Funziona anche per contare, come while e for:
int i = 1;
do { cout << i << " "; i++;} while (i <= 5);
// Output: 1 2 3 4 5Riepilogo dei tre tipi di ciclo
Section titled “Riepilogo dei tre tipi di ciclo”| Ciclo | La condizione viene controllata | Esecuzioni minime |
|---|---|---|
while | Prima del blocco | 0 — potrebbe non eseguire mai |
for | Prima del blocco | 0 — potrebbe non eseguire mai |
do...while | Dopo il blocco | 1 — esegue almeno una volta |
Il do...while è meno frequente degli altri due, ma è la scelta più naturale quando sai con certezza che il blocco deve essere eseguito almeno una volta.
Esempio pratico: indovina il numero
Section titled “Esempio pratico: indovina il numero”#include <iostream>#include <cstdlib>#include <ctime>using namespace std;
int main() { srand(time(0)); // inizializza il generatore di numeri casuali con l'ora attuale int numeroDaIndovinare = rand() % 100 + 1; // numero casuale tra 1 e 100 int tentativo; int contatore = 0;
cout << "Ho pensato un numero tra 1 e 100. Indovinalo!" << endl;
do { cout << "Tentativo " << (contatore + 1) << ": "; cin >> tentativo; contatore++;
if (tentativo < numeroDaIndovinare) { cout << "Troppo basso!" << endl; } else if (tentativo > numeroDaIndovinare) { cout << "Troppo alto!" << endl; }
} while (tentativo != numeroDaIndovinare); // ripeti finché non indovina
cout << "Bravo! Hai indovinato in " << contatore << " tentativi!" << endl;
return 0;}