Johd. Ohj. K99, välikoe 1, tehtävä 4, arvosteluperusteet Antti Tuominen, attuomin@cs.helsinki.fi Esimerkillinen ratkaisu: // Perusratkaisu makkaratehtaaksi, // ei mitään hienostelua, kunhan vaatimukset // täyttyvät. Antti Tuominen public class HerkkuMakkara { private double teurasta, jauhoa, suolaa; // nollataan säiliöt public HerkkuMakkara() { this.teurasta = 0.0; this.jauhoa = 0.0; this.suolaa = 0.0; } // täyttömetodit public void lisääTeurasta(double määrä) { if(määrä >= 0.0) this.teurasta += määrä; } public void lisääJauhoa(double määrä) { if(määrä >= 0.0) this.jauhoa += määrä; } public void lisääSuolaa(double määrä) { if(määrä >= 0.0) this.suolaa += määrä; } // Mahdollisimman paljon makkaraa public double teePaljonMakkaraa() { // lasketaan aineksien riittävyys makkarakiloihin double jauhoaRiittäisi = this.jauhoa * 6.0 / 2.0; double teurastaRiittäisi = this.teurasta * 6.0 / 3.0; double suolaaRiittäisi = this.suolaa * 6.0 / 1.0; // ylläolevista pienin makkaramäärä pystytään valmistamaan double makkaraaSaadaan = jauhoaRiittäisi; if(teurastaRiittäisi < makkaraaSaadaan) makkaraaSaadaan = teurastaRiittäisi; // teuras loppuu ennen jauhoa if(suolaaRiittäisi < makkaraaSaadaan) makkaraaSaadaan = suolaaRiittäisi; // suola loppuu ekana // tyhennetään säiliöitä reseptin mukaan this.teurasta -= 3.0 / 6.0 * makkaraaSaadaan; this.jauhoa -= 2.0 / 6.0 * makkaraaSaadaan; this.suolaa -= 1.0 / 6.0 * makkaraaSaadaan; return makkaraaSaadaan; } // En uskalla "julkaista" malliratkaisua testaamatta, // sanallinenkin testausselostus on täysin kelvollinen. // Testausta voisi tehdä laajemminkin, tämmöinen riitti // kokeessa jo hulppeasti täysiin testauspisteisiin. public static void main(String[] aris) { HerkkuMakkara kilometrilenkki = new HerkkuMakkara(); kilometrilenkki.lisääTeurasta(50); kilometrilenkki.lisääTeurasta(-50); // Nyt teurasta pitäisi olla 50 kiloa. kilometrilenkki.lisääJauhoa(30); kilometrilenkki.lisääSuolaa(42); // Jauhot loppunevat ekana kesken. Säiliön sisältöjen // tulostelu olisi sekin hyvä idea. System.out.println("50 kiloa teurasta, 30 jauhoja ja 42 suolaa"+ "tuotti "+kilometrilenkki.teePaljonMakkaraa()+ " kiloa makkaraa. Menikö oikein?"); System.out.println("Tyhjiin puristettu tehdas tuotti vielä "+ kilometrilenkki.teePaljonMakkaraa()+ " kiloa. Kai se on nolla?"); } } ========================================================================= Sitten sepustuksia. Pistejako: Säiliöt max. 1p: Private double on hyvä. Ei-privatet tai int-ratkaisut kumpikin -1/2p. Tehtävänannossa erityisesti kerrottiin, että tehtaasta pitää saada rutistettua mahdollisimman paljon makkaraa ulos. Siksi suosin double-arvoisia säiliöitä. Int-arvoillakin voi olla "mielivaltaisen tarkka", käyttämällä vaikkapa milligrammoja yksiköinä. Tämä ei ole tehtaan käyttäjän kannalta hyvä valinta. Erilaiset pikkuvarasto-tyyppiset ratkaisut arvos- teltu tapauskohtaisesti. Säiliöiden täyttäminen max. 1p: Säiliöiden tyhjentäminen negatiivisella parametrilla täyttämismetodia käyttäen rokottaa puoli pistettä. Tästä, kuten parista muustakin lipsahduksesta on saattanut selvitä sopivalla kommentilla, joka ilmaisee tyhjentymisen olevan tarkoitettu toiminto, eikä huomioimatta jäänyt lipsahdus. Siltikään säiliöt eivät saa mennä miinukselle. Makkaran valmistaminen max. 2p: ... oli hankalahkoa, jos teki tavoitellun kaltaisen "viimeisetkin rippeet makkaraksi" -toteutuksen. Heitä palkitakseni rokotin puoli pistettä "täysiä 6kg satseja" tekeviltä metodeilta. Muita tyypillisiä virheitä oli kokonaisjako, eli ohjelmassa otetaan (1/6) * määrä * this.jauhoja, jossa siis (1/6) == 0. "Dynaamisen reseptin tehdas" ei noudata reseptiä, vaan roiskii makkaraksi aineksia vähän miten sattuu, -1p. Testausselostus max. 1p: Olin aika suopea. Melkein mitä tahansa täyspäistä kertomalla sai pisteen. Ylläolevista periaatepäätöksistä olen joustanut, jos ne olisivat tuottaneet kohtuuttoman hyvät tai huonot pisteet. Tarkastin aika lepsusti, suurin osa sai neljää tai viittä pistettä. Erityisen ansioituneet HerkkuMakkaroijat ovat saaneet sekalaisia nam-kommentteja. Muita merkintöjä on aika niukasti. Jos tämän lukeminen ei selvitä saamiasi pisteitä, tule kysymään.