3.2 L’istruzione do...while

Diversamente dall’istruzione while, che valuta la condizione prima di iniziare il ciclo iterativo,
l’istruzione do...while valuta la condizione alla fine del ciclo stesso:
è dunque un costrutto post-condizionale. Per questo motivo, il corpo del ciclo
viene eseguito almeno una volta, indipendentemente dal valore iniziale della condizione.

Sintassi

do {
    istruzioni;
} while(condizione);

La sequenza di istruzioni compresa tra do e while viene ripetuta
tante volte finché la condizione rimane vera. La ripetizione termina quando la condizione diventa falsa.

Differenza rispetto al ciclo while

  • while controlla la condizione all’inizio (pre-condizionale).
  • do...while controlla la condizione alla fine (post-condizionale).
  • Con do...while il corpo del ciclo è eseguito almeno una volta.

Esempio 1 – Stampa dei numeri da 10 a 20

int x = 9;
do {
    x++;
    cout << " " << x;
} while(x < 20);

// Output: 10 11 12 ... 20

Esempio 2 – Esecuzione garantita almeno una volta

int x = 50;
do {
    x++;
    cout << " " << x;
} while(x < 20);

// Output: 51

In questo caso il ciclo viene comunque eseguito una volta, anche se la condizione
x < 20 è già falsa all’inizio.

Esempio 3 – Validazione dell’input

int n;
do {
    cout << "Inserire un valore intero compreso tra 10 e 20: "; cin >> n;
} while(n < 10 || n > 20);

cout << "Il numero inserito è " << n << endl;

Questo esempio mostra un tipico uso del ciclo do...while per
la validazione dell’input: la richiesta viene ripetuta finché l’utente non inserisce
un valore valido.

Esempio 4 – Calcolo della circonferenza con controllo sul raggio

int r;
float circ;

do {
    cout << "Inserire la misura del raggio: "; cin >> r;
    if(r < 0 || r > 32767)
        cout << "Il valore del raggio deve essere positivo e minore di 32767" << endl;
} while(r < 0 || r > 32767);

circ = 2 * 3.14 * r;
cout << "Circonferenza = " << circ << endl;

Qui l’istruzione do...while consente di evitare una
inizializzazione fittizia (come r=-1 nel caso del while)
perché il blocco di input viene comunque eseguito almeno una volta.