Oppimateriaali perustuu kevään 2010 kurssiversion materiaaliin ja Arto Wiklan ohjelmointisivustoon. Materiaalin copyright © (aakkosjärjestyksessä): Matti Luukkainen, Matti Paksula, Arto Vihavainen, Arto Wikla. Materiaalia saa vapaasti käyttää itseopiskeluun. Muu käyttö vaatii luvan.

Ohpe-harjoitukset s2010: 3/6 (20.24.9)

(Muutettu viimeksi 19.9.2010, sivu perustettu 13.9.2010.)

Nämä harjoitukset liittyvät oppimateriaalin lukuun II Algoritmeja Javalla, ohjelmointiympäristö.

Harjoitustehtävien otsikoilla on värikoodaus: Vihreät tehtävät on syytä tehdä joka tapauksessa. Värittämättömiä ei ole ihan pakko tehdä, mutta nekin ovat hyvin hyödyllisiä ja myös vaikuttavat pisteisiin. Keltaiset tehtävät ovat vähän haastavampia. Nekin lasketaan mukaan harjoituspisteitä määrättäessä, mutta ilmankin niitä harjoituksista voi saada maksimipisteet.

Huom: Jokaisen ohjelmatiedoston alkuun on kirjoitettava kommenttina harjoituskerta, tehtävän numero ja tekijän nimi tyyliin:

// 3. harjoitukset, tehtävä 3.2, Oili Opiskelija

Huom: Nimeä tiedostot tehtävän otsikon mainitsemalla nimellä.

Huom: Ohjelmia tehdään tästä lähtien pääasiassa NetBeans-ohjelmalla. Jokaiselle tehtävälle kannattaa tehdä oma projekti. Toisiinsa liittyvät tehtävät on kuitenkin hyvä tehdän saman projektin alle. Kurssimateriaalissa on lyhyt ohje NetBeansin käyttöön. Lue ohje ja yritä toimia sen mukaan. Harjoitusten ohjaajat neuvovat eteenpäin.

Ohjelman kirjoitus ja suoritus

Nimeni.java

Tee Java-ohjelma, joka kirjoittaa nimesi näytölle. Editoi tekstitiedostoa ja suorita ohjelma perinteiseen tapaan ensin kääntämällä Java-ohjelma välikielelle Java-kääntäjällä (javac Nimeni.java) ja sitten suorittamalla välikielinen ohjelma Java-tulkilla (java Nimeni).

Nimeni.java

Tee Java-ohjelma, joka kirjoittaa nimesi näytölle. Käytä NetBeans-ohjelmankehitysympäristöä.

Netbeans-download. Tarjolla olevista versioista sekä "Java SE" että "Java" ovat hyviä. Asennuksen pitäisi toimia ainakin Windowsissa "one click"-periaatteella.

Scalasta Javaan 1

Tässä kohdassa muokataan ensimmäisten harjoitusten Scala-ohjelmia Java-ohjelmiksi.

Summaaja.java

Ohjelma pyytää kaksi kokonaislukua ja ilmoittaa näiden summan.

Anna ensimmäinen luku: 6
Anna toinen luku: 2
Niiden summa on 8

Jako.java

Ohjelma pyytää kaksi kokonaislukua ja jakaa ensimmäisen toisella. Varmista, että 3 / 2 = 1.5

Anna ensimmäinen luku: 3
Anna toinen luku: 2
3/2 = 1.5

KumpiSuurempi.java

Anna ensimmäinen luku: 8
Anna toinen luku: 3
8 on suurempi kuin 3

Entä jos luvut ovat yhtä suuret? Miten ohjelman tulisi tässä tilanteessa toimia?

ParitonVaiParillinen.java

Vihje: parillisen luvun jakojäännös on 0, kun jaetaan luvulla 2.

Anna luku: 2
Luku 2 on parillinen
Anna luku: 7
Luku 7 on pariton

Parittomat_1_99.java

Tulosta parittomat luvut väliltä 1-99 nousevassa järjestyksessä. Käytä tässä tehtävässä while-lausetta ja muuttujaa, joka askeltaa kahden välein.

1
3
5
7
...
99

NegatJaPosit.java

Ohjelma laskee negatiivisten ja positiivisten kokonaislukujen määrän.

Anna kokonaislukuja, 0 lopettaa:

Anna luku: 3
Anna luku: -3
Anna luku: 8
Anna luku: 2
Anna luku: 0

Positiivisia 3
Negatiivisia 1

Tärkeitä vihjeitä tähän ja muihinkin tehtäviin:

PieninJaSuurinSyote.java

Ohjelma etsii pienimmän ja suurimman syöttöluvun:

Anna kokonaislukuja, 0 lopettaa:

8
92
2
-7
32
0

Suurin luku oli 92, pienin luku oli -7.

Huomaa että nolla on nyt erikoistapaus, se ei tässä tehtävässä ole "suurin" eikä "pienin". Ohjelman toivottu toiminta erikoitapauksissa:

Anna kokonaislukuja, 0 lopettaa:

0

Ei lukuja!

Anna kokonaislukuja, 0 lopettaa:

87
0

Suurin luku oli 87, pienin luku oli 87.

Scalasta Javaan 2

Tässä kohdassa muokataan toisten harjoitusten Scala-ohjelmia Java-ohjelmiksi.

Kolmen ensimmäisen tehtävän esimerkkitulostuksissa käyteään taulukkoa int[] taulukko = {5,11,3,84,2}; Laadi ohjelmat kuitenkin sellaisina, että ne toimivat kaiken kokoisilla taulukoilla. Kokeile siis muitakin kuin esimerkkitaulukkoa. Vaihda tässä vaiheessa vain taulukon määrittelyä ohjelmassasi. Arvojen lukeminen taulukkoon aloitetaan vasta tehtävässä 3.4.

AlkioidenSumma.java

Tee ohjelma, joka tulostaa taulukon alkiot ja alkoiden summan.

Taulukon alkiot:
5
11
3
84
2
Summa: 105

Vaatimus: Tee ohjelmasta versio, joka käyttää tavallista for-lausetta ja versio käyttäen "for-each"-toistoa.

Pilkkutulostus.java

Tulosta taulukon alkiot tyylikkäästi siten, että niiden väliin tulee pilkku ja välilyönti. Huomaa, että lauseen lopussa ei saa olla pilkkua, siellähän on piste!

Taulukon alkiot ovat 5, 11, 3, 84, 2.

OnkoLukuTaulukossa.java

Ohjelmassasi on taulukko, jossa on arvoja. Ohjelma kysyy käyttäjältä lukua ja selvittää, onko luku taulukossa.

Arvaa luku: 84
Löytyy!

OnnitteleTasavuotisia.java

Merkkijonotalukko ja kokonaislukutaulukko rinta rinnan, kurssimateriaalissa on esimerkki:

String[] henkilot = {"Matti", "Maija", "Pekka", "Liisa"};
int[]    ika      = {   29,      22,     19,       27};
//...

Tee ohjelma, joka tällaisessa tietorakenteessa kasvattaa jokaisen henkilön ikää yhdellä ja onnittelee jokaista, joka täyttää tasavuosia.

Metodeita

Kuusi.java

Tee metodi private static void kuusi(), joka tulostaa vakiokokoisen kuusen.

Tarvitset myös pääohjelman eli main-metodin, joka kutsuu kuusi-metodia. Pääohjelma ja kuusi-metodi sijoitetaan sopivasti nimettyyn luokkaan (eli "ohjelmarunkoon"). Mallia löytyy luvusta II kappaleesta 16. Näissä tehtävissä voit käyttää luokan nimenä tehtävän otsikkoa.

    *
   ***
  *****
 *******
*********
    *

Huom: Vaikka tehtävässä pyydettäisiin vain metodin ohjelmointia, tästä lähtien kaikki tehtävat on toteutettava toimivina ohjelmina, joissa pääohjelma esittelee metodin käyttöä, ellei muita ohjeita anneta.

Kuusimetsa.java

Tee edellisen tehtävän metodia käyttäen ohjelma, joka tulostaa useampia kuusia alekkain.

Motakako kuusta tavitset? 2

    *
   ***
  *****
 *******
*********
    *

    *
   ***
  *****
 *******
*********
    *

Jakaja.java

Ohjelmoi metodi private static void jaonTulos(...), joka tulostaa jakolaskun seuraavan esimerkin mukaisesti. Metodi saa jaettavat kokonaisluvut parametreina.

128 / 8 = 16.0
5 / 3 = 1.66666666666667

YmpyranKeha.java

Tee metodi private static double keha(...), joka palauttaa arvonaan ympyrän kehän (piirin) pituuden. Säde annetaan double-parametrina. Piin mahdollisimman tarkan double-arvon saat kirjastosta: Math.PI. Niin, se kaava taisi olla "kaks'pii'är"...

Anna ympyrän säde: 20
Ympyrän kehä on: 125.663706143592

Viisilaskin.java

Tee viisi metodia, jotka suorittavat laskuoperaatiot ja palauttavat lopputuloksen.

1. luku? 3
2. luku? 2

3 + 2 = 5
3 - 2 = 1
3 * 2 = 6 
3 / 2 = 1.5
3 % 2 = 1

Arvosanajakauma ohjelmoituna pala palalta

Ohjelmoi tämän tehtäväkokonaisuuden osat samaan projektiin!

Tähtiä

Laadi metodi private static void tulostaTahdet(int lkm) joka tulostaa parametrina saamansa määrän tähtiä peräkkäin. Kun kutsutaan vaikkapa tulostaTahdet(4); tulostuu:

****

LueArvosanatJaTulosta.java

Tee ohjelma, jolle opettaja syöttää joukon arvosanojen lukumääriä. Ohjelma sijoittaa määrät taulukkoon int[] arvosanat = new int[6];. Ohjelman suoritus näyttää seuraavalta:

Anna arvosanojen lukumäärät!

Hylättyjä: 3
1: 3
2: 7
3: 2
4: 7
5: 10

Ohjelma tulostaa taulukon sisällön, jotta voidaan varmistua, että arvosanat todella menivät taulukkoon. Esimerkissä tulostus siis on:

3
7
2
7
10

Prosentteja

Ohjelmoi metodi private static double hyvaksymisprosentti(int[] arvosanajakauma) , jonka avulla arvosanat sisältävästä tulostaulukosta selvitetään hyväksymisprosentti. Esim. edellisen tehtävän esimerkkisyötteessä prosentti on 90.625.

Arvosanajakauma.java

Viimeistele arvosanajakauman tulostusohjelma toimimaan seuraavasti:

Anna arvosanojen lukumäärät!

Hylättyjä: 3
1: 3
2: 7
3: 2
4: 7
5: 10

Kurssin arvosanajakauma:

5: **********
4: *******
3: **
2: *******
1: ***
-: ***

Hyväksyttyjä 90.625 % osallistujista

Huom: Tähtien tulostamiseen ja hyväksymisprosentin laskentaan käytetään edellisten kohtien välineita!

YksiArvosana.java

Toteuta metodi private static int maaritteleArvosana(int pisteet), jolle annetaan pisteet ja joka palauttaa pisteitä vastaavan arvosanan. Metodi ei siis itse tulosta mitään, kunhan vain laskee. Pääohjelma hoitaa keskustelut. Arvosana lasketaan seuraavasti: 30-34 pistettä: 1, 35-39: 2, 40-44: 3, 45-49: 4, 50-60 : 5 ja alle 30 pistettä on hylätty.

Anna pisteet [0-60]: 46
Arvosanaksi 46 pisteellä tulee 4.	

Tuloslaskenta.java

Kehittele tehtävän 4.4 ohjelmasta lopulta "ihan oikea" palvelu: Aluksi opettaja syöttää opiskelijoiden koepistemäärät. Syötetty koepistemäärä muutetaan vastaavaksi arvosanaksi tehtävän 5.5 metodilla. Näin selvitetyt arvosanat talletetaan taulukkoon. Tee kurssin nimen ja arvosanataulukon parametrina saava metodi
private static void tulostaArvosanajakauma(int[] arvosanat, String kurssinNimi),
joka tulostaa kurssin arvosanajakauman.

Esimerkkisuoritus:

Anna kurssin nimi: 
Ohjelmoinnin perusteet

Syötä opiskelijoiden koepistemäärät. Lopetus -1:llä.

44
35
17
56
7
...
54
-1

Kiitos.

Kurssin Ohjelmoinnin perusteet arvosanajakauma

5: **********
4: *******
3: **
2: *******
1: ***
0: ***

Hyväksyttyjä 90.625 % osallistujista

Huomaa miten tässä monimutkainen ongelma ratkottiin pienempinä osaongelmina, jotka saatettiin yksi kerrallaan toimintakuntoon. Ohjelmointiongelmia kannattaa useimmiten lähestyä juuri tähän tyyliin!

Ja aina vaan lisää töitä...

KorkeaKuusi.java

Tee vuorovaikutteinen eli keskusteleva ohjelma KorkeaKuusi, joka pyytää kuusen korkeuden ja tulostaa "*"-merkeistä muodostuvan kuusen seuraavien esimerkin tapaan. Kuusen tulostus tapahtuu sitä varten tehdyn metodin avulla. Ei-positiivinen korkeus päättää ohjelman suorituksen.

Anna korkeus: 6

     *
    ***
   *****
  *******
 *********
***********
     *

Anna korkeus: 3

  *
 ***
*****
  *

Anna korkeus: 1

*
*

Anna korkeus: 0
Se sitten siitä!

Tehtävä ei ole helppo. Mieti ongelmaa ensin kynän ja paperin kanssa. Kuusen tulostava metodi kannattanee toteuttaa siten, että se kutsuu erillistä apumetodia, joka tulostaa yhden kuusen "tason", eli ensin *, sitten ***, jne. sekä tasoon liittyvät sisennykset.

Arvauspeli.java

Toisen viikon arvauspeli oli seuraavanlainen:

Ensin ohjelma pyytää syötettävien lukujen määrän pelinjohtajalta ja sitten itse luvut. Sovitaan että tässä pelissä sallittuja ovat vain luvut 1–21, muut hylätään. Sama luku saa esiintyä useampaankin kertaan.

Tämän jälkeen pelaaja istuu koneen ääreen ja peli alkaa. Pelaaja yrittää arvata koneelle syötettyjä lukuja. Peli päättyy, kun pelaaja arvaa jonkin pelinjohtajan syöttämistä luvuista, ja tulos on tarvittujen arvauskertojen lukumäärä. Pelin realistisuuden kannalta voi olla hyvä idea, että pelinjohtajan syötettyä arvattavat luvut ohjelma tulostaa riittävästi tyhjiä rivejä, jotta luvut eivät paljastu pelaajalle!

Laadi ohjelmoinnin avuksi ainakin metodit:

Montako arvattavaa lukua annat?
6
Syötä arvattavat luvut. Sallittuja ovat 1, 2, 3, ..., 21.
1. luku: 11
2. luku: 17
3. luku: 6
4. luku: 23
Ei kelpaa! Sallittuja ovat 1, 2, 3, ..., 21.
4. luku: 8
5. luku: 12
6. luku: 17

              ... tähän sitten niitä tyhjiä rivejä ...

Arvauspeli (lukuja on 6 kappaletta)
**********

Arvaa luku väliltä 1-21!
4
Ei löydy!

Arvaa luku väliltä 1-21!
101
Ei tietenkään löydy! Oletko hölmö?

Arvaa luku väliltä 1-21!
-666
Ei tietenkään löydy! Oletko hölmö?

Arvaa luku väliltä 1-21!
18
Ei löydy! 

Arvaa luku väliltä 1-21!
12
Jo löytyi!
Tuloksesi on 5 arvausta.