(Muutettu viimeksi 29.9.2011, sivu perustettu 9.9.2011.)
Nämä harjoitukset liittyvät oppimateriaalin lukuihin 2 Oliot ja kapselointi: 1-18.
Kaikki harjoitustehtävät on syytä tehdä. Jotkin tehtävät on merkitty keltaisella värillä. Ne ovat ehkä hieman muita haastavampia. Ilman niitäkin harjoituksista voi saada maksimipisteet, mutta ne lasketaan silti mukaan harjoituspisteitä määrättäessä – ne voivat siis korvata joitakin haasteettomampia tehtäviä tms. Mutta ennen kaikkea noista keltaisista tehtävistä sitä vasta oppiikin!
Huom:
// 4. harjoitukset, tehtävä 1.3, Oili Opiskelija
Voit käyttää tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.
Pajamestareilla on mainio ohje tämän tehtäväsarjan tekemiseen NetBeansilla!
Tuntilaskuri on laite, joka nappia painaen etenee vuorokauden tunnista toiseen.
Tuntilaskurin API on
Tässä valmis pääohjelma Tuntilaskurin kokeilemiseen:
public static void main(String[] args) { Tuntilaskuri tuntilaskuri = new Tuntilaskuri(); System.out.println("tuntilaskurin arvo "+ tuntilaskuri.getTunti()); tuntilaskuri.etene(); System.out.println("tuntilaskurin arvo "+ tuntilaskuri.getTunti()); // edetään vuorokausi eli 24 tuntia eteenpäin for ( int i=0; i<24; i++ ) tuntilaskuri.etene(); System.out.println("tuntilaskurin arvo "+ tuntilaskuri.getTunti()); }
Esimerkkiohjelman tulostuksen pitäisi olla:
tuntilaskurin arvo 0 tuntilaskurin arvo 1 tuntilaskurin arvo 1
Vihjeitä ratkaisustrategiaan:
Minuuttilaskuri on laite, joka nappia painaen etenee vuorokauden minuutista toiseen.
Minuuttilaskurin API on
Pääohjelma pikku apulaisineen Minuuttilaskurin kokeilemiseen:
public static void main(String[] args) { Minuuttilaskuri minuuttilaskuri = new Minuuttilaskuri(); tulostaAika(minuuttilaskuri); // testi 1 minuuttilaskuri.etene(); tulostaAika(minuuttilaskuri); // testi 2 // edetään 2 tuntia for (int i = 0; i < 120; i++) { minuuttilaskuri.etene(); } tulostaAika(minuuttilaskuri); // testi 3 // edetään vuorokausi for (int i = 0; i < 24*60; i++) { minuuttilaskuri.etene(); } tulostaAika(minuuttilaskuri); // testi 4 } private static void tulostaAika(Minuuttilaskuri minuuttilaskuri) { System.out.println("minuuttilaskurin arvo " + minuuttilaskuri.getTunti() + ":" + minuuttilaskuri.getMinuutti()); }
Vihjeitä ratkaisustrategiaan: Pääohjelma sisältää neljä testiä
Toteuta aluksi "tyhjä luokka", joka ei tee mitään, mutta "ensimmäinen testi" menee jo läpi:
minuuttilaskurin arvo 0:0 minuuttilaskurin arvo 0:0 minuuttilaskurin arvo 0:0 minuuttilaskurin arvo 0:0
Ohjelmoi minuutit etenemään, toinen testi kuntoon:
minuuttilaskurin arvo 0:0 minuuttilaskurin arvo 0:1 minuuttilaskurin arvo 0:121 minuuttilaskurin arvo 0:1561
Seuraavana askeleena minuutit toimimaan oikein, tunnit edelleen rikki:
minuuttilaskurin arvo 0:0 minuuttilaskurin arvo 0:1 minuuttilaskurin arvo 0:1 minuuttilaskurin arvo 0:1
Lopulta tunnitkin kulkemaan:
minuuttilaskurin arvo 0:0 minuuttilaskurin arvo 0:1 minuuttilaskurin arvo 2:1 minuuttilaskurin arvo 2:1
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.
Sekuntilaskurin API:
Laadi myös sovellus, joka esittelee laskurin käyttöä.
Voit käyttää tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.
Ohjelmoi väline TyomaaraMuunnin
, joka osaa laskea opintopisteiden
"laskennallisen" työmäärän. Yhden opintopisten lasketaan vaativan 27 työtuntia
Saat esittelypääohjelman valmiina, ks. alla. Toteuta siis itse luokka
TyomaaraMuunnin
, joka osaa tehdä mainitun muunnoksen.
Luokassa on konstruktorin lisäksi oltava ainakin toString()
-metodi,
joka palauttaa TyomaaraMuunnin
-olion merkkiesityksen alla olevan
esimerkin mukaisena. Konstruktorille annetaan parametreina kurssin nimi,
opintopistemäärä ja kurssin kesto.
public class OpintopisteetTunneiksi { public static void main(String[] args) { TyomaaraMuunnin ohpe = new TyomaaraMuunnin("Ohjelmoinnin perusteet", 5, 6); TyomaaraMuunnin ohja = new TyomaaraMuunnin("Ohjelmoinnin jatkokurssi", 4, 6); System.out.println(ohpe); System.out.println("---"); System.out.println(ohja); } }
Sijoita pääohjelmaluokka OpintopisteetTunneiksi ja varsinainen työkaluluokka TyomaaraMuunnin samaan hakemistoon. NetBeansin käyttäjät saavat sijoitusneuvoja pajaohjaajilta.
Vaadittu tulostusasu, kun pääohjelmaluokka suoritetaan:
Kurssin Ohjelmoinnin perusteet (5 op) laskennallinen työmäärä: Yhteensä 135 tuntia Viikossa 22.5 tuntia --- Kurssin Ohjelmoinnin jatkokurssi (4 op) laskennallinen työmäärä: Yhteensä 108 tuntia Viikossa 18.0 tuntia
Vihje: Nyt olion on muistettava myös String-tyyppinen arvo. Ohjelmoi siis luokkaan TyomaaraMuunnin kenttä (=ilmentymämuuttuja) tyyliin:
private String kurssinNimi;
Tee luokkaa TyomaaraMuunnin
käyttäen ohjelma, joka kysyy
kurssin nimen, opintopisteet ja keston:
Tämän jälkeen ohjelma tulostaa tiedot standarditulosvirtaan samoin kuin edellisessä tehtävässä:
Kurssin Musiikin historia (10 op) laskennallinen työmäärä: Yhteensä 270 tuntia Viikossa 19.28571429 tuntia
Toteuta oppimateriaalin luokan Varasto
avulla vuorovaikutteinen
eli keskusteleva eli interaktiivinen ohjelma, joka pitää
kirjaa jäljellä olevan kahvin määrästä.
Varastoa käsitellään siis sen luokan tarjoamilla aksessoreilla.
Älä muokkaa luokkaa Varasto
. Voit vaikka ajatella,
että olet ostanut vain luokkatiedoston eli ByteCode-sisältöisen
.class
-tiedoston, eikä käytössäsi edes ole
lähdekielistä versiota.
Koska Varasto-luokan valmis toString()
ei sovellu tähän tehtävään,
ohjelmoi itse apumetodi
private static String tilannetiedotus(Varasto v)
-metodi, joka
palauttaa arvonaan tähän tehtävään soveltuvan merkkiesityksen
kahvilan tilasta. Sitä voit sitten käyttää Pop.ilmoita-metodin
parametrina.
Tässä ohjelmaraakile:
public class AlustavaKahvila { public static void main(String[] args) { Varasto kahvi = new Varasto(3.0, 2.0); int valinta; valinta = Pop.valitseNappula("Kahvila: " + kahvi.getSaldo() + "/" + kahvi.getTilavuus() + " kuppia", "Juo kahvi", "Poistu"); // tänne pääohjelman muu logiikka } private static String tilannetiedotus(Varasto v) { ... } // tänne pääohjelman mahdolliset muut apumetodit }
Ohjelman suoritus voi näyttää seuraavalta. Juodaan ensin pari kuppia:
Kun sitten yritetään vielä juoda:
saadaan ilmoitus:
Ja tällainen ilmoitus saadaan niin pitkään kunnes ymmärretään painaa nappulaa "Poistu". (Tai kun kahvia saadaan lisättyä kahvilaan, ks. seuraava tehtävä.)
Laajenna edellisen tehtävän toteutusta siten, että ohjelmaan tulee uusi toiminto: kahvin keittäminen. Kahvin keittäminen on mahdollista kaikissa ohjelman vaiheissa, mutta kahvia ei voi keittää enempää kuin tilaa on jäljellä.
Valitaan keittäminen ja yritetään keittää enemmän kuin mahtuu:
Keitetään sitten mahtuva määrä:
Luo testiohjelmaasi myös vähän isompi kahvila ja kokeile monipuolisesti kahvin juomista ja keittämistä!
Voit käyttää tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.
Eräs viljavarastotyyppi muodostuu kahdesta viljasiilosta.
Vain ensimmäinen siilo on varustettu lastauslaittein.
Viljaa voidaan siirtää siilosta toiseen.
Viljavaraston varsinaiset viljasäiliöt pitää toteuttaa
käyttäen kurssimateriaalin luokakaa Varasto
.
Ratkotaan tehtävä paloittain: API annetaan paloittain.
Voit ratkoa tehtäväsarjan editoimalla samoja ohjelmatiedostoja
Viljavarasto.java
ja
ViljavarastoEsittely.java
yhä täydellisemmiksi.
API:
Ohjelmoi myös sovellus ViljavarastoEsittely.java
,
joka selkeästi ja kattavasti havainnollistaa Viljavaraston
käyttöä. Älä kuitenkaan vielä tässä kohdassa pyydä
syötteitä käyttäjältä. Kirjoita tuloskset standarditulosvirtaan
Vihje: Tässä siis Viljavaraston piilossa pidettyyn kenttään luodaan Varasto-luokan ilmentymä, Varasto-olio, tyyliin:
public class Viljavarasto { // piilossa pidetty tietoranne: private Varasto siilo; ... // kostruktori: public Viljavarasto(...) { ... siilo = new Varasto(...); ... } ... }
API:
Ohjelmoi myös sovellus ViljavarastoEsittely.java
,
joka selkeästi ja kattavasti havainnollistaa Viljavaraston
käyttöä. Älä kuitenkaan vielä tässä kohdassa pyydä
syötteitä käyttäjältä. Kirjoita tuloskset standarditulosvirtaan
Täydennetään edellisen kohdan API:a vielä parilla tärkeällä lisämetodilla:
maara
on negatiivinen tai
siirto ei onnistunut, muuten se palauttaa arvon true.
Ohjelmoi myös sovellus ViljavarastoEsittely.java
,
joka selkeästi ja kattavasti havainnollistaa Viljavaraston
käyttöä. Älä kuitenkaan vielä tässä kohdassa pyydä
syötteitä käyttäjältä. Kirjoita tuloskset standarditulosvirtaan
Huom: Tätä tehtävää ei voi palauttaa automaatille! Vaikka automaatti viisas onkin, niin viisas se ei ole, että se näin paljon luovuutta sallivan tehtävän osaisi arvioida! ;-)
Laadi sovellus viljavarastomestarille viljavaraston kirjanpitoon. Ohjelma on keskusteleva eli interaktiivinen. Keskustelun yksityiskohdat voit päättää itse. Alla on esimerkkejä/ideoita siitä, miten ja millaisista asioista keskustellaan. Voit ohjelmoida keskustelun toisinkin, jos keksit tyylikkäämpiä tapoja!
Aluksi ohjelma kyselee viljavaraston siilojen vetoisuudet:
Perustoiminnot ovat lisäys, otto, siirto ja lopetus:
Valitaan vaikka lisäys, jolloin ohjelma kysyy:
Tilanne lisäyksen jälkeen:
Valitaan siirto. Ohjelma kysyy siirron suunnan ja määrän:
Voit käyttää tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.
Tämän sarjan tehtävät liittyvät lukuun 2 Oliot ja kapselointi: 23
Tee ohjelma, joka kysyy nimen ja analysoi sen ominaisuuksia seuraavaan tyyliin:
Tee ohjelma, joka kääntää merkkijonon seuraavaan tapaan:
Tee ohjelma, joka selvittää, onko annettu merkkijono palindromi eli sama sana luettuna alusta loppuun ja lopusta alkuun:
Tee ohjelma, joka selvittää, onko annettu lause palindromi eli sama lause luettuna alusta loppuun ja lopusta alkuun. Ohjelman pitää palindromitestissä jättää huomiotta välilyönnit, piste ja pilkku sekä se, onko kirjain iso vai pieni. Esimerkki:
Vihje: Muokkaa syöttömerkkijonosta vertailumerkkijono jättämällä välilyönnit pois ja korvaamalla kaikki isot kirjaimet pienellä seuraavaan tapaan:
String alkuperainen = syötetty lause String vertailtava = ""; käy läpi alkuperaisen kaikki merkit yksi kerrallaan { jos merkki ei ole välilyönti, piste tai pilkku { vertailtava = vertailtava + merkki.toLowerCase() } } tutki vertailtavan palindromisuutta ja ilmoita, onko alkuperäinen lause palindromi