/**
*
*/
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"); } }