/* valuuttd.cpp */ /* Ohjelma, jossa rahanvaihtotaulukko luetaan tiedostosta joka on muotoa: ** mk 1.0 ** $ 5.7 ** ECU 6.5 ** SKr 0.9 ** */ #include #include #include #include #include #include "mjonotpp.h" #include "streampr.h" #define MAX_VALUUTTOJA 20 //--------------------------------------------------------------------------- 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); } //--------------------------------------------------------------------------- class cValuutat { protected: int max_koko; int lkm; cValuutta **alkiot; int varaa(int koko) { lkm = 0; max_koko = 0; if ( koko <= 0 ) return 0; alkiot = new cValuutta*[koko]; if ( alkiot ) max_koko = koko; return max_koko == 0; } public: void vapauta(); cValuutat(int koko=0) { varaa(koko); } cValuutat(const cValuutat &taulu) { varaa(0); sijoita(taulu); } ~cValuutat() { vapauta(); } int lisaa(const cValuutta &n) { if ( lkm >= max_koko ) return 1; cValuutta *uusi = new cValuutta(n); if ( !uusi ) return 1; alkiot[lkm++] = uusi; return 0; } cValuutat &sijoita(const cValuutat &taulu); cValuutat &operator=(const cValuutat &taulu) { return sijoita(taulu); } int etsi(const cValuutta &etsittava) const; int lue(const char *nimi); const string &valuutta(const char *val) const; double kerroin(const cValuutta &val) const; const string &mk() const { return alkiot[0]->Valuutta(); } }; void cValuutat::vapauta() { for (int i=0; i< lkm; i++) delete alkiot[i]; if ( max_koko > 0 ) delete [] alkiot; lkm = 0; max_koko = 0; } cValuutat &cValuutat::sijoita(const cValuutat &taulu) { if ( this == &taulu ) return *this; vapauta(); varaa(taulu.max_koko); for (int i=0; i= 0 ) return alkiot[i]->Maara(); return 1.0; } const string &cValuutat::valuutta(const char *val) const { static string virhe("?$?"); int i = etsi(cValuutta(1.0,val)); if ( i >= 0 ) return alkiot[i]->Valuutta(); return 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; cNaytto naytto(&valuutat); while ( naytto.kysy() == 0 ) naytto.tulosta(); cout << "Kiitos!" << endl; return 0; }