| Astia.java |
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 | Astia.java |