Linguaggio C++

Iterazione Do While

Iterazione post-condizionale 'do-while' in C++. Analisi delle differenze con il ciclo 'while' e applicazione pratica in ambiente Dev-C++ attraverso un esercizio di realtà sulla validazione dei dati di input.

Durata

150 minuti

Software

Dev-C++

L'istruzione do-while è una struttura di controllo iterativa definita post-condizionale. A differenza del ciclo while, che verifica la condizione prima di eseguire il corpo del ciclo, il do-while garantisce che il blocco di istruzioni venga eseguito almeno una volta.

Usa il do…while quando il blocco deve essere eseguito almeno una volta, indipendentemente dalla condizione.
Sintassi del ciclo do-while:

do {
    // Blocco di istruzioni da eseguire
} while (condizione);

Osservate bene la sintassi: il punto e virgola ; dopo la parentesi tonda della condizione è obbligatorio. Se viene omesso, il compilatore restituirà un errore di sintassi.

Differenze principali tra while e do-while:
Caratteristica Ciclo while (Pre-condizionale) Ciclo do-while (Post-condizionale)
Controllo condizione All'inizio (test in testa) Alla fine (test in coda)
Esecuzioni minime Zero (se la condizione è subito falsa) Almeno una volta
Utilizzo tipico Quando non si sa quante volte ripetere Validazione input e Menu di scelta

Esempi


Leggere una stringa non vuota

string nome;

do {
    cout << "Inserisci il tuo nome: ";
    getline(cin, nome);

} while (nome.empty());

Generare numeri finché non si raggiunge una condizione

int x;

do {
    x = rand() % 10;
    cout << "Numero generato: " << x << endl;

} while (x != 5);

Chiedere all’utente di continuare

Questo è l’uso più classico del do…while: ripetere un’operazione finché l’utente lo desidera. La domanda deve essere posta almeno una volta, quindi il controllo dopo il blocco è perfetto.


char risposta;

do {
    cout << "Vuoi continuare? (s/n): ";
    cin >> risposta;
} while (risposta == 's' || risposta == 'S');

La validazione dell'input

Immaginiamo di dover chiedere all'utente un voto scolastico, che deve essere compreso tra 2 e 10. Con il do-while, continuiamo a chiedere il voto finché l'utente inserisce un valore errato.


int voto;
do {
    cout << "Inserisci un voto (2-10): ";
    cin >> voto;
} while (voto < 2 || voto > 10); 
// Il ciclo continua se il voto è FUORI dall'intervallo valido

Validare una scelta dal menu
int scelta;

do {
    cout << "Menu:\n";
    cout << "1. Gioca\n";
    cout << "2. Impostazioni\n";
    cout << "3. Esci\n";
    cout << "Scegli un'opzione (1-3): ";
    cin >> scelta;

    if (scelta < 1 || scelta > 3) {
        cout << "Scelta non valida, riprova.\n";
    }

} while (scelta < 1 || scelta > 3);



LABORATORIO

Gestione Magazzino e Validazione

In questo laboratorio applicheremo il ciclo do-while per creare un sistema di inserimento dati sicuro e un menu interattivo.


1 Validazione Quantità Magazzino

In un software gestionale, non è possibile caricare una quantità negativa di merce. Seguite questi passaggi per creare il programma in Dev-C++:

  • Aprite Dev-C++ e create un nuovo file sorgente (Ctrl+N).
  • Definite la variabile intera quantita.
  • Inserite la struttura do { ... } while (...);.
  • All'interno del do, inserite il messaggio di richiesta input.
  • Nella condizione del while, scrivete la condizione che mantiene attivo il ciclo (ovvero quando il dato è sbagliato: quantita < 0).

#include <iostream>
using namespace std;

int main() {
    int quantita;
    
    // Inizio ciclo di validazione
    do {
        cout << "Inserisci la quantita di prodotti in arrivo (maggiore di 0): ";
        cin >> quantita;
        
        if (quantita < 0) {
            cout << "Errore! La quantita non puo essere negativa." << endl;
        }
    } while (quantita < 0);
    
    cout << "Dato correttamente registrato: " << quantita << " pezzi." << endl;
    
    return 0;
}

2 Menu Iterativo per carisco / scarico merci

Dopo aver validato la quantità iniziale, dobbiamo permettere all'utente di gestire il magazzino attraverso un menu interattivo. Il programma deve continuare a mostrare le opzioni finché l'utente non decide di uscire.

Obiettivi della fase 2:
  • Utilizzare una variabile scelta per navigare nel menu.
  • Implementare un ciclo do-while principale che racchiuda le operazioni di modifica.
  • Gestire l'incremento (carico) e il decremento (scarico) della merce.
  • Controllo di realtà: Non è possibile scaricare più pezzi di quanti ne siano effettivamente presenti in magazzino.

#include <iostream>
using namespace std;

int main() {
    int quantita, scelta, variazione;
    
    // 1. Validazione input iniziale (fatta nel punto precedente)
    do {
        cout << "Inserisci la giacenza iniziale di magazzino: ";
        cin >> quantita;
    } while (quantita < 0);

    // 2. Inizio Ciclo Menu
    do {
        cout << "\n--- GESTIONE MAGAZZINO (Attuale: " << quantita << " pezzi) ---" << endl;
        cout << "1. Carico merce (Aggiungi)" << endl;
        cout << "2. Scarico merce (Togli)" << endl;
        cout << "3. Esci dal programma" << endl;
        cout << "Scelta: ";
        cin >> scelta;

        switch(scelta) {
            case 1:
                do {
                    cout << "Quanti pezzi vuoi aggiungere? ";
                    cin >> variazione;
                } while (variazione <= 0);
                quantita = quantita + variazione;
                cout << "Carico effettuato con successo!" << endl;
                break;

            case 2:
                do {
                    cout << "Quanti pezzi vuoi togliere? ";
                    cin >> variazione;
                    if (variazione > quantita) {
                        cout << "Errore! Non puoi togliere piu di " << quantita << " pezzi." << endl;
                    }
                } while (variazione <= 0 || variazione > quantita);
                quantita = quantita - variazione;
                cout << "Scarico effettuato con successso!" << endl;
                break;

            case 3:
                cout << "Chiusura del sistema in corso..." << endl;
                break;

            default:
                cout << "Opzione non valida! Riprova." << endl;
        }

    } while (scelta != 3); // Il ciclo continua finche l'utente NON preme 3

    cout << "Giacenza finale salvata: " << quantita << " pezzi." << endl;
    return 0;
}

Durante l'esecuzione su Dev-C++, prestate attenzione a come abbiamo annidato i cicli:

Ciclo Esterno Gestisce la persistenza del programma. Finché non scegliamo "Esci", il software non termina.
Cicli Interni Vengono usati come "filtri" per ogni singola operazione, impedendo di inserire numeri negativi o quantità superiori alla disponibilità.

3 Esercizio in autonomia: Gestione Bancomat

Siete stati assunti per sviluppare il modulo software di una nuova carta prepagata per studenti. Il programma deve permettere di gestire il borsellino elettronico in modo sicuro, impedendo operazioni non consentite.

Il software deve iniziare richiedendo il caricamento iniziale della carta (che non può essere negativo). Successivamente, deve mostrare un menu interattivo che permetta di eseguire diverse operazioni finché l'utente non decide di uscire.

Voci del Menu da sviluppare:
  • Visualizza Saldo: Mostra l'importo attualmente disponibile sulla carta.
  • Ricarica: Permette di aggiungere credito.
  • Pagamento Acquisto: Permette di scalare l'importo di un acquisto.

4 Esercizio in autonomia: Gestione Serbatoio Smart Agricolo

Immaginate di dover programmare il software di controllo per un serbatoio smart dedicato all'irrigazione di una serra tecnologica. Il sistema deve monitorare il livello dell'acqua e permettere operazioni di riempimento e svuotamento in totale sicurezza.

  • Inizializzazione: Il programma richiede la capacità massima del serbatoio (es. 500 litri) e il livello attuale dell'acqua. Entrambi i valori devono essere positivi e il livello attuale non può superare la capacità massima (usare un do-while per la validazione).
  • Menu di Controllo: Deve essere mostrato un menu ciclico con le seguenti opzioni:
Opzione Descrizione e Vincoli
1. Stato Serbatoio Visualizza i litri attuali e lo spazio libero rimanente.
2. Rifornimento Permette di aggiungere acqua. Vincolo: Non si può aggiungere una quantità che faccia traboccare il serbatoio. Se accade, l'operazione va annullata o corretta.
3. Irrigazione Permette di prelevare acqua per le piante. Vincolo: Non si può prelevare più acqua di quella disponibile.
4. Esci Termina il monitoraggio.

Suggerimento: Per rendere il programma più professionale, ad ogni operazione di rifornimento o irrigazione andata a buon fine, stampate a video il nuovo livello raggiunto.






C++, Do-While, Iterazione, Programmazione, Laboratorio, Scuola Superiore,