----------------------------------------------------------- TEHTÄVÄNANTO: 1. Vastaa lyhyesti ja täsmällisesti seuraaviin kysymyksiin: Mitä oliot ja luokat oikeastaan ovat? Miten matriisin kaikki alkiot käydään läpi? Anna konkreettinen ohjelmaesimerkki ja perustele. Matriisin kokoa ei tiedetä ennalta. Mihin public String toString() -metodia käytetään? Miten? Mitä hyötyä siitä on? (12 pistettä) ----------------------------------------------------------- YKSI JOTAKUINKIN OIKEA VASTAUS: (Nämä vastaukset ovat osin huomattavasti pidempiä kuin täysiin pisteisiin vaadittu vastaus.) 1) Javassa luokka on määrittely joillekin yhteenliittyville muuttujille ja operaatioille. Luokka voi määritellä 1) tietyn oliotyypin (minkälaisia ominaisuuksia ja operaatiota on ko. luokan ilmentymillä), 2) staattisia, ilmentymiin liittymättömiä operaatiota tai kenttiä tai 3) sekä että. Olio on tietyn luokan ilmentymä, eli kokoelma (ko. luokan määrittelemiä ei-staattisia) muuttujia, joille voidaan tehdä tiettyjä (ko. luokassa määriteltyjä) operaatiota. 2) (for int i = 0; i < mat.length; i++) { for (int j = 0; j < mat[i].length; j++) { // tee jotain mat[i][j] :lle } } (Esimerkissä kommentin sijaan sijoitetaan lause, joka jokaiselle alkiolle halutaan suorittaa.) Matriisi (Javassa) on taulukko, jonka alkioina on (samanmittaisia, joskaan sillä ei tässä esimerkissä ole väliä) taulukko-olioita, joiden alkioina puolestaan on olioita joita matriisiin laitetaan. Ylläolevassa esimerkissä muuttujassa mat on viite tällaiseen taulukkoon, jossa on taulukoita. Muuttuja mat[i] on viite johonkin näistä mat:n sisältämistä taulukoista. Muuttuja mat.length kuvaa sitä, kuinka monta taulukkoa ensimmäisessä taulukossa on ("kuinka monta riviä matriisissa on"). Muuttuja mat[i].length puolestaan kuvaa sitä, kuinka monta alkiota on tietyssä mat-taulukon sisältämässä taulukossa ("kuinka monta saraketta matriisissa on"). Näin esimerkki käy läpi jokaisen matriisin sarakkeen (sisempi silmukka) jokaisella sen rivillä (ulompi silmukka). 3) public String toString() on metodi, jonka tarkoitus on palauttaa merkkijonoesitys oliosta. Kaikilla oliolla on tämä metodi. Oletustoteutuksen voi voi korvata omalla tekemällä halutunlaisen metodin omaan luokkaansa. Yleensä metodiin kannattaa ohjelmoida kuvaus olion sen hetkisestä tilasta. toString() mahdollistaa esimerkiksi olion tilan tulostamisen helposti ja aina samalla tavoin ilman, että tulostavan koodin tarvitsisi esimerkiksi kutsua (muita) aksessoreja saadakseen selville olion tilan. Tämä on hyvä asia paitsi tehtäessä tekstipohjaisia käyttöliittymiä myös erityisesti silloin, kun halutaan testata luokan toimintaa. ------------------------------------------------------------------- ARVOSTELUPERUSTEITA: Kustakin kohdasta 4 pistettä. 1) Luokka = ohjelmatiedosto, samaan asiaan liittyvien juttujen kokoelma, tms selitys (1p) Luokka olion määrittelynä (1p) Olio = tietyn luokan ilmentymä (1p) Olio = kokoelma tietoja ja tiedon käsittelyyn liittyviä tapoja (1p) Sanomalla siis yleisen "luokka on olion määrittely ja olio luokan ilmentymä" kehäpäätelmän saa siis puolet pisteistä. (Ihan liikaa kyllä.) Tiettyjä sanamuotoja ei ole vaadittu, riittää, että käy ilmi, että asia on tajuttu. Esimerkit kelpaavat selityksiksi. 2) Matriisin läpikäyntiesimerkki 2p. Vakiokokoiseksi oletettu taulukko 0p (kun kerta erikseen kiellettiin). Täysin väärä indeksi sisemmässä silmukassa lengthissä 0 pistettä. Muuten toimimaton tai epäselvä ratkaisu 0 tai 1 pistettä riippuen virheen vakavuudesta. Tuon taivaallisen sama mitä alkioille tehdään, kunhan ei ole aivan älyttömiä virheitä tehnyt, ja on jotenkin osoittanut tietävänsä miten tiettyyn alkioon viitataan. Selitys 2p. Selityksessä käytävä ilmi "jokaisen sarakkeen läpikäynti jokaista riviä kohti" tai "taulukossa olevien taulukoiden läpikäynti" tai muuta vastaavaa. Hyvin lyhytkin virheetön kommentti riittää. Jos on tehnyt esimerkissä kämmiä, voi selityksellä pelastaa yhden pisteen, jos siitä selvästi hahmottuu, mikä length / silmukkaehto viittaa mihinkäkin pituuteen. 3) Metodi, joka mahdollistaa olion käyttämisen merkkijonona, esimerkiksi katenoitaessa sitä muihin merkkijonoihin tai tulostettaessa, palauttamalla siitä merkkijonoesityksen (1p). Kaikilla oliolla on tämä metodi, toteutuksen voi määritellä itse jos ei tyydy oletustoteutukseen (1p). Käyttöesimerkki, josta tämä käy ilmi, ilman varsinaista selitystä 1-2p (selkeydestä riippuen). Hyödyn selityksestä 1-2p. Pelkästä "olio on helpompi tulostaa" 1p. Kun lisäselvityksenä on joku selitys sille, miksi olio saatettaisiin haluta tulostaa ("helpottaa testausta", "sopivalla toString():llä saadaan olion tila selville helpommin kuin kutsumalla eri aksessoreja" tms) saa sen toisenkin pisteen. Antamalla esimerkin, jossa ko. metodista tulostettiin suoraan jotain, sai tasan nolla pistettä. Selitystä siitä, *miksi* kaikilla oliolla on tuo metodi (periytyy Objectilta) ei vielä peruskurssin kokeessa vaadittu, vaan sen sai ottaa uskonasiana. ---------------------------------------------------------------------- TARKISTUSKERTOMUS: Tehtävä oli pääasiassa osattu varsin hyvin. Jokunen ei ollut osannut yhtään mitään ja muiltakin pikkuvirheistä meni usein 1-2 pistettä. Täydet 12 pistettä oli harvinaisuus, mutta 7-10 pistettä jo melko yleinen saalis. Silti luvattoman moni jäi alle kuuden pisteen...:/ Sekalaisia huomioita: Tällä opiskelujen tasolla kukaan ei enää sakota, jos ette kirjoita kaunoa (tai mitä tyyppikirjoitusta se nykyään on). Monien kaunokirjoituskäsiala on hirveä, opetelkaa äkkiä tekstaamaan suhteellisen sievästi ja unohtakaa mokoma koukerointi. Toisaalta pelkillä TIKKUKIRJAIMILLA kirjoittemisesta saa kanssa päänsärkyä, samat terveiset teille. 1) - "Kehäpäätelmää" (ks. arvosteluperusteet) esiintyi ilahduttavan vähän! - Jos on pyydetty selittämään lyhyesti, jättäkää jaarittelut tyyliin "Jo muinaiset roomalaiset" tai, realistisemmin, "Luokka ja olio ovat Java-ohjelmoinnissa hyvin keskeisiä käsitteitä" pois. Niistä ei lisää pisteitä heru ja kuluu vaan kallisarvoista korjausaikaa. ;) - Aika monessa vastauksessa esiintyi mystinen väite, että kerran luotua oliota ei voi muuttaa. Javassahan tämä ei pidä alkuunkaan paikkaansa. Jotkut harvat luokat on ohjelmoitu näin (String, Integer, jnpp), mutta yleisesti ottaen tottakai oliota voi muuttaa - kunhan olion luokka vain tarjoaa jonkin aksessorin, joka suostuu olion jotakin kenttää muuttamaan. - Toinen usein esiintynyt väärinkäsitys oli, että luokkia kannattaisi määritellä yksityisiksi ("private") julkisen ("public") vaihtoehtona. Yksityisellä luokalla ei olisi paljon käyttöä, koska siihen ei pääse käsiksi luokan ulkopuolelta - sellaisesta ei esim. voisi luoda ilmentymää, sellaisen luokkametodeihin ei voisi viitata... (Yksityiset ns. sisäluokat sen sijaan kyllä ovat käyttökelpoisia, mutta ne eivät kuulu vielä tälle kurssille.) 2) - Pelkkä matriisin läpikäyvä lause olisi riittänyt, ei ollut mitään tarvetta ohjelmoida kokonaista luokkaa joka tekee kaiken maailman juttuja matriiseille (ei ylimääräisistä koodiriveistä kyllä pisteitä menetäkään, paitsi ehkä sillä että ei sitten kerenny tekemään muita tehtäviä...) - 1-ulotteisesta taulukosta ei vielä käy ilmi matriisin läpikäynnin idea, eli pisteet meni nollille. 2-ulotteisen matriisin läpikäynti on se, mitä tässä haetaan (ohjelmoinnissa usein, joskaan ei aina, tarkoitetaan matriisilla 2-ulotteista taulukkoa). Useampiulotteisiakin on toki saanut esittää ja mielivaltaisen monta ulottuvuutta sisältävää ei tietenkään vaadittu. - On virhe sanoa, että "tietokoneen sisäisessä esitystavassa matriisi on taulukko, jonka alkiot ovat taulukoita". Javan esitystavassa näin on, mutta se on aivan eri asia. Tästä virheestä ei ole sakotettu (valitettavasti?), mutta toivottavasti sen tehneet useammat kuin yksi tai kaksi lukevat tämän korjauskertomuksen :) - Kun tehtävänannossa sanottiin, että taulukkoa ei saa olettaa vakiokokoiseksi, ei tätä kieltoa ole voinut kiertää sijoittamalla vakiokoon johonkin muuttujaan. On aivan yhtä väärin sanoa int[][] = new int [a][b]; for (int i = 0; i < a; i++)... kuin for (int i = 0; i < 100; i++). 3) - "Olio on helppo tulostaa" varsin yleinen kommentti. So what, jos ei ole selitetty miksi kukaan maailmassa haluaisi tulostaa olioita. :) (Miellyttävän moni kyllä oli.) Tästä kohdasta sai pisteitä, kun oli sanonut jotain edes suunnilleen järkevää asiasta ja antanut käyttöesimerkin. - Jokunen haksahti kertomaan staattisista toString()-metodeista, vaikka tehtävänannossa puhuttiin public String toString():sta (eikä public static String toString(...):stä).