(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.
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
).
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.
Tässä kohdassa muokataan ensimmäisten harjoitusten Scala-ohjelmia Java-ohjelmiksi.
Ohjelma pyytää kaksi kokonaislukua ja ilmoittaa näiden summan.
Anna ensimmäinen luku: 6 Anna toinen luku: 2 Niiden summa on 8
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
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?
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
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
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:
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.
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.
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.
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.
Ohjelmassasi on taulukko, jossa on arvoja. Ohjelma kysyy käyttäjältä lukua ja selvittää, onko luku taulukossa.
Arvaa luku: 84 Löytyy!
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.
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.
Tee edellisen tehtävän metodia käyttäen ohjelma, joka tulostaa useampia kuusia alekkain.
Motakako kuusta tavitset? 2 * *** ***** ******* ********* * * *** ***** ******* ********* *
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
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
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
Ohjelmoi tämän tehtäväkokonaisuuden osat samaan projektiin!
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:
****
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
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.
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!
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.
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!
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.
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:
private static onkoLukuTaulukossa(int luku, int[] taulukko)
private static int lueLukuValilta(int min, int max)
,
lukee käyttäjältä syötettä niin kauan kunnes syöte on annetulla välillä
käyttö: int luku = lueLukuValilta(alaraja, ylaraja)
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.