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

Racket MOOC - viikko 3
Racket MOOC - viikko 3Racket MOOC - viikko 3
Racket MOOC - viikko 3Tiina Partanen
 
Racket MOOC - 1. viikko
Racket MOOC - 1. viikkoRacket MOOC - 1. viikko
Racket MOOC - 1. viikkoTiina Partanen
 
Racket perusteet - Sovellukset A
Racket perusteet - Sovellukset ARacket perusteet - Sovellukset A
Racket perusteet - Sovellukset ATiina Partanen
 
Racket jatko 6. Listat
Racket jatko 6. ListatRacket jatko 6. Listat
Racket jatko 6. ListatTiina Partanen
 
Racket jatko 6. oppitunti
Racket jatko  6. oppituntiRacket jatko  6. oppitunti
Racket jatko 6. oppituntiTiina Partanen
 

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

Racket mooc 2017 - yleistä
Racket mooc 2017 -  yleistäRacket mooc 2017 -  yleistä
Racket mooc 2017 - yleistäTiina Partanen
 
Racket mooc 2017 - aikataulu
Racket mooc 2017 -  aikatauluRacket mooc 2017 -  aikataulu
Racket mooc 2017 - aikatauluTiina Partanen
 
Racket alkeet 1. Peruslaskut
Racket alkeet   1. PeruslaskutRacket alkeet   1. Peruslaskut
Racket alkeet 1. PeruslaskutTiina Partanen
 
Racket alkeet 2. Kuvat
Racket alkeet   2. KuvatRacket alkeet   2. Kuvat
Racket alkeet 2. KuvatTiina Partanen
 
Koodiaapinen MOOC - Racket
Koodiaapinen MOOC - RacketKoodiaapinen MOOC - Racket
Koodiaapinen MOOC - RacketTiina Partanen
 
Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)Tiina Partanen
 

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

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 MathematicsTiina Partanen
 
Ohjelmoinnin historiaa
Ohjelmoinnin historiaaOhjelmoinnin historiaa
Ohjelmoinnin historiaaTiina Partanen
 
Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)Racket MOOC 2016 aikataulu (SYKSY)
Racket MOOC 2016 aikataulu (SYKSY)Tiina Partanen
 
Koodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynoteKoodiaapinen MOOC - keynote
Koodiaapinen MOOC - keynoteTiina Partanen
 
Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)Racket MOOC 2016 - yleistä (SYKSY)
Racket MOOC 2016 - yleistä (SYKSY)Tiina Partanen
 
Koodauksen ensiaskeleet
Koodauksen ensiaskeleetKoodauksen ensiaskeleet
Koodauksen ensiaskeleetTiina Partanen
 
Racket MOOC - viikko 6
Racket MOOC - viikko 6Racket MOOC - viikko 6
Racket MOOC - viikko 6Tiina Partanen
 
Racket jatko 7. oppitunti
Racket jatko 7. oppituntiRacket jatko 7. oppitunti
Racket jatko 7. oppituntiTiina Partanen
 

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
 

Recently uploaded

Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24
Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24
Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24Matleena Laakso
 
Tekoäly ja oppiminen. Airut-hanke 23.4.24
Tekoäly ja oppiminen. Airut-hanke 23.4.24Tekoäly ja oppiminen. Airut-hanke 23.4.24
Tekoäly ja oppiminen. Airut-hanke 23.4.24Matleena Laakso
 
Tekoäly ja opinto-ohjaus, webinaari 26.4.24
Tekoäly ja opinto-ohjaus, webinaari 26.4.24Tekoäly ja opinto-ohjaus, webinaari 26.4.24
Tekoäly ja opinto-ohjaus, webinaari 26.4.24Matleena Laakso
 
Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24
Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24
Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24Matleena Laakso
 
Valkohäntäpeura (Odocoileus virginianus).pptx
Valkohäntäpeura (Odocoileus virginianus).pptxValkohäntäpeura (Odocoileus virginianus).pptx
Valkohäntäpeura (Odocoileus virginianus).pptxpurmonen8
 
Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24
Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24
Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24Matleena Laakso
 
Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24
Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24
Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24Matleena Laakso
 

Recently uploaded (8)

Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24
Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24
Tekoäly opetuksessa. Seinäjoen lyseo 24.4.24
 
Tekoäly ja oppiminen. Airut-hanke 23.4.24
Tekoäly ja oppiminen. Airut-hanke 23.4.24Tekoäly ja oppiminen. Airut-hanke 23.4.24
Tekoäly ja oppiminen. Airut-hanke 23.4.24
 
Tekoäly ja opinto-ohjaus, webinaari 26.4.24
Tekoäly ja opinto-ohjaus, webinaari 26.4.24Tekoäly ja opinto-ohjaus, webinaari 26.4.24
Tekoäly ja opinto-ohjaus, webinaari 26.4.24
 
Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24
Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24
Tekoäly opetuksessa, opettajien kevätpäivä 26.4.24
 
Koulutuksen palkat ja kustannukset sekä koulutuksen ansiot
Koulutuksen palkat ja kustannukset sekä koulutuksen ansiotKoulutuksen palkat ja kustannukset sekä koulutuksen ansiot
Koulutuksen palkat ja kustannukset sekä koulutuksen ansiot
 
Valkohäntäpeura (Odocoileus virginianus).pptx
Valkohäntäpeura (Odocoileus virginianus).pptxValkohäntäpeura (Odocoileus virginianus).pptx
Valkohäntäpeura (Odocoileus virginianus).pptx
 
Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24
Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24
Opettaja ja tekoäly. Pedaiiltapäivä 25.4.24
 
Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24
Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24
Tekoälyä koulunkäynninohjaajille. Jyty 27.4.24
 

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”.