
//
// To jest przykładowy kod z podrozdziału 10.7.1 „Rozłożenie problemu na mniejsze części” książki 
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include "std_lib_facilities.h"

//------------------------------------------------------------------------------

int main()
try
{
    cout << "Podaj liczbę całkowitą z zakresu od 1 do 10 (włącznie):\n";
    int n = 0;
    while (true)    {
        cin >> n;
        if (cin) {    // Mamy liczbę całkowitą; sprawdzamy ją.
            if (1<=n && n<=10) break;
            cout << "Niestety "
                 << n << " nie należy do zakresu <1,10>. Spróbuj jeszcze raz.\n";
        }
        else if (cin.fail()) {    // Znaleziono coś, co nie jest liczbą całkowitą.
            cin.clear();          // Ustawia stan z powrotem na good().
                                  // Chcemy przyjrzeć się znakom.
            cout << "Niestety, to nie była liczba. Spróbuj jeszcze raz.\n";
            char ch;
            while (cin>>ch && !isdigit(ch)); // Odrzuca niecyfry.
            if (!cin) error("Brak danych.");     // Nie znaleziono cyfry — poddajemy się.
            cin.unget();    // Oddaje cyfrę z powrotem, dzięki czemu można odczytać liczbę.
        }
        else {
            error("Brak danych.");    // Stan eof lub bad — poddajemy się.
        }
    }
    // Jeśli dotrzemy do tego miejsca, oznacza to, że n należy do zakresu <1,10>.
    return n;
}
catch (exception& e) {
    cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    cerr << "Nieznany wyjątek!\n"; 
    return 2;
}

//------------------------------------------------------------------------------
