/* tuoterek.cpp */ /* Ohjelma lukee tiedostoa TUOTTEET.DAT, joka on muotoa: Volvo | 12300 | 1 Audi | 55700 | 2 Saab | 1500 | 4 Volvo | 123400 | 1 Ohjelma tulostaa kuhunkin tuoteluokkaan kuuluvien tuotteiden yhteishinnat ja kappalem„„r„t sek„ koko varaston yhteishinnan ja kappalem„„r„n. Vesa Lappalainen 15.3.1996 Projektiin: tuoterek.cpp,C\ALI\mjonot.c,C\ALI\mjonotpp.cpp,C\ALI\string.cpp */ #include #include #include #include #include #include #include #include #include //--------------------------------------------------------------------------- class cTuote { string nimike; double hinta; int kpl; public: void alusta(const char *n,double h,int k=0) { nimike = n; hinta = h; kpl = k; } void alusta(const char *rivi) { // Alustaa jonosta Volvo|4500|3 istrstream sstr((char *)rivi); sstr >> *this; } void alusta() { alusta("",0,0); } cTuote() { alusta(); } cTuote(const char *rivi) { alusta(rivi); } cTuote(const char *n,double h,int k=0) { alusta(n,h,k); } friend istream &operator>>(istream &is,cTuote &tuote); friend ostream &operator<<(istream &os,const cTuote &tuote); ostream &tulosta(ostream &os) const ; #if 0 cTuote &operator=(char *rivi) { // Jos tehd„„n yksi = alusta(rivi); return *this; } #endif #if 0 const cTuote &operator=(cTuote &tuote) { // Pit„„ BC 3.1:ss„ tehd„ muutkin? nimike = tuote.nimike; hinta = tuote.hinta; kpl = tuote.kpl; return *this; } #endif cTuote &operator+=(const cTuote &tuote) { hinta += tuote.hinta * tuote.kpl; kpl += tuote.kpl; return *this; } int operator==(const string &s) const { return onko_samat(nimike,s) == 0; } const string &Nimike() const { return nimike; } }; ostream &operator<<(ostream &os,const cTuote &tuote) { return tuote.tulosta(os);} ostream &cTuote::tulosta(ostream &os) const { long oldf = os.setf(ios::left); os << setw(20) << nimike << " " << setiosflags(ios::right) << setw(7) << hinta << " " << setw(4) << kpl; os.flags(oldf); return os; } istream &operator>>(istream &is,cTuote &tuote) { char jono[50]; tuote.alusta(); is.getline(N_S(jono),'|'); tuote.nimike = poista_tyhjat(jono); is.getline(N_S(jono),'|'); sscanf(jono,"%lf",&tuote.hinta); is.getline(N_S(jono),'\n'); sscanf(jono,"%d",&tuote.kpl); return is; } //--------------------------------------------------------------------------- #define MAX_TUOTTEITA 10 class cTuotteet { string nimi; cTuote yhteensa; int tuotteita; cTuote tuotteet[MAX_TUOTTEITA]; public: cTuotteet(const char *n) : nimi(n), yhteensa("Yhteens„") { tuotteita = 0; } ostream &tulosta(ostream &os) const; int etsi(const string &tnimi) const; int lisaa(const string &tnimi); int ynnaa(const cTuote &tuote); int lue(const char *s=NULL); }; int cTuotteet::etsi(const string &tnimi) const { int i; for (i=0; i= MAX_TUOTTEITA ) return -1; tuotteet[tuotteita] = cTuote(tnimi.c_str(),0.0,0); return tuotteita++; } int cTuotteet::ynnaa(const cTuote &tuote) { if ( tuote.Nimike() == "" ) return 1; int i = etsi(tuote.Nimike()); if ( i < 0 ) i = lisaa(tuote.Nimike()); if ( i < 0 ) return 1; tuotteet[i] += tuote; yhteensa += tuote; return 0; } int cTuotteet::lue(const char *s) { char rivi[80]; cTuote tuote; if ( s ) nimi = s; ifstream f(nimi.c_str()); if ( !f ) return 1; while ( !f.eof() ) { if ( !f.getline(N_S(rivi)) ) continue; tuote = rivi; // Huom! Jos ei ole operator=(&cTuote), niin cTuote(rivi) if ( ynnaa(tuote) ) cout << "Rivill„ \"" << rivi << "\" jotain pieless„!" << endl;; } return 0; } ostream &cTuotteet::tulosta(ostream &os) const { int i; os << "\n\n\n"; os << "-------------------------------------------\n"; for (i=0; i