OPPITUNTI 5 Ohjelman kulku

Samankaltaiset tiedostot
12. Javan toistorakenteet 12.1

12. Javan toistorakenteet 12.1

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

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

11. Javan toistorakenteet 11.1

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

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

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

Ehto- ja toistolauseet

Python-ohjelmointi Harjoitus 2

OPPITUNTI 3 Ensimmäinen skripti

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

Ohjausrakenteet. Valinta:

Luento 5. Timo Savola. 28. huhtikuuta 2006

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

JavaScript alkeet Esimerkkikoodeja moniste 2 ( Metropolia)

Ohjelmoinnin perusteet Y Python

Java-kielen perusteita

Ohjelmointiharjoituksia Arduino-ympäristössä

Python-ohjelmointi Harjoitus 5

13. Loogiset operaatiot 13.1

11. Javan valintarakenteet 11.1

13. Loogiset operaatiot 13.1

Palvelinpuolen ohjelmointi

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

5/20: Algoritmirakenteita III

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

16. Ohjelmoinnin tekniikkaa 16.1

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

OSA II Kieli. Oppitunti. 4. Rakennuslohkot 5. Ohjelman kulku 6. Funktiot 7. Taulukot 8. Oliot

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

UML -mallinnus TILAKAAVIO

16. Ohjelmoinnin tekniikkaa 16.1

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

Java-kielen perusteet

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

Ohjelmoinnin perusteet Y Python

11. Javan valintarakenteet 11.1

6. Funktiot 85. Kuinka funktioita määritellään ja kutsutaan. Kuinka funktioille viedään arvoja ja niistä palautetaan arvoja

Muistutus aikatauluista

Ohjelmoinnin perusteet Y Python

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

Sisällys. 16. Lohkot. Lohkot. Lohkot

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteet

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

Ohjelmoinnin perusteet Y Python

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

811120P Diskreetit rakenteet

Ohjelmoinnin perusteet Y Python

Sisällys. 15. Lohkot. Lohkot. Lohkot

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

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

Zeon PDF Driver Trial

Ohjelmoinnin peruskurssi Y1

811120P Diskreetit rakenteet

Ctl160 Tekstikorpusten tietojenkäsittely Kolmas luento,

Tutoriaaliläsnäoloista

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

Ehto- ja toistolauseet

Muuttujien roolit Kiintoarvo cin >> r;

Ohjelmoinnin peruskurssi Y1

JavaScript alkeet Esimerkkikoodeja moniste 2

Osa. Listaus 2.1. HELLO.CPP esittelee C++ -ohjelman osat. 14: #include <iostream.h> 15: 16: int main() 17: {

4. oppitunti. Ilmaukset ja ohjelmalauseet. Osa

Muuttujat ja kontrolli. Ville Sundberg

Ohjelmoinnin peruskurssi Y1

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

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

Erittäin nopea tapa saada kehitysympäristö php:lle pystyyn Voidaan asentaa muistitikulle

Ohjelmoinnin peruskurssi Y1

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

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

OPPITUNTI 11 DBM-funktioiden käyttö

Harjoitus 3 -- Ratkaisut

Ohjelmoinnin perusteet Y Python

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

Palautetta viime luennosta

Apuja ohjelmointiin» Yleisiä virheitä

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ohjelmoinnin perusteet Y Python

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

8. Oliot 123. Kuinka luokkia luodaan ja olioita saadaan aikaan. Kuinka luodaan ja käsitellään ominaisuuksia ja metodeja

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

4.3. Matemaattinen induktio

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

Muuttujatyypit ovat Boolean, Byte, Integer, Long, Double, Currency, Date, Object, String, Variant (oletus)

Ohjelmoinnin perusteet Y Python

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

Algoritmit 1. Demot Timo Männikkö

Transkriptio:

5. Ohjelman kulku 67 OPPITUNTI 5 Ohjelman kulku Viime tunnilla luomamme skriptit olivat suoraviivaisia. Ohjelmalauseet suoritettiin aina samassa järjestyksessä, joten ohjelmissamme ei ollut lainkaan joustavuutta. Tutkimme nyt joitakin rakenteita, joiden avulla skriptit voivat sopeutua eri olosuhteisiin. Tämän tunnin aiheita ovat seuraavat: Kuinka ohjelmassa voidaan haarautua if-lauseessa olevan testin perusteella Kuinka ohjelmassa voidaan suorittaa vaihtoehtoinen koodilohko, jos if-lauseessa olevan testin tulos ei ole tosi Kuinka switch-case-rakenteen avulla suoritetaan testilausekkeen antamaa tulosta vastaava koodi Kuinka koodilohkoa suoritetaan toistuvasti while-rakenteen avulla Kuinka for-silmukkaa käytetään Kuinka silmukoista voidaan hypätä pois Kuinka silmukoita laitetaan sisäkkäin

68 5. Ohjelman kulku Ohjelman kulun muuttaminen Useimmat skriptit suorittavat ehtolauseita ja muuttavat käytöstään niiden perusteella. Kyky tehdä päätöksiä tekee PHP-sivuista dynaamisia, koska tällöin sivujen toiminta ja tulostus voi muuttua olosuhteiden mukaan. Kuten useimmissa ohjelmointikielissä, myös PHP4:ssä on if-lause päätöksenteon mahdollistamiseen. If-lause If-lause tutkii sulkumerkkien sisällä olevaa testilauseketta. Jos lausekkeen tulos on tosi, suoritetaan iflauseen rungon koodilohko. Muutoin koko koodilohko ohitetaan. Näin skriptit voivat tehdä päätöksiä useidenkin eri tekijöiden perusteella. if ( lauseke ) { // koodi, joka suoritetaan, jos lauseke on tosi } Listaus 5.1 suorittaa koodilohkon, jos muuttujassa on merkkijono "happy". Listaus 5.1 If-lause 3: <title>listing 5.1</title> 7: $mood = "happy"; 8: if ( $mood == "happy" ) 9: { 10: print "Hooray, I'm in a good mood"; 11: } 12:?> 13: </body> 14: </html>

5. Ohjelman kulku 69 Ohjelma käyttää yhtäsuuruuden vertailun operaattoria (==) vertaamaan muuttujaa $mood merkkijonoon happy. Jos merkkijonot ovat samoja, lausekkeen tulos on tosi ja if-lauseen alla oleva koodi suoritetaan. Vaikka koodi onkin nyt aaltosulkujen sisällä, aaltosulkuja tarvitaan normaalisti vain silloin, kun if-lauseen rungossa on enemmän kuin yksi ohjelmalause. Seuraava koodi olisi siis myöskin sopiva: if ( $mood == "happy" ) print "Hooray, I'm in a good mood"; Jos muutat muuttujan $mood arvoksi sad ja ajat skriptin, testiehto on epätosi ja koodi ohitetaan. Tällöin skripti jää mykäksi. Else-osan käyttö if-lauseessa Kun työskentelet if-lauseella, saatat usein haluta määrittää vaihtoehtoisen koodin, joka suoritetaan silloin, kun if-lauseen testilauseke on epätosi. Voit tehdä niin lisäämällä else-osan if-rakenteeseen: if ( lauseke ) { // koodi, joka suoritetaan, jos testi on tosi } else { // koodi, joka suoritetaan muutoin } Listaus 5.2 on lisännyt listaukseen 5.1 koodin, jonka mukaan suoritetaan tietty koodi silloin, kuin testiehto ei ole tosi. Listaus 5.2 If-lause, jossa mukana else 3: <title>listing 5.2</title> 7: $mood = "sad";

70 5. Ohjelman kulku 8: if ( $mood == "happy" ) 9: { 10: print "Hooray, I'm in a good mood"; 11: } 12: else 13: { 14: print "Not happy but $mood"; 15: } 16:?> 17: </body> 18: </html> Nyt $mood sisältää merkkijonon sad, joka ei ole sama kuin happy, joten if-lauseen testi antaa tuloksen false. Tällöin if-rungon koodi ohitetaan. Sen sijaan suoritetaan else-osan jälkeinen koodi, joka tulostaa viestin "Not happy but sad" selaimelle. Else-osan avulla voidaan toteuttaa kehittyneempiä päätöksentekoprosesseja, mutta edelleenkin joudutaan rajoittumaan joko-tai-haarautumiseen. PHP4 sallii kuitenkin useiden peräkkäisten testilausekkeiden tutkimisen. Elseif-osan käyttäminen if-lauseessa Voit käyttää if-elseif-else-rakennetta ohjelmissasi testaamaan useita lausekkeita ennen oletuskoodin käyttämistä: if ( lauseke ) { // koodi, joka suoritetaan, jos testi on tosi } elseif ( another expression ) { // koodi, joka suoritetaan, jos edellinen testi oli epätosi // ja tämä on tosi else { // koodi, joka suoritetaan muutoin }

5. Ohjelman kulku 71 Jos ensimmäinen lauseke ei ole tosi, ensimmäinen koodilohko ohitetaan. Sen jälkeen tutkitaan testilauseke uudelleen elseif-osan toimesta. Jos lauseke antaa nyt tuloksen tosi, suoritetaan toinen koodilohko. Muutoin suoritetaan vasta else-osan jälkeen oleva koodilohko. Ohjelmaan voidaan sijoittaa haluttu määrä elseif-osia; else-osa voi jäädä pois, jos mitään oletuskoodia ei haluta laittaa mukaan. Listaus 5.3 lisää elseif-osan edelliseen esimerkkiimme. Listaus 5.3 If-lause, joka käyttää else- ja elseif-osia 3: <title>listing 5.3</title> 7: $mood = "sad"; 8: if ( $mood == "happy" ) 9: { 10: print "Hooray, I'm in a good mood";.black plate (81,1) 11: } 12: elseif ( $mood == "sad" ) 13: { 14: print "Awww. Don't be down!"; 15: } 16: else 17: { 18: print "Neither happy nor sad but $mood"; 19: } 20:?> 21: </body> 22: </html> Nytkin muuttujassa $mood on merkkijono sad. Teksti ei ole sama kuin happy, joten ensimmäinen koodilohko ohitetaan. Sitten elseif-osa testaa, onko muuttujassa arvo sad ja testin tulos on tosi. Siksi suoritetaankin seuraavana oleva koodilohko.

72 5. Ohjelman kulku Switch-rakenne Switch-rakenne on vaihtoehtoinen keino muuttaa ohjelman kulkua testilausekkeen tuloksen mukaan. Switch-rakenteen ja if-lauseen välillä on joitakin peruseroja. Käyttämällä if-lausetta elseif-osan kanssa voidaan toteuttaa useita testejä. Switch suorittaa aina vain yhden lausekkeen, jonka tuloksena on jokin yksinkertaista tietotyyppiä oleva arvo (numero, merkkijono tai totuusarvo) ja sitten toteutetaan tuota arvoa vastaava koodi. If-lauseessa olevan testilausekkeen arvo voi olla vain joko tosi tai epätosi. Sen sijaan switch-rakenteen lausekkeen tulosta voidaan verrata kuinka moneen arvoon tahansa. switch ( lauseke ) { case result1: // suorita tämä, jos lausekkeen tulos on result1 break; case result2: // suorita tämä, jos lausekkeen tulos on result2 break; default: // suorita tämä, jos break-komentoa ei ole kohdattu aiemmin } Switch-lauseen lauseke on usein pelkkä muuttuja. Switch-rakenteen sisällä on monesti lukuisa määrä case-osia. Kukin case-osa vertaa lausekkeen tuottamaa tulosta case-arvoon. Jos arvot ovat samoja, suoritetaan case-osan jälkeinen koodi. Break-lause päättää switch-rakenteen suorittamisen. Jos breakosa puuttuu, jatketaan switch-rakenteessa alaspäin, kunnes seuraava break-lause tai default-osa kohdataan. Jos default-osa kohdataan, sen koodi suoritetaan. Älä unohda sijoittaa break-lausetta jokaisen case-osan jälkeisen koodin viimeiseksi lauseeksi. Jos break puuttuu, ohjelman suoritus jatkuu seuraavaan case-osaan ja jopa default-osaan saakka. Useimmiten ohjelma ei tällöin toimi niin kuin halusit sen toimivan. Listaus 5.4 toteuttaa aiemman if-esimerkkiohjelman switch-rakenteen avulla. Listaus 5.4 Switch-lause

5. Ohjelman kulku 73 3: <title>listing 5.4</title> 7: $mood = "sad"; 8: switch ( $mood ) 9: { 10: case "happy": 11: print "Hooray, I'm in a good mood"; 12: break; 13: case "sad": 14: print "Awww. Don't be down!"; 15: break; 16: default: 17: print "Neither happy nor sad but $mood"; 18: } 19:?> 20: </body> 21: </html> Tässäkin esimerkissä muuttuja $mood alustetaan merkkijonolla sad. Switch-lause käyttää tätä muuttujaa lausekkeessaan. Ensimmäinen case-osa testaa, onko muuttujassa $mood arvo happy. Näin ei ole, joten skripti jatkaa seuraavaan case-osaan. Nyt sad on sama kuin $mood-muuttujan arvo, joten suoritetaan vastaava koodilohko. Break päättää prosessin. Ehto-operaattorin käyttö Ehto-operaattori muistuttaa if-lausetta, mutta se palauttaa arvon, joka voi johtua kahdesta eri lausekkeesta. Nuo lausekkeet erotetaan toisistaan kaksoispisteellä (:). Se, mitä lauseketta käytetään arvon generoimiseen, riippuu testilausekkeen tuloksesta: (lauseke)? palautetaan, jos lauseke on tosi:palautetaan, jos lauseke on epätosi;

74 5. Ohjelman kulku Jos testin tulos on tosi, palautetaan ensimmäisenä oleva arvo. Muutoin palautetaan toisena oleva arvo. Listaus 5.5 käyttää ehto-operaattoria asettamaan muuttujan arvon $mood-muuttujassa olevan arvon mukaan. Listaus 5.5 Ehto-operaattorin käyttäminen 3: <title>listing 5.5</title> 7: $mood = "sad"; 8: $text = ( $mood=="happy" )?"Hooray, I'm in a good mood":"not happy but $mood"; 9: print "$text"; 10:?> 11: </body> 12: </html> Muuttujaan $mood sijoitetaan arvo sad. Sitten testataan, onko muuttujassa arvo happy. Koska testin tulos on epätosi, palautetaan viimeisen lausekkeen tulos. Ehto-operaattoria voi olla vaikea lukea, mutta se sopii hyvin käyttöön, kun vaihtoehtoja on vain kaksi. Sen avulla saadaan myös tiiviimpää koodia. Silmukat Toistaiseksi olemme tutkineet päätöksentekoa; skripti voi tehdä päätöksen siitä, mikä koodi suoritetaan seuraavaksi. Skripti voi lisäksi toistaa samaa koodia tietyn kertamäärän. Silmukkarakenteet on kehitetty toistuvien toimintojen suorittamiseen. Lähes aina silmukka jatkaa suorittamistaan, kunnes tietty ehto on saavutettu. Silmukasta voidaan myös poistua kesken kaiken, kun jokin ehto toteutuu. While-lause While-lause muistuttaa hieman if-lausetta: while ( lauseke ) { // koodia }

5. Ohjelman kulku 75 Niin kauan kuin rakenteen testilauseke on tosi, suoritetaan koodilohkoa toistuvasti. Lohkon sisällä tapahtuu yleensä jotain, mikä vaikuttaa rakenteen testilausekkeeseen. Muutoin silmukka olisi päättymätön. Listaus 5.6 luo while-silmukan, joka laskee ja tulostaa kahden kerrannaisia. Listaus 5.6 While-lause 3: <title>listing 5.6</title> 7: $counter = 1; 8: while ( $counter <= 12 ) 9: { 10: print "$counter times 2 is ".($counter*2)."<br>"; 11: $counter++; 12: } 13:?> 14: </body> 15: </html> Tässä esimerkissä alustetaan ensin muuttuja $counter. While-lause testaa muuttujan arvon. Niin kauan kuin muuttujan arvo on pienempi tai yhtäsuuri kuin 12, silmukka jatkaa suoritustaan. While-silmukan sisällä on koodilohko, jossa muuttujan $counter-arvo tuplataan ja tulostetaan selaimelle. Sitten muuttujaa kasvatetaan yhdellä. Juuri tuo viimeinen vaihe on tärkeä, koska ilman muuttujan $counter muuttamista ei testilausekkeen arvoksi tulisi koskaan false-arvoa. Jos testilauseke ei muuttuisi, silmukka olisi päättymätön. Do-while-lause Do-while-lause näyttää ylösalaisin käännetyltä while-lauseelta. Olennainen ero noiden kahden rakenteen välillä on siinä, että do-while-rakenteessa koodilohko suoritetaan ennen testin suorittamista eikä sen jälkeen: do { // koodi } while (lauseke);

76 5. Ohjelman kulku Testilausekkeen tulee do-while-rakenteessa päättyä aina puolipisteeseen, koska koko rakenne päättyy siihen. Tämä lause saattaisi olla hyödyllinen silloin, kun koodilohko tulee suorittaa ainakin kerran, vaikka testin tulos olisi epätosi. Listaus 5.7 luo do-while-rakenteen. Koodilohko suoritetaan yhden kerran. Listaus 5.7 Do-while-lause 3: <title>listing 5.7</title> 7: $num = 1; 8: do 9: { 10: print "Execution number: $num<br>\n"; 11: $num++; 12: } 13: while ( $num > 200 && $num < 400 ); 14:?> 15: </body> 16: </html> Do-while-lause testaa, onko muuttujassa $num oleva arvo suurempi kuin 200 ja pienempi kuin 400. Muuttujassa on alkuarvona 1, joten lauseke palauttaa arvon false. Siitä huolimatta koodilohko suoritetaan yhden kerran ja se tulostaa yhden rivin selaimelle. For-lause For-rakenteella ei voida tehdä mitään sellaista, jota ei voitaisi toteuttaa while-lauseella. Toisaalta forrakenne on usein nätimpi ja turvallisempi tapa toteuttaa sama toiminto. Listauksessa 5.6 alustimme muuttujan while-silmukan ulkopuolella. Sitten while-rakenteen testilauseke testasi muuttujan. Muuttujaa kasvatettiin sitten koodilohkossa. For-lauseessa voidaan nuo toiminnot suorittaa suoraan for-lauseen

5. Ohjelman kulku 77 otsikkorivillä. Näin saadaan tiiviimpää koodia ja on helpompi muistaa muuttujan kasvattaminen, joten päättymättömien silmukoiden tekemisen vaara on vähäisempi kuin while-silmukkaa käytettäessä. for ( alustus; testaus; kasvatus ) { // suoritettava koodi } For-lauseen otsikossa olevat lausekkeet erotetaan toisistaan puolipisteillä. Tavallisesti ensimmäinen lauseke alustaa laskurimuuttujan, toinen testaa ehdon ja kolmas kasvattaa muuttujaa. Listaus 5.8 käyttää for-silmukkaa; kyseessä on listauksen 5.6 päivitys. Listaus 5.8 For-lauseen käyttäminen 3: <title>listing 5.8</title> 7: for ( $counter=1; $counter<=12; $counter++ ) 8: { 9: print "$counter times 2 is ".($counter*2)."<br>"; 10: } 11:?> 12: </body> 13: </html>

78 5. Ohjelman kulku Listausten 5.6 ja 5.8 tulokset ovat aivan samoja. For-lause tekee kuitenkin tiiviimpää koodia. Koska muuttuja $counter alustetaan ja sitä kasvatetaan for-silmukan otsikossa, silmukan toimintaa on helppo ymmärtää. For-silmukan otsikossa alustetaan $counter ensin arvolla 1, sitten testilauseke testaa, onko muuttujan arvo pienempi tai yhtäsuuri kuin 12. Viimeinen lauseke kasvattaa muuttujan arvoa yhdellä. Kun ohjelman kulku saavuttaa for-silmukan, $counter-muuttujaa kasvatetaan ja testilauseke suoritetaan. Jos testin tulos on true, koodilohko suoritetaan. Sitten muuttujaa kasvatetaan ja testi suoritetaan uudelleen. Tätä prosessia jatketaan, kunnes testin tulos on false. Silmukoista poistuminen break-lauseella Sekä while- että for-lauseet käyttävät sisäisiä testejä, joiden avulla silmukat voidaan päättää. Breaklause mahdollistaa kuitenkin silmukan lopettamisen muiden testiehtojen mukaan. Menettelyllä voidaan ehkäistä virheitä. Listaus 5.9 luo yksinkertaisen for-rakenteen, joka jakaa suuren luvun muuttujalla, jota inkrementoidaan. Tulos esitetään näytöllä. Listaus 5.9 For-silmukka, joka jakaa luvun 4000 kymmenellä peräkkäisellä kokonaisluvulla 3: <title>listing 5.9</title> 7: for ( $counter=1; $counter <= 10, $counter++ ) 8: { 9: $temp = 4000/$counter; 10: print "4000 divided by $counter is... $temp<br>"; 11: } 12:?> 13: </body> 14: </html> Esimerkissä muuttuja $counter alustetaan ensin arvolla 1. For-lauseen testi tarkistaa, onko muuttujan arvo pienempi tai yhtäsuuri kuin 10. Koodilohkossa arvo 4000 jaetaan $counter-muuttujan arvolla ja tulos esitetään näytöllä. Kaikki näyttää aivan selkeältä. Mutta entäpä jos muuttujan $counter arvo saadaan käyttäjältä? Tuo arvo voi olla negatiivinen tai jopa merkkijono. Katsokaamme ensimmäistä tapausta. Jos $counter-muuttujan alkuarvo on arvon 1 sijaan -4, luku 4000 tulee jaetuksi nollalla, kun koodilohko suoritetaan viidennen kerran. Sellaista

5. Ohjelman kulku 79 ei voida sallia. Listaus 5.10 varautuu tätä tilannetta varten lopettamalla silmukan, jos $counter-muuttujan arvo on nolla. Listaus 5.10 Break-lauseen käyttäminen 3: <title>listing 5.10</title> 7: $counter = -4; 8: for ( ; $counter <= 10; $counter++ ) 9: { 10: if ( $counter == 0 ) 11: break; 12: $temp = 4000/$counter; 13: print "4000 divided by $counter is... $temp<br>"; 14: } 15:?> 16: </body> 17: </html> Luvun jakaminen nollalla ei aiheuta PHP4:ssä vakavaa virhettä. Sen sijaan annetaan varoitus ja suorittamista jatketaan eteenpäin. Esimerkissä käytetään if-lausetta testaamaan $counter-muuttujan arvoa. Jos arvo on nolla, break-lause lopettaa heti silmukan suorittamisen ja suoritusta jatketaan silmukan jälkeen tulevasta ohjelmalauseesta. Huomaa, että alustimme $counter-muuttujan for-lauseen otsikon ulkopuolella simuloidaksemme tilannetta, jossa muuttujan arvo tulee käyttäjältä tai vaikkapa tietokantahaun tuloksena. Voit jättää pois mitkä tahansa osat for-lauseen otsikosta, mutta tällöinkin sinun on jätettävä puolipisteet paikoilleen.

80 5. Ohjelman kulku Koodin ohittaminen continue-lauseella Continue-lause lopettaa koodilohkon suorittamisen, mutta ei lopeta koko silmukkaa. Sen sijaan se aloittaa uuden kierroksen. Listauksen 5.10 break-lause oli melko ehdoton. Listauksessa 5.11 käytetään continuelausetta, jonka avulla vältetään nollalla jakaminen, mutta silmukkaa ei kuitenkaan tällöin lopeteta. Listaus 5.11 Continue-lause 3: <title>listing 5.11</title> 7: $counter = -4; 8: for ( ; $counter <= 10; $counter++ ) 9: { 10: if ( $counter == 0 ) 11: continue; 12: $temp = 4000/$counter; 13: print "4000 divided by $counter is... $temp<br>"; 14: } 15:?> 16: </body> 17: </html> Olemme nyt vaihtaneet break-lauseen continue-lauseeseen. Jos $counter-muuttujan arvo ominaisuus nolla, koodilohkon yli hypätään ja jatketaan seuraavasta kierroksesta eteenpäin. Break ja continue voivat tehdä koodista vaikealukuista. Koska ne tekevät silmukoista monimutkaisempia, ne voivat aiheuttaa vaikeasti selvitettäviä virheitä. Niitä tulisikin käyttää säästeliäästi.

5. Ohjelman kulku 81 Sisäkkäiset silmukat Silmukat voivat sisältää muita silmukkarakenteita. Tuollaiset yhdistelmät ovat erityisen hyödyllisiä työskenneltäessä dynaamisesti luotavilla HTML-taulukoilla. Listaus 5.12 käyttää kahta for-silmukkaa tulostamaan kertotaulu selaimelle. Listaus 5.12 Kaksi sisäkkäistä for-silmukkaa 3: <title>listing 5.12</title> 7: print "<table border="1">\n"; 8: for ( $y=1; $y<=12; $y++ ) 9: { 10: print "<tr>\n"; 11: for ( $x=1; $x<=12; $x++ ) 12: { 13: print "\t<td>"; 14: print ($x*$y); 15: print "</td>\n"; 16: } 17: print "</tr>\n"; 18: } 19: print "</table>"; 20:?> 21: </body> 22: </html> Ulompi for-lause alustaa muuttujan nimeltä $y asettaen sen alkuarvoksi arvon 1. Se määrittää testilausekkeen, jossa testataan, onko $y pienempi tai yhtäsuuri kuin 12 ja määrittää $y-muuttujan kasvattamisen. Jokaisella kierroksella koodilohko tulostaa TR-elementin (taulukon rivi) ja määrittää toisen for-lauseen. Tuo sisäinen silmukka alustaa muuttujan nimeltä $x ja määrittää muut osat samalla lailla kuin ulompi for-silmukka. Kullakin kierroksella sisempi for-silmukka tulostaa TD-elementin (taulukon solu) selaimelle sekä kertolaskun $x * $y tuloksen. Tuloksena on siististi muotoiltu kertotaulu.

82 5. Ohjelman kulku Yhteenveto Tällä tunnilla opit käyttämään kontrollirakenteita ja näit, kuinka niiden avulla voidaan skripteistä tehdä joustavia ja dynaamisia. Useimpia näistä rakenteista käytetään uudelleen ja uudelleen kirjan loppuosan esimerkeissä. Luvussa kerrottiin myös, kuinka määritetään if-lause ja kuinka siihen lisätään vaihtoehtoisia toimintoja elseif- ja else-osilla. Opit lisäksi käyttämään switch-lausetta ja muuttamaan sen avulla ohjelman kulkua useiden testitulosten perusteella. Tutustuit luvussa myös silmukoihin, erityisesti while- ja for-rakenteisiin, ja sait tietää, kuinka silmukoihin voidaan laittaa lisäkontrollia break- ja continue-lauseiden avulla. Lopuksi sait tietää, kuinka silmukoita voidaan laittaa sisäkkäin, ja näit myös tyypillisen esimerkin siitä. K&V K Täytyykö kontrollirakenteen testilausekkeen tuloksen olla totuusarvo? V Kyllä, mutta testilausekkeen yhteydessä nolla, määrittelemätön muuttuja tai tyhjä merkkijono vastaavat arvoa false. Kaikki muut arvot vastaavat arvoa true. K Onko kontrollirakenteen koodilohko laitettava aina aaltosulkuihin? V Jos koodilohkossa on vain yksi rivi, voidaan aaltosulut jättää pois. K Käytiinkö tässä luvussa läpi kaikki erilaiset silmukat? V Luvussa 7, Taulukot, kerrotaan vielä foreach-silmukkarakenteesta, jonka avulla on kätevää käydä läpi taulukoita. Työpaja Työpaja tarjoaa pikakysymyksiä, joiden avulla voit kerrata läpikäytyä materiaalia. Yritä ymmärtää vastaukset ennen kuin jatkat seuraavaan lukuun. Vastaukset annetaan liitteessä A. Kysymyksiä 1. Kuinka käyttäisit if-lausetta tulostaaksesi merkkijonon Nuorehko selaimelle, jos $age-muuttujan arvo on väliltä 18-35? Jos muuttujan arvo on jotain muuta, tulisi ohjelman tulostaa viesti Muu. 2. Kuinka laajentaisit kysymyksen 1 koodiasi tulostamaan merkkijonon Lapsi, jos $age-muuttujan arvo on väliltä 1-17? 3. Kuinka loisit while-lauseen, joka tulostaa parittomat luvut väliltä 1-49?

5. Ohjelman kulku 83 4. Kuinka muuntaisit kysymyksen 3 while-lauseen for-lauseeksi? Toiminta 1. Tutki kontrollirakenteiden syntaksia. Mieti, kuinka nuo menettelytavat voisivat auttaa skriptien teossa. 2. Tutki ehto-operaattoria. Mikä erottaa sen luvun lopun kontrollirakenteista? Mitä hyötyä ehto-operaattorista voisi olla?

84 5. Ohjelman kulku