Upload
tiina-partanen
View
96
Download
3
Embed Size (px)
Citation preview
OHJELMOINTI YLÄKOULUSSA Jatkokurssi 1.11.2016
8. JA 9. LUOKAN OHJELMOINTIA
Seutukunnallinen OPS:
8lk
Oppilas oppii suunnittelemaan ja ohjelmoimaan algoritmin, jolla voidaan ratkaista jokin ongelma tai tehtävä, joka voi olla esim. animaatio tai peli.
9lk
Oppilas oppii käyttämään funktioita ja muuttujia ohjelmointitehtävissä.Oppilas osaa jakaa ongelman osaongelmiin, ratkaista ne ohjelmoimalla ja yhdistää osat yhdeksi ratkaisuksi.
ALGORITMI
Algoritmi on yksityiskohtainen kuvaus tai ohje siitä, miten tehtävä tai prosessi suoritetaan; jota seuraamalla voidaan ratkaista tietty ongelma.
Algoritmin avulla voi ratkaista samankaltaisia tehtäviä esim. jakolaskualgoritmin avulla voidaan jakaa mikä tahansa luku millä tahansa luvulla.
Niissä on usein haaratumia sekä toistoja.
SISÄLTÖ
1) Funktio
2) Ehto- ja valintalause
3) Toisto
Funktion määritteleminen
Funktion parametrit muuttujina
Funktion testaaminen
Pinta-alan laskeminen
• Monikulmiot
• Ympyrä ja sektori
Predikaatit, vertailuoperaattorit,
Boolean operaattorit, ehto- ja
valintalause
• Syötteen tarkistaminen
• Taksilaskut
• Pythagoraan käänteinen lause
Toistorakenne rekursion avulla
Toistorakenne Message Loopin
ja Callback -funktioiden avulla
• Laskuautomaatti
• Myyrä – peli
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
Kirjoita kerran,
kutsu useasti.
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
FUNKTIO MUUTTAA SYÖTTEET (ARGUMENTIT) PALUUARVOKSI
7
ARGUMENTIT
100
PALUUARVO
”black”
r
väri
MUUTTUJAT
(PARAMETRIT)
(𝑐𝑖𝑟𝑐𝑙𝑒 𝑟 "solid" 𝑣ä𝑟𝑖)
FUNKTION MÄÄRITTELY
8
(define (ympyrä r väri)
(circle r ”solid” väri))
FUNKTION ESITTELY(KOMMENTTIRIVILLÄ)
9
; 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
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)
10
funktiokutsu
odotusarvo
KIRJOITA 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 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
11
kom
mentte
jaa
jetta
vaa
kood
ia
HARJOITUKSET: FUNKTIOT
1) Monikulmioiden pinta-alat (neliö, suorakulmio, kolmio)
2) Ympyrän ja sektorin pinta-alat (ympyrä ja sektori, apufunktio)
Huom! Likiarvojen testaaminen check-within – funktiolla, kolmas parametri on tarkkuus
3) Funktion testaaminen (automaattisesti):
(check-within (ympyrän-pinta-ala 50)
7853.9816
0.001)
funktiokutsu
odotusarvo
tarkkuus
TOTUUSARVOT (TRUE/FALSE)
- tosi
#true, true
#t, #T
13
true false
- epätosi
#false, false
#f, #F
VERTAILUOPERAATTORIT
Vertailuoperaattorit 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
14
PREDIKAATIT
Funktioita, 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
15
?
EHTOLAUSE (IF)
16
(if (< a 100)
”a on pienempi kuin 100”
”a on yhtäsuuri tai suurempi kuin 100”)
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”)))
> (termostaatti 50)
> (termostaatti 10)
17
22°C
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)
18
AND KAIKKIEN EHTOJEN TULEE TOTEUTUA
19
(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”))
ORVÄHINTÄÄN YHDEN EHDON ON TOTEUDUTTAVA
(or #true #false) #true
(or #false #true) #true
(or #false #false) #false
20
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”))
NOTKÄÄNTÄÄ EHDON VASTAKKAISEKSI
21
(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.
22
Esim.
Koska bussilipun hinta (€) määräytyy iän mukaan ehtoja on oltava monta.
(define (bussilipun-hinta ikä)
(cond [(>= ikä 18) 3]
[(< 12 ikä 18) 2]
[(<= 7 ikä 12) 1]
[else 0]))
HARJOITUKSET: HAARAUTUMINEN
1) Syötteen tarkistaminen
2) Taksilaskut (Tehtävä 1)
3) Pythagoraan kääteislauseke (Tehtävä 2)
x
y
zz
y
x
x
z
y
3
4
5
REKURSIO
24
Funktio, joka kutsuu itse
itseään on rekursiivinen.
Rekursiivisen funktion avulla voidaan toteuttaa silmukka, eli saadaan ohjelma toistamaan jotain toimintoa monta kertaa.
Jotta silmukka päättyy joskus, meillä on oltava lopetusehto (if tai cond).
Jotta silmukka ”muistaa” mitä on jo tehty, välituloksia säilytetään funktion parametreissa.
Kutsuttaessa rekursiivista funktiota, annamme lähtötilanteen argumentit. Kun lopetusehto toteutuu, funktiopalauttaa paluuarvon.
IKUINEN SILMUKKA LASKURILLA
25
(define (silmukka i)
(silmukka (add1 i))))uusi kierros
(silmukka 0)käynnistys
uusi kierros
(begin (display-info-timer i 50)
uusi i:n
arvo
i:n arvo alussa
DISPLAY-INFODISPLAY-INFO-TIMER
26
display-info näyttää käyttäjälle kuvan/merkkijonon/luvun ja palauttaa annetun arvon
display-info-timer ottaa lisäksi ajan, joka kertoo kunka kauan info-ruutu pidetään näkyvissä)
display-
info
ARGUMENTIT PALUUARVO
lukumerkkijono”Game over”
sivuvaikutus
”Game over”
BEGIN JA LET
Jotta saamme funktion tekemään sivuvaikutuksia JA palauttamaan paluuarvon, pitää muodostaa koodilohko begin:in avulla.
Begin evaluoi sen sisällä olevat lausekkeet järjestyksessä, ”hukkaa” niiden tuottaman paluuarvon viimeistä lukuunottamatta ja palauttaa sen.
Jotta saamme talteen käyttäjän antamat syötteet, tarvitsemme lisäksi funktion sisäisiä muuttujia. Näihin ns. lokaalit muuttujan arvot määritellään let tai let* rakenteella (let* jos let-lauseke käyttää toista let-lauseketta).
27
muuttujan nimi muuttujan arvo
DISPLAY-READ DISPLAY-READ-NUMBER display-read näyttää käyttäjälle kuvan/merkkijonon/luvun (=sivuvaikutus) ja palauttaa käyttäjän editoriin kirjoittaman merkkijonon
display-read-number muuntaa annetun merkkijonon luvuksi
28
display-
read
ARGUMENTIT PALUUARVO
kuva
”tikkataulu”
merkkijono
Asenna paketti DrRacket:issa:
File -> Package manager
Package source: teachpacks
(lopuksi paina enter)
sivuvaikutus
(require teachpacks/display-read)
DISPLAY-VALUE
display-value näyttää käyttäjälle kuvan/merkkijonon/luvun ja annetun arvon (jos sen voi näyttää) ja palauttaa annetun arvon
29
display-
value
ARGUMENTIT
PALUUARVOmerkkijono
35luku
”Tulos on:”
luku35
sivuvaikutus
IKUINEN SILMUKKA(ESIMERKKI)Automaattilaskuri kysyy käyttäjältä syötteitä, tallentaa ne lokaaleihin muuttujiin (let), tutkii ovatko syötteet ok, jos ovat laskee tuloksen (kutsuu pinta-ala funktiota) ja ilmoittaa tuloksen käyttäjälle (display-value), ja palaa alkuun:
(define (automaattilaskuri)
(let [(a (display-read-number ”Anna kanta:”)
(b (display-read-number ”Anna korkeus:”)]
(if (and (number? a)(number? b))
(begin (display-value ”Pinta-ala on:” (pinta-ala a b))
(automaattilaskuri))
(begin (display-info ”Anna lukuja!”)
(automaattilaskuri)))))
30
Tämä älykkäämpi versio kysyy
käyttäjältä jatketaanko
parametreja ei tarvita
HARJOITUKSET : SILMUKAT
1) Lähtölaskenta
2) Laskuautomaatti
3) Myyrä – peli
4) Ufo-animaatio
MYYRÄPELI
1) Pistä myyrä vaihtamaan paikkaa satunnaisesti pelikentän sisällä
;; uusi-sijainti : <void> -> Posn
2) Tee funktio, joka laskee hiiren etäisyyden myyrän keskipisteestä
;; etäisyys : Luku Luku Luku Luku -> Luku
3) Tee funktio, joka vertailee onko hiiren sijainti myyrän sisällä. Käytä hyväksesi etäisyys –funktiota.
;; osuiko? : Luku Luku Luku Luku -> Totuusarvo
Lataa tehtävätiedosto
(x1, y1)
(x2, y2)|y1-y2|
|x1-x2|
hiiri
OSUIKO?
(image-width MYYRÄ)
hiiri
(image-width MYYRÄ)
hiiri