- Basilisko on yksinkertainen, mutta silti hyvin
yksilöllinen olento.
Jokaisella basiliskolla on yksikäsitteinen, syntymässä saatu
järjestysnumero, ns. yksilöllisyys, joka ei koskaan voi muuttua,
eikä kukaan muu koskaan voi saada samaa yksilöllisyyttä.
Basiliskon perimä on String-olio. Basiliskot lisääntyvät vain
pariutumalla. Lapsi saa jomman kumman vanhempansa perimän
sellaisenaan. Todennäköisyys molemmille on yhtä suuri.
Perimän
arvonnan voi suorittaa lauseella
if (Math.random()<0.5) ...
Mallinna basilisko luokkana Basilisko, jossa kaikki kentät
ovat luonnollisesti private, ja jossa on julkiset
välineet (konstruktori ja aksessorit):
- public Basilisko(String perimä)
- public String mikäOnPerimä()
- public Basilisko pariudu(Basilisko toinen)
- public String toString(), tulostusasu on muotoa: (yksilöllisyys):
perimä,
ks. esim.
Esimerkki: (juuri näin pitää tulostaa: olion
järjestysnumerokin kuuluu
siis tulostusasuun,
kolmas tulostus voi tietenkin olla joko
"(3): Maija" tai "(3): Matti")
Basilisko isä = new Basilisko("Matti");
Basilisko äiti = new Basilisko("Maija");
Basilisko lapsi = isä.pariudu(äiti);
System.out.println(isä); // tulostus: (1): Matti
System.out.println(äiti); // tulostus: (2): Maija
System.out.println(lapsi); // tulostus: (3): Maija
(12 pistettä)
- TuplaBasilisko on basiliskon sukulainen.
Se eroaa basiliskosta vain
pariudu-metodin osalta: TuplaBasiliskon lapsi saa perimäkseen
vanhempiensa perimämerkkijonojen katenaation, so. perimää esittävät merkkijonot
liitetään yhteen. Toteuta TuplaBasilisko
luokan Basilisko aliluokkana. Ohjelmoi uudelleen vain tarvittavat
osat - esimerkiksi uusia kenttiä ei tarvita.
Tämän tehtävän voi toki tehdä, vaikka ei edellistä tehtävää tekisikään!
Esimerkki: (juuri näin pitää tulostaa: olion
järjestysnumerokin kuuluu
siis tulostusasuun)
TuplaBasilisko äijä = new TuplaBasilisko("Kalle"); // numero 1
TuplaBasilisko ämmä = new TuplaBasilisko("Kaija"); // numero 2
TuplaBasilisko pentu = ämmä.pariudu(äijä);
System.out.println(pentu); // tulostus: (3): KaijaKalle
(12 pistettä)
- "Mä en kestä noita sun puheitasi 'abstrakteista tietotyypeistä',
ja 'kapseloinnista'!" Näin parahti ystäväsi kuunneltuaan
intoiluasi hyvästä ohjelmointityylistä. Ystäväsi osaa kyllä
ohjelmoida - algoritmeja syntyy, metodeita kutsutaan (tosin
vain niitä "pääohjelman pikku apulaisia"), parametrivälityskin
sujuu - mutta olio-ohjelmoinnin yksi keskeinen idea herättää
hänessä vain asiantuntematonta ärtymystä.
Auta ystävääsi ymmärtämään, mistä oikein on kysymys.
Laadi siis asiasta kirjallinen selitys, joka sisältää
valaisevia ohjelmaesimerkkejä
(enimmäispituus 1 konseptiarkki).
Vastauksen arvioinnissa otetaan huomioon
selostuksen ajateltu lukija. Älä siis kirjoita tarkastajalle,
joka jo tuntee asian, kirjoita tuolle ystävälle!
(15 pistettä)
- Tee ohjelma, joka tarjoaa seuraavan kielenkäänöspalvelun:
Ensin ohjelma lukee tekstitiedoston, jossa rivillä 1 olevan
alkukielisen sanan käännös on rivillä 2, rivillä 3 olevan
alkukielisen sanan käännös on rivillä 4, jne.
Siis jokaisen parittoman rivin alkukielisen sanan käännös
on seuraavalla parillisella rivillä. Jos tiedostossa on pariton
määrä rivejä, viimeisen rivin sana jätetään ottamatta huomioon.
Saat olettaa, että kullakin rivillä on täsmälleen yksi sana.
Tekstitiedoston nimi annetaan komentoriviparametrina.
Jos alkukielinen sana ei ole yksikäsitteinen, viimeisin käännös jää voimaan.
Koko tiedoston puuttumiseen ja muihin virhetilanteisiin on kuitenkin
varauduttava.
Muodostettuaan yllä kuvatulla tavalla itselleen sanakirjan ohjelma
tarjoaa käännöspalvelun: Kun käyttäjä kirjoittaa sanan alkukielellä,
ohjelma joko kertoo sanan käännöksen tai ilmoittaa, että kysytty
alkukielinen sana oli tuntematon. Suunnittele ja toteuta itse
ohjelman loppuminen.
Jos haluat, voit käyttää (mutta ei ole pakko!) luokan
Hashtable<K,V> ilmentymää tietorakenteena.
Jos et käytä Hashtable<K,V>-oliota, voit olettaa, ettei
tiedostossa ole enempää kuin 10000 sanaa.
Jos käytät Hashtable<K,V>-rakennetta, seuraavasta
API-kuvauksen osasta voi olla hyötyä:
(14 pistettä)