SlideShare a Scribd company logo
1 of 23
Racket – perusteet
3. FUNKTIO
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
2
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)
KOODIAAPINEN MOOC - SYKSY 2015
(keskiarvo 1 2)
(keskiarvo 4 5)
Funktion määrittely Funktion kutsuminen
Funktio
4
Kirjoita kerran,
kutsu useasti.
Funktio muuttaa syötteet
(argumentit) paluuarvoksi
5
funktio
ARGUMENTIT
100
”solid”
”red”
PALUUARVO
Funktion käsite tulee
matematiikasta
KOODIAAPINEN MOOC - SYKSY 2015
MÄÄRITTELYJOUKKO ARVOJOUKKO
3 9
neliö-funktio
-3
Funktio toimii aina samalla tavalla samalle syötteelle.
neliö : Luku -> Luku
𝑓 𝑥 = 𝑥2
Esimerkki
ympyrä-funktio
7
ympyrä
funktio
ARGUMENTIT
100
”black”
PALUUARVO
ympyrä : Luku Väri -> Kuva
Funktio, joka palauttaa kuvan
8
ARGUMENTIT
100
PALUUARVO
”black”
r
väri
MUUTTUJAT
(PARAMETRIT)
(𝑐𝑖𝑟𝑐𝑙𝑒 𝑟 "solid" 𝑣ä𝑟𝑖)
Funktion määrittely
9
(define (ympyrä r väri)
(circle r ”solid” väri))
Funktion esittely
(kommenttirivillä)
10
; 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
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
Esimerkki : risti-funktio
1) 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”)
12
Funktion kutsuminen
(toisen funktion sisältä = apufunktion kutsuminen)
13
(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)
Funktion testaaminen
Koska 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
Funktio, joka palauttaa luvun
15
ARGUMENTIT
400
PALUUARVO
25
10 000
x
y
MUUTTUJAT
(PARAMETRIT)
𝑎 ∙ 𝑏
Esimerkki: pinta-ala-funktio
1) 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)
16
funktiokutsu
odotusarvo
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
17
kommenttejaajettavaakoodia
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.
18
Funktio
Apufunktio 1
Apufunktio 2
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.
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.
20
kommenttejaajettavaakoodia
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!
21
Funktio, joka palauttaa
likiarvon
22
ARGUMENTIT
40
PALUUARVO
10
h
r
MUUTTUJAT
(PARAMETRIT)
π𝑟2
∙ ℎ 12566,37061
4359172953
8505735331
18
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))))
23
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.

More Related Content

What's hot

Java interface gráfica swing
Java   interface gráfica swingJava   interface gráfica swing
Java interface gráfica swing
Armando Daniel
 

What's hot (18)

Introdução ao Latex
Introdução ao LatexIntrodução ao Latex
Introdução ao Latex
 
Função PROCV
Função PROCVFunção PROCV
Função PROCV
 
Curso javascript básico
Curso javascript básicoCurso javascript básico
Curso javascript básico
 
JAVA - Matrizes
JAVA - MatrizesJAVA - Matrizes
JAVA - Matrizes
 
Arrays em java
Arrays em javaArrays em java
Arrays em java
 
Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02Algoritmos e Estrutura de Dados - Aula 02
Algoritmos e Estrutura de Dados - Aula 02
 
Tabela Hash
Tabela HashTabela Hash
Tabela Hash
 
Single row functions
Single row functionsSingle row functions
Single row functions
 
Vba cadastro de clientes
Vba   cadastro de clientesVba   cadastro de clientes
Vba cadastro de clientes
 
Create table
Create tableCreate table
Create table
 
Les02
Les02Les02
Les02
 
Guía 06. Subconsultas con MySQL - José J Sánchez H
Guía 06. Subconsultas con MySQL - José J Sánchez HGuía 06. Subconsultas con MySQL - José J Sánchez H
Guía 06. Subconsultas con MySQL - José J Sánchez H
 
MySQL Views
MySQL ViewsMySQL Views
MySQL Views
 
Aula 11 banco de dados
Aula 11   banco de dadosAula 11   banco de dados
Aula 11 banco de dados
 
Java interface gráfica swing
Java   interface gráfica swingJava   interface gráfica swing
Java interface gráfica swing
 
Funções em C
Funções em CFunções em C
Funções em C
 
Exercícios resolvidos e propostos matemática
Exercícios resolvidos e propostos matemáticaExercícios resolvidos e propostos matemática
Exercícios resolvidos e propostos matemática
 
Atalhos word
Atalhos wordAtalhos word
Atalhos word
 

Viewers also liked

Kasvaminen ja väheneminen kuvasta
Kasvaminen ja väheneminen kuvastaKasvaminen ja väheneminen kuvasta
Kasvaminen ja väheneminen kuvasta
teemunmatikka
 

Viewers also liked (17)

Racket perusteet 4. Ehto- ja valintalauseet
Racket perusteet 4. Ehto- ja valintalauseetRacket perusteet 4. Ehto- ja valintalauseet
Racket perusteet 4. Ehto- ja valintalauseet
 
Racket perusteet - Sovellukset A
Racket perusteet - Sovellukset ARacket perusteet - Sovellukset A
Racket perusteet - Sovellukset A
 
Racket MOOC - jakso 2
Racket MOOC - jakso 2Racket MOOC - jakso 2
Racket MOOC - jakso 2
 
Racket MOOC - jakso 1
Racket MOOC - jakso 1Racket MOOC - jakso 1
Racket MOOC - jakso 1
 
Racket MOOC - jakso 3
Racket MOOC - jakso 3Racket MOOC - jakso 3
Racket MOOC - jakso 3
 
Racket mooc 2017 - aikataulu
Racket mooc 2017 -  aikatauluRacket mooc 2017 -  aikataulu
Racket mooc 2017 - aikataulu
 
Racket mooc 2017 - yleistä
Racket mooc 2017 -  yleistäRacket mooc 2017 -  yleistä
Racket mooc 2017 - yleistä
 
Racket jatko 6. oppitunti
Racket jatko  6. oppituntiRacket jatko  6. oppitunti
Racket jatko 6. oppitunti
 
Racket jatko 5. Rekursio
Racket jatko 5. RekursioRacket jatko 5. Rekursio
Racket jatko 5. Rekursio
 
Työturvallisuus
TyöturvallisuusTyöturvallisuus
Työturvallisuus
 
Racket jatko 6. Listat
Racket jatko 6. ListatRacket jatko 6. Listat
Racket jatko 6. Listat
 
Koodiaapinen MOOC - Racket
Koodiaapinen MOOC - RacketKoodiaapinen MOOC - Racket
Koodiaapinen MOOC - Racket
 
Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)
 
Ohjelmointi yläkoulussa: Jatkokurssi
Ohjelmointi yläkoulussa: JatkokurssiOhjelmointi yläkoulussa: Jatkokurssi
Ohjelmointi yläkoulussa: Jatkokurssi
 
Funktiot
FunktiotFunktiot
Funktiot
 
Kasvaminen ja väheneminen kuvasta
Kasvaminen ja väheneminen kuvastaKasvaminen ja väheneminen kuvasta
Kasvaminen ja väheneminen kuvasta
 
Funktion nollakohta
Funktion nollakohtaFunktion nollakohta
Funktion nollakohta
 

Similar to Racket perusteet 3. Funktio (6)

Racket mooc - viikko 2
Racket mooc - viikko 2Racket mooc - viikko 2
Racket mooc - viikko 2
 
Racket MOOC - 1. viikko
Racket MOOC - 1. viikkoRacket MOOC - 1. viikko
Racket MOOC - 1. viikko
 
Racket MOOC - viikko 3
Racket MOOC - viikko 3Racket MOOC - viikko 3
Racket MOOC - viikko 3
 
Racket MOOC (kevät 2016) - jakso 4
Racket MOOC (kevät 2016) -  jakso 4Racket MOOC (kevät 2016) -  jakso 4
Racket MOOC (kevät 2016) - jakso 4
 
Racket MOOC viikko 5
Racket MOOC viikko 5Racket MOOC viikko 5
Racket MOOC viikko 5
 
C# nykyiset kipupisteet
C# nykyiset kipupisteetC# nykyiset kipupisteet
C# nykyiset kipupisteet
 

More from Tiina Partanen

More from Tiina Partanen (14)

Computational Thinking as an Emergent Learning Trajectory of Mathematics
Computational Thinking as an Emergent Learning Trajectory of MathematicsComputational Thinking as an Emergent Learning Trajectory of Mathematics
Computational Thinking as an Emergent Learning Trajectory of Mathematics
 
Ohjelmoinnin historiaa
Ohjelmoinnin historiaaOhjelmoinnin historiaa
Ohjelmoinnin historiaa
 
Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)
 
Koodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynoteKoodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynote
 
Kurkistus koodaukseen
Kurkistus koodaukseenKurkistus koodaukseen
Kurkistus koodaukseen
 
Racket MOOC jakso 7
Racket MOOC jakso 7Racket MOOC jakso 7
Racket MOOC jakso 7
 
Racket MOOC - jakso 6
Racket MOOC -  jakso 6Racket MOOC -  jakso 6
Racket MOOC - jakso 6
 
Racket MOOC - jakso 5
Racket MOOC - jakso 5Racket MOOC - jakso 5
Racket MOOC - jakso 5
 
Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)
 
Legorobottialkeet
LegorobottialkeetLegorobottialkeet
Legorobottialkeet
 
Lapset koodaa?
Lapset koodaa?Lapset koodaa?
Lapset koodaa?
 
Koodauksen ensiaskeleet
Koodauksen ensiaskeleetKoodauksen ensiaskeleet
Koodauksen ensiaskeleet
 
Racket MOOC - viikko 6
Racket MOOC - viikko 6Racket MOOC - viikko 6
Racket MOOC - viikko 6
 
Racket jatko 7. oppitunti
Racket jatko 7. oppituntiRacket jatko 7. oppitunti
Racket jatko 7. oppitunti
 

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 2
  • 3. 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) KOODIAAPINEN MOOC - SYKSY 2015 (keskiarvo 1 2) (keskiarvo 4 5) Funktion määrittely Funktion kutsuminen
  • 5. Funktio muuttaa syötteet (argumentit) paluuarvoksi 5 funktio ARGUMENTIT 100 ”solid” ”red” PALUUARVO
  • 6. Funktion käsite tulee matematiikasta KOODIAAPINEN MOOC - SYKSY 2015 MÄÄRITTELYJOUKKO ARVOJOUKKO 3 9 neliö-funktio -3 Funktio toimii aina samalla tavalla samalle syötteelle. neliö : Luku -> Luku 𝑓 𝑥 = 𝑥2
  • 8. Funktio, joka palauttaa kuvan 8 ARGUMENTIT 100 PALUUARVO ”black” r väri MUUTTUJAT (PARAMETRIT) (𝑐𝑖𝑟𝑐𝑙𝑒 𝑟 "solid" 𝑣ä𝑟𝑖)
  • 9. Funktion määrittely 9 (define (ympyrä r väri) (circle r ”solid” väri))
  • 10. Funktion esittely (kommenttirivillä) 10 ; 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
  • 11. 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
  • 12. Esimerkki : risti-funktio 1) 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”) 12
  • 13. Funktion kutsuminen (toisen funktion sisältä = apufunktion kutsuminen) 13 (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)
  • 14. Funktion testaaminen Koska 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
  • 15. Funktio, joka palauttaa luvun 15 ARGUMENTIT 400 PALUUARVO 25 10 000 x y MUUTTUJAT (PARAMETRIT) 𝑎 ∙ 𝑏
  • 16. Esimerkki: pinta-ala-funktio 1) 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) 16 funktiokutsu odotusarvo
  • 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 17 kommenttejaajettavaakoodia
  • 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. 18 Funktio Apufunktio 1 Apufunktio 2
  • 19. 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.
  • 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. 20 kommenttejaajettavaakoodia
  • 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! 21
  • 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)))) 23 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.