23
Racket – perusteet 3. FUNKTIO

Racket perusteet 3. Funktio

Embed Size (px)

Citation preview

Page 1: Racket perusteet 3. Funktio

Racket – perusteet3. FUNKTIO

Page 2: Racket perusteet 3. Funktio

2

Sisällysluettelo: 3A. FUNKTIO

1. Funktio

2. Funktion määrittely

3. Funktion esittely

4. Funktion kutsuminen

5. Funktion testaaminen

3B. FUNKTION SUUNNITTELU

6. Funktion suunnittelu – apufunktiot

7. Funktion suunnitteluportaat

Page 3: Racket perusteet 3. Funktio

Koodiaapinen MOOC - syksy 2015

Funktion avulla yleistetään sääntöjä

Tällä jaksolla opimme määrittelemään funktioita. Funktio on tapa yleistää sääntöjä. Sen sijaan, että kirjoittaisimme

(/ (+ 1 2) 2)

(/ (+ 4 5) 2)

Kirjoitamme em. säännön yleisessä eli abstraktissa muodossa muuttujien a ja b avulla:

(/ (+ a b) 2)

Lisäksi tarvitsemme rakenteen, jolla saamme nimen säännölle (keskiarvo) sekä arvot muuttujille a ja b.

(define (keskiarvo a b)

(/ (+ a b) 2)

(keskiarvo 1 2)(keskiarvo 4 5)

Funktion määrittely Funktion kutsuminen

Page 4: Racket perusteet 3. Funktio

4

Funktio

Kirjoita kerran,kutsu useasti.

Page 5: Racket perusteet 3. Funktio

5

Funktio muuttaa syötteet (argumentit) paluuarvoksi

funktio

ARGUMENTIT 100

”solid”

”red”

PALUUARVO

Page 6: Racket perusteet 3. Funktio

Koodiaapinen MOOC - syksy 2015

Funktion käsite tulee matematiikasta

MÄÄRITTELYJOUKKO ARVOJOUKKO

3 9neliö-funktio

-3

Funktio toimii aina samalla tavalla samalle syötteelle.

neliö : Luku -> Luku

𝑓 (𝑥 )=𝑥2

Page 7: Racket perusteet 3. Funktio

7

Esimerkkiympyrä-funktio

ympyräfunktio

ARGUMENTIT 100

”black”

PALUUARVO

ympyrä : Luku Väri -> Kuva

Page 8: Racket perusteet 3. Funktio

8

Funktio, joka palauttaa kuvan

ARGUMENTIT

100

PALUUARVO

”black”

r

väri

MUUTTUJAT(PARAMETRIT)

(𝑐𝑖𝑟𝑐𝑙𝑒𝑟 solid 𝑣 ä𝑟𝑖)

Page 9: Racket perusteet 3. Funktio

9

Funktion määrittely

(define (ympyrä r väri) (circle r ”solid” väri))

Page 10: Racket perusteet 3. Funktio

10

Funktion esittely(kommenttirivillä)

; ympyrä : Luku Väri -> Kuva

(define (ympyrä r väri) (circle r ”solid” väri))

Funktion nimi 1. Parametrin tyyppi 2. Parametrin tyyppi Funktion paluuarvon tyyppi

Page 11: Racket perusteet 3. Funktio

Funktion kutsuminen(interaktioikkunasta)

> (ympyrä 60 ”red”)

>(ympyrä 40 ”black”)

>(overlay (ympyrä 20 "black")

(ympyrä 40 "white")

(ympyrä 60 "black")

(ympyrä 80 "white")

(ympyrä 100 "black"))

11

argumentit paluuarvo

Page 12: Racket perusteet 3. Funktio

12

Esimerkki : risti-funktio1) Funktion esittely:

;; risti : Luku Luku Väri -> Kuva

2) Funktion määrittely:

(define (risti a b väri)

(overlay (rectangle a b ”solid” väri)

(reactangle b a ”solid” väri)))

3) Funktion kutsuminen:

(risti 20 50 ”blue”)

Page 13: Racket perusteet 3. Funktio

13

Funktion kutsuminen (toisen funktion sisältä = apufunktion kutsuminen)

(define (pallot r väri) (beside (ympyrä r väri) (ympyrä r väri)))

> (pallot 30 ”blue”)

argumentteina käytetään nyt pallot-funktion parametreja r ja väri(ympyrä on tässä apufunktio)

Page 14: Racket perusteet 3. Funktio

Funktion testaaminenKoska funktio toimii aina samalla tavalla samalle syötteelle (argumenttien arvoille), voidaan funktion koodin oikeellisuudesta varmistua kirjoittamalla testikoodia (check-expect).

Check-expect vertaa funktiokutsun palauttamaa arvoa odotusarvoon:

14

(check-expect (risti 20 50 ”blue”)

)

(check-expect (risti 20 50 ”blue”) (overlay (rectangle 20 50 ”solid” ”blue”)

(reactangle 20 20 ”solid” ”blue”)))

funktiokutsu

odotusarvo = se mitä pitäisi tulla paluuarvona, jos funktio toimii oikein

TAI

Page 15: Racket perusteet 3. Funktio

15

Funktio, joka palauttaa luvun

ARGUMENTIT

400

PALUUARVO

25

10 000

x

y

MUUTTUJAT(PARAMETRIT)

𝑎 ∙𝑏

Page 16: Racket perusteet 3. Funktio

16

Esimerkki: pinta-ala-funktio1) Funktion esittely:

;; pinta-ala : Luku Luku -> Luku

2) Funktion määrittely:

(define (pinta-ala a b)

(* a b))

3) Funktion kutsuminen (testaaminen käsin):

> (pinta-ala 400 25)

4) Funktion testaaminen (automaattisesti):

(check-expect (pinta-ala 400 25)

10000)

funktiokutsu

odotusarvo

Page 17: Racket perusteet 3. Funktio

17

Kirjoita oma funktio 0. tarkoitus: kirjoita lyhyt kuvaus siitä mitä funktiosi tekee (vaihtoehtoisesti selitä tämä kaverillesi sanallisesti.) Pääasia, että ymmärrät mitä olet tekemässä.

1. esittely: keksi funktiollesi nimi, listaa tarvittavien muuttujien tietotyypit ja päätä mitä tietotyyppiä funktiosi palauttaa.

2. määrittely: keksi muuttujille (parametreille) nimet, kirjoita funktion koodi parametrien avulla.

3. testaus: ◦ kutsu funktiotasi interaktioikkunasta eri argumenttien arvoilla

TAI ◦ kirjoita testit check-expect:in avulla ja aja koodi

komm

enttejaajettavaa koodia

Page 18: Racket perusteet 3. Funktio

18

Funktion suunnittelu - apufunktiot

Funktion koodaaminen suoraan, ilman suunnittelua, on vaikeaa. Ongelmaa kannattaakin lähestyä funktion suunnitteluportaat – menetelmän mukaisesti askel askeleelta. Menetelmässä oleellista on miettiä ensin miten funktion tulisi toimia. Tämä tehdään kirjoittamalla testit ennen varsinaista funktion määrittelemistä. Tämä auttaa ymmärtämään miten funkion tulisi toimia ja sen jälkeen on helpompaa kirjoittaa myös itse funktio.

Toinen funktion suunnittelussa huomioitava asia on toiminnallisuuden jakaminen pienemmiksi paloiksi eli apufunktioiksi.

Jokaisen funktion pitäisi tehdä vain yksi asia.

Yhdistelemällä funktioita saadaan aikaan monimutkaisempia funktioita. Funktio

Apufunktio 1

Apufunktio 2

Page 19: Racket perusteet 3. Funktio

Funktion suunnitteluportaat

0) Selvitä itsellesi mitä funktiosi tekee: kirjoita tarkoitus kommenttiriville.

1) Keksi funktiollesi kuvaava nimi, listaa millaista muuttuvaa tietoa se käsittelee ja millaista tietoa se tuottaa: kirjoita esittely kommenttiriville.

2) Kirjoita funktiollesi runko (stub): keksi muuttujille (parametreille) kuvaavat nimet ja aseta paluuarvoksi ”jotain”.

3) Kirjoita funktion käytölle esimerkit/testit (check-expect), käyttämällä konkreettisia arvoja. Testaa.

4) Kirjoita funktion toteutus. Testaa.

Page 20: Racket perusteet 3. Funktio

20

Suunnittele oma funktio 0. tarkoitus: kirjoita lyhyt kuvaus siitä mitä funktiosi tekee (vaihtoehtoisesti selitä tämä kaverillesi sanallisesti.) Pääasia, että ymmärrät mitä olet tekemässä.

1. esittely: keksi funktiolle nimi, listaa tarvittavien muuttujien tietotyypit ja päätä mitä tietotyyppiä funktiosi palauttaa

2. runko (stub): keksi muuttujille nimet, ja kirjoita ”tyhmä funktio” eli stub, joka ei vielä tee mitään järkevää mutta joka ottaa vastaan argumentteja ja palauttaa oikeaa tyyppiä olevan ”tyhmän” vastauksen esim. 0 (luku) tai empty-image (kuva).

3. esimerkit: kirjoita esimerkkejä miten funktiotasi voisi kutsua, ja mitä se tulee palauttamaan (check-expect). Testaa testit painamalla ”run”. Jos testit toimivat ne ilmoittavat, että funktiossa on vikaa, ja juuri näin pitäisikin käydä, koska käytössä on vasta tyhmä ”stub”.

4. toteutus: kirjoita nyt funktiosi toteutus eli korvaa ”tyhmä” paluuarvo järkevällä koodilla, käytä apunasi esimerkkejä. Usein esimerkin koodin voi kopioida suoraan funktion toteutukseksi sijoittamalla muuttujien (parametrien) nimet oikeille kohdille. Testaa funktiosi painamalla ”run” -> testien pitäisi mennä läpi, jos funktio on koodattu oikein.

komm

enttejaajettavaa koodia

Page 21: Racket perusteet 3. Funktio

21

Tee funktio, joka laskee jonkin kappaleen pinta-alan tai tilavuuden

1) Päätä nimi, sekä muuttujien määrät ja tyypit sekä paluuarvon tyypit

2) Päätä muuttujien nimet, kirjoita funktion runko (stub).

3) Kirjoita esimerkit (=testit), siitä miten funktio tulee toimimaan (testaa esimerkit ajamalla ”run”)

4) Kirjoita funktion koodi

5) Paina ”run”

6) Kokeile vielä interaktioikkunassa toimiiko

Vihje: Jos tarvitset laskussasi π:tä, se on Racket:issä pi. Katso myös seuraavat diat!

Page 22: Racket perusteet 3. Funktio

22

Funktio, joka palauttaa likiarvon

ARGUMENTIT

40

PALUUARVO

10

h

r

MUUTTUJAT(PARAMETRIT)

π 12566,370614359172953850573533118

Page 23: Racket perusteet 3. Funktio

23

Esimerkki: ympyrälieriön-tilavuus-funktio

1) Päätetään funktion nimi : sen parametrien tyypit -> paluuarvon tyyppi

;; ympyrälieriön-tilavuus : Luku Luku -> Luku

2) Annetaan funktiolle ja sen parametreille nimet (stub):

(define (ympyrälieriön-tilavuus h r)

0) ; stub

3) Selvitetään esimerkkien (testien) avulla miten se toimii:(check-within (ympyrälieriön-tilavuus 400 25) (* 400 (* pi (sqr 25))) 0.001)(check-within (ympyrälieriön-tilavuus 100 50) (* 100 (* pi (sqr 50)))

0.001)4) Kirjoitetaan funktio loppuun (jatketaan stubia):

(define (ympyrälieriön-tilavuus h r)

(* h (* pi (sqr r))))

Huom! Check-expect ei toimi tässä, koska π:n arvo on likiarvo. Likiarvoja sisältäviä

tuloksia pitää testata käyttämällä check-within – funktiota,

jolle annetaan tarkkuus kolmantena

argumenttina.