racket mooc - jakso 6

19
Racket 6. JAKSO

Upload: tiina-partanen

Post on 23-Jan-2018

1.264 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Racket MOOC -  jakso 6

Racket

6. JAKSO

Page 2: Racket MOOC -  jakso 6

Racket TurtleListojen, rekursion sekä Higher Order -funktioiden opetteluun kehitetty kirjasto

(require teachpacks/racket-turtle)

Vaatii teachpacks – paketin asentamisen (WeSchemessä eri nimi!)

Tarjoaa helpon tavan kokeilla toistoa (repeat)

Sisältää peilauksen sekä laimasintoiminnon

2

Page 3: Racket MOOC -  jakso 6

1. Racket-turtle ja listatTurtlea ohjataan komentolistoilla, jotka annetaan ”draw” tai ”draw-step-by-step”-funktioille

Komentolista on muotoa (list (…)(…)(…))

Racket-turtlen peruskomennot ovat: ◦ forward

◦ turn-left,turn-right

◦ repeat

◦ pen-up, pen-down

◦ go-to

◦ change-color

3

Page 4: Racket MOOC -  jakso 6

forward & turn-left(define neliö

(list (forward 100)

(turn-left 90)

(forward 100)

(turn-left 90)

(forward 100)

(turn-left 90)

(forward 100)

(turn-left 90)))

(draw neliö )

4

Page 5: Racket MOOC -  jakso 6

(define sivu

(list (forward 100)

(turn-left 90))

(define toisto-neliö

(repeat 4 sivu ))

(draw toisto-neliö)

repeat

5

sivu

Page 6: Racket MOOC -  jakso 6

pen-up, pen-down, go-to, change-color(define kaksi-neliötä

(list neliö

(pen-up)

(go-to 350 50)

(change-color "red")

(pen-down)

neliö))

(draw kaksi-neliötä)

6

Page 7: Racket MOOC -  jakso 6

Peruskuvioita Racket Turtlella

Ympyrä on monikulmio, jossa on hyvin lyhyet sivut ja erittäin monta kulmaa. Montako?

7

Page 8: Racket MOOC -  jakso 6

Kukkia Racket TurtlellaKukan terälehti muodostuu kaaresta, joka on ympyrän osa...

8

Page 9: Racket MOOC -  jakso 6

2. Muuttujat ja funktiotTurtle – komentolistoja voi muodostaa myös funktioiden avulla. Voimme tehdä erikokoisia ja värisiä kolmioita tekevän komentolistan muodostavan funktion: tee-kolmio. Muuttujat (parametrit) olisivat sivu ja väri.

Esim. (tee-kolmio 100 ”red”) palauttaisi komentolistan, joka toteuttaa tämän kuvan:

9

Page 10: Racket MOOC -  jakso 6

tee-kolmio(define (tee-sivu sivu kulma väri)

(list (change-color väri)

(forward sivu)

(turn-left kulma)))

(define (tee-kolmio sivu väri)

(repeat 3 (tee-sivu sivu 120 väri)))

(draw (tee-kolmio 100 ”red”))

10

apufunktio

Page 11: Racket MOOC -  jakso 6

Monikulmiot funktion avullaVoit tehdä edellisen harjoituksen myös funktioiden avulla (kulmien määrä on nyt parametrina)

(define (tee-monikulmio sivu kulmat väri)

… )

Vihje 1: käytä apuna tee-sivu –apufunktiota

Vihje 2: koko kuviossa pitää kääntyä yhteensä 360°

11

Page 12: Racket MOOC -  jakso 6

Higher Order FunktiotJos tehtävänä on tehdä ennalta tiedetty määrä toistoja, voidaan käyttää Higher Order – funktioita toiston toteuttamiseen.

Higher Order – funktiot ovat funktioita, jotka voivat ottaa toisen funktion argumenttina (tavalliset funktiot ovat First Order – funktioita).

Racket:in Higer Order – funktiot käsittelevät tietota listojen muodossa. Higher Order – funktioita ovat mm. map, apply, filter, foldl, foldr ja quicksort

12

Page 13: Racket MOOC -  jakso 6

mapmap on Higher Order – funktio, joka ottaa argumenttina funktion sekä

listan ja syöttää listan alkiot yksi kerrallaan funktiolle. map palauttaa saadut paluuarvot listan muodossa. Esim. neliö-funktio (sqr)

(map sqr (list 1 2 3 4 5)) -> (list 1 4 9 16 25)

map:ille on aivan sama mitä funktio tekee ja mitä listassa on. Voimme esim. tehdä listan tähtikuvia. Teemme ensin apufunktion tähti, jolla on yksi parametri (koko):

(define (tähti koko)

(star koko ”solid” ”red”))

(map tähti (list 5 10 15 20 25 30))

->

13

Listassa tähtien koot

Page 14: Racket MOOC -  jakso 6

applyapply ottaa argumenttina funktion sekä listan arvoja, jotka syötetään ko. funktiolle argumenteiksi. Apply palauttaa yhden arvon (ei listaa). Esim. voisimme laskea yhteen listan alkiot:

(apply + (list 1 2 3 4 5 6 7)) -> 28

Myös tämä funktio voi käsitellä mitä tahansa arvoja esim. kuvia. Voimme esim. tehdä sisäkkäisiä ympyröitä. Teemme ensin apufunktio ”ympyrä”:n avulla listan eri kokoisia ympyröitä ja sitten laitamme ne päällekkäin käyttämällä apply:ä ja overlay:tä:

(define (ympyrä koko)

(circle koko ”outline” ”black”))

(map ympyrä (list 5 10 15 20 25 30)) ->

(apply overlay

(map ympyrä (list 5 10 15 20 25 30))) ->

14

Page 15: Racket MOOC -  jakso 6

foldl, foldrfoldl ja foldr toimivat myös funktioille, joilla on rajattu määrä argumentteja (vrt. + ja overlay ottavat sisäänsä niin monta argumenttia kuin halutaan antaa). Tässä esimerkki, jossa place-image sijoittaa kuvan annettuun koordinaattipisteeseen (x, y) annetun kuvan päälle. Tässä x ja y koordinaatit sekä sijoitettavat kuvat voidaan antaa listoina (sama pituus) ja taustakuva toimii ns. pohja-arvona (vrt. akkumulaattori). Nämä funktiot palauttavat yhden arvon (ei listaa). Liitä-kuva toimii apufunktiona (hoitaa yhden kuvan).

(define SIJAINTI-X (list 122 48 20 15 104 112 99 100 148))

(define SIJAINTI-Y (list 132 17 20 53 82 51 132 31 101))

(define TÄHDET )

(define (liitä-kuva kuva x y pohja)

(place-image kuva x y pohja))

(foldl liitä-kuva (empty-scene 150 150 "black")

TÄHDET

SIJAINTI-X

SIJAINTI-Y)

15

”pohja-arvo”

Page 16: Racket MOOC -  jakso 6

Turtle jatko –tehtävät (1)Kuvan spiraalin voi tehdä kahdella eri tavalla

A) Rekursiivinen ratkaisu

(define (sivu s)

(list (forward s) (turn-left 90)))

(define (spiraali matka max)

(if (>= matka max)

empty

(cons (sivu matka) (spiraali (+ matka 5) max))))

(draw (spiraali 5 300))

16

Page 17: Racket MOOC -  jakso 6

Turtle jatko –tehtävät (2)B) Ratkaisu Higher Order – funktioiden avulla

(define (sivu s)

(list (forward s) (turn-left 90)))

(define SPIRAALI (map sivu (range 5 300 5)))

(draw SPIRAALI)

17

Page 18: Racket MOOC -  jakso 6

Vinkkejä viikkotehtävään (1)Tärkeintä tällä viikolla on leikkiä, kokeilla, ihmetellä ja pitää hauskaa. Leiki väreillä ja muodoilla.

Voit tehdä kuviotaidetta joko Racket Turtle:lla ja/tai 2htdp/image-kirjaston ja map/apply/foldl/foldr/range –avulla. Voit tehdä myös niin, että teet ensin taustakuvan 2htdp/image-kirjaston avulla ja asetat sen Racket Turtlen taustakuvaksi ja piirrät vielä Turtle-juttuja sen päälle. Ole luova!

18

Page 19: Racket MOOC -  jakso 6

Vinkkejä viikkotehtävään (2)

19

Tässä on ensin tehty 2htdp/imagella kuva ja piirretty Turtlella viivoja päälle (taustakuva on toteutettu laittamalla random kohtiin random kokoisia ja värisiä laatioita rekursion avulla).

Muista, että Turtle kuvan taustavärin voi vaihtaa, kynän voi nostaa ja käyttää leimasinta, leimasin voi olla lista kuvia (vaikkapa random värisiä ja random kokoisia ympyröitä kuten tässä).

Vain mielikuvitus on rajana!