33
OHJELMOINTI YLÄKOULUSSA Jatkokurssi 1.11.2016

Ohjelmointi yläkoulussa: Jatkokurssi

Embed Size (px)

Citation preview

Page 1: Ohjelmointi yläkoulussa: Jatkokurssi

OHJELMOINTI YLÄKOULUSSA Jatkokurssi 1.11.2016

Page 2: Ohjelmointi yläkoulussa: Jatkokurssi

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.

Page 3: Ohjelmointi yläkoulussa: Jatkokurssi

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.

Page 4: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 5: Ohjelmointi yläkoulussa: Jatkokurssi

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.

Page 6: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 7: Ohjelmointi yläkoulussa: Jatkokurssi

FUNKTIO MUUTTAA SYÖTTEET (ARGUMENTIT) PALUUARVOKSI

7

ARGUMENTIT

100

PALUUARVO

”black”

r

väri

MUUTTUJAT

(PARAMETRIT)

(𝑐𝑖𝑟𝑐𝑙𝑒 𝑟 "solid" 𝑣ä𝑟𝑖)

Page 8: Ohjelmointi yläkoulussa: Jatkokurssi

FUNKTION MÄÄRITTELY

8

(define (ympyrä r väri)

(circle r ”solid” väri))

Page 9: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 10: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 11: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 12: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 13: Ohjelmointi yläkoulussa: Jatkokurssi

TOTUUSARVOT (TRUE/FALSE)

- tosi

#true, true

#t, #T

13

true false

- epätosi

#false, false

#f, #F

Page 14: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 15: Ohjelmointi yläkoulussa: Jatkokurssi

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

?

Page 16: Ohjelmointi yläkoulussa: Jatkokurssi

EHTOLAUSE (IF)

16

(if (< a 100)

”a on pienempi kuin 100”

”a on yhtäsuuri tai suurempi kuin 100”)

Page 17: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 18: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 19: Ohjelmointi yläkoulussa: Jatkokurssi

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”))

Page 20: Ohjelmointi yläkoulussa: Jatkokurssi

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”))

Page 21: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 22: Ohjelmointi yläkoulussa: Jatkokurssi

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]))

Page 24: Ohjelmointi yläkoulussa: Jatkokurssi

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.

Page 25: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 26: Ohjelmointi yläkoulussa: Jatkokurssi

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”

Page 27: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 28: Ohjelmointi yläkoulussa: Jatkokurssi

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)

Page 29: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 30: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 32: Ohjelmointi yläkoulussa: Jatkokurssi

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

Page 33: Ohjelmointi yläkoulussa: Jatkokurssi

OSUIKO?

(image-width MYYRÄ)

hiiri

(image-width MYYRÄ)

hiiri