3. Muuttujat ja operaatiot 3.1
Sisällys Imperatiivinen laskenta. Muuttujat. Nimi ja arvo. Muuttujan nimeäminen. Muuttujan tyyppi. Operaattorit. Operandit. Arvon sijoitus muuttujaan. Aritmeettiset operaattorit. Arvojen vertailu. Operaatiot. Nimeäminen. Parametrit. Paluuarvo. Esimerkkejä: yksikkömuunnos, peli luvun arvaukseen ja keskiarvon laskeminen. 3.2
Muuttujat ja operaatiot Tietokoneet tarvitsevat vapaamuotoista tekstiä paljon yksityiskohtaisempia ohjeita. Tietokone osaa laskea nopeasti, mutta arkijärkeä koneella ei ole. Eräs tapa tarkentaa algoritmeja on esitellä äärellinen joukko muuttujia ja käyttää operaatioita muuttujien arvojen lukemiseen ja muuttamiseen. Muuttujien arvot algoritmin tietyssä vaiheessa määrittävät algoritmin tilan (state). Algoritmi siirtyy tilasta toiseen suorituksensa aikana. Tällainen laskenta on luonteeltaan imperatiivista. 3.3
Muuttujat Muuttuja (variable) koostuu nimestä (tunnuksesta) ja nimeen liittyvästä arvosta. Muuttuja ei ole matematiikasta tuttu käsite, jolla symboloidaan usein tuntematonta arvoa. Esimerkiksi yhtälössä x + 1 = 0 tuntematon arvo on x. Algoritmissa muuttujan arvo on yleensä tunnettu ja erityisesti erona on se, että arvo voi muuttua algoritmin edetessä vaiheesta toiseen. Muuttuja muistuttaa hieman suuretta eli mitattavaa ominaisuutta. Esimerkiksi lämpötila (T) on suure, jolla mitataan aineen lämpöenergian määrää. 3.4
Muuttujat Muuttuja nimetään sen tarkoitusta kuvaavasti. Algoritmien ymmärrettävyyden kannalta on tärkeää, että nimistä nähdään minkä tiedon säilyttämiseen muuttujia käytetään. Yleensä hyvä nimi on riittävän pitkä nimi. Esimerkiksi syntymäpäivän sisältävälle muuttujalle on parempi antaa nimeksi vaikkapa syntpvm kuin p. Nimeä lyhyesti vain, jos erehtymisen vaaraa ei ole. Nimissä käytetään enimmäkseen kirjaimia. Kirjainten seurana voi olla numeroita. Ohjelmointikielissä kielioppi ja vakiintunut tyyli määrää nimen kirjoitusasun. 3.5
Muuttujat Ohjelmointikielissä muuttujille annetaan yleensä tyypit ohjelmoijan toimesta. Esimerkiksi henkilön paino ja pituus on järkevää määritellä jollakin numeerisella tyypillä, kun taas etu- ja sukunimi ovat luontevasti merkkijonoja. Tyyppejä ei määritellä vielä, jotta algoritmien kirjoittaminen olisi helpompaa. Muuttujan laatu päätellään toistaiseksi nimen tai arvon avulla. Muuttujien oletetaan olevan alkeistyyppisiä. Muuttujalle ei voi antaa mittayksikköä. Esimerkiksi henkilön pituus esitetään muuttujana ilman metrin tunnusta (m), vaikka pituussuureen yksiköksi on sovittu metri. 3.6
Operaattorit Operaattoreiksi (operator) kutsutuille operaatioille on annettu omat symbolit. Operaattorin käsittelemät arvot ovat operandeja. Operandit voivat olla arvoja sellaisenaan (literaaleja), muuttujien arvoja tai muiden operaatioiden palauttamia arvoja. Useimmat operandit ovat kaksioperandisia. Sijoitusoperaattori ( ) korvaa muuttujan nykyisen arvon uudella. Ensimmäinen (vasen) operandi on muuttujan nimi. Toinen (oikea) operandi on uusi arvo. Sijoitus on usein algoritmin yksittäinen vaihe. ikä 14 Luentomateriaalissa nimet on kursivoitu, jotta muuttujat olisi helpompi tunnistaa. 3.7
Operaattorit sukunimi "Snow" Merkkijonoliteraalit suljetaan Javan tapaan lainausmerkkeihin. luokka 'F' Oletetaan, että hahmoluokan arvot on päätetty esittää yksittäisin merkein. Merkkiliteraalit suljetaan yksinkertaisiin lainausmerkkeihin eli niin sanottuihin hipsuihin. ikäalussa ikä Muuttujan ikä arvo (14) asetetaan muuttujan ikäalussa arvoksi. Sijoituksen jälkeen molemmilla muuttujilla on arvo 14, mutta arvot ovat erilliset, koska sijoituksen yhteydessä iän arvosta tehdään kopio. ikä 15 Muuttujan ikäalussa arvo on edelleen 14. 3.8
Operaattorit Tutut aritmeettiset operaattorit (+, -,, /) ovat käytettävissä. Laskujärjestys on koulusta tuttu ja sulkuja voidaan käyttää järjestyksen muuttamiseen. Sijoitusoperaattoria vahvempia: aritmeettisia lausekkeita lasketaan, kunnes saadaan yksittäinen arvo sijoitusta varten. tulosumma 1 2 + 2 2 Ensin lasketaan tulot 1 2 ja 2 2, toiseksi summataan tulot 2 + 4 ja lopuksi sijoitetaan summa (6) muuttujan arvoksi. Sijoitus muodostaa algoritmin vaiheen, vaikka ennen sijoittamista lasketaan aritmeettisilla operaattoreilla. 3.9
Operaattorit Muuttujan nykyistä arvoa täytyy toisinaan kasvattaa tai vähentää, jolloin saman muuttujan tunnus esiintyy molemmin puolin sijoitusoperaattoria. Erityisesti silmukoihin liittyvät kokonaislukuarvoiset laskurit (counter) muuttuvat usein yhden arvon verran. Tällaisissa tapauksissa muuttujan nykyistä arvoa käytetään vasemmalla puolella ja muuttuja saa uuden arvon vasta, kun oikea puoli on laskettu. ikä ikä + 1 Ensin haetaan iän vanha arvo (14 + 1) ja sitten lasketaan summa (15) ja lopuksi sijoitetaan summa muuttujan uudeksi arvoksi. 3.10
Operaattorit Vertailuoperaattorit (<, =, >,,, ) palauttavat kyllä (tosi) tai ei (epätosi) -arvon riippuen operandiensa arvoista. Käytetään erityisesti algoritmien päätöksissä. Aritmeettisia operaattoreita heikompia, sijoitusta vahvempia. onikää age 18 Ensin haetaan iän nykyinen arvo (15 18), jonka jälkeen lausekkeen arvoksi voidaan laskea ei. Tulos sijoitetaan lopuksi muuttujaan. 3.11
Operaatiot Operaattoreita monimutkaisemmat operaatiot ovat algoritmeja, joita kutsutaan (call) nimen avulla. Tunnuksen lopussa on aina kaarisulkeiden pari. Operaation tarvitsemat tiedot eli parametriarvot (parameter values) välitetään operaatiolle kirjoittamalla arvot kaarisulkeiden sisään. Arvot erotetaan pilkuilla. Parametriarvo on operandin tapaan literaali, muuttujan arvo jne. Operaation parametrien lukumäärä, laatu ja järjestys selviää operaation dokumentaatiosta. kopioi ("a.txt", "b.txt") Operaatio kopioi tiedoston a.txt sisällön tiedostoon b.txt. Kutsussa on tärkeää huomioida arvojen järjestys. 3.12
Operaatiot Operaatiolla voi olla paluuarvo (return value). Huomaa, että operaattori palauttaa aina arvon, mutta operaatio voi palauttaa arvon tai jättää sen palauttamatta. arvattava arvoluku() Operaation satunnaisesti valitsema luku sijoitetaan muuttujaan. Operaatiolle ei anneta arvoja. max annasuurin(42, 13) Operaatio päättelee kumpi parametriarvoista on suurempi ja palauttaa suuremman arvon (42), joka sijoitetaan muuttujaan. 3.13
Operaatiot Operaatioiden avulla voidaan kommunikoida käyttäjän kanssa. Oletetaan käytettävissä olevan operaatiot: lue: Palauttaa arvon, jonka käyttäjä antaa näppäimistöltä. tulosta: Tulostaa parametriarvonsa näytölle. Alku jaardit lue() metrit 0,9144 jaardit tulosta(metrit) Loppu 3.14
Peli luvun arvaukseen Pelin vapaamuotoinen versio voidaan muuttaa melko suoraviivaisesti tarkemmalle tasolle. Otetaan käyttöön muuttujat arvattavalle ja arvatulle luvulle. Arvattava luku alustetaan satunnaisluvun tuottavalla operaatiolla arvoluku. Arvaus luetaan käyttäjältä lue-operaatiolla. Vinkit ja onnittelut viestitään tulosta-operaatiolla. Päätökset ilmaistaan vertailuoperaattoreiden avulla. 3.15
Peli luvun arvaukseen Alku arvattava arvoluku() arvaus lue() arvaus < arvattava ei arvaus > arvattava ei tulosta("oikein!") kyllä tulosta("meni ali.") kyllä tulosta("meni yli.") kyllä arvaus arvattava ei Loppu 3.16
Keskiarvon laskeminen Päätellään tarvittavat muuttujat kaavasta = luku on luettu luku (termi x i ), i on laskuri, josta selviää monesko silmukan kierros on meneillään (termin indeksi), summa vastaa lukujen summaa (Σx i ), lkm vastaa lukujen lukumäärää (indeksin yläraja n) ja ka on lukujen keskiarvo ( ). x Silmukka voidaan toteuttaa usealla eri tavalla. Oletetaan nyt, että lukujen lukumäärä voidaan selvittää ennen silmukan aloitusta. x n i = 1 x i /n ( n > 0). 3.17
Keskiarvon laskeminen Alku summa 0 lkm lue() i 1 i lkm kyllä luku lue() summa summa + luku i i + 1 ei lkm > 0 kyllä ka summa / lkm tulosta(ka) ei tulosta( Ei lukuja! ) Loppu 3.18