Sisällys JAVA-OHJELMOINTI Osa 3: Laskennan ohjaus. Lohkolause (block) Peräkkäinen laskenta. Lohkon käyttö. Esimerkki



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

11. Javan toistorakenteet 11.1

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1

Java-kielen perusteita

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Java-kielen perusteet

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

11. Javan valintarakenteet 11.1

1. Omat operaatiot 1.1

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

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

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

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

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

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

5/20: Algoritmirakenteita III

7. Näytölle tulostaminen 7.1

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Ehto- ja toistolauseet

Sisällys. 15. Lohkot. Lohkot. Lohkot

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

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

11. Javan valintarakenteet 11.1

13. Loogiset operaatiot 13.1

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

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

ITKP102 Ohjelmointi 1 (6 op)

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

Metodien tekeminen Javalla

19. Olio-ohjelmointia Javalla 19.1

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

Ehto- ja toistolauseet

7. Oliot ja viitteet 7.1

Java-kielen perusteita

Olio-ohjelmointi Javalla

13. Loogiset operaatiot 13.1

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

9. Periytyminen Javassa 9.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Ohjelmoinnin jatkokurssi, kurssikoe

Tutoriaaliläsnäoloista

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

Muuttujat ja kontrolli. Ville Sundberg

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

ITKP102 Ohjelmointi 1 (6 op)

Java kahdessa tunnissa. Jyry Suvilehto

1 Tehtävän kuvaus ja analysointi

1. Mitä tehdään ensiksi?

Rajapinta (interface)

ITKP102 Ohjelmointi 1 (6 op)

Tietorakenteet (syksy 2013)

9. Periytyminen Javassa 9.1

Sisällys. 16. Lohkot. Lohkot. Lohkot

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

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

14. Poikkeukset 14.1

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

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

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Mikä yhteyssuhde on?

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

4. Luokan testaus ja käyttö olion kautta 4.1

Java-kielen perusteita

20. Javan omat luokat 20.1

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

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

4. Olio-ohjelmoinista lyhyesti 4.1

Listarakenne (ArrayList-luokka)

Luokat ja oliot. Ville Sundberg

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmointi 2, välikoe

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

17. Javan omat luokat 17.1

14. Poikkeukset 14.1

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

7/20: Paketti kasassa ensimmäistä kertaa

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

811120P Diskreetit rakenteet

Oliot viestivät metodeja kutsuen

Ohjelmointi 2 / 2010 Välikoe / 26.3

Javan perusteita. Janne Käki

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Java-kielen perusteet

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Ohjelmoinnin perusteet Y Python

811120P Diskreetit rakenteet

Transkriptio:

Sisällys JAVA-OHJELMOINTI Osa 3: Laskennan ohjaus Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto Peräkkäinen laskenta Ehdollinen laskenta Laskennan toisto Laskennan hierarkisuus 10/19/99 E. Hyvönen: Java Osa 3 2 Lohkolause (block) Peräkkäinen laskenta Perälläkkäin suoritettavat lauseet muodostavat lohko(lausee)n (block). Lohkon lauseet kirjoitetaan aaltosulkujen väliin: { lause1; lause2; ; lausen ; Huomaa,että Yksittäiset lauseet päättyvät ; -merkkiin Lohkon lopussa ei ole ; -merkkiä Muuttujien määrittely on voimassa lohkoittain 10/19/99 E. Hyvönen: Java Osa 3 4 Esimerkki Lohkon käyttö { int a = 1, b, c = 2*a; b = a*2; int d = a+b; // d käytössä tästä alkaen { int e = d+b; // Lohkossa alilohko d = a+e; // e:n käyttöalue loppuu c = d+b; 10/19/99 E. Hyvönen: Java Osa 3 5 Lohkoa voi aina käyttää siellä missä yksittäistä lausettakin Lohko on eräs lause (statement) Tyhjä lohko/lause merkitään ";" Metodin runko on lohko Muuttujien nimien oltava sisäkkäisissä lohkoissa yksikäsitteisiä {int n =2; { int n=3;.. // Väärin! Luokan muuttujien peittäminen on kuitenkin ok. Lohkossa käytetään ensisijaisesti sen omia muuttujia. 10/19/99 E. Hyvönen: Java Osa 3 6 1

Ehtolause if Ehdollinen laskenta Ehdollinen lauseen suoritus if ( ehto ) lause ehto on lauseke, joka palauttaa boolean-tyypin arvon (true /false). lause on yksittäinen tai lohkolause, joka suoritetaan vain jos ehto-lauseke palauttaa arvon true. Esimerkki final double RAJA = 18.0; if (lämpötila<raja) System.out.println("Liian kylmää (" + lämpötila + " astetta)"); 10/19/99 E. Hyvönen: Java Osa 3 8 Ehtolause if- if ( ehto ) lause1 lause2 Jos ehto==true suoritetaan lause1, muuten lause2. Sisäkkäiset (nested) ehdolauseet -haara liittyy viimeisimpään edeltävään iflauseeseen, jolla ei vielä ole -haaraa. Selvyyden vuoksi harkitse lohkojen käyttöä haaroissa Merkitään haara "{" ja "" merkkien väliin. 10/19/99 E. Hyvönen: Java Osa 3 9 Esimerkki: monta testiä Kahden kolikon heiton tulostus if (kolikko1 = = KRUUNA) if (kolikko2 = = KRUUNA) System.out.println("kaksi kruunaa"); System.out.println("kruuna ja klaava"); if (kolikko2 = = KRUUNA) System.out.println("klaava ja kruuna"); System.out.println("kaksi klaavaa"); 10/19/99 E. Hyvönen: Java Osa 3 10 Esimerkki: monivalinta Edellinen esimerkki ylimääräisillä selventävillä suluilla if (kolikko1 = = KRUUNA) { if (kolikko2 = = KRUUNA) System.out.println("kaksi kruunaa"); System.out.println("kruuna ja klaava"); { // kolikko1 == KRUUNA if (kolikko2 = = KRUUNA) System.out.println("klaava ja kruuna"); System.out.println("kaksi klaavaa"); if (a <0) System.out.println("a<0"); if (a<1) System.out.println("0<=a<1"); if (a<2) System.out.println("1<=a<2"); 10/19/99 E. Hyvönen: Java Osa 3 11 10/19/99 E. Hyvönen: Java Osa 3 12 2

Ehto-operaattori:?: Ehdollisuus voidaan ilmaista myös arvon palauttavana ehtolausekkeena. ehto? lauseke1 : lauseke2 ehto: boolean arvon palauttava lauseke lauseke1: palautetaan koko ehtolausekkeen arvona, jos ehto=true. lauseke2: palaututetaa koko ehtolausekkeen arvona, jos ehto=false. 10/19/99 E. Hyvönen: Java Osa 3 13 Esimerkki total = (total > MAX)? total + 1: total + 2; Sama kuin: if (total > MAX) total = total +1; total = total + 2; 10/19/99 E. Hyvönen: Java Osa 3 14 Monihaarainen ehtolause: switch int isompi = (x > y)? x : y; System.out.println("Pienempi: " + ((n < m)? n : m)); Huom. operaattoreiden presedenssijärjestys! 10/19/99 E. Hyvönen: Java Osa 3 15 Näppärä ja tehokas monihaarainen ehtolause switch (lauseke) { case arvo1: lause-lista1 case arvo2: lause-liusta2 default: lause-listan Vastaa sisäkkäisiä if-lauseita, mutta: Haarautumis testi lasketaan vain kerran. Haarat eivät välttämättä sulje pois toisiaan. 10/19/99 E. Hyvönen: Java Osa 3 16 Esimerkki Testi lauseke palauttaa arvonaan kokonaisluvun tai merkin Esim. totuusarvo tai desimaaliluku ei kelpaa! Laskenta haarautuu arvoa vastaavaa case-haaraan. Jos vastaavaa arvoa ei ole lueteltu, lasketaan default-haara. Huom: Ellei valitussa haarassa keskeytetä laskentaa esim. break-lauseella, lasketaan myös kaikki myöhemmät haarat i+1, i+2,, default! Haara sulkee pois vain sitä edeltävät haarat! 10/19/99 E. Hyvönen: Java Osa 3 17 String sana = "aurinko"; switch (sana.charat(0)) { case 'a': System.out.println("On a-kirjain"); // Lohkoa { ei merkitä vokaali_laskuri++; case 'e': // Haaroissa e-ä ei tehdä mitään, mutta laskenta case 'i': // mutta laskenta etenee ö-haaraan... case 'o': case 'u': case 'ä': case 'ö': System.out.println("On muu vokaali kuin a"); vokaali_laskuri++; // Switch lauseen laskenta loppuu tähän. default: System.out.println("On konsonantti"); konsonantti_laskuri++; 10/19/99 E. Hyvönen: Java Osa 3 18 3

Kertausta Mikä on if- ja?-muodon tärkein ero. Miten switch-lause kirjoitetaan if-then- lauseilla? Milloin se on helppoa/vaikeaa? Kumpi esitystapa on tehokkaampi ja miksi? Laskennan toisto 10/19/99 E. Hyvönen: Java Osa 3 19 While -lause while (ehto) lause Ehto testataan ennen laskentaa. Lause suoritetaan niin kauan kuin ehto toteutuu. Lauseen suoritus johtaa yleensä ennemmin tai myöhemmin johtaa tilanteeseen ehto==false Muuten joudutaan ikuiseen silmukkaan (infinite loop) Toinen mahdollisuus laskennan lopettamiseen Ehtolause, joka haarassa on break-lause. break lopettaa vain sisikkäisimmän toistolauseen laskennan; mahdollinen toisto ylemmällä tasolla jatkuu. 10/19/99 E. Hyvönen: Java Osa 3 21 Esimerkki class Laskin { public static void main(string [] args) { final int LIMIT = 5; int count = 1; while (count<=limit) { System.out.println(count); count++; // count=count+1; System.out.println("Loppu"); 10/19/99 E. Hyvönen: Java Osa 3 22 Esimerkki: Ikuinen silmukka class Ikuinen { static public static void main(string [] args) { final int LIMIT = 5; int count = 1; while (count<=limit) { System.out.println(count); count--; System.out.println("Loppu"); 10/19/99 E. Hyvönen: Java Osa 3 23 for-lause Lauseen ehdollinen toisto peräkkäisillä arvoilla for (alkuasetus; ehto; eteneminen) lause alkuasetus: lause, joka suoritetaan yhden kerran ennen for-lauseen varsinaista laskentaa. Tyypillisesti esitellään ja asetetaan for-lauseessa käytettävien muuttujien arvoja. ehto: for-lause suoritetaan seuraavan kerran vain jos ehto palauttaa arvon true ennen toistoa. eteneminen: lause, joka suoritetaan jokaisen toistokerran jälkeen lause: toistettava lause/lohko. 10/19/99 E. Hyvönen: Java Osa 3 24 4

Esimerkki int i; for (i = 1; i < 10; i++) System.out.println(i*i); System.out.println("Tehty " + i + " kertaa."); for (int i = 1; i < 10; i=i+1) // i on for-lauseen sisäinen muuttuja System.out.println(i*i); System.out.println("Tehty"); // i ei käytettävissä // ESIMERKKI: Vokaalien laskentaa int a_laskuri = 0, e_laskuri = 0, i_laskuri = 0; int o_laskuri = 0, muu_laskuri = 0; String lainaus = "Tulin, näin, voitin"; for (int i = 0; i<lainaus.length(); i++) // Indeksi alkaa 0:sta switch (lainaus.charat(i)) { case 'a': a_laskuri++; case 'e': e_laskuri++; case 'i': i_laskuri++; case 'o': o_laskuri++; default: muu_laskuri++; System.out.println("a-määrä:" + a_laskuri); System.out.println("e-määrä:" + e_laskuri);... 10/19/99 E. Hyvönen: Java Osa 3 25 10/19/99 E. Hyvönen: Java Osa 3 26 do-while -lause Loppuehtoinen lauseen toisto do lause while ( ehto) lause: Suoritetaan ensin kerran. Suorituksen jälkeen testataan ehto. ehto: Jos ehto palauttaa arvon true, lause suoritetaan uudelleen niin kauan kuin ehto toteutuu (testi aina suorituksen jälkeen). 10/19/99 E. Hyvönen: Java Osa 3 27 Esimerkki int i; for (i = 1; i < 10; i=i+1) System.out.println(i*i); int i = 1; do { System.out.println(i*i); i=i+1; while (i < 10); 10/19/99 E. Hyvönen: Java Osa 3 28 Toiston lopettaminen:break Toistolauseiden laskenta voidaan keskettää breaklauseella. Toisto kyseisellä tasolla lopetataan ilman, että mahdollisia toistolauseen ehtoja tarkistetaan, Esimerkki: for (int n = 1; n <= 20; n++) { // Tulostaa luvut 111 if (n==12) System.out.println("n = " + n); 10/19/99 E. Hyvönen: Java Osa 3 29 break-lauseen argumenttina voidaan käyttää hyppyosoitetta (label): break osoite; // Osoite on tunniste Laskenta jatkuu tällöin koodissa olevan tunnisteen jälkeisestä lauseesta. ulompi: while () {... sisempi: while () { if () break ulompi; if () break sisempi; 10/19/99 E. Hyvönen: Java Osa 3 30 5

break-lauseen käyttö ei ole välttämätöntä. Voidaan korvata ehdoilla. break-lauseen käyttö toistolauseessa johtaa helposti spagettikoodiin Ei suositella toiston lopetuskeinona. Toistokerran ohittaminen: continue continue-lauseella voidaan ohittaa toistolauseen loppujen lauseiden suoritus. Erona break-keskeytykseen on, että toistoa ei lopeteta, ainoastaan kyseinen toistokerta. Esimerkki: for (int n = 1; n <= 20; n++) { if (n==12) // Vain luku 12 jää tulostamatta, continue; System.out.println("n = " + n); // Muut 120 10/19/99 E. Hyvönen: Java Osa 3 31 10/19/99 E. Hyvönen: Java Osa 3 32 Kertausta continue-lauseen argumenttina voidaan käyttää hyppysoitetta (label) (kuten break-lauseessa): continue osoite; // Osoite on tunniste laskenta jatkuu tällöin koodissa olevaa tunnistetta vastaavan toiston alusta. continue-lauseen käyttö ei ole välttämätöntä eikä yleensä suositeltavaa Voidaan korvata ehdoilla. Millaisissa tilanteissa käytät while-, do-while ja for-lauseita toistoon? Mikä ero on break ja continue lauseilla. Milloin niitä käytetään? 10/19/99 E. Hyvönen: Java Osa 3 33 10/19/99 E. Hyvönen: Java Osa 3 34 Aliohjelmat Laskennan hierarkisuus Ohjalma voidaan jakaa hierarkisiin osiin, aliohjelmiin Ongelman ratkonta osissa on helpompaa kuin yhtenä kokonaisuutena Rekursion (recursion) avulla ongelman ratkonta voidaan palauttaa pienempiin samanmuotoisiin ongelmiin Rekursiivinen ohjelma kutsuu itse itseään. Rekursion avulla voidaan toteuttaa toisto ilman toistolauseita. 10/19/99 E. Hyvönen: Java Osa 3 36 6

Esimerkiksi ruokaresepti: Alireseptikutsu "Keitetään 100g makaronia" korvaa mutkikkaamman keittämisen alialgoritmin (reseptin). Ylemmällä tasolla voidaan keskittyä varsinaiseen aterian valmistukseen alemmat yksityiskohdat unohtaen. Esimerkki rekursiosta Puumainen hakemisto voidaan tulostaa tulostamalla sen alipuut, jotka voidaan tulostaa... 10/19/99 E. Hyvönen: Java Osa 3 37 Saavutettavat edut Mutkikkaat kokonaisuudet voidaan korvata aliohjelmakutsuilla Koodi lyhenee ratkaisevasti, sillä mutkikasta kuvausta ei tarvitse toistaa. Korjauksia tehdään vain yhteen paikkaan (aliohjelmaan). Ongelman jäsentyy pienempiin osiin. Ongelma voidaan ratkaista luontevasti käsitteellisesti eri tasoilla Ohjelmat yksinkertaistuvat Javassa aliohjelmat toteutetaan metodeilla. 10/19/99 E. Hyvönen: Java Osa 3 38 Metodi Metodiin liittyy Metodin määrittely, jossa kuvataan metodille annettavat lähtötiedot, käyttötapa, toiminta (algoritmi) ja metodin palauttama arvo. Metodin kutsu Kun metodi on määritelty, sitä voidaan kutsua toisista metodeita määritellyllä tavalla. Metodin määrittely Metodi vastaa perinteisiä (ali)ohjelmaa. Määrittely kirjoitetaan luokkamäärittelyn sisään. Määrittely on luokkakohtainen: Eri luokilla voi olla samannimisiä erilaisia metodeja. Määrittely on parametrikohtainen. Samannimisellä metodilla voi olla eri määrittelyjä eri parametrikombinaatioita varten. 10/19/99 E. Hyvönen: Java Osa 3 39 10/19/99 E. Hyvönen: Java Osa 3 40 Metodin määrittelymuoto Yleismuoto: [määreet] arvotyyppi nimi ([parametrit]) [throws nimet] { algoritmi Määreet : mm. metodin käytettävyys muissa luokissa Arvotyyppi: Metodi voi palauttaa arvon, jonka on oltava annettua tyyppiä. Arvo palautetaan algoritmissa return-komennolla. Nimi: metodin kutsumanimi (tunniste) Metodien nimet kirjoitetaan muuttujien tavoin pienellä alkukirjaimella (suositus). Parametrit: Metodin muodolliset (formal) parametrit Metodia kutsuttaessa sille voidaan välittää tietoa parametrien välityksellä. throws nimet Poikkeusten käsittelyyn liittyvä ilmaus. Algoritmi: Metodin toiminnan kuvaus Java-lohkona. (Ns. abstrakteilla metodeilla lohko voi olla tyhjä.) 10/19/99 E. Hyvönen: Java Osa 3 41 10/19/99 E. Hyvönen: Java Osa 3 42 7

Esimerkkimetodi class Laskin { double lasku (int x, int y) { y=y*y; return x+2*y; // Metodin kutsun arvo // lasku-metodi // Luokkamäärittelyn loppu Metodin kutsuminen Kutsun muoto: metodin_tunniste(argumentit) Metodin_tunniste: Yksinkertaisimmillaan metodin nimi: Esimerkiksi lasku(2, 3.1); Toisten luokkien metodeja kutsuttaessa myös luokka tai sen ilmentymä pitää yksilöidä. Tähän palataan olio-ohjelmoinnin yhteydessä 10/19/99 E. Hyvönen: Java Osa 3 43 10/19/99 E. Hyvönen: Java Osa 3 44 Esimerkki: rekursiivinen kutsu Argumentit: Todelliset (actual) parametrit, joita metodin halutaan käyttävän Näiden on oltava määrittelyssä esiteltyä tyyppiä. Javassa parametrien määrä on kiinteä Ei valinnaisia parametreja kuten esim. C++:ssa. Ei parametrien oletusarvoja. 10/19/99 E. Hyvönen: Java Osa 3 45 class Kaanna { // Tulostaa aakkoset annettujen merkkien välissä käänteisesti // Esim. java Kaanna a d -> dcba public static void main(string args[]) { kaanteisesti((int)args[0].charat(0), (int)args[1].charat(0)); static void kaanteisesti(int alku, int loppu) { if (alku>=loppu) { // Rekursion lopetusehto System.out.print((char)alku); return; { // Rekursiivinen haara kaanteisesti(alku+1, loppu); System.out.print((char)alku); 10/19/99 E. Hyvönen: Java Osa 3 46 Parametrien sitominen Kutsussa muodollisille parametreille annetaan todellisten parametrien mukaiset arvot. Javassa vain ns. arvoparametreja (value parameter) Muodollinen parametri on kuin paikallinen (local) muuttuja, jolle annetaan kutsussa arvoksi todellinen parametri. Metodista palattaessa sidokset häviävät. Paikallisen muuttujan sidos ei näy metodin ulkopuolelle. 10/19/99 E. Hyvönen: Java Osa 3 47 Esimerkki class Laskin { // Alkeistyyppisen arg:n arvomuutos ei näy ulospäin void ylilasku () { int x = 1, y =2; int tulos = alilasku(x,y); System.out.println(x); // tulostuu 1 System.out.println(y); // tulostuu 2 System.out.println(tulos); // tulostuu 4 // yli-lasku int alilasku (int x, int y) { x++; y=x+2; // Eri x ja y kuin ylilasku:ssa return y; // Metodin kutsun arvo // ali-lasku // Luokkamäärittelyn loppu 10/19/99 E. Hyvönen: Java Osa 3 48 8

Esimerkki Paikallinen muuttuja voi viitata metodin ulkopuolella näkyvään tietoon. Jos tätä tietoa itseään modifioidaan (siis ei paikallisen muuttuajan sidosta tietoon), jäävät muutokset voimaan metodin laskennan jälkeenkin ja näkyvät ulkopuolelle. Näin metodi voi välittää tietoa ulospäin paitsi arvonsa kautta myös sivuvaikutuksina (side effect). Vain viittaustietotyyppiset parametrit voivat viitata tällaiseen muutettavissa olevaan tietoon (olioihin). Olioihin palataan myöhemmin. class Laskin { // Viitetyyppisen arg:n arvon muutos näkyy ulospäin void ylilasku () { StringBuffer x = new StringBuffer(); alilasku(x, "Näkyy "); alilasku(x, "ulos"); // Sijoitus tarpeeton System.out.println(x); // tulostuu: Näkyy ulos // yli-lasku void alilasku (StringBuffer x, String y) { x.append(y); // Eri x ja y kuin ylilasku:ssa, mutta viittaavat // samaan olioon, jota voi modifioida. // ali-lasku // Luokkamäärittelyn loppu 10/19/99 E. Hyvönen: Java Osa 3 49 10/19/99 E. Hyvönen: Java Osa 3 50 Metodin palauttama arvo Arvona palautetaan viite olioon Alla y ja x viittaavat ylilasku:ssa samaan olioon class Laskin { // Viitetyyppisen arg:n arvon muutos näkyy ulospäin void ylilasku () { StringBuffer x = new StringBuffer(); StringBuffer y = alilasku(x, "x:n ja y:n arvo "); System.out.println(x); // sama tulostus kuin alla System.out.println(y); // sama tulostus kuin yllä // yli-lasku StringBuffer alilasku (StringBuffer x, String y) { x.append(y); return x; // ali-lasku // Luokkamäärittelyn loppu 10/19/99 E. Hyvönen: Java Osa 3 51 Metodien kuormittaminen Luokan metodeilla voi olla sama nimi, mutta erilaiset parametrit eri määrä parametreja ainakin yksi eri tyyppinen parametri Tätä kutsutaan metodin kuomittamiseksi (overloading) Esimerkiksi metodi println on kuormitettu: void println(int n); // Tulostaa kokonaisluvun void println(double n); // Tulostaa liukuluvun void println(string str); // Tulostaa merkkijonon... 10/19/99 E. Hyvönen: Java Osa 3 52 //--------------------------------------------------------------- // Arto Wikla: Ohjelmoinnin perusteet Java-kielellä, OtaDATA 1998 // kappale 2.5.5, s. 46 //--------------------------------------------------------------- public class Nelio { private static void tulostanelio() { // "private static" selostetaan myöh. System.out.println("neliö"); private static void tulostanelio(int luku) { System.out.println(luku*luku); private static void tulostanelio(double luku) { System.out.println(luku*luku); jatkuu... 10/19/99 E. Hyvönen: Java Osa 3 53 jatkoa... private static void tulostanelio(int i, int j) { for (int a=0; a<i; ++a) { for (int b=0; b<j; ++b) System.out.print("*"); System.out.println(); public static void main(string[] args){ // PÄÄOHJELMA tulostanelio(); tulostanelio(12); // Double:n tunnistaa desimaali pisteestä tulostanelio(3.14); tulostanelio(4, 6); 10/19/99 E. Hyvönen: Java Osa 3 54 9

Metodin muuttujat/parametrit Metodityypit Metodissa määritellyt parametrit ja muuttujat ovat paikallisia muuttujia (local variable). Niitä voidaan käyttää vain metodin omassa algoritmissa. Muuttujien arvot säilyvät vain yhden kutsun ajan. Metodissa ei voi käyttää toisen metodin muuttujia. (Metodeissa voi luonnollisesti olla samannimisiä, mutta eri muuttujia.) Muuttujilla ei ole alkuarvoja. Parametrit saavat automaattisesti alkuarvot kutsunsa mukaan. Muuttuja on käytettävissä määrittelykohdastaan määrittelylohkonsa loppuun saakka. Eri määreiden ym. mekanismien avulla voidaan luoda erityyppisiä metodeja Keskeistä olioajattelun kalustoa. Metodityyppeihin palataan tarkemmin jatkossa 10/19/99 E. Hyvönen: Java Osa 3 55 10/19/99 E. Hyvönen: Java Osa 3 56 Kertausta Milloin aliohjelmia on syytä käyttää? Miten parametrit välitetään metodille? Voiko metodin parametrin arvosidos säilyä metodin laskennan jälkeen? Milloin metodin parametrin arvon muutokset voivat näkyä metodin ulkopuolelle? Lisätietoja Arto Wikla: Ohjelmoinnin perusteet Java-kielellä, OtaDATA, 1998. John Lewis, William Loftus: Java Software Solutions, Addison-Wesley, 1998. 10/19/99 E. Hyvönen: Java Osa 3 57 10/19/99 E. Hyvönen: Java Osa 3 58 10