Aliohjelmat imperatiivisissa ohjelmointikielissä
|
|
- Viljo Niemelä
- 9 vuotta sitten
- Katselukertoja:
Transkriptio
1 Aliohjelmat imperatiivisissa ohjelmointikielissä Tässä dokumentissa käsitellään aliohjelmien suunnittelu- ja toteuttamisperiaatteita imperatiivisissa ohjelmointikielissä lähinnä Sebestan ([Seb], luvut 9 ja 10) pohjalta. Esimerkeissä esiintyviä kieliä käsitellään tarkemmin mm. seuraavissa teoksissa: [Ker] (Ckieli), [Strou] (C++ -kieli), [Kor] (Pascal), [Kur] (Ada), [Arc] (C#), [Arn] (Java) ja [KLS] (FORTRAN). Harsun kirjan ([Har]) luku 6 käsittelee aliohjelmia. 1. Aliohjelmat Erityisesti rakenteisen ohjelmoinnin periaatteisiin on aina kuulunut ohjelmointiongelman ratkaiseminen asteittain tarkentamalla, mitä kutsutaan myös ohjelman osittavaksi tai top-down -suunnitteluksi. Tällöin ylätasolla ohjelma kuvataan erittäin karkeasti suurina toimintakokonaisuuksina, joita tarkennetaan, kunnes päästään ohjelmointikielen lauseiden tasolle. Useimmiten tätä ylemmät tasot on luonnollista kuvata aliohjelmina, jotka suorittavat jonkin tietyn toiminnon "mustan laatikon" tapaan: tiedetään, mitä aliohjelman tarkoitus on tehdä vaikka yksityiskohtia ei vielä tunnetakaan. Aliohjelmat ovat prosessien abstrahointiväline, joka on esiintynyt ohjelmointikielissä aina niiden historian alusta saakka. Toinen merkittävä abstrahointimenetelmä, data-abstraktio, on saavuttanut asemansa vasta oliokielten yleistymisen yhteydessä. Kaikki ohjelmointikielet sisältävät jonkinlaisen aliohjelmatoteutuksen ja aliohjelmat ovatkin yksi merkittävimmistä ohjelmointikielten käsitteistä. Sebestan kirjan ([Seb]) luvussa 9 käsitellään ohjelmointikielten aliohjelmien periaatteita.
2 Kaikkien tässä käsiteltävien ohjelmointikielten aliohjelmilla on muutamia yhteisiä piirteitä. 1. Jokaisella aliohjelmalla on täsmälleen yksi tulokohta. 2. Aliohjelmaa kutsuvan ohjelman suoritus estetään kutsun ajaksi, siis vain yhtä aliohjelmaa suoritetaan kerrallaan. 3. Ohjelmakontrolli palaa aina kutsuvalle ohjelmalle, kun aliohjelman suoritus loppuu. Itse asiassa FORTRANin aliohjelmilla saattaa olla useita tulokohtia, mutta tämän ominaisuuden merkitys on verrattain vähäinen. Aliohjelmat, joita voidaan suorittaa toistensa kanssa yhtäaikaisesti, kuuluvat rinnakkaiseen ohjelmointiin, jota käsitellään suhteellisen lyhyesti myöhemmin kurssissa. Kullakin hetkellä suoritettavaa aliohjelmaa sanotaan aktiiviseksi aliohjelmaksi. Aliohjelman määrittely koostuu kahdesta osasta: aliohjelman otsikosta (header) ja aliohjelman rungosta. Aliohjelman otsikko määrittelee sen rajapinnan, ts. aliohjelman nimen ja sen muodolliset parametrit ja niiden tyypin. Lisäksi otsikossa määritellään paluuarvon tyyppi, mikäli sellainen on. Joissakin kielissä (esim. Java) otsikkoon voi myös kuulua aliohjelman suorituksen aiheuttamien poikkeuksien tyyppi. Poikkeuksia käsitellään tuonnempana. Aliohjelman runko sisältää sen toimintalogiikan, rungossa ovat ne lauseet, jotka suoritetaan aliohjelmaa kutsuttaessa. Aliohjelman kutsu (call) tarkoittaa pyyntöä suorittaa aliohjelma; yleensä ohjelmointikielissä aliohjelmaa kutsutaan sen nimellä. FORTRANissa on aliohjelmakutsulle oma käsky CALL. Lisäksi rungossa esitellään aliohjelman paikalliset muuttujat ja määritellään aliohjelmalle alisteiset aliohjelmat. Kaikki kielet eivät kuitenkaan tue sisäkkäisiä aliohjelmia; Pascalissa sisäkkäiset aliohjelmat ovat mahdollisia, C-pohjaisissa kielissä eivät. Joissakin kielissä aliohjelmat voidaan myös esitellä (otsikkonsa avulla) erillään määrittelystä; tällöin puhutaan aliohjelman prototyypistä. Aliohjelmien prototyyppejä käytetään yleisesti C-kielessä, samoin Adassa ja Pascalissa. Java ei salli aliohjelmia esiteltävän; esittelyä ei Javan näkyvyyssääntöjen takia tarvitakaan.
3 Aliohjelman otsikossa määriteltävät parametrit ovat muodollisia (formaaleja) parametreja, koska ne sidotaan muistiin (yleensä muualla esiteltyihin muuttujiin) vasta aliohjelmaa kutsuttaessa. Siksi aliohjelman kutsussa on oltava lista parametreista, jotka sidotaan aliohjelman muodollisiin parametreihin. Näitä sanotaan todellisiksi parametreiksi. Lähes kaikissa ohjelmointikielissä sidonnan määrää parametrin sijainti listassa. Joissakin kielissä (Ada ja FORTRAN 90) voi käyttää myös avainsanaparametreja, jolloin avainsanalla määrätään parametrin sitominen. Tämä voi olla tarpeellista, mikäli aliohjelma käyttää lukuisia parametreja. Ada ja FORTRAN 90 sekä C++ sallivat myös määritellä parametreille oletusarvoja, joita käytetään, mikäli kutsuva ohjelma ei anna parametrille arvoa, esimerkiksi C++: ssa voitaisiin kirjoittaa funktio int funk(int eka, float toka, double kolmas = 1.0) jota kutsuttaessa kahdella parametrilla, esimerkiksi funk(2,3.14); käytettäisiin muuttujalle kolmas oletusarvoa 1.0. Mikäli ohjelmoija kuitenkin antaa kolmannen parametrin, sen arvoa käytetään. Ks. esimerkiksi [Strou], kappale 7.5. Aliohjelmat voidaan jakaa kahteen tyyppiin: proseduureihin (procedures) ja funktioihin (functions). Proseduuri määrittelee jonkin parametrisoidun operaation, jolla ei ole paluuarvoa. Näin ollen proseduuri määrittelee tavallaan uuden lauseen ohjelmointikieleen. Funktio taas muistuttaa matemaattista funktiota siinä mielessä, että se laskee argumenttejaan (parametrit) käyttämällä jonkin tuloksen, joka palautetaan kutsuvaan ohjelmaan. Funktiot ovat siis enemmän ohjelmointikielen lausekkeiden kaltaisia. Koska funktiot ja proseduurit muistuttavat rakenteellisesti toisiaan, voidaan proseduuria ajatella funktiona, joka ei palauta mitään arvoa. Näin onkin tehty C-pohjaisissa kielissä, joissa ei erikseen voida määritellä proseduuria, vaan sellainen kirjoitetaan funktiona, jonka paluuarvo on void. Aliohjelmat ovat verrattain monimutkaisia ohjelmointikielten rakenteita, joten niiden toteutuksen suunnittelussakin on otettava huomioon varsin monia kysymyksiä. Tärkeimpiä ja luonnollisimpia valittavia ominaisuuksia on parametrien välitysmekanismi, jonka toteutukseen on käytetty useita malleja eri
4 ohjelmointikielissä. On siis valittava se tapa, jolla muodollinen parametri sidotaan todelliseen parametriin. Edelleen parametrien tyypintarkistuksen aste on päätettävä, samoin kuin se, minkälaisia parametreja yleensä voidaan välittää (ovatko esimerkiksi aliohjelmat välitettävissä). Lisäksi on valittava aliohjelman paikallisten muuttujien allokointitapa (staattinen tai dynaaminen). Kielen suunnittelijan on myös ratkaistava, sallitaanko aliohjelmien määritysten sijaita aliohjelmien sisällä. Joissakin kielissä voidaan aliohjelmia ylikuormittaa (overload), ja joissakin kielissä aliohjelmat voivat olla geneerisiä, ts. niiden parametrien tyypit voivat vaihdella. Vielä joudutaan miettimään, onko mahdollista kääntää aliohjelmia riippumattomina yksikköinä. 3.1 Proseduurit ja funktiot Aliohjelmat voidaan siis jakaa proseduureihin ja funktioihin toimintaperiaatteensa mukaan. Silti niiden toteutus ohjelmointikielissä on varsin samantyyppinen. FORTRANissa proseduuri esitellään sanasella SUBROUTINE, esimerkiksi SUBROUTINE OPEROI(I,J) Jota kutsuttaisiin pääohjelmasta esimerkiksi CALL OPEROI(10,20) (ks. [KLS] kapple 11.2). Myös Pascalissa on proseduuri omana aliohjelmatyyppinään. Se esitellään seuraavasti PROCEDURE OPEROI(I:INTEGER;J:INTEGER) ja kutsutaan koodissa aliohjelman nimellä, ts. esimerkiksi OPEROI(10,20); Myös Adassa on erotettu proseduuri- ja funktiotyyppiset aliohjelmat. C -pohjaisissa kielissä funktion ja proseduurin ainoa ero on proseduurin paluuarvon tyyppi void (ja luonnollisesti se, että tällainen funktio ei voi palauttaa mitään arvoa). Näin ollen C- tyyppisissä kielissä proseduuri kirjoitetaan void operoi(int x, int y)
5 ja funktio (joka tässä palauttaa double -tyyppisen arvon) double laskearvo(int x, int y) Yleisimmin ohjelmointikielissä funktion paluuarvo annetaan return-lauseessa, joka aiheuttaa aliohjelman suorituksen loppumisen, esimerkiksi edellisessä C-funktiossa voisi olla lauseet double retval;... retval = return retval; Tällöin funktion paluuarvo olisi muuttujan retval se arvo, joka sillä on return-lausetta suoritettaessa. C -kielessä (samoin kuin C++:ssa ja Javassa) funktio voi sisältää useita return -lauseita. On kuitenkin suositeltavaa käyttää ainoastaan yhtä poistumiskohtaa funktiossa mikäli mahdollista. Myös Adassa käytetään return-lausetta. FORTRANissa myös aliohjelmasta (sekä proseduurista että funktiosta) palataan RETURN-lauseella, mutta sen yhteydessä ei kuitenkaan anneta paluuarvoa, vaan se annetaan funktiolle sijoituslauseessa, esimerkiksi FUNCTION SUMMA(II,JJ) SUMMA = II+JJ RETURN END Samoin annetaan Pascal -kielisen funktion paluuarvo, mutta Pascal ei tunne return - lausetta, joten funktio suoritetaan loppuun saakka. Esimerkiksi FUNCTION MYFUNK(para1:INTEGER;para2:INTEGER): REAL; var m:integer; BEGIN MYFUNK := 2.1; FOR m:=1 TO para1+para2 DO writeln ('turhaa'); END;
6 Tätä ominaisuutta voidaan pitää sisäisen yhdenmukaisuuden puutteena Pascal- ja FORTRAN-kielissä, koska funktion paluuarvon antaminen muistuttaa sijoituslausetta. FORTRANissa funktiota kutsutaan sen nimellä toisin kuin proseduuria. 3.2 Parametrien välittäminen Yleensä aliohjelmissa voidaan määritellä omia muuttujia, joita kutsutaan paikallisiksi muuttujiksi (local variables). Muuttujien näkyvyysalueita on käsitelty aiemmin tässä dokumentissa. Aliohjelma voi siirtää tietoa kutsuvan ohjelman kanssa joko globaalien (yhteisten) muuttujien avulla tai parametrien välityksellä. Globaalien muuttujien käyttäminen lisää kuitenkin aliohjelmien sivuvaikutuksia, mikä ei ole toivottu piirre ohjelmassa. Siksi tiedot on suositeltavaa välittää parametrien avulla. Parametrit tekevät aliohjelmasta yleiskäyttöisen, niiden avulla voidaan välittää tietoa sekä aliohjelmaan että aliohjelmasta. Siten parametrit voidaan jakaa ryhmiin käyttötapansa (semantiikkansa) perusteella: 1. Parametrit, jotka välittävät tietoa aliohjelmaan 2. Parametrit, jotka välittävät tietoa aliohjelmasta kutsuvaan ohjelmaan 3. Parametrit, jotka välittävät tietoa kumpaankin suuntaan Tällöin puhutaan myös parametrin sidonnan moodista. Ensimmäisessä kohdassa puhutaan in -moodista, toisessa out -moodista ja kolmannessa inout -moodista. Joissakin kielissä parametri voidaan erikseen määritellä kuuluvaksi johonkin tyyppiin, joissakin kielissä välitystavat pitää toteuttaa muulla tavoin. Aina myöskään kielen määrittely ei kuvaa parametrien välitysmekanismia, vaan se voidaan jättää toteutuksesta riippuvaksi. Datan siirto parametrin välityksessä voi tapahtua periaatteessa kahdella tavalla: Joko välitettävä arvo kopioidaan tai tiedon saantipolku (käytännössä useimmiten tiedon sisältävän muistipaikan osoite) siirretään. Jälkimmäinen malli, josta käytetään myös nimitystä viitevälitys, on siirrettävän datan suhteen tehokkaampi, erityisesti mikäli siirrettävä arvo on jokin muistia kuluttava olio. Edellinen on turvallisempi tapa siirtää
7 tietoa, koska aliohjelma käsittelee alkuperäisen tiedon kopiota. Huomaa, että tiedon kopiointi voi tapahtua molempiin suuntiin, ts. sekä aliohjelmaan että aliohjelmasta. Seuraavaksi tarkastellaan parametrien välitysmallien toteutusmekanismeja. Yleisimmät mekanismit ovat: Moodi Välitysmekanismi Parametrityyppi in Arvovälitys (Pass-by-Value) Arvoparametri, Vakioparametri out Tulosvälitys (Pass-by-Result) Tulosparametri inout Arvo-tulosvälitys (Pass-by-Value-Result), Viitevälitys (Pass-by-Reference), Nimivälitys Arvo-tulosparametri, Viiteparametri, Nimiparametri Kun käytetään arvovälitystä, muodollinen parametri on eräänlainen paikallinen muuttuja, joka alustetaan todellisen parametrin arvolla (rvalue). Tämä toteutetaan yleisimmin kopioimalla todellisen parametrin data paikalliseen muuttujaan. Näin ollen parametrimuuttujan muuttaminen aliohjelmassa ei vaikuta todellisen parametrin arvoon, esimerkiksi C-ohjelmassa void f(int x) x = 10; } int y = 20; f(y); muuttujan y arvo funktiokutsun jälkeenkin on 20. Vakioparametriksi kutsutaan sellaista parametria, jonka arvoa ei voida muuttaa, ts. parametri onkin nyt paikallinen vakio. Tämän parametrinvälitystavan pääasiallinen haitta on suurikokoisten parametrien välittäminen, jolloin kopiointiin kuluu resursseja. Tulosvälityksessä todellisten parametrien arvoja ei välitetä aliohjelmalle, vaan aliohjelma käsittelee parametria kuin paikallista muuttujaa, jonka arvo kopioidaan
8 kutsuvan ohjelman parametrin arvoksi. Todellisen parametrin on näin ollen aina oltava muuttuja. Tulosvälitys toimii ikään kuin arvovälitys päinvastoin. Tulosvälityksessä voi kuitenkin esiintyä törmäämisongelma, jota ei esiinny arvovälityksessä. Olkoon esimerkiksi aliohjelmassa ali (int x, int y) x = 2; y = 3; } käytössä tulosvälitys muuttujille x ja y. Jos pääohjelmassa on määritelty muuttuja z, niin mikä sen arvo on kutsun ali(z,z) jälkeen? Arvo-tulosvälitys on yhdistelmä edellisistä ja toteuttaa tiedonvälityksen molempiin suuntiin. Tässä mallissa todellisen parametrin arvo kopioidaan ensin paikallisena muuttujana toimivan muodollisen parametrin arvoksi ja aliohjelman palatessa tämän paikallisen muuttujan arvo kopioidaan todellisen parametrin arvoksi. Tässäkin tapauksessa todellisen parametrin on oltava muuttuja. Arvo-tulosvälitys sisältää sekä arvo- että tulosvälityksen haittapuolet. Viitevälitys toteuttaa myös tiedonvälityksen molempiin suuntiin. Tässä tapauksessa ei kuitenkaan välitetä arvojen kopioita, vaan parametrina annetaan muuttujan muistiosoite, jolloin aliohjelma muokkaa alkuperäistä muuttujaa. Viitevälitys on resurssien käytön kannalta huomattavan tehokas, koska dataa ei tarvitse siirtää, eikä ylimääräistä muistia varata. Turvallisuus kärsii esimerkiksi siitä syystä, että aliohjelman muokatessa alkuperäistä muuttujaa, ei virhetilanteessa ole enää mahdollista palauttaa sitä aliohjelmakutsua edeltäneeseen tilaan. Toiseksi viitevälitys voi tuottaa moninimisyyttä, joka voi olla haitallista. Esimerkiksi C-funktiota void funk(int *pi1,int *pj2) kutsuttaessa int muuttuja = 1; funk(&muuttuja, &muuttuja);
9 funktiossa pi1 ja pj2 viittaavat samaan muuttujaan. Tämä voi aiheuttaa hankalia virhetilanteita. Muillakin tavoin viitevälityksessä voi syntyä moninimisyyttä. Näitä ongelmia ei esiinny arvo-tulosvälityksessä, mutta sekään menetelmä ei ole ongelmaton. Aivan oma tyyppinsä on myöhäiseen sidontaan perustuva nimivälitys. Tunnetuista kielistä vain ALGOL 60 käytti tätä menetelmää parametrien välityksessä. Ideana on ollut toteuttaa tekstuaalinen kopiointi, jossa todellinen parametri (ilmauksena) kopioituu muodollisen parametrin kaikkiin esiintymiskohtiin ja tämän jälkeen aliohjelma kopioituu sen kutsumiskohtaan. Täten tosiasiassa tapahtuva parametrin välitys riippuu parametrin tyypistä. Mikäli todellinen parametri on primitiivisen tietotyypin muuttuja, välitysmekanismi vastaa viitevälitystä. Jos taas todellinen parametri on lauseke, joka sisältää muuttujia, mekanismi ei muistuta mitään edellä esitetyistä mekanismeista. Käytännössä viitevälitys on vaikea toteuttaa ja ohjelmoijan kannalta hankala, joten sitä ei ole sittemmin juuri muissa kielissä käytetty lukuunottamatta SIMULA 67:ää. Tunnetuimpien kielten parametrinvälitysmekanismeja käsitellään seuraavaksi. FORTRAN -kielessä käytetään inout -moodia parametrien välitykseen. Kieli ei kuitenkaan määrittele, käytetäänkö arvo-tulosvälitystä vai viitevälitystä. Ainakin vanhemmat FORTRANin versiot käyttivät yleisesti viitevälitystä, joissakin myöhemmissä versioissa on käytössä ollut arvo-tulosvälitys. FORTRANin parametrinvälityksestä seuraa, että aliohjelmassa voidaan muuttaa todellisten parametrien arvoja, ts. aliohjelma SUBROUTINE VAIHDA(A,B) INTEGER A,B,X X = A A = B B = X RETURN END vaihtaa kutsuttaessa CALL VAIHDA(EKA_MUU,TOKA_MUU) muuttujien EKA_MUU ja TOKA_MUU arvot.
10 C -kieli käyttää (samoin kuin C++ ja Java) aina arvovälitystä parametreille, näin ollen C - kielinen funktio void vaihda(int x,int y) int temp = x; x = y; y = temp; } ei kutsuttaessa int eka = 10, toka = 20; vaihda(eka,toka); vaihda todellisten parametriensa eka ja toka arvoja. C-kielessä, samoin kuin C++ - kielessä voidaan kuitenkin inout -semantiikka toteuttaa käyttämällä osoittimia. Kun muutetaan yllä oleva funktio muotoon kutsu void vaihda(int *x,int *y) int temp = *x; *x = *y; *y = temp; } int eka = 10, toka = 20; vaihda(&eka,&toka); vaihtaa muuttujien eka ja toka arvot. Huomaa, että tässä tapauksessa funktiolle välitetään parametrina muuttujien osoitteet, joten parametrinvälitysmekanismi on silti sama kuin ennenkin. C++ :ssa on lisäksi referenssimuuttujatyyppi, jota on käsitelty aiemmin. C++ -kielen referenssi on vakio-osoitin, jolle tehdään implisiittinen muistiosoitteeseen viittaaminen, näin ollen käyttämällä referenssimuuttujia voidaan toteuttaa viitetyyppinen parametrin välitys. Näin ollen C++ -kielessä edellinen funktio voitaisiin myös kirjoittaa
11 ja kutsua void vaihda(int &x,int &y) int temp = x; x = y; y = temp; } int eka = 10, toka = 20; vaihda(eka,toka); jolloin muuttujien arvot vaihtuvat. Javassa ei ole osoitintyyppiä ja sen referenssityyppi poikkeaa C++ -kielen referenssistä, joten ylläolevan kaltaista kahden primitiivistä tietotyyppiä olevan muuttujan arvoa vaihtavaa metodia ei voi Javalla kirjoittaa. C# -kielen oletusmekanismi parametrinvälitykseen on arvovälitys, mutta myös viitevälitys on mahdollinen. Tämä saadaan aikaan määrittelemällä parametri joko ref tai out -tyyppiseksi ([Arc], luku 6). Määrittelyt eroavat ainoastaan siten, että ref - tyyppisenä parametrina käytettävä muuttuja on alustettava, kun out -tyyppistä parametria ei tarvitse. Näin ollen yllämainittu vaihtofunktio kirjoitettaisiin C#:ssa esimerkiksi public void vaihda(ref int x, ref int y) int temp = x; x = y; y = temp; } Pascalissa voidaan parametrin välityssemantiikka valita. Ellei parametrille anneta välitystyyppiä, käytetään arvovälitystä. Jos taas halutaan inout -semantiikka, määritellään parametrit muuttujaparametreiksi määreellä VAR. Tällöin käytetään viittausvälitystä, ts. aliohjelma käsittelee suoraan parametrimuuttujan muistipaikkaa (ks. [Kor], kappale 6.2.4). Näin ollen Pascalin aliohjelma
12 PROCEDURE vaihda(x,y:integer); var temp:integer; BEGIN temp := x; x := y; y := temp; END; ei vaihda parametriensa arvoja kutsuvassa ohjelmassa, mutta PROCEDURE vaihdaoikein(var x,y:integer); var temp:integer; BEGIN temp := x; x := y; y := temp; END; vaihtaa. Samassa aliohjelmassa voi olla sekä arvo- että muuttujaparametreja. Adassa voidaan käyttää kaikkia kolmea semantiikkaa: Adassa parametrien välitys tapahtuu kopioimalla, ts. in -parametrit välitetään arvovälityksellä, out -parametrit tulosvälityksellä ja in out -parametrit arvo-tulosvälityksellä. Näin ollen Ada -versio arvojen vaihtorutiinista olisi procedure vaihda(x: in out integer, y: in out integer) is temp:integer; begin temp := x; x := y; y := temp; end vaihda; Adassa arvoparametrit ovat tyyppiä in ja tulosparametrit tyyppiä out (ks. [Kur], kappale 5.5). 3.3 Taulukkojen välittäminen parametrina Taulukkojen - erityisesti useampiulotteisten - välittäminen parametrina vaatii monissa kielissä erityisiä toimenpiteitä, koska taulukot ovat yhtenäisiä muistialueita, joissa indeksointi lasketaan dimensioiden perusteella. Usein on kuitenkin välitettävä aliohjelmalle taulukko, jonka kokoa ja dimensioita ei tunneta (yleensä on kuitenkin
13 tunnettava ainakin ulottuvuuksien lukumäärä). Jo aiemmin mainittiin alkuperäisen Pascal-kielen ominaisuus, että taulukon indeksirajat olivat osa taulukon tyyppiä, joten oli mahdotonta kirjoittaa aliohjelmaa, joka olisi parametrinaan ottanut erikokoisia taulukoita. Tätä varten Pascalissa voidaan nykyään yleisesti käyttää avoimia taulukoita. Tällöin aliohjelmalle annetaan parametriksi vain taulukon tyyppi ja sen indeksien oletetaan alkavan nollasta. Korkein indeksi saadaan kutsumalla funktiota HIGH(). (Ks. aiempi esimerkki) C ja C++ -kielissä yksiulotteinen taulukko voidaan antaa parametrina aliohjelmalle ilman taulukon rajoja (tällöin luonnollisesti on mahdollista, että operaatiot ylittävät taulukon rajat, ellei niitä tunneta aliohjelmassa). Moniulotteisia taulukoita ei sen sijaan voida käsitellä aliohjelmissa, ellei dimensioita tunneta ylintä lukuunottamatta. Näin ollen muodollisissa parametreissa on annettava taulukon kaikki muut dimensiot, esimerkiksi kaksiulotteinen taulukko on välitettävä seuraavasti: void matriisifunktio(float matrix [][20]) jne Tällöin parametrina voidaan välittää esimerkiksi tai float matti[10][20]; float mattix[100][20]; mutta ei taulukkoa float mattiy[20][10]; Siksi ei ole mahdollista kirjoittaa funktiota, joka parametrinaan ottaisi käsiteltäväksi mielivaltaisen kaksiulotteisen taulukon ilman muita parametreja. Tällainen yleiskäyttöinen funktio voidaan C:lläkin kirjoittaa pienellä vaivalla: Kirjoitetaan funktio void matriisifunktio(float *mat_ptr, int rows, int cols) jne
14 jolle annetaan parametreina taulukko, taulukon rivien ja sarakkeiden lukumäärä. Nyt ohjelmoijan omalla vastuulla on kirjoittaa indeksointi ottamalla huomioon, että taulukon alkio mat_ptr[x,y] on sama kuin *(mat_ptr + x*cols +y) koska C:ssä indeksointi tehdään ensin rivien, sitten sarakkeiden mukaan ([Ker], Appendix A 8.6.2). Javassa taulukot ovat olioita, joiden dimensiot tunnetaan aina. Itse asiassa taulukot ovat aina yksiulotteisia, mutta niiden alkiot voivat olla taulukoita, jolloin saadaan rakennettua useampiulotteisia taulukoita. Javassa voidaan välittää mielivaltaisia taulukoita parametreina aliohjelmille, joissa saadaan taulukon koko selville kysymällä length -attribuutin arvoa kullekin dimensiolle. Adassa voidaan käyttää rajoittamattomia taulukoita ja välittää niitä parametreina aliohjelmalle; taulukon koko saadaan selville range -funktiolla, soveltamalla tätä kuhunkin dimensioon erikseen. Javan ja Adan mekanismit muistuttavat siis melkoisesti toisiaan. Adassa voitaisiin kirjoittaa esimerkiksi mielivaltaisen matriisin alkioiden summan laskeva funktio seuraavasti: type MATRIISI is array (INTEGER range<>, INTEGER range<>) of FLOAT; function MATSUMMA(MATRIX: in MATRIISI) return FLOAT is SUMMA:FLOAT := 0.0; begin for RIVI in MATRIX'range(1) loop for SARA in MATRIX'range(2) loop SUMMA := SUMMA+MATRIX(RIVI,SARA); end loop; end loop; return SUMMA; end MATSUMMA; Tällöin funktiolle voidaan antaa mikä tahansa kaksiulotteinen liukulukutaulukko parametrina määrittelemällä se MATRIISI -tyyppiseksi muuttujaksi.
15 3.4 Aliohjelmien välittäminen parametrina Joskus ohjelmoinnissa kätevin ratkaisu olisi välittää aliohjelma parametrina toiselle aliohjelmalle, jolloin sitä voidaan kutsua ns. takaisinkutsun (callback) periaatteella. Funktionaalisessa ohjelmoinnissa tällainen aliohjelmien välittäminen on keskeisessä asemassa. Myös joissakin imperatiivisissa kielissä tämä on mahdollista. Idean toteuttamisessa on kuitenkin joitakin hankaluuksia. Tyypillinen ongelma on, tarkistetaanko parametrina saadun aliohjelman kutsuissa esiintyvien parametrien tyypit. Lisäksi parametrina välitetyn aliohjelman viiteympäristön määräytyminen on mielenkiintoinen ongelma. (Aliohjelman viiteympäristö tarkoittaa aliohjelmassa näkyvien tunnisteiden joukkoa.) Olio-ohjelmoinnissa tarve aliohjelman välittämiselle poistuu ainakin osittain, koska takaisinkutsu voidaan toteuttaa välittämällä olio, jonka metodia kutsutaan. Tyypillisesti tähän käytetään apuna rajapintoja. Esimerkiksi Javassa ei ole mahdollista välittää metodia aliohjelmaparametrina, vaan on käytettävä oliosuuntautuneita tekniikoita takaisinkutsun toteuttamiseen. Joissakin kielissä aliohjelmaparametrien käyttäminen vaihtelee toteutusten välillä. Esimerkiksi alkuperäisessä Pascalissa aliohjelmaparametreja voitiin käyttää, mutta myöhemmissä versioissa ominaisuus ei ole yleisesti käytössä. Adassa aliohjelmien välittäminen parametreina on kielletty. FORTRAN 77:ssä voidaan aliohjelman nimi välittää parametrina aliohjelmalle; tyypin tarkistuksia ei tehdä. C ja C++ -kielissä voidaan myös käyttää funktion nimeä parametrina; tällöin välitetään osoitin funktioon, koska C-kielessä (ja C++:ssa) funktion nimi toimii aina funktion osoittimena ([Ker], kappale 5.11). Koska funktion parametrit kuuluvat funktion tyyppiin, voidaan parametrien tyyppiyhteensopivuus varmistaa jo käännösaikana. Monet C-kääntäjät sallivat kuitenkin epäyhteensopivat kutsut kuitaten ne esimerkiksi varoituksella. Yleensä C++ -kääntäjät ovat tarkempia.
16 C-kielessä aliohjelma välitettäisiin esimerkiksi seuraavasti: void ali_yx(int x) printf("x=%d \n",x); } void cb_fun(void ali(int)) ali(-200); } Pääohjelmassa kutsuttaisiin:... cb_fun(ali_yx);... Parametrina saadun aliohjelman viiteympäristön määräytymiseen voidaan periaatteessa käyttää kolmea tapaa: 1. Pinnallinen sidonta (matala sidonta, shallow binding), 2. Syvä sidonta (deep binding), 3. Tilanteen mukainen sidonta (ad hoc binding). Pinnallisessa sidonnassa viiteympäristö on kutsuvan aliohjelman ympäristö. Tätä menetelmää suositaan joissakin dynaamiseen sidontaan perustuvissa kielissä. Staattista sidontaa käyttävät kielet suosivat yleensä syvää sidontaa, jolloin parametrina saadun funktion viiteympäristö on sama kuin välitettävän aliohjelman viiteympäristö muutenkin. Näin ollen staattinen sidonta on ylivoimaisesti yleisin malli. Tilanteen mukainen sidonta, vaikka onkin periaatteessa mahdollinen, ei tiettävästi ole käytössä missään kielessä: siinä viiteympäristön määrää aliohjelmaparametrin saavaa aliohjelmaa kutsuva aliohjelma (ks. [Seb], kappale 9.6). 3.5 Aliohjelman ylikuormittaminen ja geneeriset aliohjelmat Aliohjelman ylikuormittaminen (overloading) tarkoittaa sitä, että samannimisellä aliohjelmalla on useita määrittelyjä, jotka eroavat toisistaan parametrilistoiltaan ja -
17 joissakin tapauksissa - paluuarvoiltaan. Ohjelmassa pitää voida aliohjelman kutsun muodosta päätellä, mitä versiota aliohjelmasta käytetään. Yleisesti paluuarvon tyypillä ei voida erottaa aliohjelmia toisistaan. Näin ollen useimmat kielet eivät salli samannimisiä aliohjelmia, joilla on samat parametrilistat mutta eri paluuarvot. Ylikuormittaminen ei ole mahdollista FORTRANissa, mutta uudemmat kielet, kuten Pascal (ainakin jotkin versiot), Ada, Java, C ja C++ sallivat aliohjelmien ylikuormittamisen. Geneerisellä ohjelmoinnilla tarkoitetaan ohjelmointimenetelmää, joka sallii parametrisoitujen tyyppien käytön konkreettisten tyyppien asemasta. Erityisesti toteutettaessa tietorakenteita geneerinen ohjelmointi osoittaa voimansa: esimerkiksi toteutettaessa lineaarinen lista, sen käsittelyalgoritmit ovat samat riippumatta siitä, minkälaisia tietoalkioita lista sisältää. Erityisesti geneeriset aliohjelmat sallivat tyyppiriippumattomien aliohjelmien toteuttamisen, koska ne voivat ottaa erityyppisiä parametreja eri aktivointikerroilla. Joissakin yhteyksissä geneerisiä aliohjelmia kutsutaan myös polymorfisiksi aliohjelmiksi. Yleisimmässä muodossaan geneeriset aliohjelmat voidaan toteuttaa dynaamista sidontaa käyttävissä kielissä, koska niissä aliohjelmaparametrien tyyppiä ei tarvitse välttämättä etukäteen määritellä. Tavallisempi muoto on kuitenkin parametrisoitu polymorfismi, jossa käytetään parametrisoituja tyyppejä. Nämä sidotaan käännösaikaisesti johonkin konkreettiseen tyyppiin. Geneeristen aliohjelmien (ja yleensä geneerisen ohjelmoinnin) soveltaminen lisää koodin uudelleenkäytettävyyttä. Yleisimpiä geneeristä ohjelmointia tukevia kieliä ovat olleet Ada ja C++, joista molemmissa on toteutettu käännösaikainen parametrisoitu polymorfismi. C++ -kieli on rakennettu tukemaan voimakkaasti geneeristä ohjelmointia. Itse asiassa jokaiseen C++ -toteutukseen sisältyy standardimallikirjasto (Standard Template Library, STL), joka sisältää geneerisesti toteutettuja tietorakenteita ja algoritmeja. C++ - kielessä geneerisyys ilmaistaan avainsanalla template, esimerkiksi seuraava funktio lajittelee mielivaltaisia alkiota sisältävän taulukon (kunhan taulukkoalkioita voidaan vertailla operaattorilla >):
18 template <typename T> void lajittele(t lista[], int pituus) int i, j; T temp; for (i=0; i < pituus-1; i++) for (j=i+1; j < pituus; j++) if (lista[i] > lista[j]) temp=lista[i]; lista[i]= lista[j]; lista[j]=temp; } } Tätä funktiota voitaisiin käyttää esimerkiksi seuraavasti: double dbllist[] = -1.2, 3.4, -5.4, 9.9, 2.5}; int intlist[] = -1, 2, 3, -5, 10, 25, 11}; lajittele<double>(dbllist,5); lajittele<int>(intlist,7); Ada-kielen toteutuksen tavoin myös C++ -kielessä kääntäjä muodostaa koodin, kun mallia sovelletaan ohjelmassa konkreettiseen tyyppiin. Tarkemmin aihetta käsitellään lähteessä [Strou], luku 13. Javaan on lisätty geneerisen ohjelmoinnin tuki versioon 1.5 (ks. tarkemmin: Aliohjelmien toteuttamisesta Lopuksi käsitellään hieman aliohjelmien toteutukseen liittyviä seikkoja eri kielissä. Ohjelmarakenne vaikuttaa olennaisella tavalla aliohjelmien toteutukseen ja siihen, miten aliohjelma voi kommunikoida muun ohjelman kanssa. Paitsi välittämällä aliohjelmalle parametreja, voidaan kommunikoida myös ei-paikallisen informaation välityksellä. Ohjelmarakenne määrää informaation näkyvyyden aliohjelmassa. Ohjelmointikielet voidaan jakaa ohjelmarakenteensa perusteella neljään ryhmään:
19 1. Avoimet kielet (ei rakennetta), 2. Riippumattomat kielet (sisäkkäisiä ohjelman osia ei sallita), 3. Alisteiset kielet (sisäkkäiset osat mahdollisia), 4. Rajoitetusti alisteiset kielet. Avoimia kieliä ovat BASIC ja COBOL, joissa ei ohjelmalla ole erityistä järjestettyä rakennetta. FORTRAN on esimerkki riippumattomasta kielestä; FORTRAN -ohjelmassa on pääohjelma ja joukko riippumattomia aliohjelmia, jotka eivät voi olla sisäkkäisiä. FORTRANissa globaalit muuttujat esitellään COMMON -lauseella. Itse asiassa COMMON määrittelee FORTRANissa yhteisen muistialueen, jota kukin aliohjelma voi käyttää haluamallaan tavalla. Useimmiten COMMON -lohkoja käytetään kuitenkin yhteisten, globaalien muuttujien toteuttamiseen. ALGOL -tyyppisissä kielissä ohjelma on yhtenäinen kokonaisuus, jonka osia sen aliohjelmat ovat. Lisäksi aliohjelmat voivat sisältää aliohjelmia jne. Tällaisia alisteisia kieliä ovat esimerkiksi Pascal ja Ada. C -kieli (samoin C++) on riippumattomien ja alisteisten kielten välimuoto: rajoitetusti alisteinen kieli. Tällaisessa kielessä aliohjelmia ei voi määritellä alisteisesti, ts. aliohjelmamäärittely ei voi sisältää toista aliohjelmamäärittelyä. Kuitenkin aliohjelmarakenteen yläpuolella on globaali alue, johon voidaan määritellä globaaleja muuttujia. Suurten ohjelmistojen rakentamisen perusedellytyksiä on pystyä kääntämään ohjelmiston osia kääntämättä koko ohjelmaa uudelleen. Siten tällaiseen ohjelmistokehitykseen suunniteltujen kielten tulee antaa mahdollisuus osittaiseen kääntämiseen. Yleisesti tämä voidaan tehdä kahdella tavalla: erillisellä kääntämisellä (separate compilation) ja riippumattomalla kääntämisellä (independent compilation). Erikseen käännettäviä ohjelman osia sanotaan käännösyksiköiksi (compilation units). Tavallisimmat riippumattoman kääntämisen sallivat kielet ovat C ja FORTRAN 77; riippumattomassa kääntämisessä eri käännösyksikköjen välisiä riippuvuuksia ei tarkisteta; näin ollen käännösyksiköt voidaan kääntää täysin toisistaan piittaamatta. Erityisesti FORTRAN 77:ssä jopa samassa tiedostossa sijaitsevat aliohjelmat käännetään toisistaan riippumatta. Alisteisissa kielissä riippumaton kääntäminen on
20 ohjelmarakenteen takia mahdotonta. Näihin kieliin on yleensä kuitenkin toteutettu erillinen kääntäminen, mikä tarkoittaa sitä, että käännösyksiköt voidaan kääntää erikseen, mutta käännöstulos riippuu kuitenkin muista käännösyksiköistä. Alkuperäinen Pascal (kuten FORTRANin ensimmäiset versiot) ei sallinut erillistä kääntämistä, vaan käännösyksikkönä oli koko ohjelma. Myöhemmissä versioissa tämä puute on korjattu. Aliohjelman kutsun ja paluun muodostamaa operaatiota kutsutaan yleensä aliohjelman linkitykseksi (subprogram linkage). Linkityksessä on toteutettava tiedonsiirto aliohjelman ja kutsuvan ohjelman välillä kaikilla niillä tavoilla, jotka kielessä ovat mahdollisia. Edelleen kutsuvan ohjelman ajonaikainen tila on talletettava, jotta kontrolli voidaan palauttaa aliohjelmasta poistuttaessa. Koska aliohjelmissa tarvitaan paikallisia muuttujia, näille on varattava muistitilaa. Päämenetelmät muistin varaamiseen ovat staattinen ja dynaaminen allokointi. Staattisessa menetelmässä kaikkien muuttujien vaatima muistitila on tiedettävä ennakolta ja se varataan jo käännösaikana. Staattinen menetelmä on suorituksen kannalta tehokas, mutta myös resursseja kuluttava, koska eri aliohjelmien paikallisia muuttujia ei voi sijoittaa samoihin muistipaikkoihin, vaikka aliohjelmia ei suoritettaisi ikinä yhtä aikaa. FORTRANissa käytettiin staattista menetelmää, mikä oli mahdollista koska dynaamisia tietoalkioita eikä rekursiivisia aliohjelmia voitu käyttää. Muistin allokointi tapahtuu kokonaisuudessaan, kun ohjelma ladataan muistiin. Yleensä nykyään käytetään dynaamista allokointia, jossa vaadittava tila varataan dynaamisesti aliohjelmapinosta. Alue, johon aliohjelmaa kutsuttaessa tietoalkiot luodaan, on nimeltään aliohjelman aktivaatiotietue (activation record). Aliohjelmaa kutsuttaessa siis aktivaatiotietue laitetaan pinoon ja poistetaan jälleen aliohjelmasta palattaessa. Tämä mahdollistaa dynaamisemman muistinkäytön suoritusajan lievän kasvamisen kustannuksella, eroa ei voida kuitenkaan pitää merkittävänä nykykoneilla. Myös FORTRAN käyttää aktivaatiotietuetta, mutta se on luonteeltaan staattinen, pinomuistia ei käytetä.
21 Kuva. Aktivaatiotietueen tyypillinen rakenne. Aktivaatiotietue sisältää muutakin tietoa kuin aliohjelman paikallisia muuttujia ja tilan funktion paluuarvolle, kuten ylläoleva kuva osoittaa. Luonnollisesti tarvitaan paluuosoite kutsuvaan ohjelmaan kontrollin siirtämiseksi, lisäksi on tiedettävä kutsuvan ohjelman aktivaatiotietueen sijainti, ts. pinon vanha huippuosoite eli dynaaminen linkki. Näiden tietojen avulla pino voidaan palauttaa aliohjelmakutsua edeltävään tilaan sekä jatkaa ohjelman suoritusta, kun aliohjelman suoritus päättyy. Myös rekursio voidaan toteuttaa käyttämällä dynaamisesti varattavia aktivaatiotietueita. C-kielen kaltaisissa kielissä aktivaatiotietueen toteutus on varsin suoraviivainen, koska aliohjelmat eivät voi limittyä. Tällöin aliohjelmien aktivaatiotietueiden ei tarvitse tietää mitään muiden aliohjelmien tietueista. Alla olevassa kuvassa on esimerkki C-ohjelman kutsupinosta, kun pääohjelmasta kutsutaan funktiota F, joka puolestaan kutsuu funktiota G.
22 Kuva. Esimerkki C-ohjelman kutsupinosta. Sen sijaan alisteisten kielten tapauksessa aktivaatiotietueen on sisällettävä informaatiota, jonka avulla aliohjelmassa voidaan käyttää muiden aliohjelmien aktivaatiotietueita. Tätä tarvitaan ei-paikallisten viittausten arvojen hakemiseksi. C- kielessä tämä ei ole ongelma, sillä ei-paikalliset viittaukset kohdistuvat aina globaaliin alueeseen, joka on sama kaikille aliohjelmille. Jos aliohjelma on kuitenkin määritelty toisen aliohjelman sisällä, voi ei-paikallinen muuttuja olla esitelty pääohjelmassa tai ylemmässä aliohjelmassa. Jälkimmäisessä tapauksessa muuttujan arvo saadaan käyttämällä ko. aliohjelman aktivaatiotietuetta. Tällaisessa tapauksessa helpoin tapa toteuttaa tarvittavat sidonnat, on tallettaa aktivaatiotietueeseen ns. näkyvyyslinkki (staattinen linkki, static link, access link), joka osoittaa pinossa viimeiseen aliohjelman sisältävän aliohjelman aktivaatiotietueeseen. Linkkiä seuraamalla löydetään oikea tunniste. Näkyvyyslinkkimenetelmä ei kuitenkaan ole kovin tehokas, mikäli ohjelman rakenne on monimutkainen. Tehokkaampaa on käyttää ns. näkyvyystauluja (display tables), mikä onkin ainoa yleisesti käytetty vaihtoehtoinen menetelmä. Tässä menetelmässä näkyvyyslinkit kootaan yhteen tauluun eikä niitä säilytetä aktivaatiotietueissa. Näkyvyystaulun ylläpito on hieman työläämpää kuin näkyvyyslinkkien, nimittäin jokaisen aliohjelmakutsun ja aliohjelmasta paluun yhteydessä näkyvyystilanne muuttuu, joten myös näkyvyystaulua on muutettava kummassakin tapauksessa. Sebestan teoksessa ([Seb], luku 10) käsitellään varsin tarkasti näkyvyyslinkkien ja näkyvyystaulujen käyttöä.
23 Lähteet [Arc] Archer, Tom. Inside C#. Edita, IT Press, [Arn] Arnold, Ken Gosling, James. The Java Programming Language, Second Edition, Addison-Wesley [Har] Harsu, Maarit. Ohjelmointikielet, Periaatteet, käsitteet, valintaperusteet, Talentum [Ker] Kernighan, Richie. The C Programming Language. Prentice Hall [KLS] Kortela, Larmela, Salmela. FORTRAN 77. OtaData [Kor] Kortela, Larmela, Planman. Pascal-ohjelmointikieli. OtaData [Kur] Kurki-Suonio Reino. Ada-kieli ja ohjelmointikielten yleiset perusteet. MODEEMI ry Tampere [Seb] Sebesta, Robert W. Concepts of Programming Languages 10th edition, Pearson [Strou] Stroustrup, Bjarne. The C++ Programming Language, 3rd edition, Murray Hill 1997.
815338A Ohjelmointikielten periaatteet
815338A Ohjelmointikielten periaatteet 2015-2016 IV.3 Imperatiivinen ohjelmointi aliohjelmat Sisältö 1. Yleistä aliohjelmista 2. Proseduurit ja funktiot 3. Parametrien välittäminen 4. Taulukon välittäminen
815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
Osoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.
Proseduurit Proseduuri voi olla 1) Funktio, joka palauttaa jonkin arvon: real function sinc(x) real x sinc = sin(x)/x... y = sinc(1.5) 2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma
C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.
Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen
815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 4 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten lauseisiin, lausekkeisiin ja aliohjelmiin liittyvät kysymykset. Tehtävä 1. Mitä
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.
Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Luento 4 Aliohjelmien toteutus
Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Jakso 4 Aliohjelmien toteutus
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Jakso 4 Aliohjelmien toteutus. Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio
Jakso 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet: aliohjelma, proseduuri parametrit funktio parametrit,
Luento 4 (verkkoluento 4) Aliohjelmien toteutus
Luento 4 (verkkoluento 4) Aliohjelmien toteutus Tyypit, Parametrit Aktivointitietue (AT) AT-pino, rekursio 1 Aliohjelmatyypit Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri Parametrit
4.2. ALIOHJELMAT 71. Tulosvälitteisyys (call by result) Tulosvälitteinen parametri kopioidaan lopuksi
4.2. ALIOHJELMAT 71 sisältyä kaikki tarvittavat kontrollia ohjaavat rakenteet. Jos se on lause (yleensä lohko), niin on ratkaistava, miten paluuarvo ilmaistaan. Joissakin kielissä (esimerkiksi Pascal)
Luento 4 (verkkoluento 4) Aliohjelmien toteutus
Luento 4 (verkkoluento 4) Aliohjelmien toteutus Tyypit, Parametrit Aktivaatiotietue (AT) AT-pino, rekursio 1 Aliohjelmatyypit Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri Parametrit
Luento 4 Aliohjelmien toteutus
Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri parametrit funktio parametrit,
11/20: Konepelti auki
Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon
Tieto- ja tallennusrakenteet
Tieto- ja tallennusrakenteet Sisältö Tyyppi, abstrakti tietotyyppi, abstraktin tietotyypin toteutus Tallennusrakenteet Taulukko Linkitetty rakenne Abstraktit tietotyypit Lista (Puu) (Viimeisellä viikolla)
Sisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä
Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.
2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä
Luento 4 Aliohjelmien toteutus
Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri parametrit funktio parametrit,
Luento 4 Aliohjelmien toteutus. Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio
Luento 4 Aliohjelmien toteutus Tyypit Parametrit Aktivointitietue (AT) AT-pino Rekursio 1 Aliohjelmatyypit (2) Korkean tason ohjelmointikielen käsitteet aliohjelma, proseduuri parametrit funktio parametrit,
Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista
Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
1. Omat operaatiot 1.1
1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
C++11 lambdat: [](){} Matti Rintala
C++11 lambdat: [](){} Matti Rintala bool(*)(int) Tarve Tarve välittää kirjastolle/funktiolle toiminnallisuutta Callback-funktiot Virhekäsittely Käyttöliittymät Geneeristen kirjastojen räätälöinti STL:n
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 22. huhtikuuta 2016 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille! Kirjoittamasi luokat, funktiot ja aliohjelmat
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 12. huhtikuuta 2019 Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä. Yksi A4-kokoinen lunttilappu
Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
Sisältö. 22. Taulukot. Yleistä. Yleistä
Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 2.3.2009 T-106.1208 Ohjelmoinnin perusteet Y 2.3.2009 1 / 28 Puhelinluettelo, koodi def lue_puhelinnumerot(): print "Anna lisattavat nimet ja numerot." print
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Geneerinen ohjelmointi. Lueteltu tyyppi enum. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien silmukoimiseen:
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();
Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio
Rakenteiset tietotyypit Moniulotteiset taulukot
C! Rakenteiset tietotyypit Moniulotteiset taulukot 22.2.2018 Agenda Rakenteiset tietotyypit Vilkaisu 6. kierroksen tehtäviin Moniulotteiset taulukot Esimerkki Seuraava luento to 8.3. Ilmoittautuminen ohjelmointikokeeseen
Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.
Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 7. huhtikuuta 2017 Vastaa kaikkiin tehtäviin. Tee jokainen tehtävä erilliselle konseptiarkille. Kirjoittamasi luokat, funktiot ja aliohjelmat
1. Olio-ohjelmointi 1.1
1. Olio-ohjelmointi 1.1 Sisällys Olio-ohjelmointi on eräs ohjelmointiparadigma. Olio-ohjelmoinnin muotoja. Ohjelmiston analyysi ja suunnittelu. Olioparadigman etuja ja kritiikkiä. 1.2 Ohjelmointiparadigmoja
ITKP102 Ohjelmointi 1 (6 op)
ITKP102 Ohjelmointi 1 (6 op) Tentaattori: Antti-Jussi Lakanen 20. huhtikuuta 2018 Vastaa kaikkiin tehtäviin. Tee kukin tehtävä omalle konseptiarkille. Noudata ohjelmointitehtävissä kurssin koodauskäytänteitä.
ADA. Ohjelmointikieli. Ryhmä 5 Henna Olli, Päivi Hietanen
ADA Ohjelmointikieli Ryhmä 5 Henna Olli, Päivi Hietanen 1 JOHDANTO Ada on käännettävä ohjelmointikieli, joka kehitettiin vähentämään sulautettujen ja reaaliaikaisten järjestelmien käyttökustannuksia. Kieli
Tutoriaaliläsnäoloista
Tutoriaaliläsnäoloista Tutoriaaliläsnäolokierroksella voi nyt täyttää anomuksen läsnäolon merkitsemisestä Esim. tagi ei toiminut, korvavaltimon leikkaus, yms. Hyväksyn näitä omaa harkintaa käyttäen Tarkoitus
Taulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 27. lokakuuta 2009
TIE448 Kääntäjätekniikka, syksy 2009 Antti-Juhani Kaijanaho TIETOTEKNIIKAN LAITOS 27. lokakuuta 2009 Sisällys Sisällys Seuraava deadline Vaihe D tiistai 10.11. klo 10 välikielen generointi Kääntäjän rakenne
815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 6 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen
Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus
JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?
JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma
5.6. C-kielen perusteet, osa 6/8, Taulukko 6.1.2008, pva, kuvat jma Every cloud has a silver line. - englantilainen sananlasku Tässä osiossa tärkeää: yksi- ja moniulotteinen taulukko Sisältö Yleistä Yksiulotteinen
12 Mallit (Templates)
12 Mallit (Templates) Malli on määrittely, jota käyttämällä voidaan luoda samankaltaisten aliohjelmien ja luokkien perheitä. Malli on ohje kääntäjälle luoda geneerisestä tyyppiriippumattomasta ohjelmakoodista
7. Oliot ja viitteet 7.1
7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin
Taulukot. Taulukon määrittely ja käyttö. Taulukko metodin parametrina. Taulukon sisällön kopiointi toiseen taulukkoon. Taulukon lajittelu
Taulukot Taulukon määrittely ja käyttö Taulukko metodin parametrina Taulukon sisällön kopiointi toiseen taulukkoon Taulukon lajittelu esimerkki 2-ulottoisesta taulukosta 1 Mikä on taulukko? Taulukko on
Monipuolinen esimerkki
Monipuolinen esimerkki Lopuksi monipuolinen esimerkki, jossa ohjelmisto koostuu pääohjelmasta ja kahdesta aliohjelmasta, joista toinen on proseduuri ja toinen funktio. Funktio Sqrt(int n): int Sqrt(int
Lyhyt kertaus osoittimista
, syksy 2007 Kertausta Luento 10 12.10.2007 Syksy 2007 1 Lyhyt kertaus osoittimista char *p; /* char, int, jne ilmoittavat, minkä tyyppisiä */ Keskusmuisti int *q; /* olioita sisältäviin muistilohkoihin
Olio-ohjelmointi Javalla
1 Olio-ohjelmointi Javalla Olio-ohjelmointi Luokka Attribuutit Konstruktori Olion luominen Metodit Olion kopiointi Staattinen attribuutti ja metodi Yksinkertainen ohjelmaluokka Ohjelmaluokka 1 Olio-ohjelmointi
Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi
Imperatiivisen ohjelmoinnin peruskäsitteet muuttuja muuttujissa oleva data voi olla yksinkertaista eli primitiivistä (esim. luvut ja merkit) tai rakenteista jolloin puhutaan tietorakenteista. puhuttaessa
Osoittimet ja taulukot
C! ja taulukot 1.2.2018 Tiedotteita Tämän jälkeen taas pari väliviikkoa (tenttiviikko) Seuraava luento 22.2. Laskareita ei tenttiviikolla 12.2. 16.2. 2 ja muisti Muisti Keskusyksikkö Suorittaa muistissa
Rajapinta (interface)
1 Rajapinta (interface) Mikä rajapinta on? Rajapinta ja siitä toteutettu luokka Monimuotoisuus ja dynaaminen sidonta Rajapinta vs periytyminen 1 Mikä rajapinta on? Rajapintoja käytetään, kun halutaan määritellä
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Muuttujat eri muisteissa Ohjelman muistialueen layout Paikallisen ja globaalin muuttujan ominaisuudet Dynaamisen muistinkäytön edut Paikallisten muuttujien dynaamisuus ADT
Algoritmit 1. Luento 3 Ti Timo Männikkö
Algoritmit 1 Luento 3 Ti 17.1.2017 Timo Männikkö Luento 3 Algoritmin analysointi Rekursio Lomituslajittelu Aikavaativuus Tietorakenteet Pino Algoritmit 1 Kevät 2017 Luento 3 Ti 17.1.2017 2/27 Algoritmien
Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19
Ohjelmointikieli TIE-20306 Principles of Programming Languages Syksy 2017 Ryhmä 19 Juho Kärnä Ville Mäntysaari 1. Johdanto D on yleiskäyttöinen, strukturoitu, staattisesti tyypitetty, käännettävä ohjelmointikieli
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3
16. Lohkot 16.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.2 Lohkot Kaarisulut
811120P Diskreetit rakenteet
811120P Diskreetit rakenteet 2016-2017 4. Joukot, relaatiot ja funktiot Osa 3: Funktiot 4.3 Funktiot Olkoot A ja B joukkoja. Funktio joukosta A joukkoon B on sääntö, joka liittää yksikäsitteisesti määrätyn
Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä
Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.
Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)
Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi
tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla
2.5. YDIN-HASKELL 19 tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla kirjaimilla. Jos Γ ja ovat tyyppilausekkeita, niin Γ on tyyppilauseke. Nuoli kirjoitetaan koneella
Käännös, linkitys ja lataus
Luento 10 (verkkoluento 10) Käännös, linkitys ja lataus Ohjelmasta prosessiin Käännösyksikkö Kääntämisen vaiheet Makrot, literaalit Staattinen ja dynaaminen linkitys Nimien sidonta Lausekielestä suoritukseen
IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit
IDL - proseduurit 25. huhtikuuta 2017 Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014
18. syyskuuta 2014 IDL - proseduurit Viimeksi käsiteltiin IDL:n interaktiivista käyttöä, mutta tämä on hyvin kömpelöä monimutkaisempia asioita tehtäessä. IDL:llä on mahdollista tehdä ns. proseduuri-tiedostoja,
7/20: Paketti kasassa ensimmäistä kertaa
Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007
TAMPEREEN TEKNILLINEN YLIOPISTO
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 11.08.2010 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ
2. Olio-ohjelmoinista lyhyesti 2.1
2. Olio-ohjelmoinista lyhyesti 2.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 2.2 Yleistä Olio-ohjelmointia käsitellään hyvin
815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 2 vastaukset Harjoituksen aiheena on BNF-merkinnän käyttö ja yhteys rekursiivisesti etenevään jäsentäjään. Tehtävä 1. Mitkä ilmaukset seuraava
Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä
Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU
Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double
tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi
tietueet eri tyyppisiä tietoja saman muuttujan arvoiksi ero taulukkoon taulukossa alkiot samantyyppisiä tietueessa alkiot voivat olla erityyppisiä tiedot kuitenkin yhteen kuuluvia ohjelmoinnin perusteet,
4. Olio-ohjelmoinista lyhyesti 4.1
4. Olio-ohjelmoinista lyhyesti 4.1 Sisällys Yleistä. Oliot ja luokat. Attribuutit. Olioiden esittely ja alustus. Rakentajat. Olion operaation kutsuminen. 4.2 Yleistä Olio-ohjelmointia käsitellään hyvin
Tietorakenteet ja algoritmit
Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin
Tietueet. Tietueiden määrittely
Tietueet Tietueiden määrittely Tietue on tietorakenne, joka kokoaa yhteen eri tyyppistä tietoa yhdeksi asiakokonaisuudeksi. Tähän kokonaisuuteen voidaan viitata yhteisellä nimellä. Auttaa ohjelmoijaa järjestelemään
TAMPEREEN TEKNILLINEN YLIOPISTO
TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja Tietokonetekniikan laitos TKT-3200 Tietokonetekniikka ASSEMBLER: QSORT 06.09.2005 Ryhmä 00 nimi1 email1 opnro1 nimi2 email2 opnro2 nimi3 email3 opnro3 1. TEHTÄVÄ
Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti
Luku 6 Dynaaminen ohjelmointi Dynaamisessa ohjelmoinnissa on ideana jakaa ongelman ratkaisu pienempiin osaongelmiin, jotka voidaan ratkaista toisistaan riippumattomasti. Jokaisen osaongelman ratkaisu tallennetaan
Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:
1. Luokan jäsenet Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat: class luokan_nimi tyypit: enum, struct, class, typedef
815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset
815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset Harjoituksen aiheena on funktionaalinen ohjelmointi Scheme- ja Haskell-kielillä. Voit suorittaa ohjelmat osoitteessa https://ideone.com/
TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli
TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2
Taulukot. Taulukon käsittely. Tämän osan sisältö. Esimerkki. Taulukon esittely ja luonti. Taulukon alustaminen. Taulukon koko
5 Taulukot Tämän osan sisältö Taulukon esittely ja luonti Taulukon alustaminen Taulukon koko Taulukon käsittely indeksointi peräkkäiskäsittely hajakäsittely harva taulukko Taulukon järjestäminen Kaksiulotteinen
Java-kielen perusteet
Java-kielen perusteet String-merkkijonoluokka 1 Ohjelmointikielten merkkijonot Merkkijonot ja niiden käsittely on välttämätöntä ohjelmoinnissa Valitettavasti ohjelmointikielten tekijät eivät tätä ole ottaneet
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä
Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä Matti Luukkainen 10.12.2009 Tässä esitetty esimerkki on mukaelma ja lyhennelmä Robert Martinin kirjasta Agile and Iterative Development löytyvästä
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, tietorakenteen muuttaminen (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 6. 11. 2012 Sisältö 1 Muuttujan arvon muuttaminen:
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3
15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet
Muistutus aikatauluista
Muistutus aikatauluista (Nämä eivät välttämättä koske avoimen yo:n opiskelijoita Erkki Kailan rinnakkaisella kurssilla) Luento 1: kotitehtävät sulkeutuvat 20.9 12:00, ennen tutoriaalia Tutoriaali 1 sulkeutuu
Groovy. Niko Jäntti Jesper Haapalinna Group 31
Groovy Niko Jäntti Jesper Haapalinna Group 31 Johdanto Groovy on Apachen kehittämä Javaan perustuva dynaaminen oliopohjainen ohjelmointikieli. Kielen kehitys alkoi vuonna 2003, versio 1.0 julkaistiin 2007
815338A Ohjelmointikielten periaatteet
815338A Ohjelmointikielten periaatteet 2015-2016 VIII Poikkeusten ja tapahtumien käsittely Sisältö 1. Poikkeusten käsittelyn käsitteitä ja suunnittelukriteerejä 2. Poikkeusten käsittely C++:ssa 3. Poikkeusten
Tietorakenteet ja algoritmit - syksy 2015 1
Tietorakenteet ja algoritmit - syksy 2015 1 Tietorakenteet ja algoritmit - syksy 2015 2 Tietorakenteet ja algoritmit Johdanto Ari Korhonen Tietorakenteet ja algoritmit - syksy 2015 1. JOHDANTO 1.1 Määritelmiä
Ohjelmoinnin perusteet Y Python
Ohjelmoinnin perusteet Y Python T-106.1208 16.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 16.2.2010 1 / 41 Kännykkäpalautetteen antajia kaivataan edelleen! Ilmoittaudu mukaan lähettämällä ilmainen tekstiviesti
Algoritmit 1. Luento 1 Ti Timo Männikkö
Algoritmit 1 Luento 1 Ti 10.1.2017 Timo Männikkö Luento 1 Algoritmi Algoritmin toteutus Ongelman ratkaiseminen Algoritmin tehokkuus Algoritmin suoritusaika Algoritmin analysointi Algoritmit 1 Kevät 2017
Ohjelmoinnin peruskurssien laaja oppimäärä
Ohjelmoinnin peruskurssien laaja oppimäärä Luento 2: SICP kohdat 22.2.3 Riku Saikkonen 2. 11. 2010 Sisältö 1 Linkitetyt listat 2 Listaoperaatioita 3 Listarakenteet 4 Gambit-C:n Scheme-debuggeri Linkitetyt
Sisällys. 15. Lohkot. Lohkot. Lohkot
Sisällys 15. Lohkot Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.1 15.2 Lohkot Aaltosulkeet
4. Luokan testaus ja käyttö olion kautta 4.1
4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään
Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä.
TIETOKONEOHJELMIEN RAKENNE Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä. Teollisuusautomaation ohjelmiin on lainattu runsaasti perinteisen
Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus
Sisällys 19. Olio-ohjelmointia Javalla Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit