Johdatus Ohjelmointiin, S98, HY/TKTL välikoe 1, tehtävän 2 arvosteluperusteet & kommentit Antti Tuominen (attuomin@cc.helsinki.fi) 30.01.1998 Päivitetty 25.11.98 ja 30.11.98 Tehtävä: 2. Tee metodi lueValilta, joka saa parametrina kaksi int-arvoa, jotka ovat halutun syöttöluvun ala- ja yläraja. Metodi pyytää käyttäjältä kokonaislukua ala- ja ylärajan väliltä eikä anna periksi ennekuin käyttäjä ymmärtää antaa kelvollisen luvun; arvonaan metodi palauttaa lukemansa, ala- ja ylärajan välissä olevan luvun. Parametrit pitää voida antaa kummassa järjestyksessä tahansa. (5 pistettä) Esimerkkiratkaisu(suljettu väli): public int lueVäliltä(int ala, int ylä) { if(ala>ylä) // rajat "väärin päin" { int apu=ala; ala=ylä; ylä=apu; } // nyt ala on alaraja ja ylä on yläraja int luku; do { System.out.println("Anna kokonaisluku väliltä "+ala+" "+ylä); luku=Lue.kluku(); } while(lukuylä); // kysytään uusi, jos saatu luku // oli liian pieni tai liian suuri return luku; } Ajatuksia: Tehtävässä siis pyydettiin tuota metodia. Ei luokkaa, ei main-metodia. Niitäkin sai tehdä, mutta hommien delegointi muiden tehtäväksi ei ollut hyväksi arvosanalle. Äärimmäinen tapaushan olisi, että "tein tähän tyhjän metodin, sillä oletan, että kaikki työ tehdään muualla". Tyypillinen "hyvän" vastauksen lipsahdus oli do-while -ehdon ymmärtäminen väärin, jolloin silmukka kysyi uuden luvun mikäli syötetty luku oli kelvollinen. Myös muutama "pakollinen" = vs. == -sekaannus oli mukana, sekä tietysti puuttuvia puolipisteitä yms. Arvostelussa on otettu huomioon ohjelmien kirjoittaminen paperille, jolloin pienistä kirjoitusvirheistä ei ole niuhotettu. Keskimäärin vastaukset olivat hyviä ja niinpä pisteitäkin on tullut mukavasti. Arvosteluperiaatteet: - Pistearvon tulee kuvastaa vastaajan osaamista. Alla olevat rokotukset eivät aina antaneet oikeaa kuvaa vastaajan tasosta. Tyypillisesti: - Melko hyvä vastaus, mutta "hiukan repsallaan" juuri sellaisista kohdista, että pisteet tippuvat hurjasti. - Miten tämän nyt sanoisi... hmmm... "erittäin persoonallinen" vastaus, jossa täytyy täydellisyysoletuksen asemesta lähteä miettimään: "onko tässä mitään, mistä voisi antaa pisteitä?". Tällaisissa tilanteissa pisteitä on säädetty tarpeelliseen suuntaan. - Samasta virheestä ei rokoteta kahdesti eri otsikon nojalla. - Tyyliseikoista ei rokoteta, tiettyyn rajaan asti, siitä eteenpäin tapauskohtaisesti. - Sekä avoimen, että suljetun välin tulkinnat kelpaavat. (Eli kuuluvatko päätepisteet välille vai välin ulkopuolelle.) Avoimen välin tulkitsijat ovat itse vastuussa tulkinnastaan, eli mahdolliset kelvottomat syötteet pitää tarkistaa. "Arvostelualgoritmi": Tämä on yhdenmukaistava ohjenuora, josta saatetaan yksittäisissä tapauksissa poiketa, lähinnä sen ollessa ristiriidassa ensimmäisen periaatteen (yllä) kanssa. Oletetaan täydet 5 pistettä, vähennellään seuraavasti: Rankaistavat virheet: --------------------- 1) metodille ei saa antaa lukuja "väärässä" järjestyksessä: -2p - jos tarkistukset tehdään pääohjelmassa: -1p - jos asia huomioidaan, mutta väärin: -1p 2) metodi jää ikuiseen silmukkaan pyytämään mahdotonta arvoa (esimerkiksi avoimelta väliltä ]3, 4[): -1p - jos väli tarkistetaan pääohjelmassa: -1/2p 3) metodi "antaa periksi" tai muuten palauttaa epäkelpoja arvoja: -1p. 4) Käyttäjälle ei kerrota, mitä halutaan syötteeksi: -1p (Käyttäjä ei "näe" ohjelman sisäistä toimintaa!) -1p myös jos pyydetään vain "anna luku". Lievempi suhtautuminen, jos vastauksessa mainitaan erikseen, että käyttäjän oletetaan asiayhteydestä jo tietävän haluttavan lukualueen. -1/2p, jos mukaan oli tehty pääohjelma, jonka perusteella voisi olettaa käyttäjän olevan kärryillä. 5) Systemaattinen sulun, aaltosulun, puolipisteen tms. puuttuminen: -1p. 6) Rajoja ei välitetä parametreina: -1p. Tai sitten välitetään kaksi parametria, mutta niillä ei tehdä mitään. Esim: public int lueVäliltä(int ala, int ylä) { S.o.p("Anna alaraja:"); ala=Lue.kluku(); S.o.p("Anna yläraja:"); ylä=Lue.kluku(); ... 7) Väärä tai puuttuva palautusarvo: -1p Eli metodi ei palauta arvoa tai palauttaa String-olion tms. kummaa. -1/2p jos palautetaan int-arvo, mutta metodi on tyyppiä "void". 8) Vakavat tyyliseikat, sataprosenttisesti ihmisjärjen vastainen toiminta, lukukelvoton ohjelma tms. Vähennykset tapauskohtaisesti. 9) Muut virheet. Vähennykset tapauskohtaisesti. Ei-rankaistavat virheet: 1) Satunnainen sulun, aaltosulun, puolipisteen tms. puuttuminen. Oleellista on, että vastauksesta ilmenee, että kyseessä oli kirjoitusvirhe, eikä puute vastaajan tiedoissa. 2) Lievät tyyliseikat, kuten "persoonallinen" sisennys, while-silmukan käyttö vaikka do-while sopisi paremmin, tms. 3) Näkyvyyssääntöjen rikkominen, eli tyypillisesti: do { ... int luku; ... } while(ehto); return luku; 4) Metodi sai olla public tai private, static tai ei. 5) Lievä matemaattinen hämmennys. (Esim. puhutaan suljetusta välista vaikka tarkoitetaan avointa, tms.)