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ä.
Tässä tehtävässä tutustutaan listarakenteeseen. Tavoitteena on
ymmärtää ja kyetä selittämään valmiina annetun luokan
List
toimintaa.
List.insertElementLast.html
toteutukseen. Toteutus on kuvattu havainnollisesti täällä.
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.
ListExample.java
sekä List.java
ja
suorita ohjelma.
insertElementLast
toiminta
kutsussaexample.insertElementLast(sanat[4]);
removeElement
toiminta kutsussa
example.removeElement(sanat[2]);
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.
MyIntArray.java
.
Luokassa MyIntArray
on joukko metodeja, jotka sinun pitää toteuttaa:
public void grow(int by)
public void sort()
public int search(int element)
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)
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.
MyIntArrayExample.java
,
jossa on pääohjelmaluokka MyIntArrayExample
.
Käännä ja testaa tiedostot.
Tässä tehtävässä tutustutaan jonkin verran poikkeuksien (exception) käsittelyyn.
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.
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.
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
.
Comparable
metodi
compareTo
voi aiheuttaa poikkeuksen
ClassCastException
ja sinun kirjoittamasi
koodin tulee varautua tähän poikkeukseen.
MyArrayExample.java
,
jossa on pääohjelmaluokka MyArrayExample
.
Käännä ja testaa tiedostot.
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.
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ä.