Mitä funktionaalinen ohjelmointi on

Koko: px
Aloita esitys sivulta:

Download "Mitä funktionaalinen ohjelmointi on"

Transkriptio

1 Funktionaalinen ohjelmointi Mitä funktionaalinen ohjelmointi on - Funktionaalisessa ohjelmoinnissa mallinnus keskittyy löytämään ongelmasta sellaisia tiedon muunnoksia, jotka voidaan esittää matemaattisina funktioina annetuilta syöttötiedoilta haluttuihin tulostietoihin. - Funktio ottaa sisään informaatioita parametreissaan ja palauttaa informaatioita tuloksessaan. Tulos riippuu vain sisään tulleesta informaatiosta. - Perustuu matemaattiseen funktioteoriaan - Funktiokutsujen arvot riippuvat vain osalausekkeiden arvoista - Sivuvaikutuksia ei ole - Sijoituslausetta ei ole myöskään (paitsi epäpuhtaissa kielissä) - Funktiot ovat "ensimmäisen luokan kansalaisia"

2 - Funktio voi olla toisen funktion argumenttina, paluuarvona ja tietorakenteen alkiona - Voidaan rakentaa sellaisia funktioita, jotka käsittelevät ja palauttavat arvonaan muita funktioita - Vapaa suoritusjärjestys, laiska tai rinnakkainen evaluointi - Implisiittinen muistinhallinta - Ei sijoituslausetta, muuttuja ei voi muuttua - Ei voi tehdä for-silmukkaa, toteutus korvataan rekursiolla - Funktiota ei evaluoida ennen kuin sen parametrit on evaluoitu

3 Funktionaalisen ohjelmoinnin historia kaksi tietojenkäsittelytieteen matemaattisen pohjan muodostavaa laskennan mallia. - Turingin kone (tehtävä T voidaan suorittaa mekaanisesti) - Ohjelman suoritus etenee muuttamalla koneen tilaa käskyjen mukaan -> tietokoneen abstrakti malli - lambda-kalkyyli, jonka pohjalta kehitettiin Lisp-kieli (funktio f on sääntö, jota seuraamalla sen arvo selviää) - Arvon laskenta etenee sieventämällä lauseketta yksinkertaisemmaksi annetuilla säännöillä -> ohjelmointikielen abstrakti malli - Turingin koneet ja lambda-ohjelmat voidaan kääntää toisikseen

4 luvun lopussa ML- ja SML- ohjelmointikielet ((Standard) Meta Language), joihin mm. Haskell perustuu - Alettiin suunnitella tyypit päätteleviä kieliä - Kääntäjä huomaa minkä tyyppisiä tietoalkioita koodissa käsitellään - Ohjelmoijan ei tarvitse kirjoittaa ainakaan kaikkia tyyppejä koodiinsa, kääntäjä osaa konstruoida uusia tyyppejä vanhoja sopivasti yhdistelemällä - Suorituksen eteneminen, ei koskaan jouduta tilanteeseen, jota ei olisi kielen spesifikaatiossa - Tyyppien säilyttäminen, käännösaikana tietoalkioille päätellyt tyypit pysyvät samoina koko suorituksen ajan "No type casts".

5 Miksi funktionaalista ohjelmointia - Kannattaa tuntea erilaisia ohjelmointiparadigmoja, kun ohjelmoija kohtaa ohjelmointiongelmia osaa hän valita kuhunkin ongelmaan sopivimman lähestymistavan. - Funktionaalisessa ohjelmoinnissa painotetaan tiukkoja rajapintoja. Opitaan määrittelemään ohjelma täsmällisesti, soveltamaan rekursiota ja käyttämään generisyyttä. - Painottaa uudelleenkäyttöä - Yhteys matematiikkaan, ohjelma voidaan kirjoittaa vastaamaan määritelmä ja todistaa oikeaksi induktiolla - Kannustaa kokoamaan ohjelmat pienemmistä palasista. Parempi tuki funktioiden käsittelylle, ohjelma voidaan jakaa pienempiin ja yleiskäyttöisempiin ohjelmiin - Ei sivuvaikutuksia

6 Funktionaalisen ja proseduraalisen ohjelmoinnin eroja - Proseduraalisissa eli imperatiivisissa ohjelmointikielissä käskyt suoritetaan järjestyksessä alkaen ensimmäisestä käskystä päättyen viimeiseen. Suoritusjärjestystä voidaan ohjata valinta- ja toistorakenteilla. - Proseduraalisessa ohjelmoinnissa ohjelma pilkotaan aliohjelmiksi, jotka ratkaisevat jonkin yksinkertaisen ongelman. Aliohjelma voi kutsua toista aliohjelmaa. Suuret ohjelmat jaetaan moduuleihin, jotka voivat sisältää useita aliohjelmia. - Funktionaalisessa ohjelmoinnissa asiat esitetään asioiden välisinä relaatioina. Ohjelman rakenne koostuu toisiaan kutsuvista funktioista, jotka muistuttavat matematiikan funktioita, funktion arvo saadaan kun lauseketta sievennetään aina vain yksinkertaisemmaksi.

7 - Puhtaasti funktionaalisessa ohjelmassa kaikki tehdään funktioiden avulla, funktion argumentteihin kohdistetaan funktion toiminta, funktio ei voi muuttaa argumentin arvoa, vaan tuottaa uuden arvon tai funktion. - Funktionaalisella ohjelmalla ei ole tilaa, tämä tarkoittaa sitä, että funktiolla ei ole muuttujia, joita voitaisiin muuttaa sijoituslauseilla tai toistorakenteilla. Sijoituslauseita tai toistorakenteita ei tarvita. Tästä seuraa, että funktioilla ei ole sivuvaikutuksia. - Kaikki funktionaaliset ohjelmat eivät kuitenkaan ole puhtaasti funktionaalisia, useissa kielissä tuetaan muuttujien käyttöä ja sivuvaikutuksia. - Funktionaalinen kieli on laiska, jos funktion argumentit lasketaan vasta sitten kun niitä tarvitaan. Täten vältetään turhaa laskentaa ja tehokkuus paranee. Voidaan käyttää äärettömiä tietorakenteita, jossa ohjelma käy läpi vain äärellisen määrän alkioita. Tietorakenteet kuvataan taulukoiden tai listojen avulla, listat ja taulukot voivat sisältää alkioinaan listoja tai taulukoita.

8 Funktionaalisen ohjelmoinnin hyödyt ja haitat - Funktionaaliset ohjelmat käyttäytyvät aina samalla tavalla, ei yllättäviä sivuvaikutuksia ohjelman suorituksen aikana. Funktioita helppo käyttää uudelleen sivuvaikutusten puuttuessa. Ohjelmia helppo laajentaa, koska osat eivät vaikuta toisiinsa. Funktioiden testaaminen on helppoa, koska funktio käyttäytyy samoilla argumenteilla aina samalla tavalla. - Korkea abstraktiotaso, tarvitaan vähemmän koodia, josta seuraa, että ohjelmat sisältävät vähemmän virheitä. Kirjoitustyyli on lähellä ongelman määrittelyä. - Funktionaalisissa kielissä on automaattinen roskienkeruu, eli muistin varaaminen ja vapauttaminen tehdään automaattisesti.

9 - Rinnakkaisessa ohjelmoinnissa ohjelmien kehittäminen on helpompaa, tiedon eheys säilyy, koska ei ole vaaraa, että funktiot lukitsisivat yhteisiä muuttujia tai kirjoittaisivat samaan muuttujaan yhtä aikaa. - Funktionaaliset ohjelmat sopivat hyvin matemaattisten ongelmien ratkaisemiseen, annettuun syötteeseen kohdistetaan jokin muunnos, joka voi olla monivaiheinen ja lopuksi ilmoitetaan muunnoksen tuottama tulos. - Funktionaalinen ohjelmointi sopii sellaiseen tilanteeseen, jossa muunnettavalla informaatiolla on lista- tai puurakenne, esimerkiksi xml-dokumenttien käsittely. - Ohjelmointikielen kääntäminen, jossa mm. selausvaiheessa luetaan lähdetiedostoa ja muunnetaan tiedot alkiojonoksi, jäsennysvaiheessa muunnetaan alkiojono vastaavaksi kieliopin mukaiseksi jäsennyspuuksi,..., lopuksi koodin generointivaiheessa käydään läpi jäsennyspuu ja tulostetaan sitä vastaava konekielinen koodi tulostiedostoon.

10 - Imperatiivisesta ohjelmoinnista funktionaaliseen ohjelmointiin siirtyminen saattaa olla vaikeaa, koska ajatusmaailmat poikkeavat toisistaan, ei ole muuttujia eikä toistorakenteita. - Syöttö ja tulostusoperaatioiden hoitaminen, joudutaan rikkomaan sivuvaikutuksettomuutta. Yleensä sivuvaikutuksia sisältävät osiot erotetaan tarkasti puhtaasti funktionaalisista osista. Haskelll -kielen monadi, joka on abstrakti tietotyyppi, joka kuvaa ohjelman suoritusta annetussa kontekstissa. ( - Huonosti toteutettu funktionaalinen ohjelma voi olla hidas ja muistia haaskaava. - Funktionaalinen ohjelmointi ei sovellu kovin hyvin tilanteisiin, joissa tarvitaan jokin vaikutus, esim. ikkunakäyttöliittymä joissa keskeisenä on jokin tila, jota luetaan ja päivitetään monessa kohtaa ohjelmaa - tila toimii informaationvälityskanavana ohjelman osien välillä, esim. jonkin tietokannan ympärille rakennettu ohjelma joissa seurataan suoritusajan ja muistin kulutusta, esim. laiteläheinen ohjelmointi

11 - Haasteena on suunnitella sellaiset rajapinnat, joilla ohjelma voidaan jakaa funktionaaliseen ja ei-funktionaaliseen osaan ja miten osien kommunikointi hoidetaan. (C-ohjelmiin voi liittää Haskel-koodia, Java-kielen funktionaaliset ominaisuudet). Haskell-kieli - Julkaistu Nimetty Haskell Brooks Curryn mukaan

12 Ominaisuudet - Täysin funktionaalinen kieli, suoritus on sievennystä, "tila"-käsitettä ei ole - Käännettävä kieli, käännösaikainen tyypitys, tyyppipäättely - Laiska laskenta, mitään ei tehdä ennen kuin tulosta tarvitaan, lausekkeet evaluoidaan vasta tarvittaessa. - parametreja sievennetään vain sen verran, että nähdään soveltuuko tämä sääntö - sievennyksen tulokset muistetaan, jotta sievennystä ei tarvitse tehdä uudelleen - "Arvojen" voidaan kuvitella olevan parametrittomia funktioita, jota tarvittaessa suoritetaan. - Muuttuja sisältää aina viitteen funktioon, joka laskee muuttujan arvon. - Laiska laskenta mahdollistaa äärettömät tietorakenteet, esim. lista voidaan määritellä [1..] - Ei ole sijoituslausetta, nimentö (nimi on lyhennysmerkintä arvolle): nimi = arvo

13 Tietotyypit - Vahva tyypitys ja staattinen tyypitys, funktioilla ja lausekkeilla on tyyppi. - Tyyppi tiedetään jo käännösaikana, tyypinmuunnokset tehtävä eksplisiittisesti, ei automaattista tyypinmuunnosta. - Tyyppien automaattinen päättely. - Haskell -kielessä ei aina tarvitse määritellä funktion tai ilmaisun (lausekkeen) tyyppiä. - Kieleen on rakennettu mekanismi, jonka avulla voidaan automaattisesti päätellä funktion tyyppi (signature) (joka ei kuitenkaan aina toimi oikein).

14 - Jos on määritelty funktio, ghci osaa päätellä (ainakin useimmiten) funktion tyypin esimerkiksi: isdigit a = elem a ['0'..'9'] *Main> :t isdigit isdigit :: Char -> Bool *Main> :t head head :: [a] -> a *Main> :t (++) (++) :: [a] -> [a] -> [a] - a on tyyppimuuttuja (type variable), joka voidaan korvata millä tahansa tyypillä - Funktion tyypit oikealta, ensimmäinen on palautuksen tyyppi ja loput ovat argumenttien tyyppejä.

15 Perustietoyypit - Int on prosessorikohtainen ja Integer voi käsitellä mielivaltaisen mittaisia kokonaislukuarvoja - Float ja Double ovat liukuluja joiden koko on normaalitarkkuus ja kaksoistarkkuus - Huomaa, String ja [char] ovat identtisiä

16 Tyyppiluokat (typeclasses) *Main> :t summa summa :: Num a => a -> a -> a - Num on typpiluokka ja a on jokin tietotyyppi, 'Num a =>' on tyyppirajoite (class constraint), joka ilmaisee että tyyppi a on Num -tyyppiluokan jäsen. - Num -tyyppiluokkaan kuuluva tyyppi implementoi tyyppiluokassa määritellyn käyttäytymisen, tyyppiluokka on suunnilleen sama kuin Java-kielen interface. - Eq -luokan jäsenet toteuttavat operaatiot == ja /= - Ord -luokan jäsenet, jotka ovat myös Eq -luokan jäseniä, toteuttavat operaatiot >, >=, < ja <= - Show ja Read - esittävät arvot Stringeinä ja palauttavat arvot Stringeistä - Enum, luokan jäsenet on järjestetty perättäisesti, arvot voidaan luetella

17 - Num, tyypit joiden jäsenet käyttäytyvät kuten luvut - Integral, Floating, Num - ovat tyyppejä, joilla on integer- ja floating- arvot.

18 Tyyppien määrittelyt - Funktion tyyppi voidaan määritellä eksplisiittisesti ennen funktion esittelyä summa3 a b c = a + b + c *Main> summa summa3i :: Int -> Int -> Int -> Int summa3i a b c = a + b + c *Main> summa3i <interactive>:9:9: No instance for (Fractional Int) arising from the literal 4.3 In the first argument of summa3i, namely 4.3 In the expression: summa3i In an equation for it : it = summa3i Arvon tyyppi voidaan ilmaista

19 *Main> 5::Float 5.0 Joissakin tilanteissa tyyppi on pakko ilmaista *Main> read "2" Mutta *Main> read "2" *Main> read "2" *** Exception: Prelude.read: no parse Ei toimi *Main> read "2"::Int 2

20 Sivuvaikutukset Perus I/O - Tulostaminen yms. IO on sivuvaikutus ja vaatii tarkan suoritusjärjestyksen, tämä on ristiriidassa funktionaalisuuden kanssa. Haskell-kielessä ongelma on ratkaistu ns. Monadeilla - Monadin perusidea on: syötettä voi lukea ja tulostaa vain tietyssä osassa ohjelmaa. IO:ta tekeville funktioille oma "kategoria", IO-funktiot ketjutetaan näkymättömällä parametrilla: pakko suorittaa peräkkäin. - Jokainen IO -funktio palauttaa arvon. getchar : : IO Char - IO Char ilmaisee: kun getchar käynnistetään se suorittaa toiminnan, joka palauttaa merkin. - Toiminnot, jotka palauttavat ei kiinnostavia arvoja, käyttävät tyyppiä ( ).

21 - Esimerkiksi putchar -funktio: putchar :: Char -> IO ( ) - Funktio ottaa parametrina merkin ja ei palauta mitään hyödyllistä, vastaa esimerkiksi c- kielen void -tyyppiä. - Toiminnot on jaksotettu käyttämällä >>= -operaattoria, joskin tätä operaattoria ei käytetä suoraan, vaan käytetään "syntaktista sokeria" do -notaatiota piilottamaan em. operaattorin käyttö. - Avainsana do esittelee jonon ilmaisuja, jotka suoritetaan peräkkäisessä järjestyksessä. Ilmaisu voi olla toiminto tai hahmo, joka on sidottu <- operaattoria käyttävän toiminnan tulokseen. Tai joukkoon let:iä käyttäviä paikallisia määrittelyjä. - do -notaatiossa voidaan käyttää layouttia samalla tavalla kuin let tai where, joten sulut ja puolipisteet voidaan korvata sisennyksellä. do -notaatio "liimaa" useita I/O -toimintoja yhteen. main :: IO () main = do c <- getchar putchar c

22 - nimen main käyttö on tärkeä: main on main-ohjelman aloituskohta, kuten vaikka c-kielen main. main -tyypin tulee olla IO ( ). Nimeä main käytetään erityistarkoituksessa vain modulissa Main. - Ohjelma suorittaa kaksi toimintoa peräkkäisesti, ensin se lukee yhden merkin sitoen sen 'muuttujaan' c ja sitten tulostaa merkin. Toisin kuin let -määrittelyllä esitellyt muuttujat, jotka ovat näkyvät kaikille, on <- määrittelyllä määritelty muuttuja näkyvissä vain seuraavissa lausekkeissa. - Esim. halutaan lukea merkki ja tutkia onko luettu merkki 'y' ready :: IO Bool ready = do c <- getchar c == 'y' - c <- getchar voidaan tulkita: suorita I/O -toiminto getchar ja sido sen tulos nimeen c,

23 - Yllä esitetty ei toimi, koska c == 'y' on pelkkä boolen arvo, ei tapahtuma. Boolen arvolle on rakennettava toiminto, joka palauttaa boolen arvon tuloksena, funktio return tekee sen. return -funktion tyyppi on: return :: a -> IO a - return -funktio toteuttaa joukon perättäisiä alkeistoimintoja. Sen toiminta ei ole sama kuin imperatiivissa kielissä. Korjattu versio: ready :: IO Bool ready = do c <- getchar return (c == 'y')

24 - Seuraavassa monimutkaisempi I/O-funktio (käyttää rekursiota): getline :: IO String getline = do c <- getchar if c == '\n' then return "" else do l <- getline return (c:l) - else haaran do esittelee yksittäisen lausekejonon, if -rakenteen takia on käytettävä uutta donotaatiota aloittamaan uutta toimintajonoa, jotta voitaan tehdä uusi IO -toiminto. ( - return -funktio sallii tavanomaisten arvojen, kuten boolen arvojen, siirtämisen IO - toiminnolle. - Mutta esimerkisi funkio: f : : Int -> Int -> Int ei voi suorittaa mitään IO-toimintoja, koska IO ei ole paluutyypin arvona. Tämä tarkoittaa että ohjelmia ei voi kovin helposti debugata laittamalla sekaan tulostusoperaatioita.

25 - Onko seuraava toiminto validi? nimitag = "Terve, nimeni on " ++ getline - Ei, koska ++ operaattori odottaa, että molempien parametrien tulee olla samaa tyyppiä olevia listoja. "Terve, nimeni on " on tyyppiä String ( [Char] ) ja getline on tyyppiä IO String, merkkijonoa ja I/O -toimintoa ei voi yhdistää. Merkkijono on saatava ulos I/O -operaatiosta, tämä hoituu <- getline - toiminolla. - do -lohkon viimeistä toimintoa ei voi liittää nimeen, esim main = do foo <- putstrln "Hei kerro nimesi > " -- Ok nimi <- getline faa <- putstrlln ("Terve " ++ nimi ++ ", olet fiksu tyyppi!") -- Ei toimi - do -lohko automaattisesti poimii viimeisen toimen arvon ja liittää sen tulokseensa.

26 - I/O -toimintoja voidaan suorittaa vain silloin, kun ne ovat nimetty main:issa tai toimet ovat jonkin suuremman I/O -toiminnan sisällä, joka on koottu käyttäen do -lohkoa. - do -lohkoa voidaan käyttää liimaamaan yhteen I/O -toimintoja ja sitten näitä voi käyttää toisessa do -lohkossa jne. Joka tapauksessa näitä voidaan suorittaa vai jos ne ovat main:issa.

27 Rekursio Toisto ilmaistaan rekursiolla Määritellään funktio viittaamalla määriteltävään funktioon listasumma [] = 0 listasumma (x:xs) = x + listasumma xs *Main> listasumma [] 0 *Main> listasumma [1,2,3,4,5,6] 21 - Listan elementtien summa on 0, jos lista on tyhjä - 1. elementti plus listan loppuosan elementtien summa

28 Rekursiivisen funktion määritteleminen - Etsi reunaehto, esimerkiksi lista on tyhjä, nolla tai 1 yksi... - Kehitä yleisen tapauksen kaava, kaavan oikean puolen täytyy kuvata yksinkertaisempaa ongelmaa kuin vasemman puolen. - Rekursioyhtälö annetaan yleensä kaksiosaisena: toinen osa määrittelee funktion arvon jollain tunnetulla alkuarvolla (alkuarvoja voi olla myös useita) ja toinen osa muulloin. Esimerkki, Quicksort -algoritmi srt [] = [] srt (x:xs) = srt [y y <- xs, y < x] ++ [x] ++ srt [y y <- xs, y >= x] *Main> srt [1,5,3,6,7,9,0] [1,0]3[5,6,7,9] 0[1]3[5]6[7,9] [9]

29 [0,1,3,5,6,7,9]

30 Tietorakenteet 1. Lista - Listat ja niiden käsittely on olennainen osa funktionaalista ohjelmointitapaa. Listojen käsittelyyn ja muodostamiseen on uhrattu paljon huomiota, jotta niiden käsittely olisi helppoa ja vaivatonta. [1,2,3] [1..3] -- [1,2,3] [1, 3..10] -- [1, 3, 5, 7, 9] - Merkkijonot: ['T','e','r','v',e'] ---> "Terve" - Lisäys alkuun: 0:[1,2,3] ---> [0,1,2,3] - Yhdistely: [0,1] ++ [2,3,4] ---> [0,1,2,3,4] - : "Terve" ++ " Ilkka" ---> "Terve Ilkka" - Laiskuus: lista = kaksi funktiota, toinen laskee listan 1. alkion, toinen loppulistan

31 - Listakehitelmät (list comprehensions), voidaan määritellä listoja [ runko määreet ] [ n * n n <- [1..20] ] [1,4,9,16,25,36,49,64,81,100,121,144,169,196,225, 256,289,324,361,400] - Äärettömät listat, laiska evaluointi mahdollistaa päättymättömät listarakenteet, koska arvoja evaluoidaan vasta sitten, kun arvoja tarvitaan. parilliset = [2, 4..] parineliot = [ n * n n <- parilliset ] member parineliot 64 -> True

32 2. Tupla - Tupla on kiinteän kokoinen arvojen joukko, jossa kukin arvo voi olla eri tyyppiä, toisin kuin lista. Lista voi minkä mittainen tahansa, mutta sen kaikkien elementtien on oltava samaa tyyppiä. (2016, "Ohjelmiston rakentaminen") - Tuplan erikoistapaus on ( ), joka sisältää nolla elementtiä. Tällä tyypillä on vain yksi arvo, joka kirjoitetaan myös ( ), on suunnilleen sama kuin c-kielen void.

33 Funktiot Funktion määrittely: plus x y = x + y Funktion kutsuminen plus (plus 3 4) 5 Funktion paloittainen määrittely kertoma 0 = 1 kertoma n = n * kertoma (n-1) Parametrien sovitus: tulo [ ] =1 tulo (eka:loput) = eka * tulo loput kertoma2 n = tulo [1..n]

34 - Laiskuuden vaikutuksia: päättymätön laskenta saattaa paljastaa laiskuuden (estää rinnakkaista laskentaa) Rekursiivinen muuttujan määrittely luvut = 0:[a+1 a <- luvut] 0:0+1 fibo = 1:1:[a+b (a,b) <- zip fibo (tail fibo)] - - zip yhdistää kahden listan elementit pareiksi, tail palauttaa listan lopun 1:1:1+1 1:1:2:1+2 1:1:2:3:2+3 1:1:2:3:5:3+5 1:1:2:3:5:8:5+8 1:1:2:3:5:8:13:

35 Joitakin funktioita - map-funktio: listafunktio, funktiota sovelletaan listan alkioihin - fold-funktio: listafunktio, funktiota sovelletaan listan alkioihin, tulos on kumulatiivinen - konstruktio: funktiolista, funktiolistan jokaista funktiota sovelletaan parametriin - closure: funktion ja sen käytössä olevien muuttujien yhdistelmä - currying: funktioiden variointi siten, että parametrien määrä pienenee Map - map-funktio saa argumentteina funktion ja listan, ja se käyttää argumenttina saamaansa funktiota jokaiseen listan alkioon. map -funktion palauttama arvo on lista argumenttina saadun funktion tuottamista arvoista. map -funktio on toteutettu seuraavanlaisesti: map _ [ ] = [ ] map f (x:xs) = f x : map f xs - Funktiossa käytetään hahmonsovitusta lista-argumenttiin, jos map -funktion kutsussa toisena argumenttina on tyhjä lista, palauttaa funktio tyhjän listan. _ merkintää käytetään kun argumenttia ei tarvita

36 - Jos toisena argumenttina on ainakin yhden alkion sisältävä lista suoritetaan määritelmän toinen rivi ja palautetaan uusi lista jonka ensimmäinen alkio on arvo, jonka funktio f palauttaa argumentilla x. Listan loppuosa on lista, jonka map-funktio palauttaa, kun sitä kutsutaan ensimmäisenä argumenttina funktio f ja toisena argumenttina alkuperäisen listan loppuosa xs. Anonyymi funktio määritellään kirjoittamalla \ funktion eteen.

37 Prelude> map (\x -> x^2) [1..20] [1,4,9,16,25,36,49,64,81,100,121,144,169,196,225, 256,289,324,361,400] lisaayksi (xs) = map (\x->x+1) xs *Main> lisaayksi [1,2,3,4] [2,3,4,5] Prelude> import Data.Char Prelude Data.Char> map toupper "Hei maailma!" "HEI MAAILMA!"

38 foldr, foldl - fold -operaatioita voidaan käyttää toteuttamaan funktioita, joita käytetään listojen läpikäyntiin elementti elementillä, ja funktio palauttaa jotakin edelliselle perustuen - foldl(h, a, l) lista l käydään läpi alusta loppuun, "laskurille" a annetaan alkuarvo, jokaisen alkion z kohdalla päivitetään sen seuraavaksi arvoksi h(a, z) ja lopuksi palautetaan kertynyt lopullinen arvo summa xs = foldl (\acc x -> acc + x) 0 xs summa [3,5,1] 9 -Akkuun acc menee alkuarvoksi 0, funktiota \acc x -> acc + x sovelletaan listan 1. alkioon lukuun 3 (jota x esittää) ja acc saa arvon 0+3. Seuraavaksi x:n arvoksi tulee listan 2. alkio luku 5 ja acc saa arvon jne. -Funktio: summa foldl (+) 0 tekee saman, koska (+) on sama kuin \acc x -> acc + x

39 - foldr esimerkki: map' :: (a -> b) -> [a] -> [b] map' f xs = foldr (\x acc -> f x : acc) [] xs map' (+3) [2,4,6] [5,7,9] - Otetaan viimeisin elementti 6 ja sovelletaan siihen funktiota (+3) saadaan tulos 9, joka liitetään akkuun acc, jonka alkuarvo oli [ ] (tyhjä lista) 9:[ ] -> [9], joka akun uusi arvo, seuraavaksi sovelletaan funktiota (+3) arvoon 4 ja saadaan arvo 7, joka liitetään akkuun 7: [9] -> [7, 9] ja lopuksi sovelletaan funktiota (+3) arvoon 2 ja saadaan arvo 5, joka liitetään akkuun 5:[7, 9] -> [5, 7, 9], joka on lopputulos.

40 Korkeamman asteen funktiot - Kutsutaan myös funktionaalisiksi muodoiksi - Voivat ottaa parametreikseen funktioita - Myös paluuarvo voi olla funktio

41 Funktioiden yhdistäminen f(x) = x2 ja g(x) = 2x +1 h(x) = f o g(x) = f (g(x)) = f(2x + 1) = (2x+1) 2 = 4x 2 + 4x +1

42 Konstruktio - Sovelletaan funktiolistan jokaista funktiota yhteen argumenttiin, jolloin saadaan arvojen lista, jossa on yhtä monta alkiota kuin listassa oli funktioita. f(x) = 3x-1 ja g(x) = x2 + 2 (f,g) [3] tuottaa listan [8, 83] - Sovella kaikkiin, jossa samaa funktiota sovelletaan kaikkiin listan alkioihin - Merkitään symbolilla α f(x) = x/3,jolloin α(f, [1,2,3]) saadaan tulokseksi [1/3, 2/3, 1]

43 Polymorfismi - Funktiolla last poimitaan listan viimeisin alkio last [1,2,3,4,5] 5 last "Ilkka" 'a' last ["ilkka", "tapio", "rasanen"] "rasanen" last (last ["ilkka", "tapio", "rasanen"]) 'n'

44 - last toimii samalla tavalla oli listan alkioiden tyyppi mikä tahansa. :type last last :: [a] -> a - a on tyyppimuuttuja, joka on jokin tyyppi. Eli voidaan lukea, että last ottaa vastaan listan, jonka kaikki alkiot ovat jotain tyyppiä a ja palauttaa arvon, joka on samaa tyyppiä a. - Kun funktiolla on tyyppimuuttujia allekirjoituksessaan (signature), ilmaisten, että jotkut sen argumenteista voi olla mitä hyvänsä tyyppiä, kutsutaan funktiota polymorfiseksi. Tätä kutsutaan myös parametriseksi polymorfismiksi. - Koodi ei välitä mikä todellinen typpi tulee olemaan, ei edes ole mitään mekanismia jolla voitaisiin selvittää mikä todellinen tyyppi on. Tyyppi on suunnilleen sama kuin Javan generics tyyppi.

45 Closure (sulkeuma) 1 - Sulkeuma on tietorakenne, joka tallettaa funktion ja sen ympäristön. Käyttää vapaita muuttujia määrittelyssään. mkadder :: Int -> (Int -> Int) mkadder y = \x -> x + y - Funktio ottaa Int -tyyppisen argumentin ja palauttaa funktion: (Int -> Int). Palautettava funktio \x -> x + y sisältää muuttujan y, joka viittaa omaan ympäristöönsä. Kun mkadder -funktiota kutsutaan vaikka arvolla, palautuu sulkeuma, joka sisältää funktion \x -> x + y yhdessä ympäristönsä kanssa. mkadder let mul v = (\d -> map (* v) d) mul 2 [3, 2, 8, -2] [6,4,16,-4] 1 Sulkeuma on funktion ja sen käyttämien (ei-paikallisten) muuttujien viitetaulun yhdistelmä (wikipedia)

46 Currying mul 5 [1, -1, 0, 2, 3] [5,-5,0,10,15] Kaikilla funktioilla on todellisuudessa vain yksi parametri: Currying muuttaa usean parametrin funktion yhden parametrin funktioksi, joka palauttaa yhden parametrin funktion, joka palauttaa yhden parametrin funktion,, kunnes palautetaan tulos. Currying on automatiikkaa Haskel-kielessä summa x y = x + y :t summa -> summa :: Num a => a -> a -> a - Summa ottaa parametrin x ja palauttaa toisen funktion, joka ottaa parametrin y ja laskee lopputuloksen - Arvot voidaan kuvitella parametrittomiksi funktioiksi - Mahdollistaa, että vain osan parametreista annetaan summa x y = x + y

47 summa3 = summa 3 :t summa3 -> summa3 :: Integer -> Integer summa3 8 -> 11 map summa3 [2,4,6] -> [5,7,9] f n = (\m -> n - m) g = f 10 g 8 -> 2 g 4 -> 6 Pattern matching (hahmontunnistus) Funktiot voidaan määritellä hahmontunnistuksella kertoma 0 = 1 kertoma n = n * kertoma (n-1) *Main> kertoma 0 1 *Main> kertoma 1

48 1 *Main> kertoma 5 120

49 Hahmontunnistus toimii myös listoilla listanpituus [ ] = 0 listanpituus (_:xs) = 1 + listanpituus xs Alaviiva _ tarkoittaa, että ei tarvitse välittää tästä *Main> listanpituus [] 0 *Main> listanpituus ['a','c','d','d'] 4

50 Vartijat (guards) ja where bmi :: (RealFloat a) => a -> a -> String bmi paino pituus bmi <= laihis = "alipaino" bmi <= normaali = "normaali" bmi <= lihis = "ylipaino" otherwise = "vakava ylipaino" where bmi = paino / pituus ^ 2 laihis = 18.5 normaali = 25.0 lihis = merkillä alkavat rivit kuvaavat ehtoja ja = -merkin oikealla puolella ovat vertailun tulokset. Ehtoja evaluoidaan ylhäältä alaspäin ja otherwise hoitaa muuta tapaukset, kuten c-kielessä default. where - osiossa esitettyjä nimiä voidaan käyttää vain funktion sisällä, ne eivät näy muualle. Huomaa, että sisennyksellä on merkitystä!

51 Lähteet: 1. Häkkinen Tuomo 2. Heinonen Matti

Mitä funktionaalinen ohjelmointi on

Mitä funktionaalinen ohjelmointi on Funktionaalinen ohjelmointi Mitä funktionaalinen ohjelmointi on - Funktionaalisessa ohjelmoinnissa mallinnus keskittyy löytämään ongelmasta sellaisia tiedon muunnoksia, jotka voidaan esittää matemaattisina

Lisätiedot

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

Tyyppejä ja vähän muutakin. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tyyppejä ja vähän muutakin TIEA341 Funktio ohjelmointi 1 Syksy 2005 Viime luennolla... Haskellin alkeita pääasiassa Hello World!... ja muita tutunoloisia ohjelmia Haskellilla Haskellin voima on kuitenkin

Lisätiedot

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

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

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015. Harjoitus 7 Vastaukset

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/

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 6 Vastaukset

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/

Lisätiedot

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Algebralliset tietotyypit ym. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Tällä luennolla Algebralliset tietotyypit Hahmonsovitus (pattern matching) Primitiivirekursio Esimerkkinä binäärinen hakupuu Muistattehan...

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 4 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 17. tammikuuta 2008 Modulin viimeistelyä module Shape ( Shape ( Rectangle, E l l i p

Lisätiedot

815338A Ohjelmointikielten periaatteet

815338A Ohjelmointikielten periaatteet 815338A Ohjelmointikielten periaatteet 2015-2016 VI Funktionaalinen ohjelmointi Sisältö 1. Johdanto ja peruskäsitteitä 2. LISP- ja Scheme-kielet 3. Haskell 4. IO funktionaalisissa kielissä 5. Muita funktionaalisia

Lisätiedot

Haskell ohjelmointikielen tyyppijärjestelmä

Haskell ohjelmointikielen tyyppijärjestelmä Haskell ohjelmointikielen tyyppijärjestelmä Sakari Jokinen Helsinki 19. huhtikuuta 2004 Ohjelmointikielten perusteet - seminaarityö HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 1 Johdanto 1 Tyyppien

Lisätiedot

5.5 Jäsenninkombinaattoreista

5.5 Jäsenninkombinaattoreista 5.5. JÄSENNINKOMBINAATTOREISTA 67 type Env α = FiniteMap String α data EnvT m α = MkE (Env Integer m (Env Integer, α)) instance Transformer EnvT where promote mp = MkE $ λenv mp λr return $(env, r) instance

Lisätiedot

Luku 3. Listankäsittelyä. 3.1 Listat

Luku 3. Listankäsittelyä. 3.1 Listat Luku 3 Listankäsittelyä Funktio-ohjelmoinnin tärkein yksittäinen tietorakenne on lista. Listankäsittely on paitsi käytännöllisesti oleellinen aihe, se myös valaisee funktio-ohjelmoinnin ideaa. 3.1 Listat

Lisätiedot

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006

Jatkeet. TIES341 Funktio ohjelmointi 2 Kevät 2006 Jatkeet TIES341 Funktio ohjelmointi 2 Kevät 2006 Havainto: häntäkutsu (1) Funktiokutsun yleinen toimintaperiaate: (koskee vain täysiä kutsuja, ts. jotka eivät palauta funktiota) kutsuja kirjaa pinoon paluuosoitteen

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

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ä.

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 9 Kombinaattoreista Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Currying Haskell-funktio ottaa aina vain yhden

Lisätiedot

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan.

Tämän vuoksi kannattaa ottaa käytännöksi aina kirjoittaa uuden funktion tyyppi näkyviin, ennen kuin alkaa sen määritemää kirjoittamaan. 3.1. LISTAT 35 destaan pisteittäisesti: init :: [α] [α] init (x : []) = [] init (x : xs) = x : init xs Varuskirjastoon kuuluu myös funktiot take ja drop, jotka ottavat tai tiputtavat pois, funktiosta riippuen,

Lisätiedot

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005

Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005 Esimerkki: Laskin (alkua) TIEA341 Funktio ohjelmointi 1 Syksy 2005 Esimerkki: Laskin Liukulukulaskentaa Yhteen, vähennys, kerto ja jakolaskut Syötteenä laskutehtävä, tulosteena tulos tai virheilmoitus

Lisätiedot

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006

Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet. TIES341 Funktio-ohjelmointi 2 Kevät 2006 Tyyppiluokat II konstruktoriluokat, funktionaaliset riippuvuudet TIES341 Funktio-ohjelmointi 2 Kevät 2006 Alkuperäislähteitä Philip Wadler & Stephen Blott: How to make ad-hoc polymorphism less ad-hoc,

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

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

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

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

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA34 Funktio-ohjelmointi, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 2. tammikuuta 2008 Ydin-Haskell: Syntaksi Lausekkeita (e) ovat: nimettömät funktiot: \x

Lisätiedot

Tutoriaaliläsnäoloista

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

Lisätiedot

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa

Laajennetaan vielä Ydin-Haskellia ymmärtämään vakiomäärittelyt. Määrittely on muotoa 2.6. TIETOKONE LASKIMENA 23 Edellä esitetty Ydin-Haskell on hyvin lähellä sitä kieltä, jota GHCi (Glasgow Haskell Compiler, Interactive) sekä muut Haskell-järjestelmät suostuvat ymmärtämään. Esimerkiksi:

Lisätiedot

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

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

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

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

Lisätiedot

1. Omat operaatiot 1.1

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

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 3 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 14. tammikuuta 2008 Viittausten läpinäkyvyyden 1 periaatteet 1. Lausekkeen arvo ei riipu

Lisätiedot

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

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

Lisätiedot

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006

Funktionimien kuormitus. TIES341 Funktio ohjelmointi 2 Kevät 2006 Funktionimien kuormitus TIES341 Funktio ohjelmointi 2 Kevät 2006 Kertausta ongelma Mikä on (+) operaattorin tyyppi? Num a => a -> a -> a Mikä on (==) operaattorin tyyppi? Eq a => a -> a -> a Mikä on show

Lisätiedot

ELM GROUP 04. Teemu Laakso Henrik Talarmo

ELM GROUP 04. Teemu Laakso Henrik Talarmo ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 7: Funktionaalista ohjelmointia (mm. SICP 3.5) Riku Saikkonen 13. 11. 2012 Sisältö 1 Laiskaa laskentaa: delay ja force 2 Funktionaalinen I/O 3 Funktionaalista

Lisätiedot

Ohjelmoinnin perusteet Y Python

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

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 11 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Listakomprehensio Uusi tapa luoda (ja muokata) listoja: [ lauseke

Lisätiedot

811120P Diskreetit rakenteet

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

Lisätiedot

Luku 5. Monadit. 5.1 Siirrännän ongelma

Luku 5. Monadit. 5.1 Siirrännän ongelma Luku 5 Monadit There are lots of books about functional programming in Haskell. They tend to concentrate on the beautiful core of functional programming: higher order functions, algebraic data types, polymorphic

Lisätiedot

Java kahdessa tunnissa. Jyry Suvilehto

Java kahdessa tunnissa. Jyry Suvilehto Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 5: Sijoituslause, SICP-oliot, todistamisesta (mm. SICP 33.1.3, 3.33.3.2) Riku Saikkonen 7. 11. 2011 Sisältö 1 Muuttujan arvon muuttaminen: set! 2 SICP-oliot

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 10 Todistamisesta Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Samuuden todistaminen usein onnistuu ihan laskemalla

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2018-2019 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 6: Funktionaalista ohjelmointia: todistamisesta, virrat ja I/O, hahmonsovitus (mm. SICP 3.5) Riku Saikkonen 8. 11. 2011 Sisältö 1 Vähän funktionaalisten

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 4: Symbolit, derivojaesimerkki, kierroksen 1 ratkaisut (mm. SICP 2.32.3.2) Riku Saikkonen 1. 11. 2011 Sisältö 1 Symbolit ja sulkulausekkeet 2 Lisää Schemestä:

Lisätiedot

Tietueet. Tietueiden määrittely

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

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

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

Lisätiedot

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

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin. 2. Ohjausrakenteet Ohjausrakenteiden avulla ohjataan ohjelman suoritusta. peräkkäisyys valinta toisto Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 20.1.2010 T-106.1208 Ohjelmoinnin perusteet Y 20.1.2010 1 / 40 Arvon pyytäminen käyttäjältä Käyttäjän antaman arvon voi lukea raw_input-käskyllä. Käskyn sulkujen

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

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:

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 1. Algoritmeista 1.1 Algoritmin käsite Algoritmi keskeinen laskennassa Määrittelee prosessin, joka suorittaa annetun tehtävän Esimerkiksi Nimien järjestäminen aakkosjärjestykseen

Lisätiedot

Algoritmit 1. Luento 1 Ti Timo Männikkö

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

Lisätiedot

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet

Koka. Ryhmä 11. Juuso Tapaninen, Akseli Karvinen. 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet Koka Ryhmä 11 Juuso Tapaninen, Akseli Karvinen 1. Taustoja 2. Kielen filosofia ja paradigmat 3. Kielen syntaksia ja vertailua JavaScriptiin Lähteet 1 1. Taustoja Koka on Daan Leijenin ja Microsoft:n kehittämä

Lisätiedot

Mathematica Sekalaista asiaa

Mathematica Sekalaista asiaa Mathematica Sekalaista asiaa Asetusoperaattorit Mathematicassa voi käyttää omia muuttujasymboleja melko rajattomasti ja niiden nimeämisessä voi käyttää miltei mitä tahansa merkkejä. Käytännössä nimeämisessä

Lisätiedot

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

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

Lisätiedot

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4) 2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi

Lisätiedot

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

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

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 5 Ympärysmitta. Puut. Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 CASE: YMPÄRYSMITTA Lasketaan kuvioiden ympärysmittoja

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 6: Rajoite-esimerkki, funktionaalista ohjelmointia (mm. SICP 3.3.5, 3.5) Riku Saikkonen 8. 11. 2012 Sisältö 1 SICP 3.3.5 esimerkki: rajoitteiden vyörytysjärjestelmä

Lisätiedot

Tietorakenteet ja algoritmit - syksy 2015 1

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ä

Lisätiedot

Lisää pysähtymisaiheisia ongelmia

Lisää pysähtymisaiheisia ongelmia Lisää pysähtymisaiheisia ongelmia Lause: Pysähtymättömyysongelma H missä H = { w111x w validi koodi, M w ei pysähdy syötteellä x } ei ole rekursiivisesti lueteltava. Todistus: Pysähtymisongelman komplementti

Lisätiedot

Ohjelmointiharjoituksia Arduino-ympäristössä

Ohjelmointiharjoituksia Arduino-ympäristössä Ohjelmointiharjoituksia Arduino-ympäristössä Yleistä Arduino-sovelluksen rakenne Syntaksi ja käytännöt Esimerkki ohjelman rakenteesta Muuttujat ja tietotyypit Tietotyypit Esimerkkejä tietotyypeistä Ehtolauseet

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Luento 14: Monadit Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 21. tammikuuta 2008 Tyyppien tyypit eli luonteet engl. kind tyyppinimet, kuten

Lisätiedot

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13

2.4 Normaalimuoto, pohja ja laskentajärjestys 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 2.4. NORMAALIMUOTO, POHJA JA LASKENTAJÄRJESTYS 13 Toisinaan voi olla syytä kirjoittaa α- tai β-kirjain yhtäsuuruusmerkin yläpuolelle kertomaan, mitä muunnosta käytetään. Esimerkki 4 1. (λx.x)y β = y 2.

Lisätiedot

815338A Ohjelmointikielten periaatteet 2014-2015

815338A Ohjelmointikielten periaatteet 2014-2015 815338A Ohjelmointikielten periaatteet 2014-2015 X Skriptiohjelmointi Sisältö 1. Johdanto 2. Skriptikielten yleispiirteitä 3. Python 815338A Ohjelmointikielten periaatteet, Skriptiohjelmointi 2 X.1 Johdanto

Lisätiedot

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä Rekursiolause Laskennan teorian opintopiiri Sebastian Björkqvist 23. helmikuuta 2014 Tiivistelmä Työssä käydään läpi itsereplikoituvien ohjelmien toimintaa sekä esitetään ja todistetaan rekursiolause,

Lisätiedot

Algoritmit 1. Luento 3 Ti Timo Männikkö

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

Lisätiedot

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

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

Lisätiedot

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen

Chapel. TIE Ryhmä 91. Joonas Eloranta Lari Valtonen Chapel TIE-20306 Ryhmä 91 Joonas Eloranta Lari Valtonen Johdanto Chapel on Amerikkalaisen Cray Inc. yrityksen kehittämä avoimen lähdekoodin ohjelmointikieli. Chapel on rinnakkainen ohjelmointikieli, joka

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 8: Pienen ohjelmointikielen tulkki (ohjelmoitava laskin) (mm. SICP 4-4.1.5 osin) Riku Saikkonen 15. 11. 2012 Sisältö 1 Nelilaskintulkki, globaalit muuttujat

Lisätiedot

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A. Tehtävä. Tämä tehtävä on aineistotehtävä, jossa esitetään ensin tehtävän teoria. Sen jälkeen esitetään neljä kysymystä, joissa tätä teoriaa pitää soveltaa. Mitään aikaisempaa tehtävän aihepiirin tuntemusta

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

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ä

Lisätiedot

A274101 TIETORAKENTEET JA ALGORITMIT

A274101 TIETORAKENTEET JA ALGORITMIT A274101 TIETORAKENTEET JA ALGORITMIT PERUSTIETORAKENTEET LISTA, PINO, JONO, PAKKA ABSTRAKTI TIETOTYYPPI Tietotyyppi on abstrakti, kun se on määritelty (esim. matemaattisesti) ottamatta kantaa varsinaiseen

Lisätiedot

Funktionaalinen ohjelmointi

Funktionaalinen ohjelmointi Funktionaalinen ohjelmointi Aiemmin on käsitelty nykyohjelmoinnin suosituimpia ohjelmointiparadigmoja: imperatiivista ohjelmointia ja olio-ohjelmointia. Tässä osassa perehdytään funktionaaliseen ohjelmointiin

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Keskeneräinen luento 3: Listat (mm. SICP 22.2.3) Riku Saikkonen 31. 10. 2011 Sisältö 1 Linkitetyt listat 2 Linkitetyt listat (SICP 2.1.1, 2.2.1) funktionaalinen

Lisätiedot

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

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5) Alkuarvot ja tyyppimuunnokset (1/5) Aiemmin olemme jo antaneet muuttujille alkuarvoja, esimerkiksi: int luku = 123; Alkuarvon on oltava muuttujan tietotyypin mukainen, esimerkiksi int-muuttujilla kokonaisluku,

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 21.1.2009 T-106.1208 Ohjelmoinnin perusteet Y 21.1.2009 1 / 32 Tyypeistä Monissa muissa ohjelmointikielissä (esim. Java ja C) muuttujat on määriteltävä ennen

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 9.2.2009 T-106.1208 Ohjelmoinnin perusteet Y 9.2.2009 1 / 35 Listat Esimerkki: halutaan kirjoittaa ohjelma, joka lukee käyttäjältä 30 lämpötilaa. Kun lämpötilat

Lisätiedot

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

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,

Lisätiedot

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä TIE-20306 Principles of Programming Languages Seminaariesityksen essee Ryhmä 18: Heidi Vulli, Joni Heikkilä SISÄLLYSLUETTELO 1. Johdanto... 1 2. Ohjelmointikielen perusperiaatteet... 1 2.1 Paradigmat...

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 11: Tulkin muokkaaminen, sisäiset määrittelyt, makrot (mm. SICP 3.2.4, 4-4.1.6) Riku Saikkonen 29. 11. 2012 Sisältö 1 Kirjan tulkin muokkaaminen 2 Yksityiskohta:

Lisätiedot

Javan perusteita. Janne Käki

Javan perusteita. Janne Käki Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).

Lisätiedot

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 1.4.2009 T-106.1208 Ohjelmoinnin perusteet Y 1.4.2009 1 / 56 Tentti Ensimmäinen tenttimahdollisuus on pe 8.5. klo 13:00 17:00 päärakennuksessa. Tämän jälkeen

Lisätiedot

TIEA341 Funktio-ohjelmointi 1, kevät 2008

TIEA341 Funktio-ohjelmointi 1, kevät 2008 TIEA341 Funktio-ohjelmointi 1, kevät 2008 Antti-Juhani Kaijanaho Jyväskylän yliopisto Tietotekniikan laitos 10. tammikuuta 2008 Arvot... ovat laskutoimituksen lopputuloksia... ovat lausekkeita, joihin

Lisätiedot

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

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,

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero

Lisätiedot

ITKP102 Ohjelmointi 1 (6 op)

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

Lisätiedot

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi Solidity älysopimus ohjelmointi Sopimus suuntautunut ohjelmointi Merkle puu Kertausta eiliseltä Solidity on korkean tason älysopimus ohjelmointikieli Muistuttaa olio-ohjelmointia Javalla Sopimuskoodi on

Lisätiedot

Tietorakenteet ja algoritmit

Tietorakenteet ja algoritmit Tietorakenteet ja algoritmit Rekursio Rekursion käyttötapauksia Rekursio määritelmissä Rekursio ongelmanratkaisussa ja ohjelmointitekniikkana Esimerkkejä taulukolla Esimerkkejä linkatulla listalla Hanoin

Lisätiedot

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

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

Lisätiedot

C++11 lambdat: [](){} Matti Rintala

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

Lisätiedot

7/20: Paketti kasassa ensimmäistä kertaa

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

Lisätiedot

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset

Luku 4. Tietorakenteet funktio-ohjelmoinnissa. 4.1 Äärelliset kuvaukset Luku 4 Tietorakenteet funktio-ohjelmoinnissa Koska funktio-ohjelmoinnissa ei käytetä tuhoavaa päivitystä (sijoituslausetta ja sen johdannaisia), eivät läheskään kaikki valtavirtaohjelmoinnista tutut tietorakenteet

Lisätiedot

Harjoitus 2 (viikko 45)

Harjoitus 2 (viikko 45) Mikäli tehtävissä on jotain epäselvää, laita sähköpostia vastuuopettajalle (jorma.laurikkala@uta.fi). Muista lisätä static-määre operaatioidesi otsikoihin, jotta ohjelmasi kääntyvät. Muista noudattaa hyvän

Lisätiedot

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia

TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia TIES542 kevät 2009 Tyyppijärjestelmän laajennoksia Antti-Juhani Kaijanaho 16. helmikuuta 2009 Tyypitetyt ohjelmointikielet sisältävät paljon muitakin konstruktioita kuin yksinkertaisesti tyypitetyn lambda-kielen,

Lisätiedot

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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,

Lisätiedot

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

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...

Lisätiedot

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari 1 1. JOHDANTO 1.1 Määritelmiä 1.2 Tietorakenteen ja algoritmin valinta 1.3 Algoritmit ja tiedon määrä 1.4 Tietorakenteet ja toiminnot 1.5 Esimerkki:

Lisätiedot

Java-kielen perusteet

Java-kielen perusteet Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero

Lisätiedot

11/20: Konepelti auki

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

Lisätiedot

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005

Demo 7 ( ) Antti-Juhani Kaijanaho. 9. joulukuuta 2005 Demo 7 (14.12.2005) Antti-Juhani Kaijanaho 9. joulukuuta 2005 Liitteenä muutama esimerkki Ydin-Haskell-laskuista. Seuraavassa on enemmän kuin 12 nimellistä tehtävää; ylimääräiset ovat bonustehtäviä, joilla

Lisätiedot

811120P Diskreetit rakenteet

811120P Diskreetit rakenteet 811120P Diskreetit rakenteet 2016-2017 ari.vesanen (at) oulu.fi 5. Rekursio ja induktio Rekursio tarkoittaa jonkin asian määrittelyä itseensä viittaamalla Tietojenkäsittelyssä algoritmin määrittely niin,

Lisätiedot

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005

Jäsennys. TIEA341 Funktio ohjelmointi 1 Syksy 2005 Jäsennys TIEA341 Funktio ohjelmointi 1 Syksy 2005 Muistutus: Laskutehtävä ja tulos data Laskutehtava = Luku Double Yhteen Laskutehtava Laskutehtava Vahennys Laskutehtava Laskutehtava Tulo Laskutehtava

Lisätiedot

15. Ohjelmoinnin tekniikkaa 15.1

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:

Lisätiedot

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

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ä

Lisätiedot