racket mooc - jakso 2

40
Racket 2. JAKSO

Upload: tiina-partanen

Post on 23-Jan-2018

3.513 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Racket MOOC - jakso 2

Racket

2. JAKSO

Page 2: Racket MOOC - jakso 2

SisällysFUNKTIO

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ä

Page 3: Racket MOOC - jakso 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

Page 4: Racket MOOC - jakso 2

Funktio

4

Kirjoita kerran,kutsu useasti.

Page 5: Racket MOOC - jakso 2

Funktio muuttaa syötteet (argumentit) paluuarvoksi

5

funktio

ARGUMENTIT

100

”solid”

”red”

PALUUARVO

Page 6: Racket MOOC - jakso 2

Funktion käsite tulee matematiikasta

KOODIAAPINEN MOOC - SYKSY 2015

MÄÄRITTELYJOUKKO ARVOJOUKKO

3 9neliö-funktio

-3

Funktio toimii aina samalla tavalla samalle syötteelle.

neliö : Luku -> Luku

𝑓 𝑥 = 𝑥2

Page 7: Racket MOOC - jakso 2

Esimerkkiympyrä-funktio

7

ympyräfunktio

ARGUMENTIT

100

”black”

PALUUARVO

ympyrä : Luku Väri -> Kuva

Page 8: Racket MOOC - jakso 2

Funktio, joka palauttaa kuvan

8

ARGUMENTIT

100

PALUUARVO

”black”

r

väri

MUUTTUJAT(PARAMETRIT)

(𝑐𝑖𝑟𝑐𝑙𝑒 𝑟 "solid" 𝑣ä𝑟𝑖)

Page 9: Racket MOOC - jakso 2

Funktion määrittely

9

(define (ympyrä r väri)

(circle r ”solid” väri))

Page 10: Racket MOOC - jakso 2

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

Page 11: Racket MOOC - jakso 2

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

Page 12: Racket MOOC - jakso 2

Esimerkki : risti-funktio1) 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

Page 13: Racket MOOC - jakso 2

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)

Page 14: Racket MOOC - jakso 2

Funktion testaaminenKoska 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

Page 15: Racket MOOC - jakso 2

Funktio, joka palauttaa luvun

15

ARGUMENTIT

400

PALUUARVO

25

10 000

x

y

MUUTTUJAT(PARAMETRIT)

𝑎 ∙ 𝑏

Page 16: Racket MOOC - jakso 2

Esimerkki: pinta-ala-funktio1) 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

Page 17: Racket MOOC - jakso 2

Kirjoita oma funktio0. 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

kom

me

ntteja

ajettavaa koo

dia

Page 18: Racket MOOC - jakso 2

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

Page 19: Racket MOOC - jakso 2

Totuusarvot (true/false)

- tosi#true, true

#t, #T

19

true false

- epätosi#false, false

#f, #F

Page 20: Racket MOOC - jakso 2

VertailuoperaattoritVertailuoperaattorit 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

Page 21: Racket MOOC - jakso 2

PredikaatitFunktioita, 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

?

Page 22: Racket MOOC - jakso 2

Ehtolause (if)

22

(if (< a 100)

”a on pienempi kuin 100”

”a on yhtäsuuri tai suurempi kuin 100”)

Page 23: Racket MOOC - jakso 2

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

Page 24: Racket MOOC - jakso 2

Sisäkkäiset ehtolauseetEhtolauseen 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 onulomman ehtolauseen”tosihaara”

Page 25: Racket MOOC - jakso 2

Robottiautofunktio 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

Page 26: Racket MOOC - jakso 2

Älykäs-overlayfunktio ehtolauseella0) 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

Page 28: Racket MOOC - jakso 2

Funktio:0) Tarkoitus1) Esittely2) Määrittely3) 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.

Page 29: Racket MOOC - jakso 2

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

Page 30: Racket MOOC - jakso 2

Racket

DEBUGGAUSPalaa tähän kohtaan, kun törmäät virheilmoituksiin!

Page 31: Racket MOOC - jakso 2

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

Page 32: Racket MOOC - jakso 2

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

Page 33: Racket MOOC - jakso 2

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

Page 34: Racket MOOC - jakso 2

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

Page 35: Racket MOOC - jakso 2

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

Page 36: Racket MOOC - jakso 2

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

Page 37: Racket MOOC - jakso 2

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

Page 38: Racket MOOC - jakso 2

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

Page 39: Racket MOOC - jakso 2

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

Page 40: Racket MOOC - jakso 2

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