Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Osan kaikki tehtävät

huomautus

Jos palautat tehtävät ennen osion takarajaa (ma 26.1.2026 klo 11:59 (keskipäivä)), voit saada DL-BONUS-pisteitä harjoitustehtäviin. Lue lisää suorittaminen-sivulta.

Tehtävä 2.1: Kello1 p.

Tee luokka Kello, jolla on attribuutit minuutit ja tunnit kokonaislukuina.

Lisää luokkaan metodit setMinuutit ja setTunnit, jotka ottavat parametrina kelloon minuutit ja tunnit. Minuuttien täytyy olla välillä 0-59, muuten tulostetaan virheilmoitus, ja aika pysyy entisellään. Samoin tuntien täytyy olla välillä 0-23, muuten tulostetaan virheilmoitus.

Tee myös metodi naytaAika, joka tulostaa ajan muodossa "HH:MM".

Voit testata luokan toimintaa valmiin pääohjelman avulla.

Tee tehtävä TIMissä
Tehtävä 2.2: Ajastin1 p.

Tee luokka Ajastin, jolla on attribuutit minuutit ja sekunnit kokonaislukuina.

Lisää luokkaan metodit lisaaMinuutteja ja lisaaSekunteja, jotka ottavat parametrina ajastimeen lisättävät minuutit ja sekunnit. Lisää myös metodi annaMerkkijono, joka antaa ajastimen minuutit ja sekunnit merkkijonona.

Minuutteja voi olla kuinka monta tahansa, mutta sekuntien täytyy olla välillä 0-59. Jos sekunnit ylittävät rajan, muutetaan ne minuuteiksi. Sekunnit voi muuttaa minuuteiksi + sekunneiksi esimerkiksi näin:

int sekunteja = 75; // Esimerkki parametrina tulevasta arvosta

// Tämä antaa this.minuutteja-attribuuttiin _lisättävät_ minuutit
int lisattaviaMinuutteja = (this.sekunteja + sekunteja) / 60; 

// Tämä antaa this.sekunteja-attribuuttiin _sijoitettavat_ sekunnit
int jaljelleJaavatSekunnit = (this.sekunteja + sekunteja) % 60;  

Voit testata luokan toimintaa valmiin pääohjelman avulla.

Tee tehtävä TIMissä
Tehtävä 2.3: Oma luokka1 p.

Valitse jokin tosimaailman esine tai käsite ja tee siitä oma yksinkertainen luokka.

Lisää luokkaan seuraavat:

  • Vähintään kaksi sille sopivaa attribuuttia.
  • Vähintään kaksi metodia, jotka muuttavat tai tarkastelevat olion tilaa jollain tavalla.
  • Vähintään kaksi erilaista muodostajaa, jotka alustavat olion järkevään tilaan. Se mikä on järkevä tila riippuu omasta oliostasi.

Voit käyttää materiaalin esimerkkejä tarvittaessa inspiraationa attribuutteja ja metodeja keksiessä.

Luo olio ja kokeile sen tilan muuttamista pääohjelmassa. Tulosta olion tietoja ennen tilan muuttamista ja sen jälkeen.

Tee tehtävä TIMissä
Tehtävä 2.4: Static1 p.

Muuta esimerkin Henkilo-luokkaa niin, että jokainen luotu henkilö saa automaattisesti oman järjestysnumeron, joka on kokonaisluku. Ensimmäiseksi luodun henkilön numero on 1, seuraava saa numeroksi 2, jne.

Numeroa ei saa antaa henkilölle sen ulkopuolelta esimerkiksi kutsumalla sen metodia.

Toteuta luokkaan myös metodi annaNumero, joka palauttaa tietyn olion numeron kokonaislukuna. Muita metodeja ei tarvitse lisätä.

Vinkki

Tarvitset tässä tehtävässä staattisia luokan jäseniä.

Mieti aluksi seuraavia kysymyksiä:

  • Milloin olio saa numeron?
  • Mistä olio tietää, mikä sen numeron pitäisi olla?
  • Mikä tieto on jaettua olioiden kesken ja mikä on oliokohtaista?
Tee tehtävä TIMissä
Tehtävä 2.5: Puhelin1 p.

Tee luokka Puhelin, jolla on attribuutit merkki (merkkijono) ja akunVaraus (kokonaisluku, joka kuvaa akun varausta prosentteina väliltä 0-100). Lisää luokkaan seuraavat metodit:

  • lahetaViesti(String henkilo, String viesti): tulostaa viestin muodossa "Lähetetään viesti henkilölle <henkilo>: <viesti>". Viestin lähettäminen vähentää akkua 5 prosenttiyksikköä.
  • soita(String henkilo, int minuutit): tulostaa viestin muodossa "Soitetaan puhelu henkilölle <henkilo>, kesto: <minuutit> minuuttia". Soittaminen vähentää akkua 1 prosenttiyksikköä per minuutti.
  • lataa(int prosentteja): lisää akun varausta annetun määrän, mutta akun varaus ei voi ylittää 100 prosenttia.
  • tulostaTiedot(): tulostaa puhelimen merkin ja akun varauksen muodossa "Puhelimen <merkki> akun varaus on <akku>%".

Korvaa kulmasulkeissa olevat kohdat sopivilla attribuuttien / parametrien arvoilla.

Akun varaus ei voi mennä alle 0%.

Jos akun varaus on 0%, viestiä ei voida lähettää eikä voi soittaa "Akku tyhjä. Viestiä ei voida lähettää / ei voi soittaa.".

Testaa sovellustasi luomalla Puhelin-olio, lähettämällä viesti, soittamalla puhelu, lataamalla akkua ja tulostamalla puhelimen tiedot.

Valinnainen lisätehtävä: Jos akku loppuu kesken

Muokkaa lahetaViesti- ja soita-metodeja siten, että jos akun varaus ei riitä koko viestin lähettämiseen tai puhelun soittamiseen, niin lähetetään/soitetaan niin kauan kuin akku riittää. Jos akku loppuu kesken puhelun / viestin, tulosta kauanko puhelu onnistui / kuinka paljon viestistä saatiin lähetettyä ennen akun loppumista. Esimerkiksi "Akku tyhjä. Sait lähetettyä 60% viestistä." tai "Akku loppui 3 minuutin jälkeen.

Tee tehtävä TIMissä
Tehtävä 2.6: Kirjasto1 p.

Toteuta luokka Kirja, joka pitää kirjaa yksittäisistä kirjoista, mutta myös seuraa kirjaston tilastoja globaalisti. Luo luokalle seuraavat muuttujat:

Oliomuuttujat:

  • String nimi: Kirjan nimi.
  • String kirjoittaja: Kirjan kirjoittaja.
  • boolean onLainassa: Kertoo, onko kyseinen kirja tällä hetkellä lainassa.

Luokkamuuttujat (static):

  • static int kirjojenMaara: Kuinka monta kirjaa on luotu yhteensä.
  • static int lainassaOlevat: Kuinka monta kirjaa on tällä hetkellä lainassa.

Muodostajan tulee ottaa vastaan nimi ja kirjoittaja. Aina kun uusi kirja luodaan, kirjojenMaara-muuttuja kasvaa yhdellä.

Tee oliometodit lainaa() ja palauta: Nämä muuttavat kirjan onLainassa-tilaa ja päivittävät staattisen lainassaOlevat-laskurin.

Tee staattinen metodi tulostaTilastot(), joka tulostaa ruudulle kirjaston tilastot: "Kirjasto sisältää X kirjaa, joista Y on lainassa."

Saat valmiina pääohjelman, jota voit käyttää ohjelmasi testaamiseen

Tee tehtävä TIMissä
Tehtävä 2.7: Ovi1 p.

Toteuta luokka Ovi, joka mallintaa ovea, joka voi olla joko lukossa tai auki.

Attribuutit:

  • private boolean lukossa
  • private String avainkoodi

Muodostaja saa oven avainkoodin parametrina: Ovi(String avainkoodi)

Muodostajan pitää asettaa avainkoodi ja asettaa ovi aluksi lukkoon.

Metodit:

  • boolean avaa(String koodi): avaa oven vain, jos koodi on oikein ja ovi on lukossa. Palauttaa true, jos ovi avattiin, muuten false.
  • boolean lukitse(): lukitsee oven vain, jos se on auki. Palauttaa true, jos lukitseminen onnistui, muuten false.
  • boolean vaihdaKoodi(String vanha, String uusi): vaihtaa avainkoodin uuteen, jos vanha koodi on oikein ja ovi on auki. Uusi koodi ei voi olla tyhjä merkkijono. Palauttaa true, jos vaihto onnistui, muuten false.
  • String tila(): palauttaa merkkijonon "Ovi on lukossa" tai "Ovi on auki"

Vain tila() saa tulostaa jotain. Muut metodit eivät.

Kirjoita pääohjelma, jossa

  • luot oven
  • lukitset oven
  • yrität avata ovea väärällä koodilla
  • avaat oven oikealla koodilla
  • yrität avata jo avointa ovea
  • yrität lukita jo lukittua ovea
  • yrität vaihtaa koodia kun ovi on lukossa
  • vaihdat koodin väärällä vanhalla koodilla
  • vaihdat koodin oikealla vanhalla koodilla
  • tulostat oven tilan

Tee tehtävä TIMissä
Tehtävä 2.8: Säästölipas1 p.

Toteuta luokka Saastolipas, jonka tarkoituksena on säilyttää rahaa.

Attribuutit:

  • private double saldo: Säästölippaan nykyinen rahamäärä.
  • private String omistaja: Lippaan omistajan nimi.
  • private final String SALASANA: Salasana, joka tarvitaan rahojen nostamiseen.

Konstruktori: Ottaa vastaan omistaja ja SALASANA -arvot. Asettaa alkusaldoksi 0.0.

Metodit:

  • public void talleta(double maara): Lisää rahaa vain, jos maara on positiivinen.
  • public double nosta(double maara, String annettuSalasana): Tarkistaa, onko annettuSalasana oikein. Tarkistaa, onko lippaassa tarpeeksi rahaa. Jos molemmat täyttyvät, vähentää saldon ja palauttaa nostetun määrän. Muuten palauttaa 0.0 ja tulostaa virheilmoituksen.
  • public void tulostaSaldo(): Tulostaa "Hei <omistaja>, lippaasi saldo on <saldo> euroa.".

Korvaa kulmasulkeissa olevat kohdat sopivilla attribuuttien / parametrien arvoilla.

Tee pääohjelma, jossa luot Saastolipas-olion ja testaat sen toiminnallisuutta eri tilanteissa, kuten tallettaminen, onnistunut nosto ja epäonnistuneet nostot (väärä salasana, liian suuri nostettava määrä).

Tee tehtävä TIMissä
Tehtävä 2.9: Sähköverkko1 p.

Tässä tehtävässä rakennat järjestelmän, joka valvoo rakennusten sähkönkulutusta ja estää sulakkeiden palamisen. Tehtävä koostuu vaiheista.

Vaihe 1: Sähkölaite

Tee luokka Sahkolaite. Laitteilla on kaksi muuttumatonta ominaisuutta: nimi ja virrankulutus ampeereina.

Lisää attribuutit: private final String NIMI ja private final double VIRTA. Oletetaan, että virrankulutus on aina positiivinen luku.

Tee konstruktori, joka asettaa nämä arvot.

Lisää private boolean kytketty, joka kertoo, onko laite päällä.

Tee metodit kytke() ja irrota(), jotka muuttavat kytketty-muuttujan tilaa. Tee myös getVirta()-metodi, joka palauttaa laitteen virrankulutuksen, vastaavasti getNimi().

Kokeile luokkaasi pääohjelmassa luomalla muutama laite ja kytkemällä niitä päälle ja pois.

Vaihe 2: Keskus ja oliolista

Luo Sahkokeskus-luokka. Tämän luokan tarkoituksena on hallita sähkölaitteita.

Lisää luokkaan attribuutti final double SULAKKEEN_KOKO. Sulakkeen koko voi olla esimerkiksi 16 ampeeria tai 35 ampeeria. Lisää myös private boolean sulakePaalla, joka kertoo, onko sulake ehjä (true) vai palanut (false). Aluksi sulake on päällä.

Luo List<Sahkolaite> paallaOlevatLaitteet (käytä ArrayListia).

Tee metodi double laskeNykyinenVirta(), joka käy listan läpi ja laskee laitteiden VIRTA-arvojen summan.

Vaihe 3: Valvova logiikka ja tilan hallinta

Keskuksen on päätettävä, saako laitteen kytkeä päälle.

Tee metodi boolean kytke(Sahkolaite laite). Metodin tulee tarkistaa, onko nykyinen virta + uuden laitteen virta <= sulakekoko. Jos on, laite lisätään listaan ja sille kutsutaan laite.kytke(). Muussa tapauksessa sulake palaa: aseta sulakePaalla = false, sammuta kaikki listan laitteet (irrota()) ja tyhjennä päälläolevien laitteiden lista.

Tee myös metodi void irrota(Sahkolaite laite), joka poistaa laitteen listasta ja kutsuu laite.irrota().

Vaihe 4: Globaali seuranta

Sähköyhtiö haluaa seurata kaikkien keskusten tilannetta.

Lisää Sahkokeskus-luokkaan static double kokonaisKulutusValtakunnassa.

Päivitä tätä muuttujaa aina, kun jokin laite missä tahansa keskuksessa kytketään päälle, irrotetaan sähkökeskuksesta tai kun sulake palaa.

Lisää static-metodi tulostaValtakunnanTilanne(), joka tulostaa kokonaiskulutuksen.

Voit testata ohjelmaasi TIMissä olevalla valmiilla pääohjelmalla, tai voit kirjoittaa oman testiohjelmasi.

Tee tehtävä TIMissä
Bonus: Tehtävä 2.10: Varaukset1 p.

Muokkaa esimerkin Rakennus, Tila ja Varaus -luokat sisältävää ohjelmaa niin, että ohjelma ei anna lisätä samaan tilaan päällekkäisiä varauksia. Jos tilassa on jo varaus, joka olisi päällekkäin uuden varauksen kanssa, uutta varausta ei luoda.

Lisää myös tarkistukset, jotka estävät virheellisten varausten luomisen. Varauksen keston täytyy olla vähintään 1 tunti ja alkuajankohdan täytyy olla välillä 0-23.

Virhetilanteet voi tässä tehtävässä käsitellä tulostamalla virheilmoituksen.

Ennen tehtävän aloittamista kannattaa miettiä hetki, mitkä vastuut kuuluvat millekin oliolle.

Voit testata ohjelman toimintaa valmiiksi annetulla pääohjelmalla.

Tee tehtävä TIMissä