torstai 17. joulukuuta 2015

Racket Turtle - jatkot Kaukajärvellä

Kaukajärven ohjelmointikurssilaiset (8lk) tekivät kurssin päätteeksi Racket Turtlen - jatkotason tehtäviä. Ensin mietimme miten saisimme Turtlen tekemään perusspiraalin:

Tämä oli helppo tehtävä: jokaisella kierroksella pitäisi vain kulkea hieman pidempi matka. Tätä varten teimme funktion, joka osaa tehdä yhden MUUTTUVAN pituisen sivun:

(define (sivu matka)
    (list (forward matka)
           (turn-left 90)))

Seuraavaksi mietimme miten saisimme annettua tuolle funktiolle listan kasvavia matkan arvoja. Tutkimme interaktioikkunassa miten range - funktio toimii:

(range 0 100 5)

ja totesimme, että sen avulla saisimme tarvittavat matkan arvot. Vielä tarvittiin funktio joka syöttää nämä sivu-funktiolle ja olisimme valmiit:

(map sivu (range 0 100 5))

Tälle annettiin definellä nimi ja piirrettiin se:

(define spiraali (map sivu (range 0 100 5)))
(draw spiraali)

 Jotta spiraalia saataisiin enemmän ei ollut vaikea keksiä, että range:a piti lisätä.

Perusspiraalia lähdettiin sitten muuttaamaan, lisäämällä värejä (esim. antamalla värilista), sekä muuttamalla kulma joksikin muuksi kuin 90 astetta.

Kun kokeilut olivat tuottaneet hienoja kuvia ne tallennettiin taas Padlet - seinälle.

Toisella tunnilla opettelimme vielä leimasimen käytön ja lisäsimme hieman tähtiä spiraalien sekaan. Tällaisia hienoja kuvia syntyi tällä kaksoistunnilla:
Racket Turtle - taidetta à la Kauksu

Funktiotunti Tesomalla (jatko)

Jatkoimme 8lk kanssa polynomifunktioihin tutustumista. Kerroin, että polynomifunktioilla voidaan mallintaa vaikka lasten pituuskasvua ja muita oikean elämän ilmiöitä. Selitin, että erilaiset funktiot käyttäytyvät eri tavalla riippuen siitä ilmiöstä jota ne mallintavat. Sitten lähdimme tutustumaan erilaisiin polynomeihin.

Koska oppilaat eivät olleet vielä käyneet polynomeja matematiikan tunnilla niin selitin lyhyesti mikä on polynomi, termi, kerroin, muuttuja, vakio, ensimmäisen ja toiseen asteen polynomi. Sitten teimme funktiot seuraaville polynomeille (yksi funktio kerrallaan):

Koodina nämä näyttäisivät tältä:

(define (p1 x)
    (* 2 x))

(define (p2 x)
    (+ (* -2 x) 3))

(define (p3 x)
    (+ (- (expt x 2)) -3))

Jokaisen funktion koodaamisen jälkeen testasimme sitä interaktioikkunassa:

> (p1 4)
> (p2 10)
> (p3 3)

Ja testaamisen jälkeen teimme piirsimme niiden kuvaajat plot2D - kirjaston avulla (require teachpacks/plot2D):

 (plot2D (list (func p1 0 10)
               (func p2 0 10)
               (func p3 0 10)))


Tässä tuli testattua nyt sekin, että koodaamalla voi opiskella myös hyvin perinteisesti matematiikkaa. Toki mitään WOW-efektiä tässä ei tietenkään synny, ei opettajan eikä oppilaankaan taholta, kuvaajia kun voi piirtää monella muullakin ohjelmalla. Toki tässä on se hyöty, että ei tarvitse opetella montaa ohjelmaa kun samalla ohjelmalla voi hoitaa kaiken (ohjelmointi, kuvaajat jne.)

Vielä kun jostain löytäisi ne polynomifunktiot, jotka mallintavat niitä oikeita pituuskäyriä niin olisi saanut tämänkin asian lähemmäksi todellisuutta...

Ylöjärven animaatiot (jatko)

Viimeisellä kouluviikolla jatkoimme animaatioiden kanssa Ylöjärven yhtenäiskoulussa. Palautimme mieleen asioita kahden viikon takaa: muuttuja, funktio, ehtolause, vertailuoperaatio sekä animaatiomoottori (animate).
Uutena asiana otimme cond-valintalauseen, että saimme animaation tekemään useampaa kuin kahta juttua. Jatkoimme viimekertaisen ympyräanimaation kehittelyä jokainen omaan suuntaansa.

Aloitimme oman animaation tekemisen ensin vaihtamalla ympyrän johonkin muuhun kuvaan esim. tähteen (star, radial-star) ja vaihtamalla sille värin. Sitten muutimme koodin niin, että if:in tilalle vaihdettiin cond.

(define (oma-kuva t)
   (cond [(< t 250)
          (star t "solid" "purple")]
         [else
          (circle t "solid" "red")]))

Kaksi viikkoa oli aika pitkä aika muistaa se, että jos jätti tuon t:n pois ja kirjoitti vaikka 40 niin tähden koko ei muuttunut. Tässä tuli hyvin kerrattua jälleen kerran muuttujan käsite. Animaatiossa se vieläpä konkretisoituu niin hyvin, jos muuttuja ei ole käytössä niin kuva ei todellakaan muutu!

Cond-lause ei sinänsä tuottanut ongelmia mutta ehtojen säätäminen oli uusi asia, joka vaati miettimistä. Esim. moni kopioi ensimmäisen ehdon eikä vaihtanut lukuja, ja sitten ihmetteli miksi kolmas kuva ei koskaan tule esiin... No, miksiköhän ei?

(define (oma-kuva t)
   (cond [(< t 250)
          (star t "solid" "purple")]
         [(< t 250)
          (star t "solid" "yellow")]
         [else
          (circle t "solid" "red")]))

Toinen pohdinnan paikka tuli eteen siinä, kun animaatio piteni, jossain vaiheessa viimeiset kuvat putosivat pois. Tässä vaiheessa olisi pitänyt muistaa, että rajoitimme animaation t:n tietylle välillä. Jos olemme rajoittaneet t:n välille 0-199, tietenkään kuva jonka pitäisi tulla esiin kun t on 300-400 ei ikinä ilmesty. Tämän sai korjattua muokkaamalla modulo:a.

(define (kuva t)
  (place-image (oma-kuva (modulo t 400)) 

               250 250 
               (empty-scene 500 500)))

Viimekerralla tehty "kuha-kääntyy" funktio otetiin nyt käyttöön, kuvat laitettiin pyörimään, vaihtamaan väriä, suurenemaan ja pienenemään. Osa vaihtoi myös place-imageen x:n tilalle muuttujan, jolloin kuva lähti kulkemaan vasemmalta oikealla. Ja modulon avula se saatiin toistamaan samaan (nyt rajoittava arvo saatiin empty-scene:n leveydestä). Muutama oppilas lisäsi myös tekstiä  animaatioonsa.

Tässä yksi animaatio, jossa kuva pyörii, liikkuu eteenpäin ja mukana on myös teksti:



tiistai 8. joulukuuta 2015

Muuttuja, lauseke ja funktio - tunti Tesomalla

Tesoman 8.luokan matematiikan ryhmä aloitti tutustumisen Racket-ohjelmointiin tänään. Esimmäiseksi tutustuimme siihen, että on olemassa lukuja ja merkkijonoja. Testasimme niitä interaktioikkunassa. Muuttujan käsitteeseen törmäsimme kun keksimme kirjoittaa merkkijonon ilman "hipsuja" ja DrRacket ilmoitti "this variable is not defined".

Seuraavaksi määrittelimme muuttujia (sekä merkkijonoja, että lukuja) määrittelyikkunassa definen avulla, ja testasimme miksi luvussa ei saa olla hipsuja (sillä ei voi laskea).

(define a 5)
(define b 10)

Nyt kokeilimme laskea näiden muuttujien avulla esilaisia lausekkeita: yhteen-, vähennys-, kerto- ja jakolaskua (interaktioikkunassa):

> (+ a b)
> (- a b)
> (* a b)
> (/ a b)

Kokeilimme myös desimaalilukuja, negatiivisia lukuja sekä potenssiin korottamista expt:in avulla:

> (expt a b)

Sitten tutustuimme funktion käsitteeseen: sen avulla voidaan kirjoittaa laskusääntö, että jokin toiminto saadaan automatisoitua (esim. lentokoneen autopilotti). Piirsin taululle seuraavan kuvan:


Oppilaat saivat keksiä muuttujan nimen ja funktion säännön itse
Tämän koodasimme sitten funktioksi:

(define (plus3 a)
  (+ a 3))

Lisäsimme vielä lopuksi sille selityksen kommenttiriville:

; plus3 : Luku -> Luku

Lopuksi testasimme mitä tapahtuu kun funktiota kutsutaan eri arvoilla. Osa tajusi heti mitä seuraava rivi palauttaa:

> (plus3 100)

Tämän jälkeen ehdotin, että oppilaat olisivat tehneet jonkun oman funktion, mutta aika loppui kesken (ja olihan tässäkin jo hirveästi asiaa yhdelle oppitunnille). Seuraavalla kerralla jatkamme polynomifunktioiden kirjoittamista ja niiden kuvaajien piirtämistä DrRacket:illä.

Turtle-testausta Kaukajärvellä

Viime perjantaina joukko 8.luokan oppilaita ohjelmoi Racket Turtlea tekemään erilaisia geometrisia kuvioita. Ensimmäiseksi latasimme DrRacket:in Package Managerin avulla "teachpacks" paketin, jossa myös Racket Turtle - kirjasto on. Sitten latasimme Koodausta kouluun materiaalin sivuilta valmiin koodin, joka piirtää neliön. Tutkimme koodia yhdessä hidastetun piirtotoiminnon (step-by-step) avulla ja kun Turtlen ohjaamislogiikka oli selvillä oppilaat saivat tehtäväksi muuttaa koodi piirtämään kolmion. Osa sai kolmion valmiiksi nopeasti ja he siirtyivät kuusikulmioon ja neljäkkääseen. Kun kaikki olivat saaneet kolmion valmiiksi, näytin miten kuusikulmion sai tehtyä kätevämmin repeat - komennon avulla.

(define sivu
   (list (forward 100)
          (turn-left 60)))

(define kuusikulmio
    (repeat 6 sivu))

(draw kuusikulmio) 

Näytin vielä miten repeat:in avulla voi toistaa myös aikaisemmin piirretyn kuvion:

(define neliöt
    (repeat 4 neliö))

Kun repeat oli hanskassa ryhdyimme leikkimään sen avulla, ja toistimme jo valmiiksi saatuja peruskuvioita: neliötä, kolmiota, kuusikulmiota tai neljäkästä. Jotta kaikki kuviot eivät olisi vain sinisiä opettelimme vaihtamaan myös väriä change-color:in avulla. Osa oppilaista opetteli myös pen-up, pen-down ja go-to komennot, jotta sai kuvansa nätisti keskelle piirtoaluetta. Lopuksi oppilaat saivat ladata itse piirtämänsä Turtle-kuvan Padlet-seinälle kaikkien ihailtavaksi. Tällaisia niistä sitten tuli:

Kauksun Turtle-Padlet
Tämä ryhmä oli jo aikaisemmin tutustunut DrRacket:iin piirtämällä peruskuvioita sekä yhdistettyjä kuvia ja näiden Turtle kuvien tekemiseen meni yksi kaksoistunti. 

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

Ylöjärven yhtenäiskoulussa koodattiin animaatioita

Olin maanantaina testaamassa Koodausta kouluun materiaalin animaatioharjoitusta Ylöjärven yhtenäiskoulussa. Testiryhmänä toimi puolikas 8.luokan ryhmä, joka oli aikaisemmin jo koodannut 2-3 tuntia Racket:illä (peruslaskuja, lippuja sekä autoja).

Nyt siirryimmekin jo aivan toiselle tasolle eli tutustuimme funktioiden määrittelemiseen, totuusarvoihin, vertailuoperaattoreihin sekä ehtolauseeseen. Aloitimme kertaamalla muuttujan käsitteen. Lippuja koodattaessa olimme käyttäneet jo muuttujia, ja palautimme mieleen miten muuttuja määritellään define:n avulla:

(define a 100)
(define väri "red")

Tämän jälkeen tutkimme miten saisimme tehtyä ympyrän, jonka säde ja väri on ilmoitettu muuttujien  avulla ja päädyimme tähän:

(circle a "solid" väri)

Nyt kokeilimme muuttaa a:n ja väri:n arvoa definessä ja huomasimme, että ympyräkin muuttui samalla. Tästä pääsimme hyvin siihen, että tarvitsemme muuttujia, mutta ne eivät pelkästään riitä, vaan meidän pitää saada nämä arvot jostakin, joten kirjoitimme tuon koodin ympärille funktion määritelmän:

(define (ympyrä a väri)
   (circle a "solid" väri))
  
Tätä testattiin interaktioikkunasta eri arvoilla ja todettiin se toimivaksi.

(ympyrä 100 "yellow")
(ympyrä 50 "blue")

Funktio-testausta
Nyt oppilaat saivat tehtäväksi määritellä jonkin toisen funktion, joka tekisi eri muotoisen kuvan. Tässä vaiheessa palautimme mieleen miten piirtofunktioita etsittiin Koodarin käsikirjasta. Teimme myös funktion, joka saa sisäänsä kuvan, jota se kiertää x astetta vastapäivään. Myös tätä testattiin.

(define (kierrä kuva asteet)
   (rotate asteet kuva))

Yksi pojista oli aikaisemmin koodannut USA:n lipun ja testaili sen pienentämistä ja suurentamista scale - funktion avulla.

Toisella tunnilla aloitimme tutustumaan animaatioihin. Kerroin animation - funktion toiminnasta, kuinka se kutsuu meidän "oma-kuva" - funktiota 28 kertaa sekunnissa luvuilla 0, 1, 2, 3, 4 ... jne. Selitin myös taululla piirtämäni kuvan avulla, miten empty-scene ja place-image toimivat. Sitten latasimme valmiin animaatiopohjan oppilaan tehtävät sivulta.

Kun painoimme "run", totesimme, että animaation punainen ympyrä ei värähdäkään ja pyysin oppilaita korjaamaan asian. Tämä oli yllättävän vaikeaa, vaikka olimme juuri tehneet vastaavan ympyrä - funktion, erot olivat vain pintapuolisia: funktion nimi oli eri (ympyrä vs. oma-kuva) ja muuttujan nimi oli eri (a vs. t). Pienen lypsämisen jälkeen joku ryhmästä keksi sen: muuttujaa pitää käyttää koodissa! Vaihdoimme siis 100:n t:ksi ja animaatio alkoi toimia.
 
(define (oma-kuva t)
  (circle 100 "solid" "red"))


Seuraava oppilaiden ihmettelyn aihe oli se, että miksi se vain jatkaa kasvamistaan. Miksi se ei pienene. Tähän oli helpompi vastata: koska sitä ei ole ohjelmoitu pienenemään. Se on ohjelmoitu vain suurenemaan. Tästä pääsimme hyvin siihen, että jotta se voisi pienentyä tarvitsemme koodiimme kaksi haaraa: "suureneva ympyrä" - haaran ja "pienenevä ympyrä" - haaran.

Lähdimme tutustumaan ehtolauseen käyttöön tutkimalla interaktioikkunassa ensin vertailuoperaattoreita <, > ja =. Kerroin, että nämä palauttavat totuusarvoja: #true ja #false ja että nämä ovat se tapa, jolla koodi saadaan haarautumaan "tosihaaraan" ja "epätosihaaraan".

>  (< 100 150)
#true

Näiden testailujen jälkeen testasimme interaktioikkunassa if-lausetta:

> (if (< 100 150) 
        "totta mooses"
        "väärin meni")

Kun kaikki olivat saaneet sekä "totta mooses" että "väärin meni" toimimaan, jatkoimme animaation kimpussa. Teimme siis ehtolauseen oma-kuva - funktioon.

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")

      (circle t "solid" "red")))

Nyt alkoikin sitten kova miettiminen miten ympyrä saadaan pienenemään eli mitä t:lle pitäisi tehdä. Kysyin oppilailta, että mikä laskutoimitus pienentää, ja vastaus löytyi heti: vähennyslasku. Sitten olikin hieman enemmän epäselvää mitä pitää vähentää mistäkin... Kun logiikkaa ei heti löytynyt totesin, että kokeillaan jotain, sitten nähdään mitä tapahtuu ja voidaan korjata sitä. Kokeilimme siis vähentää t:stä ensimmäisen ehdon raja-arvon (300).

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")
      (circle (- t 300) "solid" "red")))


Nyt ympyrä ei pienentynyt vaan palasi pieneksi ja lähti uudelleen suurenemaan. No seuraavaksi kokeilimme laittaa t:n ja 300 toisinpäin ehkäpä se auttaisi pienenemisessä?

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")
      (circle (- 300 t) "solid" "red")))


Nyt saimme tällaisen virheilmoituksen:
circle: expects a non negative real number as first argument, given -1

Tämän virheilmoituksen tulkinta oli helppoa: ympyrän säde ei voi olla negatiivinen. Ja negatiivinen säteen arvo koodissamme tulee heti kun t menee yli 300, koska:

> (- 300 301)
-1

Totesimme, että ehkä meidän pitää oikeasti miettiä miten tämän pitäisi toimia. Teimme seuraavan taulukon Word:illä:



Saimme tehtyä punaisen rivin perusteella yhtälön:

x - 301 = 299

Ja tämä saataiin ratkaistua:

x = 600

Ja nyt saimme lisättyä oikean arvon koodiimme:

(define (oma-kuva t)
  (if (< t 300)
      (circle t "solid" "red")
      (circle (- 600 t) "solid" "red")))


Ja nyt ympyrämme sekä suureni, että pieneni mutta törmäsimme lopuksi taas samaan ongelmaan:

circle: expects a non negative real number as first argument, given -1

Tämä oli jo helpompi ymmärtää, koska tässä toistui sama ongelma kuin ennenkin, nyt t menee yli 600 ja säde menee taas miinukselle:

> (- 600 601)
-1

Tähän otimme ratkaisuksi jakojäännöksen eli koodauskielellä modulon. Modulon avulla voidaan rajoittaa t:n arvot välille 0-599, jolloin emme joudu koskaan negatiivisiin säteisiin. Jakojäännöksen käsite oli hyvin hallussa oppilailla, koska seuraava päättely ei tuottanut mitään ongelmia:

601 / 600 jakojäännös on 1
602 / 600 jakojäännös on 2
603 / 600 jakojäännös on 3
...

Lisäsimme modulon koodiin ja animaatiomme toimi nyt niinkuin pitääkin.

(define (kuva t)
  (place-image (oma-kuva (modulo t 600)

                250 250 
               (empty-scene 500 500)))
Nyt oppilaat saivat muuttaa ympyrän muodon joksikin toiseksi, muuttaa värit haluamakseen jne. Yksi oppilas keksi kysyä miten animaatioon saisi enemmän haaroja, ja selitin miten valintalause (cond) toimii. Seuraavalla kerralla jatkamme näitä oppilaiden omia animaatioita, ehkäpä cond-lauseella terästettynä.
Yksinkertaisen ympyrä-animaation takana on yllättävän paljon matematiikkaa ja ohjelmointitietämystä

tiistai 24. marraskuuta 2015

Racket - iskuryhmän kolmas workshop

Tämän syksyn viimeisessä workshopissa kehittelimme tutustuimme Koodiaapinen MOOC:in Racket osion toteutukseen ja ideoimme tehtäviä todennäköisyyslaskennan, polynomilaskennan sekä suoraan- ja kääntäen verrannollisuuden opiskelemiseen.

1) Suoraan verrallisuuden havainnollistamiseen ideoitiin mopon kulutuksen koodaamista funktioksi, pisteiden laskemista ja plottaamista sekä suoran piirtämistä samaan kuvaan. Tämä vaatii lisäyksiä plot2D-kirjastoon.

2) Todennäköisyyslaskennasta voisi tehdä nopanheittosimulaattorin, eli arpoa 10, 100 ja 1000 nopan silmälukua ja piirtää niistä palkkidiagrammit ja verrata lähenevätkö ne laskettua todennäköisyyttä. Keskustelimme paljon siitä, tuottaako tietokone aidosti satunnaisia lukuja ja päätimme, että tämä täytyy vain testata.

3) Todennäköisyyttä voisi havainnoida myös radioaktiivisten atomien puoliintumisajan simulaation tai "tuplaa-panos"-pelisimulaation avulla (pienillä korteillä 1-6 tai isoilla korteilla 8-13 voittaa, 7 häviää aina).

4) Tutustuimme myös siihen miten Turtlelle saadaan generoitua map:in avulla pitkiä komentolistoja, ja teimmekin "random-Turtlen", joka kulki satunnaisen matkan satunnaiseen suuntaan. Tämä oli hauska eikä ollenkaan vaikea toteuttaa!

5) Lopuksi vielä pohdimme miten polynomilaskentaan voisi tuoda ohjelmointia, ja totesimme että lähdemme liikkeelle lausekkeen arvon laskemisesta ja teemme sitten jonkun oikeaan mittausdataan liittyvän polynomisovitteen kuvaajat.

Uusia ideoita siis syntyy jatkuvasti kun tämä joukko kokoontuu, nyt pitäisi vain työstää nämä tehtävien muotoon...

Tähän asti materiaalista on testattu peruslaskut ja peruskuvat, sekä geometriaan liittyviä funktioita ja ehtolauseista piilokuvat. Ensiviikolla testaukseen siirtyvät animaatiot sekä Turtle. Funktioiden parempi testaus siirrettiin keväälle, koska se tulee 9. matematiikassa esille vasta keväällä.

Random-Turtle kulkua (500 kierrosta):

 Koodi:
(require teachpacks/racket-turtle)

(define (kierros i)
  (list (turn-left (random 360))

        (forward (random 20))))

(define RANDOM-TURTLE (map kierros (range 0 500 1)))

(draw RANDOM-TURTLE)

maanantai 23. marraskuuta 2015

Racket - iskuryhmän toinen workshop

Racket - iskuryhmän toisessa workshopissa tutustuimme animaatioihin, joissa muuttujana on aika. Teimme ensin ufon laskeutumisanimaation, sitten laitoimme sen "rullaamaan" käyttämällä moduloa. Sitten käänsimme ufon kulkusuunnan nousuun, ja lopuksi teimme samaan animaatioon molemmat. Tässä harjoituksessa käytettiin ehtolauseita (if), valintalauseita (cond) sekä vertailuoperaattoreita (<, >, <=, >=, =). Kun systeemi oli selvillä iskuryhmän opettajat kokeilivat tehdä omia animaatioita, suurenevia ja pieneneviä palloja, väriä vaihtavia ja pyöriviä propelleja ja syntyi myös yksi pomppiva pallo joka "jousti" pompatessaan (litistyi ellipsiksi).
Animaation tekeminen havaittiin yllättävän matemaattiseksi harjoitukseksi, siinä joutui tekemään kuvan piirtofunktion (joutui miettimään muuttujia ja vakioita), miettimään jakojäännöstä (modulo) ja suunnittelemaan ehdollista suorittamista.
Käytimme tässä harjoituksessa big-bangiä, vaikka animate - funktio olisi toiminut aivan vastaavalla tavalla.

Tässä ufo-esimerkkianimaatio WeScheme:llä:

http://www.wescheme.org/view?publicId=f6lWg5Hmdg 

Yksinkertainenkin ufon lennättäminen vaatii matematiikkaa!

maanantai 21. syyskuuta 2015

Racket - iskuryhmän syksyn ensimmäinen Workshop

Eilen illalla Lielahden koulun ATK-luokka täyttyi Racket - iskuryhmän koodariopettajista. Workshop:ien idea on opiskella Racket - ohjelmointia yhdessä, jakaa kokemuksia ja vinkkejä sekä kehitellä uusia tehtäviä. Uusia opettajia oli saatu mukaan: Eeva Uitti (Ylöjärven yhtenäiskoulu), Kaisa Poikela (Kaukajärven koulu) sekä Sara Viertola (Pirkkalan yläaste).

Tällä kerralla esittelin ryhmälle DrRacket:in "pakettipalvelun", eli Package Managerin. Sen avulla asensimme koulun koneisiin koodaamiani apukirjastoja ml. Racket Turtlen sekä Display-read:in. Display-read kirjaston avulla voi kysellä helposti käyttäjältä tietoja, ja näiden avulla harjoitella vaikka if - rakennetta. Tämä kirjasto on vasta kehitteillä, joten siitä ei ole olemassa vielä valmiista käsikirja sivustoa. Racket Turtlen avulla taasen voi piirtää Turtle grafiikkaa, ja suurin osa iskuryhmää tutustuikin Turtlen ohjailemiseen Koodausta kouluun käsikirjan avulla.

Tässä joitakin illan aikana kehiteltyjä ja testattuja tehtäväideoita:

1) Ohjelma, joka kysyy käyttäjältä särmiön sivujen pituudet käyttäen display-read - funktiota, ja sen jälkeen kutsuu särmiön kokonaispinta-alan laskemiseen ohjelmoitua funktiota. Harjoitukseen kuuluu myös särmiön levityskuvan piirtäminen 2htdp/image kirjaston rectangle, above ja beside - funktioiden avulla. Sokerina pohjalla voisi olla vastaavan 3D - kuvion piirtäminen Racket Turtlella.

2) Ohjelma, joka kysyy käyttäjältä useamman suorakulmion kannan ja korkeuden tiedot display-read:in avulla (rekursiivisen silmukan avulla) ja sitten laskee pinta-alat, piirtää kuvat, vertailee pinta-aloja toisiinsa ja ilmoittaa suurimman. Päädyimme tallentamaan kannan ja korkeuden tiedot listan muotoon esim. (list (list 20 40) (list 40 50)(list 30 70)))

3) Ohjelma, joka laskee "vaatimattoman pojan" palkan. Eli, poika pyytää ensimmäiseltä päivältä palkaksi 2 senttiä, seuraavana päivänä 2 kertaa enemmän kuin edellisenä päivänä. Tehtävänä on laskea kuinka paljon hän saa rahaa 20 päivän työstä. Tämäkin tehtävä saatiin koodattua rekursion avulla, mutta mietittäväksi jäi voisiko sen tehdä vielä yksinkertaisemmin.

4) Racket Turtlella piirrettiin monenlaisia kuvioita, monikulmioita, ympyröitä yms. ja  yhdisteltiin niitä samaan kuvaan. Hienoimmassa kuviossa oli kolme eri väristä kolmiota kolmion muodossa ja niitä pyöriteltiin eri asentoihin repeat:in avulla!

Kouluilla, joissa oli jo kokeiltu Racket:iä saatiin palautetta, että kuvilla aloittaminen innosti ehkä enemmän kuin peruslaskuilla aloittaminen, tosin Ylöjärvellä 7. luokkalaiset pojat olivat innostuneet jopa niistäkin. Kaukajärvellä oli aloitettu motivointitunnilla, eli kerrottu mitä ohjelmointi on ja miksi se on tulossa kouluun, ja tämä oli auttanut oppilaiden innostuksen herättämisessä. Hatanpäällä oli 8. luokan matematiikan tunnilla tutkittu DrRacketin avulla neliön ja neliöjuuren konseptia opettajan itse laatiman monisteen ja koodin pohjalta, ja Lielahdessa DrRacketillä oli selvitetty lukujen suuruusjärjestyksiä käyttämällä vertailuoperaatioita (<, > ja =).

DrRacket oli myös saapunut koulujen ohjelmistojakeluun (viimein), joten nyt loputkin koulut pääsevät asentamaan ohjelmaa.

Ilta oli mitä antoisin! Oli hienoa huomata, että omia tehtäväideoita oli alkanut syntymään ja että käsikirja tuntui toimivan hyvin!

Näihin tarvitaan vain rectangle, above ja beside

perjantai 11. syyskuuta 2015

Racket iskuryhmä Takahuhdissa

Tänään aloitimme Koodausta kouluun materiaalin testaamisen oikeiden oppilaiden kanssa. Ensimmäinen testiryhmä oli Takahuhdin koulun 8. luokan matematiikkapainotuksen ryhmä.

Aloitimme asentamalla DrRacket:it luokan koneille ohjelmistojakelun kautta (SW center). Luokassa oli 25 konetta, joista 7:ään ei saatu syystä tai toisesta DrRacket:iä joten nämä oppilaat tekivät harjoituksia WeScheme-sivuston kautta. Tunnin jälkeen asennus saatiin toimimaan vielä kahteen koneeseen, lopuissa oli ohjelmistojakelusta johtuva ongelma, joka annettiin Fujitsulle selvitykseen.

1. Oppitunti

Aloitimme tutustumalla työkaluihin kirjoittamalla komentotulkkiin erilaisia juttuja. Aivan ensin, käänsimme DrRacket:in ikkunat vierekkäin (View -> Use Horizontal layout), koska käytössä oli nyt WeScheme:kin ja sen ikkunat ovat vierekkäin (selkeämpää oppilaiden seurata opettajan koneella tapahtuvaa toimintaa). Kasvatin myös opettajan koneen fontin isommaksi, että se näkyi myös luokan taakse (DrRacketin asetusten kautta).

Kerroin oppilaille, että Racket-tulkki on melko älykäs ja että sille voi heittää kokeeksi erilaisia kysymyksiä. Testasimme esim. mitä se vastaa jos sille sanoo:
> 6

Ja totesimme, että sehän vastasi että 6. Kokeilimme antaa sille myös merkkijonon:
> "Tiina"

ja totesimme, että se vastaa taas saman. Sitten joku keksi kirjoittaa, että 
> r u stupid?

Ja sai vastauksesksi:
r : this variable is not defined

Tästä olikin helppo lähteä puhumaan muuttujista, ja kerroin, että DrRacket ei tiedä mitä tuo tarkoittaa ennen kuin kerromme sen sille. Sitten "opetimme" Racket-tulkille uusia sanoja kirjoittamalla define-lausekkeita määrittelyikkunaan:
(define LOL "Lot's of laughs")
(define ;-/ "Not so happy")

Nyt saimmekin tulkilta jo monipuolisempia vastauksia. Tässä vaiheessa oppilaat jo kokeilivat innoissa mitä kaikkea saisivat tulkin vastaamaan :-) Huomasin, että osa tulkeista palautteli balettiin osa jääkiekkoon liittyviä merkkijonoja. Moni yritti antaa muuttujalle moniosaista nimeä ja korjasimme näitä lisäämällä alaviivoja esim.

(define r_u_stupid? "Yes I am")

Sitten selitin, että ohjelmoinnissa muokkaamme tietoa, ja että Racket kielessä operaatiot jotka muokkaavat tietoa ovat nimeltään funktioita. Tutustuimme yksinkertaiseen funktioon nimeltä + ja kävimme sen avulla läpi Racket-kielen syntaksin. Ensin sulkuauki-merkki, sitten funktion nimi, sitten argumentit ja lopuksi sulkukiinni-merkki.

Kokeilimme läpi kaikki peruslaskutoimitukset: + - * /. Näiden jälkeen kokeilimme yhdistää lausekkeita ja selitin että lausekkeet ovat sisäkkäin kuin maatuskanuket. Testasimme lausekkeiden yhdistämistä kirjoittamalla määrittelyikkunaan ensin matemaattisen lausekkeen kommenttiriville. Selitin, että kommenttimerkillä ; merkityn rivin yli hypätään kun koodia suoritetaan.
; (3 + 5) / (4  - 2)

Tämä lauseke muunnettiin Racket-kielelle ja katsottiin sen suoritus läpi stepperillä vaihe-vaiheelta ja huomattiin kuinka evaluointi tapahtuu sisältä ulospäin. Nyt oppilaat saivat keksiä oman laskulausekkeensa ja tutkia sen toimintaa stepperillä. Ne joilla oli WeScheme käytössä tekivät tämän vieruskaverinsa kanssa (WeSchemessä ei ole stepperiä).

Tässä vaiheessa tutustuimme myös virheilmoituksiin, erityisesti siihen miten puuttuva sulku ilmoitetaan ja miten DrRacket näyttää valmiin sulkuparin harmaana. 

2. Oppitunti

Latasimme Koodausta kouluun oppilaan tehtävistä Peruslaskut-tehtävän tiedostot ja oppilaat lähtivät koodaamaan niitä. Homma sujui hyvin, mutta moni unohti laittaa + ja - merkkien sekä lukujen väliin välilyönnin esim.(-2 4), jolloin Racket tulkitsi - merkin luvun etumerkiksi, ei funktion nimeksi ja siitä aiheutui seuraava  virheilmoitus:

Tämä asia kun opittiin katsomaan niin ryhmä koodasi näppärästi tehtäviä eteenpäin. Tehtävien määrä ja taso tuntui sopivalta, ja muutama ehti tehdä ne kaikki tunnin aikana. Lopputunnista tarkastimme vastaukset tykin kautta opettajan materiaalin mallivastauksista ja korjailimme lausekkeita oikeiksi. Oppilaat osasivat matematiikan laskujärjestyssäännöt mutta niiden ohjelmoiminen oikein olikin sitten aivan eri juttu.

3. Oppitunti

Viimeisellä oppitunnilla pääsimmekin sitten kuvien kimppuun. Kuviin tutustuimme avaamalla Koodarin käsikirjasta kohdan 3. Kuvat - 2htdp/image. Selitin, että Racket kielessä ei ole kuvan piirtofunktioita valmiina mutta, että voimme "laajentaa DrRacketin taitoja" ottamalla käyttöön kirjaston. Katsoimme käsikirjasta miten kirjasto otetaan käyttöön  ja kirjoitimme määrittelyikkunaan:

(require 2htdp/image) 

ja painoimme "run". Sitten avasin Käsikirjasta peruskuviot kohdan ja esittelin ensimmäisen piirtofunktion square. Selitin mitä eri argumentit tarkoittavat ja näytin, että käsikirjassa on kaikkiin funktioihin vastaava kuvaus ja esimerkit. Kirjoitimme komentotulkkiin esimerkin mukaan

> (square 50 "solid" "red")

Kehoitin oppilaita tutustumaan loppuajan itsenäisesti käsikirjan avulla eri piirtofunktioihin. Tämä onnistui hyvin, oppilat osasivat Käsikirjan avulla piirtää tähtiä, neljäkkäitä, ellipsejä ja jopa muuttaa tekstiä kuvaksi. Näytin vielä lopputunnista miten käsikirjasta löytää lisää värejä sekä miten tehdään oma väri make-color:in avulla ja tallennetaan se muuttujaan LEMPIVÄRI. Tässä vaiheessa moni laittoi erehdyksessä hipsut LEMPIVÄRI:n ympärille, joten palasimme siihen mikä on "merkkijono" ja mikä on MUUTTUJAN-NIMI.

(define LEMPIVÄRI (make-color 33 220 220))
(define NELIÖ (square 200 "solid" LEMPIVÄRI))

Sitten olikin jo aika tallentaa tuotokset kotihakemistoon. Ne jotka käyttivät WeScheme:ä siirsivät koodin Muistio-ohjelmaan ja tallensivat sen sitä kautta *.rkt tiedostoksi (WeSchemessä tallentaminen ei onnistunut koska Google-tunnukset olivat unohtuneet).

(square 200 "solid" LEMPIVÄRI)
Oppitunnit sujuivat hyvin, oppilaat koodasivat ahkerasti ja kokeilivat juttuja itsenäisesti. Tämä ryhmä kuunteli hyvin opettajan ohjeet ja osasi lukea myös käsikirjaa. Kotihakemistoon tallentaminen, kansion luominen, ja kahden ikkunan avaaminen vierekkäin näytölle olivat osalle oppilaista uusia juttuja.



En ole aikaisemmin vetänyt koodaustunteja näin, mutta hyvin tuntui uppoavan. Tässä lähestymistavassa hyvää oli se, että virheilmoitukset alkoivat heti saada sisältöä, koska olimme puhuneet heti merkkijonoista ja muuttujista. Ja käsikirjan käytön opettelu kuvien avulla tuntui myös  toimivan hyvin (tämä oli ensimmäinen kerta kun käytin käsikirjaa oppitunnilla).

Nyt on taas hyvä fiilis jatkaa materiaalin kehittelyä. Ainakin tällä ryhmällä suunnitelmien mukainen aloitusjakso toimi todella hyvin.

maanantai 31. elokuuta 2015

Racket - iskuryhmä aloitti syksyn suunnittelulla

Racket - iskuryhmä kokoontui tänään Tampereen yliopistolla Koodausta kouluun - materiaalin suunnittelun ja testauksen tiimoilta.

Tutustuimme aluksi materiaalin tämän hetken tilanteeseen osoitteessa: http://racket.koodiaapinen.fi. Valmiina tällä hetkellä on vasta käsikirja, jossa on osiot: Racket BSL, Kuvat - 2htdp/image, Racket Turtle sekä sanasto. Totesimme, että sanasto on tärkeä, jotta opettajat ja oppilaat käyttäisivät oikeita termejä puhuessaan ohjelmointiasioista. Animaatiot ja pelit osio tulee käyttöön syysloman jälkeen.

Seuraavaksi sisältöä lisätään Oppilaan tehtävien alle, ja sovimme että materiaalin alku toteutetaan niin, että sama materiaali soveltuu aloituspaketiksi kaikille luokkatasoille (myös opettajille). Sen lähestymistapa on käytännönläheinen eli tehdään ensin jotain ja vasta sitten puhutaan teoriasta. Opettajan diat koettiin tarpeelliseksi ja ne liitetään jollakin tapaa myös oppilaan materiaalin yhteyteen. Funktiosta eteenpäin tehtäviä sovelletaan eri matematiikan oppialueisiin. Varsinaista jakoa 7. luokan, 8. luokan ja 9. luokan tehtäviin ei haluttu mutta niihin toteutetaan värikoodaus niin, että se ohjaa aloittamaan helpoimmista (vihreät, siniset, punaiset ja mustat tehtävät).

Opettajan materiaali kootaan Eliademyyn Koodausta kouluun - kurssin alle. Tänne tallennetaan mm. oppilaan tehtävien malliratkaisut.  

Racket - iskuryhmässä ovat mukana seuraavat koulut ja opettajat:
  • Takahuhdin koulu (Kirsi Ranta, Eija Kuusipalo)
  • Hatanpään koulu (Janne Koponen)
  • Lielahden koulu (Pauliina Kähönen, Juha Niemi, Tiina Partanen)
  • Ylöjärven Yhtenäiskoulu (Tuula Havonen, Eeva Uitti)
  • Linnainmaan koulu  (Eerikki Rönkkö)
  • Kämmenniemen koulu (Eero Takkinen)
  • Tesoman koulu (Jukka Vilén, Juuso Jehkinen)
  • Kaukajärven koulu (Nina Pukkila, Kaisa Poikela)
  • Moision koulu (Lena Laitamäki) 
Syyskuussa Racket - koodauksen aloittavat Hatanpää, Takahuhti, Lielahti, Kaukajärvi sekä Ylöjärven yhtenäiskoulu. Syysloman jälkeen aloittavat Linnainmaa, Kämmenniemi, Moisio sekä Tesoma. Mukana on sekä valinnaisen ATK:n ryhmiä kuin matematiikan ryhmiä jokaiselta luokka-asteelta. Matematiikan ryhmissä on mukana ns. tavallisia ryhmiä sekä painotusryhmiä.

Matematiikan aihepiirejä ensimmäisiin oppilaan tehtäville löytyi seuraavasti:
  • vihreät: laskujärjestys, jaollisuus, prosenttiosa, murtoluvut, tasogeometria
  • siniset: neliö-neliöjuuri, sanalliset tehtävät funktiolla, prosenttilaskenta  
  • punaiset: avaruusgeometria (automaatti, joka laskee tilavuuksia ja pinta-aloja), funktion kuvaaja, todennäköisyys
Racket - iskuryhmä kokoontuu syys- ja lokakuussa tehtävien suunnittelun ja harjoittelun merkeissä Lielahden koululla ja töiden hedelmiä voi seurata Koodausta kouluun materiaan sivuilta.

Siitä se lähtee!!

Tiina

    keskiviikko 3. kesäkuuta 2015

    Pohdintaa OPS:in sisällöiksi ohjelmoinnin osalta luokilla 7-9

    Valtakunnallinen opetussuunnitelma ei ota kantaa siihen, mitä ja miten ohjelmointia pitäisi opettaa. Tässä on oma yritykseni avata ohjelmoinnin sisältöjä matematiikan OPS:in sisältöihin liittyen.

    Ohjelmoinnin perusteet voidaan käydä läpi monella eri ohjelmointikielellä tai ympäristöllä. Taulukkoon on avattu matematiikan OPS:ssa mainittuja aihepiirejä ohjelmoinnin näkökulmasta. Ohjelmoinnin opetuksessa yläkoulussa pääpaino on tekemisessä, uusiin käsitteisiin tutustutaan ohjelmoimalla niiden avulla jotakin. Ohjelmointiympäristöinä käytetään ohjelmoinnin opetukseen suunniteltuja graafisia ohjelmointityökaluja tai lausekielisiä ympäristöjä, joihin on tuotu opetukseen tarkoitettuja ohjelmointia helpottavia kirjastoja. Ohjelmoinnin opetuksen tarkoitus on tutustua laskennallisen ajattelun maailmaan yhden tai useamman ohjelmointiympäristön avulla. 


    7. luokan ohjelmointi
    ohjelmoinnin alkeet
    ·         lauseke, lausekkeiden yhdistäminen
    ·         lausekkeiden evaluointi (esim. stepperillä tai käsin)
    ·         tietotyypit (esim. numerot, merkkijonot, kuvat, boolean arvot)
    ·         aritmeettiset operaattorit (+, -, *, / )
    ·         loogisten virheiden ja syntaksivirheiden etsiminen ja korjaaminen
    ·         ohjeiden antaminen järjestyksessä

    Oppilas osaa kirjoittaa ohjelmakoodia, joka suorittaa järjestyksessä yksinkertaisia toimintoja, kuten laskee aritmeettisia lausekkeita tai  piirtää yksinkertaisia geometrisia kuvioita.
    väitelauseiden totuusarvon päättely

    looginen perustelu

    looginen päätteleminen

    muuttujan käsite


    ·         boolean arvot (true/false)
    ·         vertailuoperaattorit numeroille (<, <=, >, >=, =)
    ·         vertailuoperaattoreita muille kuin numeroille (esim. merkkijonot)
    ·         boolean operaattorit (and, or, not)
    ·         muuttujan käyttäminen

    Oppilas osaa kirjoittaa muuttujia sisältäviä ehtolauseita, joissa käytetään vertailuoperaattoreita numeroille tai merkkijonoille sekä boolean operaattoreita (and, or ,not).
    sääntöjen ja riippuvuuksien etsiminen

    sääntöjen ja riippuvuuksien esittäminen
    ·         haarautuva koodi ehtolauseen (if-then-else rakenne) tai valintalauseen avulla (case/cond)

    Oppilas osaa ohjelmoida haarautuvaa koodia.


    8. luokan ohjelmointi
    muuttujan käsite

    funktion käsite

    mallintaminen




    ·         funktion käsite, funktion parametri muuttujana, funktion paluuarvo
    ·         funktion määrittely- ja arvojoukko
    ·         funktion arvoon vaikuttavien parametrien (muuttujien) identifiointi

    Oppilas osaa suunnitella ja ohjelmoida funktioita, jotka ottavat  sisäänsä yhden tai useamman parametrin (muuttujan) ja palauttavat ulos yhden arvon (funktion arvon).  
    lausekkeen arvon laskeminen




    ·         funktion toiminnan testaaminen
    ·         abstraktio (muuttuja) – konkretia (testitapaus)

    Oppilas osaa testata kirjoittamansa funktion toiminnan (validoida, että funktio toimii kuten sen pitääkin).
    sääntöjen ja riippuvuuksien etsiminen

    sääntöjen ja riippuvuuksien esittäminen

    mallintaminen


    ·         tilan käsite
    ·         tilan muuttuminen ulkoisen tapahtuman johdosta
    ·         systeemin mallintaminen identifioimalla tilaan vaikuttavat parametrit

    Oppilas osaa suunnitella ja ohjelmoida yksinkertaisen tilakoneen, jonka tila muuttuu jonkin ulkoisen tapahtuman johdosta (esim. näppäimen painallus, sensorin arvon muuttuminen tai timerin laukeaminen).
    looginen perustelu

    looginen päätteleminen




    ·         ratkaisualgoritmin suunnittelu yhden tai useamman  muuttujan systeemille

    Oppilas suunnittelee ja ohjelmoi algoritmin, jolla voidaan ratkaista jokin ongelma (esim. ohjelmoi yksinkertaisen animaation, pelin tai sensoreilla varustetun robotin toiminnon).

    9. luokan ohjelmointi
    muuttujan käsite




    ·         laajennetaan muuttujan käsitettä muuttujiin, joita voi olla ennalta määrittelemätön määrä (esim. lista, taulukko)

    Oppilas osaa käyttää muuttujaa, johon voidaan tallentaa ennalta määrittelemätön määrä arvoja.
    lausekkeen arvon laskeminen




    ·         lausekkeen arvon laskeminen, kun muuttujan arvoja voi olla ennalta määrittelemätön määrä

    Oppilas osaa käyttää silmukkarakennetta ennalta  määrittelemättömän suuruisen datajoukon käsittelemiseen (while, for, rekursio, map tms.).
    sääntöjen ja riippuvuuksien etsiminen

    sääntöjen ja riippuvuuksien esittäminen


    ·         ongelman ja sen ratkaisun jakaminen osiin
    ·         toistuvien rakenteiden tunnistaminen ja erottaminen uudelleen käyttöä ajatellen

    Oppilas osaa jakaa ongelman osaongelmiin, ratkaista osaongelmat ohjelmoimalla ja yhdistää ohjelmalliset osat yhdeksi ratkaisuksi.