Johdatus ohjelmointiin, syksy 1998 1. välikoe 27.10.1998 Arvosteluperusteet ja esimerkkiratkaisu tehtävään 4 Antti Kerminen Pisteitä sai seuraavasti: - luokan yleinen rakenne ½ p. - piilotettu tietorakenne ½ p. - aksessorit säiliöiden täydentämiseen 1 p. - aksessorit tehtaan tilan selvittämiseen 1 p. - teeHerkkujuomaa-metodi 2 p. - pääohjelma 1 p. Virheistä vähennettiin seuraavasti: - kirjoitusvirhe 0 p. - kielioppivirhe 1/2 - 1 p. - ajatusvirhe 1 p. Samasta virheestä vähennettiin vain kerran. Tehtävässä hyväksyttiin kaikki järkevät tavat toteuttaa AgriCola-luokka. Ohessa yksi esimerkinomainen vastaus. public class AgriCola { // -------------------------------------------------------------- muuttujat // Valmistusainesäiliöt. Ainetta voi olla nollasta ylöspäin. private double vettä; private double väriä; private double sokeria; // Salainen resepti. private double vettäPerYksikkö = 10.0 / 14.0; private double väriäPerYksikkö = 0.5 / 14.0; private double sokeriaPerYksikkö = 3.5 / 14.0; // ---------------------------------------------------------- konstruktorit public AgriCola() { this.lisääVettä(0.0); this.lisääVäriä(0.0); this.lisääSokeria(0.0); } public AgriCola(double vettä, double väriä, double sokeria) { this.lisääVettä(vettä); this.lisääVäriä(väriä); this.lisääSokeria(sokeria); } // ------------------------------------------------------------- aksessorit public double vettäOn() { return this.vettä; } public double väriäOn() { return this.väriä; } public double sokeriaOn() { return this.sokeria; } public void lisääVettä(double määrä) { if (määrä > 0) { this.vettä += määrä; } } public void lisääVäriä(double määrä) { if (määrä > 0) { this.väriä += määrä; } } public void lisääSokeria(double määrä) { if (määrä > 0) { this.sokeria += määrä; } } public void otaVettä(double määrä) { if (määrä > 0.0) { this.vettä -= määrä; if (this.vettä < 0.0) { this.vettä = 0.0; } } } public void otaVäriä(double määrä) { if (määrä > 0.0) { this.väriä -= määrä; if (this.väriä < 0.0) { this.väriä = 0.0; } } } public void otaSokeria(double määrä) { if (määrä > 0.0) { this.sokeria -= määrä; if (this.sokeria < 0.0) { this.sokeria = 0.0; } } } // ------------------------------------------------------- ilmentymämetodit public double teeHerkkuJuomaa(int paljonko) { if (paljonko <= 0) { return 0.0; } double juomaaSaadaan = this.herkkujuomaaSaadaan(); double juomaaTehdään = paljonko; if (juomaaTehdään > juomaaSaadaan) { juomaaTehdään = juomaaSaadaan; } this.otaVettä(juomaaTehdään * this.vettäPerYksikkö); this.otaVäriä(juomaaTehdään * this.väriäPerYksikkö); this.otaSokeria(juomaaTehdään * this.sokeriaPerYksikkö); return juomaaTehdään; } public double herkkujuomaaSaadaan() { // Lasketaan kuinka paljon kolaa voidaan valmistaa kustakin aineesta. double vedestäSaadaan = this.vettäOn() / this.vettäPerYksikkö; double väristäSaadaan = this.väriäOn() / this.väriäPerYksikkö; double sokeristaSaadaan = this.sokeriaOn() / this.sokeriaPerYksikkö; // Palautetaan pienin arvo. if (vedestäSaadaan < väristäSaadaan && vedestäSaadaan < sokeristaSaadaan) { return vedestäSaadaan; } else if (väristäSaadaan < sokeristaSaadaan) { return väristäSaadaan; } else { return sokeristaSaadaan; } } public String toString() { return "Vettä: " + this.vettäOn() + "\nVäriä: " + this.väriäOn() + "\nSokeria: " + this.sokeriaOn(); } // ------------------------------------------------------------- pääohjelma public static void main(String[] args) { // Kokeillaan konstruktoreita. AgriCola tehdas1 = new AgriCola(); System.out.println(tehdas1 + "\n"); AgriCola tehdas2 = new AgriCola(1000, 1000, 1000); System.out.println(tehdas2 + "\n"); // Tehdään limpskaa. for (int i = 0; i < 12; i++) { System.out.println("Tehtaasta saa herkkujuomaa " + tehdas2.herkkujuomaaSaadaan() + " yksikköä."); System.out.println("Pyydetään tehtaalta 130 yksikköä juomaa."); System.out.println("Saatiin " + tehdas2.teeHerkkuJuomaa(130) + " yksikköä."); System.out.println("Tehtaan tila:\n" + tehdas2); Lue.rivi(); } } }