
//
// To jest przykładowy kod z podrozdziału 10.7.2 „Oddzielenie warstwy komunikacyjnej od funkcji” książki 
// "Programowanie. Teoria i praktyka z wykorzystaniem C++" Bjarne'a Stroustrupa.
//

#include "std_lib_facilities.h"

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

void skip_to_int()
{
    if (cin.fail()) {          // Znaleziono coś, co nie jest liczbą całkowitą.
        cin.clear();           // Chcemy przyjrzeć się znakom.
        char ch;
        while (cin>>ch){       // Odrzuca niecyfry.
            if (isdigit(ch)) {
                cin.unget();   // Oddaje cyfrę z powrotem, dzięki czemu można odczytać liczbę.
                               
                return;
            }
        }
    }
    error("Brak danych.");         // Stan eof lub bad — poddajemy się.
}

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

int get_int()
{
    int n = 0;
    while (true) {
        if (cin >> n) return n;
        cout << "Niestety, to nie była liczba. Spróbuj jeszcze raz.\n";
        skip_to_int();
    }
}

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

int get_int(int low, int high, const string& greeting, const string& sorry)
{
    cout << greeting << ": [" << low << ':' << high << "]\n";

    while (true) {
        int n = get_int();
        if (low<=n && n<=high) return n;
        cout << sorry  << ": [" << low << ':' << high << "]\n";
    }
}

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

int main()
try
{
    int strength = get_int(1,10, "Określ siłę.", "Liczba spoza zakresu. Spróbuj ponownie.");
    cout << "Siła: " << strength << endl;

    int altitude = get_int(0,50000,
                           "Podaj wysokość nad poziomem morza w metrach.",
                           "Liczba spoza zakresu. Spróbuj ponownie.");
    cout << "Wysokość: " << altitude << "f nad poziomem morza.\n";
}
catch (exception& e) {
    cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    cerr << "Nieznany wyjątek!\n"; 
    return 2;
}

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