/* valuutta.h */ /* Ohjelma, jossa rahanvaihtotaulukko luetaan tiedostosta joka on muotoa: ** mk 1.0 ** $ 5.7 ** ECU 6.5 ** SKr 0.9 ** ** Toteutettu STL:n talletusluokalla list ** Täytynyt tehdä operattori != cValuutta-luokaan ** Vesa Lappalainen 15.4.1999 */ #include #include #include #include #include #include "mjonotpp.h" #include "streampr.h" //--------------------------------------------------------------------------- class cValuutta { string valuutta; double maara; public: int alusta(const string &st) { // "mk 1.00" char val[100]; if ( sscanf(st.c_str(),"%s %lf",val,&maara) != 2 ) return 1; valuutta = val; return 0; } int alusta(double d,const string &st) { maara = d; valuutta = st; return 0; } cValuutta(double d=1.0, const string &st = "mk") { alusta(d,st); } cValuutta(const string &st) { alusta(st); } double Maara() const { return maara; } const string &Valuutta() const { return valuutta; } ostream &tulosta(ostream &os) const { cStreamPre pre(os,2); os << maara << " " << valuutta; return os; } int operator==(const cValuutta &val) const { return onko_samat(valuutta,val.valuutta) == 0; } int operator!=(const cValuutta &val) const { return onko_samat(valuutta,val.valuutta) != 0; } }; inline ostream &operator<<(ostream &os,const cValuutta &valuutta) { return valuutta.tulosta(os); } inline istream &operator>>(istream &is,cValuutta &valuutta) { string rivi; getline(is,rivi); valuutta.alusta(rivi); return is; } #include #include //--------------------------------------------------------------------------- // Perit„„n list-luokasta // cValuutat, johon lis„t„„n muutama valuutoille ominainen lis„piirre class cValuutat : public list { static string virhe; public: cValuutat(int koko=0) : list() { ; } const string &valuutta(const char *val) const { cValuutat::const_iterator i = find(begin(),end(),cValuutta(1.0,val)); if ( i != end() ) return i->Valuutta(); return virhe; } double kerroin(const cValuutta &val) const { cValuutat::const_iterator i = find(begin(),end(),val); if ( i != end() ) return i->Maara(); return 1.0; } const string &mk() const { return begin()->Valuutta(); } int lue(const string &nimi) { ifstream f(nimi.c_str()); if ( !f ) return 1; string rivi; while ( getline(f,rivi) ) { push_back(cValuutta(rivi)); } return 0; } }; inline ostream &operator<<(ostream &os, const cValuutat &v) { copy(v.begin(),v.end(),ostream_iterator(os,"\n")); return os; }