Osan kaikki tehtävät
huomautus
Jos palautat tehtävät ennen osion takarajaa (ma 9.2.2026 klo 11:59 (keskipäivä)), voit saada DL-BONUS-pisteitä harjoitustehtäviin. Lue lisää suorittaminen-sivulta.
-
Luo rajapinta nimeltään
Muunnin. Määrittele rajapintaan yksi metodi:String muunna(String syote). Muista, että rajapinnassa metodilla ei ole runkoa (ei aaltosulkeita{}). -
Tee luokat
PienetKirjaimet,IsotKirjaimetjaIsoAlkukirjain, jotka toteuttavatMuunnin-rajapinnan.
PienetKirjaimet-luokanmuunna-metodi muuntaa annetun merkkijonon pieniksi kirjaimiksi.muunna("Hei Maa")-->"hei maa".IsotKirjaimet-luokanmuunna-metodi muuntaa annetun merkkijonon suuraakkosiksi.muunna("Hei Maa")-->"HEI MAA".IsoAlkukirjain-luokanmuunna-metodi muuntaa annetun merkkijonon siten, että vain ensimmäinen kirjain on suuraakkonen ja muut pieniä.muunna("HEI MAA")-->"Hei maa".
- Testaa ohjelmaasi valmiiksi annetulla pääohjelmalla.
Vakoojat lähettävät viestejä toisilleen, mutta salausmenetelmä vaihtuu päivittäin, jotta vihollinen ei pääse perille logiikasta. Tarvitsemme rajapinnan, jonka avulla voimme vaihtaa salausalgoritmia lennosta.
- Luo rajapinta
Salaaja. Määrittele rajapintaan kaksi metodia
String salaa(String viesti);
String pura(String salattuViesti);
- Toteuta kolme erilaista luokkaa:
Kaantaja,HakkerijaSeuraavaKirjain, jotka toteuttavatSalaaja-rajapinnan seuraavilla logiikoilla:
-
Kaantaja(Peilikuvakirjoitus). Kääntää sanan väärinpäin. Esimerkki: "Agentti" → "ittnegA". Vihje: Voit käyttääStringBuilder-luokanreverse()-komentoa tai silmukkaa, joka käy sanan läpi lopusta alkuun. -
Hakkeri("Leet-speak"). Korvaa tietyt kirjaimet numeroilla tai merkeillä. Esimerkki: "Agentti" -> "@g3ntt!"
Korvaa 'a' -> '@'
Korvaa 'e' -> '3'
Korvaa 'i' -> '!'
Korvaa 'o' -> '0'
SeuraavaKirjain(Caesar-siirros). Jokaista kirjainta siirretään aakkosissa yksi eteenpäin. Esimerkki: abc -> bcd. Vihje: Javassacharon luku. Voit tehdämerkki + 1.
'a' -> 'b'
'b' -> 'c'
'k' -> 'l'
jne.
Tässä harjoituksessa ei tarvitse huolehtia ö-kirjaimen pyörähtämisestä ympäri,
ellei halua. Tehtävässä ei myöskään tarvitse huolehtia siitä, että salauksen ja
purkamisen jälkeen saatu viesti ei välttämättä ole samanlainen kuin alkuperäinen
viesti. Esimerkiksi jos Hakkeri-muuntajaa käytettäessä alkuperäisessä
viestissä on oikeasti merkki @, pura-metodi antaa tulokseksi tuohon paikalle
merkin a. Tämä ei haittaa tässä, mutta tietenkin oikeassa salauksessa pitäisi
varmistaa, ettei tietoa katoa tai muutu vahingossa.
Saat TIMissä valmiina pääohjelman, jonka avulla voit testata luokkarakennettasi.

Toteutetaan yksinkertainen tekstiseikkailupeli (tai oikeammin pieni palanen pelistä), jossa pelaaja voi yrittää poimia esineitä maasta, sekä syödä saadakseen energiaa. Saat valmiina kaksi rajapintaa: Syotava ja Poimittava. Lisäksi saat osittain toteutetut luokat: Omena ja IsoKivi, jotka toteuttavat nämä rajapinnat. Edelleen, saat osittain toteutetun pääohjelman, jossa pelaajan energiaa ja repun tilaa seurataan.
Täydennä kaikki TODO-sanalla merkityt osat, jotta ohjelma toimii ohjeiden mukaisesti.
Tee Robotti, joka osaa suorittaa erilaisia kotitöitä, kuten imurointia ja
kukkien kastelua.
Toteuta tehtävä oheisen UML-kaavion mukaisesti. Katkoviiva, jossa on musta
nuoli, tarkoittaa, että Robotti-luokka käyttää KayttoEsine-rajapintaa:
Robotti-luokka sisältää attribuutin, joka on tyyppiä KayttoEsine.
Kuvaus sanallisessa muodossa
Tässä on kuvaus luokista ja niiden vaadituista ominaisuuksista (vastaavat kuin UML-kaaviossa):
Robotilla on seuraavat metodit:
void vaihdaKayttoEsine(KayttoEsine esine): Vaihtaa robotin käyttämän esineen (esim. imuri tai kastelukannu).void teeTyota(String kohde): Suorittaa kotityön. Joskohdeon sillä listalla, jotka kyseiseltä käyttöesineeltä on kielletty (esim.Kastelukannu-oliolla ei saa kastella"Tietokone"-kohdetta), robotin tulee tulostaa virheilmoitus. Kielletyt käyttökohteet määritellään käyttöesineen attribuuttina merkkijonolistana.Kastelukannu-olio ei kastele jos vettä ei ole riittävästi. Sen voi täyttäätaytaVesi()-metodilla. Kastelukannun vesimäärä on aluksi 50 yksikköä. Voit halutessasi tehdä uuden muodostajan, joka asettaa vesimäärän alkutilan toiseksi.Imuri-olio ei imuroi jos roskasäiliö on täynnä. Sen voi tyhjentäätyhjennaSailio()-metodilla. Roskasäiliön kapasiteetti on 100 yksikköä. Voit halutessasi tehdä uuden muodostajan, joka asettaa roskasäiliön alkutilan toiseksi.- Molemmat käyttöesineet palauttavat
kayta(String kohde)-metodin avulla totuusarvon, joka kertoo onnistuiko työ.
Tutki Javan dokumentaatiota. Vastaa kysymyksiin Comparable-rajapinnasta.
Tehtävässä on pohjana Henkilo-luokka omassa tiedostossaan sekä
jarjestaHenkilot-metodi main.java-tiedostossa. Kyseinen metodi ei kuitenkaan
toimi, sillä se käyttää Javan valmista Collections.sort-metodia ja
Henkilo-luokasta puuttuu sille tuki.
Muokkaa Henkilo-luokkaa niin, että List<Henkilo>-tyyppiset listat voidaan järjestää Collections.sort-metodilla henkilön nimen mukaan aakkosjärjestykseen.
Esimerkiksi listan
List<Henkilo> henkilot = Arrays.asList(
new Henkilo("Joukahainen"),
new Henkilo("Ilmatar"),
new Henkilo("Kyllikki"),
new Henkilo("Kokko")
);
pitäisi olla Collections.sort(henkilot);-kutsun jälkeen järjestyksessä:
- Ilmatar
- Joukahainen
- Kokko
- Kyllikki
Jatkoa edelliselle tehtävälle. Nyt Henkilo-luokassa henkilöiden nimet on
jaettu erikseen sukunimeen ja etunimiin.
Muokkaa uudistettua Henkilo-luokkaa niin, että List<Henkilo>-tyyppiset
listat voidaan järjestää Collections.sort-metodilla henkilön sukunimen ja
etunimien mukaan aakkosjärjestykseen, niin että järjestys tapahtuu ensin
sukunimen mukaan.
Esimerkiksi listan
List<Henkilo> henkilot = Arrays.asList(
new Henkilo("Pacius", "Fredrik"),
new Henkilo("Mozart", "Wolfgang Amadeus"),
new Henkilo("Mozart", "Leopold"),
new Henkilo("Chopin", "Frédéric")
);
pitäisi olla Collections.sort(henkilot);-kutsun jälkeen järjestyksessä:
- Chopin Frédéric
- Mozart Leopold
- Mozart Wolfgang Amadeus
- Pacius Fredrik
Tee geneerinen metodi etsiSuurin, joka etsii listan suurimman alkion. Parametrina tulevan
listan tulee toteuttaa Comparable-rajapinta, muutoin lista voi olla minkä
tyyppinen tahansa. Älä käytä valmiita Collections-luokan metodeja.
Tee luokka Kontti, joka hyödyntää geneerisyyttä ja toimii yksinkertaisena
säiliönä yhdelle minkä tahansa tyypin oliolle.
Lisää luokkaan attribuutti sisalto, joka voi sisältää minkä tahansa
tyyppisen olion. Lisää myös merkkijono omistaja. Tee luokkaan muodostaja, joka
ottaa nämä arvot vastaan parametreina.
Lisää lisäksi saantimetodit getOmistaja, getSisalto ja getTyyppi, joista
viimeinen palauttaa kontin sisällön tyypin merkkijonona. Tee myös override
toString-metodille, joka palauttaa nämä tiedot yhdessä merkkijonossa.
Tehtävässä on valmiiksi pääohjelma, jolla voit kokeilla luokan toimintaa.
Vinkki
Olion tyypin saa merkkijonona metodilla olio.getClass().getSimpleName().
Luo luokka IsoKontti, joka toimii säiliönä usealle minkä tahansa tyypin
oliolle. Konttiin pakataan esineitä niin, että viimeisimpänä lisätty
otetaan aina ensimmäiseksi pois.
Lisää luokkaan attribuutiksi lista, johon oliot tallennetaan.
Lisää myös seuraavat metodit:
-
lisaalisää parametrina annetun olion listan loppuun. -
otapalauttaa viimeisimmän olion ja ottaa sen pois listasta. -
katsopalauttaa viimeisimmän olion, mutta ei ota sitä pois listasta. -
sisaltaaottaa parametrina olion ja palauttaatrue, jos olio löytyy kontista. Muussa tapauksessa se palauttaafalse. -
tulostatulostaa kontin sisällön. Voit itse päättää, missä muodossa sisältö tulostetaan.
Tehtävässä on valmiiksi pääohjelma, jolla voit kokeilla luokan toimintaa.
Lisää edellisen tehtävän IsoKontti-luokkaan kaksi metodia.
-
Metodi
summaaNumerotottaa parametrina vastaan kontin, joka sisältää numeroita eliNumber-luokan tai sen alityyppien olioita ja palauttaa näiden summan. -
Metodi
siirraKaikkiottaa parametrina toisen kontin ja siirtää nykyisen kontin sisällön sinne. Toisen kontin täytyy olla tyypiltään sellainen, että se voi sisältää tämän kontin tyypin olioita.
Tehtävässä on valmiiksi pääohjelma, jolla voit kokeilla luokan toimintaa.
Vinkki
Tarvitset tässä tehtävässä tyyppirajoituksia.
-
Kaikilla
Number-luokan olioilla ondoubleValue()-metodi, joka palauttaa sen arvondouble-muodossa. -
Huomaa, että konttien tyyppien ei tarvitse olla täysin samat;
Number-kontti voi sisältääInteger-olioita, silläIntegeron sen alityyppi.
Tee geneerinen funktio, joka kopioi yhdestä listasta kaikki tyyppiä T vastaavat alkiot toiseen listaan, jonka tyyppi voi olla T tai sen ylityyppi.