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
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" đŁĂ€đđ)
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. Haarautuminen syötteen
mukaan
Funktioissa on sisÀÀnrakennettuna ajatus myös siitÀ, ettÀ ne toimivat
vain tietyillÀ syötteen arvoilla. Niiden mÀÀrittelyjoukko on siis rajattu.
Jos funktiota kutsutaan sellaisella syötteellÀ, joka ei kuulu sen
mÀÀrittelyjoukkoon, funktion pitÀisi osata palauttaa jotain jÀrkevÀÀ
nÀissÀ ns. virhetilanteissa.
On myös tilanteita, joissa tietyillÀ syötteen arvoilla tehdÀÀn jotain ja
toisilla syötteen arvoilla jotain tÀysin erilaista.
TĂ€llaiseen toiminnallisuuteen tarvitsemme totuusarvoja, predikaatteja,
vertailuoperaattoreita sekÀ ehtolausetta (if).
KOODIAAPINEN MOOC - SYKSY 2015
26. ĂlykĂ€s-overlay
funktio ehtolauseella
0) Funktion tarkoitus:
;; uusi overlay, joka varmistaa, ettÀ kapeampi kuva tulee aina pÀÀllimmÀiseksi
1) Funktion esittely:
;; ÀlykÀs-overlay : Kuva Kuva -> Kuva
2) Funktion mÀÀrittely:
(define (ÀlykÀs-overlay k1 k2)
(if (<= (image-width k1) (image-width k2))
(overlay k1 k2)
(overlay k2 k1)))
3) Funktion testaus (huom. molemmat haarat pitÀÀ testata):
(check-expect (Ă€lykĂ€s-overlay (square 20 âsolidâ âredâ)
(square 10 âsolidâ âblueâ))
(overlay (square 10 âsolidâ âblueâ)
(square 20 âsolidâ âredâ)))
KOODIAAPINEN MOOC - SYKSY 2015
27. Sanasto
Koodarin kÀsikirjasta löytyy sanasto
KÀytÀ sitÀ hyvÀksesi kun törmÀÀt sinulle uuteen termiin. Toisen viikon
uudet termit:
ARVOJOUKKO TOTUUSARVO
FUNKTIO PREDIKAATTI
KOMMENTTI VERTAILUOPERAATTORI
PARAMETRI EHTOLAUSE
MĂĂRITTELYJOUKKO
KOODIAAPINEN MOOC - SYKSY 2015
28. Funktio:
0) Tarkoitus
1) Esittely
2) MÀÀrittely
3) Testit
VinkkejÀ jakson
palautustehtÀvÀÀn
TÀllÀ viikolla harjoittelet funktion mÀÀrittelyÀ ja ehtolauseen kÀyttöÀ.
TehtÀvÀnÀsi on kirjoittaa siis vÀhintÀÀn yksi funktio, jossa on vÀhintÀÀn
yksi ehtolause. Koska koodari ei koskaan kirjoita koodia vain tietonetta
varten vaan myös muille koodareille luettavaksi ja uudelleen
kÀytettÀvÀksi, funktio koodin tulee sisÀltÀÀ kaikki nÀmÀ osiot:
KOODIAAPINEN MOOC - SYKSY 2015
Jotta joku toinen koodari (tai sinÀ itse) ymmÀrtÀÀ
mitÀ funktiosi tekee
Jotta funktiota voi kÀyttÀÀ, pitÀÀ tietÀÀ millaisilla
arvoilla sitÀ pitÀÀ kutsua
Varsinainen koodi, joka mÀÀrittelee uuden funktion
(define...)
Testit, joiden avulla todistetaan, ettÀ ko. funktio
myös toimii (check-expect...). Testaa kaikki haarat.
29. VinkkejÀ jakson
palautustehtÀvÀÀn
Saat keksiÀ itse mitÀ funktiosi tekee. Se voi olla funktio, joka palauttaa
kuvan tai se voi olla funktio, joka laskee jotain. Kun olet saanut selville
idean, etsi sopivia funktioita Koodarin kÀsikirjasta.
Hyviin ohjelmointikÀytÀnteisiin liittyy funktion nimeÀminen kuvaavalla
nimellÀ. Myös kÀytetyt parametrit olisi hyvÀ nimetÀ kuvaavalla nimellÀ.
Jos kÀytÀt vakioita, mÀÀrittele ne 1. jaksossa opitulla tavalla (define).
Palauttamasi koodi menee vertaisarvioitavaksi, eli sen lukee, testaa ja
arvioi joku toinen kurssilainen. Jos olet koodannut aikaisemmin, pidÀ
huolta siitÀ ettÀ koodisi on tarpeeksi yksinkertainen, niin ettÀ
aloittelijakin ymmÀrtÀÀ mitÀ se tekee ja miten funktiotasi kutsutaan.
KĂ€ytĂ€ KISS-periaatetta ï
KISS = âKeep It Simple, Stupidâ
KOODIAAPINEN MOOC - SYKSY 2015
31. 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
32. 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À neliö-funktio ei tee mitÀÀn
ÀlykÀstÀ.
33. 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À neliö-funktio ei tee mitÀÀn
ÀlykÀstÀ.
34. 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ÀÀ konkreettisia
esimerkkiarvoja.
LisÀÀ a:n tilalle tÀssÀ valittu
esimerkkiluku 45:
(check-expect (neliö 45)
(* 45 45))
ja paina ârunâ.
35. 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ÀÀ konkreettisia
esimerkkiarvoja.
LisÀÀ a:n tilalle tÀssÀ valittu
esimerkkiluku 45:
(check-expect (neliö 45)
(* 45 45))
ja paina ârunâ.
36. 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 odotusarvon, johon
uuden funktion paluuarvoa
verrataan. TÀssÀ odotusarvo on
unohtunut pois.
LisÀÀ odotusarvo:
(check-expect (neliö 45)
(* 45 45))
ja paina ârunâ.
37. 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 niitÀ tulkitaan olevan kolme:
a, * ja a. Racket â lauseke
muodostetaan 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â.
38. 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:
0 sekÀ (* a a).
Poista turha koodi:
(define (neliö a)
(* a a))
a paina ârunâ.
39. 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â.
Huom. number->string muuttaa
luvun merkkijonoksi
40. 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:
(define (neliö a)
(* a a))
a paina ârunâ.