Perushahmotusta ohjelmointiin 3: ohjausrakenteet
Ohjelmointiympäristöjä ja -kieliä on monenlaisia ja moneen tarkoitukseen suunniteltuja. Ohjelmointikielten ja monien muidenkin tietoteknisten työvälineiden ajattelutavassa on kuitenkin paljon samantapaisia piirteitä. Tämän voi nähdä esimerkiksi ohjausrakenteista.
Tässä artikkelissa tarkastellaan kahta ohjelmointikieltä – Pythonia ja Logoa – sekä Geogebraa, joka ei ole ohjelmointikieli, vaan koulukäyttöön suunniteltu matematiikan työvälineohjelma. Se käyttää kuitenkin samankaltaisia ajattelutapoja kuin ohjelmointikielet.
Monilla ohjelmointikursseilla tarjotaan ensimmäiseksi harjoitukseksi tulostuskomentoa PRINT ”Hello world!” Komento on samanlainen sekä Pythonissa että Logossa. Geogebran idea on erilainen. Tulostustoimintoa vastaa Teksti (engl. Text), joka luo muokattavan tekstiobjektin piirtoalueelle.
Syöttö ja tulostus on ovat konkreettisia ja auttavat ymmärtämään ihmisen ja tietokoneen välistä vuorovaikutusta. Varsinaisen ohjelmoinnin eli ongelmanratkaisun kannalta ne ovat kuitenkin vain pintaa, välttämättömiä sivutoimintoja. ”Onkin siis hyvä pitää ajatuksellisesti erillään tämä vuorovaikutus ja ’komputaatio’ eli varsinainen toiminta”, sanoi ohjelmointiasiantuntija Juuso Vuorinen sähköpostiviestissään. ”Komputaatio”, laskeminen, on tosin hyvin kolkko nimitys ongelmanratkaisuajattelulle, nimitettiinpä sitä sitten luovaksi, ohjelmoinnilliseksi tai algoritmiseksi.
Peräkkäisyys ja toisto
Tietokoneohjelma koostuu komennoista eli käskyistä. Tulkitsevassa ympäristössä, joita sekä Python että Logo ovat, on mahdollista testata komentojen toimintaa yksitellen kirjoittamatta varsinaista ohjelmaa. Ohjelmaan komennot kirjoitetaan peräkkäin ja niin ne myös toteutetaan. Peräkkäisyyttä ei aina mainita, kun puhutaan ohjausrakenteista [1]. Ehkä se on liian ilmeinen. Sen mieltäminen auttaa kuitenkin ymmärtämään tietokoneohjelmaa toisiaan seuraavien komentojen jonona.
Geogebrassa komennot kirjoitetaan syöttökenttään (engl. input) yksi kerrallaan. Tai toteutetaan pudotusvalikoista valittavin, valmiiksi ohjelmoiduin toiminnoin. Ohjelma pitää kirjaa niistä ja näyttää ne Konstruktion vaiheet -listallaan peräkkäin ohjelmakoodin tapaan. Esimerkiksi jänneseitsenkulmion [2], [3] piirtämiseen tarvitaan pisteitä, tietynsäteisiä ympyröitä, leikkauspisteitä ja monikulmio (kuva 1). – Kunkin objektin ominaisuuksissa on lisäksi välilehti ”Ohjelmointi”, jolle on mahdollista kirjoittaa ohjelmakoodia, josta Geogebrassa käytetään nimitystä ”skripti”.
Muut ohjausrakenteet ovat toisto ja valinta. Pythonissa toistorakenteet ovat for- ja while-silmukat. Toistojen määrän määrää edellisessä tapauksessa indeksi ja jälkimmäisessä looginen ehto. Ne ovat samoilla nimillä ja samaan tapaan toimivina useimmissa muissakin ohjelmointikielissä. Esimerkiksi Python-komento for i in range(100): print(i+1) tulostaa luonnolliset luvut 1, 2, 3, …, 100, sillä indeksi i käy läpi arvot 0, …, 99 (Tie koodariksi, harjoitus 4:1). Huomaa, että Python-kielen indeksointi alkaa nollasta.
Logon toistokomento on Toista (Repeat). Se tarvitsee kaksi parametria: toistokertojen määrän ja toistettavien komentojen listan. Esimerkiksi kilpikonnagrafiikan tapa piirtää säännöllinen seitsensakarainen tähti (kuva 2) perustuu tällaiseen toistoon: repeat 7 [forward 200 right 1080 / 7]. Toisto voidaan toteuttaa myös rekursiivisesti, mikä tarkoittaa sitä, että ohjelma kutsuu itseään, mahdollisesti joka kerta uusilla parametrien arvoilla. For-silmukalla toteutettavaa toistoa nimitetään usein iteratiiviseksi toistoksi erotukseksi rekursiivisesta toistosta.
Geogebrassakin on toistokomento, mutta sen nimi on Jono (engl. Sequence). Esimerkiksi komento, joka tuottaa saman tuloksen kuin yllä oleva Python-komento, näyttää Geogebrassa tältä: Jono(100). Geogebran indeksointi alkaa ykkösestä. Jos annetaan vain yksi parametri, niin tulkkiohjelma pitää sitä indeksin ylärajana. Lista alkaa tällöin ykkösestä, askellus samoin ykkösen välein. Indeksin kirjoittamista näkyviin ei vaadita yksinkertaisessa tapauksessa.
Jono-komento on siitä kätevä, että sille voidaan antaa ensimmäiseksi parametriksi – toteutettavaksi lausekkeeksi – myös geometrinen objekti, esimerkiksi Monikulmio: Jono(Monikulmio(A, A + (i, 0) , 11), i, 1, 10). Sen parametrit ovat kaksi kärkipistettä ja kärkien lukumäärä 11 (kuva 3). Kärkinä ovat annettu piste A ja siitä indeksin mukaan kasvavalla vaakaetäisyydellä oleva toinen piste. Näin saadaan sarja sisäkkäisiä säännöllisiä yksitoistakulmioita [4]. Muut parametrit ovat indeksi i sekä sen ala- ja yläraja.
Valinta ja hyppy
Yksinkertainen valintarakenne toteutetaan if-lauseella (komennolla). Sen muoto on Pythonissa [5] esimerkiksi if 2 == 2: print(”tosi”) else: print(”epätosi”) If-osan komento suoritetaan, jos ehto on tosi. Usein suoritettava komento kirjoitetaan selvyyden vuoksi omalle rivilleen sisennettyinä niin kuin yllä. Komentoja voi olla useita. Kukin kirjoitetaan silloin omalle rivilleen. Else-osa on valinnainen. Komennot suoritetaan, jos ehto on epätosi.
Logossa [6] on kaksi eri komentoa if ja ifelse: if 2 = 2 [print ”tosi] ifelse 2 = 3 [print ”tosi] [print ”epätosi] Ifelse-komennon jälkimmäinen vaihtoehto toteutetaan, kun ehto on epätosi. Jos ehto on epätosi, niin if-komento ei tee mitään.
Geogebrassa if-komennon rakenne muistuttaa edellisistä eniten Logon ifelse-komentoa, esimerkiksi: if(2 == 3, Teksti(”tosi”), Teksti(”epätosi”)) Komennolle annetaan kaksi tai kolme parametria. Näistä ensimmäinen on ehto. Toinen on komento, joka toteutetaan, kun ehto on tosi. Kolmas parametri on komento, joka toteutetaan, kun ehto on epätosi. Se on valinnainen.
Geogebrassa if-rakennetta voidaan käyttää myös muuten kuin itsenäisenä komentona: f(x) = if(x < 0, sin(x), x2). Tämä luo paloittain määritellyn funktion $\mathrm{f}\left(x\right)=\begin{cases}\sin\left(x\right):\ x<0 \\ x^2\ :\ \mathrm{muutoin}&\end{cases}$
Aikaisemmin käytettiin ohjelmoinnissa vielä neljättä ohjausrakennetta, ns. hyppykäskyä GO TO. Sen tehtävänä oli siirtää ohjelman suoritus johonkin muuhun ohjelmankohtaan kuin välittömästi seuraavaan. Hyppykäsky on kuitenkin tarpeeton, sillä ohjelma voidaan rakentaa aina kolmella edellä minituilla ohjausrakenteella [7]. Sen käyttö ei ole edes suositeltavaa siksi, että sitä käyttävän ohjelman toiminnan seuraaminen ja siten tarkastaminen on vaikeaa. Erityisen hankala se on silloin, kun sen osoittaman kohdan sijainti ohjelmakoodissa muuttuu ohjelmaa muutettaessa.
Pythonissa GOTO-komento kyllä on, mutta sanotaan, että se tuli mukaan vuoden 2004 aprillipilana. Jotkut ohjelmoijat ottivat sen kuitenkin tosissaan ja alkoivat käyttää sitä. Funktionaalisissa ohjelmointikielissä, jollainen Logokin on, GOTO-käskyn sijasta voidaan käyttää funktio- tai aliohjelmakutsuja. Geogebrassa GOTO-komennon kaltaisessa hyppykäskyssä ei ole mieltä, koska ensinnäkään siellä ei ole yhtenäistä ohjelmaa, vaikka onkin jono peräkkäin suoritettuja komentoja. Toiseksi kuhunkin komentoon tai tarkemmin komennon luomaan objektiin voidaan viitata myöhemmin suoraan objektin nimellä. Objektia voidaan muuttaa objektin ominaisuuksista tai geometristen objektien osalta raahaamalla objektia piirtoalueella.
Tietokoneohjelman rakenne voidaan esittää graafisesti vuokaaviona niin kuin mikä tahansa algoritmi tai prosessi. Siinä peräkkäisyys esitetään nuolilla, jotka kuvaavat ohjelman etenemistä toiminnosta toiseen. Toimintosymbolina on suorakulmio. Valintaa kuvaa neljäkäs. Toisto näkyy kaaviossa silmukkana. Aloitus ja lopetus (syöttö ja tulostus) ovat kulmistaan pyöristettyjä suorakulmioita.
Lähteitä sekä lisätietoja ja -tekemistä
[1] Esimerkiksi Ohjausrakenteet Pythonissa [2] Geogebra-materiaali Jänneseitsenkulmio osoitteessa https://www.geogebra.org/m/nt4xguzf
[3] Korhonen, Hannu: Sykliset monikulmiot 1234… Dimensio 6.5.2021 osoitteessa https://dimensiolehti.fi/sykliset-monikulmiot-1234/
[4] Geogebra-materiaali Yksitoistakulmiot osoitteessa https://www.geogebra.org/m/nkd8mekr
[5] Pythonin valintarakenteita voit kokeilla esimerkiksi sivulla https://www.w3schools.com/python/python_conditions.asp asentamatta Pythonia omalle koneellesi.
[6] Logo-versioita on paljon. Ilmaiseksi saatava on esimerkiksi FMSLogo osoitteessa https://fmslogo.sourceforge.io/
[7] Wikipedia-artikkeli Goto osoitteessa https://en.wikipedia.org/wiki/Goto