keskiviikko 2. joulukuuta 2015

Kämmenniemen koulun 9. luokan piilokuvatestausta

Ennen näitä tunteja Kämmenniemen koulun 9. luokka oli koodannut tänä syksynä Racket:illä jo vaikka mitä: peruskuvia (lippuja ja autoja), pinta-alafunktioita sekä avaruuskappaleiden levityskuvia. Tällä kaksoistunnilla tarkoitus oli tutustua totuusarvoihin, ehtolauseisiin sekä tehdä piilokuvaharjoitus.

Ensimmäisellä tunnilla lähdimme liikkeelle totuusarvoista. Kirjoitimme interaktioikkunaan true ja false totesimme, että ne ovat arvoja kuten luvut ja merkkijonotkin. Sitten kokeilimme vertailuoperattoreita. Annoimme ensin muuttujalle a arvon viisi, ja sitten teimme vertailuja sillä seuraavasti:

> (define a 5)

> (< a 5)
#false

> (= a 5)
#true

Tästä pääsimmekin sitten ehtolauseeseen (if), kokeilimme myös sitä interaktioikkunassa. Tätä testattiin muutaman kerran eri ehdoilla (if - lause palautettiin interaktioikkunaan painamalla Crtl+nuoliylös):

> (if (< a 5)
        "pienempi kuin 5"
        "suurempi tai yhtäsuuri")

Koska ryhmä oli tehnyt jo funktioita aikaisemmin, lähdimme tekemään funktioita, jotka käyttävät ehtolausetta hyväkseen. Ensimmäiseksi teimme funktion "lämmitin", jonka tehtävänä olisi pitää luokkahuone lämpimänä: aina kun lämpötila laskisi alle 22 astetta, lämmitin menisi päälle. Aivan ensimmäiseksi mietimme mitä muuttujia funktio tarvitsee ja mitä se palauttaa:


;; lämmitin : Luku -> Merkkijono 

Sitten kirjoitimme funktiolle rungon eli stub:in:

(define (lämmitin t) 
    "")

Sitten suunnittelimme funktion toiminnan käyttämällä check-expect - lauseita:

(check-expect (lämmitin 20)
              "lämmitin päälle")

(check-expect (lämmitin 25)
              "lämmitin pois päältä")

(check-expect (lämmitin 22)
              "lämmitin pois päältä")


Nyt tiesimme mitä funktiolta odotetaan, joten pystyimme täydentämään funktion rungon valmiiksi:

(define (lämmitin t)
  (if (< t 22)
      "lämmitin päälle"
      "lämmitin pois päältä"))


Tämän jälkeen oppilaat saivat suunnitella funktion "portsari", jonka piti päästää baariin sisälle vain täysi-ikäiset henkilöt. Tämä sujui hyvin, tosin osa portsareista ei ollut erityisen kohteliaita alaikäisille asiakkailleen. Toimivan portsarin jälkeen teimme vielä bussin "rahastaja":n, jonka piti matkustajan iän perustella palauttaa bussimatkan hinta. Päätimme, että hintaluokkia olisi: lapsi, nuori ja aikuinen (osa oppilaita otti mukaan myös seniorit). Tämäkin funktio tehtiin funktion suunnitteluportaiden avulla.

;; rahastaja : Luku -> Luku
(define (rahastaja ikä)

   0)

Sitten check-expect:it:

(check-expect (rahastaja 10)
              1)
(check-expect (rahastaja 13)
              1.20)
(check-expect (rahastaja 23)
              2)
(check-expect (rahastaja 18)
              2)
(check-expect (rahastaja 12)
              1.2)


Ja lopuksi funktio, jossa käytimme nyt cond - valintalausetta, että saimme useamman ehdon toimimaan kätevästi (perusrakenteen teimme yhdessä, tarkemman säädön jokainen sai tehdä itse):

(define (rahastaja ikä)
  (cond [(>= ikä 18) 2]
        [(< 11 ikä 18) 1.2]
        [else 1]))


Tämä funktio oli jo niin monimutkainen, että check-expectejä todellakin tarvittiin sen testaamiseen ja koodin saamiseksi oikein. Ensimmäisellä yrittämällä moni 18 täyttänyt pääsi nimittäin lastenlipulla (kun = merkki oli unohtunut koodista) eli rajatilanteiden testaaminen todellakin kannatti.

Näiden harjoitusten jälkeen otimme projektiksi piilokuvaharjoituksen. Koodiin tutustumisen jälkeen tehtäväksi tuli muuttaa koodia niin, että se tuottaa Saksan lipun. Tähän menikin sitten kaksoistunnin loppuaika ja lähes kaikki saivat lippunsa toimimaan. Yksi oppilas taisi ehtiä tehdä myös hieman haastavamman Suomen lipunkin.

Saksan lipun avulla opeteltiin valintalausetta ja vertailuoperaattoreita

Ei kommentteja:

Lähetä kommentti