1   /**
2    *  John McLane (Bruce Willis) joutui elokuvassa Die Hard 3 ongelman eteen,
3    *  jossa piti kahdella vesikanisterilla mitata jonkin muun suuruinen
4    *  vesimäärä "tarkasti" ja näin estää pommin räjähtäminen.
5    *  Koska aika meni varsin tiukalle, on vastaavien tilanteiden harjoittelemiseksi
6    *  nyt tehty uusi menestysohjelma "Astia".
7    *<br>
8    *  Pelillä demonstroidaan/harjoitellaan miten voidaan kahdella astialla,
9    *  5 l ja 8 l,  muodostaa kaikki mahdolliset tilavuudet 1-13 l.
10   *  Pelissä on kaksi varsinaista astiaa: a5 ja a8, sekä kolmas apuastia
11   *  ampari.  Nestettä voidaan kerrallaan kaataa yhdestä astiasta toiseen
12   *  joko siten, että astian koko sisältö tyhjennetään jos se mahtuu
13   *  tai astista kaadetaan sen verran että toinen astia tulee täyteen.
14   *<br>
15   *  Tee ohjelma jota voitasiin käyttää seuraavasti:
16   *<br>
17   *<pre>
18   *  Käytössäsi on 8 ja 5 litran astia ja Ämpäri (100 l)
19   *
20   *  8 litran astiassa on 0 litraa
21   *  5 litran astiassa on 0 litraa
22   *  Mistä kaadetaan ja mihin >ä 8[ret]
23   *  8 litran astiassa on 8 litraa
24   *  5 litran astiassa on 0 litraa
25   *  Mistä kaadetaan ja mihin >8 5[ret]
26   *  8 litran astiassa on 3 litraa
27   *  5 litran astiassa on 5 litraa
28   *  Mistä kaadetaan ja mihin >5 ä[ret]
29   *  8 litran astiassa on 3 litraa
30   *  5 litran astiassa on 0 litraa
31   *  Mistä kaadetaan ja mihin >8 5[ret]
32   *  8 litran astiassa on 0 litraa
33   *  5 litran astiassa on 3 litraa
34   *  Mistä kaadetaan ja mihin >[ret]
35   *</pre>
36   * @author  Vesa Lappalainen
37   * @version 1.0, 09.02.2003
38   */
39  public class Astia {
40    private String nimi;
41    private double tilavuus;
42    private double maara;
43  
44    /**
45     * Alustaa uuden astian tietyn kokoiseksi ja luonnollisetsi tyhjäksi
46     * @param nimi uuden astian nimi
47     * @param tilavuus uuden astian tilavuus
48     */
49    public Astia(String nimi, double tilavuus) {
50      this.nimi = nimi;
51      this.tilavuus = tilavuus; this.maara = 0;
52    }
53  
54    /**
55     * Täyttää astian piripintaan asti
56     */
57    public void tayta() { maara = tilavuus; }
58  
59  
60    /**
61     * kaataa astiaan joko lisää tai vähentää, yli ei saa mennä eikä
62     * pakkasen puolelle
63     * @param lisa astiaan laitettava tai otettava nestemäärä
64     */
65    public void kaada(double lisa) {
66      if ( lisa < 0 ) {
67        if ( -lisa > maara ) maara = 0;
68        else maara += lisa;
69      }
70      else
71        if ( getTyhjaa() > lisa ) maara += lisa;
72        else tayta();
73    }
74  
75    /**
76     * Kaataa tästä astiasta (this) toiseen astiaan niin paljon kuin toiseen
77     * mahtuu tai tästä astiasta on antaa.
78     * @param astia astia johon kaadetaan
79     */
80    public void kaada(Astia astia) {
81      double siirrettava = astia.getTyhjaa();
82      if ( getMaara() < siirrettava ) siirrettava = getMaara();
83      astia.kaada(siirrettava);
84      kaada(-siirrettava);
85    }
86  
87    public double getMaara()           { return maara; }
88    public double getTilavuus()        { return tilavuus; }
89    public double getTyhjaa()          { return getTilavuus()-getMaara(); }
90    public String getNimi()            { return nimi; }
91    public boolean oletko(String mika) { return getNimi().equalsIgnoreCase(mika);}
92  
93    public static void main(String[] args) {
94      Astia astiat[] = { new Astia("ä",100), new Astia("5",5), new Astia("8",8) };
95      Astia ampari = astiat[0];
96  
97      ampari.tayta();
98  
99      ampari.kaada(astiat[2]);
100     astiat[2].kaada(astiat[1]);
101 
102     System.out.println("8 litran astiassa on " + astiat[2].getMaara() +
103                        " litraa nestettä");
104     // for (int i=0; i... )
105     //   if ( astiat[i].oletko(nimi) )
106   }
107 
108 }
109 
110