Ohjelmointiharjoitus 4

Tässä harjoituksessa perehdytään syöttöön ja tulostukseen sekä merkkijonojen käsittelyyn. Keskeiset Java API:n luokat ovat java.lang.String sekä pakkauksen java.io luokat.

Tämän ohjelmointiharjoituksen maksimipistemäärä on 100 ja läpäisyraja on 50 pistettä.

Tiedostojen lataaminen

Kopioi ensin itsellesi tiedosto tehtava4.jar ja pura se:

lynx -source http://www.cs.hut.fi/u/lma/kevytOLO/Tehtavat/Harjoitukset/Harjoitus4/tehtava4.jar > tehtava4.jar
jar xvf tehtava4.jar

Tuloksena saat alihakemiston Tehtava4, jossa on tiedostot Example.java, Game.java, GameStoppedException.java, Named.java, Person.java, Player.java, Room.java, Thing.java ja input.txt.

Perehtyminen pääohjelman yleiseen rakenteeseen

Jos Java-pääohjelman rakenne ja pääohjelman argumenttien käsittely ei ole tuttua, kannattaa ennen harjoitustehtävien tekemistä tutustua tiedostoon Example.java. Luokka sisältää yksinkertaisen pääohjelman, joka tulostaa saamansa argumentit. Käännä ohjelma ja kokeile sitä esim. seuraavasti:

java Example
java Example hii haa hoo
java Example 1.0 plus 1.5 is 2.5

Osatehtävä 4.1 (max 20 pistettä)

Tee luokka CopyInputToOutput, jonka pääohjelma kopioi standard inputin standard outputiin muuttamatta sitä mitenkään.

Käännä ja testaa ohjelmasi. Voit käyttää syötteenä tiedostoa input.txt ja unixin komentoa diff seuraavasti:

java CopyInputToOutput < input.txt > output.txt
diff input.txt output.txt
rm output.txt

Komento diff tulostaa mahdolliset erot tiedostojen input.txt ja output.txt välillä. Mitään eroja ei pitäisi olla.

Osatehtävä 4.2 (max 20 pistettä)

Tehtävä on muuten sama kuin kohdassa 4.1, mutta nyt kopioidaankin tiedosto toiseksi tiedostoksi.

Tee luokka CopyFile, jonka pääohjelma saa kaksi argumenttia, jotka ovat tiedoston nimiä. Pääohjelma kopioi ensimmäisen argumentin nimeämän tiedoston toisen argumentin nimeämään tiedostoon.

Käännä ja testaa ohjelmasi.

java CopyFile input.txt output.txt
diff input.txt output.txt

Taaskaan mitään eroja ei pitäisi olla.

Osatehtävä 4.3 (max 20 pistettä)

Tee luokka Fgrep, jonka pääohjelma saa argumenttina merkkijonon x. Pääohjelma lukee standard inputin rivi kerrallaan ja tulostaa vain ne rivit, joilla argumenttina annettu merkkijono x esiintyy.

Käännä ja testaa ohjelmasi. Voit käyttää syötteenä tiedostoa input.txt ja unixin komentoa fgrep seuraavasti:

java Fgrep into < input.txt
fgrep into < input.txt

Komennon fgrep pitäisi tulostaa samat rivit kuin sinun ohjelmasi.

Osatehtävä 4.4 (max 20 pistettä)

Tee luokka WordCount, jonka pääohjelma lukee standard inputin ja tulostaa, kuinka monta riviä, merkkiä ja sanaa se sisältää. Sanoiksi lasketaan maksimaaliset merkkijonot, jotka eivät sisällä tyhjiä merkkejä (välilyönti, tabulaattori, rivinvaihto ym.). Luokan Character staattisella metodilla isWhitespace voi testata, onko merkki tyhjä.

Käännä ja testaa ohjelmasi. Voit käyttää syötteenä tiedostoa input.txt ja unixin komentoa wc seuraavasti:

java Wc < input.txt
wc < input.txt

Komennon wc pitäisi antaa samat luvut kuin sinun ohjelmasi.

Osatehtävä 4.5 (max 40 pistettä)

Tässä tehtävässä laaditaan yksinkertainen komentotulkki seikkailupeliin. Peli koostuu huoneista, esineistä ja henkilöistä. Huoneet voivat olla kytkettyjä toisiinsa. Kytkentään liittyy merkkijonona esitettävä suunta. Pelin pelaaja on henkilöluokan aliluokka.

Tiedostossa tehtava4.jar on peliin liittyvät valmiit Java-tiedostot:

sekä puolivalmiit tiedostot

Tehtävänäsi on kirjoittaa pelaajalle komentotulkki. Luokkaan Game sinun pitää täydentää pääohjelmametodi main, joka muodostaa uuden pelin ja suorittaa sen.

  1. Tutustu ensin luokan Player metodin action ja luokan Game metodin play toteutuksiin.
  2. Täydennä luokan Player metodi tokenize, joka paloittelee käyttäjän antaman syöterivin erillisiksi sanoiksi.
  3. Täydennä luokan Player metodi interpreter, joka tulkitsee käyttäjän antaman komennon. Interpreter tuntee seuraavat komennot: Mikäli komentotulkki ei ymmärrä komentoa, palauta arvo false, muuten arvo true.
  4. Täydennä luokan Game pääohjelmametodi main. Luo pääohjelmassa muutamia huoneita, esineitä ja henkilöitä. Luo myös pelaaja-olio. Muista lisätä huoneet ja henkilöt (myös pelaaja) Game-olioon. Pääohjelman lopussa kutsutaan metodia play, joka käynnistää pelaamisen.
  5. Käännä ja testaa ohjelmasi.

Harjoituksen palautus

Kirjoita jokaisen palauttamasi java-tiedoston alkuun nimesi ja opiskelijanumerosi lukuunottamatta tiedostoja, joita et ole muuttanut. Näin arvostelu on helpompaa, kun on aina selvää, kuka on koodin laatinut.

Harjoitukset palautetaan jar-apuohjelmalla luotuina paketteina. Seuraava Unix-komento luo jar-tiedoston harj4.jar Java-tiedostoista Luokka1.java ja Luokka2.java.

jar cf harj4.jar Luokka1.java Luokka2.java

Jar-tiedoston sisällön voi katsoa komennolla:

jar tf harj4.jar

VAROITUS. Muista ehdottomasti, että ensimmäinen tiedostonimi on se tiedosto, johon haluat paketin laatia, koska muuten jar-komento kirjoittaa paketin ensimmäisen antamasti tiedoston päälle. Siten komento

jar cf Luokka1.java Luokka2.java

TUHOAA tiedoston Luokka1.java.

Valmis jar-paketti, joka sisältää KAIKKI harjoituksessa käytettävät luokat (myös valmiit luokat) lähetetään sähköpostitse liitetiedostona oman ryhmän tutorille. Kaikkien eri osatehtävien luokat palautetaan samassa paketissa, eli lähetä vain yksi viesti.

Palautus on tehtävä viimeistään torstaina 22.11 klo 16.00. Huom. päivää pitempi palautusaika. Jos palautus myöhästyy, jokaisen myöhässä palautetun tehtävän arvosana laskee 5 pistettä / myöhästymispäivä.