// tytpoic.cpp - tytpoi.cpp luokkien avulla // // Vesa Lappalainen 11.3.1999 // Projektiin mukaan tytpoic.cpp, ALI\ioali.c, ALI\mjonot.c ALI\mjonotpp.cpp // (ja vstring.cpp BC 3.1) // Tarvitaan myos ALI\ioali.h, ALI\mjonot.h, ALI\mjonotpp.h // // Tehtäviä: // 1) Lisää oletusarvon käsittely cVaihtoehdot-luokkaan // 2) Lisää vaihtoehtojen lukeminen tiedostosta // 3) Muuta lisää metodi sellaiseksi, että tilaa kasvatetaan jos // tila loppuu kesken. // 4) Käytä perintää ja jaa luokat useammaksi luokaksi // siten, että perusvaihtoehtdossa ei ole laskuria ja siitä // peritään vaihtoehto, jossa on laskuri. // Samoin perusvaihtoehdot ei osaa jakaumaa ja tästä // peritään versio, joka osaa jakauman käsittelyn. // #include #include #include #include #include "ioali.h" #include "mjonotpp.h" using namespace std; //------------------------------------------------------------------------- int jatketaan(ostream &os=cout) { char c; os << "Jatketaanko (K/e):" << flush; c = odota_nappain("KE",'K',MERKKI_ISOKSI); os << c; return ( c == 'K' ); } //------------------------------------------------------------------------- // cVaihtoehto - huolehtii yhden vaihtoehdon käsittelystä //------------------------------------------------------------------------- class cVaihtoehto { char valinta; string teksti; int lkm; public: cVaihtoehto(const string &s) { lkm = 0; string st(s),v; v = erota(st,'|'); valinta = 0; if ( v != "" ) valinta = v[0]; teksti = st; } string getNayta() const { return string(1,valinta) + " = " + teksti; } char getValinta() const { return valinta; } const string &getTeksti() const { return teksti; } int getW() const { return teksti.length(); } int laske() { return ++lkm; } string getTulos(int w=10) const { char s[80]; sprintf(s,"%-*s %4d",w,teksti.c_str(),lkm); return string(s); } int vertaa(char v) { return valinta - v; } }; //------------------------------------------------------------------------- // cVaihtoehdot - huolehtii vaihtoehtojen näyttämisestä yms. //------------------------------------------------------------------------- class cVaihtoehdot { int lkm; int max_lkm; cVaihtoehto **alkiot; public: cVaihtoehdot(int m) { max_lkm = 0; lkm = 0; alkiot = new cVaihtoehto *[m]; if ( !alkiot ) return; max_lkm = m; } virtual ~cVaihtoehdot(); virtual const char *lisaa(const cVaihtoehto &alkio); virtual void nayta_valinta(const string &kysymys, ostream &os=cout) const; virtual char odota_valinta() const; virtual void tulosta_ja_laske_valinta(char c, const string &viesti,ostream &os=cout); virtual void tulosta_jakauma(const string &viesti, ostream &os=cout); virtual void laske(const string &kysymys, const string &teksti, ostream &os=cout); }; //------------------------------------------------------------------------- cVaihtoehdot::~cVaihtoehdot() { for (int i=0; i 0 ) delete [] alkiot; } //------------------------------------------------------------------------- const char *cVaihtoehdot::lisaa(const cVaihtoehto &alkio) { if ( lkm >= max_lkm ) return "Tila loppui"; cVaihtoehto *uusi = new cVaihtoehto(alkio); if ( !uusi ) return "Ei luotu uutta alkiota!"; alkiot[lkm++] = uusi; return NULL; } //------------------------------------------------------------------------- void cVaihtoehdot::nayta_valinta(const string &kysymys, ostream &os) const { os << "\n\n"; os << kysymys << '\n'; os << "\n"; os << "Valitse:\n"; for (int i=0; igetNayta() << "\n"; os << " :" << flush; } //------------------------------------------------------------------------- char cVaihtoehdot::odota_valinta() const { string kelpaavat; char c; for (int i=0; igetValinta(); c = odota_nappain(kelpaavat.c_str(),0,MERKKI_ISOKSI); return c; } //------------------------------------------------------------------------- void cVaihtoehdot::tulosta_ja_laske_valinta(char c, const string &viesti, ostream &os) { os << viesti << " "; for (int i=0; ivertaa(c) == 0 ) { os << alkiot[i]->getTeksti(); alkiot[i]->laske(); } os << endl; } //------------------------------------------------------------------------- void cVaihtoehdot::tulosta_jakauma(const string &viesti, ostream &os) { int i, max_w=0,w; os << viesti << '\n'; for (i=0; igetW(); if ( w > max_w ) max_w = w; } for (i=0; igetTulos(max_w) << '\n'; cout << endl; } //------------------------------------------------------------------------- void cVaihtoehdot::laske(const string &kysymys, const string &teksti, ostream &os) { char painettu; do { nayta_valinta(kysymys,os); painettu = odota_valinta(); os << painettu << "\n"; tulosta_ja_laske_valinta(painettu,teksti,os); } while ( jatketaan(os) ); os << "\n"; tulosta_jakauma("Jakauma:",os); } //------------------------------------------------------------------------- // main //------------------------------------------------------------------------- int main(void) { cVaihtoehdot aanestysvalinta(10); aanestysvalinta.lisaa(cVaihtoehto("T|Tytt”")); aanestysvalinta.lisaa(cVaihtoehto("P|Poika")); aanestysvalinta.lisaa(cVaihtoehto("N|Nainen")); aanestysvalinta.lisaa(cVaihtoehto("M|Mies")); aanestysvalinta.laske("Mikas olet?","Olet siis"); cout << "Kiitos vastauksista! Hei hei!\n"; return 0; }