/* cppexc.cpp */ #include #include #include using namespace std; /****************************************************************************/ // Luokka tulostustarkkuuden asettamiseksi class cStreamPre { ostream &os; long oldf; int oldp; public: cStreamPre(ostream &aos=cout,int npre=1,long flags=0) : os(aos) { oldf = os.setf(ios::showpoint | ios::fixed | flags); oldp = os.precision(npre); } ~cStreamPre() { os.flags(oldf); os.precision(oldp); } }; class cVirheellinenArvosana { }; string arvostelu_sanana(double arvosana) { if (arvosana < 4) throw cVirheellinenArvosana(); if (arvosana < 5) return "hylätty"; if (arvosana < 7) return "välttävä"; if (arvosana < 9) return "tyydyttävä"; if (arvosana <= 10) return "erinomainen"; throw cVirheellinenArvosana(); } /****************************************************************************/ class cOppilas { string nimi; double keskiarvo; public: cOppilas(const string &animi, double arvo = 0 ) : nimi(animi) { keskiarvo = arvo; } ostream &tulosta(ostream &os=cout) const; }; ostream &cOppilas::tulosta(ostream &os) const { cStreamPre pre(os,2,ios::left); os << setw(22) << nimi; os.setf(ios::right); os << " keskiarvo: " << setw(5) << keskiarvo << endl; os << " sanoina: " << arvostelu_sanana(keskiarvo) << endl; os << endl; return os; } /****************************************************************************/ int main(void) { try { 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; aku.tulosta(); cout << setw(5) << 5.6 << endl; mikki.tulosta(); cout << setw(5) << 5.6 << endl; tosi_outo.tulosta(); cout << setw(5) << 5.6 << endl; } catch (cVirheellinenArvosana) { cout << "Nyt tuli hätä!"; cout << setw(5) << 5.6 << endl; } return 0; }