// Ohjelmoinnin perusteiden koe 14.11.2003 // Tehtävä 2. malliratkaisu ja arvosteluperusteet, Pekka Simola // Laskuharjoituksista tuttu viljavarasto oli tämän kokeen 'helpompi // ohjelmointitehtävä'. Liekö tuttuus kostautunut, sillä monessa paperissa // oli oletettu luokka ja muuttujat määrittellyiksi. Lisäksi monessa // paperissa oli säästetty tarkistuksissa, mikä kostautui loppupisteissä. // Toteutukset vaihtelivat luokan sisäisistä double-muuttujista (yleisin) // ulkopuolisiin siilo-luokkiin. Myös taulukoilla oli viljavarastoja toteutettu. // Rajoituksena oli, ettei siiloja saanut toteuttaa PikkuVarastoina, 'kaikki' muu // kelpasi (kunhan oli toteutettu toimivasti). // Tehtävän maksimipistemäärä oli 14 pistettä, ja tarkistuksessa lähdettiin // siitä, että aluksi kaikilla oli täydet pisteet, ts. allaolevat pisteet eivät // tarkoita maksimissaan saatavia pisteitä vaan maksimissaan vietäviä pisteitä. // Kuitenkin enimmillään vietiin 14 pistettä. public class Viljavarasto{ // Luokan ja muuttujien määrittely : 2 pistettä // Siilojen kattomuuttujien määrittely lisäksi : 1 piste // - Yllättävän monesta paperista puuttuivat muuttujien määrittelyt // kokonaan. Joistakin puuttui luokankin määrittely. Joissakin // ratkaisuissa ei oltu toteutettu viljavaraston kattoja eli // ei ollut muuttujia maksimimäärän tarkistamiselle private double eka_määrä; private double toka_määrä; private double eka_katto; private double toka_katto; // Kostruktori yhteensä : 2 pistettä // * tarkistukset : 1 piste // * toimintalogiikka : 1 piste // - Konstruktorissa määritellyt muuttujat eivät ole pitkäikäisiä. // Joissakin papereissa luokkamuuttujat oli määritelty // konstruktorissa, mikä ei käy päinsä. // - Tarkistukset menivät osalla koetilanteessa pieleen // - Joiltakin oli unohtunut siilojen nollaaminen, MUTTA // tämä käsiteltiin mitättömän pienenä erheenä eikä tästä // kannettu veroa, sillä oletusarvo doublelle on 0.0. public Viljavarasto(double ekaSiilo, double tokaSiilo){ if ( ekaSiilo < 0.0 ) ekaSiilo = 0.0; if ( tokaSiilo < 0.0 ) tokaSiilo = 0.0; this.eka_katto = ekaSiilo; this.toka_katto = tokaSiilo; this.eka_määrä = 0.0; this.toka_määrä = 0.0; } // ekassaOn ja TokassaOn : 1 piste // - Näistä kahdesta, suorastaan leikittelevän helposta metodista, // annettiin avokätisesti 1 piste, mikäli ne oli toteutettu oikein. public double ekassaOn(){ return this.eka_määrä; } public double tokassaOn(){ return this.toka_määrä; } // siirraViljaa yhteensä : 2 pistettä // * tarkistukset : 1 piste // * toimintalogiikka : 1 piste // - Yleisin virhe oli negatiivisten arvojen tarkistus. Näiden arvojen // käsittelyssä sallittiin hieman liikkumavaraa, ts. maaraksi voitiin // määritellä 0.0 tai saatettiin palauttaa true. Falsen palauttamisessa // on se hieno piirre, että jos ei oikeasti siirretty mitään, ei väitetä // toisin // - Muutamassa paperissa oli hieman hämmentäviä ratkaisuita, jotka eivät // ikävä kyllä toimineet // - Tarkistuksia saattoi vallan hyvin yhdistää, eli ei ole pakko tarkistaa // erikseen (eri lauseissa) jokaista ehtoa public boolean siirraViljaa(double maara, boolean ekasta){ if ( maara < 0.0 ) return false; if (ekasta){ if ( maara > this.eka_määrä) return false; else if ( maara > (this.toka_katto - this.toka_määrä) ) return false; else{ this.toka_määrä += maara; this.eka_määrä -= maara; return true; } } else{ if ( maara > this.toka_määrä) return false; else if (maara > (this.eka_katto - this.eka_määrä)) return false; else{ this.toka_määrä -= maara; this.eka_määrä += maara; return true; } } } // lisaaViljaa yhteensä : 2 pistettä // * tarkistukset : 1 piste // * toimintalogiikka : 1 piste // - Jälleen kerran negatiivisia arvoja ei oltu tarkistettu. // SiirraViljaa-metodin huomiot pätevät tähänkin negatiivisuustarkistukseen public boolean lisaaViljaa(double maara){ if ( maara < 0.0 ) return false; else if ( maara > this.eka_katto - this.eka_määrä) return false; else{ this.eka_määrä += maara; return true; } } // otaViljaa yhteensä : 2 pistettä // * tarkistukset : 1 piste // * toimintalogiikka : 1 piste // - Tässäkin metodissa maaran negatiivisuus olisi pitänyt tarkistaa. public double otaViljaa(double maara){ if ( maara < 0.0 ) return 0.0; else if ( maara > this.eka_määrä ){ maara = this.eka_määrä; this.eka_määrä = 0.0; } else this.eka_määrä -= maara; return maara; } // hiirivahinko yhteensä : 2 pistettä // * tarkistukset : 1 piste // * toimintalogiikka : 1 piste // - Yllättävän moni oli unohtanut tarkistukset tässäkin metodissa. // Joka tapauksessa prosentit sai tulkita 0-1 tai 0-100 -välille. // - Positiivista oli, että suurin osa muisti/osasi toteuttaa // hiirivahinkoalgoritmin public void hiirivahinko(double vakavuus){ if ( vakavuus > 100.0 || vakavuus < 0.0 ) return; else{ vakavuus /= 100; this.eka_määrä -= (this.eka_määrä * vakavuus); this.toka_määrä -= (this.toka_määrä * vakavuus); } } // toString : 1 piste // - Tässä tapauksessa hyvinkin triviaalista toString-metodista // sai ainoastaan yhden pisteen. Turhan moni yhdisti S.o.p;n // ja Stringin liian vahvasti eli tulosteli toStringissä // Stringejä S.o.p:llä. Tarkoituksena oli kuitenkin tulosteen // palauttaminen paluuarvona. // - Helppo piste vähällä vaivalla niille, jotka pitivät päänsä // kylmänä koetilanteessa public String toString(){ return "Viljavaraston kapasiteetti:\nEka siilo:\t[" + this.eka_määrä + "/" + this.eka_katto + "]\n" + "Toinen siilo:\t[" + this.toka_määrä + "/" + this.toka_katto + "]"; } }