// kysykaks.cpp // Malli siitä, miten voidaan turvallisesti lukea kokonaisluku // päätteeltä. // Vesa Lappalainen 1.2.2000 #include #include #include using namespace std; const int kysyOletus = 20000; void kysy(int *luku, const char *kysymys, int oletus=kysyOletus, int ala=-kysyOletus,int yla=kysyOletus) // Aliohjelmalla kysytään kokonaisluku. Luvun on // oltava välillä [ala,yla]. (Väli muutetaan aina oikeinpäin) // Jos oletusparametri annetaan, niin pelkkä [ret] palauttaa // oletusarvon. Näyttöön tulostetaan kysymys ja mahdollinen // oletusarvo. // Esim: kysy(&ika,"Anna ikäsi") // tulostaa: Anna ikäsi > // ja syötöksi kelpaa mikä tahans luku väliltä [-20000,20000] // Esim: kysy(&vuosi,"Anna vuosi",2000,0,2020) // tulostaa: Anna vuosi (2000) > // ja syötöksi kelpaa mikä tahansa luku väliltä [0,2020] // pelkän ret-painaminen palauttaa luvun 2000 { int a; string s; if ( ala > yla ) { int t = ala; ala = yla ; yla = t; } while ( 1 ) { a = oletus; cout << kysymys; if ( oletus != kysyOletus ) cout << " (" << oletus << ")"; cout << " >"; getline(cin,s); // Luetaan syöttö merkkijonoon! if ( ( oletus != kysyOletus ) && ( s == "" ) ) break; int lkm = sscanf(s.c_str(),"%d",&a); // onnistuneesti "parsittujen" % lkm if ( lkm < 1 ) { cout << "Syötäppä numeroita, kiitos!\n"; continue; } if ( ala <= a && a <= yla ) break; // Hyvin meni cout << "Luvun pitäisi olla välillä [" << ala << "," << yla << "]!\n"; } *luku = a; } int main(void) { int a,b,c; cout << "==================================\n"; kysy(&a,"Anna 1. luku ",34,50,23); kysy(&b,"Anna 2. luku "); c = a + b; cout << " Summa " << a << " + " << b << " = " << c << "\n"; return 0; }