/** * 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]
 *
* @author Vesa Lappalainen * @version 1.0, 09.02.2003 */ public class Astia { private final String nimi; private final double tilavuus; private double maara; /** * Alustaa uuden astian tietyn kokoiseksi ja luonnollisetsi tyhjäksi * @param nimi uuden astian nimi * @param tilavuus uuden astian tilavuus * @example *
     * Astia astia5l = new Astia("5l",5);
     * astia5l.getNimi()     === "5l";
     * astia5l.getMaara()    ~~~ 0;
     * astia5l.getTilavuus() ~~~ 5;
     * 
*/ public Astia(String nimi, double tilavuus) { this.nimi = nimi; this.tilavuus = tilavuus; this.maara = 0; } /** * Täyttää astian piripintaan asti * @example *
     * Astia astia5l = new Astia("5l",5);
     * astia5l.getMaara()    ~~~ 0;
     * astia5l.tayta();
     * astia5l.getMaara()    ~~~ 5;
     * 
*/ public void tayta() { maara = tilavuus; } /** * Kaataa astiaan joko lisää tai vähentää, yli ei saa mennä eikä * pakkasen puolelle * @param lisa paljonko nestettä laitetaan * @return paljonko jäi mahtumatta * @example *
     *    Astia a5 = new Astia("5",5);
     *    a5.kaada(3) ~~~ 0.0;     a5.getMaara() ~~~ 3.0;
     *    a5.kaada(5) ~~~ 3.0;     a5.getMaara() ~~~ 5.0;
     *    a5.kaada(-3) ~~~ 0.0;    a5.getMaara() ~~~ 2.0;
     *    a5.kaada(-3) ~~~ -1.0;   a5.getMaara() ~~~ 0.0;
     * 
*/ public double kaada(double lisa) { if ( lisa < 0 ) { double eiRiita = getMaara() + lisa; if ( eiRiita < 0 ) maara = 0; else { maara += lisa; eiRiita = 0; } return eiRiita; } double eiMahu = lisa - getTyhjaa(); if ( eiMahu < 0 ) { maara += lisa; eiMahu = 0; } else { maara = tilavuus; } return eiMahu; } /** * Kaataa tästä astiasta (this) toiseen astiaan niin paljon kuin toiseen * mahtuu tai tästä astiasta on antaa. * @param astia astia johon kaadetaan * * @example *
     *  Astia ampari = new Astia("ä",100);
     *  Astia a8     = new Astia("8",8);
     *  Astia a5     = new Astia("5",5);
     *  
     *  ampari.kaada(a8);  a8.getMaara() ~~~ 0;     ampari.getMaara() ~~~ 0.0;
     *  ampari.tayta();
     *  ampari.kaada(a8);  a8.getMaara() ~~~ 8.0;   ampari.getMaara() ~~~ 92.0;
     *  
     *  a8.kaada(a5);      a8.getMaara() ~~~ 3.0;   a5.getMaara() ~~~ 5.0;
     *  a5.kaada(ampari);  a5.getMaara() ~~~ 0.0;   ampari.getMaara() ~~~ 97.0;
     *  a8.kaada(a5);      a8.getMaara() ~~~ 0.0;   a5.getMaara() ~~~ 3.0;
     *  ampari.kaada(a8);
     *  a8.kaada(a5);      a8.getMaara() ~~~ 6.0;   a5.getMaara() ~~~ 5.0;
     * 
*/ public void kaada(Astia astia) { double siirrettava = astia.getTyhjaa(); if ( getMaara() < siirrettava ) siirrettava = getMaara(); astia.kaada(siirrettava); kaada(-siirrettava); } /** * Palautetaan nsteen määrä astiassa * @return nesteen määrä * @example *
     * Astia astia5l = new Astia("5l",5);
     * astia5l.getMaara()    ~~~ 0;
     * astia5l.tayta();
     * astia5l.getMaara()    ~~~ 5;
     * 
*/ public double getMaara() { return maara; } /** * Palautetaan astion tilavuus * @return astian tilavuus * @example *
     * Astia astia5l = new Astia("5l",5);
     * astia5l.getTilavuus() ~~~ 5;
     * 
*/ public double getTilavuus() { return tilavuus; } /** * Palautetaan astiossa olevan vapaan tilan määrä. * @return vapaan tilan määrä. * @example *
     * Astia astia5l = new Astia("5l",5);
     * astia5l.getTyhjaa()   ~~~ 5;
     * astia5l.tayta();
     * astia5l.getTyhjaa()   ~~~ 0;
     * 
*/ public double getTyhjaa() { return getTilavuus() - getMaara(); } /** * Palautetaan astian nimi * @return astian nimi * @example *
     * Astia astia5l = new Astia("5l",5);
     * astia5l.getNimi()     === "5l";
     * 
*/ public String getNimi() { return nimi; } /** * Tutkitaan onko astian nimi etsitty * @param mika verrattava nimi * @return true jos on samat, false muuten * * @example *
     * Astia ampari  = new Astia("Ämpäri",100);
     * ampari.oletko("Ä") === false;
     * ampari.oletko("ämpäri") === true;
     * ampari.oletko("ÄMPÄRI") === true;
     * 
*/ public boolean oletko(String mika) { return getNimi().equalsIgnoreCase(mika); } /** * Testaan astioita * @param args ei käytössä */ public static void main(String[] args) { Astia astiat[] = { new Astia("ä", 100), new Astia("5", 5), new Astia("8", 8) }; Astia ampari = astiat[0]; ampari.tayta(); ampari.kaada(astiat[2]); astiat[2].kaada(astiat[1]); System.out.println("8 litran astiassa on " + astiat[2].getMaara() + " litraa nestettä"); // for (int i=0; i... ) // if ( astiat[i].oletko(nimi) ) } }