Esittely latautuu. Ole hyvä ja odota

Esittely latautuu. Ole hyvä ja odota

Rakenteinen ohjelmointi

Samankaltaiset esitykset


Esitys aiheesta: "Rakenteinen ohjelmointi"— Esityksen transkriptio:

1 Rakenteinen ohjelmointi
Sisältö Ohjausrakenteet ja ohjelmalohkot Funktiot

2 1. Ohjausrakenteet ja ohjelmalohkot
Ohjelman kulkua ohjataan ohjausrakenteilla, joita on kaksi eri tyyppiä Valinta kahdesta tai useammasta vaihtoehdosta Toisto Ohjelman etenemistä voidaan ohjata myös ns. hyppylauseilla. Hyppylauseita ei kuitenkaan tule suosia tarpeettomasti, sillä ne tekevät ohjelmakoodista vaikeaselkoista.

3 1. Ohjausrakenteet ja ohjelmalohkot
Kielen säännöt ja niiden tulkitseminen Syntaksi on kielioppi, tarkkaan määritetty säännöstö, jonka mukaan kielen ilmaisut on koottava kielen tunnistamista rakenneosista Semantiikka on syntaktisten rakenteiden määrittelemä merkitys

4 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/ehtolause (if, if/else) Syntaksi Semantiikka if (lauseke) lause; lause1; else lause2; Jos ehtolauseke on tosi (lauseke ≠ 0), niin suoritetaan lause Jos ehtolauseke on tosi (lauseke ≠ 0), niin suoritetaan lause1, muussa tapauksessa (lauseke = 0) suoritetaan lause2. Huom! Tässä ja myöhemmin kielen syntaksin mukaiset merkistöt ja sanat kuvataan punaisella ja ohjelmoijan määrittelemät osat valkoisella kursiivilla.

5 1. Ohjausrakenteet ja ohjelmalohkot
Valinta, vertailuoperaattorit If –valintalauseessa ehtolauseke muodostetaan yleensä ns. vertailuoperaattoreilla. Matem. esitys C-operaattori Semantiikka a < b a pienempi kuin b a > b a suurempi kuin b a  b a >= b a suurempi tai yhtä suuri kuin b a  b a <= b a pienempi tai yhtä suuri kuin b a = b a == b a sama kuin b a ≠ b a != b a eri kuin b

6 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/ehtolause (if, if/else) Esimerkki 1 Semantiikka int main() { int Kallen_ika=15, Villen_ika=16; printf(”Anna Kallen ikä\n”); scanf(”%d”,&Kallen_ika); printf(”Anna Villen ikä\n”); scanf(”%d”,&Villen_ika); if (Kallen_ika>=Villen_ika) printf(”Kalle on vähintään yhtä vanha kuin Ville\n”); else printf(”Ville on vanhempi kuin Kalle\n”); return 0; } Kysellään käyttäjältä muuttujien arvot Ohjataan käyttäjän syöttämien tietojen perusteella oikea tulostus.

7 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/ehtolause (if, if/else) Esimerkki 2 Semantiikka int main() { int Kallen_ika, Villen_ika; printf(”\nAnna Kallen ikä\n”); scanf(”%d”,&Kallen_ika); printf(”\nAnna Villen ikä\n”); scanf(”%d”,&Villen_ika); if (Kallen_ika>Villen_ika) printf(”\nKalle on vanhempi kuin Ville\n”); else if (Kallen_ika==Villen_ika) printf(”\nKalle ja Ville ovat yhtä vanhoja\n”); else printf(”\nVille on vanhempi kuin Kalle\n”); return 0; } Ensimmäinen if -lause Toinen if –lause, joka on ensimmäisen if –lauseen else -lohko.

8 1. Ohjausrakenteet ja ohjelmalohkot
Valinta, loogiset operaattorit If –valintalauseessa ehtolauseke voidaan muodostaa myös loogisten operaattoreiden avulla (&&, || sekä !). Esimerkiksi Matem. esitys C-operaattorit Semantiikka a < b < c (a < b) && (b < c) a pienempi kuin b ja b pienempi kuin c a < b  a > c (a < b) || (a > c) a pienempi kuin b tai a suurempi kuin c (a>b) !(a>b) ei - a suurempi kuin b, eli on epätosi (=0), jos a > b, ja tosi (≠0) kun a  b. Huom! Yhdistetyissä lausekkeissa on turvallisinta käyttää aina sulkeita varmistamaan sen, mitkä operandit (tässä a, b ja c) halutaan kuuluvan millekin operaattorille

9 1. Ohjausrakenteet ja ohjelmalohkot
Valinta, loogiset operaattorit && (ja), || (tai) sekä ! (negaatio) ja niiden totuusarvotaulukot Tulos tosi && tosi tosi epätosi && tosi epätosi (tulos määräytyy pelkästään 1. operandin perusteella) tosi && epätosi eptosi epätosi && epätosi epätosi tosi || tosi tosi epätosi || tosi tosi tosi || epätosi tosi (tulos määräytyy pelkästään 1. operandin epätosi || epätosi epätosi !tosi epätosi !epätosi tosi

10 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/ehtolause (if, if/else) Syntaksi Semantiikka if (lauseke) { lause1; lause2; } else lause3; lause4; Usein joudutaan ohjausrakenteessa käyttämään ns. koottua lausetta, jossa peräkkäiset lauseet yhdistetään lohkoksi aaltosulkeilla. Huom! Pelkät rivinvaihdot ja sarkainten käyttö eivät muodosta oikeaoppista rakennetta. Mikäli lohkoa ei merkitä aaltosulkeilla, jälkimmäiset lauseet lause2 ja lause4 eivät kuulu if –rakenteeseen oikein

11 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/ehtolause (if, if/else) Esimerkki 3 Semantiikka printf(”Anna kokonaisluku väliltä 1 … 10\n"); scanf("%d",&luku); if ( (luku >= 1) && (luku <= 10) ) { testi = luku%2; if ( testi==0) printf(”Syötit parillisen luvun”); else printf(”Syötit parittoman luvun”); } printf(”Luku ei ole väliltä 1 … 10\n "); Testataan onko luku oikean kokoinen Aaltosuluilla rajattu koottu lause, jossa testataan ja tulostetaan onko luku parillinen vai pariton. Harj. Kirjoita oheinen ohjelma ja testaa toimiiko se oikein kaikissa tilanteissa.

12 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/tapauslause (switch) Syntaksi Semantiikka switch (lauseke) { case vakio1: lause1; break; case vakio2: lause2; ¨¨ case vakion: lausen; } Jos lausekkeen arvo on vakio1, niin suoritetaan lause1, jos lausekeen arvo on vakio2, niin suoritetaan lause2, … jne. Mikäli lausekkeen arvo ei ole mikään arvoista arvo1 … arvon, ei suoriteta mitään. Vakioina käytetään yleisesti kokonaislukuja tai merkkejä. Huom! Koko switch -lauseen lohko on merkittävä aaltosulkeilla. Kullakin valinnalla voi sen sijaan olla useita lauseita yhdistettynä peräkkäin ilman erillisiä lohkomerkkejä, sillä break keskeyttää koko switch -lauseen suorituksen

13 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/tapauslause (switch) Syntaksi Semantiikka switch (lauseke) { case vakio1: lause1; break; case vakio2: lause2; ¨¨ case vakion: lausen; default: lause0; } switch –lauseeseen voidaan liittää default –osa, joka suoritetaan aina, kun lausekkeen arvo ei ole mikään arvoista vakio1 … vakion.

14 1. Ohjausrakenteet ja ohjelmalohkot
Valinta/tapauslause (switch) Harjoitus: Laadi ohjelma, joka lukee käyttäjältä henkilön painon ja pituuden, laskee henkilön painoindeksin kaavalla sekä tulostaa painoindeksin ja ohjeet ruokavalion säilyttämiseksi tai muuttamiseksi oheisen taulukon mukaan: Normaalia alhaisempi paino 18,4 tai alle Normaali paino 18,5 - 24,9 Lievä lihavuus 25,0 - 29,9 Merkittävä lihavuus 30,0 - 34,9 Vaikea lihavuus 35,0 - 39,9 Sairaalloinen lihavuus 40,0 tai yli Testaa ohjelman toimivuus kaikissa luokissa.

15 1. Ohjausrakenteet ja ohjelmalohkot
Toisto/ Alkuehtoinen toisto (while) Syntaksi Semantiikka while (lauseke) { lause1; lause2; ¨¨ lausen; } Niin kauan, kun ehtolausekkeen lauseke arvo on tosi (0), niin toistetaan lauseet lause1, lause2, … lausen. Alkuehtoinen toisto on hyvä silloin, kun lauseita ei välttämättä haluta suorittaa kertaakaan. Huom! Jälkimmäisen lohkomerkin jälkeen ei tule puolipistettä

16 1. Ohjausrakenteet ja ohjelmalohkot
Toisto/ Loppuehtoinen toisto (do … while) Syntaksi Semantiikka do { lause1; lause2; ¨¨ lausen; } while (lauseke); Niin kauan, kun ehtolausekkeen lauseke arvo on tosi (0), niin toistetaan lauseet lause1, lause2, … lausen. Loppuehtoinen toisto on hyvä silloin, kun lauseet halutaan välttämättä suorittaa ainakin kerran.

17 1. Ohjausrakenteet ja ohjelmalohkot
Toisto/ lukumääräinen toisto (for) Syntaksi Semantiikka for(laskurinalustus;lauseke;laskurinkasvatus) { lause1; lause2; ¨¨ lausen; } Alustetaan laskuri. Niin kauan, kun ehtolausekkeen lauseke arvo on tosi (0), toistetaan lauseet lause1, lause2, … lausen sekä kasvatetaan laskuria tässä järjestyksessä. Lukumääräinen toisto on hyvä silloin, kun tiedetään kuinka monta kertaa lauseet halutaan suorittaa esimerkiksi käytäessä taulukkorakennetta läpi.

18 1. Ohjausrakenteet ja ohjelmalohkot
Toisto Esimerkki Semantiikka int i; printf(”Kokonaislukujen 1 … 10 neliöt:\n"); i = 1; while ( i <= 10) { printf(”Luvun %d neliö = %d\n”, i, i*i); i = i + 1; } do { } while (i <= 10); for ( i=1 ; i <= 10 ; i = i + 1 ) Kaikkia toistolauseita voidaan käyttää saman tehtävän ratkaisuna. Käytäntö kuitenkin opettaa mikä kolmesta ohjausrakenteesta milloinkin on luontevin. Kun käytetään silmukkalaskuria, on huolehdittava, että seuraavat kolme asiaa ovat kunnossa; Laskurin alustus i=1 Toistoehto i<=10 Laskurin kasvatus i=i+1

19 1. Ohjausrakenteet ja ohjelmalohkot
Toisto Esimerkki Käyttöliittymä Semantiikka Tulostetaan ohjeet char valinta; do { printf("Valitse toiminto\n"); printf("a) syöttö b) tulostus x) lopetus\n") fflush(stdin); scanf("%c",&valinta); switch(valinta) { case ’a’: syotto(); break; case ’b’: tulostus(); break; case ’x’: break; default: printf(”Kirjoita a, b tai x\n”); } while (valinta != 'x’ ); Tyhjennetään syöttöpuskuri ja luetaan käyttäjän valinta Käyttäjän valinnan mukaan suoritetaan syöttö, tulostus tai lopetus default-osassa tulostetaan ohjeet tapauksessa, jossa käyttäjä ei ole ymmärtänyt kirjoittaa oikeaa kirjainta

20 1. Ohjausrakenteet ja ohjelmalohkot
Toisto Harjoitus 1: Laadi ohjelma, joka laskee yhteen ja tulostaa 100 ensimmäisen kokonaisluvun summan. Harjoitus 2: Laadi ohjelma, joka tulostaa sanan pieni kirjain, suuri kirjain tai muu merkki riippuen siitä minkä merkin käyttäjä on syöttänyt. Käyttäjä voi jatkaa kirjainten syöttämistä ja ohjelma lopetetaan vasta, kun käyttäjä syöttää numeron. Ohje: merkkimuuttuja (char) on myös kokonaislukumuuttuja, ja kullakin merkillä on numeerinen ASCII-arvo. Esimerkiksi kirjainten A … Y ASCII-arvot ovat kokonaislukujen 65 ja 89 välissä, kirjaimet a … y ovat lukujen 97 ja 121 välissä sekä numeroiden 0 … 9 ASCII-arvot ovat lukujen 48 ja 57 välissä (skandit voidaan tulkita muiksi merkeiksi).

21 1. Ohjausrakenteet ja ohjelmalohkot
Harjoituksen 2 pseudokoodi Toisto toistetaan tulosta käyttäjälle syöttöohje nollataan syöttöpuskuri (fflush(stdin);) luetaan käyttäjältä merkki jos merkki on kokonaislukujen 65 ja 89 välissä tulostetaan iso kirjain muutoin, jos merkki on kokonaislukujen 97 ja 121 välissä tulostetaan pieni kirjain muutoin tulostetaan muu merkki niin kauan, kun merkki ei ole koko kokonaislukujen 48 ja 57 välissä

22 2. Funktiot Otsikko ja määrittely Syntaksi Semantiikka
Paluuarvon tyyppi Funktion nimi tyyppi tunniste ( parametritopt) { määrittelyt lauseet } Parametrien lista (voi olla tyhjä) Paikallisten muuttujien määrittely Funktion toiminnan määrittelevät lauseet Funktion ensimmäistä riviä kutsutaan funktion otsikoksi

23 2. Funktiot Paluuarvo ja return -lause Syntaksi Semantiikka
int omafunktio (parametritopt) { int luku; luku = … return luku; } Kaikille paluuarvon tietotyypeille funktion pitää palauttaa return-lauseella vastaava tietotyyppi. Jos funktio ei palauta mitään arvoa (esimerkiksi monet tulostusfunktiot), kirjoitetaan paluuarvoksi void, jolloin return –lausetta ei tarvita Ehdollisissa kontrollirakenteissa voi olla useitakin return-lauseita

24 2. Funktiot Parametrien ja paikallisten muuttujien määrittely
Semantiikka Syntaksi Funktion muodolliset parametrit välittävät tietoa funktiolle kutsuvasta ohjelman osasta. Muodolliset parametrit esitellään sulkeiden sisällä samalla periaatteella kuin paikalliset muuttujatkin tyyppi tunniste Parametreja käytetään runko-osassa kuten muitakin muuttujia. Niiden sisältämä arvo määräytyy kutsuvan ohjelman osan mukaan. float laskeka (float luku1, float luku2) { float keskiarvo; keskiarvo= (luku1+luku2)/2; return keskiarvo; }

25 2. Funktiot Funktion esittely ja kutsuminen Semantiikka Syntaksi
C-kielessä kaikki kutsuttavat funktiot on esiteltävä koodissa ennen sitä ohjelmalohkoa, jossa kutsu esiintyy. Funktioiden esittelyt tehdään yleensä ennen main() funktiota ja niiden määrittelyt sen jälkeen. Esittelyyn riittää kirjoittaa funktion otsikko. Funktion kutsuparametrien nimen ei tarvitse olla sama kuin funktion otsikossa olevien muodollisten parametrien. Funktion paluuarvo sijoitetaan sitä vastaavan tietotyypin muuttujan arvoksi. float laskeka (float luku1, float luku2); int main( ) { float eka=5.1;toka=4.2; float ka; ka = laskeka(eka, toka); }

26 2. Funktiot C-ohjelman käännösyksikön yleinen rakenne, paikalliset ja globaalit muuttujat Syntaksi Semantiikka esikääntäjäkutsut globaalienMuuttujienMäärittely funktioidenEsittely int main( ) { paikallistenMuuttujienMäärittely ohjelmanLauseet } funktioidenMäärittelyt Esikääntäjäkutsut kirjoitetaan kaikki eri riveille, mutta puolipistettä ei käytetä. esimerkiksi #include <stdio.h> Globaalit muuttujat näkyvät kaikissa alla määritellyissä funktioissa. Paikalliset muuttujat näkyvät vain siinä ohjelmalohkossa, missä ne ovat määritelty.

27 2. Funktiot Funktioiden määrittelyt ja toisen funktion kutsuminen
Syntaksi Semantiikka tyyppi funktio1(parametritOpt ) { paikallistenMuuttujienMäärittely funktionToiminta } tyyppi funktio2(parametritOpt ) …funktio1(kutsuparametrit)… C-kielessä jokainen funktion määrittely muodostaa oman itsenäisen ohjelmalohkonsa, sisäkkäisiä määrittelyjä ei sallita. Funktiot voivat kutsua toisia funktioita, jos kutsuttava funktio on vähintään esitelty (tai myös määritelty) koodissa ennen sitä ohjelmalohkoa, jossa kutsu esiintyy.

28 2. Funktiot Rekursiivinen funktio Semantiikka Syntaksi
tyyppi rek_funktio(parametritOpt ) { paikallistenMuuttujienMäärittely funktionToiminta …rek_funktio(kutsuparametrit)… } Funktiot voivat kutsua myös itseään, jolloin kyseessä on rekursiivinen funktio. Rekursiivinen funktion käyttö on tärkeä ohjelmallinen ratkaisu moniin ohjelmointiongelmiin. Rekursion käyttöön liittyy aina myös ongelmia, koska se kuluttaa paljon ohjelman vaatimaa muistitilaa. Lisäksi, jos käytetään useita rekursiivisia kutsuja, voi myös ohjelman suoritukseen kuluva aika kasvaa kohtuuttomasti.

29 2. Funktiot Rekursion määrittely Semantiikka Esimerkki
Funktio kertoma() palauttaa syötetyn luvun kertoman (!) eli kertoma(0)=0!=1 kertoma(1)=1!=1 kertoma(2)=2!=2*1!=2 kertoma(3)=3!=3*2!=6 jne… int kertoma(int luku) { if ( luku == 0 || luku == 1) return 1; else return luku*kertoma(luku-1); } Kuten toistolauseissakin tulee myös rekursiossa olla jokin ehto, jonka toteutuminen päättää rekursiiviset kutsut. Huom! Rekursio voidaan aina (jos osataan) korvata toistolauseilla (esim. for).


Lataa ppt "Rakenteinen ohjelmointi"

Samankaltaiset esitykset


Iklan oleh Google