Ohjelmoinnin perusteet, koe 13.11.2000, Tehtävä 2

Tehtävänannosta ja sen lukemisesta

Lämpötilan maksimin ja minimin rekisteröintiin käytetään laitetta MinMax. Laitteelle syötetään lämpötiloja ja siltä voidaan milloin tahansa kysyä toistaiseksi korkeinta ja toistaiseksi matalinta lämpötilaa. Kun laite otetaan käyttöön, se asettaa molemmiksi lämpötiloiksi 0.0. Laite voidaan myös myöhemmin nollata. Laitteelta voidaan kysyä, onko se alkutilassa vai voiko sen ilmoittamiin lämpötiloihin luottaa.
Toteuta laite luokkana MinMax, jolla on konstruktorin lisäksi seuraavat aksessorit:
 

Ensiksi luetaan tehtävänanto kunnolla ja mietitään mitä pyydetään tekemään... taito mikä ei ole kaikilla hallussa.

Alussa kerrotaan että lämpötilan maksimin ja minimin rekisteröintiin käytetään laitetta MinMax. Laite siis rekisteröi lämpötilojen minimin ja maksimin, laitteen pitää tällöin pitää muistissaan vain kaksi arvoa, minimi ja maksimi.

Tehtävänannossa sanotaan että laitetta käytetään lämpötilojen rekisteröimiseen. Siinä ei kerrota että laitteeseen syötettävät lämpötilat pitäisi tarkistaa jotekin, siinä ei kielletä etteikö laitteeseen voisi syöttää pienempää lämpötilaa kuin absoluuttinen nollapiste, siinä ei kerrota että laitetta käytetään ulkolämpötilan mittaamiseen. Toisinsanoen MinMax laite ei vaadi että lämpötila olisi järkevältä lukualueelta.

Laitteelta voidaan milloin tahansa kysyä toistaiseksi korkeinta ja toistaiseksi matalinta lämpötilaa, ei toiseksi korkeinta ja toiseksi matalinta kuten osa oli lukenut.

Kaikki olivat onnistuneet lukemaan sen että kun laite otetaan käyttöön lämpötiloina on nolla molemmissa.  Lisäksi se oli ymmärretty oikein että laite voidaan nollata.

Laitteelta voidaan kysyä onko se alkutilassa vai voiko sen ilmoittamiin lämpötiloihin luottaa. Tässä pitää sitten miettiä se mitä halutaan.. halutaanko tietää onko laite alkutilassa vai halutaanko tietää se voiko lämpötiloihin luottaa? Eli jos laite on alkutilassa sen lämpötiloihin ei voi luottaa.. ja jos lämpötiloihin voi luottaa laite ei ole enää alkutilassa. Selvyyden siihen kumpaa tuossa tarkalleenottaen tarkoitettiin saa jos lukee tehtävänantoa pidemmälle. Tehtävänannossa pyydetään toteuttamaan metodi kunnossa(), joka vastaa siihen kysymykseen onko laite/lämpötilat kunnossa. Eli jos on kunnossa lämpötiloihin voi luottaa, jos ei ole kunnossa lämpötiloihin ei voi luottaa.

Tehtävänannossa mainitaan että luokalla on konstruktorin lisäksi seuraavat metodit.. eli luokalla pitää olla konstruktori.

Metodi kirjaa lämpötila(double), kyseisellä metodilla syötetään laitteeseen yksi lämpötila.

Metodit minimi() ja maksimi() palauttavat pienimmän taikka isoimman lämpötilan joka laitteelle on syötetty.

Metodi nollaa() ilmeisesti nollaa laitteen kuten tehtävänannossa on aikaisemmin kerrottu.

Metodi kunnossa() vastaa nimensä mukaisesti kysymykseen kunnossa? Eli onko laite kunnossa ja voiko näinollen sen lämpötiloihin luottaa.

HUOM! Tehtävänannossa ei missään välissä pyydetty tekemään luokkaan pääohjelmaa eikä toistakaan luokkaa missä kyseistä luokkaa testattaisiin. Valitettavan moni oli kuitenkin kallista aikaa näiden tekemiseen tuhlannut.

Tuossa oli esimerkki siitäi miten tehtävänanto luetaan.
 

Arvostelu

Kyseinen tehtävähän oli kurssin aikana laskareissa täsmälleen samanlaisena, joten ainakin niiden se olisi pitänyt osata jotka laskareissa olivat käyneet. Tämän takia saatoin ottaa arvostelussa ehkäpä vähän normaalia kovemman linjan. Arvostelussa painotin enemmän sitä kuinka osaa käyttää ohjelmintikieltä jonkin toteuttamiseen, enkä sitä että osaa ulkomuistista kirjoitella varattuja sanoja ja alustaa muuttujan nollaki taikka kirjoittaa return ja perään muuttujan nimen. Tämän johdosta metodit kirjaaLämpötila(double) ja kunnossako() olivat pistesaaliin ja pisteiden menettämisen osalta suuremmassa arvossa kuin muut asiat.

Arvostelussa en kiinnittänyt huomiota kirjoitusvirheisiin jotka menivät sen piikkiin että homma tehtiin kynällä paperille. Miinuspisteitä ei tullut jos luokan loppusulku puuttui taikka puolipisteet olivat välillä hukassa. Kuitenkin jos puolipisteet, aaltosulkeet, sulut sun muut olivat järjestelmällisesti hukassa ja näki ettei henkilö tiedä miten ja missä niitä pistäisi käyttää niin silloin tuli miinuspisteitä. En myöskään ottanut pisteitä pois vaikka ohjelmakoodi oli täysin ilman kommentteja, vaikka mieli teki.  En myöskään kiinnittänyt huomiota thissin käyttöön, enkä siihen jos oli tehty turhaa ylimääräsitä työtä. Tehtävissä menetti helposti useammankin pisteen ja monissa tapauksissa jos olisin pitänyt tiukan linjani olisivat ihmiset saaneet miinuspisteitä. Mitä enemmän virheitä teki sitä vähemmän niistä enää menetti pisteitä, tuo raja kulki jossain viiden pisteen paikkeilla.

Tässä on laskareden esimerkkiratkaisu aluksi.

/* Ohjelmoinnin perusteet, syksy 2000   Tehtävä 23.
    Ratkaisuehdotus, tekijä Olaf Laczak (olaf.laczak@helsinki.fi)
*/

public class MinMax {

    private double minimilämpö;
    private double maksimilämpö;
    private boolean alkutilassa;

    public MinMax() {
        this.nollaa();
    }

    public void kirjaaLämpötila(double arvo) {
        if (this.alkutilassa) {
            this.minimilämpö=arvo;
            this.maksimilämpö=arvo;
            this.alkutilassa=false;
        }
        else {
            if(arvo<this.minimilämpö)
                this.minimilämpö=arvo;
            if(arvo>this.maksimilämpö)
                this.maksimilämpö=arvo;
        }
    }

    public double minimi() {
        return this.minimilämpö;
    }

    public double maksimi() {
        return this.maksimilämpö;
    }

    public void nollaa() {
        this.minimilämpö=0;
        this.maksimilämpö=0;
        this.alkutilassa=true;
    }

    public boolean kunnossa() {
        return !this.alkutilassa;
    }
}

En kiinnittänyt huomiota siihen osasiko porukka kirjoittaa oikein luokan alun. public class MinMax {  enkä siihen oliko luokan loppusulku olemassa.
 
 

private double minimilämpö;
private double maksimilämpö;
private boolean alkutilassa;

Kaksi pistettä miinusta sai siitä jos muuttujat eivät olleet private. Lisäksi jos ei ollut muuttujaa jossa voidaan pitää yllä tietoa laitteen lämpötilojen luotettavuudesta niin myöhemmin tehtävässä pakostikkin päätyi virheisiin jotka verottivat seitsemän pisteen edestä. En vähentänyt pisteitä jos käytti ylimääräisiä ja tarpeettomia muuttujia. Siitä sai kolmen pisteen edestä miinusta jos jätti muuttujat kokonaan määrittelemättä.
 
 

public MinMax() {
        this.nollaa();
    }

Luokan konstruktorin sai helpoiten tehtyä jos siinä kutsui luokan nollaa() metodia. Toisenlainenkin ratkaisu jossa muuttujat alustettiin jokainen erikseen oli aivan oikea. Jos unohti tehdä konstruktorin kokonaan sitä ropisi miinuspisteitä kolmen pisteen edestä. Lisäksi jos oli unohtanut määritellä luokan alussa muuttujat ja määritteli ne konstruktorin sisällä niin siitä tuli virhepisteitä, kuitenkin niin että nuo kaksi virhettä jotka ovat toisisaan kiinni laskettiin yhdeksi, miinus kaksi pistettä siitä. Yhden miinuspisteen sai siitä jos konstruktorissa pisti boolean muuttujan falseksi ja myöhemmin nollaa metodissa trueksi.
 
 

public void kirjaaLämpötila(double arvo) {
        if (this.alkutilassa) {
            this.minimilämpö=arvo;
            this.maksimilämpö=arvo;
            this.alkutilassa=false;
        }
        else {
            if(arvo<this.minimilämpö)
                this.minimilämpö=arvo;
            if(arvo>this.maksimilämpö)
                this.maksimilämpö=arvo;
        }

Tässä metodissa oli tärkeää huomata että ensimmäinen lämpötila on sekä pienin että suurin. Lisäksi pitää huomata että nollankin pitää pystyä kirjaamaan laitteeseen. Jos metodi ei ottanut huomioon että ensimmäinen lämpötila oli sekä suurin että pienin niin siitä tuli kolme miinuspistettä.
Jos ei tiennyt mitä kirjaaLämpötila(double) tarkoittaa ja ei osannut parametrinvälitystä vaan alkoi kysymään käyttäjältä lämpötiloja Lue-luokan välinellä ropsahti heti ylimääräiset kolme miinuspistettä. Jos asetti laitteen tilan kunnossa olevaksi vaikkei laite ollut kunnossa sai yhden miinuspisteen. Jos laitteeseen ei voinut kirjata lämpötilaksi nollaa ollenkaan sai yhden miinuspisteen.  Osa käyttäjistä onnistui saamaan tässä aikaiseksi loppumattoman loopin jossa vain kysyttiin lämpötiloja käyttäjältä, taikka kysyttiin niitä kunne käyttäjä onnistui syöttämään jonkin luvun.
 
 

public double minimi() {
        return this.minimilämpö;
}

public double maksimi() {
       return this.maksimilämpö;
}

Noissa metodeissa ei pahemmin oltu tehty virheitä, suurin osa osasi kirjoittaa return ja muuttujan nimi, valitettavasti näistä ei myöskään saanut pahemmin pisteitä, noin yksinkertaiset kun olivat. Pahimmat virheet sai aikaiseksi kun oletti että metodien pitää tulostaa käyttäjälle jotain taikka että metodeilla kirjataan lämpötiloja laitteeseen. Nämä olivat kolmen ja kahden pisteen arvoisia virheitä.
 
 

public void nollaa() {
        this.minimilämpö=0;
        this.maksimilämpö=0;
        this.alkutilassa=true;
    }

Nollaa() metodissakaan ei pahemmin oltu virheitä tehty. Muuttujan alustaminen nollaks, falseksi tahi trueksi ei ollut kovinkaan vaativa homma, varsinkaan kun tämä sama asia tehtiin jo konstruktorissa kertaalleen joten näistäkään ei pahemmin pisteitä herunut. Virhepisteitä tuli siitä jos
alusti muuttujat paikallisiksi muuttujiksi metodin sisällä taikka antoii boolean arvolle toisen arvon kun konstruktorissa tai unohti nollata jonkin muuttujan. Tästä oli mahdollista saada virhepisteitä yhdestä kahteen.
 

public boolean kunnossa() {
        return !this.alkutilassa;
    }

Metodin pitää vastata siihen onko laite kunnossa, eli voiko sen lämötiloihin luottaa. Jos metodi palautti väärän arvon sai kolme miinuspistettä.
Se että min ja maks arvot ovat jotakin muita kuin nollia eivät takaa laitteen kunnossaolemista koska laitteeseen pitäisi pystyä kirjaamaan myös nollia. Sekään että laitteeseen on kirjattu x arvoa ei takaa että laitteen lämpötiloihin voi luottaa.
 
 

Päätinpä tehdä vielä helpommin luettavissa olevan "taulukon" noista vireistä ja miinuspisteistä.

-3p jos unohti määrritellä muuttujat kokonaan.
-2p jos ei määrritellyt muuttujia privateksi.
-3p jos unohti tehdä konstruktorin.
-1-2p jos konstruktorissa oli muuta ihmeellistä häikkää. Esim voidia jne.
-2p jos määritteli muuttujat konstruktorin sisällä sensijaan että olisi määrritellyt ne oikeassa paikassaan.
-3p jos metodit tulostivat jotakin taikka siellä kyseltiin käyttäjän mielipiteitä Lue-luokalla taikka jos kyseltiin arvoja käyttäjältä.
-2p jos minimi(), maximi() metodeissa oli jotakin häikkää.
-3p jos ei huomioitu että eka lämpötila joka laitteeseen kirjataan on sekä minimi että maksimi, lisäksi -1p jos laite asetettiin kunnossaolevaksi kun oli kirjattu eka lämpötila joko minimiksi taikka maksimiksi.
-1p jos laitteeseen ei voitu kirjata lämpötilojen arvoksi nollaa ollenkaan.
-1p jos nollaa metodi ja konstruktori olivat ristiriidassa arvojen kanssa, eli true/false hässäkkä.
-3p jos kunnossa metodi ei palauttanut oikeaa tietoa.
-1-2p jos käytettiin arvoja joita ei ollut olemassakaan.
-1p jos unohdettiin nollata jokin arvo nollaa() metodissa.

Lisäksi oli lukuisa joukko pienempiä ja suurempia virheitä jotka kuitenkin olivat kaikki toisistaan poikkeavia. Porukka joka teki näitä yksilöllisiä virheitään teki taatusti myös suurimman osan yllämainituista. Siksi en niiden arvostelua tähän enää lisää.