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:
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ää.