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

Samankaltaiset tiedostot
12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1

11. Javan toistorakenteet 11.1

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

Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen. Ohjausrakenteet:

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

11. Javan valintarakenteet 11.1

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

14. Hyvä ohjelmointitapa 14.1

13. Hyvä ohjelmointitapa (osa 1) 13.1

13. Loogiset operaatiot 13.1

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

Sisällys. 16. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. Aritmetiikkaa toisin merkiten

16. Ohjelmoinnin tekniikkaa 16.1

16. Ohjelmoinnin tekniikkaa 16.1

Sisällys. 17. Ohjelmoinnin tekniikkaa. Aritmetiikkaa toisin merkiten. for-lause lyhemmin

Ehto- ja toistolauseet

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

Sisällys. 16. Lohkot. Lohkot. Lohkot

Sisällys. 15. Lohkot. Lohkot. Lohkot

Ohjausrakenteet. Valinta:

5/20: Algoritmirakenteita III

Muuttujat ja kontrolli. Ville Sundberg

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

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

Muistutus aikatauluista

OPPITUNTI 5 Ohjelman kulku

Ehto- ja toistolauseet

Algoritmit 1. Demot Timo Männikkö

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

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

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

Java-kielen perusteet

Java-kielen perusteet

Java-kielen perusteita

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

Algoritmit 1. Demot Timo Männikkö

Ohjelmointiharjoituksia Arduino-ympäristössä

5. HelloWorld-ohjelma 5.1

Osa. Toimintojen toteuttaminen ohjelmissa vaatii usein haarautumisia ja silmukoita. Tässä luvussa tutustummekin seuraaviin asioihin:

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteita

Luento 5. Timo Savola. 28. huhtikuuta 2006

Python-ohjelmointi Harjoitus 5

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

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

811120P Diskreetit rakenteet

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

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

Java kahdessa tunnissa. Jyry Suvilehto

12. Näppäimistöltä lukeminen 12.1

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

1. Omat operaatiot 1.1

Kaavioiden rakenne. Kaavioiden piirto symboleita yhdistelemällä. Kaavion osan valitseminen päätöksellä ja toistaminen silmukalla.

811120P Diskreetit rakenteet

Harjoitustyön testaus. Juha Taina

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

5.4. Sulautetun järjestelmän C-kielen perusteet. 4/8. Ohjausrakenteet pva

Ohjelmoinnin perusteet, syksy 2006

Sisällys. Kaavioiden rakenne. Kaavioiden piirto symboleita yhdistelemällä. Kaavion osan toistaminen silmukalla. Esimerkkejä. 2.2

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

5. HelloWorld-ohjelma 5.1

Ohjelmoinnin perusteet Y Python

Zeon PDF Driver Trial

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

3. Muuttujat ja operaatiot 3.1

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Ohjelmoinnin perusteet Y Python

Harjoitus 3 -- Ratkaisut

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

8. Näppäimistöltä lukeminen 8.1

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

8. Näppäimistöltä lukeminen 8.1

Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä.

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

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

4. Lausekielinen ohjelmointi 4.1

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat ja operaatiot

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

7. Näytölle tulostaminen 7.1

Muuttujien roolit Kiintoarvo cin >> r;

Javan perusteita. Janne Käki

if-lauseen yksinkertaisin muoto on sellainen, missä tietyt lauseet joko suoritetaan tai jätetään suorittamatta.

Python-ohjelmointi Harjoitus 2

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

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

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

ITKP102 Ohjelmointi 1 (6 op)

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

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

58131 Tietorakenteet ja algoritmit (kevät 2014) Uusinta- ja erilliskoe, , vastauksia

Tutoriaaliläsnäoloista

T Syksy 2004 Logiikka tietotekniikassa: perusteet Laskuharjoitus 12 (opetusmoniste, kappaleet )

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

Transkriptio:

Sisällys 12. Javan toistorakenteet Ylstä toistorakentsta. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirhtä. Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin lopettaminen break-lauseella. Sisäkkäiset silmukat. 12.1 12.2 Ylstä Toistorakentlla formalisoidaan algoritmin osien toistuva suoritus. Toisto voidaan ilmaista yhtäpitävästi while-, do-while- tai for-lauslla, mutta yleensä jokin näistä on tietyssä tilanteessa muita luontevampi. goto on varattu sana vaikka goto-rakenne ole Javassa käytettävissä Toistorakennetta kutsutaan lyhyesti silmukaksi (loop). Laskurimuuttujalla pidetään kirjaa siitä, monesko silmukan kierros on menllään, kun silmukan kierrosten määrä tunnetaan. Silmukkaa ohjataan lippumuuttujalla, kun silmukan kierrosten lukumäärää tunneta ennen silmukan käynnistymistä. Virheellisestä logiikasta voi seurata muun muassa silmukan toisto yhden kerran liikaa tai liian vähän tai silmukan loputon suorittaminen (ikuinen silmukka). Laskurimuuttujat Silmukan toistoa ohjaava ehtolause muotoillaan usn laskurimuuttujan (counter) avulla. Tyypillisesti laskurilla on kokonaislukuarvo, joka kasvaa yhdellä kullakin kierroksella. Voidaan nimetä lyhyesti ell ilmstä parempaa nimeä löydy. int i = 0; while (i < 10) { Laskurin arvoa voidaan päivittää myös tehtävään paremmin sopivin tavoin. int i = 10; while (i > 0) { i = i - 1; int i = 1; while (i < 7) { i = i + 2; 12.3 12.4

While-lause While-lause Lauseen sisältöä suoritetaan niin kauan kuin ehto on tosi (true). Sisältö merkitään Javalle kootulla lauseella, ohjelman lukijaa autetaan sisentämällä. Esiehtoinen ehto on lauseen alussa. Silmukan lauseet ohitetaan, jos ehto on epätosi jo while-lauseeseen tultaessa. Kootun lauseen voi poistaa, kun n = 1. Ylsesti: while (ehto) { lause 1; lause n; ehto lause 1 while (i <= lkm) { luku = In.readDouble(); summa = summa + luku; lause n // Tervehtimistä esiehtoisella silmukalla. public class Hppa1 { // Laskuri ja kierrosten lukumäärä. int i = 0; int lkm = 3; // Tervehditään lkm kertaa. while (i < lkm) { System.out.println("Hppa!"); Alku i 0 lkm 3 i < lkm Loppu Oletetaan, että lkm on aina nollaa suurempi. i i + 1 tulosta ("Hppa") 12.5 12.6 Do-while-lause Jälkiehtoinen ehto on lauseen lopussa. Lauseet suoritetaan ainakin kerran, mikäli tätä estetä valintarakenteella. Käytä, kun silmukoidaan vähintään kerran. Koottua lausetta pitäisi poistaa, kun n = 1. Lukija voi ymmärtää lauseen while-osan while-lauseeksi. Päätetään puolipisteeseen. Älä lisää puolipistettä whilelauseen ehdon jälkeen! Muista sisennys. Ylsesti: lause 1; lause n; while (ehto); luku = In.readDouble(); summa = summa + luku; while (i <= lkm); lause 1 lause n ehto Do-while-lause // Tervehtimistä jälkiehtoisella silmukalla. public class Hppa2 { // Laskuri ja kierrosten lukumäärä. int i = 0; int lkm = 3; // Tervehditään lkm kertaa. System.out.println("Hppa!"); while (i < lkm); Alku i 0 lkm 3 tulosta("hppa") i i + 1 i < lkm Loppu 12.7 12.8

For-lause For-lause Lausden esiehtoinen toisto laskurimuuttujan avulla. Voidaan korvata helposti whilelauseella. Jos n = 1, aaltosulkeet voidaan jättää pois. Muista edelleen sisentää sisältö. Ylsesti: for (laskurin alustus; ehto; laskurin päivitys) { lause 1; lause n; laskurin alustus ehto lause 1 lause n laskurin päivitys // Tervehtimistä esiehtoisella silmukalla. public class Hppa3 { // Laskuri ja kierrosten lukumäärä. int i; int lkm = 3; // Tervehditään lkm kertaa. for (i = 0; i < lkm; i = i + 1) System.out.println("Hppa!"); Alku lkm 3 i 0 i < lkm Loppu Vuokaaviona lähes kuin while-lause. i i + 1 tulosta ("Hppa") 12.9 12.10 Tyypillisiä ohjelmointivirhtä Ylsin silmukoihin liittyvä ohjelmointivirhe on se, että toistojen todellinen lukumäärä poikkeaa tavalla tai toisella ajatellusta lukumäärästä. Tällaisen looginen virhe voi olla hankalasti löydettävä, jos silmukan viimnen kierros jää suorittamatta tai silmukkaa suoritetaan yhden ylimääräisen kerran tai helposti löydettävä, mutta ohjelman suorituksen kannalta katastrofaalinen, jos ohjelma joutuu ikuiseen silmukkaan (eternal loop). Kierroksen liian lyhyt tai pitkä silmukka Jos silmukka jää kierroksen lyhyeksi tai menee kierroksen pitkäksi, on todennäköistä, että laskurin alkuarvo ja silmukan lopetusehto vät ole keskenään linjassa. Jos tavoitteena on esimerkiksi suorittaa n kierrosta alkuarvoa yksi käyttäen, lopetusehdoksi käy arvolle nolla sovitettu ehto, koska tällöin suoritetaan vain n - 1 kierrosta. int i = 1; int n = 3; // Suoritetaan kaksi kierrosta kolmen asemasta. while (i < n) { 12.11 12.12

Kierroksen liian lyhyt tai pitkä silmukka olkoon kierroksia n ja i laskurimuuttuja. // n kierrosta. for (i = 0; i < n; i = i + 1) Ikuinen silmukka Silmukan suoritus pääty koskaan virheellisen logiikan vuoksi. Kun Java-ohjelma joutuu ikuiseen silmukkaa, se voidaan pysäyttää CTRL-C-näppäinyhdistelmällä tai sulkemalla komentoikkuna. // n - 1 kierrosta. for (i = 1; i < n; i = i + 1) // n kierrosta. for (i = 1; i <= n; i = i + 1) // n + 1 kierrosta for (i = 0; i <= n; i = i + 1) int i = 0; while (i < 10); { System.out.println(i); int i; for (i = 10; i > 0; i = i + 1) System.out.println(i); int i = 0; while (i < 10) { System.out.println(i); char valinta; boolean jatketaan = true; while (jatketaan = true); 12.13 12.14 Lippumuuttujat Silmukan suoritusta voidaan ohjata myös niin sanotun lippumuuttujan (flag tai sentinel) avulla. Usmmiten boolean-tyyppiä. Hyödyllinen apuväline, kun toistojen määrää ole kiinnitetty kä laskurimuuttujasta siten ole hyötyä. Käytetään while- ja do-while-lausssa. Esimerkiksi tekstipohjaisten ohjelmien käyttöliittymässä on yleensä pääsilmukka, josta poistutaan vasta, kun käyttäjä antaa ohjelmalle lopetuskomennon jotain näppäintä painamalla. Lippumuuttujat char valinta; boolean jatketaan = true; // Suoritetaan lausta ja luetaan käyttäjän // komento valinta-muuttujaan. // Asetetaan uusi arvo lippumuuttajalle, kun lopetetaan. if (valinta == LOPETA) jatketaan = false; while (jatketaan); Boolean-tyyppistä lippua tarvitse verrata silmukan ehdossa true- tai false-arvoihin, koska lippu jo itsessään sisältää totuusarvon. 12.15 12.16

Break-lause Keskeyttää (sisimmän) silmukan suorituksen. Käytetään aina ehdollisena, koska silmukka pysähtyy välittömästi. Käyttöä syytä välttää, koska breaklause (break) tekee koodista vaikeaselkoista ja on korvattavissa lippumuuttujalla. Continue-lause (continue) pysäyttää kierroksen, mutta silmukan suoritusta jatketaan, mikäli kierroksia on jäljellä. // Erittäin huonoa koodia, // jossa käytetään ikuista // silmukkaa ja break- // lausetta. while (true) { // Katkaistaan silmukka. if () break; Sisäkkäiset silmukat Joissakin tehtävissä kuten arvojen lajittelussa ja taulukoiden käsittelyssä toistorakentta yhdistetään siten, että toistorakenne sisältyy toiseen toistorakenteeseen. Tällainen rakenne tunnetaan sisäkkäisinä silmukoina (nested loops). Silmukoita voi olla sisäkkäin kaksi tai useampia. Tällä kurssilla rajoitutaan pääasiassa yksinkertaisimpaan sisäkkäiseen toistorakenteeseen, jossa on yksi ulompi ja yksi sisempi silmukka. Jokaisella ulomman silmukan kierroksella suoritetaan kaikki sisemmän silmukan kierrokset. Jos ulommassa silmukassa on m kierrosta ja sisemmässä silmukassa n kierrosta, niin sisempään silmukkaan liittyvät lauseet suoritetaan m n kertaa. 12.17 12.18 Sisäkkäiset silmukat Sisäkkäiset silmukat // Tulostaa näytölle suorakaiteen. public class SuorakaiteenTulostus { // Vakiot rivien ja sarakkden lukumäärille sekä tulostusmerkille. final int RIVEJA = 3; final int SARAKKEITA = 7; final char MERKKI = '*'; // Rivi- ja sarakelaskurit. int rivi; int sarake; // Tulostus kahden silmukan avulla. for (rivi = 0; rivi < RIVEJA; rivi = rivi + 1) { for (sarake = 0; sarake < SARAKKEITA; sarake = sarake + 1) System.out.print(MERKKI); System.out.println(); Peräkkäiset ja sisäkkäiset silmukat ovat eri asia. Peräkkäiset silmukat ovat toisistaan riippumattomia, kun taas ulompien silmukoiden suoritus ohjaa sisempien silmukoiden suoritusta. Peräkkäisiä silmukoita: for (i = 0; i < LKM; i = i+1) { while (j > LKM) { Sisäkkäisiä silmukoita: for (i = 0; i < A; i = i+1) for (j = 0; j < B; j = j+1) { 12.19 12.20

Sisäkkäiset silmukat Joskus ulompi silmukka voi sisältää useampia peräkkäisiä silmukoita, jolloin nämä silmukat suoritetaan kukin vuorollaan aina kullakin ulomman silmukan kierroksella. // Pääsilmukka. // 1. sisempi silmukka. for (i = 0; i < A; i = i + 1) { // 2. sisempi silmukka. while (j > B) { while (valinta!= LOPETUS); 12.21