Kurs C++: Pętle i Iteracje

W tej lekcji stworzymy prosty kalkulator, który działa w sposób iteracyjny – tzn. pozwala użytkownikowi na wielokrotne wykonywanie obliczeń w pętli, aż do momentu wyjścia z programu.


1. Struktura kalkulatora iteracyjnego

🔹 Kalkulator powinien:
✅ Pytać użytkownika o wybór operacji.
✅ Pobierać dwie liczby i wykonywać obliczenia.
✅ Pozwalać na powtarzanie operacji aż do wyjścia.
✅ Obsługiwać błędy i niepoprawne dane.


2. Implementacja podstawowego kalkulatora iteracyjnego

#include <iostream>
using namespace std;

int main() {
    char operacja;
    double a, b;
    
    while (true) {
        // Wyświetlenie dostępnych operacji
        cout << "\n--- Kalkulator ---\n";
        cout << "Wybierz operację (+, -, *, /) lub 'q' aby wyjść: ";
        cin >> operacja;

        // Sprawdzenie czy użytkownik chce zakończyć działanie kalkulatora
        if (operacja == 'q' || operacja == 'Q') {
            cout << "Zamykanie kalkulatora...\n";
            break;  // Zakończenie pętli
        }

        // Pobranie dwóch liczb
        cout << "Podaj pierwszą liczbę: ";
        cin >> a;
        cout << "Podaj drugą liczbę: ";
        cin >> b;

        // Wykonanie wybranej operacji
        switch (operacja) {
            case '+':
                cout << "Wynik: " << a + b << endl;
                break;
            case '-':
                cout << "Wynik: " << a - b << endl;
                break;
            case '*':
                cout << "Wynik: " << a * b << endl;
                break;
            case '/':
                if (b != 0) {
                    cout << "Wynik: " << a / b << endl;
                } else {
                    cout << "Błąd! Dzielenie przez zero jest niedozwolone.\n";
                }
                break;
            default:
                cout << "Niepoprawna operacja! Spróbuj ponownie.\n";
        }
    }

    return 0;
}

3. Jak działa kalkulator?

🔹 Pętla while (true) zapewnia iteracyjność – kalkulator działa w nieskończoność, dopóki użytkownik nie wpisze 'q'.
🔹 Użycie switch-case pozwala na łatwe zarządzanie operacjami matematycznymi.
🔹 Obsługa błędu dzielenia przez zero zapobiega awariom.
🔹 Kalkulator obsługuje operacje: +, -, *, /.


4. Rozszerzona wersja – obsługa większej ilości błędów

Dodamy zabezpieczenie na wypadek błędnych danych wejściowych:

#include <iostream>
using namespace std;

int main() {
    char operacja;
    double a, b;
    
    while (true) {
        cout << "\n--- Kalkulator ---\n";
        cout << "Wybierz operację (+, -, *, /) lub 'q' aby wyjść: ";
        cin >> operacja;

        if (operacja == 'q' || operacja == 'Q') {
            cout << "Zamykanie kalkulatora...\n";
            break;
        }

        cout << "Podaj pierwszą liczbę: ";
        if (!(cin >> a)) {
            cout << "Błąd! Wprowadzono nieprawidłową liczbę.\n";
            cin.clear();  // Czyścimy błąd strumienia
            cin.ignore(1000, '\n');  // Pomijamy błędne dane
            continue;
        }

        cout << "Podaj drugą liczbę: ";
        if (!(cin >> b)) {
            cout << "Błąd! Wprowadzono nieprawidłową liczbę.\n";
            cin.clear();
            cin.ignore(1000, '\n');
            continue;
        }

        switch (operacja) {
            case '+': cout << "Wynik: " << a + b << endl; break;
            case '-': cout << "Wynik: " << a - b << endl; break;
            case '*': cout << "Wynik: " << a * b << endl; break;
            case '/': 
                if (b != 0) cout << "Wynik: " << a / b << endl;
                else cout << "Błąd! Dzielenie przez zero jest niedozwolone.\n";
                break;
            default:
                cout << "Niepoprawna operacja! Spróbuj ponownie.\n";
        }
    }

    return 0;
}

Dodatkowe zabezpieczenia:
🔹 Jeśli użytkownik wpisze coś innego niż liczbę, program czyści błędne dane i ponawia pytanie.
🔹 Obsługa błędów zapobiega awarii programu przy nieprawidłowym wejściu.


5. Podsumowanie

Kalkulator działa iteracyjnie – użytkownik może wykonywać operacje wielokrotnie.
Obsługuje operacje +, -, *, /.
Instrukcja switch-case pozwala na łatwe zarządzanie działaniami.
Pętla while (true) pozwala na ciągłe działanie kalkulatora.
Obsługa błędów chroni przed awariami (np. dzielenie przez zero, błędne dane).