// cppexc1.cpp - Esimerkki virheenhallinnasta perinteisellä tavalla // Perustuu Vesa Lappalaisen kirjoittamaan aku.cpp:hen // Antti-Juhani Kaijanaho, 2001-03-21 // Muutokset: Vesa Lappalainen 20.3.2002 // + ei saman numeron toistoa #include #include #include using std::cout; using std::ios; using std::string; using std::ostream; using std::setw; using std::endl; /* Muuttaa parametrina annetun arvosanan sanalliseksi. Jos arvosana * on mahdoton, palautetaan tyhjä merkkijono. */ string arvostelu_sanana(double arvo) { if ( arvo < 4 || 10 < arvo ) return ""; if ( arvo <= 4.5) return "hylätty"; if ( arvo < 7 ) return "välttävä"; if ( arvo < 9 ) return "tyydyttävä"; return "erinomainen"; } class cOppilas { string nimi; double keskiarvo; public: cOppilas(const string &animi, double arvo = 4) : nimi(animi), keskiarvo(arvo) {} int tulosta(ostream &os=cout) const; }; // Palautetaan 0 jos jokin meni pieleen int cOppilas::tulosta(ostream &os) const { ios::fmtflags oldf = os.setf(ios::showpoint | ios::fixed | ios::left); int oldp = os.precision(2); os << setw(22) << nimi; os.setf(ios::right); os << " keskiarvo: " << setw(5) << keskiarvo << endl; string sanana = arvostelu_sanana(keskiarvo); if (sanana != "") { os << " sanoina: " << sanana << endl; os << endl; } os.flags(oldf); os.precision(oldp); if (sanana == "") return 1; else return 0; } int main() { cOppilas aku("Ankka Aku",5.0); cOppilas mikki("Hiiri Mikki",9.0); cOppilas tosi_outo("Tosi Outo", 3.5); cout << setw(5) << 5.6 << endl; int ok = aku.tulosta(); cout << setw(5) << 5.6 << endl; if (!ok) { cout << "Virheellinen arvosana!" << endl; return 1; } ok = tosi_outo.tulosta(); cout << setw(5) << 5.6 << endl; if (!ok) { cout << "Virheellinen arvosana!" << endl; return 1; } ok = mikki.tulosta(); cout << setw(5) << 5.6 << endl; if (!ok) { cout << "Virheellinen arvosana!" << endl; return 1; } return 0; }