Ohjelmointiharjoitus 3

Tässä harjoituksessa käsitellään taulukkoja. Lisäksi tutustutaan listoihin, poikkeusten käsittelyyn sekä rajapintoihin.

Tee itsellesi alihakemisto esim. Tehtava3 Unix-komennolla mkdir Tehtava3 ja sijoita kaikki tehtävässä käytetyt Java-tiedostot sinne.

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

Osatehtävä 3.1 (max 30 pistettä)

Tässä tehtävässä tutustutaan listarakenteeseen. Tavoitteena on ymmärtää ja kyetä selittämään valmiina annetun luokan List toimintaa.

  1. Kopioi itsellesi tiedosto List.java, joka sisältää listoja kuvaavan luokan List. Tutustu ohjelmakoodiin ja html-dokumentaatioon.
  2. Tutustu metodin List.insertElementLast.html toteutukseen. Toteutus on kuvattu havainnollisesti täällä.
  3. Selitä laatikko-nuoli -merkintää käyttäen luokan List metodin removeElement toiminta samaan tapaan kuin metodi insertElementLast selitettiin. Voit piirtää kuvat käsin ja palauttaa ne paperilla suoraan tutorille tai kirjekuoressa T-osaston 2. kerroksen B-käytävän alussa olevaan lokerikkoon M-kirjaimen kohdalle. Kuoren päälle nimi Lauri Malmi. Jos käytettävissäsi on skanneri, voit myös skannata kuvat ja palauttaa URL:n, josta kuva on haettavissa. Piirto-ohjelmaakin voi käyttää, mutta ratkaisun esittämiseen voi mennä silloin aivan turhan paljon aikaa.
  4. Kopioi itsellesi tiedosto ListExample.java, joka sisältää pääohjelmaluokan ListExample. Käännä ListExample.java sekä List.java ja suorita ohjelma.
  5. Käyttäen laatikko-nuoli -merkintää selitä askel-askelelta pääohjelman toiminta sekä metodin insertElementLast toiminta kutsussa
    example.insertElementLast(sanat[4]);
    ja metodin removeElement toiminta kutsussa
    example.removeElement(sanat[2]);
    Palautus samalla tavalla kuin edellä.

Osatehtävä 3.2 (max 30 pistettä)

Tässä tehtävässä harjoitellaan taulukkojen käsittelyä. Tarkoituksena on toteuttaa luokka MyIntArray, jonka avulla kokonaislukuja voi tallettaa taulukkoon, taulukon kokoa voi kasvattaa, taulukon voi järjestää suuruusjärjestykseen ja sieltä voi hakea annettua numeroa. Huomaa, että Javassa taulukkoluokkia ei valitettavasti voi periä, joten MyIntArray-olioiden sisältöön ei voi viitata hakasulkumerkinnällä kuten tavallisten taulukoiden sisältöön.

  1. Kopioi itsellesi tiedosto MyIntArray.java. Luokassa MyIntArray on joukko metodeja, jotka sinun pitää toteuttaa:
    public void grow(int by)
    Kasvata taulukon kokoa annetulla määrällä
    public void sort()
    Lajittele taulukon alkiot kasvavaan suuruusjärjestykseen. Voit käyttää haluamaasi lajittelumenetelmää, esim. Insertion sortia.
    public int search(int element)
    Onko annettu kokonaisluku element taulukossa? Palauta taulun indeksi, jossa element sijaitsee tai jokin negatiivinen luku, jos element ei ole taulussa. Käytä toteutuksessa lineaarista hakua.
    public boolean binarySearch(int element)
    Onko annettu kokonaisluku element taulukossa, jonka alkiot ovat kasvavassa järjestyksessä? Palauta taulun indeksi, jossa element sijaitsee tai jokin negatiivinen luku, jos element ei ole taulussa. Käytä toteutuksessa puolitushakua.
  2. Kopioi itsellesi tiedosto MyIntArrayExample.java, jossa on pääohjelmaluokka MyIntArrayExample. Käännä ja testaa tiedostot.

Osatehtävä 3.3 (max 20 pistettä)

Tässä tehtävässä tutustutaan jonkin verran poikkeuksien (exception) käsittelyyn.

  1. Kopioi itsellesi tiedosto MyIntArrayTest.java, jossa on pääohjelmaluokka MyIntArrayTest sekä tiedosto Lue.java, joka sisältää metodeja tiedon lukemiseen näppäimistöltä. Käännä pääohjelmaluokka ja aja ohjelma antamalla sille syötteeksi yksitellen viisi positiivista kokonaislukua.
  2. Aja ohjelmaa uudestaan antamalla sille syötteeksi yli 10 positiivista kokonaislukua. Mitä tapahtuu ja miksi?
  3. Kirjoita pääohjelmaluokkaan poikkeusten käsittelytoiminto (try-catch), joka käsittelee ilmenneen poikkeuksen, tulostaa suomeksi virheilmoituksen tapahtuneesta ja korjaa tilanteen kasvattamalla taulukon kokoa 10 alkiolla. Käännä ja testaa ohjelmasi siten, että syötät 15 alkiota ja saat ne tulostettua lajiteltuna.

Osatehtävä 3.4 (max 40 pistettä)

Tässä tehtävässä harjoitellaan rajapintaluokan käyttöä.

Oletetaan, että haluamme kirjoittaa vastaavanlaisen taulukkoluokan kuin edellä tehtävässä 3.2 annettu luokka MyIntArray, mutta siten, että siihen voidaan tallettaa muuntyyppisiä alkioita, esimerkiksi boolean-, double- tai String-tyyppisiä alkioita. Jos käytämme edellistä mallia, joutuisimme toteuttamaan jokaiselle niistä oman luokkansa, joka olisi toteutukseltaan lähes identtinen muiden kanssa.

Täysin yleiskäyttöinen luokka MyArray voidaan rakentaa rajapintaluokkien avulla. Rajapinta on tietynlainen luokka, jossa on määritelty vain joukko metodien otsikkoja, ei niiden toteutusta. Jokin toinen Java-luokka toteuttaa (implements) tämän rajapinnan, jos siinä on määritelty kaikille ko. metodeille toteutus.

Eräs Java-APIssa määritelty rajapintaluokka on Comparable. Tutustu huolellisesti tähän rajapintaan. Se määrittelee, että sen toteuttavan luokan oliot voidaan asettaa suuruusjärjestykseen.

Tiedostossa MyArray.java on määritelty uusi luokka, joka muistuttaa tehtävässä 3.2 määriteltyä luokkaa. Sen taulukon alkioiden tyyppinä on Comparable. MyArray voi sisältää mielivaltaisia olioita, jotka voidaan laittaa suuruusjärjestykseen.

  1. Kopioi itsellesi tiedosto MyArray.java. Täydennä sinne samat metodit grow, search, binary_search ja sort kuin edellä, mutta siten, että käsiteltävät alkiot ovat tyyppiä Comparable.
    Huomaa, että rajapinnan Comparable metodi compareTo voi aiheuttaa poikkeuksen ClassCastException ja sinun kirjoittamasi koodin tulee varautua tähän poikkeukseen.
  2. Kopioi itsellesi tiedosto MyArrayExample.java, jossa on pääohjelmaluokka MyArrayExample. Käännä ja testaa tiedostot.
  3. Kirjoita luokka Coordinate, johon voidaan tallettaa XY-tason pisteitä. Kirjoita luokka siten, että se toteuttaa rajapinnan Comparable siten, että pisteiden järjestämiseen käytetään niiden etäisyyttä origosta. Kopioi lopuksi itsellesi luokka CoordinateTest. Käännä se 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 harj3.jar Java-tiedostoista Luokka1.java ja Luokka2.java.

jar cf harj3.jar Luokka1.java Luokka2.java

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

jar tf harj3.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 keskiviikkona 7.11 klo 16.00. Jos palautus myöhästyy, jokaisen myöhässä palautetun tehtävän arvosana laskee 5 pistettä / myöhästymispäivä.