Helsingin yliopisto / Tietojenkäsittelytieteen laitos / 581325-0 Ohjelmoinnin perusteet
Copyright © 2008 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.

3. harjoitukset 16.-19.9.2008

Aiheita: algoritmeja Javalla; kirjoittamista, lukemista, loogisia lausekkeita, toistolauseita, ensimmäiset metodit

  1. Tee vuorovaikutteinen ohjelma Kolmio, joka pyytää kolmion kannan leveyden ja tulostaa "*"-merkeistä muodostuvan kolmion seuraavan esimerkin tapaan. Jos kannan leveys on vaikkapa seitsemän, ohjelma tulostaa:
          *
         **
        ***
       ****
      *****
     ******
    *******
    
    Saat olettaa, että käyttäjä todellakin syöttää tiedon oikean tyyppisenä - kuten saat olettaa kurssin kaikissa tehtävissä, ellei muuta pyydetä. Mutta varaudu kuitenkin siihen että luku on arvoltaan sopimaton: negatiivinen luku ei kelpaa leveydeksi. Virhetilanteessa ohjelman pitää antaa virheilmoitus ja pyytää uutta lukua kunnes saa kelvollisen.

  2. Vuosi on karkausvuosi, jos se on jaollinen 4:llä, mutta ei sadalla. 400:lla jaolliset kuitenkin ovat karkausvuosia, mutta vuosi 4000 ei silti ole karkausvuosi. Laadi vuorovaikutteinen sovellus, joka tulostaa karkausvuodet käyttäjän pyytämältä vuosilukuväliltä. Alku- ja loppuvuoden saa syöttää kummassa tahansa järjestyksessä. Järjestys määrää karkausvuosien tulostamisen nousevassa tai laskevassa Järjestyksessä.

  3. Tee ohjelma, joka ensin lukee kaksi kokonaislukua, alarajan ja ylärajan. Sitten ohjelma lukee syöttölukuja ja kirjoittaa jokaisen välillä alaraja--yläraja olevan syöttöluvun luettuaan ilmoituksen "Tärppäsi!", muiden kohdalla "Ohi meni!". Ohjelman suoritus päättyy, kun tutkittavaksi luvuksi syötetään nolla.

  4. Toteuta seuraava tietokonepeli: Ensin ohjelma arpoo jonkin yksinumeroisen kokonaisluvun 0, 1, 2, ..., 9 paljastamatta sitä ohjelman käyttäjälle. Sitten käyttäjä syöttää ohjelmalle kolme arvausta siitä, minkä luvun ohjelma on arponut.

    Lopuksi ohjelma selvittää ja ilmoittaa pelin tuloksen:

    Mikään ei estä kayttäjää syöttämästä eli arvaamasta samaa lukua useampaankin kertaan; tällöin sekä riski hävitä että mahdollinen voitto kasvavat.

    Tehtävän ratkaisuksi riittää toteuttaa yhden luvun arvaaminen, ts. yksi pelikerta.

    Satunnaisluvun väliltä 0-9 saa arvottua seuraavasti:

       int koneenLuku = (int)(10*Math.random());
    
    (Ei tuota lauseketta vielä tarvitse ymmärtää, kunhan vaan käyttää...)

    Toteuta tämä "käyttäjän kannalta kriittinen uhkapeliohjelma" siten, että virheellisiin syöttötietoihin varaudutaan. Syöttötiedot voivat tässä tapauksessa olla virheellisiä kahdella periaatteessa erilaisella tavalla:

    1. Tiedot eivät ole kokonaislukuja, ehkä eivät numeerisia lainkaan.
    2. Tiedot ovat kokonaislukuja, mutta väärän kokoisia.

    Ohjelman pitää virhetilanteessa antaa virheilmoitus ja pyytää uusia lukuja kunnes saa kelvolliset.

  5. Ohjelmoi seuraavat metodit. (Tällaisia metodeja kutsutaan luokkametodeiksi eli "staattisiksi metodeiksi". Tällaista luokkametodien käyttötapaa voitaisiin kutsua "pikku apulaisten" laatimiseksi pääohjelmalle. Tapa on hyvin perinteinen, mutta silti vielä paljon käytetty. Muita metodien käyttötapoja opitaan pian.)

    1. private static void kirjoitaLuettuRiviTuplana()
      lukee yhden syöttörivin ja tulostaa tuon rivin kahteen kertaan yhdelle tulostusriville
    2. private static String luettuTuplanaa()
      lukee yhden syöttörivin ja palauttaa arvonaan tuon rivin katenoituna (eli yhteenliitettynä) itsensä kanssa
    3. private static void kirjoitaLukuKerrottuna(int luku, int kertoja)
      tulostaa parametrina annetun kokonaisluvun kerrottuna parametrina annetulla kertojalla
    4. private static int kerro(int luku, int kertoja)
      palauttaa arvonaan parametrina annetun kokonaisluvun kerrottuna parametrina annetulla kertojalla

    5. private static double minimi(double eka, double toka)
      palauttaa arvonaan pienemmän double-parametreista; jos parametrit ovat yhtä suuret palautetaan kumpi vain
    6. private static boolean suurempi(int eka, int toka)
      palauttaa arvonaan true, jos kahdesta parametrista ensimmäinen on suurempi kuin toinen, muuten metodi palauttaa arvon false.

    Sijoita metodit johonkin luokkaan ja ohjelmoi myös pääohjelma, joka havainnollistaa metodien käyttöä.


Takaisin harjoitussivulle.