Skip to content

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.

do {
// codice da eseguire almeno una volta
} while (condizione);

Nota il punto e virgola dopo la parentesi tonda finale — è obbligatorio e facile da dimenticare.

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: 10

Anche 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.

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;
}

Funziona anche per contare, come while e for:

int i = 1;
do {
cout << i << " ";
i++;
} while (i <= 5);
// Output: 1 2 3 4 5
CicloLa condizione viene controllataEsecuzioni minime
whilePrima del blocco0 — potrebbe non eseguire mai
forPrima del blocco0 — potrebbe non eseguire mai
do...whileDopo il blocco1 — 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.

#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;
}