Tietojenkäsittelytieteenlaitos 29.11.2001 Helsingin yliopisto 581325-0 Ohjelmoinnin perusteiden kurssikoe 12.11.2001 Tehtävä 2, tarkastaja fil.yo Juhani Haavisto Tehtävässä pyydettiin kirjoittamaan luokka Laiva. Laivalla on suunta, ja nopeus (piilotetussa tietorakenteessa), jotka ovat manipuloitavissa tiettyjen rajojen sisällä. Luokan tulee varmistaa tietorakenteensa arvojen oikeellisuus. Esimerkkiratkaisuna käy kurssin tehtävän 24 ratkaisukehitelmä (linkki toistaiseksi verkossa oleviin vastauksiin http://www.cs.Helsinki.FI/u/wikla/JohdOhj/OhPe/HarjS01/5/RJ.txt ). Tehtävän maksimipistemäärä oli 10p. Seuraavaan on merkitty jokaisen "osan" kohdalta ensiksi, paljonko siitä on saanut maksimissaan pisteitä, sekä vähennys kuvausta vastaavasta virheestä. Pääsääntöisesti osioista ei ole voinut saada negatiivista pistemäärää. Yleisesti on erilaisista syntaksi ym. vastaavista virheistä sakotettu 0,5p-1p tapauksesta riippuen. a) Tietorakenne ja luokan määrittely: +2p Luokka ja tietorakenne "hyvin määritelty", muuttujat private -tyyppisiä, sekä määritelty konstruktorin ulkopuolella. -0.5p private -määre puuttui muuttujista, muuten oikein -2p static sanan käyttö muuttujissa ja/tai metodeissa -2p muuttujien määrittely konstruktorissa b) konstruktori +1,5p kontruktori oikein määritelty -2p new -operaation käyttö konstruktorissa Moni oli määritellyt olion muuttujat konstruktorissa. Tämä(kin) on paha virhe. Ne katoavat, kun kontstuktorin suoritus päättyy, ts. kun olion luova ohjelma siirtyy new -riviltä seuraavalle. Myös luokkamuuttujien käytöstä (static -määre) rankaistiin, vaikkakaan tehtävänannossa ei pyydetä olio-ohjelmoimaan (ei myöskään pyydetä vastaamaan javakieltä käyttäen). Toinen erittäin paha virhe oli new -määreen käyttö konstruktorissa. Konstrukotoria suoritettaessa olio on jo luotu, ja se annetaan -new -kutsussa olevalle muuttujalle. Mitään toista oliota ei konstruktori- kutsussa tarvitse (eikä pidä) luoda. c) KäännäRuoria -metodi +3p Suunta muuttu oikein (nopeus huomioitu, arvo jää välille 0..359) -2p Laiva kääntyy väärin (esim. aina oikealle, nopeus ei vaikuta suuntaan, tai vaikuttaa väärin) -1p Laivan suunta on oikein, mutta arvo on monikerta (esim. 361 kun pitäisi olla 1, tai -5 kun pitäisi olla 355) Useat olivat kääntäneet laivaa aina oikealle (tarkistetaan onko nopeus >0 ja käännös >0, lisätään käännös nykyisiin asteisiin, jos taas käännös <0 vähennetään käännös nykyisestä (negatiivisen vähennys=itseisarvon lisäys)). Tästä on vähennetty kaksi pistettä, jos metodi oli muuten oikein. Jos lopullinen suunta jäi (mahdollisista trimmauksista huolimatta) rajojen ulkopuolelle, vähennettiin yksi piste. Poikkeuksena tapaus, jossa luokka kuitenkin palautti arvon oikein, se siis näkyi ulkopuoliselle käyttäjälle oikeanlaisena arvona. Jotkut tarkastelivat parametrina saatua arvoa, ja jos se oli rajojen ulkopuolella (eli yritettiin kääntyä "liikaa") hylkäsivät sen, tai muuttivat sen suurimmaksi mahdolliseksi käännökseksi (+359,-359). Pitkällisen harkinnan jälkeen tästä itse kehitellystä rajoituksesti ei otettu pisteitä pois. d)AsetaNopeus -metodi +2p parametrina saadun arvon hyvyys (välillä -5..30) tarkistetaan, ja kelvollinen arvo sijoitetaan muuttujan arvoksi -1p Rajoja ei tarkisteta, tai tarkistamisessa on jotain vikaa (esim tarkistetaan laivan nykyistä nopeutta). Mikäli laiva saa rajojen tarkistelusta riippumatta parametrin alkuperäisen arvon, vähennettiin piste -0,5p laiva saa väärän nopeuden (useimmiten nykyisen ja uuden summa) Hyvin yleinen virhe oli sijoittaa oliomuuttujalle arvoksi parametrin alkuperäinen arvo, tai ensin tarkastella rajat (ja sijoittaa muuttujalle maksimi- tai minimiarvo) ja tämän jälkeen unohtaa parametrin sijoitus kokonaan! Usein myös rajojen tarkistus oli kokonaan unohdettu. e) toString -metodi +1,5p Metodi palauttaa merkkijonon, joka jollain tavalla kuvaa laivan nykyistä tilaa -2p metodi tulostaa S.o.p:llä jotain, eikä palauta mitään!!!!!!!!!!! Aivan liian monessa vastauksessa toString -metodi tulosti jotain, eikä palauttanut yhtään mitään. Metodin määrittelyä miettimällä (public String toString) sekä tehtävänannon sanamuotoa (esittää laivan tilan) pohtimalla olisi moni varmastikin päätynyt erilaiseen ratkaisuun ja saanut tehtävästä pari pistettä enemmän. Rautalangasta: toString -metodin "tehtävä" on palauttaa merkkijono. se ei tulosta mitään. pistejakauma 2 tehtävän osalta: 10: ******************************************* 86 kpl 9: ************************************ 71 kpl 8: ********************************* 65 kpl 7: ************ 23 kpl 6: ****** 11 kpl 5: ***** 9 kpl 4: **** 8 kpl 3: * 2 kpl 2: *** 5 kpl 1: * 2 kpl 0: ******* 14 kpl vastaajia yhteensä: 296