Helsingin yliopisto / Tietojenkäsittelytieteen laitos / 581325-0 Ohjelmoinnin perusteet
Copyright © 2006 Arto Wikla. Tämän oppimateriaalin käyttö on sallittu vain yksityishenkilöille opiskelutarkoituksissa. Materiaalin käyttö muihin tarkoituksiin, kuten kaupallisilla tai muilla kursseilla, on kielletty.

5. harjoitukset 2.-6.10.2006

Aiheita: ... ja lisää olioita ja kapselointia ...

  1. 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:

    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?

  2. Laivalla on suunta 0...359 astetta ja nopeus 0.0...40.0 solmua. Toteuta laiva luokkana Laiva:

    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.

  3. Laadi edellisen tehtävän luokkaa käyttäen sovellus Laivuri, jolla voi "ohjata laivaa". Laivaa ohjataan näppäimistöltä seuraavasti:

    Ohjelma tulostaa joka operaation jälkeen laivan tilan. Tässä tehtävässä ei tarvitse varautua numeeristen syötteiden ei-numeerisuuteen.

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

    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?

  5. Kyselija on olio, "laite", joka helpottaa tietokilpailun kysymysten tekemistä ja vastausten analysointia. Sen "API" on seuraavanlainen:

    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.


Takaisin harjoitussivulle.