Harjoitustyö. 1. Johdanto Tehtävä

Koko: px
Aloita esitys sivulta:

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

Transkriptio

1 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

2 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 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 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

3 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ä 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

4 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) 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

5 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 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) 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

6 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 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 Tietojen tulostaminen näytölle Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 6 / 17

7 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 Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P 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 Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P listaa Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P listaa 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

8 listaa Plantti 100 ABCDEFGH false listaa 1 1 listaa 6 3 Virhe! Kuva 7: Tietyssä paikassa olevien lötköjen tietojen tulostaminen näytölle 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 Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P Plantti 100 ABCDEFGH false liiku liiku Virhe! listaa Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P Plantti 100 ABCDEFGH false Kuva 8: Lötköjen liikuttelua yhdessä tai erikseen 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

9 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 ( ) / 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 Klimppi 10 AAAAAAAA P Klimppi 20 BBBBBBBB P Plantti 100 ABCDEFGH false Klimppi 15 AAAABBBB S Plantti 50 HGFEDCBA false Kuva 9: Uusien lötköjen luominen 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 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ö 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

10 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

11 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 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

12 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 "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

13 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. * haettava listalta haettava alkio. 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ä 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 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

14 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

15 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 ( 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 ( 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

16 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 klo 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

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, (Luettu viimeksi ) 2. H. Deitel ja P. Deitel, Java, How to Program, Prentice Hall. 3. J. Laurikkala, Lausekielinen ohjelmointi -kurssin luentorunko, luku 13, (Luettu viimeksi ) 4. J. Laurikkala, Lausekielinen ohjelmointi -kurssin luentorunko, luku 24, (Luettu viimeksi ) 5. J. Laurikkala, Olio-ohjelmoinnin perusteet -kurssin luentorunko, luku 4, (Luettu viimeksi ) Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala 17 / 17

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

Työ tehdään itsenäisesti yhden hengen ryhmissä. Ideoita voi vaihtaa koodia ei. Harjoitustyö 1 Harjoitustyö Tehtävä: ohjelmoi lötköjen kansoittamaa alkulimaa simuloiva olioperustainen ohjelma Java-kielellä. Lötköt säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti

Lisätiedot

Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. 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. Harjoitustyö 1 Harjoitustyö Tehtävä: ohjelmoi olioperustainen sokkeloseikkailu peli Javakielellä. Sokkelon sisältö säilötään linkitetyille listalle ja tekstitiedostoon. Työ tehdään itsenäisesti yhden hengen

Lisätiedot

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

Hakemistojen sisällöt säilötään linkitetyille listalle. Harjoitustyö 1 Harjoitustyö Tehtävä: ohjelmoi Java-kielellä komentoikkunaa (komentotulkkia, komentoriviä) simuloiva olioperustainen ohjelma. Hakemistojen sisällöt säilötään linkitetyille listalle. Työ

Lisätiedot

Toinen harjoitustyö. ASCII-grafiikkaa 2017

Toinen harjoitustyö. ASCII-grafiikkaa 2017 Toinen harjoitustyö ASCII-grafiikkaa 2017 Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt17-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin

Lisätiedot

Toinen harjoitustyö. ASCII-grafiikkaa

Toinen harjoitustyö. ASCII-grafiikkaa Toinen harjoitustyö ASCII-grafiikkaa Yleistä Tehtävä: tee Javalla ASCII-merkkeinä esitettyä grafiikkaa käsittelevä ASCIIArt-ohjelma omia operaatioita ja taulukoita käyttäen. Työ tehdään pääosin itse. Ideoita

Lisätiedot

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

Linkitetystä listasta perittyä omaa listaa käytetään muun muassa viestiin liittyvien vastausten säilömiseen. Harjoitustyö 1 Harjoitustyö Tehtävä: ohjelmoi Java-kielellä keskustelualuetta simuloiva olioperustainen ohjelma (Simple Oope Board, S.O.B). Linkitetystä listasta perittyä omaa listaa käytetään muun muassa

Lisätiedot

2. Merkkijono, osamerkkijono ja osamerkkijonon haku

2. Merkkijono, osamerkkijono ja osamerkkijonon haku . Johdanto Ensimmäisessä harjoitustyössä on tehtävänä toteuttaa Java-ohjelma, joka hakee merkkijonosta osamerkkijonon esiintymiä. Haku voidaan rajoittaa pelkästään merkkijonon alkuun tai sen loppuun. Harjoitustyö

Lisätiedot

Harjoitustyö Johdanto

Harjoitustyö Johdanto 1. Johdanto 1.1. Tehtävä Lausekielinen ohjelmointi II -kurssin ensimmäisessä harjoitustyössä on tehtävänä toteuttaa Java-ohjelma tekstirivin sovittamiseen tekstialueelle. Sovittaminen tapahtuu muodostamalla

Lisätiedot

Harjoitus 5 (viikko 48)

Harjoitus 5 (viikko 48) Moni tämän harjoituksen tehtävistä liittyy joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Harjoitustyö edistyy sitä paremmin, mitä enemmän tehtäviä ratkaiset. Mikäli tehtävissä on jotain

Lisätiedot

Harjoitus 6 (viikko 42)

Harjoitus 6 (viikko 42) Nämä ovat kurssin viimeiset harjoitukset. Hyväksytyistä ratkaisuista ja läsnäoloista kerättyjen pisteiden summan tulee olla vähintään 40 % ( pistettä) tehtävien ja läsnäolopisteiden kokonaislukumäärien

Lisätiedot

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö Yleistä Tehtävä: Tee Javalla LineBreaker-ohjelma tekstirivin sovittamiseen tekstialueelle riviä katkomalla. Lausekielinen ohjelmointi II -kurssin pakollinen

Lisätiedot

Harjoitustyö 1. 1. Johdanto. 2. Euroseteli

Harjoitustyö 1. 1. Johdanto. 2. Euroseteli Harjoitustyö. Johdanto.. Tehtävä Lausekielinen ohjelmointi (Laki) -kurssin ensimmäisessä harjoitustyössä on tehtävänä toteuttaa Java-kielellä ohjelma, joka tutkii euroseteleiden [, ] sarjanumeroja. Ohjelmalla

Lisätiedot

Harjoitustyö Johdanto

Harjoitustyö Johdanto 1. Johdanto 1.1. Tehtävä Lausekielinen ohjelmointi II -kurssin ensimmäisessä harjoitustyössä on tehtävänä toteuttaa Java-ohjelma, joka laskee merkkijonoa kuvaavia tunnuslukuja. Ohjelma esikäsittelee merkkijonon

Lisätiedot

14. Hyvä ohjelmointitapa 14.1

14. Hyvä ohjelmointitapa 14.1 14. Hyvä ohjelmointitapa 14.1 Yleistä Ohjelman elinkaari ei tyypillisesti pääty sen toteuttamiseen; ohjelmaa voidaan käyttää ja ylläpitää jopa vuosikymmeniä. Jotta koodin muuttaminen on mahdollista, sen

Lisätiedot

Harjoitus 5 (viikko 41)

Harjoitus 5 (viikko 41) Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja sisentää koodisi. Vältä liian pitkiä rivejä, käytä

Lisätiedot

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

Harjoitus 6. Käytä String-luokasta vain charat- ja length-operaatioita. Nämä ovat kurssin viimeiset harjoitukset. Hyväksytyistä ratkaisuista ja läsnäoloista kerättyjen pisteiden summan tulee olla vähintään 40 % ( pistettä) tehtävien ja läsnäolopisteiden kokonaislukumäärien

Lisätiedot

Harjoitustyö. 1. Johdanto Tehtävä

Harjoitustyö. 1. Johdanto Tehtävä 1. Johdanto 1.1. Tehtävä Muinaiset muukalaiset ovat jättäneet jälkeensä sokkelon, jossa on salaperäisiä esineitä ja vaarallisia robotteja. Toteuta Java-kielellä peli, jossa mönkijää ohjaavan pelaajan tehtävänä

Lisätiedot

13. Hyvä ohjelmointitapa (osa 1) 13.1

13. Hyvä ohjelmointitapa (osa 1) 13.1 13. Hyvä ohjelmointitapa (osa 1) 13.1 Yleistä Ohjelman elinkaari ei tyypillisesti pääty sen toteuttamiseen tarvitaan ylläpitoa. Jotta koodin muuttaminen on mahdollista, on sen oltava myös muidenkin kuin

Lisätiedot

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

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5 Kysy Karilta tai Kimmolta, jos tehtävissä on jotain epäselvää. Kerro WETOon liittyvät tekniset ongelmat suoraan Jormalle sähköpostitse (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida

Lisätiedot

Harjoitus 2 (viikko 45)

Harjoitus 2 (viikko 45) Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista lisätä static-määre operaatioidesi otsikoihin, jotta ohjelmasi kääntyvät. Muista noudattaa hyvän

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.

Lisätiedot

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö

Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö Lausekielinen ohjelmointi II Ensimmäinen harjoitustyö Yleistä Tehtävä: Tee Javalla StringStats-ohjelma, joka laskee esikäsittelemästään merkkijonosta joitakin tunnuslukuja. Lausekielinen ohjelmointi II

Lisätiedot

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

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla. Tentti Tentti Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla. Omia koneita ei saa käyttää. Sähköisessä tentissä on paperitentin tapaan osaamisen

Lisätiedot

Harjoitustyö Johdanto Tehtävä

Harjoitustyö Johdanto Tehtävä 1. Johdanto 1.1. Tehtävä Lausekielinen ohjelmointi II -kurssin toisena harjoitustyönä toteutetaan Javaohjelma ASCII-grafiikkana [1] esitettyjen kuvien käsittelyyn. Ohjelma lataa käynnistyessään kuvan tekstitiedostosta

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

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

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla. Tentti Tentti Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tehdään sähköisesti mikroluokan Windows-koneilla. Omia koneita ei saa käyttää. Sähköisessä tentissä on paperitentin tapaan osaamisen

Lisätiedot

Harjoitustyö Johdanto Tehtävä

Harjoitustyö Johdanto Tehtävä 1. Johdanto 1.1. Tehtävä Lausekielinen ohjelmointi II -kurssin toisena harjoitustyönä toteutetaan Java- ohjelma ASCII-grafiikkana [1] esitettyjen kuvien katseluun ja käsittelyyn. Ohjelma lataa käynnistyessään

Lisätiedot

Harjoitus 4 (viikko 47)

Harjoitus 4 (viikko 47) Kaikki tämän harjoituksen tehtävät liittyvät joko suoraan tai epäsuorasti kurssin toiseen harjoitustyöhön. Saa hyvän alun harjoitustyön tekoon, kun ratkaiset mahdollisimman monta tehtävää. Mikäli tehtävissä

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print

Lisätiedot

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

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet Kevät 2015. Olio-ohjelmoinnin perusteet (5 op) Tavoitteena Kurssiesite Olio-ohjelmoinnin perusteet Kevät 2015 Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, yliopistonlehtori. Luennot,

Lisätiedot

Harjoitus 6 (viikko 42)

Harjoitus 6 (viikko 42) Nämä ovat kurssin viimeiset harjoitukset. Hyväksytyistä ratkaisuista ja läsnäoloista kerättyjen pisteiden summan tulee olla vähintään 4 % (2 pistettä) tehtävien ja läsnäolopisteiden kokonaislukumäärien

Lisätiedot

Harjoitus 3 (viikko 39)

Harjoitus 3 (viikko 39) Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja sisentää koodisi. Vältä liian pitkiä rivejä. Ohjelmointitehtävien

Lisätiedot

Taulukot. Jukka Harju, Jukka Juslin 2006 1

Taulukot. Jukka Harju, Jukka Juslin 2006 1 Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

Lisätiedot

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

4. Luokan testaus ja käyttö olion kautta 4.1 4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään

Lisätiedot

Oliot viestivät metodeja kutsuen

Oliot viestivät metodeja kutsuen 6. Metodit 6.1 Sisällys Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit). Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen

Lisätiedot

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

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

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

Sisältö. 2. Taulukot. Yleistä. Yleistä Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä

Lisätiedot

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

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla Viimeksi muokattu 5. toukokuuta 2012 Maastotietokannan torrent-jakeluun sisältyy yli 5000 zip-arkistoa,

Lisätiedot

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

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä Sisällys 9. Periytyminen Javassa Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

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

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma. 2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä

Lisätiedot

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4 Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.

Lisätiedot

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

Kurssiesite Lausekielinen ohjelmointi II Syksy Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto Kurssiesite Lausekielinen ohjelmointi II Syksy 2016 Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, yliopistonlehtori. Luennot,

Lisätiedot

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

System.out.printf(%d / %d = %.2f%n, ekaluku, tokaluku, osamaara); Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja sisentää koodisi. Ohjelmointitehtävien osalta palautetaan

Lisätiedot

Harjoitus 5 (viikko 41)

Harjoitus 5 (viikko 41) Harjoitus 5 (viikko 4) Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja sisentää koodisi. Vältä liian

Lisätiedot

Harjoitustyö Johdanto Tehtävä

Harjoitustyö Johdanto Tehtävä 1. Johdanto 1.1. Tehtävä Lausekielinen ohjelmointi (Laki) -kurssin toisena harjoitustyönä ohjelmoidaan Java-kielellä 2048-pelin [1, 2] tekstipohjainen muunnelma. Pelissä on kenttä, jolla liikutellaan tiiliä

Lisätiedot

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

Sisältö. 22. Taulukot. Yleistä. Yleistä Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä

Lisätiedot

9. Periytyminen Javassa 9.1

9. Periytyminen Javassa 9.1 9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Metodien korvaaminen ja super-attribuutti. Attribuutin peittäminen periytymisen kautta. Rakentajat

Lisätiedot

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

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen Sisällys 6. Metodit Oliot viestivät metodeja kutsuen. Kuormittaminen. Luokkametodit (ja -attribuutit).. Metodien ja muun luokan sisällön järjestäminen. 6.1 6.2 Oliot viestivät metodeja kutsuen Oliot viestivät

Lisätiedot

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

dogs worlds_ugliest_dog.jpg

dogs worlds_ugliest_dog.jpg 1. Johdanto 1.1. Tehtävä Komentoikkuna [1, 2] on teksuaalinen käyttöliittymä, jonka kautta käyttöjärjestelmää ohjaillaan komentoja kirjoittamalla. Komentoikkuna tunnetaan myös muun muassa komentorivinä

Lisätiedot

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

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

5. HelloWorld-ohjelma 5.1

5. HelloWorld-ohjelma 5.1 5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2

Lisätiedot

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

Kurssiesite Olio-ohjelmoinnin perusteet Kevät Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto Kurssiesite Olio-ohjelmoinnin perusteet Kevät 2016 Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, yliopistonlehtori. Luennot,

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

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

System.out.printf(%d / %d = %.2f%n, ekaluku, tokaluku, osamaara); Kysy Karilta tai Kimmolta, jos tehtävissä on jotain epäselvää. Kerro WETOon liittyvät ongelmat suoraan Jormalle sähköpostitse (jorma.laurikkala@uta.fi). Muista nimetä muuttujat hyvin sekä kommentoida ja

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2011 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2011 1 / 39 Kertausta: tiedoston avaaminen Kun ohjelma haluaa lukea tai kirjoittaa tekstitiedostoon, on ohjelmalle

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

Lisätiedot

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

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

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

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi

Lisätiedot

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

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi. 11. Rajapinnat 11.1 Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen

Lisätiedot

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

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 6. Metodit 6.1 Sisällys Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2 Oliot viestivät metodeja kutsuen Olio-ohjelmoinnissa ohjelma

Lisätiedot

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2 / 2010 Välikoe / 26.3 Ohjelmointi 2 / 2010 Välikoe / 26.3 Välikoe / 26.3 Vastaa neljään (4) tehtävään ja halutessa bonustehtäviin B1 ja/tai B2, (tuovat lisäpisteitä). Bonustehtävät saa tehdä vaikkei olisi tehnyt siihen tehtävään

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

15. Ohjelmoinnin tekniikkaa 15.1 15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op) ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat

Lisätiedot

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

Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät 2018 Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät 2018 Jorma Laurikkala Tietojenkäsittelytieteet Luonnontieteiden tiedekunta Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, yliopistonlehtori.

Lisätiedot

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

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät Olio-ohjelmoinnin perusteet (eli Oope) Laajuus Kurssiesite Olio-ohjelmoinnin perusteet (TIEA2.1) Kevät 2018 Jorma Laurikkala Tietojenkäsittelytieteet Luonnontieteiden tiedekunta Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, yliopistonlehtori.

Lisätiedot

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

Sisällys. 11. Rajapinnat. Johdanto. Johdanto Sisällys 11. ajapinnat. bstrakti luokka vai rajapinta? ajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen avulla.

Lisätiedot

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014

Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.

Lisätiedot

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

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti: 1 (7) Tiedon lukeminen näppäimistöltä Scanner-luokan avulla Miten ohjelma saa käyttöönsä käyttäjän kirjoittamaa tekstiä? Järjestelmässä on olemassa ns. syöttöpuskuri näppäimistöä varten. Syöttöpuskuri

Lisätiedot

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

Vastuuopettaja. Kurssiesite Olio-ohjelmoinnin perusteet Kevät Olio-ohjelmoinnin perusteet (TIEA2.1) Kurssiesite Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala Tietojenkäsittelytieteet Luonnontieteiden tiedekunta Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, yliopistonlehtori. Luennot,

Lisätiedot

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

Kurssiesite Olio-ohjelmoinnin perusteet Kevät Jorma Laurikkala Tietojenkäsittelytieteet Luonnontieteiden tiedekunta Tampereen yliopisto Kurssiesite Olio-ohjelmoinnin perusteet Kevät 2017 Jorma Laurikkala Tietojenkäsittelytieteet Luonnontieteiden tiedekunta Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, yliopistonlehtori. Luennot,

Lisätiedot

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä

Lisätiedot

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys

Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Ohjelmistojen mallintamisen ja tietokantojen perusteiden yhteys Tällä kurssilla on tutustuttu ohjelmistojen mallintamiseen oliomenetelmiä ja UML:ää käyttäen Samaan aikaan järjestetyllä kurssilla on käsitelty

Lisätiedot

4. Olio-ohjelmoinista lyhyesti 4.1

4. Olio-ohjelmoinista lyhyesti 4.1 4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

2. Olio-ohjelmoinista lyhyesti 2.1

2. Olio-ohjelmoinista lyhyesti 2.1 2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin

Lisätiedot

14. Poikkeukset 14.1

14. Poikkeukset 14.1 14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo 15.2.2006 TURUN YLIOPISTO DEMO III Informaatioteknologian laitos tehtävät Olio-ohjelmoinnin perusteet / Salo 15.2.2006 1. Tässä tehtävässä tarkastellaan erääntyviä laskuja. Lasku muodostaa oman luokkansa. Laskussa

Lisätiedot

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Sisällys. 14. Poikkeukset. Johdanto. Johdanto Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.

Lisätiedot

Pakkauksen kokoaminen

Pakkauksen kokoaminen 13. Pakkaukset 13.1 Sisällys Pakkauksen kokoaminen package-määrettä käyttäen. Pakkaukset ja hakemistorakenne. Pakkauksen luokkien käyttö muissa pakkauksissa importlauseen avulla. Pakkaukset ja näkyvyys.

Lisätiedot

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

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ). Tehtävä 1: Metodit, listat, alkuluvut (4p) Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ). Alkuluvut ovat lukuja, jotka ovat suurempia kuin yksi ja jotka ovat jaollisia

Lisätiedot

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Harjoitus 7. 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: Harjoitus 7 1. Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti: class Lintu //Kentät private int _siivenpituus; protected double _aivojenkoko; private bool _osaakolentaa; //Ominaisuudet public int

Lisätiedot

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

// Tulostetaan double-tyyppiseen muuttujaan hinta tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf(%.1f euros. Lue kukin tehtävänanto huolellisesti ja kokonaisuudessaan ennen kuin aloitat vastaamisen. Kustakin tehtävästä voi saada 0 6 pistettä. Tentin läpipääsyraja on 12 / 24 pistettä. Ratkaisut palautetaan WETO-järjestelmään

Lisätiedot

Olio-ohjelmointi Javalla

Olio-ohjelmointi Javalla 1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 18.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 18.3.2009 1 / 51 Olioista (kertausta) Olioiden avulla voidaan kuvata useammasta arvosta koostuvaa kokonaisuutta

Lisätiedot

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

12. Näppäimistöltä lukeminen 12.1 12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 28.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 28.2.2011 1 / 46 Ohjelmointiprojektin vaiheet 1. Määrittely 2. Ohjelman suunnittelu (ohjelman rakenne ja ohjelman

Lisätiedot

Pakkauksen kokoaminen

Pakkauksen kokoaminen 13. Pakkaukset 13.1 Sisällys Pakkauksen kokoaminen (package). Pakkaukset ja hakemistorakenne. Pakkauksen luokkien käyttö muissa pakkauksissa (import). Pakkaukset ja näkyvyys. 13.2 Pakkauksen kokoaminen

Lisätiedot

16. Javan omat luokat 16.1

16. Javan omat luokat 16.1 16. Javan omat luokat 16.1 Sisällys Johdanto. Object-luokka: tostring-, equals-, clone- ja getclass-metodit. Comparable-rajapinta: compareto-metodi. Vector- ja ArrayList-luokat. 16.2 Javan omat luokat

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti Tentaattori: Antti-Jussi Lakanen 8. kesäkuuta 2018 Yleistä Tentti 1 meni pistekeskiarvon (11.2) perusteella välttävästi. Omasta tehtäväpaperista saa kopion

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 16.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 16.3.2009 1 / 40 Kertausta: tiedostosta lukeminen Aluksi käsiteltävä tiedosto pitää avata: tiedostomuuttuja = open("teksti.txt","r")

Lisätiedot

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

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille: Merkkijonot C-kielessä merkkijono on taulukko, jonka alkiot ovat char -tyyppiä. Taulukon viimeiseksi merkiksi tulee merkki '\0', joka ilmaisee merkkijonon loppumisen. Merkkijono määritellään kuten muutkin

Lisätiedot

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

Vastuuopettaja. Kurssiesite Lausekielinen ohjelmointi Syksy 2014. Tavoitteet ja keinot. Lausekielinen ohjelmointi (10 op) Kurssiesite Lausekielinen ohjelmointi Syksy 2014 Jorma Laurikkala Tietojenkäsittelytieteet Informaatiotieteiden yksikkö Tampereen yliopisto Vastuuopettaja Jorma Laurikkala, lehtori. Luennot, mikroharjoitukset,

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 7.2.2011 T-106.1208 Ohjelmoinnin perusteet Y 7.2.2011 1 / 39 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti

Lisätiedot

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

Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. Tentti kestää kolme tuntia. Tehdään sähköisesti mikroluokkien Windows-koneilla. Tentissä ratkaistaan neljä ohjelmointitehtävää Javalla. kestää kolme tuntia. Tule paikalle viimeistään noin 15 minuuttia ennen tentin alkua, koska tentti pyritään aloittamaan tasalta. Poistua voi aikaisintaan,

Lisätiedot

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

8. Näppäimistöltä lukeminen 8.1 8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)

Lisätiedot

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

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta. Tehtävä 63. Kirjoita oma versio funktiosta strcmp(),joka saa parametrinaan kaksi merkkiosoitinta. Tee ohjelma, jossa luetaan kaksi merkkijonoa, joita sitten verrataan ko. funktiolla. Tehtävä 64. Kirjoita

Lisätiedot

Tietotekniikan valintakoe

Tietotekniikan valintakoe Jyväskylän yliopisto Tietotekniikan laitos Tietotekniikan valintakoe 2..22 Vastaa kahteen seuraavista kolmesta tehtävästä. Kukin tehtävä arvostellaan kokonaislukuasteikolla - 25. Jos vastaat useampaan

Lisätiedot

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

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa(); Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio

Lisätiedot

Harjoitustyö. 1. Johdanto Tehtävä

Harjoitustyö. 1. Johdanto Tehtävä 1. Johdanto 1.1. Tehtävä Sähköisillä keskustelupalstoilla [1] vaihdetaan viestejä eri aiheisiin liittyen. Ensimmäiset palstat olivat uutisryhmiä ( nyyssit ) ja BBS-järjestelmien ( purkkien ) palstoja.

Lisätiedot