racket mooc - jakso 3

23
Racket 3. JAKSO

Upload: tiina-partanen

Post on 22-Jan-2017

1.802 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Racket MOOC - jakso 3

Racket 3. JAKSO

Page 2: Racket MOOC - jakso 3

KOODIAAPINEN MOOC - SYKSY 2015

Sisällys FUNKTIOT JA LOGIIKKA

1. Funktion suunnitteluportaat

2. Funktio, joka palauttaa likiarvon

3. Boolean operaattorit

4. Valintalause

Vinkkejä viikon palautustehtävään

INTERAKTIIVISET OHJELMAT

1. 2htdp/universe

2. animate (Kuva-animaatio)

3. big-bang (Ufo-animaatio)

4. big-bang (Piilokuva)

Page 3: Racket MOOC - jakso 3

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.

Page 4: Racket MOOC - jakso 3

4

Suunnittele 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 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 testit painamalla ”run”. Jos testit toimivat ne ilmoittavat, että funktiossa on vikaa, ja juuri näin pitäisikin käydä, koska käytössä on vasta tyhmä ”stub”.

4. toteutus: kirjoita nyt funktiosi toteutus eli korvaa ”tyhmä” paluuarvo järkevällä koodilla, käytä apunasi esimerkkejä. Usein esimerkin koodin voi kopioida suoraan funktion toteutukseksi sijoittamalla muuttujien (parametrien) nimet oikeille kohdille. Testaa funktiosi painamalla ”run” -> testien pitäisi mennä läpi, jos funktio on koodattu oikein.

komm

enttejaajettavaa koodia

Page 5: Racket MOOC - jakso 3

5

Funktio, joka palauttaa likiarvon

ARGUMENTIT

40

PALUUARVO

10

h

r

MUUTTUJAT(PARAMETRIT)

π 12566,370614359172953850573533118

Page 6: Racket MOOC - jakso 3

6

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) ; stub

3) Selvitetään esimerkkien (testien) 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))))

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.

Page 7: Racket MOOC - jakso 3

7

Boolean operaattoreilla voi yhdistellä ehtoja

◦ Kaikkien ehtojen tulee olla totta: and◦ Vähintään yhden ehdon tulee olla totta: or◦ Kääntää ehdon vastakkaiseksi: not

Boolean operaattorit (and, or, not)

Page 8: Racket MOOC - jakso 3

8

and kaikkien ehtojen tulee toteutua

(and #true #true) #true (and #true #false) #false (and #false #true) #false

Esim.

Jos funktiota kutsuu väärän tyyppisellä argumentilla, tulee virhe. Siksi on hyvä tutkia ENNEN funktion kutsumista, että argumentit ovat ok.

(define (pinta-ala a b)

(if (and (number? a)(number? b))

(* a b)

”Virhe: anna lukuja”))

Page 9: Racket MOOC - jakso 3

9

orvähintään yhden ehdon on toteuduttava

(or #true #false) #true (or #false #true) #true (or #false #false) #false

Esim.

Joskus ”oikeita” vastauksia on useampi, silloin ehdot yhdisteään käyttämällä or:ia.

(define (pohjoismaa? maa) (or (string=? maa ”Suomi”) (string=? maa ”Norja”) (string=? maa ”Ruotsi”) (string=? maa ”Tanska”) (string=? maa ”Islanti”))

Page 10: Racket MOOC - jakso 3

10

notkääntää ehdon vastakkaiseksi

(not #true) #false(not #false) #true

Esim. Joskus tarvitaan ehdon vastakohtaa

(define (nollastapoikkeva? luku) (not (zero? luku))

A B (and A B) (or A B) (not A)#T #T #T #T #F

#T #F #F #T #F

#F #F #F #F #T

Page 11: Racket MOOC - jakso 3

11

valintalause (cond) Jos ehtolauseita tulee kovin monta sisäkkäin, niiden lukeminen ja ohjelmointi on sekavaa. Valintalauseeseen voi laittaa niin monta ehtoa kuin haluaa ja viimeinen else-haara suoritetaan jos mikään muu ehto ei toteutunut.

Esim.

Koska bussilipun hinta (€) määräytyy iän mukaan ehtoja on olta monta.

(define (bussilipun-hinta ikä) (cond [(>= ikä 18) 3]

[(< 12 ikä 18) 2] [(<= 7 ikä 12) 1]

[else 0]))

Page 12: Racket MOOC - jakso 3

12

Interaktiivisia sovelluksia

Jotta voimme tehdä interaktiivisia sovelluksia, joita käyttäjä ohjaa hiirellä tai näppäimistöllä tai joka reagoi tietokoneen sisäiseen kelloon, meillä pitää olla käytössä message loop, joka toimii ”liimana” oman koodimme ja tietokoneen laitteiston välillä. Racket:issä sen nimi on big-bang.

Interaktiiviset ohjelmat vaativat kirjaston 2htdp/universe

(require 2htdp/universe)

Page 13: Racket MOOC - jakso 3

big-bang pyörittää ohjelmaa

13

big-bang

(on-mouse ..)

(on-key ..)

(on-tick ..)

(to-draw ..)

Näillä ”liimataan”oma koodi big-bang:iin

ohjelman tilamuuttuja

Page 14: Racket MOOC - jakso 3

14

2htdp/universe Kirjasto sisältää big-bang:in lisäksi animate-funktion, jonka avulla voidaan tehdä yksinkertaisia animaatioita.

Racket perusteet tehtävissä otamme valmiin ohjelmapohjan, jossa big-bang tai animate on alustettu valmiiksi, joten emme käsittele niitä tässä yhteydessä kovin tarkasti (lisätietoa käsikirjassa).

Tärkeintä on ymmärtää se, että big-bang kutsuu käyttäjän tekemiä funktioita tarvittaessa, antaa niille ohjelman tilamuuttujan, ottaa vastaan päivitetyn tilamuuttujan, pitää sen tallessa ja välittää sen muille funktioille. Tilamuuttuja on eri ohjelmissa erilainen, riippuen ohjelman tarpeista.

Page 15: Racket MOOC - jakso 3

15

animate(aika muuttujana)

animate – funktio kutsuu siihen ”liimattua” funktiota 28 kertaa sekunnissa antaen argumenttina kokonaisluvun, joka kasvaa jokaisella kutsukerralla yhdellä

Esim.

(animate kuva)

Kutsuu kuva-funktiota näin:(kuva 0)(kuva 1)(kuva 2)(kuva 3) ...

(define (kuva t) (place-image

(circle t ”solid” ”red”) 150 150

(empty-scene 300 300)))

”liima” oma koodi

Page 16: Racket MOOC - jakso 3

16

modulo Animaatioissa on usein jakso, joka toistuu. Aika kulkee kuitenkin aina eteenpäin, joten jos haluamme palata takaisin lähtöpisteeseen (aika = 0) tarvitsemme modulo:a. Modulo ottaa osamäärän jakojäännöksen, eli rajoittaa arvon tietylle välille.

Esim.

Lisätään apufunktio ”rullaava-kuva”:

(define (rullaava-kuva t) (kuva (modulo t 220)))

(animate rullaava-kuva) animate:ssa tilamuuttujana on aika

Page 17: Racket MOOC - jakso 3

17

place-image ja empty-scene

(place-image 150 250 (empty-scene 300 500)))

(0, 0)

(150, 250)

x

y

150

250

Page 18: Racket MOOC - jakso 3

(0, 0)

(150, 50)

x

y

150

250

(0, 0)

(150, 250)

x

y

150

250

(0, 0)

(150, 450)

x

y

150

250

Kun y muuttuu, ufo liikkuu...

y=50 y=250 y=450

Page 19: Racket MOOC - jakso 3

19

big-bang(animaatio)

(require 2htdp/image) (require 2htdp/universe)   (define UFO (overlay/xy  (ellipse 120 40 "solid" "violet")      30 -25      (circle 30 "outline" "black")))

(define (piirrä-kuva y)   (place-image UFO 150 y (empty-scene 300 500)))

(define (siirrä-ufo y) (+ y 1))

(big-bang 0           (to-draw piirrä-kuva)           (on-tick siirrä-ufo))

Enemmän mahdollisuuksia, kuntilamuuttujana voi olla muukin kuin aika

lähtötila, y=0siirrä-ufo-funktiota kutsutaan 28 kertaa sekunnissa

Page 20: Racket MOOC - jakso 3

20

ufo rullaa(muutetaan y:tä)

Lisää ehtolause tai valintalause ufon y-koordinaatin päivittämiselle: (define (siirrä-ufo y) (if (< y 500) (+ y 1) 0))

tilamuuttujana y

piirrä-kuva – funktio tuottaa tämän kuvan

siirrä-ufo – funktio päivittää y:tä

big-bang hoitaa kaiken muun

Page 21: Racket MOOC - jakso 3

21

big-bang(hiiriohjelma)

Saamme ”liimakoodin” kautta x ja y koordinaatit, jossa hiiri on tai jossa sitä on klikattu. Tämän perusteella voidaan muuttaa ohjelman toimintaa.

Ohjelman logiikka on ”hiiri” – funktiossa:

(define (hiiri k x y tapahtuma)

(if (< x 150)

(place-image (oma-kuva "black") x y k)

(place-image (oma-kuva "red") x y k)))

(big-bang KUVA

(to-draw piirrä)

(on-mouse hiiri))tilamuuttujana on nyt kuva

Page 22: Racket MOOC - jakso 3

KOODIAAPINEN MOOC - SYKSY 2015

Sanasto Koodarin käsikirjasta löytyy sanasto

Käytä sitä hyväksesi kun törmäät sinulle uuteen termiin. Kolmannen jakson uudet termit:

BOOLEAN OPERAATTORI

VALINTALAUSE

FUNKTION SUUNNITTELUPORTAAT

Page 23: Racket MOOC - jakso 3

KOODIAAPINEN MOOC - SYKSY 2015

Vinkkejä viikkotehtävään

Voit tehdä joko animaation tai piilokuvan (hiirellä toimiva sovellus). Ota mallia esimerkkiratkaisuista ja keksi oma versiosi niistä.