Ohjelmoinnin perusteet (Java)

Samankaltaiset tiedostot
Ohjelmoinnin peruskurssi Y1

Ohjelmassa on käytettävä funktiota laskeparkkimaksu laskemaan kunkin asiakkaan maksu. Funktio floor pyöristää luvun lähimmäksi kokonaisluvuksi.

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Tietorakenteet (syksy 2013)

Java-kielen perusteet

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3

Tietuetyypin määrittely toteutetaan C-kielessä struct-rakenteena seuraavalla tavalla:

Java-kielen perusteet

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Metropolia ammattikorkeakoulu TI00AA : Ohjelmointi Kotitehtävät 3 opettaja: Pasi Ranne

7. Näytölle tulostaminen 7.1

Kirjoita, tallenna, käännä ja suorita alla esitelty ohjelma, joka tervehtii käyttäjäänsä.

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Ohjelmoinnin perusteet Y Python

Java-kielen perusteet

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Harjoitus 3 (viikko 39)

// Tulostetaan double-tyyppiseen muuttujaan "hinta" tallennettu // kertalipun hinta ja vaihdetaan riviä. System.out.printf("%.1f euros.

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ohjelmoinnin jatkokurssi, kurssikoe

Java-kielen perusteita

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko

Ohjelmoinnin perusteet Y Python

Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op)

Taulukot. Jukka Harju, Jukka Juslin

ITKP102 Ohjelmointi 1 (6 op)

System.out.printf("%d / %d = %.2f%n", ekaluku, tokaluku, osamaara);

Java-kielen perusteita

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

811120P Diskreetit rakenteet

Sisältö. 22. Taulukot. Yleistä. Yleistä

Harjoitus 5 (viikko 48)

Harjoitus 2 (viikko 45)

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Ohjelmoinnin perusteet, 1. välikoe

58131 Tietorakenteet ja algoritmit (syksy 2015)

Algoritmit 1. Demot Timo Männikkö

Metodien tekeminen Javalla

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Sisältö. 2. Taulukot. Yleistä. Yleistä

Seuraavassa on esimerkki for-, while- ja do-while -lauseesta:

Harjoitustyö: virtuaalikone

Harjoitus 4 (viikko 47)

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Ohjelmoinnin perusteet, kurssikoe

Listarakenne (ArrayList-luokka)

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

1. Kun käyttäjä antaa nollan, niin ei tulosteta enää tuloa 2. Hyväksy käyttäjältä luku vain joltain tietyltä väliltä (esim tai )

3. Muuttujat ja operaatiot 3.1

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Lauseet. Ehdollinen lause. Tämän osan sisältö. Ehdollinen lause. Esimerkkejä. Yksinkertainen ehto. Lohkosulut ja sisennys. Ehdollinen lause if

Ohjelmoinnin perusteet Y Python

Taulukoiden käsittely Javalla

Ohjelmoinnin perusteet Y Python

1 2 x2 + 1 dx. (2p) x + 2dx. Kummankin integraalin laskeminen oikein (vastaukset 12 ja 20 ) antaa erikseen (2p) (integraalifunktiot

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

2 Konekieli, aliohjelmat, keskeytykset

Johdatus Ohjelmointiin

Tässä tehtävässä käsittelet metodeja, listoja sekä alkulukuja (englanniksi prime ).

17. Javan omat luokat 17.1

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

17. Javan omat luokat 17.1

Ohjelmoinnin perusteet Y Python

811120P Diskreetit rakenteet

Ohjelmoinnin peruskurssi Y1

20. Javan omat luokat 20.1

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Ohjelmointi Tunnilla 1 (5) Viikko 7 tuntitehtäviä: metodien tekeminen Javalla

1. Mitä tehdään ensiksi?

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Olio-ohjelmointi Javalla

Kaavioiden rakenne. Kaavioiden piirto symboleita yhdistelemällä. Kaavion osan toistaminen silmukalla. Esimerkkejä:

Harjoitus 5 (viikko 41)

Ohjelmoinnin peruskurssi Y1

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)

Python-ohjelmointi Harjoitus 2

Javan perusteita. Janne Käki

Ohjelmoinnin perusteet Y Python

Kirjoita ohjelma jossa luetaan kokonaislukuja taulukkoon (saat itse päättää taulun koon, kunhan koko on vähintään 10)

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet, syksy 2006

12. Javan toistorakenteet 12.1

Transkriptio:

Ohjelmoinnin perusteet (Java) HARJOITUKSIA Syksy 2012 / Auvo Häkkinen Jos et ehdi tehdä viikon tehtäviä labra-aikana, tee ne valmiiksi ennen seuraavaa kokoontumista. Tehtävät tulee kirjauttaa tehdyiksi viimeistään kutakin harjoituskertaa seuraavalla kokoontumiskerralla. Kurssikaravaani kulkee, eikä jälkeenjääviä odotella. Tee heti, ettei jää heti tekemättä! Huom: Lue tehtävä aina aluksi kokonaan ajatuksella, ja ohjelmoi vasta siten toiminta täsmälleen niin kuin asiakas on pyytänyt. Kysy tarvittaessa ohjeita. --------------------------- harj 1 1-3 NETBEANSIIN TUTUSTUMINEN Tutustu T:-levyltä kurssin hakemistosta löytyviin NetBeans-ohjeisiin (NetBeans-harj.pdf) ja tee ohjeessa annetut 3 Java-ohjelmaa. Toimi jatkossakin tuon ohjeen mukaan. 4 SYÖTTÖ JA TULOSTUS (Kirjan tehtävä 4, s. 99) Kirjoita ohjelma, joka pyytää sinua arvaamaan luvun ja joka toimii seuraavan kaavan mukaan Esimerkki 1: Arvaa luku: 7 Minun lukuni on 8, hävisit niukasti. Esimerkki 2: Arvaa luku: 120 Minun lukuni on 121, hävisit niukasti. PS. Halutessasi voit käyttää lukemiseen myös Scanner-luokan metodeja (ks. kalvot s. 2-17). Huomaa: Javassa + voi tarkoittaa merkkijonojen katenointia tai yhteenlaskua. ------------ --------------- harj 2 5 PAINOINDEKSI Tee ohjelma, joka kysyy käyttäjältä painon kiloina ja pituuden metreissä, ja laskee niiden perusteella painoindeksin (BMI, Body Mass Index). Painoindeksi on luku, joka saadaan jakamalla paino pituuden neliöllä (tulos pitäisi olla arvoltaan n. 20-40). Kun pyydät tietoja käyttäjältä, on aina syytä kertoa millaisia arvoja odotat saavasi (esim. senttimetrejä vai metrejä). 1) Mitä lähtö- ja syöttötietoja saat? 2) Mitä tulostietoja haluat? 3) Mitä muuttujia tarvitset syötteiden, välitulosten ja tulosteiden tallettamiseksi? Varaa kutakin tarkoitusta varten oma muuttuja. Valitse muuttujan tyyppi sen käyttötarkoituksen mukaan. 4) Mitä arvoja joudut antamaan sijoituksella, mitä saat suoraan syötteistä?

6 ARVON MEKIN ANSAITSEMME (Kirjan tehtävä 5, s. 99) Kirjoita ohjelma, joka pyytää käyttäjältä kolme kokonaislukua ja ilmoittaa niiden summan, tulon ja keskiarvon. Varmista, että ohjelmasi laskee keskiarvonkin oikein (esim. lukujen 1, 3 ja 3 keskiarvo on 2.33)! Kokeile vielä lopuksi kuinka keskiarvon saa tulostettua kahden desimaalin tarkkuudella (vihje: printf. Ks. kirja s. 48 kalvot s. 2-24). Huomaa: Javassa jakolaskun tuloksen tyyppi määräytyy operandien tyyppien mukaan: tuloksen tyyppi on sama kuin "laajimman" operandin tyyppi. Ts. jos jakaja ja jaettava ovat kokonaislukuja, niin myös tulos on tyypiltään kokonaisluku. Jos jaettava tai jakaja on tyypiltään liukuluku, on myös tulos tyypiltään liukuluku. Esim: (2 + 3) / 2 tuottaa tulokseksi 2, mutta (2 + 3) / 2.0 tuottaa tulokseksi 2.5. 7 VAIHTELU VIRKISTÄÄ Tee ohjelma, joka ensin lukee käyttäjältä kaksi lukua muuttujien eka ja toka arvoiksi, ja vaihtaa sitten näiden kahden muuttujan arvoja keskenään. Esimerkiksi jos muuttuja eka saa arvoksi 1 ja muuttuja toka 22, niin vaihdon jälkeen muuttujan eka arvona on 22 ja muuttujan toka arvona on 1. Tulosta muuttujien arvot heti lukemisen jälkeen System.out.println( eka = + eka +, toka = + toka); sekä sen jälkeen, kun ohjelma on vaihtanut niiden arvot keskenään System.out.println( eka = + eka +, toka = + toka); Vihje: tarvitset ns. apumuuttujan. 8 HYPOTENUUSA (Kirjan tehtävä 6, s. 99) Hae tietoa www:stä haulla Java 7 API Math ja tutustu Javan Mathluokan staattisiin metodeihin double pow(double x, double y) ja double sqrt(double x). Kirjoita sitten ohjelma, joka laskee niitä käyttäen suorakulmaisen kolmion hypotenuusan pituuden, kun käyttäjältä kysytään kateettien pituudet. -- ------------------------- harj 3 9 PAINOINDEKSI METODINA Toteuta tehtävän 5 toiminnallisuus metodina, jonka nimi on laskebmi(). Tällä kertaa siis pääohjelma, eli metodi nimeltä main() vain kutsuu metodia, ja kaikki muu toiminnallisuus (syöttö, tulostus, laskenta) on metodissa laskebmi(). 10 PAINOINDEKSI USEAMPANA METODINA Toteuta seuraavaksi painoindeksin laskeminen käyttäen kolmea metodia seuraavasti metodi double annapituus() kysyy käyttäjän pituuden senttimetreinä ja palauttaa arvonaan pituuden metreissä metodi int annapaino() kysyy käyttäjän painon kiloina ja palauttaa sen arvonaan metodi double laskeindeksi(double pituus, int paino) saa parametreina pituuden metreissä ja painon kiloina, ja palauttaa arvonaan laskemansa painoindeksin.

Pääohjelman main() idea: kutsu metodia annapituus(), ota paluuarvo talteen kutsu metodia annapaino(), ota paluuarvo talteen kutsu metodia laskeindeksi(), vie parametreina mukaan edellä saadut luvut, ota paluuarvo talteen tulosta saatu painoindeksi 11 AIKAA SEKUNTEINA Tee metodi double sekunteina(int tunnit, int minuutit, int sekunnit), joka saa parametrina ajan annettuna tunteina, minuutteina ja sekunteina, sekä palauttaa arvonaan tuon ajan muutettuna sekunneiksi. Huom: metodi ei itse lue eikä tulosta mitään. Kirjoita myös metodia käyttävä pääohjelma main(), jossa kutsut metodia ensin kiinteillä parametreilla (esim. 1 h, 1 min, 1 s) ja tulostat metodin palauttaman arvon, ja sitten kutsut metodia käyttäjältä pyytämilläsi arvoilla ja tulostat metodin palauttaman arvon. Testaa sopivasti valitsemillasi syötteillä, että kirjoittamasi ohjelma toimii oikein. 12 KOEN ELÄMÄNI TUNTEINA Lisää edelliseen ohjelmaan metodi double aikaero(int tun1, int min1, int sek1, int tun2, int min2, int sek2). Se saa kutsun parametrina kaksi aikaa (siis peräti kuusi parametria), laskee näiden aikojen välisen eron sekunneissa sekä palauttaa laskemansa tuloksen kutsujalleen. Käytä apuna edellisen tehtävän metodia. ts. kutsu metodissa aikaero() ensin kummallakin ajalla edellisen tehtävän metodia sekunteina(), ja laske sitten saatujen sekuntimäärien erotus sekä palauta se kutsujalle. Pääohjelman tehtävänä on pyytää ja lukea käyttäjältä nuo kaksi aikaa (eli kuusi lukua), kutsua metodia aikaero(), ottaa vastaan tulos ja tulostaa se. Annettujen aikojen järkevyyttä ei tällä kertaa tarvitse tarkistaa. ---- ----------------------- harj 4 13 KAHDEN JÄRJESTYS (Vrt. kirjan tehtävä 12, s. 100) Kirjoita ohjelma, joka lukee pääohjelmassa kaksi kokonaislukua, ja kutsuu metodia, joka a) saa nuo luvut parametrina ja b) ilmoittaa (tulostaa) suuruusjärjestyksen tilanteen mukaan muodossa luvut ovat yhtä suuria ensimmäinen luku on suurempi ensimmäinen luku on pienempi 14 PIENEMMÄN ARVO (Kirja tehtävä 2, s. 123) Kirjoita metodi, joka saa parametrina kaksi reaalilukua ja palauttaa arvonaan niistä pienemmän arvon. Huom: metodi ei itse lue eikä tulosta mitään. Testaa metodin toiminta. 15 ONKO JAOLLINEN?

Kirjoita ohjelma, joka pyytää käyttäjältä kaksi kokonaislukua ja ilmoittaa onko ensimmäinen luku jaollinen toisella vai ei. Tee jaollisuustarkistuksen tekevästä osasta metodi. Muista varoa nollallajakoa! Vihje: %-operaattoria käyttämällä saat jakojäännöksen. 16 BMI SANALLISESTI Jatka painoindeksin kanssa painivaa ohjelmakokonaisuutta, eli tehtävää 10. Lisää nyt mukaan uusi metodi, joka saa parametrina tehtävässä 10 lasketun painoindeksin, ja kertoo sen merkityksen sanallisesti. Sanallinen lausahdus valitaan painoindeksin arvon perusteella seuraavasti Normaalia alhaisempi paino: alle 18,5 Normaali paino: 18,5 - alle 25 Lievä lihavuus: 25 - alle 30 Merkittävä lihavuus: 30 - alle 35 Vaikea lihavuus: 35 - alle 40 Sairaalloinen lihavuus: yli 40 Ks. myös http://painoideksi.org. 17 HAASTE: KOLMEN JÄRJESTYS Tee ohjelma, joka lukee kolme kokonaislukua, ja kutsuu sitten metodia, joka tulostaa ne suuruusjärjestyksessä. Apumuuttujista voi olla hyötyä (ts. vertaile ja laita luvut järjestykseen vaihtelemalla muuttujien arvoja keskenään), vaikka ilman niitäkin selviää miettimällä if-lauseiden ehdot sopiviksi. --------- ------------------ harj 5 18 SANALLINEN ARVOSANA (Vrt. kirjan tehtävä 11, s. 100) Kirjoita metodi, joka saa parametriksi numerona annetun arvosanan ja tulostaa sitä vastaavan sanallisen kuvauksen. Mikäli parametri ei ole välillä 0-5, metodi tulostaa virheilmoituksen. Numeerisia arvosanoja vastaavat sanalliset arviot ovat 0 = hylätty 1 = tyydyttävä 2 = erittäin tyydyttävä 3 = hyvä 4 = erittäin hyvä 5 = kiitettävä Käytä switch-lausetta. 19 ARVOSANOJA TOISTELLEN Täydennä edellisen tehtävän ratkaisua siten, että lisäät kutsuvaan osaan toistorakenteen, jonka lauseosassa luet käyttäjän antaman yhden arvosanan ja kutsut edellisen tehtävän metodia. Siten voit testata kaikki vaihtoehdot yhdellä ohjelman käynnistyskerralla. Muista testata myös kuinka käyttäytyy virheellisillä syötteillä. Ohjelmoi toisto päättymään esimerkiksi silloin, kun käyttäjä antaa syötteeksi negatiivisen luvun.

20 KESKIARVOT: NOLLAKO VAI EIKÖ NOLLA? Laadi ohjelma, joka laskee ja tulostaa satunnaisessa järjestyksessä syötteeksi saatavien positiivisten lukujen keskiarvon sekä negatiivisten lukujen keskiarvon (kumpikin erikseen). Luku 0 päättää syötön. Vihje: ks. kalvo 1-20 Kokeile ohjelmasi toimintaa siten, että annat heti ensimmäiseksi luvuksi luvun 0. Varo nollalla jakoa: jos positiivisia tai negatiivisia lukuja ei ole, et voi laskea keskiarvoa! 21 YHTÄ TIREHTÖÖRIN SIRKUSTA Sirkus on tullut kaupunkiin! Lastenlippu maksaa 12 rahaa ja aikuisen lippu maksaa 24 rahaa (final int LAPSIHINTA = 12; final int AIKUISHINTA = 24). Tirehtööri tahtoo selvittää paljonko miehiä, naisia ja lapsia käy seuraamassa esityksiä ja montako rahaa esitys tuottaa. Tee tirehtöörin avuksi ohjelma, jolle syötetään 1 kun mies ostaa lipun 2 kun nainen ostaa lipun 3 kun lapsi ostaa lipun 0 kun lippujen myynti loppuu ja esitys alkaa. Jos syötteeksi annetaan joku muu merkki, ohjelma tulostaa virheilmoituksen. Kun lippujen myynti loppuu, ohjelma tulostaa tiedot tirehtöörille. Voit koodata kaiken toiminnallisuuden pääohjelmaan. Jos käytät metodeja, niin esittele tarvittavat laskurimuuttujat luokan alussa kaikkien metodien ulkopuolella (ns. luokkamuuttujat). Laita esittelyn eteen määre static (esim. static int lkm=0;). Ps. Voit käyttää myös switch-lausetta. ---- ----------------------- harj 6 22 AJATTELE POSITIIVISESTI - OTA VIIDESTI LUKUA (Vrt. kirjan tehtävä 20, s. 101) Kirjoita ohjelma, joka laskee for- toistorakenteessa täsmälleen 5 positiivisen kokonaisluvun summan ja tulostaa sen toiston jälkeen. Tee yhden luvun lukevasta ja tarkastavasta osasta oma metodi int luejatarkasta(), joka pyytää käyttäjältä yhden positiivisen luvun. Jos saatu syöte on virheellinen, metodi tulostaa siitä ilmoituksen, ja pyytää uutta syötettä. Uutta lukua pitää pyytää niin kauan, kunnes käyttäjä todella syöttää kelvollisen luvun. Lopuksi metodi palauttaa arvonaan käyttäjän syöttämän positiivisen luvun. 23 PARILLISTEN POSITIIVISTEN SUMMA Tee metodi, joka saa parametrina yhden kokonaisluvun ja palauttaa arvonaan ko. lukua pienempien parillisten positiivisten lukujen summan (ko. luku mukaan lukien). Metodin tulee itse tarkastaa, että parametri on positiivinen. Jos parametri on negatiivinen, metodi palauttaa arvon -99 summan sijasta. Käytä summan laskemiseen for-lausetta. Ohjelmoi toiminnan testaamista varten toistorakennetta käyttävä pääohjelma. Yhdellä ohjelman käynnistyskerralla voidaan siis kokeilla useilla eri syötteillä. Jätä syötteen oikeellisuuden tarkastus metodin huoleksi. Tutki metodin palauttamaa arvoa, ja päätä sen mukaan mitä pitää tulostaa. Ohjelman suoritus päättyy, kun käyttäjä antaa syötteeksi arvon 0. Käyttöesimerkki

Ohjelma laskee syötelukua pienempien parillisten positiivisten lukujen summan. Anna luku: 5 Lukua 5 pienempien parillisten positiivisten lukujen summa on 6. Anna luku: 10 Lukua 10 pienempien parillisten positiivisten lukujen summa on 20. Anna luku: -5 Luku -5 on negatiivinen, sitä pienempiä positiivia lukuja ei ole. Anna luku: 0 Ohjelman suoritus päättyi. Vrt. edellinen tehtävä. Tässä käytetään negatiivista paluuarvoa kertomaan kutsuvalle ohjelmanosalle, että eteen osui virhetilanne. Nyt kutsuva ohjelmanosa voi itse päättää miten se jatkaa suoritusta: tulostaako se virheilmoituksen vai kutsuuko kenties uudelleen erilaisella parametrilla. 24 TÄHDISSÄ MARS (Vrt. kirja tehtävä 30 ja 31, s. 102) Tehtäväsi on laatia ohjelma, joka tulostaa tähtikolmion, jonka korkeus kysytään käyttäjältä (vrt. kalvo 2-6). Käyttöesimerkki Kuinka korkean kolmion haluat? 7 * ** *** **** ***** ****** ******* a) Laadi ensin pääohjelma main(), joka kysyy käyttäjältä tulostettavan kolmion korkeuden kutsuu tämän jälkeen kutakin riviä varten metodia tulostarivi(), jolle se antaa parametrina riville tulostettavien tähtien lukumäärän. b) Tee sitten metodi void tulostarivi(int lkm), joka tulostaa yhden rivin tähtiä, kun tähtien lukumäärä annetaan parametrina. Esim. kutsu tulostarivi(5) tuottaa rivin ***** Käytä kummassakin kohdassa toiston toteutukseen for-lausetta. ---- ----------------------- harj 7 25, 26, 27 ASTEITTAIN TARKENNUS: PALINDROMI Tee ohjelma, joka tarkastaa muodostaako syötteeksi annettu merkkijono palindromin, eli onko se sama luettuna alusta loppuun kuin lopusta alkuun. Oleta lisäksi, että palindromiksi kelpuutettavassa jonossa saa olla vain kirjaimia, ja ohjelman tulee tulkita isot ja pienet kirjaimet samoiksi.

Esim: SaippuakiviKauppias on palindromi Kukin tutkittava merkkijono annetaan omalla syöterivillään. Ohjelman tulee tutkia syötteeksi annettuja merkkijonoja kunnes käyttäjä haluaa lopettaa. Tarvitset tehtävässä String-luokan metodeja, joten käypä aluksi kurkistamassa osoitteessa docs.oracle.com/javase/7/docs/api/ mitä metodeja on tarjolla (tai googlaa java 7 api String). Tutustu myös luokan Character staattisten metodien API-kuvauksiin. Tarvitset tehtävän kohdassa 4 ainakin metodeja Character.isLetter() ja Character.isWhiteSpace(). Eräs ratkaisun asteittain tarkennus on annettu kurssin kalvolärpäkkeissä. Tutustu ajatuksella. Lue sen jälkeen tämä tehtäväteksti kokonaan, ja etene sitten ohjeiden mukaan yksi numeroitu vaihe kerrallaan! 25 PALINDROMI, vaiheet 1 1) Laadi ensin pääohjelma main(), joka kutsuu toistorakenteessa metodeja luejatarkasta() ja onkopalindromi() sekä ilmoittaa tarkastuksen tuloksen. a) mieti metodien luejatarkasta() ja onkopalindromi() parametrinvälitys kuntoon o mitä tietoja pääohjelma antaa metodille o mitä paluuarvoja pääohjelma saa metodilta b) esittele metodien luejatarkasta() ja onkopalindromi() otsakkeet, mutta jätä niiden lauseosat aluksi tyhjäksi (=tynkä, stub) o tällä kertaa lauseosassa riittää sopiva return-lause c) kääntämisen pitäisi nyt onnistua Nyt voit jo testata ainakin pääohjelman toimintaa, esim. miten ohjelman suoritus lopetetaan. 26 PALINDROMI vaiheet 2 ja 3 2) Ohjelmoi (tarkenna) sitten metodin String luejatarkasta() lauseosa o Tee ensin minimitoiminnan sisältävä karvalakkimalli syötteen lukemisesta, eli metodi vain lukee ja palauttaa syötemerkkijonon sellaisenaan 3) Ohjelmoi (tarkenna) sitten metodin boolean onkopalindromi(string mjono) lauseosa o ks. tarkennettu toiminta kalvolärpäkkeistä o testaa 27 PALINDROMI, vaiheet 4 ja 5 4) Ohjelmoi (tarkenna) sitten metodin String luejatarkasta() muut ominaisuudet ja testaa o seuraava versio palauttaa merkkijonon isoiksi tai pieniksi muutettuina o seuraava versio sallii tutkittavaan jonoon vain kirjaimet o jne... 5) Kun olet ohjelmoinut kaikki osat, testaa lopuksi vielä koko kokonaisuus huolellisesti valitsemillasi testitapauksilla a) kelvollisia syötteitä: on palindromi / ei ole palindromi, sisältää isoja / pieniä kirjaimia b) virheellisiä syötteitä: huomaako? kertooko? miten käsittelee tilanteet? Vapaaehtoinen ekstrapähkinä Muuta ratkaisua siten, että merkkijonossa saa olla myös välilyöntejä ja ääkkösten käsittelykin menee oikein, eli tällöin esimerkiksi merkkijono Säkylän Oili on älykäs

hyväksytään palindromiksi. ---- ----------------------- harj 8 28 KUUKAUSITAULUKKO a) Tee metodi, joka saa parametrina kuukauden numeron, ja palauttaa arvonaan sitä vastaavan sanallisen vastineen merkkijonona. Jos parametrina saadaan esim. arvo 2, metodi palauttaa arvonaan merkkijonon Helmikuu. Jos parametrin arvo ei kelpaa kuukaudeksi, metodin pitää palauttaa arvo null (ts. merkkijonojen nolla-arvo ) Määrittele kuukausien nimet metodin paikallisena merkkijonotaulukkona, ja alusta se esittelyn yhteydessä. Poimi sitten oikea merkkijono käyttämällä kuukauden numeroa indeksinä. Vihje: laita alkioon 0 arvo null. b) Laadi pääohjelma, jolla voit helposti testata metodisi toiminnan. Käytännössä tämä tarkoittaa, että ohjelmoit pääohjelmaan syötteitä lukevan toistosilmukan, josta sitten voit kutsua metodia sekä kelvollisilla että kelvottomilla parametrien arvoilla. Huomaa: Tässä metodi tarkistaa itse saamansa parametrin oikeellisuuden, ei kutsuva osa. Metodiahan voi kutsua monesta eri kohdasta ohjelmaa, ja jos kutsujan pitäisi varmistaa parametrin oikeellisuus, niin sama tarkistus pitäisi tietysti kirjoittaa jokaisen kutsun yhteyteen. Nyt metodi palauttaa tiedon parametrin epäkelpoisuudesta kutsujalle (arvo null), ja kutsuva osa voi käsitellä tilanteen itse haluamallaan tavalla (vaikka eri kerroilla eri tavalla). 29 ARVOSANAJAKAUMA (Kirjan tehtävä 36, s.103) Kirjoita ohjelma, joka pyytää käyttäjältä luokan opiskelijoiden kurssiarvosanat ja tulostaa arvosanajakauman käyttäen tähtiä seuraavasti 0: 1: ** 2: **** 3: ******** 4: ***** 5: ********** Arvosanat syötetään ohjelmalle yksitellen (jossain järjestyksessä). Syötteiden loppumisen voi ilmaista vaikkapa antamalla lopuksi negatiivisen luvun. Käytä taulukkoa, jonne lasket kunkin arvosanan esiintymiskertojen lukumäärät (esim. lkm[4] kertoo moniko saanut arvosanan 4. vrt. kalvolärpäkkeissä oleva Satunnaislukutesti-esimerkki). 30 ONKO TYYLIÄ? Tee ohjelma, joka laskee ja tulostaa mäkihypyn tyylipisteiden summaa. Mäkihypyssä on 5 tuomaria, joista kukin voi antaa hypystä pisteitä 0-20. Tyylipisteiden summaa laskettaessa jätetään kuitenkin huomioimatta pienin ja suurin arvo. Käytä toteutuksessasi metodeja seuraavasti: Tee metodi, joka lukee ja palauttaa arvonaan yhden tuomarin antamat pisteet. Metodin tulee tarkistaa, että annettu syöte on muodollisesti oikein. Tarvittaessa metodi pyytää syötettä uudestaan niin kauan kunnes se saa kelvollisen pistemäärän.

Tee metodi, joka saa parametrina taulukon, jossa on 5 tuomarin antamat tyylipisteet. Metodi palauttaa tyylipisteiden summan, joka saadaan siten, että kaikkien tuomareiden pisteiden yhteissummasta vähennetään suurin ja pienin arvo. Kaiken muun voit ohjelmoida pääohjelmaan. ---- ----------------------- harj 9 31 TAULUKON TULOSTUS Kirjoita main()-metodiin esittelyt final int MAX = 15; int [] cuadro = { 9, 2, 2, 7, 8, 1, 1, 0, 8, 9 }; int [] viistoista = new int[max]; a) Tee metodi void tulostataulukko(int[ ] luvut, int ala, int ylä), joka saa parametrina kokonaislukutaulukon sekä kokonaisluvut ala ja ylä. Metodi tulostaa taulukossa indeksivälillä ala...ylä olevat luvut yhdelle riville. Esimerkiksi kutsu tulostataulukko(cuadro, 2, 4) tulostaisi taulukosta cuadro luvut 2, 7 ja 8. Koko taulukon voi tulostaa kutsumalla esim. tulostataulukko(cuadro, 0, cuadro.length-1) Lisää pääohjelmaan lauseet, joilla voit testata metodisi toimivuuden. 32 ARVO TAULUKON LUVUT Jatka edellisen tehtävän ohjelmaa (eli lisää samaan tiedostoon) b) Tee metodi void arvotaulukkoon(int[ ] luvut), joka täyttää parametrina annetun taulukon arpomillaan kokonaisluvuilla. Käytä arpomiseen metodia Math.random() ja skaalaa luvut osavälille 0..luvut.length-1 (ts. siten, että ne olisivat myös kelvollisia taulukon indekseiksi). Sama luku saa esiintyä useampiakin kertoja. Esimerkiksi kutsu arvotaulukoon(viistoista) arpoisi taulukkoon, jonka nimi on viistoista, 15 kokonaislukua, joiden arvot ovat väliltä 0-14. Lisää pääohjelmaan testaamisessa tarvittavat lauseet: määritettele uusi taulukko, täytä se kutsumalla tämän tehtävän metodia ja tulosta kutsumalla edellisen tehtävän metodia. 33 LASKE OSASUMMA Jatka edellisten tehtävien ohjelmaa (samaan tiedostoon) c) Tee metodi int laskeosasumma(int[ ] luvut, int ala, int ylä), joka saa parametrina kokonaislukutaulukon sekä kokonaisluvut ala ja ylä. Metodi laskee taulukossa indekseillä ala...ylä olevien lukujen summan, ja palauttaa sen arvonaan. Esim. kutsu osasumma(cuadro, 2, 4) palauttaisi arvon 17 (ks. tehtävä 31). Testaa metodisi toiminta. Kokeile myös miten ohjelmasi toimii, jos käyttäjän antamat indeksirajat eivät ole kelvollisia indekseiksi? Entä, jos annettu yläraja on pienempi kuin annettu alaraja? Korjaa tarvittaessa toteutusta! Koska tällä kertaa taulukossa on varmasti vain positiivisia lukuja, voisivat metodit palauttaa kutsujalle vaikkapa arvon -1 merkiksi virhetilanteesta.

34 ETSII, ETSII JA SOISI LÖYTÄVÄNSÄ Jatka edellisten tehtävien ohjelmaa lisäämällä d) metodi void monikoonsama(int[ ] taulu), joka tutkii ja tulostaa, kuinka moni parametrina saadun taulukon alkion arvo on yhtä suuri kuin alkion indeksi. Esimerkiksi tehtävän 31 taulukossa on kaksi tällaista lukua (cuadro[2]==2 ja cuadro[8]==8), joten metodi tulostaisi arvon 2. Lisää pääohjelmaan testaamisessa tarvittavat lauseet. 35 ETSII JÄLLEEN Jatka edellisten tehtävien ohjelmaa lisäämällä e) metodi void etsijatulostapieninluku(int[ ] taulu), joka etsii ja tulostaa parametrina saamansa järjestämättömän taulukon pienimmän alkion arvon ja sen indeksin. Jos samaa pienintä arvoa on useassa alkiossa, metodin tulee tulostaa vain se indeksi, joka on pienin. Esimerkiksi kutsu etsijatulostapieninluku(cuadro) tulostaisi Taulukon pienin luku on 0, ja se sijaitsee indeksillä 7. Lisää pääohjelmaan testaamisessa tarvittavat lauseet. ---- ---------------------- harj 10 36 HIIHTOJÄRJESTYKSEN SEKOITTAMINEN (Kirjan tehtävä 40, s. 104) Laadi ohjelma, joka arpoo ja tulostaa hiihtokilpailun lähtöjärjestyksen, kun kisaan osallistuu 45 hiihtäjää. Hiihtäjillä on rinnassaan etukäteen jaetut numerolaput, joissa on kilpailijanumero 1-45. Hiihtäjän kilpailijanumero ei tällä kertaa siis kerro suoraan lähtöjärjestystä. Eräs tapa: Sijoita lähtijät ensin kilpailijanumeronsa mukaisessa järjestyksessä lähtöjärjestyksen sisältävään taulukkoon. Sekoita sitten taulukon sisältöä: arvo kaksi lähtönumeroa ja vaihda ko. lokeroissa olevat arvot keskenään. Toista riittävän monta kertaa. 37 SEKAISEN JÄRJESTÄMINEN Taulukon voi järjestää kasvavaan suuruusjärjestykseen monella tavalla. Tässä yksi tapa - etsi koko taulukon pienin arvo, ja vaihda se taulukon indeksillä 0 olevan arvon kanssa - etsi sitten indeksistä 1 alkaen loppuosan pienin arvo, ja vaihda se indeksillä 1 olevan arvon kanssa - etsi indeksistä 2 alkaen loppuosan pienin arvo, ja vaihda indeksillä 2 olevan arvon kanssa - jatka vastaavasti, kunnes taulukon loppuosaan kuuluu enää vain viimeinen alkio Algoritmimme runko näyttää siis tältä Missä for (int i=0; i < taulu.length; i++) { min = etsipienimmänindeksi(taulu, i); vaihda(taulu, i, min); }

- metodi int etsipienimmänindeksi(int[ ] taulu,int i) etsii alkaen indeksistä i taulukon loppuosan pienimmän arvon, ja palauttaa ko. alkion indeksin. - metodi void vaihda(int[ ] taulu,int i,int j) vaihtaa taulukon indekseillä i ja j olevat arvot keskenään. f) Lisää tehtävän 31 ohjelmaan metodi void järjestätaulukko(int[ ] luvut), joka järjestää parametrina annetun taulukon yllä mainittua algoritmia käyttäen. Tulosta taulukon luvut ennen järjestämistä ja sen jälkeen. Huomaa, että voit käyttää taulukon täyttämisessä ja tulostuksessa aiempien tehtävien metodeja (tehtävät 31 ja 32). 38 ETSINTÄ (eli HAKU) JÄRJESTETYSTÄ TAULUKOSTA g) Lisää tehtävään 31 metodi boolean etsijärjestetystätaulukosta(int[ ] taulu, int arvo), joka peräkkäishakua käyttäen tutkii esiintyykö parametrina annettu arvo parametrina annetussa järjestetyssä taulukossa. Etsinnän voi lopettaa heti, kun kohdataan parametria suurempi arvo. 39 BINÄÄRIHAULLA ARVATENKIN Valitse mielessäsi joku kokonaisluku väliltä 1-100. Tee ohjelma, joka "arvaa" ajattelemasi luvun. Kuhunkin ohjelman arvaukseen sinun tulee vastata 1 = liian pieni arvaus, 2 = oikein arvattu ja 3 = liian suuri arvaus. Ohjelma tekee arvauksen ns. puolitushaulla seuraavasti - alussa alaraja=1 ja yläraja=100 ja ohjelman arvaus=(alaraja+yläraja)/2 - jos vastaat 1 eli liian pieni arvaus, ohjelma kasvattaa alarajaa edellisen arvauksen yli - jos vastaat 3 eli liian suuri arvaus, ohjelma pienentää ylärajaa edellisen arvauksen alle - seuraava arvaus on jälleen kohdassa (alaraja+yläraja)/2 - jne. Ohjelma toistaa tuota silmukassa, kunnes arvaus osuu kohdalleen. PS. Jos ohjelmasi ei kuudenkaan vihjeen jälkeen ole keksinyt lukuasi, ei ohjelmasi ole kovin fiksu, tai sitten sinä huijaat! ---- ----------------------- o-o-o-o-o Tehtävä 39 on kurssin viimeinen tehtävä. Muista täyttää kurssipalaute, Tuubissa!