
//
// 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"

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

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();                 // Wczytuje liczbę typu int ze strumienia cin.
int get_int(int low, int high);// Wczytuje liczbę typu int należącą do zakresu <low,high> ze strumienia cin.

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

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)
{
    cout << "Podaj liczbę całkowitą z zakresu od "
         << low << " dto " << high << " (włącznie):\n";

    while (true) {
        int n = get_int();
        if (low<=n && n<=high) return n;
        cout << "Niestety "
             << n << " nie należy do zakresu [" << low << ':' << high
             << ">. Spróbuj jeszcze raz.\n";
    }
}

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

int main()
try
{
    int n = get_int(1,10);
    cout << "n: " << n << endl;

    int m = get_int(2,300);
    cout << "m: " << m << endl;
}
catch (exception& e) {
    cerr << "Błąd: " << e.what() << '\n'; 
    return 1;
}
catch (...) {
    cerr << "Nieznany wyjątek!\n"; 
    return 2;
}

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