- Kun MinMax-mittari määritellään kuten
tehtävässä 20,
mittari voi olla epämääräisessä tilassa; kun onAlkutilassa()
palauttaa arvon true, minimi- ja maksimilämpötiloihin ei
voi luottaa. Vastuu mittarin luotettavuuden tarkistamisesta on
siis MinMax-olion käyttäjällä.
Muokkaa edellisen tehtävän mittarista sellainen, jonka
konstruktorille annetaan ensimmäinen mittaustulos.
Aksessorit:
- public void kirjaaLämpötila(double lämpö)
- public double mikäOnMinimi()
- public double mikäOnMaksimi()
- public void aloitaUusiMittaussarja(double lämpö)
Laadi pääohjelma, 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.
Vertaile MinMax-luokan kahta erilaista toteutusta, oikeastaan
kahta erilaista "arkkitehtuuria".
Missä suhteessa jompaa kumpaa ratkaisua voidaan pitää toista
parempana? Vai voidaanko? Ovatko ne vain erilaisia?
- Laivalla on suunta 0...359 astetta ja nopeus 0.0...40.0 solmua.
Toteuta laiva luokkana Laiva:
- public Laiva() luo laivan, jonka suunta on 0 ja nopeus 0.0
- public Laiva(double nopeus)
luo laivan, jonka nopeus annetaan, suunta on 0
- public Laiva(int suunta)
luo laivan, jonka suunta annetaan, nopeus on 0.0
- public Laiva(double nopeus, int suunta)
luo laivan, jonka nopeus ja suunta annetaan
- public int mikäSuunta() palauttaa arvonaan laivan suunnan
asteina
- public double mikäNopeus() palauttaa arvonaan laivan nopeuden
solmuina
- public void styyrpuuriin() kääntää laivaa oikealle
yhden asteen
(huomaa että kun suunta on 359 ja käännetään oikealle
yksi aste, uusi asteluku on 0!)
- public void paarpuuriin() kääntää laivaa vasemmalle
yhden asteen
- public void asetaNopeus(double nopeus) asettaa uudeksi
nopeudeksi
parametrina annetun luvun
Hyvän ohjelmointityylin mukaisesti laivan tietorakenteet piilotetaan
käyttäjältä, joka siis pääsee vain aksessoreilla ohjaamaan laivaa.
Miten virheellisiin parametrien arvoihin tulisi suhtautua?
Varusta luokka tavalliseen tapaan toString()-metodilla,
jotta laivan tilan tulostaminen on vaivatonta.
- Laadi edellisen tehtävän luokkaa käyttäen sovellus Laivuri,
jolla voi "ohjata laivaa". Laivaa ohjataan näppäimistöltä
seuraavasti:
- kirjain "v": käännetään vasemmalle, ohjelma kysyy astemäärän
- kirjain "o": käännetään oikealle, ohjelma kysyy astemäärän
- kirjain "n": säädetään nopeutta, ohjelma kysyy uuden nopeuden
- muut syötteet lopettavat purjehduksen
Ohjelma tulostaa joka operaation jälkeen laivan tilan.
Tässä tehtävässä ei tarvitse varautua
numeeristen syötteiden ei-numeerisuuteen.
-
Eräs viljavarastotyyppi muodostuu kahdesta viljasiilosta.
Vain ensimmäinen siilo on varustettu lastauslaittein.
Viljaa voidaan siirtää siilosta toiseen.
Laadi luokka Viljavarasto viljavaraston toteutukseksi.
Toteuta siilot
Pikkuvarasto-olioina.
- public Viljavarasto(double ekaSiilo, double tokaSiilo) luo
viljavaraston, jonka siilojen vetoisuus annetaan parametreina.
Siilot ovat aluksi tyhjiä. Negatiivinen parametrin arvo
tulkitaan nollaksi.
- public double ekassaOn() palauttaa ensimmäisen siilon viljamäärän.
- public double tokassaOn() palauttaa toisen siilon viljamäärän.
- public boolean siirraViljaa(double määrä, boolean ekasta) siirtää
parametrin verran viljaa siilosta toiseen. Jos jälkimmäinen
parametri on true, siirretään ensimmäisestä siilosta toiseen,
muuten päinvastoin. Jos koko määrää ei voida siirtää, ei siirretä
mitään. Metodi palauttaa arvon false jos määrä on negatiivinen tai
siirto ei onnistunut, muuten se palauttaa arvon true.
- public boolean lisaaViljaa(double määrä)
lisää viljaa ensimmäiseen siiloon. Jos yritetään lisätä
enemmän kuin mahtuu, viljamäärää ei muuteta.
Metodi palauttaa arvon false jos määrä on negatiivinen tai
lisäys ei onnistunut, muuten se palauttaa arvon true.
- public double otaViljaa(double määrä)
ottaa viljaa ensimmäisestä siilosta. Jos pyydetään
enemmän kuin siilossa on, saadaan vain mitä on.
Arvonaan metodi palauttaa saadun viljan määrän.
Negatiivinen parametrin arvo tulkitaan nollaksi.
- public void hiirivahinko(double vakavuus) vähentää molempien
siilojen sisältöä parametrin ilmoittamalla prosenttimäärällä.
Negatiivinen parametrin arvo tulkitaan nollaksi.
- public String toString() palauttaa arvonaan selkeän
merkkijonoesityksen viljavaraston tilasta.
Viljavaraston siilot on siis toteutettava
Pikkuvarasto-olioina!
Uusissa viljavarastoissa nimittäin siilot saatetaan toteuttaa
uudella tekniikalla. Kun Viljavarasto on ohjelmoitu yksittäisen
siilon sisäistä rakennetta tietämättä, uuteen siilotekniikkaan voidaan
siirtyä ohjelmoimalla vain Pikkuvarasto-luokka uudelleen!
Testaa luokka "testipääohjelmametodilla", so. luokkaan itseensä
sijoitetulla public static void main(String[] args) -metodilla,
joka luo ilmentymiä luokasta ja kokeilee operaatioiden toimintaa
erilaisissa tilanteissa.
Tässä tehtävässä viljavaraston siilot toteutettiin
Pikkuvarasto-olioina. Näin siis jo käytössä olevaa
valmista ohjelmakoodia ns.
uudelleenkäytettiin.
PikkuVarasto-luokka ei ehkä kuitenkaan ole kaikkein
tarkoituksenmukaisin tapa toteuttaa siiloja?
Millainen luokka - nimeltään vaikkapa Siilo -
olisi mielestäsi mahdollisimman
käyttökelpoinen juuri tämän tehtävän ratkaisussa?
Miten Viljavarasto-luokan toteutus muuttuisi?
- Kyselija on olio, "laite", joka helpottaa
tietokilpailun kysymysten tekemistä ja vastausten analysointia.
Sen "API" on seuraavanlainen:
- public Kyselija(String kysymyksenAlku, String kysymyksenLoppu)
- public boolean kysy(String kysytty, String oikeaVastaus);
Vastaus hyväksytään oikeaksi, vaikka se sisältäisi
ylimääräisiä välilyöntejä alussa tai lopussa.
Metodi palauttaa arvonaan true, jos vastaus on oikein,
muuten false. Myös onnistumisesta metodi raportoi, ks. alla.
- public void samaistaIsotJaPienet(boolean päälle)
Jos metodia on kutsuttu viimeksi parametrilla true, isot ja
pienet kirjaimet samaistetaan, jos false, niitä ei samaisteta.
Oletusarvoisesti on samaistaIsotJaPienet(false).
Asiantilaa voi tarvittaessa siis muuttaa vaikka kysymyksittäin.
- public int montakoKysymystä() palauttaa tähän mennessä
kysyttyjen kysymysten lukumäärän.
- public int montakoOikein() palauttaa oikeiden vastausten
lukumäärän tähän mennessä.
Käyttöesimerkki selventää konstruktorin ja aksessoreiden käyttöä:
Kyselija kilpa = new Kyselija("Mitä on italian ", "suomeksi?");
kilpa.samaistaIsotJaPienet(true);
boolean oikein;
oikein = kilpa.kysy("tutti", "kaikki");
if (oikein)
System.out.println("Hienoa, hyvä alku!");
// kuvaruudulla tapahtuu:
//
// Kone: Mitä on italian "tutti" suomeksi?
// Käyttäjä: Kaikki
// Kone: OIKEIN!
// Kone: Hienoa, hyvä alku!
kilpa.kysy("ferro", "rauta"); // Arvon palauttavaa metodia voi
// kutsua myös arvoa käyttämättä!
// kuvaruudulla tapahtuu:
//
// Kone: Mitä on italian "ferro" suomeksi?
// Käyttäjä: rAuTA
// Kone: OIKEIN!
oikein = kilpa.kysy("matto", "hullu");
if (!oikein)
System.out.println("No mitäs nyt?");
// kuvaruudulla tapahtuu:
//
// Kone: Mitä on italian "matto" suomeksi?
// Käyttäjä: matto
// Kone: VÄÄRIN! Oikea vastaus on "hullu".
// Kone: No mitäs nyt?
System.out.println("Kysymyksiä oli " + kilpa.montakoKysymystä() +
", oikeita vastauksia " + kilpa.montakoOikein() + ".");
// kuvaruudulla tapahtuu:
//
// Kone: Kysymyksiä oli 3, oikeita vastauksia 2.
kilpa.kysy("madre", "äiti");
kilpa.kysy("cavallo", "hevonen");
kilpa.kysy("birra", "olut");
// ... jne., jne...
Ohjelmoi myös sovellus, joka havainnollistaa Kyselija-luokan käyttöä
tietokilpailun toteuttamisessa. Voit tietenkin valita
itseäsi kiinnostavan aihepiirin.