3. 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. 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.
9. Funktion suunnittelu
Funktion koodaaminen suoraan, ilman suunnittelua on vaikeaa. Siksi seuraamme
funktion suunnitteluportaat â ohjetta ja jaamme suunnittelun pieniin vaiheisiin, jotka
ovat aloittelijallekin helppoja.
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 painamalla ârunâ -> testien pitÀÀkin
epĂ€onnistua, koska kĂ€ytössĂ€ on tyhmĂ€ âstubâ.
4. koodi: kirjoita nyt funktiosi. Jatka stub:in koodi loppuu kÀyttÀmÀllÀ esimerkkejÀ
apunasi. Usein esimerkin koodin voi kopioida suoraan funktion toteutukseksi
sijoittamalla muuttujien nimet oikeille kohdille. Testaa funktiosi painamalla ârunâ ->
testien pitÀisi onnistua, jos funktio on koodattu oikein.
9
10. Esimerkki: ympyrÀ-funktio
1) PÀÀtetÀÀn funktion nimi (ympyrÀ), sen muuttujien tyypit (Luku, VÀri) ja paluuarvon tyyppi (Kuva)
;; ympyrÀ : Luku VÀri -> Kuva
2) Annetaan funktion muuttujille nimet (r, vÀri):
(define (ympyrÀ r vÀri)
empty-image) ; stub
3) SelvitetÀÀn esimerkkien avulla miten se toimii:
(check-expect (ympyrĂ€ 50 âblackâ)
(circle 50 âsolidâ âblackâ)),
(check-expect (ympyrĂ€ 60 âredâ)
(circle 60 âsolidâ âredâ))
4) Kirjoitetaan funktio loppuun (jatketaan stub loppuun), korvaa vakiot muuttujanimillÀ (r ja vÀri):
(define (ympyrÀ r vÀri)
(circle r âsolidâ vĂ€ri))
10
13. Funktio, joka palauttaa luvun
13
ARGUMENTIT
400
PALUUARVO
25
10 000
x
y
MUUTTUJAT
(PARAMETRIT)
đ„ â đŠ
14. Esimerkki: pinta-ala-funktio
1) PÀÀtetÀÀn funktion nimi : sen parametrien tyypit -> paluuarvon tyyppi
;; pinta-ala : Luku Luku -> Luku
2) Annetaan funktiolle ja sen parametreille nimet (stub):
(define (pinta-ala x y)
0) ; stub
3) SelvitetÀÀn esimerkkien avulla miten se toimii:
(check-expect (pinta-ala 400 25) (* 400 25))
(check-expect (pinta-ala 100 50) (* 100 50))
4) Kirjoitetaan funktio loppuun (jatketaan stubia):
(define (pinta-ala x y)
(* x y))
14
16. 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)
3) SelvitetÀÀn esimerkkien 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))))
16
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.
17. Stub:in tyhmÀt paluuarvot
Tietotyyppi TyhmÀ paluuarvo
Luku 0
Merkkijono ââ
Kuva empty-image
KOODIAAPINEN MOOC - SYKSY 2015
Jotta check-expect â lauseet voidaan ajaa, funktiosta on oltava olemassa âtyhmĂ€
mÀÀrittelyâ (stub). Koska funktion on aina palautettava jotain myös stub:in on
palautettava âjotain tyhmÀÀâ mutta oikean tyyppistĂ€. Voit kĂ€yttÀÀ esim. NĂ€itĂ€
arvoja stub:in paluuarvoina:
18. Sanasto
Koodarin kÀsikirjasta löytyy sanasto
KÀytÀ sitÀ hyvÀksesi kun törmÀÀt sinulle uuteen termiin. Toisen viikon
uudet termit:
ARVOJOUKKO
FUNKTIO
FUNKTION SUUNNITTELUPORTAAT
KOMMENTTI
PARAMETRI
MĂĂRITTELYJOUKKO
KOODIAAPINEN MOOC - SYKSY 2015
19. VinkkejÀ viikon
palautustehtÀvÀÀn
TÀllÀ viikolla prosessi on tÀrkeÀmpi kuin lopputulos. Tarkoitus on
suunnitella tyhjÀstÀ yksi funktio, joka tekee jotain hyödyllistÀ. TÀmÀ on
ensimmÀinen yksinkertainen ohjelmasi, jonka suunnittelet, toteutat ja
testaat. TÀssÀ kÀydÀÀn siis lÀpi minimittakaavassa oikean
ohjelmistoprojektin vaiheet. Huomaa, ettÀ suunnittelu on isompi (ja
vaikeampi prosessi), kuin toteutus ja testaus.
KOODIAAPINEN MOOC - SYKSY 2015
Suunnittelu:
0) Tarkoitus
1) Esittely
2) Runko (stub)
3) Esimerkit/testit
Toteutus:
4) Funktion toteutus
ja testaus
20. VinkkejÀ viikon
palautustehtÀvÀÀn
Funktio on hyvÀ funktio, kun se tekee vain yhden asian. Jos tavoittelet
monimutkaista funktiota, joka tekee kaksi asiaa, sinun pitÀisi tehdÀ kaksi
erillistÀ funktiota. Jos nÀyttÀÀ siltÀ, ettÀ viikkotehtÀvÀsi paisuu yli kolmen
funktion, suosittelen tehtÀvÀn rajaamista! Toki jos intoa riittÀÀ,
pidemmÀllekin saa mennÀ. TÀrkeintÀ on, ettÀ osaat tunnistaa muuttuvia
asioita ja vakioita sekÀ osaat suunnitella esimerkit/testit funktiolle. PidÀ
mielessÀ sama periaate kuin ensimmÀisellÀ viikolla: tee paloissa. Pieni,
yksinkertainen apufunktio on helppo suunnitella, koodata ja testata. Iso
monimutkainen funktio on sitten helppo koostaa valmiista
apufunktioista.
KOODIAAPINEN MOOC - SYKSY 2015
funktio
apufunktio1
apufunktio2
22. MistÀ virheilmoitukset voivat
johtuvat?
KOODIAAPINEN MOOC - SYKSY 2015
Virheilmoitus SyitÀ
define: expected at least one variable after the function
name, but found none
Esimerkki
define: expected only one expression after the variable name
neliö, but found 1 extra part
Esimerkki
a: this variable is not defined Esimerkki(1)
Esimerkki(2)
check-expect: expects 2 arguments, but found only 1 Esimerkki
define: expected only one expression for the function body,
but found 2 extra parts
Esimerkki(1)
Esimerkki(2)
Esimerkki(3)
⊠this function is not defined Esimerkki
23. Debuggaus:
define: expected at least one
variable after the function nameâŠ
KOODIAAPINEN MOOC - SYKSY 2015
Racket BSL â kielessĂ€ ei sallita
funktioita, joilla ei ole yhtÀÀn
parametria (muuttujaa).
LisÀÀ funktiollesi vÀhintÀÀn yksi
parametri:
(define (neliö a)
0)
ja paina ârunâ.
Huom! TĂ€mĂ€ on âstubâ (ei tee mitÀÀn
ÀlykÀstÀ).
24. Debuggaus:
define: expected only one expression
after the variable name âŠ
KOODIAAPINEN MOOC - SYKSY 2015
Koska define:llÀ voidaan mÀÀritellÀ
myös muuttuja (vakio) tÀmÀ
tulkitaan vÀÀrÀnlaiseksi muuttujan
arvon asettamiseksi (neliö sanan
jÀlkeen on kaksi lauseketta a ja 0,
kun pitÀisi olla vain yksi).
LisÀÀ sulut funktion nimen ja
parametrin ympÀrille:
(define (neliö a)
0)
ja paina ârunâ.
Huom! TĂ€mĂ€ on âstubâ (ei tee mitÀÀn
ÀlykÀstÀ).
25. Debuggaus:
a: this variable is not defined (1)
KOODIAAPINEN MOOC - SYKSY 2015
Parametriin (muuttujaan) a voidaan
viitata vain funktion sisÀllÀ. TÀssÀ
siihen viitataan sen ulkopuolella,
jonne se ei ânĂ€yâ. Check-expect
lauseissa pitÀÀ kÀyttÀÀ valittuja
esimerkkiarvoja.
LisÀÀ a:n tilalle tÀssÀ valittu
esimerkkiluku 45:
(check-expect (neliö 45)
(* 45 45))
ja paina ârunâ.
26. Debuggaus:
a: this variable is not defined (2)
KOODIAAPINEN MOOC - SYKSY 2015
Parametriin (muuttujaan) a voidaan
viitata vain funktion sisÀllÀ. TÀssÀ
siihen viitataan sen ulkopuolella,
jonne se ei ânĂ€yâ. Check-expect
lauseissa pitÀÀ kÀyttÀÀ valittuja
esimerkkiarvoja.
LisÀÀ a:n tilalle tÀssÀ valittu
esimerkkiluku 45:
(check-expect (neliö 45)
(* 45 45))
ja paina ârunâ.
27. Debuggaus:
a: this variable is not defined (2)
KOODIAAPINEN MOOC - SYKSY 2015
Parametriin (muuttujaan) a voidaan
viitata vain funktion sisÀllÀ. TÀssÀ
siihen viitataan sen ulkopuolella,
jonne se ei ânĂ€yâ. Check-expect
lauseissa pitÀÀ kÀyttÀÀ valittuja
esimerkkiarvoja.
LisÀÀ a:n tilalle tÀssÀ valittu
esimerkkiluku 45:
(check-expect (neliö 45)
(* 45 45))
ja paina ârunâ.
28. Debuggaus:
check-expect: expects 2 arguments,
but found only 1
KOODIAAPINEN MOOC - SYKSY 2015
Check-expect â funktio ottaa kaksi
argumenttia. EnsimmÀinen kutsuu
testattavaa funktiota (neliö), ja
toinen tuottaa esimerkkiarvon,
johon uuden funktion paluuarvoa
verrataan. TÀssÀ jÀlkimmÀinen
âodotusarvoâ on unohtunut pois.
LisÀÀ âodotusarvoâ:
(check-expect (neliö 45)
(* 45 45))
ja paina ârunâ.
29. Debuggaus:
define: expected only one expression
for the function body, but found 2âŠ(1)
KOODIAAPINEN MOOC - SYKSY 2015
Funktion pitÀÀ palauttaa aina yksi
lauseke. TÀllÀ yhden lausekkeen
sijaan tulkitaan olevan kolme a, * ja
a. Racket â lauseke muodostettiin
sulkumerkkien avulla ja funktion
nimi kirjoitetaan heti âsulkuaukiâ-
merkin jÀlkeen.
LisÀÀ sulut ja siirrÀ funktion nimi
oikealle paikalle:
(define (neliö a)
(* a a))
a paina ârunâ.
30. Debuggaus:
define: expected only one expression
for the function body, but found 2âŠ(2)
KOODIAAPINEN MOOC - SYKSY 2015
Funktion pitÀÀ palauttaa aina yksi
lauseke. TÀssÀ funktion sisÀllÀ on
kaksi erillistĂ€ Racket â lauseketta:
stub-koodi (0) sekÀ lopullinen
funktion toteutus (* a a).
Poista stub-koodi:
(define (neliö a)
(* a a))
a paina ârunâ.
31. Debuggaus:
define: expected only one expression
for the function body, but found 2âŠ(3)
KOODIAAPINEN MOOC - SYKSY 2015
Funktion pitÀÀ palauttaa aina yksi
lauseke. TÀssÀ funktion sisÀllÀ on
kaksi erillistĂ€ Racket â lauseketta.
YhdistÀ erilliset lausekkeet (tai
poista turha lauseke):
(define (neliö a)
(number->string(* a a)))
a paina ârunâ.
32. Debuggaus:
⊠this function is not defined
KOODIAAPINEN MOOC - SYKSY 2015
Check-expect â lauseke testaa
neliö-funktiota mutta tÀssÀ sitÀ ei
ole mÀÀritetty.
LisÀÀ neliö-funktion mÀÀrittely
(vĂ€hintÀÀn âtyhmĂ€â stub):
(define (neliö a)
0)
a paina ârunâ.