/* valuuttt.cpp */ /* Ohjelma, jossa rahanvaihtotaulukko luetaan tiedostosta joka on muotoa: ** mk 1.0 ** $ 5.7 ** ECU 6.5 ** SKr 0.9 ** ** K„„nt„misess„ projektiin lis„ksi string.cpp, mjonot.c, mjonot.cpp / vl-96 ** Ohjelmassa n„ytet„„n samalla templaten k„ytt” ja perint„. */ #include #include #include #include #include #include "mjonotpp.h" #include "streampr.h" #include "dyntaul.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; } }; ostream &operator<<(ostream &os,const cValuutta &valuutta) { return valuutta.tulosta(os); } istream &operator>>(istream &is,cValuutta &valuutta) { string rivi; getline(is,rivi); valuutta.alusta(rivi); return is; } //--------------------------------------------------------------------------- // Perit„„n dynaamisen taulukon cValuuttoja tallettavasta versiosta // cValuutat, johon lis„t„„n muutama valuutoille ominainen lis„piirre class cValuutat : public cDynTaulu_rw { static string virhe; public: cValuutat(int koko=0) : cDynTaulu_rw(koko,"\n") { ; } const string &valuutta(const char *val) const { int i = etsi(cValuutta(1.0,val)); if ( i >= 0 ) return alkiot[i]->Valuutta(); return virhe; } double kerroin(const cValuutta &val) const { int i = etsi(val); if ( i >= 0 ) return alkiot[i]->Maara(); return 1.0; } const string &mk() const { return alkiot[0]->Valuutta(); } }; string cValuutat::virhe("?$?"); //--------------------------------------------------------------------------- class cNaytto { cValuutat *valuutat; cValuutta valuutta; char valuutta_jono[80]; public: cNaytto(cValuutat *val) : valuutat(val) { valuutta_jono[0] = 0; } void tulosta() { double mk_maara = valuutat->kerroin(valuutta) * valuutta.Maara(); cValuutta mk(mk_maara,valuutat->mk()); cout << valuutta << " on " << mk << endl; } int kysy(); }; int cNaytto::kysy() { string jono; double raha; cout << "M„„r„ ja valuutta>"; getline(cin,jono); if ( jono == "" ) return 1; if ( jono == "loppu" ) return 1; sscanf(jono.c_str(),"%lf%s",&raha,valuutta_jono); valuutta.alusta(raha,valuutat->valuutta(valuutta_jono)); return 0; } //--------------------------------------------------------------------------- int main(void) { cValuutat valuutat(20); if ( valuutat.lue("valuutat.dat") ) return 1; cout << valuutat; cNaytto naytto(&valuutat); while ( naytto.kysy() == 0 ) naytto.tulosta(); cout << "Kiitos!" << endl; return 0; }