// astia.cpp // Vesa Lappalainen 15.2.2001 //--------------------------------------------------------------------------- /* John McLane (Bruce Willis) joutui elokuvassa Die Hard 3 ongelman eteen, jossa piti kahdella vesikanisterilla mitata jonkin muun suuruinen vesimäärä "tarkasti" ja näin estää pommin räjähtäminen. Koska aika meni varsin tiukalle, on vastaavien tilanteiden harjoittelemiseksi nyt tehty uusi menestysohjelma "Astia". Pelillä demonstroidaan/harjoitellaan miten voidaan kahdella astialla, 5 l ja 8 l, muodostaa kaikki mahdolliset tilavuudet 1-13 l. Pelissä on kaksi varsinaista astiaa: a5 ja a8, sekä kolmas apuastia ampari. Nestettä voidaan kerrallaan kaataa yhdestä astiasta toiseen joko siten, että astian koko sisältö tyhjennetään jos se mahtuu tai astista kaadetaan sen verran että toinen astia tulee täyteen. Tee ohjelma jota voitasiin käyttää seuraavasti: Käytössäsi on 8 ja 5 litran astia ja Ämpäri (100 l) 8 litran astiassa on 0 litraa 5 litran astiassa on 0 litraa Mistä kaadetaan ja mihin >ä 8[ret] 8 litran astiassa on 8 litraa 5 litran astiassa on 0 litraa Mistä kaadetaan ja mihin >8 5[ret] 8 litran astiassa on 3 litraa 5 litran astiassa on 5 litraa Mistä kaadetaan ja mihin >5 ä[ret] 8 litran astiassa on 3 litraa 5 litran astiassa on 0 litraa Mistä kaadetaan ja mihin >8 5[ret] 8 litran astiassa on 0 litraa 5 litran astiassa on 3 litraa Mistä kaadetaan ja mihin >[ret] */ #include #include using namespace std; class cAstia { double tilavuus; double maara; string nimi; public: cAstia(string inimi,double itilavuus) : nimi(inimi) { tilavuus = itilavuus; maara = 0; } void tayta() { maara = getTilavuus(); } void kaada(double lisa) { // kaataa astiaa joko lisää tai vähentää, yli ei saa mennä eikä // pakkasen puolelle if ( lisa < 0 ) { if ( -lisa > maara ) maara = 0; else maara += lisa; } else if ( getTyhjaa() > lisa ) maara += lisa; else tayta(); } void kaada(cAstia &astia) { double siirrettava = astia.getTyhjaa(); if ( getMaara() < siirrettava ) siirrettava = getMaara(); astia.kaada(siirrettava); kaada(-siirrettava); } double getMaara() const { return maara; } double getTilavuus() const { return tilavuus; } double getTyhjaa() const { return getTilavuus() - getMaara(); } int oletko(const string &mika) const { return nimi == mika; } }; //--------------------------------------------------------------------------- int main(void) { // cAstia astia5l("5",5),astia8l("8",8), ampari("ä",100); // 0 1 2 cAstia astiat[3] = { cAstia("5",5),cAstia("8",8), cAstia("ä",100) }; // ampari.tayta(); astiat[2].tayta(); // ampari.kaada(astia8l); astiat[2].kaada(astiat[1]); // astia8l.kaada(astia5l); astiat[1].kaada(astiat[0]); // cout << "8 litran astiassa on " << astia8l.getMaara() << " litraa nestettä\n"; cout << "8 litran astiassa on " << astiat[1].getMaara() << " litraa nestettä\n"; // for (i=0; i... ) // if ( astiat[i].oletko(nimi) ) return 0; } //---------------------------------------------------------------------------