Sisällys
FUNKTIOT JA LOGIIKKA
1. Funktion suunnitteluportaat
2. Funktio, joka palauttaa likiarvon
3. Boolean operaattorit
4. Valintalause
Vinkkejä viikon palautustehtävään
KOODIAAPINEN MOOC - SYKSY 2015
INTERAKTIIVISET OHJELMAT
1. 2htdp/universe
2. animate (Kuva-animaatio)
3. big-bang (Ufo-animaatio)
4. big-bang (Piilokuva)
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.
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.
4
kommenttejaajettavaakoodia
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))))
6
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.
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)
7
and
kaikkien ehtojen tulee toteutua
8
(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”))
or
vähintään yhden ehdon on toteuduttava
(or #true #false) #true
(or #false #true) #true
(or #false #false) #false
9
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”))
not
kääntää ehdon vastakkaiseksi
10
(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
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.
11
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]))
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)
12
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.
14
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)
...
15
(define (kuva t)
(place-image
(circle t ”solid” ”red”)
150 150
(empty-scene 300 300)))
”liima” oma koodi
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”:
16
(define (rullaava-kuva t)
(kuva (modulo t 220)))
(animate rullaava-kuva) animate:ssa tilamuuttujana on aika
(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
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))
19
Enemmän mahdollisuuksia, kun
tilamuuttujana voi olla muukin kuin aika
lähtötila, y=0
siirrä-ufo-funktiota kutsutaan
28 kertaa sekunnissa
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))
20
tilamuuttujana y
piirrä-kuva – funktio tuottaa tämän
kuvan
siirrä-ufo – funktio päivittää y:tä
big-bang hoitaa kaiken muun
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))
21
tilamuuttujana on
nyt kuva
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
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ä.
KOODIAAPINEN MOOC - SYKSY 2015