815338A Ohjelmointikielten periaatteet

Samankaltaiset tiedostot
815338A Ohjelmointikielten periaatteet

Lauseet ja lausekkeet imperatiivisissa ohjelmointikielissä

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.

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Ehto- ja toistolauseet

Java-kielen perusteita

Java-kielen perusteet

Java-kielen perusteet

13. Loogiset operaatiot 13.1

13. Loogiset operaatiot 13.1

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

Tietotyypit ja operaattorit

Palautetta viime luennosta

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

12. Javan toistorakenteet 12.1

Ehto- ja toistolauseet

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

12. Javan toistorakenteet 12.1

11. Javan toistorakenteet 11.1

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

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

Ohjelmoinnin perusteet Y Python

5/20: Algoritmirakenteita III

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

Muistutus aikatauluista

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

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

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

16. Ohjelmoinnin tekniikkaa 16.1

Fortran 90/95. + sopii erityisesti numeriikkaan:

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

16. Ohjelmoinnin tekniikkaa 16.1

Ohjausrakenteet. Valinta:

Ohjelmointiharjoituksia Arduino-ympäristössä

Python-ohjelmointi Harjoitus 2

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet

LOAD R1, =2 Sijoitetaan rekisteriin R1 arvo 2. LOAD R1, 100

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

Tutoriaaliläsnäoloista

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Muuttujat ja kontrolli. Ville Sundberg

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

Ohjelmoinnin peruskurssi Y1

Kielioppia: toisin kuin Javassa

1. luento. Ohjelmointi (C) T0004 Syksy luento. 1. luento. 1. luento. 1. luento. kurssin sisältö ja tavoitteet työmuodot.

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

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


Java-kielen perusteita

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

etunimi, sukunimi ja opiskelijanumero ja näillä

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

Ohjelmoinnin perusteet Y Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

7. Näytölle tulostaminen 7.1

Ohjelmoinnin perusteet Y Python

11. Javan valintarakenteet 11.1

Osoitin ja viittaus C++:ssa

Ohjelmoinnin peruskurssi Y1

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

3. Muuttujat ja operaatiot 3.1

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

Tieto ja sen osoite (3) Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI) Osoitinmuuttujat. Tieto ja sen osoite (5)

Ohjelmoinnin perusteet Y Python

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005

811120P Diskreetit rakenteet

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Vasen johto S AB ab ab esittää jäsennyspuun kasvattamista vasemmalta alkaen:

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

815338A Ohjelmointikielten periaatteet

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

Luennon sisältö Tyypit int, char, float, double signed, unsigned short, long Vakiot const Rakenteet if, for, while, switch, do-while Syöttö ja tulostu

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

Jakso 3 Konekielinen ohjelmointi (TTK-91, KOKSI)

Ohjelmoinnin perusteet Y Python

ICT1TN004. Skriptikielet. Heikki Hietala

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ohjelmoinnin perusteet Y Python

Luento 5. Timo Savola. 28. huhtikuuta 2006

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

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

Diskreetin matematiikan perusteet Laskuharjoitus 2 / vko 9

11. Javan valintarakenteet 11.1

Harjoitustyö: virtuaalikone

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

Python-ohjelmointi Harjoitus 5

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Transkriptio:

815338A Ohjelmointikielten periaatteet 2015-2016 IV.2 Imperatiivinen ohjelmointi lauseet ja lausekkeet

Sisältö 1. Yleistä lausekkeista 2. Presedenssi- ja assosiaatiosäännöt 3. Tyyppimuunnokset 4. Vertailulausekkeet ja loogiset lausekkeet 5. Yleistä lauseista 6. Sijoituslause ja ehdolliset lausekkeet 7. Ohjauslauseet 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 2

IV.2.1. Yleistä lausekkeista Lauseke (expression) ohjelmointikielen peruselementtejä Ohjataan tietokoneen laskentaoperaatioita ohjelmointikielellä Kaikissa kielissä voidaan muodostaa lausekkeita yhdistelemällä operaattoreita ja operandeja Palauttaa aina ohjelmaan jonkin arvon, joka saadaan evaluoimalla lauseke 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 3

IV.2.1. Yleistä lausekkeista (2) Operaattorit Unaariset kohdistuvat yhteen operandiin Binääriset kohdistuvat kahteen operandiin Joissakin kielissä myös ternäärisiä, kolmeen operandiin kohdistuvia operaattoreita Operandit Voivat olla vakioita, muuttujia tai funktiokutsuja 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 4

IV.2.1.1. Lausekkeen evaluointi Ymmärtäminen olennainen osa ohjelmointikielen tuntemusta Lausekkeen evaluointi = sen arvon laskeminen käyttäen lausekkeessa esiintyvien vakioiden ja muuttujien suoritushetkisiä arvoja Tarvitaan sääntöjä lausekkeen arvon määrittämiseksi Operaattoreiden suoritusjärjestys, Operaattoreiden assosiatiivisuus Operandien arvojen evaluointijärjestys Joissakin kielissä (esim. C++) operaattorit ylikuormitettavissa (overload) Ei Javassa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 5

IV.2.1.2. Funktion arvon evaluointi Imperatiivisissa kielissä yleensä innokas evaluointi (eager evaluation) = Funktion arvo evaluoidaan joka kerran sitä kutsuttaessa käyttämällä syöteargumenttien senhetkisiä arvoja Joissakin funktionaalisissa kielissä laiska evaluointi (lazy evaluation) = evaluoidaan vasta kun tulosta tarvitaan Funktion sivuvaikutukset (side effects): sen vaikutus funktion parametreihin tai globaaleihin muuttujiin (yleensä varottava) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 6

IV.2.2. Presedenssi- ja assosiaatiosäännöt Määräävät operaattoreiden suoritusjärjestyksen Presedenssisäännöt säätelevät operaattoreiden keskinäistä suoritusjärjestystä Noudattavat (yleisesti) matematiikasta tuttuja lakeja Assosiaatiosäännöt määräävät, kumpi kahdesta presedenssiltään samanarvoisesta operaattorista suoritetaan ensin Yleisimmin vasemmalta oikealle tapahtuva suorittaminen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 7

IV.2.2.1. Aritmeettiset perusoperaattorit *x++=*y++ Yhteenlasku (+), vähennyslasku (-), kertolasku (*) ja jakolasku (/) Joissakin kielissä potenssiin korotukselle oma operaattorinsa, FORTRANissa ** Pascalissa oma operaattori div kokonaislukujen jakolaskulle (tuloksena kokonaisluku) Yleisesti myös kokonaislukujen jakojäännökselle oma operaattori C, C++ ja Java: %, Pascal: mod 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 8

IV.2.2.2. Unaariset operaattorit Unaariset + ja - (etumerkki) C, C++ ja Java: Operaattoreilla ++ ja -- kaksi muotoa prefix ja postfix Prefix muodossa operaattori muuttujan eteen ja sovelletaan muuttujaan ennen lausekkeen muuta evaluointia Postfix muodossa operaattori muuttujan jälkeen, evaluointi tapahtuu vasta muun evaluoinnin jälkeen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 9

Aritmeettisten operaattorien presedenssisääntöjä C Java/C++ Pascal FORTRAN Ada Korkein postfix ++, -- postfix ++, -- prefix ++, -- *, /, div, mod ** **, abs prefix ++, -- unaarinen +, - (kaikki) +, - *, / *, /, mod unaarinen +, - *, /, % (kaikki) +, - unaarinen +, - *, /, % binäärinen +, - binäärinen +, - Alhaisin Binäärinen +, - 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 10

Aritmeettisten operaattorien assosiatiivisuussääntöjä *x++=*y++ Kieli Assosiaatiosääntö C Oikealta prefix ++, --, unaarinen +, - Vasemmalta muut C++/Java Oikealta ++, --, unaarinen +, - Vasemmalta muut Pascal Vasemmalta kaikki FORTRAN Oikealta ** Vasemmalta muut Ada Vasemmalta kaikki paitsi ** ** on ei-assosiatiivinen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 11

IV.2.3. Tyyppimuunnokset *x++=*y++ Tarvitaan usein aritmeettisten lausekkeiden evaluoinnissa Eksplisiittiset (ohjelmoijan tekemät) Implisiittiset (tapahtuvat automaattisesti) Aritmeettisia operaatioita voidaan suorittaa eri tietotyypeille -> kielessä selkeät säännöt operaation tuloksen tyypistä ja siitä, minkä tyyppisinä operandeja käsitellään Binääriset operaatiot on yleensä määritelty vain saman tietotyypin operandeille -> Joudutaan usein tekemään pakotettuja tyypinmuunnoksia (coercion) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 12

IV.2.3. Tyyppimuunnokset (2) Esimerkki. C:ssä double osamaara; osamaara = 5/2; -> osamaara = 2.0 (kääntäjä tulkitsee literaalit 5 ja 2 kokonaisluvuiksi -> kokonaislukujen jakolasku, jonka tulos (2) muunnetaan double tyyppiseksi) Muodossa osamaara = 5.0/2; tulos on 2.5 Pascalissa jakolasku / tuottaa aina reaaliluvun, kokonaislukujen jakolaskulle on oma operaattori div 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 13

IV.2.3.1 Eksplisiittinen tyypinmuunnos Useimmissa kielissä mahdollinen Tapahtuu erityisellä operaattorilla tai muistuttaa syntaksiltaan funktiokutsua Esimerkki: C:ssä edellinen jakolasku: int osoittaja = 5; int nimittaja = 2; double osamaara = (double)osoittaja/nimittaja; //Nyt 2.5 C/ C++:ssa kutsutaan kastaukseksi (cast) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 14

IV.2.3.1 Eksplisiittinen tyypinmuunnos (2) C++:ssa myös neljä operaattoria muunnokseen: static_cast, dynamic_cast, reinterpret_cast, const_cast *x++=*y++ Tulisi käyttää mieluummin kuin suoraa muunnosta Esimerkki double e = 2.71828; int luku = static_cast<int>(e); 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 15

IV.2.3.1 Eksplisiittinen tyypinmuunnos (3) *x++=*y++ Eksplisiittinen tyypinmuunnos voi olla joko laajentava tai kaventava Laajentava esimerkiksi muunnos float > double Kaventava päinvastoin Kaventavia ja epäsovinnaisia tyypinmuunnoksia kannattaa käyttää harkiten 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 16

IV.2.4. Vertailulausekkeet ja loogiset lausekkeet Vertailulauseke (relational expression) koostuu kahdesta operandista ja vertailuoperaattorista Arvo looginen totuusarvo Vertailuoperaattorien presedenssi kaikissa kielissä alhaisempi kuin aritmeettisten operaattoreiden -> aritmeettisten lausekkeiden vertailussa laskutoimitukset suoritetaan ensin Esimerkki. Olkoon a = 8 ja b= 4. Silloin lausekkeen a + 5 < 3*b; arvo on epätosi 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 17

IV.2.4. Vertailulausekkeet ja loogiset lausekkeet (2) Looginen lauseke eli totuusarvolauseke (Boolean expression) koostuu totuusarvotyypin muuttujista ja vakioista sekä vertailulausekkeista ja totuusarvooperaattoreista (Boolean operators) Totuusarvo (tosi tai epätosi) lasketaan propositiologiikan mukaan 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 18

IV.2.4.1 Vertailuoperaattoreita eri kielissä *x++=*y++ Operaatio C, C++, Java Pascal Yhtäsuuri == =.EQ. FORTRAN Erisuuri!= <>.NE. Suurempi > >.GT. Pienempi < <.LT. Suurempi t. yhtäsuuri Pienempi t. yhtäsuuri >= >=.GE. <= <=.LE. 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 19

IV.2.4.2. Loogisten operaattoreiden ominaisuuksia Totuusarvo-operaattoreiden presedenssien suhde aritmeettisiin ja vertailuoperaattoreihin yleisimmin: 1. Looginen negaatio 2. Aritmeettiset operaattorit 3. Vertailuoperaattorit 4. Looginen XOR 5. Looginen JA 6. Looginen TAI 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 20

IV.2.4.2. Loogisten operaattoreiden ominaisuuksia (2) Negaatio-operaattori, looginen JA ja looginen TAI: Pascal (ja monet muut): NOT, AND ja OR C/C++ Java:!,&& ja, C/C++ Java: lisäksi poissulkeva tai ^ (eli looginen XOR) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 21

IV.2.4.2. Loogisten operaattoreiden ominaisuuksia (3) Pascal poikkeaa e.m. presedenssisäännöistä Vertailuoperaattorit alemmalla tasolla kuin loogiset operaattorit AND samalla tasolla kertolaskun kanssa OR samalla tasolla yhteenlaskun kanssa Esimerkki. a < 10 OR b > 15; ei käänny Pascalissa, oltava (a < 10) OR (b > 15); 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 22

IV.2.4.2. Loogisten operaattoreiden ominaisuuksia (4) C :ssä ei varsinaista loogista tietotyyppiä -> mahdollisuus kirjoittaa epäsovinnaisia vertailulausekkeita, esim. int x=2,y=1,z=0,u,v; u = y==z<x; v = x<y<z; muuttujalle v arvo 0 ja u:n arvo voi riippua kääntäjästä (yleisimmin saa arvon 1) *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 23

IV.2.4.3. Oikosulkuevaluointi Englanniksi short-circuit evaluation Lausekkeen arvon määrääminen ennen kuin sen kaikkien operandien arvoja on määrätty Sovelletaan yleensä loogisiin lausekkeisiin Esimerkki. Jos a >= 25, niin (Pascalissa) (a < 25) AND (b > 10) aina epätosi -> toinen vertailu voidaan jättää tekemättä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 24

IV.2.4.3. Oikosulkuevaluointi (2) Voidaan käyttää hyväksi yksinkertaistamaan koodia C, C++ ja Java käyttävät loogisten lausekkeiden evaluoinnissa Ei käytetä yleisesti aritmeettisten lausekkeiden evaluoinnissa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 25

IV.2.5. Yleistä lauseista *x++=*y++ Ohjelma koostuu primitiivisistä eli atomisista lauseista sekä näitä yhdistelemään tarkoitetuista ohjauslauseista (kontrollilauseista) Yhdessä peräkkäisyyden (kompositio) kanssa muodostavat kielen ohjausrakenteet Primitiiviset lauseet: 1. Sijoituslause, 2. Aliohjelmakutsu ja 3. Tyhjä lause 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 26

IV.2.5. Yleistä lauseista (2) Ohjelmointikielessä lauseet erotettava toisistaan 1. Erikoismerkki päättää lauseen Yleisin nykyään käytetty tapa 2. Erikoismerkki erottaa lauseet Käytetään Pascalissa 3. Rivinvaihto päättää lauseen Käytetään FORTRANissa, Pythonissa 4. Kielen syntaksi suunniteltu niin, ettei lauseiden erotin- tai lopetusmerkkiä tarvita Esimerkki: CLU Tyhjää lausetta käytetään, kun syntaksi vaatii lauseen, mutta ei haluta suorittaa toimintoa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 27

IV.2.6. Sijoituslause ja ehdolliset lausekkeet *x++=*y++ Sijoituslause (assignment) imperatiivisen ohjelmoinnin perusta Ohjelmoija sitoo dynaamisesti muuttujan tunnisteen tietokoneen muistipaikassa olevaan arvoon Yleensä sijoitusoperaattorina yhtäsuuruusmerkki = Pascalissa ja Adassa yhdistelmä := Yleensä kielten vertailuoperaattori eroaa sijoitusoperaattorista C, C++ ja Java: voidaan käyttää kahta unaarista operaattoria ++ ja -- sijoituslauseena: luku++; (tai ++luku;) tarkoittaa sijoitusta luku = luku+1; 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 28

IV.2.6. Sijoituslause ja ehdolliset lausekkeet (2) Yhdistetyt sijoitusoperaattorit Samaan muuttujaan sijoitettava arvo kirjoitetaan lyhemmin Monissa kielissä mukana (ALGOL 60:stä lähtien) Esimerkiksi C, C++ ja Java: osamaara /= luku; on lyhennysmerkintä lauseelle osamaara = osamaara/luku; 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 29

IV.2.6.1. Ehdollinen lauseke C, C++, C# ja Java sallivat ehdolliset lausekkeet Lauseke on muotoa <boolean_expression>? <expression1> : <expression2> Lauseke saa lausekkeen <expression1> arvon, mikäli <boolean_expression> on tosi, muussa tapauksessa lausekkeen <expression2> arvon 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 30

IV.2.6.2. Sijoituslause lausekkeena Ainakin C, C++, C# ja Java-kielissä sijoituslause voi esiintyä myös operandina lausekkeessa, esimerkiksi int x,y,z = 5; x = y = z; // Nyt x ja y == 5 Sijoituslauseen käyttäminen operandina lisää lausekkeisiin sivuvaikutuksia -> heikentää luettavuutta ja erityisesti C:ssä luotettavuutta 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 31

IV.2.7. Ohjauslauseet Ohjauslauseilla (control statements) toteutetaan kielen ohjausrakenteet Yleensä kielissä useampia ohjauslauseita Ohjausrakenteet muotoutuneet 1960- ja 1970- lukujen taitteessa rakenteisen ohjelmoinnin (structured programming) mukana Havainto: pelkkä peräkkäisyys ja ehdollinen hyppykäsky johtivat suuremmissa ohjelmissa lukukelvottomaan ja epäluotettavaan koodiin 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 32

IV.2.7. Ohjauslauseet (2) Rakenteisen ohjelmoinnin ihanne: ohjelma koostuu sisäkkäisistä rakenteista, joilla kullakin yksi tulo- ja poistumiskohta Tarvitaan useammanlaisia valinta- ja toistolauseita Useissa nykykielissä (esimerkiksi Java) hyppykäsky (goto) jätetty pois Yleisesti nykykielten ohjausrakenteissa Koodin suoritus alkaa aina ensimmäisestä lauseesta (yksi tulokohta) Useamman tulokohdan sallimisen riskit suuremmat kuin edut Ohjausrakenteen sisältä voidaan poistua useammasta kohdasta 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 33

IV.2.7.1. Valintalauseet Voidaan jakaa kahden vaihtoehdon lauseisiin ja monivalintalauseisiin Välimuoto: FORTRANin aritmeettinen valintalause: IF (ARITMEETTINEN LAUSEKE) N1, N2, N3 N1, N2 ja N3 viitteitä, joiden osoittamiin kohtiin hypätään lausekkeen arvon perusteella: Positiivisella arvolla hypätään kohtaan N1, nollalla kohtaan N2 ja negatiivisella kohtaan N3 Hyppykohdat voivat olla missä tahansa -> suuri ongelma luettavuuden kannalta ja altistaa virheille 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 34

IV.2.7.1.1. Kahden vaihtoehdon valintalause *x++=*y++ Useimpien nykykielten valintalause pohjautuu ALGOL 60 kielen kahden vaihtoehdon valintalauseeseen: if (<looginen_lauseke>) then <lause1> [else <lause2>] Sisältää roikkuvan elsen ongelman: sisäkkäisistä if else rakenteista ei voida varmuudella sanoa, mihin if lauseeseen else kuuluu Semanttinen ratkaisu: else liittyy aina lähimpään if lauseeseen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 35

IV.2.7.1.1. Kahden vaihtoehdon valintalause (2) Adasta roikkuvan elsen ongelma poistettu: if ehto then... [else...] end if; 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 36

IV.2.7.1.2. Monivalintarakenne Yleisimmin pohjautuu ALGOL-W kielen case lauseeseen: case <kokonaisluku_lauseke> of begin end <lause_1>; <lause_2>;... <lause_n> Lausekkeen kokonaisluku_lauseke arvolla 1 valitaan lause_1 jne. 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 37

IV.2.7.1.2. Monivalintarakenne (2) Pascal: case lauseke of end const_list_1: <lause_1>; const_list_2: <lause_2>;... const_list_n: <lause_n> lauseke lueteltavaa tyyppiä, alkuaan ei oletusvalintaa (itse asiassa ei lainkaan määritelty, mitä tapahtuu, jos lausekkeen arvo ei ole mikään luetelluista arvoista) Myöhemmin lisätty mahdollisuus oletustoimintoon else -vaihtoehdolla 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 38

IV.2.7.1.2. Monivalintarakenne (3) C pohjaiset kielet: switch(<lauseke>) { } case vakio_1: <lause_1>; case vakio_2: <lause_2>; case vakio_n: <lause_n>; [default: <oletus_lause>] Lauseke mitä tahansa lueteltavaa tyyppiä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 39

IV.2.7.1.2. Monivalintarakenne (4) C-pohjaisten kielten monivalinta jatkuu... Semantiikka: Lausekkeen arvoa verrataan lueteltuihin vakioihin. Kun arvo löydetään suoritetaan listan lauseita tästä lauseesta alkaen, kunnes kohdataan break-lause tai kontrollirakenne loppuu. Kummassakin tapauksessa kontrolli siirtyy rakennetta seuraavaan lauseeseen. Arviointi: joustava, mutta jostakin case-osasta breakin unohtaminen voi johtaa harvinaisiin virhetilanteisiin 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 40

IV.2.7.2. Toistolauseet Voidaan jakaa määrättyihin ja määräämättömiin toistolauseisiin Määrätty: laskuri kontrolloi toistoa ja toistojen lukumäärä tiedetään etukäteen Määräämätön: looginen ehto kontrolloi toistoa ja lukumäärää ei välttämättä tiedetä ennalta. Toistorakenteen kontrolloimaa ohjelmalohkoa sanotaan usein silmukaksi (loop) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 41

IV.2.7.2.1. Määrätyt toistolauseet Silmukkalaskuri (silmukkamuuttuja, loop variable) kontrolloi silmukan päättymistä Silmukkalaskurin alkuarvo (initial value), loppuarvo (terminal value) ja askel (stepsize) ovat silmukkaparametreja (loop parameters) 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 42

IV.2.7.2.1. Määrätyt toistolauseet (2) Määrätyn toistorakenteen arviointikriteerit: 1.Mikä on silmukkamuuttujan tyyppi ja näkyvyysalue? 2.Mikä on silmukkamuuttujan arvo silmukan päättymisen jälkeen? 3.Saako silmukkamuuttujan arvoa muuttaa silmukan sisällä ja vaikuttaako silmukan suorituksen lopettamiseen? 4.Evaluoidaanko silmukkaparametrit ainoastaan kerran vai joka iteraatiokerralla? 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 43

IV.2.7.2.1. Määrätyt toistolauseet (3) FORTRANin toistorakenteen muoto DO <viite> <muuttuja> = <alkuarvo>,<loppuarvo> [,<askel>] Silmukan rajaa viite, esimerkiksi luvut 1,3,5,7 ja 9 tulostava silmukka voitaisiin kirjoittaa DO 100 I = 1,10,2 PRINT *,I 100 CONTINUE 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 44

IV.2.7.2.1. Määrätyt toistolauseet (4) FORTRANin toistorakenne jatkuu... Versiossa 77 silmukkamuuttuja kokonaisluku- tai reaalilukutyyppiä, myöhemmin rajoitettu kokonaisluvuksi FORTRANissa ei saa muuttaa silmukkamuuttujan arvoa silmukan sisällä Silmukkamuuttujan arvoksi jää sille viimeksi määritelty arvo Silmukkaparametrit evaluoidaan kerran silmukkaan tultaessa ja näitä käyttäen lasketaan silmukan kierrosluku -> toistot tiedetään etukäteen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 45

IV.2.7.2.1. Määrätyt toistolauseet (5) Pascal kielen for lause: for var := alkuarvo (to downto)loppuarvo do <statement> Erittäin yksinkertainen Askel aina kooltaan 1, tehdään joko ylös- tai alaspäin Silmukkamuuttuja lueteltavaa tyyppiä; normaali muuttuja, jonka näkyvyysalue määräytyy kuten muuttujien yleensäkin 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 46

IV.2.7.2.1. Määrätyt toistolauseet (6) Pascal-kielen toistorakenne jatkuu... Silmukkamuuttujan arvo silmukan päättyessä epämääräinen Alkuarvon ja loppuarvon evaluointi tapahtuu ainoastaan kerran -> muuttaminen silmukan sisällä ei vaikuta toistokertojen määrään Silmukkalaskurin arvoa ei saisi muuttaa silmukan sisällä Yleensä Pascalissa ei tarkisteta tätä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 47

IV.2.7.2.1.1 C-pohjaisten kielten for-lause Muoto: for(lauseke_1;lauseke_2;lauseke_3) lause; Erittäin joustava Ei varsinaista silmukkamuuttujaa 1. Ensimmäinen lauseke suoritetaan ennen silmukan ensimmäistä kierrosta 2. lauseke_2 kontrolloi silmukan päättymistä; evaluoidaan ennen jokaista silmukan kierrosta ja jos!= 0, silmukan seuraava kierros suoritetaan. 3. lauseke_3 evaluoidaan jokaisen kierroksen jälkeen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 48

IV.2.7.2.1.1 C-pohjaisten kielten for-lause (2) Huom! Lauseke voi olla useiden lausekkeiden muodostama lista, jolloin sen arvo on viimeisen lausekkeen arvo. Esim. for(i = 12; x = 0, y = 1; i++) { } printf("luuppi\n"); ikuinen silmukka *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 49

IV.2.7.2.1.1 C-pohjaisten kielten for-lause (3) Java, erot C++ -kieleen 1.Javassa toisen lausekkeen on oltava looginen lauseke 2.Java ei salli lausekelistaa toisena lausekkeena for(int i = 0; bb = true, ba = false; i++) { } // SILMUKKA ei käy Javassa, käy C++:ssa *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 50

IV.2.7.2.1.1 C-pohjaisten kielten for-lause (4) *x++=*y++ Kaikissa kielissä for silmukan lausekkeet voivat olla tyhjiä, esimerkiksi for(;;) { // SILMUKKA } ikuinen silmukka C-tyyppisessä for-lauseessa kaikkia silmukkaparametreja voidaan muuttaa silmukan sisällä 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 51

IV.2.7.2.2. Määräämättömät toistolauseet Lopetusehtona looginen ehto Toistokertoja ei välttämättä tiedetä ennakolta Useimmissa kielissä on toteutettu erilaisia rakenteita tällaisille toistoille ALGOL 60-kielen toistolause ja C-kielen for-lause oikeastaan tällainen rakenne Määräämättömät toistolauseet ovat määrättyjä yksinkertaisempia -> problematiikka helpompi 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 52

IV.2.7.2.2. Määräämättömät toistolauseet (2) Arviointikriteerit: *x++=*y++ 1.Testataanko ehto ennen silmukan suorittamista (alkuehtoinen toisto, pretest) vai sen jälkeen (loppuehtoinen toisto, posttest)? 2. Onko määräämätön toistolause määrätyn toistolauseen erikoistapaus vai erillinen lause? ALGOL 60:ssä kaikki toistorakenteet for-lauseella FORTRANissa ei loogista toistolausetta Toistolauseet toteutettava DO-silmukkaa ja hyppykäskyjä käyttäen 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 53

IV.2.7.2.2. Määräämättömät toistolauseet (3) Java, C ja C++: toistolauseet sekä alku- että loppuehtoiselle toistolle. Alkuehtoinen muoto on while(lauseke) lause; Loppuehtoinen do lause; while(lauseke); *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 54

IV.2.7.2.2. Määräämättömät toistolauseet (4) Java, C ja C++: toistolauseet jatkuu... Loppuehtoisen toiston lause suoritetaan ainakin kerran, vaikka lauseke olisikin aluksi epätosi. C:ssä lauseke on jokin aritmeettinen lauseke tai lausekkeiden muodostama lista, C++:ssa myös looginen lauseke *x++=*y++ Javassa lausekkeen on oltava looginen lauseke eikä listaa sallita 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 55

IV.2.7.2.2. Määräämättömät toistolauseet (5) *x++=*y++ Pascalissa sekä alkuehtoinen että loppuehtoinen toisto: Alkuehtoinen toisto Loppuehtoinen toisto WHILE ehto DO lause; REPEAT lause1; lause2; UNTIL ehto; Loppuehtoisen toiston lopetuslogiikka on käänteinen C-kieleen verrattuna: lauseita toistetaan, kunnes ehto tulee todeksi. Huomaa: jälkimmäisessä lauselista, ei tarvita koottua lausetta. Alkuehtoisessa on oltava koottu lause. Ortogonaalisuuden puute Pascalissa 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 56

IV.2.7.2.3. Pakotettu poistuminen silmukasta Helpottaa ohjelmointia, vaikka rikkoo rakenteisen ohjelmoinnin ihanteita (vain yksi poistumiskohta rakenteessa) Adassa rakenne silmukalle, joka on ikuinen, ellei ohjelmoija määrittele poistumiskohtaa loop if(toistoja > 10) then exit; end if; end loop; *x++=*y++ 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 57

IV.2.7.2.3. Pakotettu poistuminen silmukasta (2) C-kieleen pohjautuvissa kielissä break käsky. for(;;) { } if(toistoja > 10) break; Poistumiskohtia voi olla useita (haittaa kuitenkin koodin luettavuutta -> käytä harkiten) Useimpiin kieliin toteutettu silmukasta poistuminen, mukavuushyöty katsotaan suuremmaksi kuin haitat 815338A Ohjelmointikielten periaatteet, Lauseet ja lausekkeet 58