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

Ohpe-harjoitukset s2011: 2/6 (12.-16.9.)

(Muutettu viimeksi 15.9.2011, sivu perustettu 25.8.2011.)

Toisen viikon harjoitukset liittyvät oppimateriaalin lukuihin 1 Algoritmeja: 18-23.

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:

Toistoa – while ja do-while

Tässä harjoitellaan pääasiassa oppimateriaalin kohtaa 1 Algoritmeja: aliluvut 18-20.

ParittomatAlleSadan.java

Ohjelma tulostaa 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. Tulosta metodilla System.out.println eli tulosta ns. standarditulosvirtaan.

1
3
5
7
...
99

AlasSadasta.java

Tulosta luvut 1-100 laskevassa järjestyksessä

Käytä tässä tehtävässä while-lausetta ja muuttujaa, joka askeltaa alaspäin. Tulosta metodilla System.out.println.

100
99
...
2
1

YkkosestaRajaan.java

Tulosta lukuvut ykkösestä alkaen annettuun rajaan saakka. Kysy raja ponnahdusikkunalla ja tulosta metodilla System.out.println.

kuva

1
2
3
4
5
6

ParillisetYkkosestaRajaan.java

Tulosta parilliset luvut annettuun rajaan asti Kysy raja ponnahdusikkunalla ja tulosta metodilla System.out.println.

kuva

2
4
6
8
10 

LukujenVali.java

Kirjoita ohjelma, joka kysyy käyttäjältä ensimmäisen ja viimeisen luvun ja tulostaa ne ja niiden välissä olevat luvut. Käyttäjä voi antaa ensin pienemmän luvun ja sitten suuremman luvun tai päinvastoin.

kuva kuva

Tulostus standarditulosvirtaan:

5
6
7
8

kuva kuva

Tulostus standarditulosvirtaan:

16
15
14
13
12

VuodenKuukaudet.java

Tee ohjelma, joka kysyy kuukauden numeron ponnahdusikkunan avulla ja tulostaa seuraavien 12 kuukauden numerot standarditulosvirtaan metodeilla System.out.println ja System.out.print:

kuva

Seuraavat 12 kuukautta ovat:
10 11 12 1 2 3 4 5 6 7 8 9

VarmistaIka.java

Ohjelma kysyy käyttäjän ikää niin kauan, kun käyttäjä ei ymmärrä antaa ikää, joka on väilliä 0-130. Käytä toistolausetta, jonka ehtona on syötetyn iän tarkistus.

Liian suuri:

kuva kuva

Liian pieni:

kuva kuva

Osui:

kuva kuva

Matematiikkaa

Käytä tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.

Myös tässä harjoitellaan pääasiassa oppimateriaalin kohtaa 1 Algoritmeja: aliluvut 18-20.

Toteuta tämän sarjan tehtävät ponnahdusikkunoin. Päätä itse ohjelman nimi ja ikkunoiden sisällön yksityiskohdat.

Summa 1+2+3+...+n

Tee ohjelma, joka laskee summan 1+2+3+...+n, missä n on käyttäjän syöttämä luku.

Jos käyttäjä esimerkiksi antaa luvun 3, ohjelma tulostaa ikkunan, jossa on 6, koska 1+2+3=6. Ja jos käyttäjä antaa vaikkapa luvun 7 ohjelma tulostaa 28 koska 1+2+3+4+5+6+7=28.

Summa alku+...+loppu

Muokkaa edellistä tehtävää siten, että käyttäjä määrää myös summan laskemisen aloituskohdan. Saat olettaa, että käyttäjä antaa ensin pienemmän luvun ja sitten suuremman luvun.

Jos käyttäjä syöttää vaikkapa luvut 3 ja 5, ohjelma tulostaa ikkunan, jossa on 12, koska 3+4+5=12.

Kertoma

Tee ohjelma, joka laskee luvun n kertoman. Kertoma n! lasketaan kaavalla 1*2*3*...*n. Esimerkiksi 4! = 1*2*3*4 = 24. Lisäksi on määritelty, että 0! = 1.

Jos käyttäjä syöttää vaikkapa luvun 4, ohjelma tulostaa ikkunan, jossa on 24, koska 1*2*3*4=24.

Tähdellistä

Käytä tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.

Edelleen harjoitellaan pääasiassa oppimateriaalin kohtaa 1 Algoritmeja: aliluvut 18-20.

Harjoitellaan toistolauseita ja merkkien tulostamista. Muista että System.out.print("*"); tulostaa yhden tähden vaihtamatta riviä! Niinpä seuraava samanlainen lause tulostaa tähden edellisen perään. Muista myös, että System.out.println(); tulostaa (eli aiheuttaa) pelkän rivinvaihdon.

Nämä ohjelmat kyselevät tietoja ponnahdusikkunoin ja tulostavat standarditulosvirtaan.

Tahtirivi.java

Ohjelma tulostaa käyttäjän pyytämän määrän tähtiä.

kuva

Tulostus:

*****

kuva

Tulostus:

********

TahtiKulmio.java

Ohjelma tulostaa tähtisuorakulmion, jonka leveyden ja korkeuden käyttäjä antaa.

kuva kuva

Tulostus:

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

kuva kuva

Tulostus:

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

TahtiPortaikko.java

Ohjelma tulostaa tähtiportaikon, jonka korkeuden käyttäjä antaa.

kuva

Tulostus:

*
**
***

kuva

Tulostus:

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

TahtiKuusi.java

Ohjelma tulostaa tähtikuusen, jonka korkeuden käyttäjä antaa. Muista miten System.out.print(" "); tulostaa yhden välilyönnin vaihtamatta riviä.

kuva

Tulostus:

  *
 ***
*****
  *

kuva

Tulostus:

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

Vaihteleva määrä syötteitä

Käytä tämän tehtäväsarjan toimittamiseen palautusautomaattia! Ohje sivun alussa.

Tässä harjoitellaan pääasiassa oppimateriaalin kohtaa 1 Algoritmeja: aliluvut 18-23.

LueJaHukkaa.java

Tee ohjelma, joka kysyy ponnahdusikkunan avulla käyttäjältä kokonaislukuja, kunnes käyttäjä antaa luvun 0. Kun käyttäjä syöttää luvun 0, ohjelma tulostaa "Kiitos ja näkemiin!" ja päättyy.

kuva kuva

Käyttäjä antaa vielä vaikkapa viisi lukua ja lopuksi nollan:

kuva

Ohjelma toteaa:

kuva

Lukumaara.java

Laajenna edellistä ohjelmaa siten, että ohjelma ilmoittaa käyttäjän syöttämien lukujen lukumäärän. Lopetusnollaa ei lasketa mukaan lukumäärään.

Syötteet annetaan kuin edellä. Lopuksi ohjelma ilmoittaa:

kuva

SummaJaLukumaara.java

Laajenna edellistä ohjelmaa siten, että ohjelma laskee ja ilmoittaa lukujen lukumäärän lisäksi lukujen summan.

Syötteet annetaan kuin edellä. Lopuksi ohjelma ilmoittaa:

kuva

NegPosLkm.java

Negatiivisten ja positiivisten kokonaislukujen määrä: Ohjelma pyytää käyttäjältä kokonaislukuja. Luku nolla ilmaisee, että syöttöluvut loppuivat. Ohjelman tehtävänä on laskea syötteen positiivisten ja negatiivisten lukujen lukumäärä:

kuva kuva kuva kuva

Vihje: Käytä yhtä muuttujaa laskemaan positiivisten lukumäärää ja toista negatiivisten.


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


Pienin ja suurin syöttöluku

Ohjelma pyytää käyttäjältä kokonaislukuja. Luku nolla ilmaisee, että syöttöluvut loppuivat. Ohjelman tehtävänä on selvittää ja tulostaa arvoltaan pienin ja arvoltaan suurin syöttöluku. Ohjelma keskustelee käyttäjän kanssa edellisen tehtävän tapaan.

Vihje: Laadi ohjelma vaiheittain: Tee ensin versio, joka etsii suurimman syöttöluvun ja laajenna sitten ohjelma löytämään myös pienin.

Vihje: Käytä jotain muuttujaa, joka muistaa jo luetuista luvuista "toistaiseksi suurimman", ja jos luetaan vieläkin suurempi luku, vaihda tuon muuttujan arvo vastaamaan muuttunutta tilannetta.

Huomaa että nolla on nyt erikoistapaus, se ei tässä tehtävässä ole "suurin" eikä "pienin". Jos heti syötetään nolla, ohjelma ilmoittaa, että lukuja ei ollut. Jos syötetään vain yksi luku ja sen jälkeen heti nolla, tuo ainoa syöttöluku on sekä pienin että suurin.

Keskiarvo

Laadi ohjelma, jolla voi laskea ei negatiivisten liukulukujen keskiarvon. Lukujen määrää ei tiedetä ennalta. Ensimmäinen syötetty negatiivinen luku on loppumerkki. Loppumerkkiä ei saa laskea mukaan keskiarvoon. Ohjelman on toimittava myös, jos ensimmäisenä syötetään negatiivinen luku. Se tarkoittaa ettei syötetäkään ensimmäistäkään varsinaista syöttölukua. Ohjelma keskustelee käyttäjän kanssa ponnahdusikkunoin. Suunnittele yksityiskohdat itse.

Tietokonepeli: alaraja ja yläraja

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 "Osui!", muiden kohdalla "Huti!". Ohjelman suoritus päättyy, kun luvuksi syötetään nolla. Lopuksi ohjelma tulostaa tilaston osumista.

kuva kuva kuva kuva kuva kuva kuva kuva

Ponnahduksia

Tässä harjoitellaan pääasiassa oppimateriaalin kohtaa 1 Algoritmeja: aliluku 21.

KivPapSaksYlivoimainen.java

Kivi-paperi-sakset-pelissä on kaksi pelaajaa. Kumpikin valitsee yhtä aikaa yhden noista kolmesta vaihtoehdosta. Kivi voittaa sakset, sakset voittavat paperin, paperi voittaa kiven. Toteuta peli siten, ettei tietokonetta voi voittaa, se valitsee aina voittajavaihtoehdon. (On kyllä aika epäreilua, että kone saa tehdä valintansa tietäen ihmisen vastauksen!)

Ohjelma kysyy:

kuva

Vastauksesta riippuen ohjelma vastaa:

kuva kuva kuva

Varaudu myös siihen, että ohjelman käyttäjä keskeyttää vastaamisen ikkunan nurkan rastilla.

KivPapSaksReilu.java

Java-kirjaston työkalu Math.random() palauttaa arvonaan double-tyyppisen satunnaisluvun puoliavoimelta väliltä [0, 1). Tämä tarkoittaa, että nollakin voi tulla, mutta tasan yksi ei enää ole mahdollinen.

Esimerkiksi seuraavalla logiikalla voi toteuttaa arvonnan kolmen vaihtoehdon välillä:

double arvottuLuku = Math.random();
if (arvottuLuku < 1.0/3.0)
  // 1. vaihtoehto
else if (arvottuLuku < 2.0/3.0)
  // 2. vaihtoehto
else
  // 3. vaihtoehto

Muokkaa edellisen tehtävän ärsyttävän ylivoimaisesta kivi-paperi-sakset-pelistä reilu versio. Tietokone siis arpoo oman vastauksensa ja ilmoittaa tuloksen, joka voi nyt olla "Voitit!" ja "Voitin!"

Huom: Tämän tehtävän vihjeissä oli mielenkiintoisia ja opettavaisia mokia!

KivPapSaksTurnaus.java

Muokkaa edellisen tehtävän kivi-paperi-sakset-peli sellaiseksi, että sillä voi pelata monta kierrosta:

Peruskysymys on nyt:

kuva

Kun peli loppuu, ohjelma näyttää tulostilaston:

kuva

Vuodenaika.java

Ohjelma kysyy kuukauden ja vastaa kertomalla, mikä vuodenaika on:

kuva

Valitaan elokuu:

kuva

Varaudu myös siihen, että ohjelman käyttäjä keskeyttää vastaamisen Cancel-nappulalla tai ikkunan nurkan rastilla.

KuukaudessaPaivia.java

Ohjelmalla voi selvittää, montako päivää annetussa kuukaudessa on. Jos kysytään helmikuun päivälukumäärää, ohjelma tarvitsee tiedon myös vuosiluvusta voidakseen ottaa karkausvuodet huomioon. Muokkaa ohjelma edellisestä! Myös karkausvuoden toteaminen on jo ohjelmoitu. Käytä hyväksesi!

kuva

Tässä tapauksessa ohjelman pitää tietää myös vuosiluku:

kuva

Lopputulos:

kuva