JOHDATUS OHJELMOINTIIN



Samankaltaiset tiedostot
OHJELMOINTIA 1. JOHDANTO 2. OHJELMAN PERUSELEMENTIT 3. VUOROVAIKUTTEINEN OHJELMA

Esimerkki 1: Kahviautomaatti.

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

Johdatus Ohjelmointiin

Perusteet. Pasi Sarolahti Aalto University School of Electrical Engineering. C-ohjelmointi Kevät Pasi Sarolahti

811120P Diskreetit rakenteet

4. Lausekielinen ohjelmointi 4.1

811120P Diskreetit rakenteet

Java-kielen perusteet

Koottu lause; { ja } -merkkien väliin kirjoitetut lauseet muodostavat lohkon, jonka sisällä lauseet suoritetaan peräkkäin.

Automaatit. Muodolliset kielet

Alkuarvot ja tyyppimuunnokset (1/5) Alkuarvot ja tyyppimuunnokset (2/5) Alkuarvot ja tyyppimuunnokset (3/5)

Ohjelmoinnin perusteet Y Python

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Condes. Quick Start opas. Suunnistuksen ratamestariohjelmisto. Versio 7. Quick Start - opas Condes 7. olfellows 1.

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ehto- ja toistolauseet

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 5. marraskuuta 2015

Ohjelmoinnin perusteet Y Python

1. Universaaleja laskennan malleja

Python-ohjelmointi Harjoitus 2

Java-kielen perusteet

12. Javan toistorakenteet 12.1

4. Lausekielinen ohjelmointi 4.1

11. Javan toistorakenteet 11.1

Sähköposti ja uutisryhmät

Hahmon etsiminen syotteesta (johdatteleva esimerkki)

TIEA241 Automaatit ja kieliopit, kevät Antti-Juhani Kaijanaho. 12. tammikuuta 2012

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

12. Javan toistorakenteet 12.1

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Imperatiivisen ohjelmoinnin peruskäsitteet. Meidän käyttämän pseudokielen lauseiden syntaksi

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

Sisällys. 11. Javan toistorakenteet. Laskurimuuttujat. Yleistä

Algoritmit 1. Luento 3 Ti Timo Männikkö

Muuttujien määrittely

Sisällys. 3. Pseudokoodi. Johdanto. Johdanto. Johdanto ja esimerkki. Pseudokoodi lauseina. Kommentointi ja sisentäminen.

Tietotekniikan valintakoe

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Sisällys. 12. Javan toistorakenteet. Yleistä. Laskurimuuttujat

Avaa ohjelma ja tarvittaessa Tiedosto -> Uusi kilpailutiedosto

ITKP102 Ohjelmointi 1 (6 op)

Zeon PDF Driver Trial

Tutoriaaliläsnäoloista

Pinot, jonot, yleisemmin sekvenssit: kokoelma peräkkäisiä alkioita (lineaarinen järjestys) Yleisempi tilanne: alkioiden hierarkia

Algoritmit 1. Luento 4 Ke Timo Männikkö

Ohjelmoinnin perusteet Y Python

Tietueet. Tietueiden määrittely

Pythonin Kertaus. Cse-a1130. Tietotekniikka Sovelluksissa. Versio 0.01b

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Algoritmit 2. Luento 2 Ke Timo Männikkö

Ohjausrakenteet. Valinta:

Muistutus aikatauluista

Ohjelmoinnin perusteet Y Python

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Algoritmit 2. Luento 2 To Timo Männikkö

A TIETORAKENTEET JA ALGORITMIT

δ : (Q {q acc, q rej }) (Γ k {, }) Q (Γ k {, }) {L, R}.

ELM GROUP 04. Teemu Laakso Henrik Talarmo

OpenOffice.org Impress 3.1.0

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Taulukot. Jukka Harju, Jukka Juslin

3. Muuttujat ja operaatiot 3.1

Ohjelmoinnin perusteet Y Python

Osoitin ja viittaus C++:ssa

Perinteiset tietokoneohjelmat alkavat pääohjelmasta, c:ssä main(), jossa edetään rivi riviltä ja käsky käskyltä.

Ohjelmoinnin peruskurssi Y1

etunimi, sukunimi ja opiskelijanumero ja näillä

Condes. Quick Start opas. Suunnistuksen ratamestariohjelmisto. Versio 8. Quick Start - opas Condes 8. olfellows 1.

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat. Operaatiot. Imperatiivinen laskenta. Muuttujat. Esimerkkejä: Operaattorit.

Ohjelmoinnin perusteet Y Python

ITKP102 Ohjelmointi 1 (6 op)

Java-kielen perusteita

TIEA241 Automaatit ja kieliopit, kesä Antti-Juhani Kaijanaho. 22. toukokuuta 2013

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Rekursiolause. Laskennan teorian opintopiiri. Sebastian Björkqvist. 23. helmikuuta Tiivistelmä

Laskennan teoria (kevät 2006) Harjoitus 3, ratkaisuja

Ongelma(t): Mikä on Turingin kone? Miten Turingin kone liittyy funktioihin ja algoritmeihin? Miten Turingin kone liittyy tietokoneisiin?

5. HelloWorld-ohjelma 5.1

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Java-kielen perusteita

TIETOKONEEN ASETUKSILLA PARANNAT KÄYTETTÄVYYTTÄ

if-lauseen yksinkertaisin muoto on sellainen, missä tietyt lauseet joko suoritetaan tai jätetään suorittamatta.

Ongelma(t): Miten tietokoneen komponentteja voi ohjata siten, että ne tekevät yhdessä jotakin järkevää? Voiko tietokonetta ohjata (ohjelmoida) siten,

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

M =(K, Σ, Γ,, s, F ) Σ ={a, b} Γ ={c, d} = {( (s, a, e), (s, cd) ), ( (s, e, e), (f, e) ), (f, e, d), (f, e)

Lisää pysähtymisaiheisia ongelmia

Tietorakenteet ja algoritmit - syksy

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 5: Python

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Ksenos Prime Käyttäjän opas

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Ohjelmoinnin perusteet Y Python

Kirjoita oma versio funktioista strcpy ja strcat, jotka saavat parametrinaan kaksi merkkiosoitinta.

Kerta 2. Kerta 2 Kerta 3 Kerta 4 Kerta Toteuta Pythonilla seuraava ohjelma:

Transkriptio:

JOHDATUS OHJELMOINTIIN 1. JOHDANTO 1.1Taustaa ja ohjelmoinnin käsitemaailma 1.2 Erilaiset ohjelmointikielet ja paradigmat 1.3 Algoritmit ja tietorakenteet 1.4 Ohjelman perusrakenteet 2. OHJELMAN PERUSELEMENTIT 2.1 Tunnukset 2.2 Muuttujat 2.3 Tyypit 2.4 Muuttujan määrittely 2.5 Vakiot 2.6 Lauseet 2.7 Kommentit 3. VUOROVAIKUTTEINEN OHJELMA 3.1 Vuorovaikutteisuus 3.2 Sijoituslauseet 3.3 Syöttö ja tulostus funktiot 3.4 Rakenteinen ohjelmointi 1

4. VISUAL BASIC 4.1 Ohjelmointiympäristö 4.1.1 Johdanto 4.1.2 Lomakkeen käsittely 4.1.3 OLIO ohjelmoinnin aakkosia 4.2 Ohjelman luominen 4.2.1 Johdanto 4.2.2 Koodin kirjoittaminen 4.2.3 Ohjelmoijan apuvälineet 4.3 Ohjelman käyttöliittymä 4.3.1 Lomakkeet ja niiden käsittely 4.3.2 Lomakkeen objektit 4.3.3 Valikot 4.3.4 Työkalurivin luominen 4.3.5 Tiedon välittäminen 4.4 Ohjelman kirjoittaminen 4.4.1 Proseduurit ja koodin kirjoittaminen 4.4.2 Muuttujat 4.4.3 Ohjausrakenteet 4.4.4 Ohjelman testaus ja virheenkäsittely 4.5 Oliot ja olioluokat 4.5.1 Lomakeoliot ja objektitaulukot 4.5.2 Tiedostonhallinta 4.5.3 Omat olioluokat ja niiden käsittely 4.6 Tietokannat 4.6.1 Yleistä tietokantojen käsittelystä 4.6.2 Tietokantojen käyttö 4.6.3 SQL kyselykieli 2

1. JOHDANTO 1.1 Taustaa ja ohjelmoinnin käsitemaailma Käsitteen ohjelmointikieli määritteleminen on vaikeaa. Voidaan ajatella, että ohjelmointikieli on väline tai käyttöliittymä, jolla ihminen pystyy kertomaan tietokoneelle, mitä sen pitäisi tehdä. Tämän määritelmän heikkoutena on kuitenkin liiallinen laajuus. Määritelmän mukaan esimerkiksi HTML (hypertext markup language) luettaisiin ohjelmointikieleksi, mitä ei kuitenkaan yleensä haluta. Määritelmää voidaan rajoittaa kertomalla jotain kielen ilmaisuvoimasta. Tavallisesti ohjelmilla tarkoitetaan sellaisia rakenteissa tekstejä, joita pystytään käsittelemään Turingin koneella. Näin ohjelmointikieli on väline, jolla saadaan tietokone simuloimaan universaalia Turingin konetta. Tässä määritelmässä on kuitenkin se ongelma, että todellisten tietokoneohjelmien kohdalla eteen tulee resurssipula, kun taas Turingin koneen nauha on ääretön. Alussa esitetyllä määritelmällä on myös se heikkous, että se ei sano mitään siitä, missä muodossa tietokoneelle annettavien komentojen tulee olla. Aärelliset automaatit ja säännölliset kielet Tilakaaviot ja tilataulut Tarkastellaan sellaisten yksinkertaisten tietojenkäsittelyjärjestelmien kuvaamista ja ominaisuuksia, joilla on vain äärellisen monta mahdollista tilaa. Tällaisen järjestelmän toiminta voidaan kuvata äärellisenä automaattina eli äärellisenä tilakoneena (engl. finite automaton, finite state machine). Äärellisillä automaateilla puolestaan on useita vaihtoehtoisia esitystapoja, joista tilakaaviot (engl. state transition diagrams) lienee havainnollisin. Seuraavalla sivulla olevassa kuvassa on esitetty yksinkertaisen, neljänkymmenen sentin hintaista kahvia tarjoavan kahviautomaatin toimintaa kuvaava tilakaavio. Kaavioesityksessä käytettyjä merkintöjä on myös selostettu seuraavalla sivulla olevassa kuvassa. Automaatti ottaa vastaan syötteenä jonon 10 ja 20 sentin rahoja, ja "hyväksyy" syötejonon, jos siihen sisältyvien rahojen summa on vähintään neljäkymmentä senttiä. Automaatti ei anna vaihtorahaa ja tarjoilee vain yhdenlaista kahvia. Päätösongelmanäkökulmasta voidaan ajatella, että kuvan automaatti ratkaisee ongelman "riittävätkö annetut rahat kahvin ostamiseen?" Äärellisiä automaatteja voidaan yleensäkin käyttää yksinkertaisten päätösongelmien ratkaisujen mallintamiseen. 3

Yksinkertaisen kahviautomaatin tilakaavio: Tilakaavioiden merkinnät: Automaatio tila nimeltä q Alkutila q0 Lopputila: automaatti "hyväksyy" syötejonon, jos se jonon loppuessa on tällaisessa tilassa Syötemerkin a aikaansaama siirtymä tilasta q1, tilaan q2 Äärellisen automaatin käsitteen formalisointi, jotta äärellinen automaatin käsitteen tarjoamat mahdollisuudet voitaisiin täysin hyödyntää ja sen rajoitukset saataisiin selville, käsite täytyy formalisoida. Formalisointi perustuu seuraavaan mekanistiseen malliin automaatista ja sen toiminnasta: äärellinen automaatti M koostuu äärellistilaisesta ohjausyksiköstä, jonka toimintaa säätelee automaatin siirtymäfunktio σ, sekä merkkipaikkoihin jaetusta syötenauhasta ja nämä yhdistävästä nauhapäästä, joka kullakin hetkellä osoittaa yhtä syötenauhan merkkiä.' Automaatti käynnistetään erityisessä alkutilassa q O, siten että tarkasteltava syöte on kirjoitettuna 4

syötenauhalle ja nauhapää osoittaa sen ensimmäistä merkkiä. Yhdessä toiminta askelessa autotomaatti lukee nauhapään kohdalla olevan syötemerkin, päättää ohjausyksikön tilan ja luetun merkin perusteella siirtymäfunktion mukaisesti ohjausyksikön uudesta tilasta, ja siirtää nauhapäätä yhden merkin eteenpäin. Automaatti pysähtyy, kun viimeinen syötemerkki on käsitelty. Jos ohjausyksikön tila tällöin kuuluu erityiseen (hyväksyvien) lopputilojen joukkoon, automaatti hyväksyy syötteen, muuten hylkää sen. Turingin koneet Tämän automaattimallin kehitti brittimatemaatikko Alan Turing vuosina 1935 36 siis noin 10 vuotta ennen ensimmäisten tietokoneiden kehittämistä pohtiessaan mekaanisen laskennan rajoja. Näennäisestä yksinkertaisuudestaan huolimatta tämä Turingin automaattimalli on huomattavan voimakas. Ns. Churchin Turingin teesin mukaan peräti mikä tahansa mekaanisesti (lue: tietokoneella) ratkeava ongelma voidaan ratkaista Turingin koneella. Turingin koneita voidaan ajatella hyvin yksinkertaisena ohjelmointiformalismina, jolla voidaan ilmaista kaikki mitä vahvimmillakin ohjelmointikielillä tosin kömpelösti. Turingin koneiden etu on siinä, että juuri yksinkertaisuutensa takia niitä on helppo käyttää mekaanisen laskettavuuden (so. ohjelmoitavuuden) rajoja koskevissa yleisissä tarkasteluissa. Turingin kone on kuin äärellinen automaatti, jolla syötenauhan sijaan on toiseen suuntaan loputtoman pitkä työnauha, jota kone pystyy nauhapään välityksellä lukemaan ja kirjoittamaan merkin kerrallaan. Nauhan alussa on erityinen alkumerkki `>', ja sen käytettyä osaa seuraa loppumerkki '<'. Kone pystyy lukiessaan havaitsemaan nämä merkit, mutta se ei pysty kirjoittamaan niitä. (Tarkemmin sanoen: alkumerkin tilalle kone ei saa kirjoittaa mitään muuta merkkiä, ja loppumerkki siirtyy automaattisesti eteenpäin sitä mukaa kuin kone kirjoittaa nauhalle lisää merkkejä.) Kone käynnistetään alkutilassa q O. Tästä lähtien kone toimii askeleittain siirtymäfunktionsa ohjaamana: yhdessä siirtymässä se lukee nauhapään kohdalla olevan merkin ja päättää sitten tilansa ja luetun merkin perusteella, mikä on uusi tila, nauhapään kohdalle kirjoitettava uusi merkki, ja siirtyykö nauhapää käsitellyn merkin kohdalta yhden askelen verran vasemmalle vai oikealle.' Jos kone aikanaan pysähtyy hyväksyvänsä lopputilassa q, merkkijono kuuluu koneen tunnistamaan kieleen. 5

Ohjelmointikielen oppiminen voi perustua aikaisemmin opittuihin kieliin, esimerkiksi C++ ohjelmoijien on helppo oppia Java. Myös vähemmän toisiaan muistuttavissa kielissä on paljon samanlaisia piirteitä, joita voidaan pitää ohjelmointikielten peruskäsitteinä. Niiden tunteminen helpottaa myös aivan uudenlaisen ohjelmointikielen oppimista. Samoin kuin luonnollisen kielen oppimisessa myös ohjelmointikielen oppimisessa yleiset tiedot kieliopillisista rakenteista edistävät asioiden omaksumista. Ohjelmoija, joka osaa vain yhtä ohjelmointikieltä, valitsee mielellään tämän kielen ohjelmointitehtäviinsä eikä välttämättä ole halukas oppimaan uusia kieliä. Ohjelmointikielten yleiset periaatteet tunteva ohjelmoija pystyy paljon objektiivisemmin tekemään vertailuja eri kielten välillä ja valitsemaan aina kuhunkin tarkoitukseen sopivimman kielen. Ohjelmoinnin käsitemaailma Tietojenkäsittelyn osapuolia ovat yleisimmin ihminen ja tietokone. Koska tietokone on käytännöllisesti katsoen pelkkää elektroniikkaa, ihmisen ja tietokoneen välinen kommunikointi tulee toteuttaa koneen ehdoilla. Kun tietokone on toiminnassa, sen prosessori suorittaa käytännössä aina jotain ihmisen laatimaa ohjelmaa. Tietokoneohjelma (program) on yleisesti määriteltynä jonkin tietojenkäsittelytehtävän esitys sarjana sellaisia toimenpideohjeita, jotka on mahdollista suorittaa tietokoneella joko suoraan tai tiettyjen muunnosten jälkeen. Tietokoneen alkeistoiminnot perustuvat sen ymmärtämään kieleen eli konekieleen (machine language). Konekielisissä ohjelmissa on kahdenlaisia osia: operaatioita eli käskyjä ja operandeja, jotka ovat yleensä muistipaikkoja. Operaatioiden avulla ohjelmissa käsitellään muistipaikkojen sisältöjä. Ohjelmat ovatkin pohjimmiltaan tietokoneen muistissa olevan tiedon eli datan manipulointikäskysarjoja. Tietokoneen osaamat toimenpiteet eli operaatiot ovat hyvin yksinkertaisia ja niitä on vain rajallinen määrä. Tietokone osaa esimerkiksi laskea yhteen kaksi lukua ja tarkistaa, onko tulos nolla. Koska tietokoneessa kaikki asiat esitetään bittien avulla, konekieliset ohjelmat ovat käytännössä peräkkäistä ykkösiä ja nollia. Ihmisen kannalta konekieli on hyvin hankala tiedon ja toimenpiteiden esittämisen väline. Tämän vuoksi ihminen käyttää tietokoneelle ohjeita laatiessaan konekieltä korkeammalla tasolla olevia ohjelmoinnin välineitä. Ihminen kirjoittaa ohjelman ohjelmointikielellä (programming language), minkä jälkeen ohjelma käännetään (compile) tietokoneen avulla konekielelle, jotta kone voisi sen suorittaa (execute). Käännöksen suorittaa erityinen ohjelma, kääntäjä (compiler), joka käy ohjelman läpi rivi riviltä ja tuottaa tuloksena suorituskelpoisen (executable) ohjelman eli ns. exe koodin. Erotukseksi suorituskelpoisesta ohjelmasta ohjelmointikielellä kirjoitettua ohjelmaa kutsutaan lähdekieliseksi ohjelmaksi tai koodiksi (source program, source code). Jotta ohjelma voitaisiin suorittaa eli ajaa (run), käännöksen tulee onnistua virheettömänä eli ohjelman tulee "mennä käännöksestä läpi". Ohjelmassa ei ole tällöin ohjelmointikielen sääntöjen vastaisia piirteitä. Vaikka ohjelma menisikin käännöksestä läpi, siinä voi olla loogisia virheitä, joiden vuoksi ohjelma ei toimi tarkoitetulla tavalla. Kääntäjä antaa kahdentyyppisiä virheilmoituksia: varoituksia (warnings) ja virheilmoituksia (errors). Varoitukset eivät välttämättä estä suorituskelpoisen ohjelman tuottamista. Niiden avulla ilmoitetaan, että ohjelmassa on oudolta vaikuttavia piirteitä. Mikäli kääntäjä ilmoittaa aidoista virheistä, tämä tarkoittaa, että ohjelma ei ole kirjoitussääntöjen mukainen eikä suorituskelpoista ohjelmaa voida tuottaa. 6

Kommunikointihierarkia Kuva 1.1 Ihmisen ja tietokoneen kommunikointihierarkia ohjelmoinnin kannalta. 1.2 Erilaiset ohjelmointikielet ja paradigmat Ohjelmointikieliä on erilaisia. Ne voidaan jakaa karkeasti kahteen luokkaan: symboliset konekielet lausekielet eli korkean tason kielet Symboliset konekielet Symbolisissa konekielissä (assembly language) bitteinä esitettävät käskyt korvataan kirjainlyhenteillä eli käskyille annetaan symboliset vastineet. Esimerkiksi yhteenlaskukäskyn tunnisteena on ADD, vähennyslaskun SUB ja kertolaskun MUL. Muistipaikoille annetaan symbolisilla konekielillä kirjoitetuissa ohjelmissa niin ikään symboliset nimet, esimerkiksi PALKKA, VERO. Symbolisella konekielellä kirjoitettu käsky voisi olla esimerkiksi: SUB PALKKA, VERO (mikä tarkoittaa sitä, että palkasta vähennetään vero, jolloin PALKKA pienenee.) Symbolisella kielellä kirjoitetun ohjelman konekielelle kääntävää ohjelmaa kutsutaan assember kääntäjäksi (assembler). Symboliset konekielet ovat tietokonekohtaisia ja niitä käytetään, kun ohjelmoidaan tietokoneen laitteistoon läheisesti liittyviä asioita, kuten käyttöjärjestelmiä tai laiteajureita (ns. laiteläheinen ohjelmointi). Lausekielet Lausekielet eli korkean tason kielet (high level language) muistuttavat puhuttua kieltä. Niissä on hyvin suppea "sanavarasto" ja tarkat kielioppisäännöt eli syntaksi (syntax). Kielioppisäännöt ilmaisevat ohjelmien sallitun muodon. Ne ovat samankaltaisia kuin esim. suomen kielen kielioppi säännöt välimerkkisääntöineen. Kaikilla asioilla on lisäksi hyvin tarkat merkitykset eli semantiikka (semantics). Tämä on välttämätöntä, jotta ihminen ja kone voisivat ymmärtää ohjelman samalla tavalla. Lausekielet eivät ole suunniteltuja millekään laitteistolle erityisesti vaan ne ovat laiteriippumattomia. Kääntäjä tai tulkki Jotta lausekielellä kirjoitettu ohjelma voitaisiin ajaa jossain tietyssä laitteistossa, ohjelma on käännettävä laitteistoa varten suunnitellulla kääntäjällä konekielelle. Joskus kääntäjä korvataan tulkilla 7

(interpreter). Tällöin on kysymys siitä, että lähdekielisestä ohjelmasta konekielelle muunnetut käskyt suoritetaan välittömästi tulkkauksen jälkeen. Käytännössä tämä tapahtuu rivi riviltä. Kääntävissä järjestelmissä sen sijaan koko ohjelma käännetään ennen ajoa. Lausekielen, symbolisen konekielen ja konekielen välinen suhde Ihmisen puhekielen, korkean tason lausekielen, joka on jo ohjelmointikieli, symbolisen konekielen ja konekielen hierarkkinen järjestys suhteessa ihmisen ja koneen käsite maailmaan voidaan esittää seuraavasti: Kuva 1.2. Ohjelmointikielten ja konekielen suhde ihmisen ja tietokoneen käsitemaailmoihin. Ihmisen käsitemaailma edustaa korkeinta abstraktiotasoa ja tietokoneen matalinta. Sanalla paradigma on useita merkityksiä. Ohjelmointikielten yhteydessä sillä tarkoitetaan kokonaisuutta, joka muodostuu seuraavista kolmesta osasta: laskennallisesta mallista, käsitteistöstä ja välineistöstä. Perinteisessä imperatiivisessa paradigmassa laskennallinen malli perustuu RAMkoneeseen (random access machine) eli hajasaantikoneeseen. Jos halutaan toteuttaa esimerkiksi lajitteluohjelma, käsitteistöön kuuluvat kielen rakenteet kuten tietueet, osoittimet, toistorakenteet ja tiedostot. Välineistä taas tarkoittaa sitä, miten ohjelmoija kielen käsitteitä käyttää. Lajitteluohjelman tapauksessa välineistöä voivat olla linkitetty lista sekä syöttö ja tulostustoiminnot. Yleisesti ottaen paradigma antaa mahdollisuudet tai puitteet eri asioiden toteuttamiseen. Eri paradigmoissa on erilaiset mahdollisuudet eri asioiden toteuttamiseen. Jotkin tehtävät onnistuvat helpommin jossakin ohjelmointiparadigmassa, jotkin toiset asiat taas jossakin toisessa paradigmassa. Ohjelmointikielien jaottelu eri paradigmoihin ei ole välttämättä kovin helppoa. Imperatiivinen paradigma (käskykielet) lohkorakenteinen (proseduraalinen) oliokeskeinen hajautettu (rinnakkainen) Deklaratiivinen paradigma (esittelykielet) funktionaalinen looginen 8 tietokantakielet

Ohjelmointikielten jaotteluita on muitakin, järjestelmäohjelmointikielet, joita ovat esimerkiksi Pascal, C, C++ ja Java, ja toiseen ryhmään skriptikielet, kuten Perl, Python ja JavaScript. Järjestelmäohjelmointikielet on tarkoitettu komponenttien toteuttamiseen symbolisia konekieliä korkeammalla tasolla, kun taas skriptikielillä voidaan yhdistellä olemassa olevia komponentteja toisiinsa. Paradigmojen jaotteluun ei siis ole olemassa yhtä yleisesti hyväksyttyä tapaa. 1.3 Algoritmit ja tietorakenteet Algoritmit Ohjelmat käsittelevät aina käytännössä tietorakenteita. Niitä menettelytapojen ja sääntöjen kokoelmia, joiden avulla rakenteita käsitellään, kutsutaan algoritmeiksi (algorithm). Algoritmit käsittelevät aina jotain tietoa (syötteitä, lähtötietoja) siten, että syntyy uutta tietoa (tulosteita, tulostietoja). Algoritmeille on tyypillistä, että ne eivät ole mistään esitystavasta tai kielestä riippuvaisia. Ne ovat täysin yleisiä ja niitä voi esittää millä välineillä tahansa, esimerkiksi puhekielellä, graafisesta tai ohjelmointikielellä. On myös huomattava, että algoritmi ei ole yksinomaan ohjelmointiin liittyvä käsite. Esimerkiksi tavallista keittokirjaa voidaan pitää algoritmikokelmana. Reseptit voidaan tällöin nähdä algoritmeina ja raaka aineet tietorakenteina. Tietorakenteet Kaikki ohjelmat käsittelevät aina jotain tietoa. Tieto tulee esittää ohjelmissa ohjelmointikielen sisältämien mekanismien avulla. Korkeantason ohjelmointikielet tarjoavat välineitä, joilla on suorat vastineet reaalimaailman rakenteisiin. Ohjelmointikielet tarjoavat välineitä yksittäisten tietojen esittämistä varten, esimerkiksi ihmisen nimeä, kokeen arvosanaa tai päivämäärää varten. Myös monimutkaisempia rakenteita varten on olemassa esitystapoja. Esimerkiksi puhelinluettelon yhtä riviä varten on rakenne, joka mahdollistaa usean tiedon (tässä tapauksessa nimen, osoitteen ja puhelinnumeron) samanaikaisen käsittelyn. On olemassa myös rakenteita, jotka mahdollistavat suurten tietomäärien käsittelyn. Esimerkiksi yhden vuoden jokaisen päivän sademäärät voidaan koota yhteen tietorakenteeseen. Tietorakenne (data structure) on edellä esitettyjen esimerkkien valossa informaatioyksikkö, joka voi sisältää yhden yksittäisen tiedon tai tietojoukon. Taulukko Taulukko on hyvin yksinkertainen lineaarinen rakenne. Perusrakenne on valmiina useimmissa korkean tason ohjelmointikielissä helppo ohjelmoida, alkiot indeksoidaan ensimmäisestä viimeiseen, mihin tahansa alkioon voidaan heti viitata. Taulukon alkioiden väliin ei voi lisätä uutta alkiota eikä sieltä voi poistaa alkiot Rakenne on erittäin jäykkä, jos tällaisia toimintoja (päivityksiä) tarvitaan. Linkitetty lista (linked list) Se on taulukkoa paljon joustavampi rakenne monessa tilanteessa. Lista koostuu yksittäisistä alkioista, joihin kuhunkin on talletettu dataa ja osoitin (referenssi) seuraavaan alkioon. Listan kokoa ei ole ennalta 9

rajoitettu, vaan listaan voidaan lisätä ja siitä voidaan poistaa alkioita ajonaikaisesti listan kokoa rajoittaa vain käytettävissä oleva muisti, alkioita voi lisätä minne tahansa, alkioita voi poistaa mistä tahansa, alkioiden järjestystä voi vaihtaa, listan alkiot voivat olla samaa tyyppiä. Linkitetyn listan tärkein rajoitus on, että sen alkioita voidaan käydä läpi vain yksitellen eli sen alkioihin ei voi viitata suoraan (vrt. taulukko) Pino (stack) Pino on abstrakti tietotyyppi, jolle on määritelty seuraavat operaatiot: Push(x) lisää pinon päälle alkion x Pop() palauttaa ja poistaa pinon päällimmäisen alkion Top() palauttaa pinon päällimmäisen alkion (poistamatta sitä) IsEmptyo palauttaa tiedon siit ä, onko pino tyhjä Toimii siis samaan tapaan kuin pöydällä oleva korttipakka. Pino voidaan toteuttaa taulukon avulla tai linkitettynä listana. Jono (queue) Jono on abstrakti tietotyyppi, jolle on määritelty seuraavat operaatiot: Put(x) tai Enqueue(x) lisää jonon loppuun alkion x Get() tai Dequeue() palauttaa (ja poistaa) jonon ensimmäisen alkion First() palauttaa jonon ensimmäisen alkion IsEmpty() kertoo, onko jono tyhjä Jonokuri FIFO (First In First Out) Jono voidaan toteuttaa eri tavoin (taulukon avulla tai linkitettynä listana). Puurakenteet 10

Käsitteitä ja ominaisuuksia: Solmu (vertex) on puuhun kuuluva alkio, johon voidaan tallettaa dataa Väli, särmä, kaari (edge) on suorayhteys kahden solmun välillä Juuri (root) on puun ylin solmu Solmun lähin edeltäjä on sen isä (father, dad, parent). Kauemmista edeltäjistä käytetään nimeä isoisä, esi isä tai edeltäjä (grandfather, ancestor) Solmun lähinnä alemmat seuraajat ovat sen lapsia (children). Näiden lapset vastaavasti lapsenlapsia (grandchildren) Kullakin solmulla on vain yksi isä, juurella ei ole isää Solmulla voi olla o N kpl lapsia. Yleisessä puussa lasten määrää ei ole rajoitettu Saman isän lapset ovat toistensa sisaruksia (sibling) Lehti (leaf, external node) on solmu, jolla ei ole lapsia Muut solmut ovat puun sisäsolmuja (internal node) Lehdet ovat joskus rakenteeltaan erilaisia kuin sisäsolmut Polku (path) on yhteys kahden solmun välillä Juuresta mihin tahansa solmuun on vain yksi polku. Vastaavasti jokaisesta solmusta on vain yksi polku mihin tahansa toiseen solmuun Jokainen solmu on oman alipuunsa (subtree) juuri puiden joukkoon metsä (forest) Binääripuu (binary tree) on järjestetty puu, jossa jokaisella solmulla on täsmälleen kaksi lasta: vasen ja oikea (voivat olla tyhjiä) Binääripuu on tiivis (full), jos kaikki puussa olevat tasot ovat täynnä mahdollisesti alinta lukuun ottamatta 11

1.4 Ohjelman perusrakenteet TOP DOWN ja BOTTOM UP menetelmät johtavat käytännössä modulaariseen (modular) ohjelmointiin, jolla tarkoitetaan sitä, että ohjelma koostuu osaohjelmista eli aliohjelmista (sub program). Modulaarisuus on yksi hyvälle ohjelmalla asetettu vaatimus. Toinen vaatimus on strukturaalisuus, mikä edellyttää sitä, että käytettävä ohjelmointikieli tukee rakenteellista eli strukturaalista ohjelmointia (structured programming). Rakenteellinen ohjelmointi käyttää hyväksi kolmea ohjelmoinnin perusrakennetta, jotka kaikki ovat välttämättömiä ja yhdessä riittäviä hyvän ohjelman tekemiseksi. Nämä kolme perusrakennetta ovat 1. peräkkäisrakenne 2. valintarakenne 3. toistorakenne Rakenteita kutsutaan usein ohjausrakenteiksi tai kontrollirakenteiksi (control structure), koska niiden avulla ohjataan ohjelman kulkua. Peräkkäisrakenne Peräkkäisrakenne on yksinkertaisin ohjelmassa käytettävistä rakenteista. Siinä toteutetaan sarja toimenpiteitä peräkkäin. Valintarakenne Valintarakennetta käytetään silloin, kun ohjelmassa halutaan suorittaa jotain vain silloin, kun jokin ehto on voimassa. Valintatilanteesta on esimerkkinä seuraava virke: Jos sinulla on rahaa, käy elokuvissa. Tällainen rakenne voidaan liittää peräkkäisrakenteen sisälle, esimerkiksi päivittäisrutiinien joukkoon, kuten herää syö aamiainen mene kouluun opiskele palaa koulusta tee läksyt JOS (sinulla on rahaa) käy elokuvissa käy iltapesulla mene nukkumaan JOS rakenne voi sisältää vaihtoehtoisen MUUTEN haarana: JOS (sinulla on rahaa) käy elokuvissa käy nakkikioskilla MUUTEN katso tv:tä 12

Tässä MUUTEN haara suoritetaan tilanteessa, jossa rahaa ei ole, toisin sanoen kahdesta vaihtoehtoisesta toiminta mallista valitaan toinen ja vain toinen. JOS MUUTEN rakenteen sisässä voi olla toinen JOS rakenne: 13 JOS (sinulla on rahaa) käy elokuvissa käy nakkikioskilla } MUUTEN { JOS (tv:stä tulee jotain katsomisen arvoista) { katso tv:tä } MUUTEN { käy lenkillä } Edellisen rakenteen perusteella lenkille päästään, jos lompakko on tyhjä eikä televisiosta tule mitään mielenkiintoista. Toistorakenne Jos tehtäväkokonaisuuden suorittaminen edellyttää samanlaisina toistuvien yksittäistapahtumien toistamista, voidaan käyttää toistorakennetta. Esimerkiksi kuoppaa kaivettaessa toistuu lapiointi. Kuoppaa pitää kaivaa niin kauan, että se on tarpeeksi syvä. Luonnollisella kielellä vaatimus ja toimintaohje voitaisiin esittää seuraavasti: Kaivo kuoppaa, kunnes se on tarpeeksi syvä. Sama asia voidaan esittää muodollisemmin seuraavasti: TEE SEURAAVAA kaiva lapiollinen NIIN KAUAN KUIN (kuoppa on liian pieni) Sama voitaisiin esittää myös seuraavasti: NIlN KAUAN KUIN (kuoppa on liian pieni) kaiva lapiollinen Toistossa on periaatteena, että jokaisen toistokerran jälkeen (tai ennen sitä) tutkitaan jatkoehto uudelleen ts. "pyöritään silmukassa", kunnes voidaan lopettaa. Rakenteiden edut Rakenteiden etu on siinä, että niitä voidaan yhdistää: rakenteita voidaan kirjoittaa peräkkäin ja kunkin rakenteen sisässä voi olla mikä tahansa rakenne. Rakenteita voidaan kirjoittaa myös useita sisäkkäin. Peräkkäisyyttä ja sisäkkäisyyttä yhdistelemällä syntyy rakenteinen (tai lohkorakenteinen) ohjelma.

2. OHJELMAN PERUSELEMENTIT 2.1 Tunnukset Tunnukset (identifier) ovat nimiä erilaisille asioille, jollaisia ohjelmointikielissä ovat mm. muuttujat, vakiot ja tyypit. Tunnus alkaa aina kirjaimella. Ensimmäistä kirjainta voi seurata kirjaimia ja numeroita mielivaltaisessa järjestyksessä. Myös alaviivaa ("_") voi käyttää tunnuksissa (jopa ensimmäisenä merkkinä). Tunnuksissa isot ja pienet kirjaimet ovat usein eriarvoisia. Näin tunnukset C kieli ja c kieli viittaavat eri asiaan. On huomattava, että tunnuksissa ei voi käyttää useinkaan skandinaavisia kirjaimia å, ä, ö, Å, Ä j a Ö. Periaatteessa tunnukset voivat olla miten pitkiä tahansa. ANSI standardi määrittelee, että tunnukset erotetaan toisistaan 31 ensimmäisen merkin osalta, joten pidempiä nimiä ei välttämättä ole järkevää käyttää. 2.2 Muuttujat Muuttujia (variable) käytetään ohjelmissa tietovarastoina erilaisille asioille. Ohjelma voisi kysyä jokaiselta käyttäjältään esimerkiksi tämän nimeä ja tallettaa jokaisen nimen vuorollaan muuttujaan kayttajan_nimi (huomaa, että ä kirjaimen asemesta on käytetty a kirjainta). Täten kayttajan_nimi vaihtelee käyttäjän mukaan eli muuttuja saa erilaisia arvoja. Muuttujalle onkin tyypillistä, että sen arvo muuttuu ohjelman suorituksen aikana useaan kertaan (tästä nimitys muuttuja). Käytännössä muuttuja viittaa alueeseen tietokoneen muistissa. Muuttujan arvoksi kutsutaan sitä, mikä on muistialueen sisältönä. Voisi ajatella, että muistiin viitataan numeerisen osoitteen avulla, mutta on helpompaa antaa muuttujille omat nimet ja viitata muistiin näiden nimien avulla. Muuttujat nimetäänkin tunnusten avulla. Jokaisella muuttujalla on näin ollen kirjaimelta alkava nimi. Tietokoneen muistia voidaan ajatella lokerikkona, jonka lokeroissa muuttujia säilytetään; kun tiedetään lokeron nimi, voidaan käsitellä siellä olevaa muuttujaa. 2.3 Tyypit Oletetaan, että käytössä on muuttuja, jonka nimi on i. Kun ohjelma viittaa muuttujaan i, sen täytyy tietää, minkälaiseen olioon se viittaa. Ohjelman kannalta on oleellista tietää, onko i nimisessä muistipaikassa jokin luku, kirjain, teksti (merkkijono) vai jotain muuta, jotta ohjelmassa osataan tehdä muuttujalle oikeita operaatioita. Jos esimerkiksi muuttujan arvo halutaan tulostaa, on tärkeää tietää, onko tulostettavan muuttujan sisältämässä muistipaikassa luku vai kirjain. Käytännössä muistipaikassa on vain pelkkiä peräkkäisiä bittejä, jotka eivät ilman tulkintaa sisällä mitään informaatiota. Jotta ohjelma osaa käsitellä muistissa olevaa tietoa oikein, sen tulee tietää, kuinka bittejä tulkitaan. Ohjelmointiterminologiaa käyttäen sanotaan, että ohjelman pitää tietää muuttujan tyyppi (type). 14

Esimerkiksi C kielessä ennalta määriteltyjä yksinkertaisia tyyppejä ovat mm. seuraavat: int kokonaisluku (16 bittiä) long kokonaisluku (32 bittiä) float liukuluku double kaksoistarkkuuden liukuluku char merkki tai 8 bittinen kokonaisluku Todettakoon, että yhden ja saman muistipaikan sisältöä voidaan tulkita useammalla tavalla. Tulkinta on tavallaan suodatin, jonka läpi tietoa tarkastellaan. Jos 8 bittinen tieto halutaan nähdä merkkinä, käytetään "merkkisuodatinta". Jos se halutaan nähdä kokonaislukuna, käytetään "kokonaislukusuodatinta". 2.4 Muuttujan määrittely Muuttujan määrittely (variable declaration) tarkoittaa muuttujan nimen ja muuttujan tyypin liittämistä toisiinsa. Muuttujien määrittelyt sijoitetaan ohjelmalohkon alkuun. Ohjelmassa tulee ilmoittaa jokaisesta muuttujasta sen tyyppi seuraavasti: int indeksi; char merkki; Muuttujien määrittelyt sijoitetaan siis ohjelmassa ohjelmalohkon alkuun. Samaa tyyppiä olevat muuttujat voi koota listaksi, jossa jäsenet erotetaan toisistaan pilkuilla seuraavaan tapaan: int lukul, luku2, lukua; Ohjelmista tulee yleensä kuitenkin selkeämpiä, mikäli kaikki muuttujien määrittelyt kirjoitetaan omille riveilleen. Muuttujat tulee aina nimetä niiden käyttöä kuvaavalla tavalla, esimerkiksi sademaara, pisteet, palkka,... eikä arvoituksellisilla koodilyhenteillä kuten s, pi, pa. Muuttujan määrittely saa aikaan sen, että tietokoneen muistista varataan tilaa muuttujaa varten. Eri tyypit tarvitsevat erilaisen määrän tilaa: merkille riittää aina yksi tavu, kokonaisluku (int) vie kaksi tavua, pitkä kokonaisluku (long) ja liukuluku (float) vievät 4 tavua. Määrittelyn yhteydessä muuttujalle voidaan antaa alkuarvo seuraavalla tavalla: int summa = 0, Jos muuttujaa ei määritellä mutta sitä yritetään käyttää ohjelmassa, kääntäjä huomaa virheen ohjelman käännös vaiheessa ja antaa tällöin yleensä virheilmoituksen "Undefined symbol..." eli määrittelemätön symboli. 15

2.5 Vakiot Kaikissa ohjelmissa käytetään yleensä joitain kiinteitä lukuarvoja laskutoimituksissa. Toisaalta ohjelmien tulosteissa käytetään samanlaisina toistuvia tekstejä. Näissä tilanteissa tarvitaan vakioita (constant). Vakiot jaetaan kahteen ryhmään: paljaat vakiot eli literaalivakiot nimetyt vakiot. Paljaat vakiot Paljaat vakiot voidaan ryhmitellä seuraavasti: numeeriset vakiot, joita ovat esim. 5, 5.0, 5, 12.4 merkkivakiot, joita ovat esim. 5, A, a merkkijonovakiot, jollainen on esim. "Visual Basic" Nimetyt vakiot Paljaalla vakiolle voidaan antaa nimi, jota voidaan käyttää ohjelmassa kuten paljasta vakiota. Tällöin on määritelty nimetty vakio. Nimetty vakio määritellään C kielen ohjelmassa esimerkiksi seuraavasti: # define PII 3.14 2.6 Lauseet Ohjelman varsinainen toiminta tapahtuu lauseissa (statement). Lauseessa tehdään jokin toimenpide, esimerkiksi kahden luvun kertolasku, merkkijonon tulostaminen tai merkin lukeminen. ympyran_ala = Pll * ympyransade * ympyransade; jossa muuttujan ympyran_ala arvoksi sijoitetaan "=' merkin oikealla puolella olevan laskutoimituksen tulos. Tämä on esimerkki lausetyypistä, jota ohjelmissa tarvitaan usein. Lauseella on C kielessä ominaista, että se päättyy aina puolipisteeseen. 2.7 Kommentit Ohjelmiin voi ja niihin kannattaa liittää ohjelman toimintaa selittäviä tekstejä eli kommentteja (comment). Tällaiset selitystekstit sijoitetaan C kielessä merkintöjen /* ja */ väliin esimerkiksi seuraavasti. 16 / * Tämä on kommentti */ On huomattava, että kommentti päättyy vasta loppumerkkiin, vaikka tämä sijaitsisi eri rivillä kuin

alkumerkki. Loppumerkin unohtamisesta saattaa seurata, että koko loppu ohjelma tulkitaan kommentiksi. Muuttujien merkitykset kannattaa kommentoida muuttujien määrittelyjen yhteydessä, elleivät muuttujien ien nimet ole täysin tarkoitustaan kuvaavia. Kommentit voidaan kirjoittaa seuraavaan tapaan: int Ikm; / * ohi ajaneiden autojen Ikm */ int k nopeus; / * autojen mitattu keskinopeus */ 3. VUOROVAIKUTTEINEN OHJELMA 3.1 Vuorovaikutteisuus Ohjelmat keskustelevat käyttäjien kanssa eli esittävät käyttäjille kysymyksiä, vastauksia, kehotuksia jne. Käyttäjät puolestaan vastaavat ohjelmien esittämiin kysymyksiin, toimivat ohjelmien kehotuksien mukaan jne. Tällaisia ohjelmia kutsutaan vuorovaikutteisiksi tai interaktiivisiksi (interactive). Vuorovaikutus sisältää tiedon lähettämisen ja vastaanottamisen. Ohjelmoija tarkastelee vuorovaikutussuhdetta aina ohjelman kannalta. Kun ohjelmassa ilmoitetaan käyttäjälle jotain, kyseessä on tiedon lähettäminen eli tulostustoiminto (kirjoittaminen). Kun taas ohjelma ottaa vastaan käyttäjän antamia syötteitä, kyseessä on ohjelman kannalta lukeminen. Tätä vuorovaikutussuhdetta, jota ohjelmissa tarkastellaan aina ohjelman kannalta, havainnollistetaan alla olevassa kuvassa. Kuva 3.1 Vuorovaikutus ohjelman kannalta; ohjelma (suorakulmio) lukee käyttäjän syöttämiä tietoja ja kirjoittaa käyttäjälle viestejä. 3.2 Sijoituslauseet Ohjelman varsinainen toiminta toteutetaan käytännössä erilaisissa lauseissa, joista keskeisin on sijoituslause (assignment statement). Siinä asetetaan tai vaihdetaan muuttujan arvo. Sijoituslauseessa on esimerkiksi C kielessä neljä osaa: muuttujan nimi sijoitusoperaattori lauseke ; 17

Sijoituslauseen yleinen muoto on seuraava: muuttujan_nimi = lauseke; Lauseke (expression) voi olla vakioarvo, yksittäinen muuttuja, funktion kutsu tai laskutoimitus, joka sisältää muuttujia, vakioita, funktion kutsuja ja operaattoreita. Yksinkertaisia sijoituslauseita, joissa lausekkeen muodostavat yksittäiset vakiot tai muuttujat, ovat esim. seuraavat: x = 1; lkm = 0; Z = Y; Sijoituslause, jonka oikealla puolella on funktion kutsu, näyttää seuraavalta: x = pow (y, 2); Tässä pow0 on matemaattinen funktio, joka korottaa y:n arvon toiseen potenssiin. Tulos sijoitetaan = arvoksi. Esimerkki laskutoimituksesta on PII * sade * sade missä PII on vakio, sade muuttujan nimi ja * kertolaskuoperaattori. Tämä lauseke voidaan sijoittaa sijoituslauseessa "=" merkin oikealle puolelle, jolloin saadaan sijoituslause ala = PII * sade * sade; 3.3 Syöttö ja tulostus funktiot Ohjelmien kirjoittaminen ei ole sattumanvaraista esimerkiksi C kielisten lauseiden peräkkäin kirjoittamista mielivaltaisessa järjestyksessä vaan systemaattista toimintaa, joka vaatii ajattelua. Jotta ohjelma voisi toimia käytännössä, sen logiikan tulee toimia myös paperilla. Jos ohjelmaa ei pystytä suunnittelemaan kynän ja paperin avulla, sen kirjoittaminen ohjelmointikielellä on mahdotonta. Ohjelmien suunnitteluun on olemassa erilaisia formaaleja (so. muodollisia, tarkkojen sääntöjen mukaisia) välineitä: lohkokaavioita, vuokaavioita ja pseudokoodeja. Ohjelman yleinen rakenne Jokaiseen ohjelmaan kuuluu yleensä kolme vaihetta: 1. tietojen syöttö (käyttäjä syöttää, ohjelma ottaa vastaan) 2. laskenta 3. tietojen tulostus. 18

C kielen yleisimmin käytetty tulostuslause (output statement) alkaa sanalla printf. Tämä on funktio, joka tulostaa kuva ruudulle haluttua tietoa. Esimerkiksi lause printf (Hiiohoi"); tulostaa kuvaruudulle tekstin Hiiohoi. Tulostuslauseessa tulostetaan tekstiä lainausmerkkien sisässä. Tekstin lisäksi tulostuslauseessa halutaan usein tulostaa myös lukuja. Jos sen sijaan tulostuslauseessa halutaan tulostaa jokin muuttuva lukuarvo, jota varten ohjelmassa on otettu käyttöön muuttuja, joudutaan toimimaan toisin. Olkoon ohjelmassa seuraava määrittely: int sademaara; Muuttuja sademaara kuvatkoon tietyn päivän sademäärää millimetreinä. Jos ohjelmassa halutaan tulostaa muuttujan sademaara arvo, ei voida kirjoittaa seuraavasti: printf ("Tänään satoi sademaara mm'); / *VÄÄRIN*/ sillä tällöin tulostuisi seuraava teksti: Tänään satoi sademaara mm Jotta saadaan haluttu lopputulos, C:ssä toimitaan seuraavasti: tekstiin sijoitetaan muuttujan arvoa varten muotoilu määre. Itse muuttujan nimi kirjoitetaan erilleen lainausmerkeissä olevasta tekstistä. Se kirjoitetaan tekstin perään pilkulla erotettuna seuraavasti: printf ("Tänään satoi %d mm", sademaara); Edellä %d on muotoilumääre muuttujalle sademaara. Kun lause suoritetaan, %d korvataan sademaara muuttujan arvolla. Jos muuttujan arvo on 12, tulostuisi seuraava teksti: Tänään satoi 12 mm C kielen syöttölauseissa (input statement; käyttäjä syöttää, ohjelma ottaa vastaan) käytetään yleisimmin kahta funktiota, scanf() ja gets(). 3.4 Rakenteinen ohjelmointi Rakenteinen ohjelmointi (structured programming) on systemaattinen tapa tuottaa ohjelmia, joita on helppo ymmärtää, helppo muuttaa ja helppo testata. Rakenteinen ohjelmointi edellyttää selkeiden ohjelmarakenteiden käyttöä. Rakenteisuuden tulee ilmetä myös ohjelman kirjoitusasusta. Tämän vuoksi ohjelmissa käytetään tekstin sisennyksiä. Vaikka sisennyksillä ei ole kääntäjän kannalta merkitystä, niillä on suuri merkitys ohjelman lukijalle. If lauseen yksinkertaisin muoto on sellainen, missä lauseet joko suoritetaan tai jätetään suorittamatta. Ohjelmarakenteita voidaan kuvata vuokaavioiden (flow chart) avulla. Kaavioissa käytetään sovittuja graafisia symboleja. Esimerkiksi yksittäisen vaihtoehdon if rakenne voidaan esittää seuraavanlaisena vuokaaviona: 19

Kuva 3.2. If rakenne, jossa on valittavana yksi vaihtoehtoinen toiminta. Salmiakkikuvio kuvaa ehtoa ja suorakaide lauseita, jotka suoritetaan ehdon ollessa tosi; nuolet kuvaavat ohjelman suorituksen etenemistä. Kokonaisia ohjelmia voidaan suunnitella kirjoittamalla vuokaaviota peräkkäin. Pseudokoodin käyttö on yleensä kuitenkin kätevämpää. Käyttäjän kannalta olisi mukavaa, jos ohjelmassa tehtäisiin jotain myös siinä tapauksessa, että ehto ei ole tosi. Tällaista tilannetta varten valintalause voikin sisältää vaihtoehto osan, joka suoritetaan, ellei if ehto ole voimassa. Vaihtoehto osa alkaa avainsanalla else. Kuva 3.3 Vuokaavioesitys if else rakenteelle. Ehdon ollessa tosi haaraudutaan oikealle, epätodessa tilanteessa vasemmalle. Kumpaakin reittiä päästään jatkamaan ohjelman suoritusta if eise rakennetta seuraavasta lauseesta. Valinta useasta vaihtoehdosta Y rakennetta voidaan käyttää monivalintatilanteissa, joissa pitää valita yksi useasta mahdollisesta vaihtoehdosta. Esimerkki tällaisesta tapauksesta voisi olla kolmen vaihtoehdon valintatilanne, jossa pitää tutkia, onko luku nolla, negatiivinen vai positiivinen. Rakenne, jota voidaan käyttää, on seuraava: 20 if (ehto) lauseet else if lauseet else lauseet

While toistorakenne Toistorakenteen avulla voidaan suorittaa samoja lauseita toistuvasti peräkkäin. Toistojen määrä on joko etukäteen määrätty tai se riippuu ohjelmassa esitetyistä ehdoista. Tarkastellaan aluksi jo tuttua if rakennetta: if (rahaa > 100) { ostalevyke(); } Tässä ohjelmanosassa suoritetaan lause (oikeastaan aliohjelman kutsu) ostalevyke() (jonka toteutuksesta ei tässä tarvitse välittää), mikäli muuttujalla rahaa on suurempi arvo kuin 100. Ohjelmaan tehdään seuraava muutos: if sana korvataan sanalla while. Tällöin saadaan ohjelmanosa: while (rahaa > 100) { ostalevyke(); } Kun ohjelmassa tullaan peräkkäisrakenteen ohjaamana while lauseeseen, se toimii ensin kuten iflause: aaltosulkeiden välissä olevat lauseet suoritetaan, mikäli ehto on tosi. Kun on päästy while lohkon loppuun, palataan while rakenteen ehto osaan tutkimaan ehtoa uudelleen. Mikäli ehto on edelleen tosi, suoritetaan lauseet uudelleen. Näin jatketaan, kunnes ehto muuttuu epätodeksi. Edellä olevassa esimerkissä on selvästi vikaa, koska siinä ehto (rahaa > 100) näyttää pysyvän jatkuvasti totena. Asian todellinen laita riippuu tietysti ostalevyke() toimenpiteen toteutuksesta: jos siinä pienennetään muuttujan rahaa arvoa, asia on kunnossa. Seuraavassa while silmukassa muuttujan rahaa arvoa pienennetään jokaisella kierroksella, joten ohjelma toimii varmemmin: while (rahaa > 100) { osta levyke(); rahaa = rahaa levykkeen hinta; } While rakenteelle voidaan esittää seuraavanlainen vuokaavioesitys: Kuva 3.4 While rakenteen vuokaavioesitys. Ehdon (salmiakki) ollessa tosi suoritetaan silmukan 21

sisäiset lauseet (suorakaide) ja palataan tutkimaan vieläkö ehto on tosi; kun ehto on muuttunut epätodeksi, ohjelma jatkaa eteenpäin. While lausetta käytettäessä on pidettävä mielessä se seikka, jonka unohtaminen johtaa tyypilliseen ohjelma virheeseen: on muistettava vaikuttaa ehtolausekkeen arvoon lauselohkon sisällä siten, että se muuttuu joskus epätodeksi (muuten jäädään "ikuiseen silmukkaan"). For toistorakenne For rakennetta kannattaa käyttää, jos toistojen määrä tiedetään ohjelmassa ennen kuin toistot aloitetaan. Jos esimerkiksi halutaan sademäärätiedot viikon jokaiselle päivälle, tiedetään, että sademääriä on seitsemän kappaletta, ja näin ollen sademäärää pyydetään vuorovaikutteisessa ohjelmassa seitsemän kertaa. For lauseessa toistojen lukumäärää hallitaan ohjelmassa olevan toistolaskurin avulla. Laskurin arvo asetetaan toistojen alussa ykköseksi ja sitä kasvatetaan jokaisella toisto kerralla yhdellä. Toistot päätetään, kun laskuri on ylittänyt sovitun loppuarvon. Laskuriin kohdistuu näin ollen kolme oleellista operaatiota. Nämä ovat 1. laskurin alkuarvon asettaminen 2. laskurin arvon vertaaminen loppuarvoon 3. laskurin arvon kasvattaminen yhdellä. Kuva 3.5 For lauseen vuokaavioesitys. 1 = toistolaskurin alkuarvon asettaminen; 2 = toistoehdon tutkiminen (laskurin arvon vertaaminen loppuarvoon); 3=laskurin arvon kasvattaminen. Numeroimattomassa laatikossa suoritetaan toistettavat lauseet. Do... while toistorakenne Jo käsitellyt toistolauseet while ja for ovat molemmat ns. alkuehtoisia toistolauseita. Lauseessa olevan ehdon arvo tutkitaan, ennen kuin siirrytään toistettavaan lauseosaan. Seuraavaksi käsiteltävä toistolause on loppuehtoinen do... while toistorakenne. Siinä suoritetaan ensin yksi toistokerta ja sen jälkeen tutkitaan pitääkö toistaa uudestaan. Lauseen vuokaavioesitys on seuraava: 22

Kuva 3.6. Do...while lauseen vuokaavioesitys. Toistettaviksi tarkoitetut lauseet suoritetaan ensin yhden kerran ja sen jälkeen tutkitaan, pitääkö ne suorittaa uudestaan. 4. VISUAL BASIC 4.1 Ohjelmointiympäristö 4.1.1 Johdanto Mikä on Visual Basic? Kun Microsoft julkaisi vuonna 1991 Visual Basicin ensimmäisen version, se oli merkittävä helpotus vaikeana pidettyyn Windows ohjelmointiin: aloittelijakin pystyi sen avulla luomaan toimivia ja tyylikkäitä ohjelmia. Uusien versioiden mukana Visual Basiciin on tullut monia parannuksia, ja se soveltuu laajojenkin ohjelmien tekemiseen. Enää Basic ei ole pelkästään aloittelijoille tarkoitettu harjoitteluohjelmointikieli, josta täytyy siirtyä pois taitojen kehittyessä. Tässä yhteydessä käytetään Visual Basicin versiota 6.0. Melkein kaikki esimerkit toimivat kuitenkin suoraan tai pienin muutoksin vanhemmilla versioilla. Sen sijaan VB. NETin käyttöön ei perehdytä, koska kieli poikkeaa monilta osin Visual Basicin aiemmista versioista. VB. NETiin siirtymiseen ei ainakaan toistaiseksi ole syytä, vaan tavallinen Visual Basic riittää melkein kaikkiin tarkoituksiin paremmin kuin hyvin. Etuna VB. NETiin verrattuna on ohjelmien toimiminen vanhoissa käyttöjärjestelmissä. Visual Basicin käynnistäminen Napsauta Start painiketta (Käynnistä) hiirellä ja siirrä hiiren osoitin kohtaan Programs (Ohjelmat). Napsauta Programs valikosta Microsoft Visual Basic 6.0 ohjelmakansiota. 23

Käynnistettyäsi ohjelman näytölle avautuu Visual Basicin ohjelmointiympäristö ja New Projectvalintaikkuna. New Project ikkunan eri välilehtien avulla valitaan, millaista projektia halutaan käsitellä. New välilehden avulla voidaan luoda uusi projekti. Existing välilehden kautta voidaan avata jokin aikaisemmin tehty projekti. Recent välilehdellä ovat viimeksi avatut projektit. Valitse New välilehdeltä uuden projektin tyypiksi Standard EXE ja napsautti Open painiketta (Avaa). Oletusasetusten mukaan Visual Basic lataa ohjelmointiympäristöön joukon ikkunoita. Tärkein näistä ikkunoista on näytön oikeassa laidassa oleva Project Explorer ikkuna, jolla voit käsitellä ohjelmointiprojektia ja kaikkia siihen kuuluvia tiedostoja. Standard EXE projektissa on oletuksena yksi tyhjä lomake, joka avautuu näytölle valmiiksi, kun uusi ohjelmointiprojekti luodaan. Tämän jälkeen voitaisiin ohjelmointi aloittaa vaikkapa muokkaamalla tuota lomaketta. 24

Visual Basicin valikot, näppäimet ja työkalut Valikkorivi Valikkorivin valikoista löytyvät kaikki Visual Basicin toiminnot. Valikoissa komentojen oikealla puolella näkyvät niitä vastaavat näppäinkomennot. Näppäinkomennot Voidaan antaa useita komentoja myös näppäimistön avulla; näppäinkomennot hallitsevan ohjelmoijan ei tarvitse koodia kirjoittaessaan siirtää kättä niin usein näppäimistöllä hiirelle. Näppäinkomentojen hallitseminen nopeuttaa koodin kirjoittamista, siirtymistä moduulista toiseen, projektin ja moduulien tallentamista. Työkalurivit Ohjelmassa on useita työkalurivejä, joista Standard työkalurivi on oletusarvoisesti näkyvissä. View valikon Toolbars alivalikosta voidaan ottaa sille tai piilottaa muita Visual Basicin työkalurivejä. Form Editor työkalurivillä on lomakkeen muokkaukseen liittyviä toimintoja. Edit työkalurivillä on koodin kirjoittamisen aputoimintoja. Debug työkalurivillä on koodin testauksen toimintoja. Valitsemalla View/Toolbars valikosta Customize voidaan luoda uusia työkaluriveja ja muokata olemassa olevia valikoitu ja työkalurivejä mieleisiksi. Project Explorer ikkuna Aloittelevan ohjelmoijan on joskus hankala hahmottaa ohjelmointiprojektia ja kaikkia siihen liittyviä tiedostoja. Visual Baskin ohjelmointiprojekteja hallitaan Project Explorer ikkunassa. Ikkunassa käsitellään yksittäisiä projekteja ja niiden moduuleja. Ikkuna saadaan näytölle View valikon komennolle Project Explorer tai painamalla Ctrl+R näppäinyhdistelmää. Project Explorer ikkunassa näkyvät projektiin liittyvät moduulit ryhmiteltynä tyypeittäin. Projektin tallennuksen jälkeen projektin ja moduulien nimien perässä näkyy sulkeissa, minkä nimisinä tiedostoina ne on tallennettu tietokoneelle. 25

Projektin hallinta onnistuu kätevästi hiiren kakkospainikkeella avautuvista pikavalikoista. Napsauttamalla projektin kuvaketta hiiren kakkospainikkeella avautuu alla olevan kuvan mukainen projektin pikavalikko. Projektin pikavalikon avulla voidaan esimerkiksi tallentaa kokoprojektin komennolla Save Project tai lisätä projektiin Add alivalikon kautta erilaisia moduuleja. Komennolle Dockable määritellään, kiinnitetäänkö Project Explorer ikkuna näytölle vai onko ikkuna vapaasti siirrettävissä. Oletusarvoisesti kaikki ohjelmointiympäristön ikkunat on kiinnitetty paikoilleen. Properties ominaisuusikkuna Yksi ohjelmoijan kannalta tärkeimmistä Visual Basicin ikkunoista on Properties eli ominaisuusikkuna. Properties ikkunaa käytetään erityisesti silloin, kun muokataan ohjelman käyttöliittymää eli lomakkeiden ulkoasua ja toiminnallisuutta. Ikkunan kautta asetetaan lomakkeelle piirretyille objekteille ominaisuuksia, esimerkiksi määritellään lomakkeella näkyvien tekstien fonttimääritykset. Properties ikkuna saadaan näytölle View valikon komennolla Properties Window tai painamalla F4 näppäintä. Alla olevassa kuvassa näkyy frmtyosopimus nimisen lomakkeen ominaisuuksia. Properties ominaisuusikkunan alareunassa nähdään aktiivisena olevan ominaisuuden kuvaus. 26

Välilehtien avulla voidaan valita, halutaanko selata ominaisuuksia aakkosjärjestyksessä, Alphabetic vai ryhmiteltynä käyttötavoittain, Categorized. Properties ominaisuusikkunan yläosan luettelosta voidaan valita, minkä objektin ominaisuuksia ikkunassa halutaan tarkastella. Nuolipainikkeella avautuvassa luettelossa nähdään aktiivinen lomake ja sillä olevien obiektien nimet. Form Layout ikkuna Form Layout ikkunassa voidaan määritellä lomakkeen sijainti näytöllä ohjelmaa käytettäessä. Form Layoutikkunassa näkyvää minilomaketta voi siirtää hiirellä haluamaansa kohtaan esimerkkinäytöllä. Ohjelmoijalle on aikaisemmin ollut työlästä suunnitella lomakkeita eri näyttöresoluutioille. Käytännössä kaikkien sovelluksen ikkunoiden tulisi mahtua näytölle, jonka resoluutio on 800 x 600, tai jopa 640 x 480 pikseliä. Lomakkeen koon määrittelyä helpottaa suuresti Form Layout ikkuna. Ikkunan pikavalikon komennolla Resolutions Guides voidaan helposti näyttää tai piilottaa eri resoluutioita kuvaavat apuviivat. Näiden apuviivojen avulla ohjelmoijan on helppo määritellä, minkä kokoinen valittu lomake on eri resoluutioilla. 27

Toolbox työkaluryhmä Toolbox työkaluryhmän painikkeilla voidaan liittää lomakkeille objekteja, kuten tekstikenttiä ja painikkeita. Työkaluryhmässä näkyy valmiina lomakkeilla tavallisimmin tarvitut objektit. Toolbox työkaluryhmän saadaan näytölle View valikon Toolbox komennolle. Toolbox työkaluryhmän pikavalikon komennolla Add Tab voidaan luoda myös omia välilehtiä työkaluryhmään General välilehden lisäksi. Pikavalikon komennolla Components avautuu näytölle valintaikkuna. jonka avulla voidaan hallita Toolbox työkaluryhmässä näkyviä painikkeita. Controls välilehti Components ikkunan Controls välilehdellä näkyvät ne objektikirjastot, jotka on liitetty tai jotka ovat liitettävissä Toolbox työkaluryhmään. Komponentit voivat sijaita esimerkiksi OCX tai DLLtiedostoissa. Työkalukokoelmaa voi laajentaa ostamalla ActiveX komponentteja (esim. Omron CX Server Lite), hakemalla niitä Internetistä tai tekemällä niitä itse Visual Basicilla tai jollain muulla ohjelmointivälineellä (esim. UMIRTX rob). Kaikkia Controls välilehdellä näkyviä komponentteja ei voida noin vain siirtää sovellukseen ja lähettää asiakkaalle. Ohjelmoijalla täytyy olla ohjelmistossa käytettävään komponenttien käyttöoikeudet (esim. ABB WEBSDK). Controls välilehden luettelossa voi näkyä komponentteja. joihin ei ole täysiä käyttöoikeuksia. 28

4.1.2 Lomakkeen käsittely Lomakkeita käsiteltäessä erotetaan kaksi kokonaisuutta toisistaan, lomakkeen ulkonäön suunnittelu ja lomakkeen toiminnan suunnittelu (koodi). Kumpaakin kokonaisuutta muokataan omissa ikkunoissaan. Nämä kaksi ikkunaa muodostavat yhdessä lomakemoduulin, joka tallennetaan yhtenä tiedostona. Lomakemoduulin tiedostotarkennin on FRM. Lomakkeen muokkausikkuna Objektien lisäys lomakkeelle ja muu ulkonäön muokkaus tehdään omassa ikkunassaan. Lomakkeen muokkausikkuna avautuu näytölle oletusarvoisesti, kun aloitetaan uutta projektia. Myöhemmin lomakkeen muokkausuikkuna saadaan näytölle kaksoisnapsauttamalla lomakkeen kuvaketta Project Explorer ikkunassa. Kun projektiin lisätään uusia lomakkeita Project valikon Add Form komennolle, jokaista uutta lomaketta muokataan omassa ikkunassaan. Lomakkeen muokkausikkunan pikavalikko Lomakkeen muokkausikkunan tärkeimmät toiminnot voidaan valita hiiren oikeanpuoleisella painikkeella avautuvasta pikavalikosta. View Code, siirtyminen lomakkeen koodi ikkunaan. Menu Editor, valikkojen tekoon liittyvän ikkunan avaaminen. Lock Controls, lomakkeen objektien lukitseminen paikoilleen. Properties, aktivoi ominaisuusikkunan. Lomakkeen korkeuden ja leveyden muuttaminen Lomakkeen korkeutta tai leveyttä voidaan muuttaa vetämällä hiirellä lomakkeen reunoilla näkyvistä koonmuuttokahvoista. Lomakkeen kokoa voidaan muuttaa myös Properties ominaisuusikkunasta kohdista Width ja Height. 29

Koodieditori Ohjelmoijan kannalta Visual Basicin tärkein ikkuna on koodin muokkausikkuna eli koodieditori. Koodieditorin saa näytölle antamalla View valikosta komennon Code tai painamalla F7 näppäintä. Koodin muokkausikkunan otsikkorivillä näkyy käsiteltävän projektin osan nimi, esimerkiksi lomakkeen nimi. Kun ohjelmoija on suunnitellut ja piirtänyt lomakkeen eli ohjelman käyttöliittymän, hän siirtyy koodieditoriin kirjoittamaan koodia, joka viimeistelee lomakkeen toiminnallisuuden. Koodieditorin käyttö Object luettelon avulla voidaan selata lomakemoduulissa olevia objekteja. Valitsemalla esimerkiksi objekti cmdok voidaan kirjoittaa koodia, joka liittyy lomakkeen OK painikkeeseen. Procedure luettelossa näkyvät valitun objektin tapahtumat. Kuvan luettelossa näkyy lomakkeen tapahtumia eli Object luettelosta on valittu Form. Jos johonkin objektin tapahtumaan on jo kirjoitettu koodia, tapahtuma näkyy luettelossa lihavoituna. Jos Object luettelosta on valittuna General, niin Procedure luettelossa näkyvät lomakkeella olevat käyttäjän määrittelemät proseduurit eli aliohjelmat. Ikkunan vasemman alakulman painikkeilla voidaan koodieditorin näkymäksi valita joko proseduuri tai moduulinäkymä. Kuvassa on valittuna moduulinäkymä (Full Module VieW). Moduulinäkymässä proseduurit erotetaan toisistaan viivalla. Tapahtuma käsite Lomakkeen objektit kykenevät reagoimaan erilaisiin tapahtumiin, esimerkiksi hiiren napsautukseen tai kohdistimen siirtämiseen tekstikentästä toiseen. Objektien tapahtumat on ohjelmoitu niihin valmiiksi. Ohjelmoijan tehtävä on valita sopiva tapahtuma ja kirjoittaa koodi, jossa määritellään, miten johonkin objektin tapahtumaan reagoidaan vai reagoidaanko mitenkään. Koodieditorin ohjetoiminnot Kun koodieditorissa kirjoitetaan koodia, käynnistyy Quick Info ohjetoiminto, joka helpottaa ohjelmoijaa. Näytölle tulee automaattisesti ponnahdusikkuna, jossa on kirjoitettavaan kohtaan liittyvä lyhyt ohje. Kuvassa Quick Info näyttää MsgBox funktion rakenteen, minkälaisia argumentteja funktiolle voidaan antaa. MsgBox funktion avulla käyttäjälle näytetään viesti ikkuna. 30