1. Selitä siis lyhyesti ja täsmällisesti seuraavat käsitteet: (yhteensä 16 pistettä) Lauseke on ohjelmointikielen ilmaus, jolla on jokin arvo ja tuolla arvolla on jokin tyyppi. 3p Lause puolestaan ilmaisee jonkin algoritmisen toiminnon, "tehdään jotakin". 3p Luokassa on väline, konstruktori, jolla luokan ilmentymä eli olio luodaan. 2p lisäksi jokin seuraavista: 1p * Konstruktori voi mm. asettaa luokan kentille alkuarvoja * Konstruktorin nimi on sama kuin luokan nimi * Konstruktorin määrittely on muuten kuin minkä tahansa metodin määrittely, mutta tyyppiä tai void-ilmausta ei voi käyttää. * Konstruktoreita voidaan kuormittaa Aksessorilla tarkoitetaan metodia, jolla luokan private-kenttiä tutkitaan tai muutetaan. 3p Taulukossa olevat alkiot on yksilöity siten, että kukin niistä "löytyy" oman indeksinsä avulla. Indeksit ovat kokonaislukuja. Taulukon ensimmäinen ja viides alkio voidaan laskea yhteen esimerkiksi näin: arvo = taulukko[0] + taulukko[4]; 3p Lisäksi yhden pisteen sai, jos vastaukset olivat erityisen ansiokkaita. Lause ja lauseke osoittautuivat vaikeimmiksi kohdiksi. Konstruktorin päämerkitys (eli olion luonti) puuttui yllättävän monesta vastauksesta. Sen sijaan indeksi osattiin hyvin. 2. Maitoautossa on kaksi tankkia. Vain ensimmäinen tankki on varustettu lastauslaittein. Maitoa voidaan siirtää tankista toiseen. Laadi luokka Maitoauto maitoauton toteutukseksi. Pisteitä tuli eri kokonaisuuksista seuraavasti: (yhteensä 17 pistettä) * public Maitoauto (double ekaTankki, double tokaTankki) luo maitoauton, jonka tankkien vetoisuus annetaan parametreina. Tankit ovat aluksi tyhjiä. 4p * public double ekassaOn() palauttaa ensimmäisen tankin maitomäärän 1p * public double tokassaOn() palauttaa toisen tankin maitomäärän 1p * public boolean siirräMaitoa(double määrä, boolean ekasta) siirtää parametrin verran maitoa tankista toiseen. Jos jälkimmäinen parametri on true, siirretään ensimmäisestä tankista toiseen, muuten päinvastoin. Jos koko määrää ei voida siirtää, ei siirretä mitään. Metodi palauttaa arvon true, jos siirto onnistui, false jos ei onnistunut. 4p * public boolean lisääMaitoa(double määrä) lisää maitoa ensimmäiseen tankkiin. Jos yritetään lisätä enemmän kuin mahtuu, maitomäärää ei muuteta. Metodi palauttaa arvon true, jos lisäys onnistui, muuten false. 2p * public double otaMaitoa(double määrä) poistaa maitoa ensimmäisestä tankista. Jos pyydetään enemmän kuin tankissa on, saadaan vain mitä on. 2p * public String toString() palauttaa arvonaan selkeän merkkijonoesityksen maitoauton tilasta 2p Luokan muuttujien oikeasta määrittelystä sain yhden pisteen. Lisäksi selvästä ja luettavasta koodista sai kaksi lisäpistettä, jolla saattoi korvata puutteita muussa koodissa. Kostruktorin tärkeyttä hieman korostettiin pisteytyksessä. Konstruktorissa oli usein unohdettu tehdä tarkastus negatiivisille parametreille. Otin tästä pisteen. Muiden aksessorien kohdalla negatiivisten syötteiden tarkastuksen puutteesta en rankaissut. Tehtävä meni hyvin. 3. Toteuta seuraava palvelu vuorovaikutteisena ohjelmana: Aamuisin ohjelmalle syötetään ensin tasan tuhat kokonaislukua missä järjestyksessä milloinkin. Päivän mittaan sitten usein kysellään onko jokin luku aamulla syötettyjen lukujen joukossa. Illalla ohjelma suljetaan. Tehokkuussyistä lukujen hakeminen on välttämättä ohjelmoitava binäärihakua käyttäen. Pisteitä sai seuraavasti: - lukujen syöttö: 4p - syötettyjen lukujen järjestäminen (järjestämisalgoritmilla ei ollut väliä) 4p - lukujen hakemisen silmukka 4p - binäärihaku 4p - koodin siisteys ja selkeys 2p (yksi ylimääräinen piste korvaa puutteita muualla koodissa) Järjestys- ja hakualgoritmien kohdalla pienistä (huolimattomuus)virheistä lähti vain piste tai kaksi, jos itse algoritmin idea oli muuten kunnossa. Tämä tehtävä osoittautui kenties hankalimmaksi.