Harjoitustyö. 1. Johdanto. 1.1. Tehtävä



Samankaltaiset tiedostot
Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei.

Hakemistojen sisällöt säilötään linkitetyille listalle.

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Toinen harjoitustyö. ASCII-grafiikkaa

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen.

2. Merkkijono, osamerkkijono ja osamerkkijonon haku

Harjoitustyö Johdanto

Harjoitus 5 (viikko 48)

Harjoitus 6 (viikko 42)

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Harjoitustyö Johdanto. 2. Euroseteli

Harjoitustyö Johdanto

14. Hyvä ohjelmointitapa 14.1

Harjoitus 5 (viikko 41)

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita.

Harjoitustyö. 1. Johdanto Tehtävä

13. Hyvä ohjelmointitapa (osa 1) 13.1

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Harjoitus 2 (viikko 45)

9. Periytyminen Javassa 9.1

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Harjoitustyö Johdanto Tehtävä

5. HelloWorld-ohjelma 5.1

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla.

Harjoitustyö Johdanto Tehtävä

Harjoitus 4 (viikko 47)

Ohjelmoinnin perusteet Y Python

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet Kevät Olio-ohjelmoinnin perusteet (5 op) Tavoitteena

Harjoitus 6 (viikko 42)

Harjoitus 3 (viikko 39)

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmoinnin perusteet Y Python

4. Luokan testaus ja käyttö olion kautta 4.1

Oliot viestivät metodeja kutsuen

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisältö. 2. Taulukot. Yleistä. Yleistä

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Kurssiesite Lausekielinen ohjelmointi II Syksy Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Harjoitus 5 (viikko 41)

Harjoitustyö Johdanto Tehtävä

Sisältö. 22. Taulukot. Yleistä. Yleistä

9. Periytyminen Javassa 9.1

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

18. Abstraktit tietotyypit 18.1

dogs worlds_ugliest_dog.jpg

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

5. HelloWorld-ohjelma 5.1

Kurssiesite Olio-ohjelmoinnin perusteet Kevät Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto

Ohjelmoinnin perusteet Y Python

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Ohjelmoinnin perusteet Y Python

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Ohjelmointi 2 / 2010 Välikoe / 26.3

15. Ohjelmoinnin tekniikkaa 15.1

ITKP102 Ohjelmointi 1 (6 op)

Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät 2018

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät Olio-ohjelmoinnin perusteet (eli Oope) Laajuus

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet Kevät Olio-ohjelmoinnin perusteet (TIEA2.1)

Kurssiesite Olio-ohjelmoinnin perusteet Kevät Jorma Laurikkala Tietojenkäsittelytieteet Luonnontieteiden tiedekunta Tampereen yliopisto

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

4. Olio-ohjelmoinista lyhyesti 4.1

2. Olio-ohjelmoinista lyhyesti 2.1

14. Poikkeukset 14.1

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Pakkauksen kokoaminen

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Olio-ohjelmointi Javalla

Ohjelmoinnin perusteet Y Python

12. Näppäimistöltä lukeminen 12.1

Ohjelmoinnin perusteet Y Python

Pakkauksen kokoaminen

16. Javan omat luokat 16.1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet Y Python

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Vastuuopettaja. Kurssiesite Lausekielinen ohjelmointi Syksy Tavoitteet ja keinot. Lausekielinen ohjelmointi (10 op)

Ohjelmoinnin perusteet Y Python

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tentti kestää kolme tuntia. Tehdään sähköisesti mikroluokkien Windows-koneilla.

8. Näppäimistöltä lukeminen 8.1

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Tietotekniikan valintakoe

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Harjoitustyö. 1. Johdanto Tehtävä

Transkriptio:

1. Johdanto 1.1. Tehtävä Kaukana, monen valovuoden päässä täältä, sijaitsee planeetta, jolla on käynnistynyt alkeellinen elämä. Tehtävänäsi on toteuttaa Java-kielellä ohjelma, joka simuloi planeetan alkulimassa eläviä lötköjä. Lötköistä tunnetaan koko (> 0) ja kahdeksan merkin mittaimen perimä, joka esitetään suuraakkoston kirjaimilla A H. Lötköt ovat eriytyneet kahdeksi lajiksi, jotka ovat klimpit ja pläntit. Klimpille ominainen piirre on väri ja plänteille ominaista on muoto. Klimppi voi olla punainen tai sininen. Pläntti on joko soikea tai jotain muuta muotoa. Lötköt yksilöidään nollasta alkavan indeksiarvon avulla. Klimpit katsotaan keskenään vertailtaessa samoiksi, jos niiden värit ovat samat. Pläntit ovat samoja, jos ne ovat samanmuotoisia. Erilajiset lötköt ovat aina erilaisia. Kaikkia lötköjä voidaan vertailla keskenään niiden koon perusteella. Lötköt voivat liikkua alkulimassa paikasta toiseen. Paikat esitetään kaksiulotteisessa suorakulmaisessa koordinaatistossa. Lötköt majailevat aina koordinaatiston I-neljänneksessä, johon lasketaan tässä tehtävässä kuuluvaksi myös origo. Lötkön paikka (x, y) esitetään aina kokonaisluvuilla. Simulaation käyttäjä määrää koordinaattien suurimmat arvot x max ja y max, jolloin x [0, x max ] ja y [0, y max ]. Lötköjen elinalue on siten suorakulmion muotoinen osa alkulimaa. Jos valitaan x max = 5 ja y max = 3, lötköille sallittuja paikkoja ovat kuvassa 1 pisteellä esitetyt paikat. Yhdessä koordinaatiston paikassa (x, y) voi olla nolla, yksi tai useampia lötköjä. Lötköjen määrää tietyssä paikassa tai koko elinalueella ei ole rajoitettu. Kuva 1: Lötköille sallitut paikat, kun x- ja y-koordinaattien suurimmat arvot ovat 5 ja 3. Yksittäinen lötkö voidaan siirtää tiettyyn paikkaan ja kaikkia lötköjä voidaan käskeä liikkumaan satunnaisesti yhden paikan verran. Satunnaisessa liikkumisessa lötkö voi jäädä paikalleen tai siirtyä johonkin nykyisen paikan naapuripaikoista, mikäli paikka kuuluu elinalueeseen. Naapuripaikat ovat välittömästi nykyisen paikan (x, y) ympärillä olevat paikat (x, y + 1), (x + 1, y + 1), (x + 1, y), (x + 1, y - 1), (x, y - 1), (x - 1, y - 1), (x - 1, y) ja (x - 1, y + 1). Lötkön satunnaiset paikat tuotetaan apuluokan avulla (luku 4.5). Simulaatiossa voidaan listata kaikki alkuliman lötköt tai tietyssä paikassa sijaitsevat lötköt. Simulaattoria voidaan käskeä myös listaamaan indeksiarvolla valitun lötkön kanssa samanlaiset lötköt, joihin lasketaan myös valittu lötkö itse. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 1 / 17

Lötköt voivat lisääntyä, jos paikassa on sopivaa seuraa. Klimpit lisääntyvät suvullisesti. Paikassa olevista klimpeistä valitaan ensimmäinen samoiksi katsottavien klimppien pari. Tämä pari tuottaa yhden jälkeläisen. Jälkeläisen paino on vanhempien painojen keskiarvon kokonaisosa ja perimä koostuu ensimmäisen vanhemman neljästä ensimmäisestä ja toisen vanhemman neljästä viimeisestä perimämerkistä. Jälkeläisen väri eri kuin vanhempien väri. Jos vanhemmat ovat punaisia, niin jälkeläinen on sininen ja päinvastoin. Pläntit lisääntyvät suvuttomasti. Paikan suurin pläntti lisääntyy, jos paikassa ei ole jo samanlaista plänttiä. Lisääntyvä pläntti syväkopioi itsensä, jotta vanhempi ja jälkeläinen eivät jakaisi samaa perimää, puolittaa jälkeläisen painon siten, että jälkeläisen paino on osamäärän kokonaisosa, kun vanhemman paino jaetaan kahdella ja kääntää jälkeläisen perimän merkit. Lötköt on mahdollista säilöä tekstitiedostoon ja lukea siitä keskusmuistiin. Lötköt asetetaan lataamisen yhteydessä elinalueelta satunnaisesti valittuihin paikkoihin. Paikat tuotetaan apuluokkaa (luku 4.5) käyttäen. Apuluokan alustamiseen käytettävä siemenluku ([-99, 999]) ja elinalueen suurimmat x- ja y-koordinaattien arvot luetaan tiedostosta ja tallennetaan tiedostoon. Ohjelma loppuu käyttäjän antamalla komennolla. 1.2. Työn organisointi Harjoitustyö tehdään yhden hengen ryhmissä. Muiden kurssilaisten kanssa voi vaihtaa ideoita, mutta koodin kopiointi ei ole sallittua. Samoin esimerkiksi muualta kuin kurssin verkkosivulta löytyneen koodin kopiointi omaan ohjelmaan on kielletty. 1.3. Pakollisuus ja korvaavuudet Harjoitustyö on pakollinen. Ainoa poikkeus tähän sääntöön ovat harjoitustyön korvanneet opiskelijat. Harjoitustyön voi korvata A) muiden oppilaitosten opinnoilla, B) edellisellä Olio-ohjelmoinnin perusteet -kurssilla hyväksytyllä harjoitustyöllä tai C) edellisten kohtien tapaisella painavalla syyllä. Kohdan A perusteella on annettu kaikki pyydetyt korvaavuudet. Kohdan B perusteella annettavista harjoitustyökorvaavuuksista on tarkempia tietoja kurssin kotisivuilla. B-kohdan osalta on tärkeintä muistaa, että harjoitustyö korvautuu vain, jos ottaa yhteyttä kurssin vastuuopettajaan. Tähän mennessä tulleet yhteydenotot ja sopimukset on kirjattu ylös eikä uusia yhteydenottoja näiltä osin tarvita. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 2 / 17

2. Lötköjen säilöminen 2.1. Tietorakenne Ohjelman tietorakenteena käytetään luennoilla ja harjoituksissa käsitellystä LinkitettyLista-luokasta perittyä OmaLista-luokkaa (luku 4.3). Lötköt säilötään ohjelman rakenteesta riippuen joko yhdelle tai useammalle listalle. Harjoitustyö suositellaan ratkaistavaksi siten, että kaikki lötköt ovat yhdellä listalla. Ongelmallisin kohta tässä ratkaisussa on lötköjen lisääntyminen, jossa tarvitaan erilaisia apulistoja (luku 4.3). Eräs vaihtoehtoinen toteutus on liittää kuhunkin paikkaan erillinen lista, jossa on kyseisessä paikassa olevat lötköt. Tämä lähestymistapa on kuitenkin harjoitustyön määrittelyn puitteissa monimutkainen, koska useita listoja käytettäessä lötköt täytyy pitää jollain mekanismilla samassa järjestyksessä kuin malliratkaisussa, jossa käytetään yhtä listaa. Huomaa, että fi.uta.csjola.oope.lista-pakkauksen sisältöä ei saa muuttaa millään tavoin. Älä varsinkaan lisää lötköjen tietoja attribuuteiksi listan Solmu-luokkaan. Lötköjen on oltava solmujen tietoalkioina, jotta lista olisi edelleen yleiskäyttöinen. Lista-pakkaus on saatavilla kurssin kotisivujen Koodit-kohdasta. Javan API:n tietorakenteita (esimerkiksi ArrayList-luokka) saa käyttää vain pienissä avustavissa tehtävissä. Kysy neuvoa harjoitustyön ohjaajalta, mikäli olet epätietoinen tietorakenteiden käyttöön liittyvissä kysymyksissä. 2.2. Tekstitiedosto Harjoitustyössä tutustutaan laajemmin tiedostojen käsittelyyn. Tiedostojen avulla tietoja voidaan säilöä tietokoneen keskusmuistia pysyvämmin. Ohjelma ja sen tiedot ovat olemassa tietokoneen keskusmuistissa vain niin kauan kuin koneessa on virta päällä, mutta massamuistilaitteelle luoduissa tiedostoissa ohjelma ja tiedot ovat melko hyvässä tallessa seuraavaa käyttökertaa varten. Tiedoston sisältö jaetaan usein tietueiksi ja tietueet edelleen kentiksi. Kenttä sisältää yksittäisen tiedon, jonka esittämiseen käytetään yhtä tai useampaa merkkiä. Huomaa, että tiedostot ovat eri asia kuin tietokantajärjestelmä. Java tarjoaa valmiit toiminnot tiedostojen käsittelyyn, jolloin tiedostoja voidaan lukea ja kirjoittaa ilman erillistä ohjelmistoa. Tiedostot soveltuvat pienimuotoiseen ja nopeaan tietojenkäsittelyyn, kun taas tietokannat ovat omimmillaan suurten tietomäärien järjestelmällistä hallintaa vaativissa tehtävissä. Javan voi liittää myös tietokantaan. Tekstitiedostojen lukeminen ja tallentaminen on esitelty Lausekielinen ohjelmointi -kurssin luentomateriaalissa [1]. Aihetta käsiteltiin luennoilla nopeasti. Harjoitustyössä tarvittava tiedostojen käsittely onnistuu onneksi luentomateriaalin esimerkkejä suoraviivaisesti soveltamalla. Löydät tarvittaessa lisätietoja verkosta ja useimmista Java-kieltä käsittelevistä kirjoista. Esimerkiksi kurssikirjallisuuteen kuluvassa lähteessä [2] on annettu perusteellinen selvitys tiedostoista ja Javakielestä. Huomaa, että tuoreimmissa lähteissä tiedostoja käsitellään Javan uusimpien versioiden ( 1.5) mahdollistamin tavoin. Scanner-luokka on hyödyllinen myös tiedostonkäsittelyssä. (Katso neljännen viikkoharjoituksen kolmas tehtävä.) Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 3 / 17

Harjoitustyössä tiedostoon tallennetaan apuluokan siemenluku, lötköjen elinalueen rajat ja listan lötköjen tiedot. Tiedoston otsikkotietue koostuu kolmesta kentästä, joissa on siemenluku sekä x- ja y-koordinaattien maksimiarvot. Kukin lötkötietue sisältää omat kentät lötkön lajille, koolle, perimälle ja lajin omalle tiedolle. Lötköjen keskinäinen järjestys säilyy tiedostossa. Listan ensimmäisen lötkön tiedot muodostavat ensimmäisen lötkötietueen ja viimeisen lötkön tiedot tallentuvat viimeiseksi lötkötietueeksi. Lötkön tiedot tallennetaan lotkot.txt-nimiseen tiedostostoon. Tiedot esitetään siten, että yhdellä tiedoston rivillä on aina yksi tietue. Otsikkotietue on tiedoston ensimmäisellä rivillä. Tiedoston loput rivit sisältävät lötköjen tietueet. Otsikkotietueen kenttien arvot esitetään kokonaislukuina. Ohjelmassa näiden kenttien tiedot ovat int-tyyppisiä. Lötkötietueen kolme ensimmäistä kenttää ovat kaikille lötköille yhteisiä: 1. Lötkön laji. Tiedostossa jompikumpi merkkijonoista "Klimppi" tai "Plantti". Ohjelmassa lötköolion tyyppi. 2. Lötkön koko. Tiedostosta kokonaisluku, joka on ohjelmassa int-tyyppinen luku. 3. Lötkön perimä. Tiedostossa merkkijono, ohjelmassa StringBuildertyyppinen merkkijono. Lötkötietueen neljännen kentän sisältö riippuu lötkön lajista. Klimpin väri esitetään merkkijonona "P", jos kyseessä on punainen klimppi ja merkkijonona "S", jos klimppi on sininen. Väritieto esitetään ohjelmassa merkkityyppinä (char). Tieto siitä onko pläntti soikea vai ei on tiedostossa joko merkkijono "true" tai "false". Ohjelmassa tieto on boolean-tyyppinen. Arvo on tosi ("true" tai true), jos pläntin muoto on soikea. Kukin kenttä on kahdeksan merkin mittainen. Kentän arvo tallentuu kentän vasempaan reunaan ja kentän käyttämättä jäävä osuus täytetään arvon perään lisättävillä välilyönneillä. Jos lötkön laji on esimerkiksi "Klimppi", on lajin kentässä merkkijono "Klimppi ", jossa merkkijonon loppuun lisätty välilyönti tekee kentästä määrämittaisen. Kentät erotetaan toisistaan ja rivi päätetään yhdellä putkimerkillä (' '). Kuvassa 2 on esitetty tiedosto, jossa on otsikkotietojen lisäksi kolmen lötkön tiedot. Ensimmäisellä rivillä (tietueessa) määritellään, että siemenluku on 42 (ensimmäinen kenttä), suurin sallittu x-koordinaatti on 5 (toinen kenttä) ja suurin sallittu y-koordinaatti on 3 (kolmas kenttä). Toisella rivillä on klimppi, jonka koko on 10, perimä on "AAAAAAAA" ja jonka värin on punainen ('P'). Kolmannen rivin klimpin koko, perimä ja väri ovat 20, "BBBBBBBB" ja punainen ('P'). Viimeisellä rivillä on pläntti. Sen koko on 100 ja perimä "ABCDEFGH". Tämä pläntti ei ole soikea (false). 42 5 3 Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P Plantti 100 ABCDEFGH false Kuva 2: Tiedoston lotkot.txt sisältö. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 4 / 17

Testeissä käytettävien tiedostojen sisällön oletetaan olevan aina kunnossa. Tietoja on oikea määrä, ne ovat oikeassa järjestyksessä, oikean tyyppisiä ja arvoiltaan laillisia. Tiedostossa on aina otsikkotietue ja vähintään yksi lötkötietue. Kurssin kotisivuilla julkaistaan lisää esimerkkitiedostoja. Vinkki: Tietuerivin pilkkominen kentiksi onnistuu String-luokan split-metodilla [1]. Kentät voidaan muuttaa kokonaisluvuiksi ja totuusarvoiksi kääreluokkien metodeilla. Esimerkiksi koko saadaan int-tyyppiseksi arvoksi Integer-luokan parseint-metodilla. 3. Ohjelman toiminnot Ohjelmassa on oltava toiminnot, jotka mahdollistavat lötköjen lataamisen tiedostosta listalle, tietojen listaamisen (kaikki lötköt, samanlaiset lötköt tai tietty lötkö), lötköjen satunnaisen liikkumisen elinalueellaan, lötkön siirron tiettyyn paikkaan elinalueella, lötköjen lisääntymisen, lötköjen tallentamisen listalta tiedostoon ja ohjelman lopettamisen. Seuraavassa esitellään ohjelman toiminnallisuutta pienten esimerkkien avulla. Laajempia esimerkkiajoja julkaistaan kurssin kotisivujen Harjoitustyö-kohdassa. 3.1. Ohjelman käynnistäminen Ohjelman on käynnistyttävä komennolla: java Oope2015HT Näin ollen ohjelman pääluokan (sisältää main-metodin) on oltava aina nimeltään Oope2015HT ja pääluokan lähdekoodin on oltava Oope2015HT.java-tiedostossa. Ohjelma lataa käynnistymisen yhteydessä tiedot tiedostosta keskusmuistiin aivan kuin ohjelmalle olisi annettu latauskomento (luku 3.3). 3.2. Käyttöliittymä Ohjelmalla on yksinkertainen tekstipohjainen käyttöliittymä. Ohjelman käynnistyessä tulostetaan kuvassa 3 esitetyllä tavalla kehystetty teksti sekä omalle rivilleen teksti "". Kehystämisessä käytetään reunamerkkinä asteriskia ('*') ja tekstin rivillä tekstin ja reunamerkin väliin tulostetaan yksi välilyönti. Tämän jälkeen jäädään odottamaan käyttäjän syötettä. ************ * ALKULIMA * ************ Kuva 3: Ohjelma käynnistyksen jälkeen. Ohjelmaa käytetään kirjoittamalla halutun toiminnon käynnistävä komento ja painamalla Enter-näppäintä. Komento ja sen mahdolliset parametrit erotetaan toisistaan yhdellä välilyönnillä. Kaikkien muiden kuin lopetuskomennon jälkeen Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 5 / 17

pyydetään uusi komento (tulostetaan "" ja odotetaan syötettä omalla rivillä). Ohjelma toimii siis hieman komentoikkunan tapaan. Kaikkien tulosteiden muoto on kiinnitetty, jotta ohjelmien automaattinen, tulosteiden vertailuun perustuva tarkistus olisi mahdollista (luku 7). Tarkistusta automatisoimalla pyritään siihen, että kurssin opettajille jää enemmän aikaa työn rakenteen ja ohjelmointitavan arviointiin. Ohjelma vastaa virheelliseen komentoon tulostamalla omalle rivilleen "Virhe!" ja pyytämällä uutta syötettä. Virheeksi katsotaan tuntematon komento. Tunnettu komento on virheellinen, jos sen parametrit ovat virheelliset. Parametreja voi olla väärä määrä, niiden tyyppi voi olla virheellinen tai niiden arvot voivat olla sallitun arvoalueen ulkopuolella. Komennot pitää lukea In-apuluokan avulla, jotta ohjelmien tehtävänannon mukainen käyttäytymisen olisi todennäköisempää. Harjoitustyössä käytetään apulaiset-nimiseen pakkaukseen sijoitettua versiota In-luokasta. Tämän pakkaus sisältää myös paikkoja tuottavan apuluokka (luku 4.5) ja on saatavilla kurssin kotisivujen Opetus Harjoitustyö -kohdan kautta. 3.3. Tietojen lukeminen tiedostosta Komento "lataa" lukee lotkot.txt-nimiseen tekstitiedostoon tallennetut otsikko- ja lötkötiedot. Siemenluvun avulla alustetaan apuluokka (luku 4.5), joka antaa lötköille satunnaiset paikat elinalueella. Koordinaattien maksimiarvoja tarvitaan paikkojen arvonnassa ja myöhemmin esimerkiksi yksittäisen lötkön liikuttelun yhteydessä. Komennolla ei ole parametreja. Listat täytetään aina siten, että lötköt ovat listallaan samassa järjestyksessä kuin tiedostossa. Tiedoston ensimmäinen lötkö on listan ensimmäisessä paikassa ja tiedoston viimeinen lötkö on listan viimeisessä paikassa. Lataus poistaa listalla mahdollisesti olevat aikaisemmat tiedot. Kuvassa 4 luetaan kuvassa 2 esitetyn tiedoston sisältämät tiedot keskusmuistiin. Kun apuluokka alustetaan siemenluvulla 42 ja x- ja y-koordinaattien arvot rajoitetaan väleille [0, 5] ja [0, 3], antaa apuluokka ensimmäiselle, toiselle ja kolmannelle lötkölle vastaavat (2, 0), (0, 0) ja (0, 3). Latauskomento toistettaessa apuluokka alustetaan uudelleen, jotta lötköille saadaan samat lähtöpaikat kuin edellisellä latauskerralla. Listalla olevia tietoja voidaan tulostaa näytölle antamalla "listaa"-komento. Tällä komennolla on nolla, yksi tai kaksi parametria. Komento tulostaa lötköt listansa järjestyksessä. Ensimmäinen tulostettava rivi sisältää tiedoston ensimmäisen rivin tapaan siemenluvun sekä x- ja y -koordinaattien suurimmat arvot omissa putlataa Kuva 4: Otsikko- ja lötkötietojen lukeminen tiedostosta. 3.4. Tietojen tulostaminen näytölle Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 6 / 17

ki+merkin (' ') erottamissa kentissään. Ainoa ero näytölle tulostettaessa on se, että kentät ovat kolmen merkin mittaisia. Kenttien loppu täytetään välilyönneillä tietokenttien tapaan (luku 2.2). Listalla oleva lötkö tulostetaan omalle rivilleen siten, että ensin tulostetaan listan paikan indeksiarvo, toiseksi putkimerkki (' '), kolmanneksi lötkön x-koordinaatti, neljänneksi putkimerkki, viidenneksi lötkön y-koordinaatti, kuudenneksi putkimerkki ja seitsemänneksi lötkö täsmälleen samassa muodossa kuin sen tiedot esitetään tiedostossa (luku 2.2). Indeksiarvo ja koordinaattiarvot tulostetaan otsikkotietojen tapaan kolmen merkin mittaisiin kenttiin. Listauskomennon parametriton versio tulostaa näytölle listan kaikki alkiot. Kuvassa 5 on listattu edellisessä luvussa ladatut tiedot. 42 5 3 0 2 0 Klimppi 10 AAAAAAAA P 1 0 0 Klimppi 20 BBBBBBBB P 2 0 3 Plantti 100 ABCDEFGH false Kuva 5: Kaikkien lötköjen tietojen tulostaminen näytölle. Ensimmäiseltä rivillä nähdään käytössä olevan siemenluku 42 ja koordinaattien maksimiarvot olevan x-akselilla 5 ja y-akselilla 3. Lopuilla riveillä annetaan lötköjen tiedot samassa järjestyksessä kuin tiedostossa. Esimerkiksi listan toisen lötkön rivi kertoo, että klimpin listaindeksi on yksi ja paikka origo (0, 0). Klimpin paino on 20, perimä "BBBBBBBB" ja väri punainen. Listauskomennon yksiparametrinen versio tulostaa indeksiarvolla yksilöidyn lötkön kanssa samanlaiset lötköt. Listaukseen otetaan mukaan myös lötkö, jonka vastineita haetaan. Samanlaiset lötköt tulostetaan samassa järjestyksessä kuin ne ovat listalla. Kuvassa 6 haetaan vastineet kullekin listan lötkölle. Punaiset klimpit ovat keskenään samankaltaiset, kun listan ainoalle pläntille ei ole vastinetta. Virheellinen indeksiarvo aiheuttaa virheilmoituksen. listaa 0 0 2 0 Klimppi 10 AAAAAAAA P 1 0 0 Klimppi 20 BBBBBBBB P listaa 1 0 2 0 Klimppi 10 AAAAAAAA P 1 0 0 Klimppi 20 BBBBBBBB P listaa 2 2 0 3 Plantti 100 ABCDEFGH false listaa 3 Virhe! Kuva 6: Samanlaisten lötköjen tietojen tulostaminen näytölle. Kaksiparametrinen versio listaa annetussa paikassa olevat lötköt. Paikasta (0, 3) löytyy listan viimeinen lötkö, paikassa (1, 1) ei ole lötköjä ja paikka (6, 3) on elinalueen ulkopuolella (kuva 7). Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 7 / 17

listaa 0 3 2 0 3 Plantti 100 ABCDEFGH false listaa 1 1 listaa 6 3 Virhe! Kuva 7: Tietyssä paikassa olevien lötköjen tietojen tulostaminen näytölle. 3.5. Lötköjen liikuttaminen Lötköjä voidaan liikuttaa paikasta toiseen komennolla "liiku". Ilman parametria annettuna komento liikuttaa satunnaisesti listan kaikkia lötköjä siten, että lötkö jää nykyiseen paikkaansa tai siirtyy johonkin nykyisen paikan naapureista. Naapuriin siirrytään vain, jos se on elinalueella. Uudet paikat tuotetaan apuluokan (luku 4.5) avulla. Apuluokka antaa aina elinalueeseen kuuluvia paikkoja. Komennon kolmiparametrinen versio siirtää indeksiarvolla yksilöidyn lötkön annettuun paikkaan, jos paikka kuuluu elinalueeseen. Lötköjen liikkuessa niiden keskinäinen järjestys säilyy. Kuvassa 8 lötköjä käsketään ensin vaeltamaan elinalueellaan satunnaisella tavalla. Lötköt siirtyvät nykyistä paikoistaan (2, 0), (0, 0) ja (0, 3) apuluokan määräämiin paikkoihin (3, 1), (0, 1) ja (1, 3). Tämän jälkeen ensimmäinen lötkö siirretään toisen lötkön kaveriksi paikkaan (0, 1). Plänttiä ei saada liikkumaan elinalueen ulkopuolella olevaan paikkaan (5, 4). liiku listaa 42 5 3 0 3 1 Klimppi 10 AAAAAAAA P 1 0 1 Klimppi 20 BBBBBBBB P 2 1 3 Plantti 100 ABCDEFGH false liiku 0 0 1 liiku 2 5 4 Virhe! listaa 42 5 3 0 0 1 Klimppi 10 AAAAAAAA P 1 0 1 Klimppi 20 BBBBBBBB P 2 1 3 Plantti 100 ABCDEFGH false Kuva 8: Lötköjen liikuttelua yhdessä tai erikseen. 3.6. Uusien lötköjen luominen Komento "luo" tuottaa nolla, yksi tai useampia uusia lötköjä riippuen siitä millaisia lötköjä kussakin paikassa on. Paikkoja haetaan listan alusta sen loppuun päin. Uudet lötköt lisätään listan loppuun syntymisjärjestyksessään. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 8 / 17

Listasta löydetään ensin paikka (0, 1), jossa on samanlaisten klimppien pari. Pari luo samaan paikkaan uuden klimpin (kuva 9). Jälkeläisen paino on vanhempien painojen keskiarvo sellaisenaan (10 + 20) / 2 = 15, koska jako menee tasan. Perimäksi tulee parin ensimmäisen klimpin perimän alun "AAAA" ja parin toisen klimpin perimän lopun "BBBB" yhdiste. Väriksi valitaan sininen ('S'), koska vanhemmat ovat punaisia. Seuraavaksi löytyy paikka (1, 3), jonka pläntti muodostaa suoraan jälkeläisen, koska samankaltainen pläntti ei voi estää yksi paikassaan olevan pläntin lisääntymistä. Jako menee nytkin tasan ja uuden pläntin paino on siten suoraan osamäärä 100 / 2 = 50. Perimän merkit käännetään päinvastoin. Uusi klimppi on listan toiseksi viimeinen lötkö ja viimeisenä on uusi pläntti. luo listaa 42 5 3 0 0 1 Klimppi 10 AAAAAAAA P 1 0 1 Klimppi 20 BBBBBBBB P 2 1 3 Plantti 100 ABCDEFGH false 3 0 1 Klimppi 15 AAAABBBB S 4 1 3 Plantti 50 HGFEDCBA false Kuva 9: Uusien lötköjen luominen. 3.7. Tietojen tallentaminen tiedostoon Otsikkotiedot ja listan sisältö tallennetaan parametrittomalla "tallenna"- komennolla lotkot.txt-tiedostoon. Vanha tiedosto korvataan uudella ilman varmistuskyselyjä. Kuvassa 10 on annettu esimerkki tallentamisesta. tallenna Kuva 10: Tietojen tallentaminen tiedostoon. Tallennusmuoto on kuvattu luvussa 2.2. Lötköt tallennetaan tiedostoon listan määräämässä järjestyksessä. Kuva 11 esittää tiedoston sisällön tallennuskomennon jälkeen. 42 5 3 Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P Plantti 100 ABCDEFGH false Klimppi 15 AAAABBBB S Plantti 50 HGFEDCBA false Kuva 11: Tiedoston lotkot.txt uusi sisältö. 3.8. Ohjelman lopetus Ohjelmasta poistutaan parametrittomalla "lopeta"-komennolla (kuva 12). Komennon jälkeen tulostetaan lyhyet jäähyväiset ("Ohjelma lopetettu."-teksti). Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 9 / 17

lopeta Ohjelma lopetettu. Kuva 12: Ohjelman lopettaminen. 4. Koodista 4.1. Yleistä Ohjelma on jaettava kapseloituihin luokkiin, joiden sisältö puolestaan jaetaan järkevän mittaisiin metodeihin. Muistathan, että luokat rakennetaan tiedon ei toimintojen ympärille. Luokkametodeista koostuvat, esimerkiksi Math-luokan tapaiset apuluokat ovat poikkeus tähän sääntöön. Ohjelman toimintoja vastaavia luokkia (esimerkiksi Lataus ja Tallennus) ei saa tehdä, koska toiminnot eivät ole luokkia itsessään, vaan luokkien metodeja. Olio-ohjelmoinnissa vain keskeisimmät käsitteet mallinnetaan. Luokkia tarvitaan vain sen verran, että ohjelma saadaan toimimaan olioperustaisesti edellä määritellyllä tavalla. Toisaalta kullakin luokalla tulisi olla yksikäsitteinen vastuu. Luokkien lukumäärää ei saa pienentää antamalla luokalle useita sille kuulumattomia vastuita. Erityisesti käyttöliittymäluokan sisältöä on syytä pitää silmällä. Käyttöliittymä vastaa vain ihmisen ja koneen vuorovaikutuksesta ja näin ollen alkuliman ja lötköjen logiikasta vastaavaa koodi (varsinainen simulaatio) on kirjoitettava erilliseen luokkaansa. Samoin simulaatioluokan ja OmaLista-luokan vastuut on pidettävä selkeinä. OmaLista-luokan tehtävänä on säilöä tietoa ottamatta juuri kantaa tietojen sovellusalueeseen. Näin tässä luokassa tulee olla vain yleisiä sovellusalueesta riippumattomia metodeja. Esimerkiksi suurimman alkion hakeminen kuuluu OmaLista-luokkaan, kun taas uusien lötköjen luominen on simulaatioluokan vastuulla. Ohjelmassa olisi hyvä olla oma luokka paikalle, joka on harjoitustyössä keskeinen käsite. Noudata edelleen hyvää ohjelmointitapaa [3, 4]: Sisennä koodia johdonmukaisesti luettavuuden parantamiseksi. Kommentoi riittävästi ja oikeissa paikoissa (luku 5). Käytä vakioita. Pidä metodit järkevän mittaisia (metodin tulisi mahtua yhdelle A4-kokoiselle sivulle). Kirjoita attribuutteihin, metodeihin ja luokkiin yleisluonteiset kommentit (luku 5). Nimeä vakiot, muuttujat, attribuutit, metodit ja luokat järkevästi. Käytä attribuutteja harkiten [5]. Varaudu metodeissa virheellisiin parametrien arvoihin (erityisesti nullarvoinen viite), mikäli on todennäköistä, että metodille annetaan virheellisiä arvoja. Sijoita vain yksi luokka tai rajapinta yhteen lähdekooditiedostoon. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 10 / 17

Sisennä koodi välilyönnein. Älä käytä sisentämiseen tabulaattoria, jotta koodisi näkyisi samanlaisena myös ohjaajan editorissa. Välilyöntejä ja tabulaattorimerkkejä ei saa käyttää sekaisin, koska tällöin on varmaa etteivät sisennykset näy ajatellulla tavalla. 4.2. Lötköjen luokkahierarkia Periytyminen on harjoitustyössä keskeisessä asemassa. Periytymisessä samoja piirteitä sisältäville luokille tehdään yliluokka, jonne yhteiset piirteet siirretään. Harjoitustyötä ei saa toteuttaa siten, että kaikki lötköt esitetään yhtä luokkaa käyttäen. Ohjelmassa tulee olla abstrakti Lotko-luokka, jotta käytetään lötköjä mallintavan luokkahierarkian juuriluokkana sekä tästä luokasta perityt konkreettiset aliluokat Klimppi ja Plantti. Lotko-luokassa voi olla koon ja perimän lisäksi muita attribuutteja. Esimerkiksi lötkö ja sen paikka liittyvät sen verran kiinteästi yhteen, että lötköstä voi olla hyvin viite paikkaan tai päinvastoin. Huomaa kuitenkin, että luokkahierarkiassa ei saa olla attribuuttia luokan nimelle. Kirjoita juuriluokalle ja sen aliluokille parametrilliset rakentajat. Kutsu aliluokkien rakentajissa juuriluokan rakentajaa. Tee juurelle ja Plantti-luokalle kopiorakentaja, jolla syväkopioit pläntin sen lisääntymisen yhteydessä siten, että uudella plänttioliolla ja sen vanhemmalla on erilliset StringBuilder-tyyppiset osaoliot perimilleen. Lötkön merkkijonoesityksestä on paljon iloa. Korvaa siksi Object-luokan tostring-metodi Lotko-luokassa ja tämän luokan aliluokissa. Tee korvaus ketjuttaen : kutsu aliluokkien tostring-metodin korvauksissa Lotko-luokan versiota super-attribuutin avulla. Selvitä olion luokka Lotko-luokassa metaolion palveluiden avulla. Samojen lötköjen tunnistaminen (luvut 3.4 ja 3.6) toteutetaan Object-luokan equals-metodin avulla. Equals-metodin osalta riittää korvaus vain aliluokissa, koska lötköjen samanlaisuus päätellään pelkästään aliluokkien piirteiden avulla. Toteuta Comparable-rajapinnan compareto-metodi Lotko-luokassa siten, että metodissa vertaillaan lötköjä niiden koon perusteella. Käytä metodia paikan suurimman klimpin hakemiseen. Pohdi voisitko kirjoittaa Lotko-luokkaan abstraktit metodit sekä suvulliseen että suvuttomaan lisääntymiseen. Aliluokassa voi heittää UnsupportedOperationException-poikkeuksen, jos sen oliota käsketään lisääntymään tuntemattomalla tavalla. Esimerkiksi Klimppi-luokassa suvuttoman lisääntymisen metodi heittäisi heti sitä kutsuttaessa edellä mainitun poikkeuksen. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 11 / 17

4.3. OmaLista-luokka Säilö lötköt LinkitettyLista-luokasta perimääsi OmaLista-luokkaan. Huomaa, että LinkitettyLista-luokassa on suojatut lukuaksessorit paa- ja hanta-attribuuteille, jotta solmujen tehokkaampi käsittely on mahdollista myös aliluokassa. Kirjoita OmaLista-luokkaan ainakin yksi oma metodi. Muista, että lista-pakkauksen sisältöä (esimerkiksi Solmu-luokkaa) ei saa muuttaa. Lötköjen luomisessa tarvitaan todennäköisesti apulistoja, jos lötköt pidetään suositellulla tavalla yhdellä listalla. Apulistoilta asetetaan viitteitä lötkölistan lötköihin tai niiden paikkoihin. Esimerkiksi tietyssä paikassa oleviin lötköihin voidaan asettaa viitteet apulistalta. Samoin tietyssä paikassa oleviin klimppeihin ja pläntteihin voidaan myös asettaa viitteet apulistoilta. OmaLista-luokan metodit ovat hyödyllisiä erityisesti tällaisten apulistojen käsittelyssä varsinkin, jos paikka on mallinnettu omaan luokkaansa. Esimerkiksi uusien lötköjen luomista voisi valmistella apulistalla, jonka alkiot viittaavat lötköjen paikkoihin. Alla olevassa koodinpalasessa oletetaan, että paikka on lötkön osaolio ja että lötkö voi viitata paikkaansa lukuoperaation paikka avulla. // Asetetaan viitteet apulistalta lötköjen paikkoihin, jotta voi- // daan tunnistaa helpommin samassa paikassa olevat lötköt. OmaLista paikat = new OmaLista(); for (int i = 0; i < populaatio.koko(); i++) { // Yritetään selventää koodia apuviitteen avulla. Lotko lotko = (Lotko)populaatio.alkio(i); } // Lisätään lötkön paikka apulistalle. paikat.lisaaloppuun(lotko.paikka()); Koodin ajamisen jälkeen kuvan kahdeksan tilanteessa paikkaolioihin olisi viitteet sekä lötkölistalta että apulistalta (kuva 13). Paikat voitaisiin sitten käydä läpi apulistaa silmukoiden siten, että kunkin paikan käsittelyn jälkeen apulistalta poistetaan viitteet samoihin paikkoihin. Apuviitteiden lisääminen tai poisto ei vaikuta lötkölistaan millään tavalla. 10 20 100 "A...A" "B...B" "A...H" (0, 1) (0, 1) (1, 3) Kuva 13: Lötkölista ja sen apulista kaaviokuvana. Apulistan viitteet lötköjen paikkoihin on piirretty katkoviivoilla. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 12 / 17

Apulistoja voi käsitellä muun muassa metodilla, joka hakee listalta parametrina annetun alkion (Object) kanssa samat alkiot. Metodi palauttaa löydetyt alkiot esimerkiksi taulukossa tai toisessa OmaLista-tyyppisessä listassa. Metodin otsikko voisi olla seuraava: /** Hakee listalta equals-mielessä vastaavia alkioita. * * @param haettava listalta haettava alkio. * @return viitteet löydettyihin olioihin. Paluuarvo on null, * jos vastaavaa alkiota ei löydy, parametri on null-arvoinen * tai lista on tyhjä. */ public OmaLista hae(object haettava) Muita hyödyllisiä OmaLista-luokan metodeja ovat esimerkiksi suurimman alkion hakeminen (klimppien lisääntyminen) ja edellä mainittu samojen alkioiden poistaminen. Näitä metodeja on käsitelty kuudennen harjoituksen neljännessä ja viidennessä tehtävässä. 4.4. Koodin organisointi Main-metodin sisältävän ajoluokan tulee olla Oope2015HT.java-nimisessä lähdekooditiedostossa. Ajoluokassa ei saa olla pakkausmääreitä, jotta ohjelman automaattinen testaus WETO-järjestelmässä onnistuu. Ohjelman on käännyttävä suoraan ilman komentorivillä annettavia lisämääreitä komennolla javac Oope2015HT.java. Samoin ohjelman ajamisen on tapahduttava suoraan komennolla java Oope2015HT. Harjoitustyössä käytetään apulaiset-pakkaukseen sijoitettua In-luokkaa tietojen lukuun näppäimistöltä. Tähän pakkaukseen on liitetty myös Automaatti-luokka (luku 4.5), jota käytetään lötköjen paikkojen tuottamiseen latauksen (luku 3.3) ja liikkumisen (luku 3.5) yhteydessä. Apulaiset-pakkausta ja se luokkia ei saa muuttaa millään tavalla. Apulaiset-pakkauksen tulee olla ohjelman ajoluokan sisältävän hakemiston alihakemistona. Löydät apulaiset-pakkauksen kurssisivujen Opetus Harjoitustyö -kohdasta. Tee lötköjen luokkahierarkialle (Lotko-, Klimppi ja Plantti-luokat) oma pakkaus. Myös tämä pakkaus on ajoluokan sisältävän hakemiston alihakemisto. Voit tehdä halutessasi lisää pakkauksia. Nämäkin pakkaukset ovat ajoluokan hakemiston alihakemistoja. Käytä mahdollisimman vähän File-luokan palveluja, koska WETO-järjestelmän tietoturvamääritykset on säädetty tiukoiksi. WETO ei esimerkiksi hyväksy deletemetodia käyttävää koodia. 4.5. Automaatti-luokka Apulaiset-pakkaus (luku 4.4.) sisältää Automaatti-luokan, jota käytetään lötköjen paikkojen tuottamiseen. Luokalla on kolme julkista luokkametodia (luokan toinen kohta): Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 13 / 17

Alusta-metodi on tarkoitettu satunnaislukugeneraattorin alustamiseen. Anna tiedostosta luettu siemenluku metodin parametriksi latauksen (luku 3.3) yhteydessä ennen Automaatti-luokan muiden metodien kutsumista. AnnaPaikka-metodin kaksiparametrista versiota käytetään latauksessa (luku 3.3) arpomaan lötköille paikkoja kaikkialta niiden elinalueelta. Metodille annetaan parametreina tiedostosta luetut x- ja y-koordinaattien maksimiarvot. Metodin neliparametrinen versio on tarkoitettu kutsuttavaksi lötköjen satunnaisen liikuttelun (luku 3.5) yhteydessä. Tämä metodi saa parametrinaan lötkön nykyisen paikan ja x- ja y-arvojen ylärajat ja palauttaa joko jonkin elinalueeseen kuluvista naapuripaikoista tai lötkön nykyisen paikan. Molemmat versiot tuottavat poikkeuksen, jos satunnaislukugeneraattoria ei ole alustettu alusta-metodia kutsumalla. Metodeihin voi on syytä tutustua tarkemmin lukemalla metodien otsikot ja metodien yleiset kommentit. Molemmat metodit ovat static-määreellä esiteltyjä luokkametodeja, joita kutsutaan In- ja Math-luokkien metodien tapaan luokan nimen kautta. Esimerkiksi alusta-metodin kutsu voisi olla: Automaatti.alusta(siemenluku); Yllä siemenluku on tiedostosta luetun siemenluvun sisältävä muuttuja. Älä käytä muita menetelmiä paikkojen tuottamisen, jotta ohjelmasi toimii varmasti samalla tavoin kuin malliratkaisu. Älä muuta Automaatti-luokkaa millään tavalla. Älä kopioi luokan metodeja ohjelmaasi. 5. Dokumentointi Harjoitustyöstä kirjoitetaan dokumentti, jonka tulee sisältää seuraavat asiat: 1. Kansilehdellä tekijän nimi, opiskelijanumero ja sähköpostiosoite. Sivun keskellä tulisi olla suuremmalla fontilla dokumentin nimi. Kurssin kotisivuilla on annettu esimerkinomainen kansilehti. 2. Luokkakaavio ja sen lyhyt sanallinen kuvaus. 3. Omia ajatuksia. Esimerkiksi: Oliko työ helppo, sopiva tai vaikea? Miksi koit työn helpoksi, sopivaksi tai vaikeaksi? Mitä uutta opit? Oliko työstä mitään hyötyä tekijälleen? Paljonko aikaa käytit työhön? Dokumentin leipäteksti kirjoitetaan 12 pisteen fontilla ja yhdellä rivinvälillä. Valmiin tekstin lukeminen pariin otteeseen ei ole huonompi idea. Dokumentin kirjoitus tekstinkäsittelyohjelmalla sekä ohjelmasta löytyvän oikolukutoiminnon käyttäminen tekstin tarkistamiseen on myös suotavaa. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 14 / 17

Luokkakaavio piirretään UML-notaatiota käyttäen. Ohjelmaa ei tarvitse suunnitella UML:ia käyttäen. Riittää, että toteutettu ohjelma mallinnetaan UML:lla. Kussakin luokkasymbolissa esitetään luokan kaikki attribuutit ja julkiset metodit. Jos kaavion piirtoon käytetty työväline ei osaa piilottaa metodeja, niin kätketyt (private) metodit voi jättää näkyviin. Luokkakaaviossa esiintyvien luokkien väliset suhteet mallinnetaan luokkien välisinä suhteina. Piirrä periytymis- ja toteuttamissuhteiden lisäksi näkyviin luokkien väliset assosiaatiot. Jos jossakin itse kirjoitetussa luokassa A on attribuutti, jonka tyyppi on toinen oma luokka B, niin tätä attribuuttia ei esitetä luokan A laatikossa, vaan A- ja B- luokkien laatikoiden välisenä assosiaatioviivana. Anna kaikille assosiaatioille nimet, suunta sekä rooli ja kertautumiset. Piirrä luokkakaavioon myös luokkien väliset riippuvuussuhteet. Riippuvuussuhde on assosiaatiota heikompi suhde luokkien ilmentymien välisen hetkellisen yhteistyön ilmaisemiseen. Jos oma luokka C hyödyntää toisen oman luokan D palveluja ilman attribuuttia, niin luokkalaatikoiden välille voi piirtää nuolen (varsi katkoviivaa) luokasta C luokkaan D riippuvuussuhteen merkiksi. Vahvahermoiset kurssilaiset saavat Office- ja OpenOffice-ohjelmistoilla aikaiseksi siedettävän näköisiä luokkakaavioita. Kaavioiden tuotto on kuitenkin helpompaa erityisesti UML-kaavioiden piirtoon tehtyjä ohjelmistoja käyttäen. Dia (https://wiki.gnome.org/apps/dia) on ilmainen ohjelma, jolla voi piirtää vuo- ja ER-kaavioiden lisäksi myös UML-kaavioita. Jotkin ohjelmat osaavat muodostaa osan luokkakaaviosta automaattisesti lähdekoodin perusteella. Tällainen on UMLet-ohjelma, josta on kerrottu lisää kurssisivujen Opetus Harjoitustyö UML -kohdassa. Eclipse-kehitysympäristöön (http://www.eclipse.org/downloads/) on saatavilla takaisinmallinnuksen hallitsevia lisäosia. Koodi dokumentoidaan kirjoittamalla lyhyet yleisluonteiset Javadoc-kommentit jokaiselle attribuutille, metodille ja luokalle. Javadoc on Java-ympäristön tarjoama menetelmä koodin puoliautomaattiseen dokumentoimiseen. Javadockommentoinnista on annettu erilliset ohjeet kurssin verkkosivujen Opetus Harjoitustyö Javadoc -kohdassa. Huomaa, että rakentajia ja aksessoreita ei tarvitse kommentoida, mikäli ne ovat toiminnoiltaan tavanomaisia. Muista edelleen selittää metodien sisällä normaaliin tapaan metodien keskeiset ja vaikeaselkoiset osuudet tavanomaisia kommentteja käyttäen. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 15 / 17

6. Ohjaus Harjoitustyön pääasiallinen ohjaaja on mikroharjoitusryhmäsi vetäjä. Näet ryhmäsi WETO-järjestelmän Students-välilehdeltä. Kysy neuvoa sopivimmaksi katsomaltasi opettajalta, jos et ole valinnut ryhmää tai et ole käynyt alun perin valitsemassasi ryhmässä. Opettajat ovat tavattavissa kurssin kotisivuilla myöhemmin ilmoitettavina aikoina. Vastuuopettajaa voi käydä tapaamassa myös muina aikoina. Tapaamisaika kannattaa sopia etukäteen, jos haluaa varmistaa, että vastuuopettaja on paikalla huoneessaan. Pienemmät kysymykset kannattaa esittää ohjaajille sähköpostitse. Kysymyksiä ja niihin annettuja vastauksia kerätään kurssin verkkosivujen Harjoitustyö-kohtaan. Ennen kysymistä kannattaa siis tarkistaa kurssin verkkosivut vastaus voi hyvinkin olla jo sivuilla. Monet ongelmat selviävät myös tehtävänantoa lukemalla ja tutustumalla verkkosivuilta löytyviin esimerkkiajoihin. Yliopiston matematiikan, tilastotieteen ja tietojenkäsittelytieteiden opiskelijoiden ainejärjestö Luuppi järjestää omaa ohjaustaan koodipajan muodossa. Koodipajassa voi käydä, vaikka ei ole Luupin jäsen tai opiskelee jossakin muussa tutkintoohjelmassa. Kysyminen kannattaa erityisesti, kun on epävarma suuremman mittakaavan kysymyksissä. On pienempi vaiva selvittää epäselvä kohta ajoissa ohjaajan kanssa, kuin korjata valmista ohjelmaa jälkikäteen tehtävänantoa vastaavaksi. 7. Palautus ja tarkistus Ohjelma ja dokumentti täytyy palauttaa viimeistään torstaina 26.3.2015 klo 12.00 WETO-järjestelmään. Tarkemmat palautusohjeet julkaistaan myöhemmin kurssin verkkosivuilla. WETO-järjestelmä tarkistaa harjoitustöiden toiminnallisuuden vertailemalla automaattisesti mallivastauksen ja opiskelijoiden ratkaisujen tulosteita. Tästä syystä edellä annettuja tulostemäärittelyjä on seurattava merkilleen. Automaattinen vertailu vähentää rutiininomaista testaustyötä, jolloin opettajille jää enemmän aikaa mielekkäämpään työhön eli ohjelman rakenteen ja tyylin tutkimiseen. Opiskelijat hyötyvät tästä perusteellisempien kommenttien muodossa. Lisäaikaa työn tekoon voi saada muutaman päivän hyvästä syystä. Lisäajasta on sovittava ohjaajan kanssa ajoissa eli viimeistään päivää tai paria ennen palautuksen takarajaa. Lisäaikana harjoitustyön ohjaaja ei välttämättä ole tavattavissa henkilökohtaisesti. Ennen palautusta on syytä varmistaa, että dokumentissa on mukana kaikki edellä mainitut kohdat. Lisäksi kannattaa tarkistaa, että ohjelma toimii varmasti oikein viimeisimpien muutostenkin jälkeen. Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 16 / 17

8. Arvostelu Arvostelu perustuu ensisijaisesti ohjelman oikeellisuuteen: ohjelman on toimittava testeissä tehtävänannossa määritellyllä tavalla. Harjoitustyö voidaan joko hylätä tai hyväksyä, jolloin työ arvostellaan asteikolla 0 4 pistettä. Pisteet lisätään harjoitushyvityspisteiden tapaan tenttipisteisiin vain, mikäli tentistä on saanut vähintään vaaditut 12 pistettä. Maksimipisteet eli 4 pistettä voi saada vain, mikäli työ on palautettu ilman lisäaikaa. Tämän vaatimuksen osalta voidaan joustaa äärimmäisen hyvästä syystä, jollaisia ovat esimerkiksi pitkä ulkomaan matka tai kokopäivätöiden aiheuttamat ylitsepääsemättömät esteet. Ilman edellä mainittua todella hyvää syytä lisäajalle menneestä työstä voi saada korkeintaan 2 pistettä. Molemmissa tapauksissa täydet pisteet (4 tai 2 pistettä) saa vain, jos ohjelma toimii oikein sekä julkisissa että salaisissa testeissä. Huomaa, että salaisissa testeissä käytetään eri syötteitä kuin kotisivuilla annetuissa esimerkeissä. Ohjelman oikeellinen toiminta esimerkkien osalta ei takaa vielä salaisten testien läpäisyä. Toisaalta salaisten testien läpäisystä ei ole mitään toivoa, jos ohjelma ei toimi oikein julkisten testien osalta. Siksi on erittäin toivottavaa, että kaikki testaavat ohjelmansa perusteellisesti. Hylkäyksen perusteena voi olla tehtävänannon noudattamatta jättäminen, ohjelman toimimattomuus, harjoitustyön teossa kiellettyjen Javan ominaisuuksien käyttö, huono dokumentti, hyvän ohjelmointitavan noudattamatta jättäminen ja/tai plagiointi. Plagiointiin liittyy sanktio, joka koskee molempia opiskelijoita. (Toiselta opiskelijalta tämän tietämättä kopioidun koodin käyttö johtaa kopioijan koko kurssisuorituksen hylkäämiseen.) Hylätyn työn voi palauttaa korjattuna kerran tai pari. Korjausaikaa on pääsääntöisesti viikko työn hylkäyksestä. Pisteytys perustuu aina ensimmäiseen palautukseen. Korjauskierroksen kautta ei voi korottaa pistemääräänsä. Lähteet 1. J. Laurikkala, Lausekielinen ohjelmointi -kurssin luentorunko, luku 26, http://www.uta.fi/sis/tie/laki/opetus/luennot.html (Luettu viimeksi 22.2.2015.) 2. H. Deitel ja P. Deitel, Java, How to Program, Prentice Hall. 3. J. Laurikkala, Lausekielinen ohjelmointi -kurssin luentorunko, luku 13, http://www.uta.fi/sis/tie/laki/opetus/luennot.html (Luettu viimeksi 22.2.2015.) 4. J. Laurikkala, Lausekielinen ohjelmointi -kurssin luentorunko, luku 24, http://www.uta.fi/sis/tie/laki/opetus/luennot.html (Luettu viimeksi 22.2.2015.) 5. J. Laurikkala, Olio-ohjelmoinnin perusteet -kurssin luentorunko, luku 4, http://www.uta.fi/sis/tie/oope/opetus/luennot.html (Luettu viimeksi 24.2.2015.) Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 17 / 17