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 parametreissään 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 muodotavaa 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äännnö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 "No core dumbs" - 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 rekusriota 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 ohjelmoinnnissa 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 kodistetaaan 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 argumetit 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ää uudellen 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 lähellä ongelman määrittelyä. - Funktionaalisissa kielissä on automaattinen roskienkeruu, eli muistin varaaminen ja vapauttaminen tehdään automaattisesti.

9 - Rinnakkaisessa ohjelmoinnissa ohjelmien kehittäminen 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 ohjelmonti sopii sellaiseen tilanteeseen, jossa muunnettavalla informatiolla on lista- tai puurakenne, esimerkiksi xml-dokumenttien käsittely. - Ohjelmointikielen kääntäminen, jossa mm. selausvaiheessa luetaan lähdetiedostoa ja muunetaan tiedot alkiojonoksi, jäsennysvaiheessa muunetaan alkiojono vastaavaksi kieliopin mukaiseksi jäsennyspuuksi,..., lopuksi koodin generointivaiheessa käydään läpi jäsennyspuu ja tulostetaan sitä vastaava konekielinen koodi tulostiedostoon. - Imperatiivisesta ohjelmoinnista funktionaaliseen ohjelmointiin siirtyminen saattaa olla vaikeaa, koska ajatusmaailmat poikkeavat toisistaan, ei ole muuttujia eikä toistorakenteita.

10 - Syöttö ja tulostuoperaatioiden hoitaminen, joudutaan rikkomaan sivuvaikutuksettomuutta. Yleensä sivuvaukutuksisa sisältävät osiot erotetaan tarkasti puhtaasti funktionaalisista osista. Haskelll -kielen monadi, joka on abstrakti tietotyyppi, joka kuvaa ohjelman suoritusta annetussa kontekstissa. ( - Huonosti toetutettu 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 - Haasteena on suunnitella sellaiset rajapinnat, joilla ohjelma voidaa jakaa funktionaaliseen ja ei-funktionaaliseen osaan ja miten osien kommunikointi hoidetaan. (C-ohjelmiin voi liittää Haskel-koodia, Java-kielen funktionaaliset ominaisuudet).

11 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. - paramametrejä 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ääritetllä funktion tai ilmaisun (lausekkeen) tyyppiä. - Kieleen on rakennettu mekanismi, jonka avulla voidaan automaattisesti päätellä funktion tyypi (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ääritelyn käyttäytymisen, tyyppiluokka on suunnilleen sama kuin Java-kielen interface. - Eq -luokan jäsenet totetutttavat operaatiot == ja /= - Ord -luokan jäsenet, jotka ovar myös Eq -luokan jäseniä, totetuttavat operaatiot >, >=, < ja <= - Show ja Read - esittävät arvot Stringeinä ja palauttavat arvot Stringeistä - Enum, luokan jäsenet on järjestty 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

19 Arvon tyyppi voidaan ilmaista *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, merkijonoa 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 loppusosan elementtien summa

28 Rekursiivisen funktion määritteleminen - Etsi reunaehto, esimerkisi 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] [0,1,3,5,6,7,9]

29 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 laskeen listan 1. alkion, toinen loppulistan

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

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

32 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]

33 - Laiskuuden vaikutuksia: päättymätön laskenta saattaa paljastaa laiskuuden (estää rinnakkaista laskentaa) Rekursiivinen muuttujan määrittely luvut = 0:[a+1 a <- luvut] fibo = 1:1:[a+b (a,b) <- zip fibo (tail fibo)]

34 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-argumentiin, jos map -funktion kutsussa toisena argumenttina on tyhjä lista, palauttaa funktio tyhjän listan. _ merkintää käytetään kun argumenttia ei tarvita - Jos toisena argunenttina 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 agumenttina alkuperäisen listan loppuosa xs. Anonyymi funktio määritellään kirjoitaamalla \ funktion eteen.

35 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!"

36 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

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

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

39 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

40 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]

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

42 - 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 selvitää mikä todellinen tyyppi on. Tyyppi on suunnilleen sama kuin Javan generics tyyppi.

43 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ä kannssa. mkadder Sulkeuma on funktion ja sen käyttämien (ei-paikallisten) muuttujien viitetaulun yhdistelmä (wikipedia)

44 Currying Kaikilla funktioilla on todellisuudessa vain yksi parametri: 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 summa3 = summa 3 :t summa3 -> summa3 :: Integer -> Integer summa3 8 -> 11 map summa3 [2,4,6] -> [5,7,9]

45 Pattern matching (hahmontunnistus) Funktiot voidaan määritellä hahmontunnistuksella kertoma 0 = 1 kertoma n = n * kertoma (n-1) *Main> kertoma 0 1 *Main> kertoma 1 1 *Main> kertoma 5 120

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

47 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 evaluaoidaan 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ä!

48 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

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

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

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

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

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

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

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

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

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

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

String-vertailusta ja Scannerin käytöstä (1/2) String-vertailusta ja Scannerin käytöstä (2/2) Luentoesimerkki 4.1

String-vertailusta ja Scannerin käytöstä (1/2) String-vertailusta ja Scannerin käytöstä (2/2) Luentoesimerkki 4.1 String-vertailusta ja Scannerin käytöstä (1/2) Vertailuja tehdessä törmätään usein tilanteeseen, jossa merkkijonoa (esimerkiksi merkkijonomuuttujaa) pitää vertailla toiseen merkkijonoon. Tällöin tavanomainen

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

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

Matematiikan tukikurssi

Matematiikan tukikurssi Matematiikan tukikurssi Kurssikerta 8 1 Derivaatta Tarkastellaan funktion f keskimääräistä muutosta tietyllä välillä ( 0, ). Funktio f muuttuu tällä välillä määrän. Kun tämä määrä jaetaan välin pituudella,

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

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

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

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

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta

Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta Simo K. Kivelä, 15.4.2003 Luonnollisten lukujen laskutoimitusten määrittely Peanon aksioomien pohjalta Aksioomat Luonnolliset luvut voidaan määritellä Peanon aksioomien avulla. Tarkastelun kohteena on

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

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

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

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

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

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

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

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

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

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

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

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.3.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.3.2010 1 / 56 Tiedostoista: tietojen tallentaminen ohjelman suorituskertojen välillä Monissa sovelluksissa ohjelman

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

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

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

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

Sisällys. 12. Monimuotoisuus. Johdanto. Alityypitys. Johdanto. Periytymismekanismi määrittää alityypityksen.

Sisällys. 12. Monimuotoisuus. Johdanto. Alityypitys. Johdanto. Periytymismekanismi määrittää alityypityksen. Sisällys 12. Monimuotoisuus Johdanto. Periytymismekanismi määrittää alityypityksen. Viitteiden sijoitus ja vertailu. Staattinen ja dynaaminen. Parametrinvälitys eräs monimuotoisuuden sovellus.. Rajapinnat

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

Tietotyypit ja operaattorit

Tietotyypit ja operaattorit Tietotyypit ja operaattorit Luennossa tarkastellaan yksinkertaisten tietotyyppien int, double ja char muunnoksia tyypistä toiseen sekä esitellään uusia operaatioita. Numeeriset tietotyypit ja muunnos Merkkitieto

Lisätiedot

5 Olio-ohjelmointi 133

5 Olio-ohjelmointi 133 5 Olio-ohjelmointi 133 5. Olio-ohjelmointi Edellisissä luvuissa opittiin kirjoittamaan ohjelmia, joissa käytetään C# -kielen perustietotyyppejä, kuten int, double, float ja rakenteita, kuten operaattoreita,

Lisätiedot

Ohjelmoinnin peruskurssien laaja oppimäärä

Ohjelmoinnin peruskurssien laaja oppimäärä Ohjelmoinnin peruskurssien laaja oppimäärä Luento 3: SICP kohdat 2.22.3, 33.1 ja 3.33.3.2 Riku Saikkonen 8. 11. 2010 Sisältö 1 Lisää listoista 2 Symbolit ja sulkulausekkeet 3 Derivoijaesimerkki 4 Muuttujan

Lisätiedot

Racket ohjelmointia. Tiina Partanen 2014

Racket ohjelmointia. Tiina Partanen 2014 Racket ohjelmointia Tiina Partanen 2014 Sisältö 1) Peruslaskutoimitukset 2) Peruskuvioiden piirtäminen 3) Määrittelyt (define) 4) Yhdistettyjen kuvien piirtäminen 5) Muuttujat ja funktiot 6) Animaatiot

Lisätiedot

Luku 6. Dynaaminen ohjelmointi. 6.1 Funktion muisti

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

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

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

815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset

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

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

Ohjelmoinnin perusteet Y Python

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

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

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

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004 Vertailulauseet Ehtolausekkeet Ehdot, valintalausekkeet Boolean-algebra == yhtäsuuruus!= erisuuruus < pienempi suurempi >= suurempi tai yhtäsuuri Esimerkkejä: int i=7; int j=10;

Lisätiedot

OHJ-1151 Ohjelmointi IIe

OHJ-1151 Ohjelmointi IIe Tampereen teknillinen yliopisto Ohjelmistotekniikan laitos OHJ-1151 Ohjelmointi IIe Harjoitustyö Tomaattisota Välipalautus / Loppudokumentaatio Assistentin nimi Välipalautusaika (päivä ja kellonaika) ja

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 peruskurssi Y1

Ohjelmoinnin peruskurssi Y1 Ohjelmoinnin peruskurssi Y1 CSE-A1111 30.9.2015 CSE-A1111 Ohjelmoinnin peruskurssi Y1 30.9.2015 1 / 27 Mahdollisuus antaa luentopalautetta Goblinissa vasemmassa reunassa olevassa valikossa on valinta Luentopalaute.

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

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

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

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

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

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

Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Ta

Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Ta 22. Taulukot 22.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.2 Yleistä

Lisätiedot

Java-kielen perusteet

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

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

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

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

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

18. Abstraktit tietotyypit 18.1

18. Abstraktit tietotyypit 18.1 18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

Lisätiedot

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.

Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia. Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka

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

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

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

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys Loogisia operaatioita - esimerkkejä Tänään on lämmin päivä ja perjantai Eilen satoi ja oli keskiviikko tai tänään on tiistai. On perjantai ja kello on yli 13 Ei ole tiistai tai ei sada. Ei pidä paikkaansa,

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

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

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

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

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:

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

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

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

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

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

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

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

Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015

Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015 Johdatus diskreettiin matematiikkaan Harjoitus 7, 28.10.2015 1. Onko olemassa yhtenäistä verkkoa, jossa (a) jokaisen kärjen aste on 6, (b) jokaisen kärjen aste on 5, ja paperille piirrettynä sivut eivät

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

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python Ohjelmoinnin perusteet Y Python T-106.1208 15.2.2010 T-106.1208 Ohjelmoinnin perusteet Y 15.2.2010 1 / 46 Merkkijonot Merkkijonojen avulla ohjelmassa voi esittää tekstitietoa, esim. nimiä, osoitteita ja

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

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

Ehto- ja toistolauseet

Ehto- ja toistolauseet Ehto- ja toistolauseet 1 Ehto- ja toistolauseet Uutena asiana opetellaan ohjelmointilauseet / rakenteet, jotka mahdollistavat: Päätösten tekemisen ohjelman suorituksen aikana (esim. kyllä/ei) Samoja lauseiden

Lisätiedot

Algoritmit ja tietorakenteet Copyright Hannu Laine. 1, kun n= 0. n*(n-1)!, kun n>0;

Algoritmit ja tietorakenteet Copyright Hannu Laine. 1, kun n= 0. n*(n-1)!, kun n>0; 1 Rekursio Rekursion periaate ja rekursio määrittelyvälineenä Rekursiota käytetään tietotekniikassa ja matematiikassa erilaisiin tarkoituksiin. Eräänä käyttöalueena on asioiden määrittely. Esimerkkinä

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

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

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ä

Lisätiedot