SlideShare a Scribd company logo
1 of 10
Racket
5. JAKSO
Sisällysluettelo
6A. LISTA
1. Lista: list, cons, first, rest, append, length, empty?
2. Lista: member?, remove, remove-all, list-ref
3. range
6B. LISTA JA REKURSIO
4. Listan ”syöminen” rekursiivisesti
5. Listan luominen rekursiivisesti
2
Lista
list, cons, first, rest
Lista on tietorakenne, johon voi tallentaa mitä tahansa tietoa. Tyhjään listaan
viitataan Racket-kielessä sanalla empty tai symbolilla ’().
Listan luominen:
(list 1 2 3 4 5 6)
Uuden alkion lisääminen valmiiseen listaan (lisätään aina alkuun):
(cons 7 (list 1 2 3 4 5 6)) -> (list 7 1 2 3 4 5 6)
Listan ensimmäisen alkion palauttaminen (myös second, third):
(first (list 7 1 2 3 4 5 6)) -> 7
Listan loppuosan palauttaminen (esimmäinen alkio poistetaan).
(rest (list 7 1 2 3 4 5 6)) -> (list 1 2 3 4 5 6)
3
Lista
append, length, empty?
Listojen yhdistäminen
(append (list 1 2 3)(list 4 5 6))-> (list 1 2 3 4 5 6)
Listan pituuden kysyminen
(length (list 1 2 3 4)) -> 4
Tyhjän listan tunnistaminen
(empty? ’()) -> #true
(empty? (list 1 2)) -> #false
Listassa voi olla mitä tahansa (merkkijonoja, kuvia, listoja, totuusarvoja...):
(list 3 ”Tiina” (list 1 2 3) #t)
4
Lista
member?, remove, remove-all, list-ref
Voit tutkia onko alkio listan jäsen
(member? 3 (list 4 5 6))-> #false
Voit poistaa alkion listasta
(remove 4 (list 1 2 3 4)) -> (list 1 2 3)
Voit poistaa kaikki tietyt alkiot
(remove-all 2 (list 1 2 3 2 4) -> (list 1 3 4)
Ottaa listasta tietyssä kohtaa sijaitsevan alkion (ensimmäinen alkio 0)
(list-ref (list 10 20 30) 1) -> 20
5
Listan ”syöminen” rekursiivisesti
Silmukkarakennetta voidaan käyttään esim. lista- tai puutyyppisen tietorakenteen
läpi käymiseen. Silloin ei tarvita laskuria, koska silmukan toiminta voidaan lopettaa
kun tietorakenne on käyty loppuu (esim. saavutettu listan pää).
Esim. Luetellaan ruokalista
(require teachpacks/display-read)
(define (syö-listaa lista)
(if (empty? lista)
(display-info-timer "Lista loppui” 50)
(begin (display-info-timer (first lista) 50)
(syö-listaa (rest lista)))))
(syö-listaa (list "cokis" "ranskalaiset" "jäätelö"))
6
Listan luominen rekursiivisesti
(listaan kerätään kuvia)
Lista voi olla myös akkumulaattorin paikalla, eli voit kerätä tuloksia listaan.
(require 2htdp/image)
(define (tähtiä i lista)
(if (<= i 0)
lista
(tähtiä (sub1 i)(cons (star (* i 10) "solid" "aqua") lista))))
(tähtiä 8 empty)
7
uusi tähti
lisää uuden alkion listaan
Kysytään käyttäjältä lukupareja
(kerätään listaksi)
(define (kysy-mitat n lista)
(let [(x (display-read-number "Anna x"))
(y (display-read-number "Anna y"))]
(cond [(not (or (number? x) (number? y)))
(kysy-mitat n lista)]
[(<= n 1)
(cons (list x y) lista)]
[else
(kysy-mitat (sub1 n) (cons (list x y) lista))])))
(kysy-mitat 5 empty)
8
akkumulaattori
lopetusehto
Listoja hyödyntävät
interaktiiviset ohjelmat
Tunnistuspeli ja valintapeli
Kysymykset ja vastaukset kerätään listaksi, jota käydään läpi rekursiivisen silmukan avulla.
(define KYSYMYKSET (list (list OMENA-KYSYMYS "omena")
(list PAPRIKA-KYSYMYS "paprika")))
;; pelaa : Lista Luku -> Luku
(define (pelaa peli pisteet)
(if (empty? peli)
(display-value "Sait pisteitä:" pisteet)
(if (oikein? (first peli) (display-read (first (first peli))))
(begin (display-info "Oikein")
(pelaa (rest peli) (add1 pisteet)))
(begin (display-info "Väärin")
(pelaa (rest peli) pisteet)))))
;; käynnistää pelin (alussa pisteitä 0)
(pelaa KYSYMYKSET 0)
KOODIAAPINEN MOOC - SYKSY 2015
Vinkkejä palautettavaan
jaksotehtävään
Voit tehdä oman versiosi tunnistus- tai valintapelistä. Voit käyttää
malliratkaisuja pohjana omalle pelillesi. Voit myös halutessasi soveltaa
listatietojasi vasta jaksolla 6. Turtle grafiikan parissa (jaksot 5. ja 6.
käsittelevät molemmat listoja).
Jotta muutkin kurssilaiset pääsevät pelaamaan peliäsi, jaa se
WeSchemen kautta!
KOODIAAPINEN MOOC - SYKSY 2015

More Related Content

What's hot (7)

Racket mooc - viikko 2
Racket mooc - viikko 2Racket mooc - viikko 2
Racket mooc - viikko 2
 
Racket MOOC - jakso 2
Racket MOOC - jakso 2Racket MOOC - jakso 2
Racket MOOC - jakso 2
 
Racket perusteet 3. Funktio
Racket perusteet 3. FunktioRacket perusteet 3. Funktio
Racket perusteet 3. Funktio
 
Racket perusteet - Sovellukset A
Racket perusteet - Sovellukset ARacket perusteet - Sovellukset A
Racket perusteet - Sovellukset A
 
Racket MOOC - viikko 3
Racket MOOC - viikko 3Racket MOOC - viikko 3
Racket MOOC - viikko 3
 
Ohjelmointi yläkoulussa: Jatkokurssi
Ohjelmointi yläkoulussa: JatkokurssiOhjelmointi yläkoulussa: Jatkokurssi
Ohjelmointi yläkoulussa: Jatkokurssi
 
Racket MOOC - 1. viikko
Racket MOOC - 1. viikkoRacket MOOC - 1. viikko
Racket MOOC - 1. viikko
 

More from Tiina Partanen

More from Tiina Partanen (16)

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
 
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 materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)Racket materiaali (Koodausta kouluun - projekti)
Racket materiaali (Koodausta kouluun - projekti)
 
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 jakso 7
Racket MOOC jakso 7Racket MOOC jakso 7
Racket MOOC jakso 7
 
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
 
Koodiaapinen MOOC - Racket
Koodiaapinen MOOC - RacketKoodiaapinen MOOC - Racket
Koodiaapinen MOOC - Racket
 

Racket MOOC - jakso 5

  • 2. Sisällysluettelo 6A. LISTA 1. Lista: list, cons, first, rest, append, length, empty? 2. Lista: member?, remove, remove-all, list-ref 3. range 6B. LISTA JA REKURSIO 4. Listan ”syöminen” rekursiivisesti 5. Listan luominen rekursiivisesti 2
  • 3. Lista list, cons, first, rest Lista on tietorakenne, johon voi tallentaa mitä tahansa tietoa. Tyhjään listaan viitataan Racket-kielessä sanalla empty tai symbolilla ’(). Listan luominen: (list 1 2 3 4 5 6) Uuden alkion lisääminen valmiiseen listaan (lisätään aina alkuun): (cons 7 (list 1 2 3 4 5 6)) -> (list 7 1 2 3 4 5 6) Listan ensimmäisen alkion palauttaminen (myös second, third): (first (list 7 1 2 3 4 5 6)) -> 7 Listan loppuosan palauttaminen (esimmäinen alkio poistetaan). (rest (list 7 1 2 3 4 5 6)) -> (list 1 2 3 4 5 6) 3
  • 4. Lista append, length, empty? Listojen yhdistäminen (append (list 1 2 3)(list 4 5 6))-> (list 1 2 3 4 5 6) Listan pituuden kysyminen (length (list 1 2 3 4)) -> 4 Tyhjän listan tunnistaminen (empty? ’()) -> #true (empty? (list 1 2)) -> #false Listassa voi olla mitä tahansa (merkkijonoja, kuvia, listoja, totuusarvoja...): (list 3 ”Tiina” (list 1 2 3) #t) 4
  • 5. Lista member?, remove, remove-all, list-ref Voit tutkia onko alkio listan jäsen (member? 3 (list 4 5 6))-> #false Voit poistaa alkion listasta (remove 4 (list 1 2 3 4)) -> (list 1 2 3) Voit poistaa kaikki tietyt alkiot (remove-all 2 (list 1 2 3 2 4) -> (list 1 3 4) Ottaa listasta tietyssä kohtaa sijaitsevan alkion (ensimmäinen alkio 0) (list-ref (list 10 20 30) 1) -> 20 5
  • 6. Listan ”syöminen” rekursiivisesti Silmukkarakennetta voidaan käyttään esim. lista- tai puutyyppisen tietorakenteen läpi käymiseen. Silloin ei tarvita laskuria, koska silmukan toiminta voidaan lopettaa kun tietorakenne on käyty loppuu (esim. saavutettu listan pää). Esim. Luetellaan ruokalista (require teachpacks/display-read) (define (syö-listaa lista) (if (empty? lista) (display-info-timer "Lista loppui” 50) (begin (display-info-timer (first lista) 50) (syö-listaa (rest lista))))) (syö-listaa (list "cokis" "ranskalaiset" "jäätelö")) 6
  • 7. Listan luominen rekursiivisesti (listaan kerätään kuvia) Lista voi olla myös akkumulaattorin paikalla, eli voit kerätä tuloksia listaan. (require 2htdp/image) (define (tähtiä i lista) (if (<= i 0) lista (tähtiä (sub1 i)(cons (star (* i 10) "solid" "aqua") lista)))) (tähtiä 8 empty) 7 uusi tähti lisää uuden alkion listaan
  • 8. Kysytään käyttäjältä lukupareja (kerätään listaksi) (define (kysy-mitat n lista) (let [(x (display-read-number "Anna x")) (y (display-read-number "Anna y"))] (cond [(not (or (number? x) (number? y))) (kysy-mitat n lista)] [(<= n 1) (cons (list x y) lista)] [else (kysy-mitat (sub1 n) (cons (list x y) lista))]))) (kysy-mitat 5 empty) 8 akkumulaattori lopetusehto
  • 9. Listoja hyödyntävät interaktiiviset ohjelmat Tunnistuspeli ja valintapeli Kysymykset ja vastaukset kerätään listaksi, jota käydään läpi rekursiivisen silmukan avulla. (define KYSYMYKSET (list (list OMENA-KYSYMYS "omena") (list PAPRIKA-KYSYMYS "paprika"))) ;; pelaa : Lista Luku -> Luku (define (pelaa peli pisteet) (if (empty? peli) (display-value "Sait pisteitä:" pisteet) (if (oikein? (first peli) (display-read (first (first peli)))) (begin (display-info "Oikein") (pelaa (rest peli) (add1 pisteet))) (begin (display-info "Väärin") (pelaa (rest peli) pisteet))))) ;; käynnistää pelin (alussa pisteitä 0) (pelaa KYSYMYKSET 0) KOODIAAPINEN MOOC - SYKSY 2015
  • 10. Vinkkejä palautettavaan jaksotehtävään Voit tehdä oman versiosi tunnistus- tai valintapelistä. Voit käyttää malliratkaisuja pohjana omalle pelillesi. Voit myös halutessasi soveltaa listatietojasi vasta jaksolla 6. Turtle grafiikan parissa (jaksot 5. ja 6. käsittelevät molemmat listoja). Jotta muutkin kurssilaiset pääsevät pelaamaan peliäsi, jaa se WeSchemen kautta! KOODIAAPINEN MOOC - SYKSY 2015