Arto Wikla 2011. Materiaalia saa vapaasti käyttää itseopiskeluun. Muu käyttö vaatii luvan.

Ohpe-harjoitukset s2011: 4/6 (26.-30.9.)

(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:

Aikalaskureita

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.java

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:

  1. Toteuta aluksi Tuntilaskuri siten, että metodi etene() on tyhjä eli pelkkä { } ja metodi getTunti() palauttaa aina vain nollan {return 0;}.
  2. Lisää sitten kenttä tuntien laskentaa varten.
  3. Muokkaa getTunti() palauttamaan kentän arvo.
  4. Opeta etene() kasvattamaan kentän arvoa yhdellä.
  5. Lopuksi täydennä etene() osaamaan edetä 23:sta nollaan.

Minuuttilaskuri.java

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ä

  1. aika tulostuu alussa oikein
  2. aika tulostuu minuutin etenemisen jälkeen oikein
  3. aika tulostuu oikein kun yli tunti on kulunut
  4. aika tulostuu oikein kun yli vuorokausi on kulunut

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.java

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öä.

Opintopistelaskuri

Voit käyttää tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.

TyomaaraMuunnin.java (ja OpintopisteetTunneiksi.java)

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;

TyomaaraLaskin.java

Tee luokkaa TyomaaraMuunnin käyttäen ohjelma, joka kysyy kurssin nimen, opintopisteet ja keston:

kuva kuva kuva

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

Varaston käyttöä

AlustavaKahvila.java

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:

kuva kuva

Kun sitten yritetään vielä juoda:

kuva

saadaan ilmoitus:

kuva

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ä.)

Kahvila.java

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ä.

kuva

Valitaan keittäminen ja yritetään keittää enemmän kuin mahtuu:

kuva kuva

Keitetään sitten mahtuva määrä:

kuva kuva kuva

Luo testiohjelmaasi myös vähän isompi kahvila ja kokeile monipuolisesti kahvin juomista ja keittämistä!

Viljavarasto.java

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.

... yksipyttyinen ...

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(...);
    ...
  }
  ...
}

... kaksipyttyinen vajaana ...

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

... kaksipyttyinen ...

Täydennetään edellisen kohdan API:a vielä parilla tärkeällä lisämetodilla:

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

Viljavarastomestari.java

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:

kuva kuva

Perustoiminnot ovat lisäys, otto, siirto ja lopetus:

kuva

Valitaan vaikka lisäys, jolloin ohjelma kysyy:

kuva

Tilanne lisäyksen jälkeen:

kuva

Valitaan siirto. Ohjelma kysyy siirron suunnan ja määrän:

kuva kuva

kuva

String-aksessorien käyttöä

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

Nimianalyysi.java

Tee ohjelma, joka kysyy nimen ja analysoi sen ominaisuuksia seuraavaan tyyliin:

kuva kuva kuva kuva

Kaantaja.java

Tee ohjelma, joka kääntää merkkijonon seuraavaan tapaan:

kuva kuva kuva kuva

OnkoPalindromi.java

Tee ohjelma, joka selvittää, onko annettu merkkijono palindromi eli sama sana luettuna alusta loppuun ja lopusta alkuun:

kuva kuva kuva kuva

Palindromitesti.java

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:

kuva kuva kuva kuva

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