Helsingin yliopisto / Tietojenkäsittelytieteen laitos / Java-ohjelmointi / Copyright © 2004 Arto Wikla.

581325-0 Java-ohjelmointi, koe 14.12.2004/AW

Kirjoita jokaisen vastauspaperisi alkuun kurssin nimi ja kokeen päivämäärä sekä nimesi, henkilötunnuksesi ja allekirjoituksesi. Kirjoita jokainen vastaus omalle konseptiarkilleen!
Tässä kokeessa saa poikkeuksellisesti käyttää "lunttilappua". Sen koko saa olla enintään A4.

  1. Tarina muodostuu yhdestä tai useammasta String-tekstirivistä. Jokaisella tarinalla on yksikäsitteinen koodinumero, joka ei koskaan voi muuttua, eikä millään muulla tarinalla voi koskaan olla samaa koodia. Kerran luodun tarinan sisältöä ei myöskään voi muuttaa.

    1. Ohjelmoi tarinan toteutukseksi luokka Tarina, jossa kaikki tietorakenteet ovat luonnollisestikin private, ja jossa on julkiset välineet (konstruktori ja aksessorit):
      • public Tarina(String[] rivit) luo Tarina-olion ja sen yksikäsitteisen koodinumeron
      • public int mikäOnTarinanKoodi()
      • public int mikäOnTarinanPituus(), so. rivien lukumäärä
      • public String mikäOnTarinanRivi(int i) palauttaa arvonaan tarinan rivin, jonka numero on i
      • public void tulostaTarina() tulostaa koko tarinan rivinumeroilla varustettuna
      • public Tarina koosta(Tarina toinen) palauttaa arvonaan uuden Tarina-olion, jossa tarina muodostuu this-tarinasta, jonka perään on liitetty parametrina annettu toinen tarina.

    2. KommentoituTarina on kuin Tarina, mutta tavallisesta tarinasta poiketen kommentoidun tarinan mihin tahansa tekstiriviin voi liittyä tekstikommentti. Jokaiseen riviin ei toki tarvitse liittyä kommenttia. Eikä välttämättä yhteenkään! Toteuta KommentoituTarina luokan Tarina aliluokkana. Ohjelmoi uudelleen vain tarvittavat osat:
      • public KommentoituTarina(String[] rivit) luo KommentoituTarina-olion, jossa mitään riviä ei vielä ole kommentoitu
      • public void liitäKommentti(String kommentti, int rivi) liittää annetun kommentin tarinan annettuun riviin, mahdollinen vanha kommentti korvataan tällä uudella
      • public String mikäOnKommentti(int rivi) palauttaa arvonaan tarinan i:nnen rivin kommentin (tai arvon null, jos riviin ei liity kommenttia)
      • public void tulostaKommentit() tulostaa rivinumeroin kaikki ei-tyhjät kommentit, so. kommenttiluettelon
      • public KommentoituTarina koosta(KomentoituTarina toinen) palauttaa arvonaan uuden KommentoituTarina-olion, jossa tarina muodostuu this-tarinasta, jonka perään on liitetty parametrina annettu toinen tarina. Uusi kommentoitu tarina saa tietenkin myös vanhojen tarinoiden kommentit!

    Huom: Varaudu myös virheellisiin parametreihin ja täydennä tehtävien "API-kuvauksia" selostuksella toiminnasta virhetilanteessa. Riittää varautua vain virheellisiin rivinumeroihin. Tällä kertaa ei tarvitse varautua siihen, että parametritaulukot olisivat arvoltaan null.

                                                                (20 pistettä)
    
    
    

  2. "Miksi ihmeessä tavallisen ohjelmoijan tarvitsisi tietää mitään joistakin 'abstrakteista' luokista ja 'rajapintaluokista'", vaikeroi ystäväsi kuunnellessaan tarinoitasi Java-ohjelmointi -kurssilta. Ystäväsi ymmärtää hyvin yliluokan, aliluokan ja periytymisen ideat, mutta abstrakti luokka (abstract class) ja rajapintaluokka (interface) ovat ystävällesi tuntemattomia ja käsittämättömiä. Auta ystävääsi ymmärtämään, mitä nämä käsitteet tarkoittavat ja mihin näitä välineitä voi käyttää ohjelmoinnissa. Laadi asiasta kirjallinen selitys (maksimipituus on 1 konseptiarkki, siis 4 sivua). Esimerkit ovat välttämättömiä näiden asioiden oppimisessa! Vastauksen arvioinnissa otetaan huomioon selostuksen ajateltu lukija. Älä siis kirjoita tarkastajalle, joka jo tuntee asian, kirjoita tuolle ystävälle! Älä viittaa vastauksessasi muihin vastauksiin, koska kaikilla vastauksilla on eri tarkastaja.
                                                               (18 pistettä)
    

  3. Käytössäsi on tekstitiedostojen lukemiseen luokka Syottotiedosto. Luokalla on konstruktori Syottotiedosto(String nimi). Parametrina annetaan tiedoston nimi. Rivejä luetaan aksessorilla
      public String lueRivi()
    
    Kun tiedosto on loppunut, metodi palauttaa null-arvon.

    Sekä syöttötiedoston luonti että lukuoperaatio voivat aiheuttaa poikkeuksen Exception.

    Laadi keskusteleva eli interaktiivinen ohjelma KumpiTiedostoOnJouluisampi, joka kysyy ensin kaksi syöttötiedoston nimeä. Sitten ohjelma tutkii, kummassa tiedostossa on enemmän rivejä, joilla esiintyy yksi tai useampia seuraavista jouluaiheisista sanoista: "joulu", "kuusi", "pukki", "puuro".

    Lopuksi ohjelma tulostaa tiedon, kumpi syöttötiedostoista sisälsi enemmän yllä määritellyssä mielessä "jouluisampia" rivejä. Rivejä voi toki olla myös yhtä monta.

    Ohjelman KumpiTiedostoOnJouluisampi pitää itse käsitellä järkevällä ja käyttäjäystävällisellä tavalla syöttötiedostojen luomisen ja lukemisen mahdollisesti aiheuttamat Exception-poikkeukset.

                                                         (15 pistettä)
    
Onnea kokeeseen & Hauskaa Joulua!