/** * */ package astia; /** * 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 String nimi; private double tilavuus; private double maara; // mahtuu ei tarvita attribuutiksi /** * Alustetaan astialle nimi ja tilavuus * @param nimi astian nimi * @param tilavuus astian tilavuus */ public Astia(String nimi, double tilavuus) { this.nimi = nimi; this.tilavuus = tilavuus; maara = 0; } /** * @return astian tämän hetkinen määrä * @example *
     *   Astia a8 = new Astia("8",8);
     *   a8.getMaara() ~~~ 0;
     * 
*/ public double getMaara() { return maara; } /** * täyttää astian piripintaan * @example *
     *   Astia a8 = new Astia("8",8);
     *   a8.tayta();
     *   a8.getMaara() ~~~ 8;
     * 
*/ public void tayta() { maara = tilavuus; } /** * Laittaa astiaan lisää nestettä * @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 kaiken toiseen astiaan (mihin) jos mahtuu. * Jos ei mahdu kaadetaan kaikki mikä mahtuu * @param mihin 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 mihin) { double siirrettava = mihin.getTyhjaa(); if ( getMaara() < siirrettava) siirrettava = getMaara(); mihin.kaada(siirrettava); // mihin.maara += siirrettava; this.kaada(-siirrettava); } /** * @return astian tyhjän tilan määrä */ public double getTyhjaa() { return tilavuus - getMaara(); } /** * @return tilavuus */ public double getTilavuus() { return tilavuus; } /** * Kertoo onko tämä etsittävä astia * @param nimi jota etsitään * @return true jos on etsittävä */ public boolean oletko(String nimi) { return this.nimi.equalsIgnoreCase(nimi); } /** * @param args ei käytössä */ public static void main(String[] args) { Astia ampari = new Astia("ä",100); Astia a8 = new Astia("8",8); Astia a5 = new Astia("5",5); Astia astiat[] = { ampari, a5, a8 }; ampari.tayta(); astiat[0].kaada(astiat[2]); astiat[2].kaada(astiat[1]); System.out.println("8 litran asiassa on nyt " + astiat[2].getMaara() + " litraa"); } }