/* valuutta.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 mjonot.c, mjonotpp.cpp ** (ja vstring.cpp BC 3.1) / vl-96 */ #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 { 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() { if ( max_koko > 0 ) delete [] alkiot; } cValuutat(int koko=0) { varaa(koko); } cValuutat(const cValuutat &luvut) { varaa(0); sijoita(luvut); } ~cValuutat() { vapauta(); } int lisaa(const cValuutta &n) { if ( lkm >= max_koko ) return 1; alkiot[lkm++] = n; return 0; } cValuutat &sijoita(const cValuutat &luvut); cValuutat &operator=(const cValuutat &luvut) { return sijoita(luvut); } int etsi(const cValuutta &etsittava) const; int lue(); const string &valuutta(const char *val) const; double kerroin(const cValuutta &val) const; const string &mk() const { return alkiot[0].Valuutta(); } }; cValuutat &cValuutat::sijoita(const cValuutat &luvut) { if ( this == &luvut ) return *this; if ( max_koko != luvut.max_koko ) { vapauta(); varaa(luvut.max_koko); } lkm = 0; 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(MAX_VALUUTTOJA); if ( valuutat.lue() ) return 1; cNaytto naytto(&valuutat); while ( naytto.kysy() == 0 ) naytto.tulosta(); cout << "Kiitos!" << endl; return 0; }