Ohjelmoinnin perusteet, kesä 2003, Koetehtävä 3, arvosteluperusteet. Antti Vähäkangas Tehtävänanto ------------ 3. Maitoautossa on kaksi tankkia. Vain ensimmäinen tankki on varustettu lastauslaittein. Maitoa voidaan siirtää tankista toiseen. Laadi luokka Maitoauto maitoauton toteutukseksi. o public Maitoauto(double ekaTankki, double tokaTankki) luo maitoauton, jonka tankkien vetoisuus annetaan parametreina. Tankit ovat aluksi tyhjiä. o public double ekassaOn() palauttaa ensimmäisen tankin maitomäärän o public double tokassaOn() palauttaa toisen tankin maitomäärän o public boolean siirräMaitoa(double määrä, boolean ekasta) siirtää parametrin verran maitoa tankista toiseen. Jos jälkimmäinen parametri on true, siirretään ensimmäisestä tankista toiseen, muuten päinvastoin. Jos koko määrää ei voida siirtää, ei siirretä mitään. Metodi palauttaa arvon true, jos siirto onnistui, false jos ei onnistunut. o public boolean lisääMaitoa(double määrä) lisää maitoa ensimmäiseen tankkiin. Jos yritetään lisätä enemmän kuin mahtuu, maitomäärää ei muuteta. Metodi palauttaa arvon true, jos siirto onnistui, false jos ei onnistunut. public String toString() palauttaa arvonaan selkeän merkkijonoesityksen maitoauton tilasta. Pisteytys ja yleiset virheet ---------------------------- Kussakin kohdassa on lueteltu tyypillisiä virheitä Toistuvasta puutteesta (esimerkiksi parametrin negatiivisuutta ei ole testattu) ei ole sakotettu kuin kerran. Lisäksi kohdassa on mainittu siitä saatava maksimipistemäärä. o Tietorakenteet ja luokkamäärittely - tietorakenteet ei luokan kenttinä vaan esim. konstruktorin paikallisina muuttujina - luokan kentät ei private-määreellä varustettuja - metodien tai luokan esittely virheellinen - merkittävästi puuttuvia kaarisulkeita tai virheellisiä sisennyksiä 2p o public Maitoauto(double ekaTankki, double tokaTankki) - parametrien oikeellisuutta ei testattu (pitää olla >=0) - parametrina saatuja rajoja ei aseteta luokanmuuttujiin 2p o public ekassaOn(), public tokassaOn() - turhia sijoituslauseita, jossa sijoitetaan palautettava arvo tilapäismuuttujaan 1p o public siirräMaitoa(double määrä, boolean ekasta) - Siirron onnistuminen ennen siirtoa testattu puutteellisesti; sekä lähtotankin maitomäärä että maalitankin vapaa määrä vaikuttavat onnistumiseen. 2p o public double lisääMaitoa(double määrä) - määrä-muuttujan positiivisuutta ei tarkisteta. - maitomäärää ei muuteta koskaan 2p o public double otaMaitoa(double määrä) - varaston sisältöä ei vähennetä - paluuarvo virheellinen 2p o public String toString() - Tulostetaan S.o.p. komennolla tekstiä 1p Yhteensä 12p Pistejakauma ------------ 0 * 1 * 4 *** 5 ** 7 * 8 **** 9 ****** 10 ******** 11 ******** 12 ** Esimerkkiratkaisu ----------------- /* Ohjelmoinnin perusteet, koe 6.6.2003/AW Tehtävän 3 esimerkkiratkaisu. Pääohjelmametodia ei vaadittu kokeessa. Antti Vähäkangas */ public class Maitoauto { private double ekaTankki; private double ekaMaara; private double tokaTankki; private double tokaMaara; public Maitoauto(double ekaTankki, double tokaTankki) { // Testataan parametrien oikeellisuus if (ekaTankki > 0) this.ekaTankki = ekaTankki; else this.ekaTankki = 0; if (tokaTankki > 0) this.tokaTankki = tokaTankki; else this.tokaTankki = 0; // Määrät asetetaan nolliksi this.ekaMaara = 0; this.tokaMaara = 0; } public double ekassaOn() { return this.ekaMaara; } public double tokassaOn() { return this.tokaMaara; } public boolean siirräMaitoa(double määrä, boolean ekasta) { if (määrä<0) return false; if (ekasta) { if (määrä <= ekassaOn() && määrä+tokassaOn() < this.tokaTankki) { this.ekaMaara -= määrä; this.tokaMaara += määrä; return true; } else return false; } else { if (määrä <= tokassaOn() && määrä + ekassaOn() < this.ekaTankki) { this.tokaMaara -=määrä; this.ekaMaara += määrä; return true; } else return false; } } public boolean lisääMaitoa(double määrä) { if (määrä<0) return false; if (määrä+ekassaOn() > this.ekaTankki) return false; this.ekaMaara += määrä; return true; } public double otaMaitoa(double määrä) { if (määrä<=0) return 0; if (ekassaOn() - määrä < 0) { double apu = ekassaOn(); this.ekaMaara = 0; return apu; } this.ekaMaara -= määrä; return määrä; } public String toString() { return "Eka tankki: " + ekassaOn() + " / " + this.ekaTankki + "\nToka tankki: " + tokassaOn() + " / " + this.tokaTankki; } public static void main(String[] args) { Maitoauto isoAuto = new Maitoauto(6000.0, 3000.0); Maitoauto pieniAuto = new Maitoauto(500.0, 700.0); System.out.println("Tehtiin kaksi maitoautoa, iso ja pieni"); System.out.println("Ison maitoauton vetoisuudet ovat: "+ "ensimmäinen siilo 6000.0,"); System.out.println("toinen siilo 3000.0."); System.out.println("Pienen maitoauton vetoisuudet ovat: "+ " ensimmäinen siilo 500.0,"); System.out.println("toinen siilo 700.0."); System.out.println(); System.out.println("Yritetään lisätä kumpaankin autoon " + "\n4000 yksikköä maitoa"); isoAuto.lisääMaitoa(4000.0); pieniAuto.lisääMaitoa(4000.0); System.out.println("Iso maitoauto: " + isoAuto ); System.out.println("Pieni maitoauto: " + pieniAuto ); System.out.println(); System.out.println(); System.out.println("Yritetään siirtää 5500 yksikköä maitoa" + " ison auton ensimmäisestä siilosta toiseen"); isoAuto.siirräMaitoa(5500, true); System.out.println("Iso maitoauto: " + isoAuto ); System.out.println(); System.out.println(); System.out.println("Yritetään siirtää 3500 yksikköä maitoa" + " ison auton ensimmäisestä siilosta toiseen"); isoAuto.siirräMaitoa(3500, true); System.out.println("Iso maitoauto: " + isoAuto ); System.out.println(); System.out.println(); System.out.println("Yritetään siirtää 2500 yksikköä maitoa" + " ison auton ensimmäisestä siilosta toiseen"); isoAuto.siirräMaitoa(2500, true); System.out.println("Iso maitoauto: " + isoAuto ); System.out.println(); System.out.println(); System.out.println("Yritetään siirtää 500 yksikköä maitoa" + " ison auton toisesta siilosta ensimmäiseen"); isoAuto.siirräMaitoa(500, false); System.out.println("Iso maitoauto: " + isoAuto ); System.out.println(); } }