815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

Samankaltaiset tiedostot
815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

ITKP102 Ohjelmointi 1 (6 op)

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Java-kielen perusteet

Java-kielen perusteet

Osoitin ja viittaus C++:ssa

7. Näytölle tulostaminen 7.1

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

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

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

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

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

Ohjelmoinnin perusteet Y Python

811312A Tietorakenteet ja algoritmit , Harjoitus 2 ratkaisu

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

815338A Ohjelmointikielten periaatteet

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

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

ITKP102 Ohjelmointi 1 (6 op)

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

13. Loogiset operaatiot 13.1

Ohjelmoinnin peruskurssi Y1

Tietotyypit ja operaattorit

815338A Ohjelmointikielten periaatteet Harjoitus 7 Vastaukset

815338A Ohjelmointikielten periaatteet

Ohjelmointi 1 C#, kevät 2013, 2. tentti

Ohjelmoinnin peruskurssi Y1

Ohjelmointi 1 C#, kevät 2013,

Muuttujien roolit Kiintoarvo cin >> r;

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

Kielioppia: toisin kuin Javassa

Ohjelmoinnin perusteet Y Python

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

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

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

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.

ITKP102 Ohjelmointi 1 (6 op)

7. Oliot ja viitteet 7.1

13. Loogiset operaatiot 13.1

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

Lyhyt kertaus osoittimista

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

12 Mallit (Templates)

16. Ohjelmoinnin tekniikkaa 16.1

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet Y Python

16. Ohjelmoinnin tekniikkaa 16.1

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

Lauseet ja lausekkeet imperatiivisissa ohjelmointikielissä

Jypelin käyttöohjeet» Miten voin liittää törmäyksiin tapahtumia?

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

Python-ohjelmointi Harjoitus 2

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Tietorakenteet ja algoritmit

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

ITKP102 Ohjelmointi 1 (6 op), arvosteluraportti

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

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

4. Luokan testaus ja käyttö olion kautta 4.1

Ohjelmoinnin peruskurssi Y1

14. Poikkeukset 14.1

Taulukot. Jukka Harju, Jukka Juslin

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 11 Ti Timo Männikkö

Ohjelmoinnin peruskurssi Y1

Java-kielen perusteita

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjausjärjestelmien jatkokurssi. Visual Basic vinkkejä ohjelmointiin

TAMPEREEN TEKNILLINEN YLIOPISTO

Luonnolliset vs. muodolliset kielet

Tietorakenteet (syksy 2013)

Ohjelmoinnin perusteet Y Python

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

C++ rautaisannos. Kolme tapaa sanoa, että tulostukseen käytetään standardikirjaston iostreamosassa määriteltyä, nimiavaruuden std oliota cout:

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

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

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin peruskurssi Y1

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

Olio-ohjelmointi 2. välikoe HYV5SN

Transkriptio:

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä seuraava C-ohjelma tulostaa ja miksi? Yritä ensin päätellä ja testaa suorittamalla ohjelma. #include <stdio.h> int tuplaa (int *luku) *luku *= 2; return *luku; int main() int a = 5,x; int *ptr = &a; x = tuplaa(ptr) + *ptr; printf("x = %d\n",x); return 0; Muuttuuko tulostus, jos pääohjelma muutetaan muotoon int main() int a = 5,x; int *ptr = &a; x = *ptr + tuplaa(ptr); printf("x = %d\n",x); return 0; Miksi tai miksi ei? Vastaus. Muuttujaan x sijoitettava arvo riippuu siitä, missä järjestyksessä lauseke tuplaa(ptr) + *ptr evaluoidaan. Funktio kertoo kahdella osoitinparametrinsa osoittaman muistiosoitteen sisällön ja palauttaa kaksinkertaistetun arvon. Näin ollen muuttujan a arvo 5 kerrotaan kahdella ja palautetaan arvo 10. Funktion kutsun jälkeen muistipaikassa on arvo 10. Mikäli funktio suoritetaan ennen arvon *ptr evaluointia, muuttujan x arvoksi tulee 10 + 10 = 20. Jos taas evaluoidaan ennen funktion kutsua, muuttujan x arvoksi tulee 10 + 5 = 15. C-kielen standardi ei (ainakaan luennoitsijan tietojen mukaan) määrää mikä on lausekkeen evaluointijärjestys. Harjoitusluokassa testattaessa (Dev-C++) saatiin arvo 20, mutta tulos voi periaatteessa vaihtua toisella kääntäjällä. Kun vaihdetaan sijoitettava lauseke muotoon *ptr + tuplaa(ptr), luokan ympäristössä tulos säilyy samana, joten funktio evaluoidaan ensin. Sen sijaan

luennoitsijan gcc-kääntäjän versio 4.9.1 vaihtaa evaluointijärjestyksen niin, että *ptr evaluoidaan ennen funktion kutsua, jolloin muuttujan x arvoksi tulee 15. Tehtävä 2. Olkoon C-ohjelmassa kokonaislukumuuttujilla a,b,c ja d arvot a = 5 b = 29 c = 3 d = 6 ja bool-tyyppisillä muuttujilla x,y ja z arvot x = true y = false z = true Käyttääksesi bool-tyypin muuttujaa on sinun sisällytettävä otsikkotiedosto <stdbool.h> ja kääntämällä C-kielen versiolla C99 (tai uudemmalla). Päättele ensin lausekkeiden 1. a + b/c %d 2. -a + ++b /d 3. a*2 + b++ /d 4.!x y && z arvot ja testaa ohjelmalla päättelitkö oikein. Vastaus. Lausekkeiden arvot riippuvat operaattoreiden suoritusjärjestyksestä eli presedenssistä. Huomioi, että muuttujat ovat kokonaislukutyyppisiä, joten niiden jakolaskun tulos on myös kokonaisluku. Huomaa myös, että operaattori ++ on lausekkeessa 2 prefix-muodossa, jolloin se evaluoidaan ensimmäiseksi, ja lausekkeessa 2 postfix-muodossa, jolloin se evaluoidaan vasta lausekkeen muun evaluoinnin jälkeen. Lauseke 1 evaluoidaan järjestyksessä b/c = 9 % d = 3 ja a+3 = 8 Lauseke 2 evaluoidaan järjestyksessä ++b = 30, -a = -5, 30/d = 5 ja -5+5 = 0 Lauseke 3 evaluoidaan järjestyksessä a*2 = 10, b/d = 4 ja 10+4 = 14. Suorituksen jälkeen muuttujan b arvo on 30, mutta postfixinä se tehdään vasta lausekkeen evaluoinnin jälkeen. Lauseke 4 evaluoidaan järjestyksessä!x = false, y&& z = false ja false false = false Nämä tulokset voi varmistaa kirjoittamalla yksinkertainen ohjelma, jossa arvot lasketaan. Muista palauttaa muuttujan b arvo toisen lausekkeen suorittamisen jälkeen.

Tehtävä 3. Kirjoita ohjelma, jonka avulla voi päätellä, käytetäänkö C-kielessä loogisten lausekkeiden oikosulkuevaluointia. Vastaus. Loogisen lausekkeen oikosulkuevaluointi tarkoittaa sitä, että lausekkeen kaikkia komponentteja ei evaluoida, mikäli lausekkeen totuusarvo tiedetään jo aiemmin. Esimerkiksi laskettaessa kahden lausekkeen loogista and-operaatiota, lopputulos on aina toisesta lausekkeesta riippumatta false, jos ensimmäisen lauseen totuusarvo on false. Samoin kahden lausekkeen or-operaation tulos on aina true, jos ensimmäisen lausekkeen totuusarvo on true. Oikosulkuevaluoinnin käyttöä voidaan testata esimerkiksi siten, että toinen lauseke kaataa ohjelman, jos se evaluoidaan. Harjoituksen yhteyteen linkitetty esimerkkiohjelma (H4_T3_oikosulku.c), jossa on tällaiset and-ja or-lausekkeet. Ohjelman suorittaminen osoittaa, että kummassakin tapauksessa tehdään oikosulkuevaluointi. Sen sijaan aritmeettisten lausekkeiden evaluoinnissa ei yleensä käytetä oikosulkuevaluointia. Tehtävä 4. FORTRAN -kieli noudattaa aliohjelman parametrien välityksessä inout - semantiikkaa. Tämä voidaan kuitenkin toteuttaa kahdella tavalla: viitevälityksellä tai arvo-tulos -välityksellä. Selvitä Internetin avulla, miten FORTRANissa laaditaan parametreja käyttävä aliohjelma. Kirjoita tämän jälkeen ohjelma, joka selvittää kumpaa välitysmekanismia käyttämäsi FORTRAN-versio soveltaa. Ainakin osoitteessa http://www.tutorialspoint.com/codingground.htm on verkossa toimiva FORTRANkääntäjä. Ohje: Välitä aliohjelmalle sama muuttuja kahdessa eri parametrissa ja tutki parametrien arvon muuttumista aliohjelman sisällä. Jos intoa vielä riittää, selvitä sama asia Ada-kielen inout-parametreille. Alla on yksinkertainen Ada-ohjelma, jossa välitetään aliohjelmalle kokonaislukumuuttuja inoutparametrina. with Ada.Text_IO, Ada.Integer_Text_IO; use Ada.Text_IO, Ada.Integer_Text_IO; procedure Parameters is muuttuja: Integer; procedure ParTest(par: in out Integer) is par := 99; end ParTest; Put_Line("Testataan parametreja. Ennen:"); muuttuja := 11; Put(muuttuja,4); ParTest(muuttuja); New_Line; Put_Line("Jalkeen:"); Put(muuttuja,4); end Parameters;

Adassa ei voi antaa samaa muuttujaa kahdelle eri inout-parametrille, joten asiaa pitää testata muuten. Huomaa, että aliohjelman voi keskeyttää heittämällä poikkeus. Adassa poikkeuksen voi aiheuttaa raise-lauseella, esimerkiksi raise Program_Error; Poikkeuksen voi käsitellä kootussa lauseessa lisäämällä sen loppuun exception-osan -- Koodia jossa voi tulla poikkeus exception when Program_Error => -- poikkeuksen käsittelyä end; Vastaus. Harjoituksen yhteyteen linkitetyssä tiedostossa H4_T4_partest.for välitetään kahta parametria käyttävälle aliohjelmalle kutsussa sama muuttuja. Aliohjelmassa muutetaan toisen parametrin arvoa ja tulostetaan kummankin parametrin arvot. Verkon kääntäjällä tuotetussa ohjelmassa molempien parametrien arvo muuttui. Näin ollen kumpikin parametri viittaa samaan muuttujaan ja voidaan päätellä, että käytössä on viitevälitys. Arvo-tulosvälityksessä parametrit ovat kopioita, jolloin aliohjelman sisällä parametrin arvon muuttaminen ei vaikuttaisi toiseen parametriin. Tiedostossa H4_T4_partest.ada on Ada-kielinen ohjelma, jossa välitetään aliohjelmalle parametri in out-moodissa. Parametrimuuttujan alkuarvo on 11; muuttujaan sijoitetaan aliohjelmassa arvo 99, minkä jälkeen aiheutetaan poikkeus. Pääohjelman poikkeuskäsittelijässä huomattiin testattaessa, että parametrimuuttujan arvo säilyi arvossa 11. Tämä viittaisi siihen, että Ada käyttää arvo-tulos-välitystä, koska sijoitus ei vaikuttanut muuttujaan, kun aliohjelmasta poistuttiin epänormaalisti. Ellei poikkeusta aiheuteta, muuttujan arvo luonnollisesti muuttuu. Tehtävä 5. Tarkastellaan aliohjelmaa aliohjelman parametrina. Kirjoita C- (tai C++-) kielellä funktio laske_summa, joka saa parametrinaan reaalilukutaulukon, sen alkioiden lukumäärän ja prototyyppiä double val_fun(double) olevan funktion. Funktio laske_summa palauttaa summan parametrina saamansa funktion arvoista sovellettuna taulukon alkioihin. Sovella funktiotasi laskemaan taulukon double taulu[] = 1.0,2.0,3.0 neliöiden summa (= 1.0 2 + 2.0 2 + 3.0 2 = 1.0 + 4.0 + 9.0 = 14.0), ts. parametrina annetaan funktio double square(double x) return x*x;

Vastaus. Harjoituksen yhteyteen linkitettyyn tiedostoon H4_T5_CallBackSumma.c on toteutettu C-kielellä vaadittu takaisinkutsuohjelma. Ohjelmassa lasketaan myös taulukon alkioiden kuutioiden summa käyttämällä funktion square asemasta funktiota double cube(double x) return x*x*x;