11. Javan toistorakenteet 11.1

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

12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1

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

11. Javan valintarakenteet 11.1

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

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

13. Loogiset operaatiot 13.1

11. Javan valintarakenteet 11.1

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

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

13. Loogiset operaatiot 13.1

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

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

16. Ohjelmoinnin tekniikkaa 16.1

16. Ohjelmoinnin tekniikkaa 16.1

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

Sisällys. 15. Lohkot. Lohkot. Lohkot

14. Hyvä ohjelmointitapa 14.1

Sisällys. 16. Lohkot. Lohkot. Lohkot

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

13. Hyvä ohjelmointitapa (osa 1) 13.1

Ohjausrakenteet. Valinta:

Ehto- ja toistolauseet

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

Ehto- ja toistolauseet

Java-kielen perusteet

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

Java-kielen perusteita

Algoritmit 1. Demot Timo Männikkö

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

Java-kielen perusteita

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

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

5/20: Algoritmirakenteita III

5. HelloWorld-ohjelma 5.1

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

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

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

Muistutus aikatauluista

Luento 5. Timo Savola. 28. huhtikuuta 2006

Ohjelmointiharjoituksia Arduino-ympäristössä

Algoritmit 1. Demot Timo Männikkö

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

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

58131 Tietorakenteet ja algoritmit (syksy 2015)

OPPITUNTI 5 Ohjelman kulku

ITKP102 Ohjelmointi 1 (6 op)

7. Näytölle tulostaminen 7.1

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

Ohjelmoinnin perusteet, syksy 2006

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

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

Java-kielen perusteet

1. Omat operaatiot 1.1

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

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

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

Metodien tekeminen Javalla

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

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

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

Muuttujat ja kontrolli. Ville Sundberg

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

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

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

5. HelloWorld-ohjelma 5.1

Informaatioteknologian laitos Olio-ohjelmoinnin perusteet / Salo

811120P Diskreetit rakenteet

Taulukoiden käsittely Javalla

Harjoitustyön testaus. Juha Taina

Harjoitus 3 -- Ratkaisut

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

ALGORITMIT 1 DEMOVASTAUKSET KEVÄT 2012

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

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

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet, kurssikoe

811120P Diskreetit rakenteet

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

Java kahdessa tunnissa. Jyry Suvilehto

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

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

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

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

Ohjelmoinnin perusteet Y Python

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Listarakenne (ArrayList-luokka)

14. Poikkeukset 14.1

Zeon PDF Driver Trial

Python-ohjelmointi Harjoitus 5

Tietorakenteet (syksy 2013)

14. Poikkeukset 14.1

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

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

9. Periytyminen Javassa 9.1

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

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

Rajapinta (interface)

Transkriptio:

11. Javan toistorakenteet 11.1

Sisällys Laskuri- ja lippumuuttujat. Sisäkkäiset silmukat. Tyypillisiä ohjelmointivirheitä: Silmukan rajat asetettu kierroksen verran väärin. Ikuinen silmukka. Silmukoinnin lopettaminen break-lauseella. 11.2

Yleistä Toisto ilmaistaan while-, do-while- tai for-lauseella. Lauseet toimivat lähes kuten pseudokoodivastineensa - ehtolausekkeet on vain esitettävä Javan merkintätavoin. Toistorakenteita sanotaan tuttavallisemmin silmukoiksi (loop). goto varattu sana vaikka goto-rakenne ei ole Javassa käytettävissä. 11.3

Laskurimuuttujat Silmukan toistoa ohjaava ehtolause muotoillaan usein laskurimuuttujan (counter) avulla. Tyypillisesti laskurilla on kokonaislukuarvo, joka kasvaa yhdellä kullakin kierroksella. Voidaan nimetä lyhyesti. Esim. int i = 0; while (i < 10) { i = i + 1;... Laskurin arvoa voidaan päivittää myös tehtävään paremmin sopivin tavoin. Esim. int i = 10; while (i > 0) { i = i - 1;... Esim. int i = 1; while (i < 7) { i = i + 2;... 11.4

Lippumuuttujat Silmukan suoritusta voidaan ohjata myös niin sanotun lippumuuttujan (flag) avulla. Hyödyllinen apuväline, kun toistojen määrää ei ole kiinnitetty eikä laskurimuuttujasta siten ole hyötyä. Käytetään while- ja do-while-lauseissa. 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. 11.5

Lippumuuttujat Esim. char valinta; boolean jatketaan = true; do { // Suoritetaan lauseita ja luetaan käyttäjän // komento valinta-muuttujaan. // Asetetaan uusi arvo lippumuuttajalle, kun lopetetaan. if (valinta == LOPETA) jatketaan = false; while (jatketaan); Pääsilmukoita on tehty jo aikaisemmin ja niihin palataan, kun opitaan kuinka syötteitä luetaan Javassa. 11.6

while- ja do-while-lauseet while (ehto) { lause 1;... lause m; do { lause 1;... lause n; while (ehto); Esiehto: lauseita suoritetaan niin kauan kuin ehto on tosi. Aaltosulkeet voi jättää pois, jos m = 1. Jälkiehto: lauseet suoritetaan ainakin kerran. Aaltosulkeita ei voi jättää pois, jos n = 1. 11.7

Heippa1-algoritmi Java-ohjelmana public class Heippa1 { public static void main(string[] args) { // Muuttujat laskurille ja kierrosten lukumäärälle. int i = 0; int lkm = 3; // Esiehtoinen toisto, jossa tervehditään lkm kertaa. while (i < lkm) { System.out.println("Heippa!"); i = i + 1; 11.8

Heippa2-algoritmi Java-ohjelmana public class Heippa2 { public static void main(string[] args) { // Muuttujat laskurille ja kierrosten lukumäärälle. int i = 0; int lkm = 3; // Jälkiehdon vuoksi tervehdittäisiin aina vähintään kerran // ellei do-while lausetta olisi sijoitettu if-lauseen sisään. if (lkm > 0) // Tervehditään lkm kertaa. do { System.out.println("Heippa!"); i = i + 1; while (i < lkm); 11.9

for-lause for (laskurin alustus; ehto; laskurin päivitys) { lause 1;... lause n; Ensin: Alustetaan laskuri ja tarkistetaan ehto. Sitten: Jos ehto oli tosi, niin suoritetaan lauseet ja päivitetään laskuria, kunnes ehto on epätosi. Huom! Jos n = 1, aaltosulkeet voidaan jättää pois. 11.10

Heippa3-algoritmi Java-ohjelmana public class Heippa3 { public static void main(string[] args) { // Muuttujat laskurille ja kierrosten lukumäärälle. int i; int lkm = 3; // Tervehditään lkm kertaa. for (i = 0; i < lkm; i = i + 1) System.out.println("Heippa!"); 11.11

Sisäkkäiset silmukat Joissakin tehtävissä - kuten arvojen lajittelussa ja taulukoiden käsittelyssä - toistorakenteita yhdistetään siten, että toistorakenne sisältyy toiseen toistorakenteeseen. Tällainen rakenne tunnetaan lyhyesti sisäkkäisinä silmukoina (nested loops). Silmukoita voi olla sisäkkäin kaksi tai useampia. 11.12

Sisäkkäiset silmukat 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. Olkoon ulommassa silmukassa m kierrosta ja sisemmässä silmukassa n kierrosta. Tällöin sisempään silmukkaan liittyvät lauseet suoritetaan m n kertaa. 11.13

Sisäkkäiset silmukat public class SisakkaisetSilmukat { public static void main(string[] args) { // Vakiot rivien ja sarakkeiden 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(); 11.14

Sisäkkäiset silmukat 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) {...... 11.15

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. do {... // 1. sisempi silmukka. for (i = 0; i < A; i = i + 1) {...... // 2. sisempi silmukka. while (j > B) {...... while (valinta!= LOPETUS); 11.16

Tyypillisiä ohjelmointivirheitä Yleisin silmukoihin liittyvä ohjelmointivirhe on se, että toistojen todellinen lukumäärä poikkeaa tavalla tai toisella ajatellusta lukumäärästä. Tällaisen loogisen virheen seuraus voi olla lievä, jolloin silmukan viimeinen kierros jää usein suorittamatta tai silmukkaa suoritetaan yhden ylimääräisen kerran tai vakava, jolloin ohjelma joutuu ikuiseen silmukkaan (eternal loop). 11.17

Kierroksen liian lyhyt tai pitkä silmukka Jos silmukka jää kierroksen lyhyeksi tai menee kierroksen pitkäksi, on virhe yleensä laskurin alkuarvossa tai silmukan lopetusehdossa. Tarkastellaan tyypillistä tilannetta, jossa laskuri on kokonaislukutyyppinen, laskurin alkuarvo on nolla (tai yksi) ja laskurille annetaan arvoksi peräkkäisiä kokonaislukuja. 11.18

Kierroksen liian lyhyt tai pitkä silmukka Esim. Suoritetaan silmukkaa viisi kertaa käyttäen laskurina i-muuttujaa. Tällöin i:n arvot voivat olla joko 0, 1, 2, 3 ja 4 tai 1, 2, 3, 4 ja 5. Kurssimateriaalissa käytetään yleensä nollasta alkavaa laskentaa. Omissa ratkaisuissa alkuarvona voi käyttää joko nollaa tai ykköstä, koska tämä on makuasia. On kuitenkin muistettava, että alkuarvo on huomioitava silmukan lopetusehdossa. 11.19

Kierroksen liian lyhyt tai pitkä silmukka Jos on esimerkiksi tavoitteena suorittaa n kierrosta alkuarvoa yksi käyttäen, ei lopetusehdoksi käy arvolle nolla sovitettu ehto, koska tällöin suoritetaan vain n - 1 kierrosta. Esim. int i = 1; int n = 3; // Suoritetaan 2 kierrosta 3:n asemasta. while (i < n) { i = i + 1;... 11.20

Kierroksen liian lyhyt tai pitkä silmukka Esim. Olkoon kierroksia n ja i laskurimuuttuja. // n kierrosta. for (i = 0; i < n; i = i + 1)... // 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)... 11.21

Ikuinen silmukka Silmukka, jonka suoritus ei 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. Esim. while (true) ; Esim. int i; for (i = 10; i > 0; i = i + 1) System.out.println(i); 11.22

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 break-lause tekee koodista vaikeaselkoista ja on korvattavissa lippumuuttujalla. continue-lause pysäyttää kierroksen, mutta silmukan suoritusta jatketaan, mikäli kierroksia on jäljellä. 11.23

break-lause public class Break1 { public static void main(string[] args) { int summa = 0; int i = 0; while (i < 300) { summa = summa + i; // Ei suostuta kasvattamaan summaa paljon yli tuhannen. if (summa > 1000) { System.out.println(summa); // 1038 break; i = i + 1; 11.24

break-lause public class Break2 { public static void main(string[] args) { int i = 0; // Lopetetaan ikuinen silmukka break-lauseella. do { i = i + 1; if (i > 100) break; while (1 < 2); 11.25