(toiminnot)

hwechtla-tl: Teema 4: kertaa kerta kerta kertaa

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


Toista-komento on mahtava, mutta joskus kaipaamme tapaa tehdä enimmäkseen samanlaisia, mutta vähän erilaisia asioita eri toistokerroilla. Tässä teemassa tutustutaan uuteen komentoon, jolla voi periaatteessa tehdä melkein millä tahansa tavalla muuttuvia toistoja.

Harjoitus 4a: lukujen luettelua

Toista-komennon perässähän on hakasulkeissa olevia komentoja. Näiden hakasulkeiden sisässä voi käyttää erityistä komentoa, jonka nimi on "kerta". Komennolla "kerta" voi tiedustella, kuinka mones toistokerta on menossa. "kerta" kirjoitetaan kohtaan, jossa voisi muuten olla luku (esimerkiksi "eteen"-komennon perään), ja sen tilalle tulee luku, joka riippuu siitä, kuinka monta kertaa olemme toistaneet. Sitä voi käyttää esimerkiksi näin:

? toista 5 [sano kerta]
1
2
3
4
5

Miksi Logo vastasi luettelemalla lukuja? Koska toistettava ohje oli "sano kerta". "kerta"-komento taas on ensimmäisellä toistokerralla 1, toisella kerralla 2 ja niin edelleen. Niinpä ensimmäisellä kerralla "sano kerta" tarkoittaa "sano 1", toisella kerralla se tarkoittaa "sano 2" ja niin edelleen.

"kerta"-komento toimii täsmälleen luvun tavoin eli sillä voi tehdä esimerkiksi laskutoimituksia ja kaikkea. Ainoa ero on se, että se ei ole aina sama luku, vaan kasvaa jokaisella toistokerralla yhtä suuremmaksi:

? toista 3 [sano kerta + 4]
5
6
7
? toista 5 [sano kerta / (kerta + 1)]
0.5
0.666666666666667
0.75
0.8
0.833333333333333

Yllä ensimmäinen luku on 1/2, toinen on 2/3, kolmas on 3/4 ja niin edelleen.

Yritäpä keksiä nyt, miten saat Logon luettelemaan luvut kymmenestä yhteen toista-rakenteella. Määrittele uusi komento "lähtölaskenta", joka luettelee nämä luvut ja tekee sitten komennon "sano [putuum]".

Harjoitus 4b: spiraaleja

Spiraalit ovat hyvä esimerkki kuviosta, jota on vaikea tehdä toista-komennolla sellaisenaan. Niissä kyllä mennään toistuvasti eteenpäin ja käännytään, mutta eteenpäin menon ja/tai kääntymisen määrä vaihtelee.

Neliön mallisen spiraalin saa aikaan tähän tapaan (isommat välit saa, jos kertoo kertaa isommilla luvuilla):

? toista 100 [et kerta oi 90]
? toista 100 [et kerta*3 oi 90]

Komentoa muuntelemalla voi saada hyvin erilaisia tuloksia:

? toista 100 [et kerta*kerta/30 oi 90]
? toista 100 [et 3000/(kerta+15) oi 90]
? toista 100 [et kerta*3 oi 87]
? toista 100 [et kerta*3 oi 120]

Jos löytää erityisen kivan spiraalin, se kannattaa tietysti muuttaa komennoksi:

? miten spi6
> toista 100 [et kerta oi 61]
> valmis
spi6 määritelty
? uusi
? spi6

Pyöreätkin spiraalit toki onnistuvat, jos vain menee tarpeeksi vähän eteenpäin kerrallaan. Tätä varten kerta kannattaa kertoa aika pienellä luvulla.

? toista 100 [et kerta*0.1 oi 10]
? toista 100 [et (101-kerta)*0.1 va 10]

Vähän erilaisia spiraaleja saa aikaan vaihtamalla kääntymisen määrää etenemisen määrän sijaan:

? uusi
? toista 100 [et 5 oi kerta*0.1]
? toista 100 [et 5 oi kerta*kerta*0.01]
? miten skarva
> toista 360 [et 10 oi kerta]
> valmis

Viimeisessä kuviossa lennokki palaa alkuun. Miksihän? (Vihje: "oi 181" on sama kuin "va 179".)

Kokeile nyt erilaisia omia spiraalejasi.

Harjoitus 4c: muuta omituista

Kuten huomaat, kerta-komennon käyttö vaatii usein aika monimutkaisia laskukaavoja. Tämä johtuu tietenkin siitä, että usein emme halua juuri lukuja 1,2,3,4... vaan jonkin muun lukusarjan, joka pitää sitten tuottaa laskemalla kerta-luvuista jollain kaavalla.

Erilaisia kaavoja on olemassa tietenkin ihan loputtomasti. Esimerkiksi "sin kerta" heilahtelee lukujen -1 ja 1 välillä:

? miten laineet
> toista 1000 [et 1 oi sin kerta]
> valmis

Kaava "modulo kerta 7" tuottaa lukuja, jotka menevät nollasta kuuteen uudestaan ja uudestaan:

? toista 10 [sano modulo kerta 7]
1
2
3
4
5
6
0
1
2
3
? uusi
? toista 100 [et 5 oi modulo kerta 15]

Vielä parempia tuloksia saa, jos ottaa joitain tämmöisiä lukuja ja esimerkiksi ynnää, kertoo tai jakaa ne keskenään:

? uusi
? toista 100 [et 10 oi (modulo kerta 15) * (modulo kerta 7)]
? uusi
? toista 100 [et 10 oi kerta*sin 10*kerta]

Kokeile nyt erilaisia kaavoja ja mitä kuvioita voit saada aikaan niillä. Tee suosikeistasi uudet komennot.

Harjoitus 4d: poikkeuksia kesken toiston

Aivan uusia mahdollisuuksia avaa se, jos voimme tietyllä toistokerralla tehdä yhtäkkiä jotain ihan muuta kuin muilla. Se on helppoa, sillä alla olevalla tavalla voi testata, ovatko kaksi lukua samat ja siis esimerkiksi onko menossa juuri neljäs toistokerta:

? toista 5 [sano kerta = 4]
ei
ei
ei
joo
ei

Logo sanoo joka toistolla, onko kerta sama kuin 4. Neljännellä kerralla se on, muilla ei.

Logossa on "jos"-komento, jolla voi tehdä asioita vain, kun haluamasi ehto toteutuu. Voimme esimerkiksi mielivaltaisesti päättää, että 66. toistokerralla tehdäänkin jotain hassua:

? uusi
? toista 100 [jos kerta = 66 [va 7] et kerta oi 90]

Jos-komento on vähän samanlainen kuin "toista": se ottaa kaksi syötettä, joista ensimmäinen kertoo milloin tehdään ja toinen kertoo, mitä tehdään. "Milloin tehdään"-syöte on jokin ehto, kuten "kerta = 66"; "mitä tehdään"-syöte on hakasulkeissa olevia komentoja, kuten toista-komennollakin.

Tällä tekniikalla voi myös tehdä keskelle kuviota jonkin lisäyksen:

? uusi
? toista 300 [jos kerta = 100 [teksti [jee!]] et 1 oi 1]

("teksti"-komennolla voi lisätä kuvaan tekstiä.)

Kokeile, miten saat edellisten harjoitusten ohjelmasi toimimaan eri tavalla, jos lisäät niihin sopivia jos-komentoja.

Harjoitus 4e: sisäkkäisiä toistoja

Toista-komentoja voi laittaa sisäkkäin, kuten tässä:

? toista 10 [va 90 toista 60 [oi 1 et 1]]

Jos käytän monien hakasulkeiden sisällä kerta-komentoa, se kertoo kaikkein lähimmän toista-komennon toistokerran, eli esimerkiksi alla "toista 60"-komento toimii aina samalla tavalla riippumatta siitä, mikä toistokerta "toista 10"-komennossa on menossa:

? toista 10 [va 90 toista 60 [oi 1 et kerta/20]]

Joskus saa hauskoja asioita aikaan käyttämällä eri tasoisia kerta-komentoja yhdessä:

? uusi
? toista 10 [va kerta*10 toista 360 [oi 1 et kerta/200]]

Erityisen hassuja tuloksia saa, jos antaa yhden toista-komennon toistokerran toisen toistomääräksi (siis "toista kerta ..."):

? to vyyhti
> toista 30 [et -10 toista kerta*3 [et 5 oi kerta*20/(kerta+10)]]
> valmis

Kokeile vielä muutamaa tällaista komentoa ja anna nimet kaikille suosikkikomennoillesi. Sitten talleta työsi tulokset:

? tallenna "harkat4

Nyt olet valmis seuraavaan teemaan.

Teema 5: Liikettä ruudulle


Pikalinkit:


kommentoi (viimeksi muutettu 02.05.2014 02:24)