/* kassa2.cpp - tehtäviä kassakone-ohjelmaan. Ongelma: Ohjelma toimii alkeellisena kassakoneena JO-112: Kirjoita C++-ohjelma, joka matkii yksinkertaisen kassakoneen toimintaa: Ensin kaikista myyntiartikkeleista luetaan näppäimistöltä (korvataa tiedostosta) koodi, nimi ja yksikköhinta, jotka tallennetaan taulukoihin. Sitten kustakin myytävästä tuotteesta luetaan koodi ja kappalemäärä. Lopuksi tulostetaan näytölle kuitti, josta näkyy kunkin tuotteen kokonaishinta sekä kaikkien ostosten yhteishinta. Syöttö ja tulostus tehdään omissa funktioissaan. Samalla suorituskerralla voidaan palvella useita asiakkaita. Tekijä: Vesa Lappalainen 28.2.2002 Projektiin: tämä, mjonot.c (Huom! Muista päivittää \kurssit\cpp\ali!) Tehtäviä: ========= 1) Mitä puuttuu cTuotteet destruktorista? Korjaa puute. 2) Mitä puuttuu metodista cTuotteet::anna? Korjaa puute. 3) Täydennä cTuotteet::etsi toimivaksi. 4) Täydennä cKassakone::tyhjenna_kuitti toimivaksi 5) Täydennä cKassakone::tulosta_kuitti toimivaksi 6) Täydennä cKayttoliittyma::tulosta_kuitti toimivaksi 7) Täydennä cKayttoliittyma::aja toimivaksi 8) Tee tiedoston luku cTuoteet::lue_tiedosto toimivaksi 9) Muuta ohjelmaa niin, että jos tuotteesta ei anneta määrää, se on 1 Eli syötöt >maito 1[ret] ja >maito[ret] ovat samoja. 10) Muuta ohjelma toimimaan siten, että kelpaa myös syöttö: >mai[ret] >v[ret] jolloin otetaan käyttöön ensimmäinen mai ja v alkuinen tuote 11) Erota cTuote, cTuotteet, cKassakone omiksi tiedostoikseen Tee graafinen käyttöliittymä C++Builderillä. Vrt. esim: (Saa tehdä myös jollakin Linux-vehkeellä :-) http://www.mit.jyu.fi/~vesal/kurssit/cpp/moniste/esim/win/raha/ ja tiedostot val*.* Graafisen ikkunana, esim. TMemoon saat kuitin jos tulostat sen ensin merkkijonotietovirtaan ja sitten lisäät tämän merkkijonon TMemoon. Graafisen käyttöliittymän tekemisestä katso esim: http://www.mit.jyu.fi/~vesal/kurssit/winohj/html/delphi/m.htm Muutokset: 1.3.2002/vl + tulostuksen muotoilu cStreamPre-luokan avulla + alusta vaihdettu nimelle setAsString + lisätty cKassakone + lisätty cKayttoliittyma + cTuotteet::tyhjenna + cTuotteet::etsi Suunnitelma: ============ Olen armottoman hieno kassakone... Anna koodi ja määrä >maito 3 l[ret] Anna koodi ja määrä >voi 2 kg[ret] Anna koodi ja määrä >[ret] Kuitti: Maito 3 1.98 Euroa Voi 2 10.00 Euroa ======================= 11.98 Euroa Päivämäärä 28.2.2002 Anna koodi ja määrä >lopeta[ret] Moikka!!! ================================================ hinnat.txt: Maito| 0.666 | 100 Voi | 5.00 | 20 Laku | 0.1 | 1000 Luokat: cTuote - osaa käsitellä rivin joka on muotoa : Maito| 0.666 | 100 - osaa tulostaa itsensä muodossa: Maito 3 1.98 Euroa - oletko "maito" cTuotteet - hoitaa että on monta tuotetta - etsiä tuote cKassakone - huolehtii kuiteista ja hinnastosta - osaa tyhjentää kuitin cKayttoliittyma - huolehtii käyttäjän tempuista Kuva: |------| cKayttoliittyma | | | | | o | |--+---| cKassakone | v |-----------------------------------------------------| | hinnat Kuitti | | cTuotteet cTuotteet | | |------| |------| | | | 4 | | 4 | | | | 3 | | 2 | | | | o | | o | | | |--+---| |--+---| | |-----|--------------------------------------|--------| | | | | | | | | v v |-------| |-------| |-------| |-------| 0 | o---+---------->| Maito | 0 | o---+---------->| Maito | |-------| | 0.66 | |-------| | 1.98 | 1 | o---+-------| | 100 | 1 | o---+-------| | 3 | |-------| | |-------| |-------| | |-------| 2 | o---+---| | 2 | | | |-------| | | |-------| |-------| | |-------| 3 | | | --->| Voi | 3 | | --->| Voi | |-------| | | 5.00 | |-------| | 10.00 | | | 20 | | 2 | | |-------| |-------| | | |-------| ------->| Laku | | 0.10 | | 1000 | |-------| */ #include #include #include #include using namespace std; #include "mjonotpp.h" #include "dosout.h" #include "streampr.h" class cTuote { string koodi; double hinta; double maara; public: cTuote() : koodi(), hinta(0), maara(0) {} cTuote(string ikoodi,double ihinta,double imaara) : koodi(ikoodi), hinta(ihinta), maara(imaara) {} void tulosta(ostream &os) const { cStreamPre pre(os,2,ios::left); os << setw(10) << koodi << " "; os.setf(ios::right); os << setw(8) << maara << " " << setw(8) << hinta << " Euroa\n"; } bool oletko(const string &nimi) const { // if ( nimi == koodi ) return true; // return false; return ( onko_samat(koodi,nimi) == 0 ); } void setAsString(string jono) { koodi = erota(jono,'|'); poista_tyhjat(koodi); luvuksi(erota(jono,'|'),hinta); luvuksi(erota(jono,'|'),maara); } double getHinta() const { return hinta; } void setHinta(double ihinta) { hinta = ihinta; } string getKoodi() const { return koodi; } }; class cTuotteet { int maxlkm; int lkm; cTuote **tuotteet; public: cTuotteet(int imaxlkm) : maxlkm(0), lkm(0) { tuotteet = new(nothrow) cTuote *[imaxlkm]; if ( tuotteet == 0 ) return; maxlkm = imaxlkm; } ~cTuotteet() { // Jotakin puuttuu??? if ( maxlkm > 0 ) delete [] tuotteet; } int getLkm() const { return lkm; } string lisaa(const cTuote &tuote) { if ( lkm >= maxlkm ) return "Ei mahu!"; cTuote *uusi = new(nothrow) cTuote(tuote); if ( uusi == 0 ) return "Muisti loppu!"; tuotteet[lkm] = uusi; lkm++; return ""; } string lue_tiedosto(const string &tiednimi) { cTuote tuote; tuote.setAsString("Maito| 0.666 | 100"); lisaa(tuote); tuote.setAsString("Voi | 5.00 | 20"); lisaa(tuote); tuote.setAsString("Laku | 0.1 | 1000"); lisaa(tuote); return ""; } const cTuote &anna(int i) const { // tarkista!!!! return *tuotteet[i]; } void tyhjenna(); int etsi(const string &tunnus); }; void cTuotteet::tyhjenna() { for (int i=0; ilue_tiedosto("hinnat.txt"); if ( virhe != "" ) { cout << virhe << endl; return 1; } cout << "Olen armottoman hieno kassakone käyttö loppuu kun\n"; cout << "kirjoitat: lopeta" << endl; return 0; } int aja(); int lopetus() const { cout << "Moikka!!!\n"; return 0; } void tulosta_kuitti() const { /* täydennä */ } }; int cKayttoliittyma::aja() { string jono; while ( 1 ) { cout << "Anna koodi ja määrä >"; getline(cin,jono); if ( jono == "lopeta" ) { tulosta_kuitti(); break; } if ( jono == "" ) { // pitäisi tulostaa kuitti ja sen jälkeen tyhjentää uutta asiakasta varten continue; } // pitäisi lisätä jonoa vastaava rivi kassakoneeseen // sekä tulostaa virhe jos tuotetta ei tunneta } return 0; } int main(void) { //#define TUOTETESTI #ifdef TUOTETESTI cTuote tuote("Maito",1.98,3); tuote.tulosta(cout); cTuote tuote2("Voi",10,2); tuote2.tulosta(cout); if ( tuote.oletko("maito") ) cout << "on maito\n"; tuote.setAsString("Laku|0.1|1000"); tuote.tulosta(cout); #endif //#define TUOTEETTESTI #ifdef TUOTTEETTESTI cTuotteet hinnasto(4); hinnasto.lue_tiedosto("hinnat.txt"); for (int i=0; i