Kurs C++: Pętle i Iteracje

Pętla do...while jest wyjątkowo przydatna w walidacji danych, ponieważ jej konstrukcja gwarantuje, że użytkownik musi wprowadzić dane co najmniej raz. Dzięki temu idealnie sprawdza się w sytuacjach, gdzie:

✅ Dane wejściowe muszą spełniać określone kryteria (np. zakres liczb, format tekstu).
✅ Wymagana jest ponowna prośba o dane po błędzie.
✅ Użytkownik musi zatwierdzić swoje działanie.


1. Przykład – Walidacja liczby z określonego zakresu

W tym przykładzie użytkownik musi podać liczbę między 1 a 100. Pętla będzie powtarzać prośbę, dopóki nie zostanie spełniony warunek.

#include <iostream>
using namespace std;

int main() {
    int liczba;

    do {
        cout << "Podaj liczbę z zakresu 1-100: ";
        cin >> liczba;

        if (liczba < 1 || liczba > 100) {
            cout << "Błędna wartość! Spróbuj ponownie." << endl;
        }
    } while (liczba < 1 || liczba > 100);

    cout << "Podałeś poprawną liczbę: " << liczba << endl;

    return 0;
}

Zaleta: Pętla do...while wymusza podanie liczby co najmniej raz i kontynuuje działanie, dopóki użytkownik nie poda poprawnej wartości.


2. Przykład – Walidacja wprowadzenia tekstu

W tym przypadku program poprosi użytkownika o wprowadzenie tekstu, który nie może być pusty.

#include <iostream>
#include <string>
using namespace std;

int main() {
    string imie;

    do {
        cout << "Podaj swoje imię: ";
        getline(cin, imie);

        if (imie.empty()) {
            cout << "Pole nie może być puste! Spróbuj ponownie." << endl;
        }
    } while (imie.empty());

    cout << "Witaj, " << imie << "!" << endl;

    return 0;
}

Zaleta: Program uniemożliwi przejście dalej, jeśli użytkownik poda pusty tekst.


3. Przykład – Walidacja danych liczbowych (obsługa błędów wejścia)

Pętla do...while jest także pomocna, gdy istnieje ryzyko wpisania niepoprawnych danych (np. liter zamiast liczb).

#include <iostream>
using namespace std;

int main() {
    int liczba;

    do {
        cout << "Podaj liczbę całkowitą: ";
        cin >> liczba;

        if (cin.fail()) {
            cin.clear();             // Kasowanie błędu
            cin.ignore(1000, '\n');  // Usunięcie niepoprawnych danych
            cout << "To nie jest liczba! Spróbuj ponownie." << endl;
        }
    } while (cin.fail());

    cout << "Podałeś poprawną liczbę: " << liczba << endl;

    return 0;
}

Zaleta: Dzięki cin.clear() i cin.ignore() program nie zawiesi się po wpisaniu błędnych danych.


4. Przykład – Potwierdzenie zakończenia programu

Pętla do...while jest także przydatna, gdy użytkownik musi potwierdzić zakończenie programu.

#include <iostream>
using namespace std;

int main() {
    char decyzja;

    do {
        cout << "Czy na pewno chcesz zakończyć program? (t/n): ";
        cin >> decyzja;

        if (decyzja != 't' && decyzja != 'n') {
            cout << "Niepoprawny wybór! Wpisz 't' lub 'n'." << endl;
        }
    } while (decyzja != 't');

    cout << "Program zakończony." << endl;

    return 0;
}

Zaleta: Program wymusza wpisanie poprawnej odpowiedzi, co minimalizuje błędy użytkownika.


5. Przykład – Sprawdzanie poprawności hasła

W tym przypadku użytkownik musi wprowadzić hasło o określonej długości.

#include <iostream>
#include <string>
using namespace std;

int main() {
    string haslo;

    do {
        cout << "Podaj hasło (minimum 8 znaków): ";
        getline(cin, haslo);

        if (haslo.length() < 8) {
            cout << "Hasło jest za krótkie! Spróbuj ponownie." << endl;
        }
    } while (haslo.length() < 8);

    cout << "Hasło zaakceptowane!" << endl;

    return 0;
}

Zaleta: Zapewnia bezpieczeństwo poprzez wymuszenie podania odpowiednio długiego hasła.


Podsumowanie

Pętla do...while jest świetnym narzędziem do walidacji danych, ponieważ:
✅ Zawsze prosi użytkownika o dane przynajmniej raz.
✅ Pozwala łatwo obsłużyć błędne dane.
✅ Idealnie nadaje się do sytuacji, gdzie użytkownik musi potwierdzić swój wybór.