- Tehtävässä 11
laadittiin ohjelma "joulukuusien" tulostamiseen.
Koska joulu on noin kolmen kuukauden päästä ja pian joulukuusia
tarvitaan todella paljon, toteuta joulukuusen tulostaminen
yksityisenä luokkametodina
private static void tulostaJoulukuusi(int korkeus)
Tee tätä metodia käyttäen ohjelma, joka osaa yhdellä suorituskerralla tulostaa useampia
joulukuusia. Koska ohjelma on tarkoitettu
tavalliselle käyttäjälle, niin sanotulle "loppukäyttäjälle",
myös virheellisiin syötteisiin on varauduttava.
Miten virhetilanteet
(sopimaton korkeus, kelvoton luku) hoidetaan? Onko parempi, että
pääohjelma
havaitsee ja ilmoittaa virheen? Vai olisiko se aliohjelman
tehtävä? Keksitkö perusteita molemmille vaihtoehdoille?
- Ohjelmoi double-arvon palauttava metodi potenssiin,
jonka arvona on double-parametri korotettuna int-parametrin ilmoittamaan
potenssiin. Myös negatiiviset potenssit ovat mahdollisia.
Sovitaan, että tässä tehtävässä
mikä tahansa arvo (myös nolla!) potenssiin nolla on yksi.
(Muistutus: Negatiiviset potenssit ovat positiivisten käänteislukuja,
esim. potenssi(10.0, -1) on 1/10.0, potenssi(10.0, -2) on 1/100.0,
jne., )
Suunnittele ja toteuta myös pääohjelma, joka tarjoaa käyttäjälle "potenssien
laskentapalvelun".
-
Yksinkertaisessa radiossa on vain kolme säädintä:
päälle/pois-kytkin, voimakkuuden säädin (arvot 0, 1, ..., 9) ja
kuunneltavan kanavan valinta (2300.0, ..., 26100.0).
Mallinna radio luokkana Radio. Säätimet toteutetaan metodeina,
eli ns. aksessoreina.
Luokassa on oltava myös aksessorit, joilla radion tilaa voi tutkia.
Tietorakenteet (muuttujat) pidetään tietenkin Radio-olion käyttäjältä
piilossa. Niihin pääsee siis käsiksi vain säädellysti aksessoreja
käyttäen.
Miten virheelliset käyttöyritykset hoidetaan? Miten metodit siis
toimivat, jos annetaan virheellinen voimakkuus tai kanava?
Testaa Radio-luokkaa laatimalla pääohjelma, joka "käyttää radioita".
Tässä tehtävässä ei tarvitse varautua ei-numeerisiin syötteisiin.
Itse asiassa syötteitä ei välttämättä tarvita lainkaan.
"Mallinnus" tässä tarkoittaa vain sitä, että säätimiä voi
säätää ja niiden arvoja tutkia aksessorimetodeilla
Ohjelman kytkeminen todellisen radion käyttöliittymäksi
olisi ihan toinen juttu...
Käytä kurssimateriaalin esimerkkiä Kuulaskuri ratkaisusi mallina.
- Sekuntilaskuri tuntee sekunnit, minuutit ja
tunteja vuorokauden verran. Laskuri voi vain edetä.
Kun sekunnit ylittävät arvon 59 yhdellä,
minuutit kasvavat ja sekunnit nollataan.
Kun minuutit ylittävät arvon 59 yhdellä,
tunnit kasvavat ja minuutit nollataan.
Kun laskuri ylittää arvon 23:59:59
(23 tuntia, 59 minuuttia, 59 sekuntia),
aloitetaan uudelleen arvosta 0:0:0.
Laskuri siis laskee:
0:0:0, 0:0:1, ...,
0:0:59, 0:1:0, 0:1:1, 0:1:2, ...,
0:59:57, 0:59:58, 0:59:59, 1:0:0, 1:0:1,...,
23:59:58, 23:59:59, 0:0:0
Toteuta luokka Sekuntilaskuri
- public Sekuntilaskuri() luo sekuntilaskurin, jonka alkuarvo on 0:0:0
- public int annaMinuutit() palauttaa arvonaan minuuttien määrän
- public int annaSekunnit() palauttaa arvonaan sekuntien määrän
- public int annaTunnit() palauttaa arvonaan tuntien määrän
- public void lisaaSekunti() lisää sekuntien määrää yhdellä
Varusta luokka metodilla toString(), jonka ansiosta olion arvo saadaan
tulostettua muodossa tunnit:minuutit:sekunnit, siis esimerkiksi
"14:7:53".
Laadi erillinen pääohjelmaluokka Sekuntilaskuri-luokan "testaamiseen".
Tässä pääohjelmassa ei tarvitse varautua virheellisiin syötteisiin.
Itse asiassa syötteitä ei välttämättä tarvita lainkaan.
- Lämpötilan maksimin ja minimin rekisteröintiin käytetään
laitetta MinMax. Laitteelle syötetään lämpötiloja ja siltä voidaan
milloin tahansa kysyä toistaiseksi korkeinta ja toistaiseksi
matalinta lämpötilaa. Kun laite otetaan käyttöön, se on alkutilassa,
ja mittareiden näytöllä ei ole merkitystä. Heti ensimmäisen
mittaustuloksen jälkeen laite antaa järkeviä tuloksia.
Laite voidaan myös myöhemmin asettaa alkutilaan uuden mittaussarjan
rekisteröintiä varten.
Laitteelta voidaan kysyä, onko se alkutilassa vai voiko
sen ilmoittamiin lämpötiloihin luottaa.
Toteuta laite luokkana MinMax, jolla on konstruktorin lisäksi seuraavat
aksessorit:
- public void kirjaaLämpötila(double lämpö)
- public double mikäOnMinimi()
- public double mikäOnMaksimi()
- public boolean onAlkutilassa()
- public void asetaAlkutilaan()
Laadi luokkaan myös pääohjelmametodi, joka havainnollistaa ja testaa
luokan toimintaa.
Tässä tehtävässä ei tarvitse varautua ei-numeerisiin syötteisiin. Itse
asiassa syötteitä ei välttämättä tarvita lainkaan.
Huomaa ettei laitteen alkutilaa voi päätellä esimerkiksi siitä,
että minimi ja maksimi olisivat nollassa. Onhan nimittäin
mahdollista, että pitkälläkin mittausjaksolla lämpötila
pysyttelee sitkeästi nollassa ja suurin ja pienin mitattu
lämpötila todella on 0o C!
Totuusarvoinen yksityinen kenttä voisi olla hyvä idea alkutilassa
olon tietämiseen...