Ohjelmointi yläkoulussa: Jatkokurssi

Preview:

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

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

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

Recommended