SlideShare a Scribd company logo
1 of 40
Racket
2. JAKSO
SisÀllys
FUNKTIO
1. Funktio
2. Funktion mÀÀrittely
3. Funktion esittely
4. Funtion kutsuminen
5. Funktion testaaminen
VinkkejÀ viikon palautustehtÀvÀÀn
Debuggaus
KOODIAAPINEN MOOC - SYKSY 2015
EHTOLAUSEET
1. Totuusarvot
2. Vertailuoperaattorit
3. Predikaatit
4. Ehtolause
5. Ehtolause funktion sisÀllÀ
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
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
Totuusarvot (true/false)
- tosi
#true, true
#t, #T
19
true false
- epÀtosi
#false, false
#f, #F
Vertailuoperaattorit
Vertailuoperaattorit palauttavat totuusarvon
YleensÀ vain samantyyppisiÀ arvoja kannattaa verrata keskenÀÀn, siksi
nÀmÀ funktiot tarkistavat myös sen, ettÀ argumentit ovat oikean
tyyppisiÀ:
◩ Vertailuoperaattorit luvuille: <, >, <=, >=, =
◩ Merkkijonoille: string=?
◩ Kuville: image=?
esim. (< 4 5)  #true
(= 4 -4)  #false
(string=? ”kissa1” ”kissa1”)  #true
20
Predikaatit
Funktioita, jotka palauttavat totuusarvon kutsutaan predikaateiksi.
Racket-kielessÀ niiden nimessÀ on usein kysymysmerkki
esim. (number? 4)  #true
(string? 4)  #false
(even? 2)  #true
(zero? 3)  #false
(positive? -3)  #false
21
?
Ehtolause (if)
22
(if (< a 100)
”a on pienempi kuin 100”
”a on yhtĂ€suuri tai suurempi kuin 100”)
Ehtolause funktion sisÀllÀ
Ehtolause sijaitsee normaalisti funktion sisÀllÀ, jolloin tutkitaan saatuja
parametrien arvoja:
esim.
(define (termostaatti lÀmpötila)
(if (< lÀmpötila 22)
”kĂ€ynnistĂ€ lĂ€mmitin”
”sammuta lĂ€mmitin”)))
23
22°C
SisÀkkÀiset ehtolauseet
Ehtolauseen sisÀllÀ voi olla toinen ehtolause:
esim.
(define (termostaatti lÀmpötila)
(if (number? lÀmpötila)
(if (< lÀmpötila 22)
”kĂ€ynnistĂ€ lĂ€mmitin”
”sammuta lĂ€mmitin”)
”lĂ€mpötilasensori on viallinen”))
24
sisempi ehtolause on
ulomman ehtolauseen
”tosihaara”
Robottiauto
funktio ehtolauseella
1) Esittely
;; robottiauto : VĂ€ri -> Merkkijono
2) MÀÀrittely
(define (robottiauto valo)
(if (string=? valo ”green”)
”aja”
”pysĂ€hdy”)
3) Testaus
(check-expect (robottiauto ”red”)
”pysĂ€hdy”))
(check-expect (robottiauto ”green”)
”pysĂ€hdy”))
25
Ä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
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
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.
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
Racket
DEBUGGAUS
Palaa tÀhÀn kohtaan, kun törmÀÀt virheilmoituksiin!
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
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À.
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À.
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”.
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”.
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”.
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”.
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”.
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
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”.

More Related Content

What's hot (9)

Racket MOOC - viikko 3
Racket MOOC - viikko 3Racket MOOC - viikko 3
Racket MOOC - viikko 3
 
Racket MOOC - 1. viikko
Racket MOOC - 1. viikkoRacket MOOC - 1. viikko
Racket MOOC - 1. viikko
 
Racket perusteet - Sovellukset A
Racket perusteet - Sovellukset ARacket perusteet - Sovellukset A
Racket perusteet - Sovellukset A
 
Racket Turtle
Racket TurtleRacket Turtle
Racket Turtle
 
Racket MOOC - jakso 6
Racket MOOC -  jakso 6Racket MOOC -  jakso 6
Racket MOOC - jakso 6
 
Racket jatko 6. Listat
Racket jatko 6. ListatRacket jatko 6. Listat
Racket jatko 6. Listat
 
Racket MOOC - jakso 5
Racket MOOC - jakso 5Racket MOOC - jakso 5
Racket MOOC - jakso 5
 
C# nykyiset kipupisteet
C# nykyiset kipupisteetC# nykyiset kipupisteet
C# nykyiset kipupisteet
 
Racket jatko 6. oppitunti
Racket jatko  6. oppituntiRacket jatko  6. oppitunti
Racket jatko 6. oppitunti
 

Viewers also liked (8)

Racket mooc 2017 - yleistÀ
Racket mooc 2017 -  yleistÀRacket mooc 2017 -  yleistÀ
Racket mooc 2017 - yleistÀ
 
Racket mooc 2017 - aikataulu
Racket mooc 2017 -  aikatauluRacket mooc 2017 -  aikataulu
Racket mooc 2017 - aikataulu
 
Racket alkeet 1. Peruslaskut
Racket alkeet   1. PeruslaskutRacket alkeet   1. Peruslaskut
Racket alkeet 1. Peruslaskut
 
Racket alkeet 2. Kuvat
Racket alkeet   2. KuvatRacket alkeet   2. Kuvat
Racket alkeet 2. Kuvat
 
Racket MOOC jakso 7
Racket MOOC jakso 7Racket MOOC jakso 7
Racket MOOC jakso 7
 
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)
 
K2017aikataulu
K2017aikatauluK2017aikataulu
K2017aikataulu
 

More from Tiina Partanen (11)

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 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 MOOC - jakso 2

  • 2. SisĂ€llys FUNKTIO 1. Funktio 2. Funktion mÀÀrittely 3. Funktion esittely 4. Funtion kutsuminen 5. Funktion testaaminen VinkkejĂ€ viikon palautustehtĂ€vÀÀn Debuggaus KOODIAAPINEN MOOC - SYKSY 2015 EHTOLAUSEET 1. Totuusarvot 2. Vertailuoperaattorit 3. Predikaatit 4. Ehtolause 5. Ehtolause funktion sisĂ€llĂ€
  • 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. 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
  • 19. Totuusarvot (true/false) - tosi #true, true #t, #T 19 true false - epĂ€tosi #false, false #f, #F
  • 20. Vertailuoperaattorit Vertailuoperaattorit palauttavat totuusarvon YleensĂ€ vain samantyyppisiĂ€ arvoja kannattaa verrata keskenÀÀn, siksi nĂ€mĂ€ funktiot tarkistavat myös sen, ettĂ€ argumentit ovat oikean tyyppisiĂ€: ◩ Vertailuoperaattorit luvuille: <, >, <=, >=, = ◩ Merkkijonoille: string=? ◩ Kuville: image=? esim. (< 4 5)  #true (= 4 -4)  #false (string=? ”kissa1” ”kissa1”)  #true 20
  • 21. Predikaatit Funktioita, jotka palauttavat totuusarvon kutsutaan predikaateiksi. Racket-kielessĂ€ niiden nimessĂ€ on usein kysymysmerkki esim. (number? 4)  #true (string? 4)  #false (even? 2)  #true (zero? 3)  #false (positive? -3)  #false 21 ?
  • 22. Ehtolause (if) 22 (if (< a 100) ”a on pienempi kuin 100” ”a on yhtĂ€suuri tai suurempi kuin 100”)
  • 23. Ehtolause funktion sisĂ€llĂ€ Ehtolause sijaitsee normaalisti funktion sisĂ€llĂ€, jolloin tutkitaan saatuja parametrien arvoja: esim. (define (termostaatti lĂ€mpötila) (if (< lĂ€mpötila 22) ”kĂ€ynnistĂ€ lĂ€mmitin” ”sammuta lĂ€mmitin”))) 23 22°C
  • 24. SisĂ€kkĂ€iset ehtolauseet Ehtolauseen sisĂ€llĂ€ voi olla toinen ehtolause: esim. (define (termostaatti lĂ€mpötila) (if (number? lĂ€mpötila) (if (< lĂ€mpötila 22) ”kĂ€ynnistĂ€ lĂ€mmitin” ”sammuta lĂ€mmitin”) ”lĂ€mpötilasensori on viallinen”)) 24 sisempi ehtolause on ulomman ehtolauseen ”tosihaara”
  • 25. Robottiauto funktio ehtolauseella 1) Esittely ;; robottiauto : VĂ€ri -> Merkkijono 2) MÀÀrittely (define (robottiauto valo) (if (string=? valo ”green”) ”aja” ”pysĂ€hdy”) 3) Testaus (check-expect (robottiauto ”red”) ”pysĂ€hdy”)) (check-expect (robottiauto ”green”) ”pysĂ€hdy”)) 25
  • 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
  • 30. Racket DEBUGGAUS Palaa tĂ€hĂ€n kohtaan, kun törmÀÀt virheilmoituksiin!
  • 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”.