Juha Haataja, Jussi Rahola ja Juha Ruokolainen

Samankaltaiset tiedostot
Johdatus f90/95 ohjelmointiin. H, R & R luvut 1-3

BJ30A1000 Kemiantekniikan tietotekniikka Fortran

Johdatus Ohjelmointiin

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

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

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

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

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

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

3. Muuttujat ja operaatiot 3.1

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

ITKP102 Ohjelmointi 1 (6 op)

811120P Diskreetit rakenteet

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

5. HelloWorld-ohjelma 5.1

14. Hyvä ohjelmointitapa 14.1

2) Aliohjelma, jonka toiminta perustuu sivuvaikutuksiin: aliohjelma muuttaa parametrejaan tai globaaleja muuttujia, tulostaa jotakin jne.

Ohjelmoinnin perusteet Y Python

Matriisit ovat matlabin perustietotyyppejä. Yksinkertaisimmillaan voimme esitellä ja tallentaa 1x1 vektorin seuraavasti: >> a = 9.81 a = 9.

811120P Diskreetit rakenteet

Ohjelmoinnin peruskurssi Y1

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

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Algoritmit 1. Luento 3 Ti Timo Männikkö

Java-kielen perusteet

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

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Osoitin ja viittaus C++:ssa

Ohjelmoinnin perusteet Y Python

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

Ohjelmoinnin perusteet Y Python

Harjoitus 5. Esimerkki ohjelman toiminnasta: Lausekielinen ohjelmointi I Kesä 2018 Avoin yliopisto 1 / 5

Sisällys. 3. Muuttujat ja operaatiot. Muuttujat ja operaatiot. Muuttujat ja operaatiot

Ohjelmoinnin peruskurssi Y1

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

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

PERUSLASKUJA. Kirjoita muuten sama, mutta ota välilyönti 4:n jälkeen 3/4 +5^2

Fortran 90/95. + sopii erityisesti numeriikkaan:

Python-ohjelmointi Harjoitus 2

Ohjelmoinnin perusteet Y Python

Ohjelmointi 1. Kumppanit

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Ohjelmoinnin peruskurssi Y1

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

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

Ohjelmoinnin peruskurssi Y1

Harjoitus 5 (viikko 41)

Ohjelmoinnin perusteet Y Python

815338A Ohjelmointikielten periaatteet Harjoitus 4 vastaukset

13. Hyvä ohjelmointitapa (osa 1) 13.1

Javan perusteet. Ohjelman tehtävät: tietojen syöttö, lukeminen prosessointi, halutun informaation tulostaminen tulostus tiedon varastointi

Ohjelmoinnin perusteet Y Python

Tutoriaaliläsnäoloista

Python-ohjelmointi Harjoitus 5

ITKP102 Ohjelmointi 1 (6 op)

11.4. Context-free kielet 1 / 17

Tietotyypit ja operaattorit

Ohjelmoinnin peruskurssi Y1

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

Ohjelmoinnin perusteet Y Python

8. Näppäimistöltä lukeminen 8.1

5. HelloWorld-ohjelma 5.1

4. Lausekielinen ohjelmointi 4.1

Zeon PDF Driver Trial

Ohjelmoinnin peruskurssi Y1

11/20: Konepelti auki

815338A Ohjelmointikielten periaatteet Harjoitus 2 vastaukset

Java-kielen perusteet

4. Luokan testaus ja käyttö olion kautta 4.1

Matematiikan tukikurssi, kurssikerta 3

Ohjelmoinnin peruskurssi Y1

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin peruskurssi Y1

Ohjelmoinnin perusteet Y Python

16. Ohjelmoinnin tekniikkaa 16.1

Ohjelmoinnin perusteet Y Python

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

Ohjelmoinnin perusteet Y Python

8. Näppäimistöltä lukeminen 8.1

Harjoitus 1: Matlab. Harjoitus 1: Matlab. Mat Sovelletun matematiikan tietokonetyöt 1. Syksy 2006

16. Ohjelmoinnin tekniikkaa 16.1

etunimi, sukunimi ja opiskelijanumero ja näillä

Ohjelmoinnin jatkokurssi, kurssikoe

Ohjelmoinnin perusteet Y Python

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

811120P Diskreetit rakenteet

Ohjelmoinnin perusteet Y Python


Numeeriset menetelmät

Harjoitustyön testaus. Juha Taina

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin peruskurssi Y1

Transkriptio:

For t r an 95/2003 Juha Haataja, Jussi Rahola ja Juha Ruokolainen FORTRAN95_2003.indd 3 23.4.2007 12:48:23

Fortran 95/2003 Juha Haataja Jussi Rahola Juha Ruokolainen Tieteen tietotekniikan keskus CSC

Tämän teoksen tekijänoikeudet kuuluvat CSC Tieteellinen laskenta Oy:lle. Teoksen tai osia siitä voi kopioida ja tulostaa vapaasti henkilökohtaiseen käyttöön sekä Suomen yliopistojen ja korkeakoulujen kurssikäyttöön edellyttäen, että kopioon tai tulosteeseen liitetään tämä ilmoitus teoksen tekijästä ja tekijänoikeuksista. Teosta ei saa myydä tai sisällyttää osaksi muita teoksia ilman CSC:n lupaa. c Juha Haataja, Jussi Rahola, Juha Ruokolainen ja CSC Tieteellinen laskenta Oy 2007 Neljäs uudistettu painos ISBN 978-952-5520-23-1 (nid.) ISBN 978-952-5520-24-8 (pdf) http://www.csc.fi/csc/julkaisut/oppaat

Fortran 95/2003 5 Esipuhe Fortran on tärkein ja käytetyin ohjelmointikieli numeerisessa laskennassa. Fortran 2003 on kielen uusin standardi. Koska uuden standardin kaikkia piirteitä ymmärtäviä kääntäjiä ei vielä ole markkinoilla, keskitymme uuden standardin siihen osajoukkoon, joka sisältyy Fortran 95 -standardiin. Fortran 95 ja sitä edeltänyt Fortran 90 -standardi kuvaavat aikaisempia Fortranin versioita monipuolisemman ohjelmointikielen, joka sisältää modernit ohjaus- ja tietorakenteet. Koska Fortran koki monilta osin perusteellisen muodonmuutoksen, on varsin aiheellista esitellä Fortran 95 kokonaan uutena ohjelmointikielenä. Tässä teoksessa on käsitelty erillisessä luvussa siirtymistä FORTRAN 77:stä uuteen standardiin. kaikkia ominaisuuksia, vaan pääpaino on tärkeimmiksi katsomillamme piirteillä. Vanha Fortran-kielen standardi (FORTRAN 77) muodostaa Fortran 95:n osajoukon, joten kieli on yhteensopiva vanhojenkin koodien kanssa. Lukijalta ei edellytetä Fortran-kielen aiempaa tuntemusta, vaikkakin ohjelmoinnin peruskäsitteet on syytä tuntea. Fortran-kääntäjän käyttöesimerkit on esitetty Unix-ympäristössä, mutta Unixiin liittyvät yksityiskohdat on pyritty minimoimaan. Tämän teoksen ensimmäinen painos ilmestyi vuonna 1996 ja kertoi aiemmasta Fortran 90 -standardista. Tässä kirjassa kerrotaan pääosin Fortran 95 -standardista eli uuden Fortran 2003 -standardin osajoukosta. Erillisessä luvussa on tiivis kuvaus Fortran 2003:n uusista piirteistä. Lisäksi esittelemme lyhyesti rinnakkaisohjelmointia High Performance Fortran -kielellä (HPF) ja OpenMP:llä. Teoksen syntyyn ovat vaikuttaneet kokemuksemme tieteellisen ja teknisen laskennan asiantuntijatehtävissä. Olemme valinneet käyttämämme näkökulman ja esitystavan tieteen tietotekniikan keskuksen CSC:n asiakasprojekteista kertyneiden kokemusten perusteella. Oma vaikutuksensa teokseen on ollut aiemmin tuottamistamme kursseista ja julkaisuista saadulla palautteella. Suurimman osan tekstistä on kirjoittanut Juha Haataja, joka myös toimitti kirjan painokuntoon. Kiitämme kaikkia kirjan sisältöön vaikuttaneita työtovereitamme. Janne Kontkanen antoi hyviä kommentteja oppikirjan ensimmäisestä raakaversiosta. Yrjö Leino, Esko Järvinen, Jari Järvinen ja Peter Råback oikolukivat teosta, mistä heille kiitokset. Lisäksi Jukka Korpela, Raija Kukkonen ja Markku Lindroos TKK:n atk-keskuksesta antoivat palautetta oppikirjan sisällöstä

6 Fortran 95/2003 ja esitystavasta. Erityisesti Jukka Korpelan kommentit ja parannusehdotukset auttoivat selkeyttämään teoksen sisältöä. HPF:ää käsittelevä luku perustuu Jussi Heikosen ja Janne Kontkasen kirjoittamaan artikkeliin. OpenMP:n esittely perustuu Jussi Heikosen kirjoittamaan artikkeliin. Kari Vasko osallistui Fortran 2003:ää esittelevän tekstin aiemman version kirjoittamiseen. Olemme ottaneet myös huomioon CSC:n järjestämiltä Fortran-kursseilta tulleen palautteen. Toista painosta oikolukivat Tiina Kupila-Rantala, Yrjö Leino ja Ville Savolainen. Kolmanteen painokseen lisättiin ja laajennettiin muutamia harjoitustehtäviä, ja samalla eräitä kirjan esimerkkejä muokattiin numeerisesti stabiilimmiksi. Neljännessä painoksessa keskitytään Fortran 95:een ja hahmotellaan uuden Fortran 2003:n sisältöä. Samalla joitakin virheitä on korjattu ja tekstiä stilisoitu. Erityiset kiitoksemme ansaitsee Robert Piché, jonka järjestämä Fortran-kurssi TTKK:ssa tuotti runsaasti palautetta ja korjausehdotuksia. Lisäksi Janne Ignatius, Jussi Rahola ja Satu Tissari antoivat arvokasta palautetta teoksen kolmatta painosta valmisteltaessa. Otamme mielellämme vastaan kaikki tähän kirjaan liittyvät kommentit. Ne voi osoittaa Juha Haatajalle sähköpostiosoitteeseen Juha.Haataja@csc.fi. Toivotamme teoksen lukijoille löytämisen iloa sekä antoisia hetkiä Fortranin parissa. Espoossa 24.4.2007 Tekijät

Sisältö 7 Sisältö Esipuhe 5 1 Teoksen sisältö ja merkinnät 12 1.1 Oppikirjan sisällöstä... 12 1.2 Käytetyt merkinnät ja esimerkkiohjelma... 13 1.3 Lisätietoja... 14 2 Ohjelmoinnin peruskäsitteet 16 2.1 Mihin tarvitaan ohjelmointia... 16 2.2 Tietokoneet ja ohjelmointi... 17 2.3 Mitä tarkoitetaan tietokoneella... 17 2.4 Ohjelmoinnin eri vaiheet... 18 2.5 Ohjelman kääntäminen ja linkitys... 19 2.6 Yhteenveto... 21 3 Johdatus ohjelmointiin Fortran 95:llä 23 3.1 Fortran-kielen merkitys... 23 3.2 Fortran 95:n tärkeimmät uudet piirteet... 24 3.3 Miksi Fortran-kieltä kannattaa käyttää... 25 3.4 Fortran-ohjelman perusrakenne... 25 3.5 Tunnusten nimeäminen... 26 3.6 Vakiot ja peruslaskutoimitukset... 27 3.7 Muuttujat... 28 3.8 Muuttujien tyypit... 29 3.9 Sijoituslauseet... 29 3.10 Omien funktioiden määrittely ja käyttö... 30 3.11 Toistorakenteet... 32 3.12 Taulukot ja rakenteiset tyypit... 33 3.13 Tulostuksen muotoilu... 35 3.14 Esimerkki: asuntolainan lyhennykset... 35 3.15 Ehtolauseet... 37 3.16 Esimerkki: simulointitehtävä... 38 3.17 Fortran-kielen moduulit... 40 3.18 Lisätietoja... 42 3.19 Yhteenveto... 42 4 Ohjelman perusrakenne 44 4.1 Lähdekoodin muoto... 44 4.2 Fortranin merkkivalikoima... 45 4.3 Muuttujien ja vakioiden nimet... 46

8 Fortran 95/2003 4.4 Ohjelmakoodin lauseiden järjestys... 47 4.5 INCLUDE-lause ja moduulit... 48 4.6 Yhteenveto... 49 5 Perustyypit 51 5.1 Perustyypit ja vakiot... 51 5.2 Muuttujien määrittely... 53 5.3 Nimetyt vakiot... 54 5.4 ja alkukirjainsääntö... 55 5.5 Perustyyppien lajimääreet... 56 5.6 Esimerkki: sarjan summa... 60 5.7 Yhteenveto... 63 6 Lausekkeet ja sijoituslauseet 67 6.1 Aritmeettiset lausekkeet... 67 6.2 Numeeriset standardifunktiot... 69 6.3 Merkkijonolausekkeet... 73 6.4 Merkkitiedon käsittelyfunktioita... 74 6.5 Merkkitieto ja taulukot... 75 6.6 Loogiset lausekkeet... 76 6.7 Esimerkkejä loogisista lausekkeista... 77 6.8 Merkkijonojen vertailu... 78 6.9 Esimerkki: merkkijonojen lajittelu... 80 6.10 Sijoituslauseet ja laskentajärjestys... 81 6.11 Funktioiden sivuvaikutukset... 83 6.12 Operaattorien sidontajärjestys... 83 6.13 Yhteenveto... 83 7 Ohjausrakenteet 86 7.1 Mihin tarvitsemme ohjausrakenteita... 86 7.2 Ehdollinen suoritus: IF-rakenne... 86 7.3 Tapausten käsittely: SELECT CASE -rakenne... 88 7.4 Toisto: DO-rakenne... 90 7.5 Esimerkki: Euklideen algoritmi... 93 7.6 Poikkeusten käsittely... 94 7.7 Hyppylause: GOTO-lause... 95 7.8 Tiedonsiirron erikoistilanteet... 95 7.9 Yhteenveto... 96 8 Funktiot ja aliohjelmat 99 8.1 Tehtävän jakaminen osiin... 99 8.2 Proseduurit, funktiot ja aliohjelmat... 100 8.3 Mihin proseduureja käytetään... 100 8.4 Funktioiden määrittely ja käyttö... 100 8.5 Funktion otsikkolauseen muodot... 102 8.6 Funktion sivuvaikutukset... 103 8.7 Aliohjelmien määrittely ja käyttö... 104 8.8 Todellisten ja muodollisten argumenttien vastaavuus... 105 8.9 Tiedon välittäminen proseduureihin... 106 8.10 Paikallisten muuttujien säilyminen... 107 8.11 Sisäiset ja ulkoiset proseduurit... 108 8.12 Rekursio... 111

Sisältö 9 8.13 Proseduurit argumentteina... 113 8.14 PURE-määre... 115 8.15 ELEMENTAL-määre... 115 8.16 Kutsumuodon määrittely... 116 8.17 Esimerkki: NAG-aliohjelmakirjaston käyttö... 117 8.18 Valinnaiset ja avainsana-argumentit... 118 8.19 Esimerkki: keskiarvon laskeminen... 118 8.20 Milloin tarvitsemme kutsumuodon määrittelyä... 121 8.21 Näkyvyysalueet... 121 8.22 Yhteenveto... 123 9 Moduulit ja operaattorit 126 9.1 Modulaarinen ohjelmointi... 126 9.2 Ohjelmayksikköjen väliset suhteet... 127 9.3 Esimerkki: vakioiden määrittely... 128 9.4 Esimerkki: pituusyksikköjen muunnokset... 128 9.5 Moduulin käyttäminen toisista moduuleista... 131 9.6 Julkisuus ja yksityisyys... 131 9.7 USE-lauseen eri käyttötavat... 133 9.8 Esimerkki: muunnosohjelma... 134 9.9 Esimerkki: nollakohdan haku... 135 9.10 Moduulissa määritellyt globaalit muuttujat... 137 9.11 Esimerkki: normaalijakautuneet satunnaisluvut... 138 9.12 Geneeriset proseduurit... 140 9.13 Operaattoreiden määrittely... 142 9.14 Yhteenveto operaattoreiden määrittelystä... 147 9.15 Funktioiden ja operaattorien käyttötavat... 147 9.16 Muita moduulien käyttömahdollisuuksia... 148 9.17 Yhteenveto... 148 10 Rakenteiset tietotyypit 152 10.1 Rakenteisten tyyppien määrittely... 152 10.2 Esimerkki: vektorilaskentamoduuli... 155 10.3 NULL-funktio... 158 10.4 Julkisuus ja yksityisyys... 159 10.5 Esimerkki: vektorimoduulin jatkokehittely... 159 10.6 Yhteenveto... 161 11 Taulukot ja osoitinmuuttujat 164 11.1 Taulukoiden määrittely ja käyttö... 164 11.2 Taulukon alkioiden käsittely... 166 11.3 Taulukkoalustin... 168 11.4 Taulukon alkioiden järjestys... 169 11.5 Esimerkki: funktion arvojen talletus taulukkoon... 169 11.6 Taulukoiden välitys aliohjelmiin... 170 11.7 Taulukkoarvoiset funktiot... 173 11.8 Taulukkojen käsittely kokonaisuuksina... 174 11.9 Taulukkojen käsittely standardifunktioilla... 174 11.10 FORALL-rakenne... 177 11.11 Dynaaminen muistinvaraus... 178 11.12 Esimerkki: Erastotheneen seula... 182 11.13 Osoitinmuuttujat... 183

10 Fortran 95/2003 11.14 Esimerkki: listarakenne... 187 11.15 Yhteenveto... 189 12 Tiedon syöttö ja tulostus 192 12.1 Syöttö ja tulostus... 192 12.2 Yksinkertaiset syöttö- ja tulostuslauseet... 193 12.3 Listan ohjaama muotoilu... 194 12.4 Syöttö- ja tulostuslauseet... 196 12.5 Muotoilukoodit... 197 12.6 Muotoilukoodien yhdistäminen ja tulostuslistat... 202 12.7 Tietueen osan tulostaminen tai lukeminen... 204 12.8 Tiedostojen käsittely... 204 12.9 Luku merkkijonoista ja kirjoitus merkkijonoihin... 209 12.10 NAMELIST-rakenne... 210 12.11 Virhetilanteiden käsittely... 210 12.12 Yhteenveto... 211 13 Standardiproseduurit 215 13.1 Standardiproseduurien peruskäsitteitä... 215 13.2 Standardiproseduurien kuvauksia... 216 13.3 Esimerkki: kellonaika ja päivämäärä... 218 13.4 Esimerkki: satunnaisluvut ja kellonaika... 219 13.5 Esimerkki: bittienkäsittelyoperaatiot... 226 13.6 Esimerkki: data pakkaaminen... 227 13.7 Standardifunktioiden erityisnimet... 229 13.8 Lisätietoja... 230 13.9 Yhteenveto... 231 14 Esimerkkiohjelmia 234 14.1 Nelilaskin... 234 14.2 Datan lajittelu... 237 14.3 Sokkelon tekeminen... 243 14.4 Yksiulotteinen soluautomaatti... 247 14.5 Life-soluautomaatti... 253 14.6 Binääripuu... 256 14.7 Sukupuu... 261 14.8 Optimointitehtävien ratkaiseminen: evoluutiostrategiat... 263 14.9 Lineaaristen yhtälöryhmien ratkaisu... 269 15 Siirtyminen Fortran 95 -kieleen 275 15.1 Miten Fortran 95:een kannattaa siirtyä... 275 15.2 Fortran 95:n uudet piirteet... 276 15.3 FORTRAN 77:n huonoja puolia... 276 15.4 FORTRAN 77 -koodien muuntaminen uuteen muotoon... 279 15.5 Ohjausrakenteiden käyttö... 281 15.6 COMMON-alueiden korvaus moduuleilla... 283 15.7 Fortranin vanhentuvat piirteet... 284 15.8 Vältettäviä Fortranin piirteitä... 287 16 Fortran 2003 291 16.1 Fortran 2003:n tärkeimmät lisäykset ja parannukset... 291 16.2 Fortran 2003 ja olio-ohjelmointi... 295

Sisältö 11 16.3 Fortran 2003:n tuki olio-ohjelmoinnille... 296 16.4 Lisätietoa... 298 17 Rinnakkaislaskenta HPF:llä ja OpenMP:llä 299 17.1 Välineitä rinnakkaislaskentaan... 299 17.2 HPF-ohjelmoinnin perusteet... 299 17.3 OpenMP: rinnakkaislaskenta yhteisen muistin koneissa... 305 Liite 309 A Ohjelmoinnin kultaiset säännöt 310 A.1 Yleisohjeita... 310 A.2 Ohjausrakenteet... 310 A.3 Määrittele... 311 A.4 Strukturoi... 311 A.5 Standardoi... 311 A.6 Dokumentointi... 311 A.7 Luettavuus... 312 A.8 Vianetsintä ja koodin testaus... 312 A.9 Ohjelmakoodin optimointi... 313 A.10 Syöttö ja tulostus... 313 A.11 Yhteenveto... 314 B Fortran 95:n hyvät, pahat ja rumat piirteet 315 B.1 Hyvät piirteet... 315 B.2 Toisinaan hyödylliset piirteet... 316 B.3 Mahdollisesti vaaralliset piirteet... 316 C Yhteenveto Fortran 95 -kielen lauseista 317 D ASCII-merkistö 324 E Sanasto 325 Kirjallisuutta 329 Hakemisto 331

12 Fortran 95/2003 1 Teoksen sisältö ja merkinnät Kerromme tässä luvussa oppikirjan tarkoituksesta ja annamme neuvoja lukijalle. Kappaleesta 1.2 löydät kirjassa käytetyt merkintätavat. 1.1 Oppikirjan sisällöstä Tämä oppikirja on tiivis johdatus ohjelmointiin Fortran-kielellä. Teos on tarkoitettu opiskelijoille sekä yliopistojen ja yritysten tutkijoille. Kirjaa voi käyttää oppikirjana Fortran-kursseilla ja itseopiskeluun. Luotamme esimerkin voimaan. Siksi asiat on pyritty havainnollistamaan esimerkeillä. Kunkin luvun loppuun on sijoitettu muutamia tehtäviä tai kysymyksiä luvun aihepiiristä. Teoksessa on tehtäviä erityisesti tieteellisen ja teknisen laskennan alalta. Tämä kirja on tarkoitettu luettavaksi läpi järjestyksessä alusta loppuun. Koska Fortran-kielen monet piirteet liittyvät useampaan kuin yhteen aihepiiriin, käydään oppikirjan alussa nopeasti läpi kielen tärkeimmät piirteet. Toisaalta kukin luku on suunniteltu yhtenäiseksi kokonaisuudeksi, joten teosta voi käyttää myös käsikirjan tapaan. Korostamme ohjelmoinnin käytännön seikkoja, kuten koodin luettavuutta, selkeyttä ja ylläpidettävyyttä. Pyrimme esittämään kokonaisia ohjelmaesimerkkejä pienten ohjelmakoodin katkelmien sijaan. Tämän ansiosta voit helposti kokeilla esimerkkien toimintaa käytännössä. Esimerkkiohjelmat on tarkoitettu luettavaksi yhdessä niihin liittyvän tekstin kanssa. Tästä johtuen esimerkeissä on vähemmän selittäviä kommentteja kuin itsenäisissä ohjelmakoodeissa tulisi olla. Luvussa 15 käydään läpi Fortran-kielen vanhempia piirteitä. Luvussa kerrotaan, miten nämä usein virheitä aiheuttavat kielen piirteetvoi korvata uuden Fortran-standardin paremmilla ominaisuuksilla.

1. Teoksen sisältö ja merkinnät 13 1.2 Käytetyt merkinnät ja esimerkkiohjelma Fortran-kielen omat tunnukset on tässä teoksessa kirjoitettu isoilla kirjaimilla. Käyttäjän määrittelemien muuttujien ym. symbolien nimet on kirjoitettu pienillä kirjaimilla. Suosittelemme tätä käytäntöä muutoinkin sovellettavaksi, vaikka se ei ole osa Fortranin määritelmää. Seuraavassa on esimerkki Fortran-ohjelmakoodista: PROGRAM testaus REAL :: x INTRINSIC SIN WRITE (*,*) Anna x: READ (*,*) x WRITE (*,*) x =, x, SIN(x) =, SIN(x) END PROGRAM testaus Tämä ohjelma lukee luvun x arvon ja tulostaa sinifunktion arvon SIN(x). Fortran-ohjelmien yksityiskohtiin palataan seuraavissa luvuissa. Tässä teoksessa käytetään kirjasintyyppiä teletype, kun esitetään ohjelmakoodia tai tietokoneen tuottamaa tulostusta. Kuitenkin jos halutaan selvästi erottaa, mikä teksti on kehotetta, mikä käyttäjän syötettä ja mikä tietokoneen tulostusta, on käytetty seuraavanlaisia kirjasintyyppejä: % f90 testaus.f90 %./a.out Anna x: 5 x = 5.0000000 SIN(x) = -0.9589243 Tässä tietokoneen kehote (prompt, merkki % yllä) ja tulostus on ladottu teletype-kirjasintyypillä, ja käyttäjän antamat komennot ja syötteet on lihavoitu. Tässä esimerkissä käänsimme ohjelmakoodin testaus.f90 komennolla f90 ja ajoimme syntyneen ajokelpoisen ohjelman a.out. Ohjelmalle annettiin syötteenä luku 5. Teoksessa käytetään käännöskomentoa f90, joka useissa järjestelmissä on identtinen komennon f95 kanssa. Fortran-ohjelmien tiedostopääte voi olla esimerkiksi.f90,.f95,.f03 tai.f riippuen kääntäjästä. Sellaiset nimet, joiden paikalle tulee kirjoittaa esimerkiksi tiedoston nimi, on ladottu vinokirjaimilla: f90 tiedosto.f90 Jos jokin määrittelyn osa voidaan jättää pois, käytämme hakasulkumerkintää ([]) seuraavaan tapaan: funktio([argumentti][, argumentti]...) Kolme pistettä (...) tarkoittaa tässä nolla, yksi tai useampi kertaa toistettavaa osaa. Seuraavat ovat esimerkkejä edellisen merkinnän kuvaamista funktiokutsuista: h()

14 Fortran 95/2003 h(a) h(a,b) h(a,b,c) Tekstissä esiintyvät lyhenteet ja erisnimet on yleensä kirjoitettu kuten Fortran. Uusien termien esittelyyn ja muutenkin tekstin korostamiseen on käytetty kursiivia. Tämän oppikirjan Fortran 90 -kielisten esimerkkiohjelmien kääntämiseen ja testaamiseen on käytetty NAGWare TM f90 -kääntäjää, joka on aito Fortran 90 -kääntäjä eikä sisällä standardin ulkopuolisia laajennuksia. Ohjelmat on testattu myös Macintoshissa käyttäen Absoftin Fortran 90 -kääntäjää. Fortran 95 -piirteitä sisältävät ohjelmat on testattu Digital Fortran 95 -kääntäjällä. Oppaan neljännessä painoksessa on käytetty kääntäjänä Sun Studio 9 Fortran 95 -kääntäjän versiota 8.0, joka ei tue Fortran 2003:n uusia piirteitä. 1.3 Lisätietoja Tämän teoksen aihepiiristä löydät lisätietoja World Wide Web -järjestelmästä eli www:stä osoitteesta http://www.csc.fi/oppaat/f95/ Tarjolla on mm. oppikirjan esimerkkiohjelmien lähdekoodeja, harjoitustehtävien ratkaisuja, mahdollisten painovirheiden korjauksia sekä tietoa CSC:n tarjoamista palveluista. Annamme myös viitteitä muihin Fortrania ja ohjelmointia käsitteleviin www-palveluihin. CSC:n www-kotisivu on osoitteessa http://www.csc.fi Hyödyllisiä Fortran-kielen käsikirjoja ovat teokset Fortran 95/2003 Explained [MRC04], Fortran 95 Language Guide [Geh96] jafortran 95 Handbook [ABM + 97]. Johdatukseksi kieleen sekä oppikirjaksi sopivat teokset Introductionto Programmingwith Fortran [CS06]jaFortran 90 Programming [EPL94]. Teos Programmer s Guide to Fortran 90 [BGA94] onhyvinlaajajamonipuolinen johdatus Fortran-ohjelmointiin. Teos Migrating to Fortran 90 [Ker93] sopii ohjenuoraksi vanhojen Fortran-koodien muuntamiseen uuden standardin mukaisiksi. Fortran 90:een perustuvaa F-kieltä käsitellään teoksessa The F Programming Language [MR96]. Artikkelissa The New Features of Fortran 2003 [Rei] kuvataan tiiviissä muodossa Fortran 2003:n uudet piirteet. Fortran-standardeihin liittyviä dokumentteja löydät www-osoitteesta http://www.nag.co.uk/sc22wg5/ Tietokoneohjelmissa käytettyjä algoritmeja on esitelty mm. teoksissa Introduction to Algorithms [CLR90] jaalgorithms [Sed84]. CSC on tämän Fortran 95/2003 -oppikirjan lisäksi julkaissut mm. matemaattista mallintamista ja numeerisia menetelmiä käsitteleviä teoksia:

1. Teoksen sisältö ja merkinnät 15 Alkuräjähdyksestä kännykkään: näkökulmia laskennalliseen tieteeseen [Haa02] Laskennallinen tuotekehitys: suunnittelun uusi ulottuvuus [HJKR02] Sillanrakennuksesta lääkeainesuunnitteluun: Matemaattinen mallintaminen suomalaisissa yliopistoissa [HJL00] Numeeriset menetelmät käytännössä [HHL + 02] Optimointitehtävien ratkaiseminen [Haa04] Datan käsittely [Kar01].

16 Fortran 95/2003 2 Ohjelmoinnin peruskäsitteet Kerromme tässä luvussa tietokoneen toiminnasta ja ohjelmointikielten käytöstä tietokoneen ohjaamiseen. 2.1 Mihin tarvitaan ohjelmointia Ohjelmointitaito on eräs tärkeimmistä teknis-tieteellisillä aloilla tarvittavista osaamisen alueista. Ohjelmointi ei tietenkään ole päämäärä sinänsä, vaan väline, jonka avulla voidaan ratkoa käytännössä esiin tulevia tehtäviä. Ohjelmistoja tarvitaan lentokoneiden ja autojen suunnitteluun, prosessien ohjaamiseen, datan keräämiseen instrumenteista ja ihmisen geeniperimän selvittämiseen (katso CSC:n julkaisemia teoksia [Haa02, HJKR02, HJL00]). Jopa matematiikan teoreemojen todistamisessa käytetään apuna tietokoneohjelmia. Autojen, kameroiden ja pyykinpesukoneiden ohjelmistot tekevät näistä laitteista monipuolisempia ja älykkäämpiä vaikkakin parantamisen varaa vielä on! Kaikkea ei kuitenkaan ole valmiiksi ohjelmoitu. Varsinkin eturivin tutkimusja tuotekehitystehtävissä tarvitaan ohjelmointia ja olemassaolevien koodien muokkausta. Kaikkea ei tietenkään tarvitse keksiä uudestaan, sillä on hyvää ohjelmointityyliä käyttää apuna valmiiksi testattuja ja luotettavia ohjelmistoja. Olemassaolevien ohjelmistojen muokkaaminen tehtävän ratkaisemiseksi onkin tyypillistä ohjelmoijan työkenttää. Silloin tällöin kuulee väitteen: Jos osaan oman sovellusalueeni tarpeeksi hyvin, ei minun tarvitse osata ohjelmoida. Kun tehdään jotain uutta ja ennen ratkaisematonta, ohjelmointia tarvitaan kuitenkin monilla aloilla muodossa tai toisessa. Lisäksi erillisen ohjelmoijan palkkaaminen sovellusalueen osaajan lisäksi on melko kallista.

2. Ohjelmoinnin peruskäsitteet 17 2.2 Tietokoneet ja ohjelmointi Vaikka tietokoneiden perusrakenne ei ole muuttunut paljonkaan viimeisten 40 vuoden aikana, on tietokoneiden käyttöalue laajentunut nopeasti. Tämä voidaan lukea sekä koneiden halpenemisen että ohjelmointikielten kehittymisen ansioksi, sillä ohjelmointia tarvitaan tietokoneiden kaikkien toimintojen ohjaamiseen. Tietokoneen ymmärtämä kieli koostuu joukosta konekäskyjä, joita suorittamalla tietokone saadaan tekemään haluttuja asioita. Tietokoneet pystyvät suorittamaan miljardeja konekäskyjä sekunnissa. Erityyppiset tietokoneet ymmärtävät kukin omaa konekieltään, joten konekielisen ohjelman siirto koneesta toiseen on hankalaa ellei peräti mahdotonta. Lisäksi ohjelmointi konekäskyjen avulla on aikaavievää ja virhealtista puuhaa. Tietokoneen ohjaaminen hoidetaan konekielen sijaan yleensä ohjelmointikielen avulla. Tämä mahdollistaa konekieltä paremman ohjelmistojen siirrettävyyden. Ohjelmointikielen kääntäjä (compiler) hoitaa automaattisesti konekäskyjen tuottamisen ohjelmakoodista. Täten ohjelmointikielen käyttö helpottaa huomattavasti tehtävien ratkaisua tietokoneella. Tämä ei tarkoita tietenkään sitä, etteikö ohjelmoinnissa silti tarvittaisi suurta huolellisuutta ja tarkkuutta: kääntäjä osaa lukea vain tarkasti ohjelmointikielen sääntöjä noudattavaa koodia eikä pysty arvaamaan ohjelmoijan alkuperäistä tarkoitusta, jos sitä ei ole ilmaistu yksikäsitteisesti. Eri ohjelmointikielet on suunniteltu erilaisiin tehtäviin. Ohjelmointikieliä on kehitetty tuhansia, mutta vain muutamat niistä ovat laajassa käytössä. 2.3 Mitä tarkoitetaan tietokoneella Kuvassa 2.1 on esitetty tietokoneen toiminta yksinkertaisena kaaviona. keskusmuisti näppäimistö keskusyksikkö kuvaruutu tiedostot Kuva 2.1: Tietokoneen toiminnan periaate. Tietokoneen keskusyksikkö toimii ohjelmakoodin sisältämien käskyjen mukaisesti. Ohjelma lukee tavallisesti joukon syöttötietoja, jotka vaihtelevat ohjelman ajokerrasta toiseen. Ohjelma lukee syöttötiedot sisään esimerkiksi

18 Fortran 95/2003 tiedostoista tai käyttäjän näppäimistöltä. Syöttötietoja voisivat olla esimerkiksi säähavaintopisteistä kerätyt mittausarvot kuten lämpötila, ilmanpaine ja kosteus. Sääennusteen laskemiseen kehitetty ohjelma voisi näiden syöttötietojen perusteella laskea ja tulostaa ennusteen seuraavien 48 tunnin ajaksi. Tietokoneen keskusyksikkö käsittelee keskusmuistissa sijaitsevaa dataa. Esimerkiksi sääennusteen laskennan eri vaiheissa tarvittava data voidaan pitää tietokoneen keskusmuistissa. Keskusyksikkö voi myös kirjoittaa ja lukea tiedostoja, jotka mahdollistavat tiedon säilyttämisen ohjelman suorittamisen loppuessa: kun ohjelman suoritus päättyy, käytetään vapautunut keskusmuisti seuraavien ohjelmien ajamiseen. Tätä ennen tulee laskentatulokset tallettaa tiedostoihin, sillä pysyvien tiedostojen sisältö säilyy ohjelman suorittamisen loputtuakin. Tiedostojen käsittely on yleensä hitaampaa kuin keskusmuistin käyttö. Keskusyksikkö voi tiedostoihin tallettamisen lisäksi tulostaa tietoa käyttäjän laitteen (päätteen, mikron tai työaseman) kuvaruudulle. Tekstimuotoisen tulostuksen lisäksi tietokoneeseen voi olla kytkettynä graafisten kuvaajien piirtämiseen kykeneviä laitteita. 2.4 Ohjelmoinnin eri vaiheet Kun kehität ohjelmistoa annettuun tehtävään, pidä mielessä seuraavat ohjelmoinnin vaiheet: 1. tehtävän tavoitteen määrittely 2. tehtävän analyysi ja ohjelmakoodin suunnittelu 3. ohjelmakoodin kirjoittaminen 4. testaaminen ja virheiden korjaaminen 5. dokumentointi 6. ohjelmiston käyttö ja ylläpitäminen. Tehtävän määrittelyssä selvitetään tarkkaan, mitä ohjelman tulisi tehdä. Määrittely kannattaa tehdä huolellisesti, jottei koodia kirjoitettaessa tai testattaessa tarvitsisi huomata, ettei ohjelmisto ratkaise annettua tehtävää. Ohjelmoinnin tärkein vaihe on tehtävän analyysi ja ohjelmakoodin suunnittelu. Ennen ohjelmakoodin kirjoittamista täytyy selvittää mm. ohjelmassa käytetyt tietorakenteet ja algoritmit. Tähän vaiheeseen kannattaa käyttää runsaasti aikaa pienessäkin tehtävässä. Suunnitteluun käytetty aika saadaan yleensä runsain mitoin takaisin ohjelmakoodin kirjoittamisessa ja testaamisessa. Tehokas ja luotettava ratkaisumenetelmä myös vähentää ohjelman korjailemiseen tarvittavaa aikaa.

2. Ohjelmoinnin peruskäsitteet 19 Kirjoita ohjelmakoodi pieninä osasina, joista kukin tekee oman tehtävänsä hyvin. Käytä Fortran 95:n kehittyneitä piirteitä ohjelmakoodin modulaarisuuden lisäämiseksi. Minimoi riippuvuudet ohjelmiston eri osasten välillä ja dokumentoi koodisi huolellisesti. Kun kukin ohjelman osa on saatu koodattua, testaa sitä ensin erikseen. Kiinnitä testaukseen huomiota jo varhaisessa vaiheessa. Käytetyt testiaineistot ja testiohjelmistot on syytä säilyttää ohjelmiston myöhempää testausta varten. Hyvästä testiaineistosta on apua esimerkiksi siirrettäessä ohjelmisto uudelle koneelle tai tehtäessä ohjelmistoon muutoksia myöhemmin. Aloita ohjelmakoodin dokumentointi jo tehtävän määrittelyvaiheessa. Pidä myös huolta ohjelmakoodin luettavuudesta. Käytä sisennystä ja tyhjiä rivejä apuna koodin selkeyttämisessä. Älä kommentoi suoraan ohjelman lauseiden toimintaa, vaan kerro, mitä ohjelmiston eri osissa tapahtuu. Muista ohjelmoinnin kaikissa vaiheissa, että ohjelmiston ylläpitoon voi kulua vuosien aikana paljon enemmän aikaa kuin ohjelmiston kehittämiseen alunperin. Pienilläkin ohjelmakoodin pätkillä on taipumus osoittautua yllättävän pitkäikäisiksi. Ehkäpä vuosien kuluttua työtoverisi tulee kysymään, mitä kehittämäsi ohjelmakoodi oikeastaan tekee. Siis: dokumentoi huolellisesti ja kirjoita selkeää koodia. Vältä kikkailua! 2.5 Ohjelman kääntäminen ja linkitys Tämän kohdan sisältö on oppaan muita osia riippuvaisempi käytettävissä olevasta Fortran-kääntäjästä ja koneen käyttöjärjestelmästä. Tässä esitellyt asiat pätevät kuitenkin useimmissa koneympäristöissä pienin muutoksin. Kuvassa 2.2 on esitetty ajettavan ohjelman tekemiseen tarvittavat vaiheet. Käytännössä Fortran-koodista saa ajokelpoisen ohjelman seuraavasti: 1. kirjoita suunnitelman mukainen ohjelmakoodi yhteen tai useampaan tiedostoon 2. käännä lähdekooditiedostot objektikooditiedostoiksi 3. linkitä objektikooditiedostot ja mahdolliset aliohjelmakirjastot suorituskelpoiseksi ohjelmaksi 4. aja syntynyt ohjelma ja tarkista tulokset. Yksinkertaisissa tapauksissa voi kääntämisen ja linkittämisen (vaiheet 2 ja 3) tehdä samalla komennolla. Selvitä käyttämäsi koneen käyttöoppaasta tai käsikirjasta, miten kääntäminen, linkittäminen ja ohjelman ajaminen käytännössä tapahtuu. Useimmissa Unix-ympäristöissä yhdessä tiedostossa olevan Fortran-ohjelmakoodin kääntäminen ja ajaminen onnistuu seuraavasti: % f90 tiedosto.f90 %./a.out

20 Fortran 95/2003 Tässä käännöskomento oli nimeltään f90. Jos käytettävissä on Fortran 95 -kääntäjä, on käännöskomento luultavasti nimeltään f95. Lähdekooditiedoston nimi päättyi merkkeihin.f90, mikä on tyypillinen käytäntö Unixissa. Syntynyt ajokelpoinen ohjelma a.out ajettiin komennolla./a.out. Ohjelman kääntäminen ja linkittäminen ajokelpoiseksi ohjelmaksi voidaan tehdä myös useassa vaiheessa: % f90 -c ali.f90 % f90 -c ohj.f90 % f90 -o ohj ali.o ohj.o -lnag %./ohj Tässä käänsimme (ilman linkitystä) ohjelmakoodin tiedostoissa ali.f90 ja ohj.f90. Syntyneet objektikooditiedostot ali.o ja ohj.o linkitettiin ajokelpoiseksi ohjelmaksi nimeltä ohj. Otimme ohjelmaan lisäksi linkitysvaiheessa mukaan ohjelman käyttämät NAG-aliohjelmakirjaston rutiinit [Haa98]. Käytä ohjelmakoodin kirjoittamiseen sellaista editoria, joka osaa automaattisesti sisentää koodirivit ja mahdollisesti myös tunnistaa Fortran 95 -kielen avainsanat. Emacs on esimerkki tällaisesta editorista. Kukin ohjelmayksikkö (pääohjelma, ulkoinen proseduuri tai moduuli) kannattaa yleensä kirjoittaa omaan tiedostoonsa. Tällöin voit kääntää kunkin ohjelmayksikön erikseen, ja tehdessäsi muutoksia ei aina ole välttämätöntä kääntää koko ohjelmistoa uudestaan. Riittää, että käännät uudestaan muuttuneet ohjelmayksiköt (ja niitä käyttävät ohjelmayksiköt), jonka jälkeen tarvitsee vain linkittää ohjelmisto ajokelpoiseksi. lähdekoodi INCLUDE-tiedostot moduulit Fortran-kääntäjät tuottavat yleensä tarvittaessa käännöslistauksen, jostavoi olla hyötyä jäljitettäessä ohjelmakoodiin pujahtaneita virheitä. Käytä käänkääntäjä tarvittaessa käännöslistaus objektikoodi aliohjelmakirjastot linkittäjä tarvittaessa linkitystaulu ajettava ohjelma Kuva 2.2: Ohjelman kääntämisen ja linkittämisen vaiheet. Moduuleja esitellään luvussa 9 ja INCLUDE-lausetta kappaleessa 4.5.

2. Ohjelmoinnin peruskäsitteet 21 nöksessä lisäksi tarkkaa Fortran 95:n mukaista syntaksitarkistusta, sillä kääntäjäkohtaiset kielen laajennukset vähentävät koodin siirrettävyyttä. Syntaksitarkistus kytketään päälle kääntäjän valitsimilla. Fortran-kääntäjät optimoivat ohjelmakoodia pyydettäessä. Tällöin pyritään nopeuttamaan koodin suoritusta. Koodin optimointi kannattaa ottaa käyttöön varsinaisissa tuotantoajoissa. Varmista sitä ennen, ettei optimointi muuta ohjelman toimintaa ja tuota virheellisiä tuloksia. Käännösaikana voi valita, halutaanko ohjelmaan mukaan ajonaikaiset taulukkorajojen tarkistukset. Yleensä näistä on niin paljon hyötyä, että ne on syytä kytkeä päälle ainakin ohjelman kehittelyn aikana. Kun eri ohjelmayksiköt on käännetty objektikooditiedostoiksi, tarvitaan vielä linkitys, jotta koodia voidaan ajaa. Tässä yhteydessä ottaa linkittäjä ohjelmaan mukaan myös mahdollisesti käytettävät aliohjelmakirjastot. Esimerkiksi Fortranin standardifunktiot ja -aliohjelmat linkitetään tarpeen mukaan ohjelmaan. Fortran-kielisiä ohjelmia voi olla mahdollista linkittää muilla ohjelmointikielillä kirjoitettujen ohjelmien yhteyteen. Vastaavasti voi olla mahdollista kutsua Fortranista muilla ohjelmointikielillä kirjoitettuja rutiineita. Käytännön yksityiskohdat vaihtelevat laitteistosta toiseen. Koska ohjelmankehityksessä harvoin saadaan suoraan kirjoitettua virheetöntä koodia, joudutaan ohjelmaa korjailemaan ja tekemään käännös uudestaan. Käytettäessä Fortran 95:n moduuleita ja tyypinmäärittelyitä monet virheet löydetään onneksi jo käännösaikana. Myös linkitysvaiheessa voi ilmetä virheitä esimerkiksi väärin kirjoitetun aliohjelman nimen vuoksi. Tarvittaessa voit pyytää linkittäjää tulostamaan linkitystaulun, josta näkyy ohjelmassa käytettyjen proseduurien nimet. Vaikeimpia jäljitettäviä ovat vasta ohjelman ajon aikana ilmenevät virheet. Ohjelma voi lisäksi käyttäytyä väärin vain joissakin erikoistilanteissa. Tämän vuoksi onkin syytä testata ohjelmakoodia huolellisesti ennen sen ottamista tuotantokäyttöön. Jos ohjelma on iso ja monimutkainen, kannattaa sen eri osia testata erikseen. Käytettävissäsi voi olla myös tutkinta- ja virheenjäljitysohjelmia (debugger), joiden avulla voi etsiä ohjelmakoodiin pujahtaneita virheitä. 2.6 Yhteenveto Ohjelmointia tarvitaan tietokoneen kaikkien toimintojen ohjaamiseen. Tärkein ohjelmoinnin vaihe on tehtävän analyysi ja ohjelmakoodin suunnittelu. Muista myös ohjelmakoodin testaaminen virheiden löytämiseksi.

22 Fortran 95/2003 Harjoitustehtäviä 1. Mikä on ohjelmointikielen kääntäjän tehtävä? 2. Kokeile kappaleessa 1.2 (sivu 13) esitetyn ohjelmakoodin kääntämistä ja ajamista käytettävissäsi olevalla laitteistolla. 3. Muuta edellisen tehtävän ohjelmakoodia siten, että se tulostaa luvun x neliöjuuren SQRT(x). Syötä ohjelmalle negatiivinen luku. Mitä tapahtuu?

3. Johdatus ohjelmointiin Fortran 95:llä 23 3 Johdatus ohjelmointiin Fortran 95:llä Esittelemme tärkeimmät Fortran 95 -ohjelmointikielen piirteet yksinkertaisten esimerkkien avulla. Alussa kerromme lyhyesti Fortran-kielen merkityksestä ja historiasta. Luku kannattaa silmäillä läpi, vaikka Fortran-kielen vanhemmat versiot olisivat tuttuja. Esiteltävät asiat käydään yksityiskohtaisemmin läpi myöhemmissä luvuissa. 3.1 Fortran-kielen merkitys Fortran on vanhin ja eniten käytetty tieteellisen ja teknisen laskennan ohjelmointikieli. Fortran-kielen kehitys lähti käyntiin IBM:llä vuonna 1954, jolloin esiteltiin suunnitelma ohjelmointikielestä nimeltä FORmula TRANslator eli FORTRAN. Fortranin käytetyimpiä versioita ovat olleet FORTRAN IV, FORTRAN 66 ja FORTRAN 77. Fortran oli myös ensimmäinen ohjelmointikieli, josta luotiin standardi (FORTRAN 66 vuonna 1966). Vuonna 1978 valmistui vielä nykyäänkin käytetty vaikkakin jo vanhahtava FORTRAN 77 -standardi. Fortran 90 -kielen ISO- ja ANSI-standardi hyväksyttiin vuosina 1991 ja 1992 (standardit ISO/IEC1539:1991 ja ANSI X3.198-1992). Tässä kirjassa pääosin käsiteltävä Fortran-kielen versio, Fortran 95, hyväksyttiin vuonna 1997 kansainväliseksi standardiksi (ISO/IEC1539:1997). Kansainvälinen (ISO) ja amerikkalainen (ANSI) standardi ovat sisällöltään samat. Teoksessa käytetään Fortran-nimestä kirjoitusasua FORTRAN, jos viitataan aiempiin Fortrankielen versioihin. Kirjoitustapa Fortran tarkoittaa yleensä Fortran-kieltä ja erityisesti Fortran 95 -standardin sisältöä. Uusin standardi, Fortran 2003, julkaistiin vuonna 2004 (ISO/IEC 1539-1:2004(E)). Fortran 90 oli merkittävä edistysaskel Fortran-kielen kehityksessä. Standardi toi Fortranin muiden ohjelmointikielten tasolle. Osaa Fortran 90 -kielen uusista ominaisuuksista ei edes löydy muista ohjelmointikielistä. Fortran 95 oli sen sijaan pienehkö päivitys standardiin; suurimmat lisäykset liittyvät rinnakkaislaskentaan. Uusin standardi eli Fortran 2003 on suuri muutos kieleen sisältäen mm.

24 Fortran 95/2003 olio-ohjelmointiin liittyviä ominaisuuksia. Seuraava päivitys standardiin on työnimeltään Fortran 2008, ja tuo tarjolle entisestään uusia piirteitä. Tässä oppaassa keskitytään Fortran 95:n sisältöön. Fortran-ohjelmointikieli on kehitetty tehokkaaseen numeeriseen laskentaan. Koska Fortran 95 sisältää osajoukkonaan FORTRAN 77:n, voit käyttää vanhoja koodeja osana uutta ohjelmistoa. Lisäksi Fortran-kieli soveltuu entistäkin paremmin suuriin ohjelmistoprojekteihin. Koska Fortran-kieli on standardoitu, on ohjelmakoodi helppo siirtää uuteen tietokoneeseen, jos kyseisellä koneella on käytettävissä Fortran-kielen kääntäjä. Koodien siirrettävyyttä voikin pitää yhtenä ohjelmointikielen tärkeimmistä ominaisuuksista. Tämä korostuu entisestään uusien tietokonesukupolvien seuratessa toisiaan kiihtyvällä vauhdilla: vaikka laitteisto vaihtuu, useimmiten uudessa koneessa halutaan ajaa samoja ohjelmistoja kuin aikaisemminkin. Fortran-kieli on koodien siirrettävyyden kannalta parhaimpia ohjelmointikieliä. Standardia noudattavan ohjelmakoodin siirtäminen halutulle koneelle onnistuu usein ilman koodin muuttamista. Koneriippuvia ohjelman osia ovat lähinnä syöttö- ja tulostuslauseet sekä tiedostojen käsittely. 3.2 Fortran 95:n tärkeimmät uudet piirteet Vanhaan Fortran-kieleen tottuneille näkyvin Fortran 95:n muutos on uuden lähdekoodimuodon käyttöönotto. Tämä vapaa lähdekoodin muoto ei enää ole sarakesidonnainen, vaan kielen lauseet voi sijoittaa vapaasti maksimissaan 132 merkin pituisille riveille. Tunnuksien nimissä saa olla 31 merkkiä (entisen kuuden sijasta!), ja alaviiva _ on luvallinen symboli tunnuksissa kirjainten (A... Z) ja numeroiden (0... 9) lisäksi. Ohjelmointia tehostavat monipuolistuneet muuttujien määrittelyt. Nyt voi luoda omia rakenteisia muuttujatyyppejä, joiden avulla monet aiemmin hankalasti ratkaistut ohjelmointitehtävät onnistuvat suoraviivaisesti ja helposti. Lisäksi taulukkomuuttujien tilan voi varata ohjelman ajon aikana dynaamisesti, joten aikaisempienfortran-versioidenvaatimista hankalista työtilavektoreista päästään vihdoin eroon. Uudet ohjausrakenteet sekä esimerkiksi taulukkosyntaksi mahdollistavat luettavamman ja selkeämmän koodin kirjoittamisen. Voit myös käyttää taulukkosyntaksia rinnakkaisuuden esittämiseen ohjelmakoodin tasolla. Moduulirakenteet ja sisäiset aliohjelmat mahdollistavat ohjelmakoodin pilkkomisen erillisiin, riippumattomiin osiin ( modulaarisuus ). Nämä ominaisuuksien avulla tehdään myös proseduurien argumenttilistojen käännösaikaisia tarkistuksia. Nämä piirteet hyödyttävät sekä aloittelevaa ohjelmoijaa että suurten ohjelmistoprojektien parissa työskenteleviä ammattilaisia. Fortran-kieli säilyttää uusien piirteiden lisäksi myös perinteiset vahvuuteensa: esimerkkeinä tehokkuus numeerisessa laskennassa sekä monipuoliset ja tehokkaat syöttö- ja tulostustoiminnot.

3. Johdatus ohjelmointiin Fortran 95:llä 25 3.3 Miksi Fortran-kieltä kannattaa käyttää Fortran-ohjelmointikielentärkeinetuonkielenyleisestihyväksyttystandardi. Koska lähestulkoon kaikille tietokoneille on saatavissa standardin mukainen Fortran-kääntäjä, on koodien siirtäminen mahdollista melkein mihin tahansa koneympäristöön. Fortran-kielen vahvuuksia on soveltuvuus numeeriseen laskentaan. Kielessä on paljon sellaisia piirteitä, jotka ovat muissa kielissä ylimääräisiä laajennuksia tai hankalasti lisättäviä piirteitä (esimerkkeinä kompleksilukujen aritmetiikka ja taulukkosyntaksi). Fortran-kieltä kehitetään aktiivisesti edelleen. Esimerkiksi rinnakkaislaskentaa varten on kehitetty Fortran 95 -kielen laajennus High Performance Fortran (HPF). Rinnakkaisohjelmointi onnistuu myös OpenMP:n avulla. Rinnakkaislaskentaa käsitellään luvussa 17 (sivu 299). Fortran 95 -standardi on pääosin yhteensopiva aiempiin Fortran-kielen standardeihin nähden. Täten aiemmin kehitetyt Fortran-koodit toimivat myös jatkossa. Pieni osa FORTRAN 77 -kielen piirteistä määriteltiin vanhentuneiksi, mutta useimmat Fortran 95 -kääntäjät sallivat silti näiden piirteiden käytön. Saatavilla on paljon valmiita Fortran-kielisiä ohjelmistoja, joita voi käyttää hyväksi omassa ohjelmointityössä. Usein ohjelmointi onkin olemassaolevan koodin muokkaamista uusia tarpeita vastaavaksi. 3.4 Fortran-ohjelman perusrakenne Ohjelmoimaan oppii vain ohjelmoimalla. Tässä teoksessa esitettyjä esimerkkejä kannattaa kokeilla itse. Pienten muutosten tekeminen esimerkkiohjelmiin on hyvä tapa oppia ymmärtämään Fortranin mahdollisuuksia. Fortran-kieltä voi käyttää taskulaskimen tapaan tekemään yksinkertaisia laskutoimituksia. Seuraavassa on alkeellinen esimerkkiohjelma: PROGRAM laskuesimerkki WRITE (*,*) 7*52 + 1 END PROGRAM laskuesimerkki Tämä ohjelmakoodi koostuu kolmesta rivistä, joista kullakin on yksi Fortranin lause. Lauseessa esiintyvät tunnukset erotetaan toisistaan välilyönneillä. WRITE-lauseen sisentämiseen on käytetty välilyöntejä, jolloin koodi on selkeämpi lukea. PROGRAM-lause antaa ohjelmalle nimen, ja END PROGRAM -lause lopettaa ohjelmayksikön suorituksen. WRITE-lausetta käytetään tulostukseen. Merkintä 7*52 tarkoittaa kertolaskua ja merkki + yhteenlaskua. Lause WRITE (*,*) 7*52 + 1 tulostaa laskutoimituksen 7 52 + 1 tuloksen kuvaruudulle. Kun olemme kirjoittaneet tämän ohjelmakoodin tiedostoon laskut.f90,

26 Fortran 95/2003 saamme ohjelman käännettyä ajokelpoiseksi ohjelmaksi Unix-koneissa tyypillisesti komennolla % f90 -o laskut laskut.f90 Tiedoston nimi päättyy merkkeihin.f90, mistä kääntäjä tunnistaa tiedoston Fortran-lähdekooditiedostoksi. Jos käännöksessä ei ollut ongelmia, voimme ajaa syntyneen ohjelman laskut esimerkiksi seuraavasti: %./laskut 365 Ohjelma siis tulosti laskutoimituksen 7 52 + 1 tuloksen. Fortran-ohjelma voi tulostaa myös merkkijonoja: PROGRAM laskuesimerkki_2 WRITE (*,*) 7*52 + 1 =, 7*52 + 1 END PROGRAM laskuesimerkki_2 Tämän ohjelman tulostus näyttää tältä: 7*52 + 1 = 365 Siis lainausmerkeissä (... ) ollut merkkijono tulostettiin sellaisenaan. 3.5 Tunnusten nimeäminen Edellisessä esimerkissä aloitettiin pääohjelma PROGRAM-lauseella. Ohjelmakoodi lopetettiin lauseella END PROGRAM. Jokaisessa ajokelpoisessa ohjelmassa on vain yksi pääohjelma. Ohjelman tunnus oli ensimmäisessä esimerkissä laskuesimerkki. Tunnuksen pituus saa olla korkeintaan 31 merkkiä, ja tunnukseen kelpaavat kirjaimet A... Z, alaviiva _ sekä numerot. Nämä säännöt koskevat käyttäjän määrittelemien tunnusten lisäksi myös Fortranin omia tunnuksia. Tässä oppaassa käytetään itse määritellyissä tunnuksissa pieniä kirjaimia. Fortran-kielen kannalta nimet lasku, Lasku ja LASKU ovat identtisiä, mutta pienet kirjaimet parantavat koodin luettavuutta. Fortran 95 -standardi ei ehdottomasti vaadi, että kääntäjä hyväksyisi pienet kirjaimet, mutta kaikki kääntäjät näyttävät sen tekevän. Tunnusten nimien on syytä olla järkeviä ja helposti ymmärrettäviä. Tunnusten nimeäminen on osa ohjelman dokumentointia! Esimerkiksi jos tunnuksen nimi viittaa eri asiaan kuin mihin tunnusta käytetään, aiheuttaa tämä sekaannuksen vaaran.

3. Johdatus ohjelmointiin Fortran 95:llä 27 3.6 Vakiot ja peruslaskutoimitukset Edellisessä esimerkissä laskimme lausekkeen 7*52 + 1 arvon. Lausekkeessa esiintyy kolme kokonaislukuvakiota. Myös lausekkeen tulos 365 on kokonaisluku. Kokonaislukuvakiolla voi myös olla etumerkki (+ tai -), esimerkkinä tästä on vakio -5. Kokonaislukujen lisäksi Fortran osaa laskea myös reaaliluvuilla. Seuraavassa tulostetaan reaalilukuvakioita sisältävän laskutoimituksen tulos: WRITE (*,*) 52.0/7.0 Operaatio / tekee jakolaskun. Tämän lauseen tulostus voisi olla 7.4285712 Tietokone laskee äärellisellä tarkkuudella. Tässä tapauksessa tuloksen tarkkuus on noin kuusi desimaalia, vaikka ohjelma tulostaa kahdeksan numeroa. Reaalikuluvakiot erotetaan kokonaisluvuista desimaalipisteen avulla. Reaaliluvut voi esittää myös eksponenttiesityksen avulla: WRITE (*,*) 0.52E2/0.7E1 Tämä lauseke tulostaa saman kuin edellä. Merkintä 0.52E2 tarkoittaa arvoa 0.52 10 2 = 52.0. Merkintä 520E-1 tarkoittaisi myös samaa arvoa: 520 10 1 = 52.0. Fortranin ymmärtämät peruslaskutoimitukset ovat +, -, *, / ja **. Nämä operaatiot vastaavat yhteen-, vähennys-, kerto- ja jakolaskua sekä potenssiin korottamista. Esimerkiksi lausekkeen 2**3 arvo on 2 3 = 8. Laskutoimitusten tulos riippuu argumenttien tyypistä. Lause WRITE (*,*) 52.0/7.0 =, 52.0/7.0,, 52/7 =, 52/7 tulostaa seuraavaa: 52.0/7.0 = 7.4285712, 52/7 = 7 Siis kokonaislukujen jakolaskun 52/7 tulos on myös kokonaisluku, ja murtoosa jätettiin huomiotta. Tarkista siis aina jakolaskun argumenttien tyypit! Jos jakolaskun argumenteista toinen on reaalilukutyyppiä, on tuloskin reaaliluku. Siten lausekkeen 52.0/7 arvoksi saadaan 7.4285712. Sulkumerkkejä ( ja ) voi käyttää laskutoimitusten ryhmittelyyn: WRITE (*,*) 52.0/7.0 + 1.0, (52.0/7.0)+1.0, 52.0/(7.0 + 1.0) Tämä lause tulostaa seuraavaa: 8.4285717 8.4285717 6.5000000 Koska jakolasku suoritetaan ennen yhteenlaskua, ovat edellä kaksi ensimmäistä lauseketta identtiset, joten sulkujen käyttö ei siis ole välttämätöntä. Kolmannessa lausekkeessa ovat sulut välttämättömät, muuten lausekkeen tarkoitus muuttuu. Merkkijonovakiot voi esittää joko yksinkertaisilla lainausmerkeillä (tyyliin

28 Fortran 95/2003 merkkijono ) tai kaksinkertaisilla lainausmerkeillä ("merkkijono"). Jos merkkijono sisältää lainausmerkin, täytyy se kahdentaa tai laittaa toisentyyppisten lainausmerkkien sisään: WRITE (*,*) yht äkkiä oli kesä WRITE (*,*) "yht äkkiä oli kesä" 3.7 Muuttujat Edellisissä esimerkeissä käytettiin pelkästään ohjelmakoodiin sijoitettuja vakioita. Jos ohjelman halutaan laskevan jotain muuta, joudutaan tällöin muuttamaan ohjelmakoodia ja kääntämään ohjelma uudestaan. Muun muassa tämän takia ohjelmoinnissa käytetään muuttujia, jotka voivat saada eri arvoja ohjelman ajokerrasta toiseen. Olkoon tehtävänä kirjoittaa seuraavasti toimiva ohjelma: 1. pyydetään syöttämään kaksi lukua 2. luetaan lukuarvot näppäimistöltä 3. tulostetaan syötetyt luvut ja niiden tulo. Tämä voidaan tehdä seuraavalla ohjelmalla: PROGRAM kertolasku! Ohjelma lukee kaksi kokonaislukua sekä! laskee ja tulostaa niiden tulon. INTEGER :: i, j WRITE (*,*) Syötä luku i: READ (*,*) i WRITE (*,*) Syötä luku j: READ (*,*) j WRITE (*,*) Luku i:, i WRITE (*,*) Luku j:, j WRITE (*,*) Tulo i*j:, i*j END PROGRAM kertolasku Huutomerkillä (!) alkavat rivit ovat kommentteja ja ne on tarkoitettu ohjeeksi ohjelman lukijalle ja käyttäjälle. Määrittely parantaa kääntäjän tekemiä virheentarkistuksia. Se on syytä laittaa jokaiseen ohjelmayksikköön otsikkolauseen (PROGRAM tms.) jälkeen. Tämä lause poistaa käytöstä tunnuksen ensimmäiseen kirjaimeen perustuvan tyyppimäärittelyn, josta kerrotaan tarkemmin kappaleessa 5.4 (sivu 55). Ohjelmassa määritellään kokonaislukumuuttujat i ja j rivillä INTEGER :: i, j Ensimmäinen WRITE-lause tulostaa kehotteen syöttää muuttujalle i arvo. Näppäimistöltä lukemiseen käytetään lausetta

3. Johdatus ohjelmointiin Fortran 95:llä 29 READ (*,*) i Tällöin muuttuja i saa arvokseen käyttäjän antaman luvun. Sama tehdään muuttujalle j. Lopuksi ohjelma tulostaa muuttujien i ja j arvot ja kertolaskun i*j tuloksen. Muuttujia voi siis käyttää vakioiden tavoin aritmeettisissa lausekkeissa. Ohjelman toiminta voisi olla seuraavaa: Syötä luku i: 11 Syötä luku j: 13 Luku i: 11 Luku j: 13 Tulo i*j: 143 Käyttäjä siis syötti ohjelmalle luvut 11 ja 13, ja ohjelma tulosti arvon 11 13 = 143. 3.8 Muuttujien tyypit Edellä määrittelimme kokonaislukutyyppisiä (INTEGER) muuttujia. Kokonaislukujen lisäksi voimme määritellä reaalilukutyypin (REAL) muuttujia: PROGRAM potenssi! Ohjelma laskee ja tulostaa numeerisen lauseekkeen arvon. REAL :: k, x INTEGER :: n WRITE (*,*) Syötä lausekkeen k*x**n luvut k, x ja n: READ (*,*) k, x, n WRITE (*,*) Luku k:, k, Luku x:, x, Luku n:, n WRITE (*,*) Arvo k*x**n:, k*x**n END PROGRAM potenssi Muuttujat k ja x ovat reaalilukuja ja muuttuja n on kokonaisluku. Ohjelma lukee muuttujien arvot, tulostaa ne sekä laskee lausekkeen kx n arvon. Voimme käyttää ohjelmaa seuraavasti: Syötä lausekkeen k*x**n luvut k, x ja n: 5.0 1.23 3 Luku k: 5.0000000 Luku x: 1.2300000 Luku n: 3 Arvo k*x**n: 9.3043346 3.9 Sijoituslauseet Edellisessä ohjelmassa luimme tietoa muuttujiin k, x ja n sekä tulostimme lausekkeen k*x**n arvon. Yleensä tarvitsemme tätä monipuolisempia lausekkeita.

30 Fortran 95/2003 Sijoituslauseella voimme antaa muuttujalle arvon. Seuraavassa on pieni esimerkkiohjelma: PROGRAM neliojuuri! Ohjelma laskee neliöjuurilausekkeen arvon. REAL :: x, y INTRINSIC SQRT WRITE (*,*) Syötä luku x: READ (*,*) x y = x**2 + 1 WRITE (*,*) Luku x:, x WRITE (*,*) Arvo x**2 + 1:, y WRITE (*,*) Arvo SQRT(x**2 + 1):, SQRT(y) END PROGRAM neliojuuri Tässä ohjelmassa määrittelimme kaksi reaalilukumuuttujaa rivillä REAL :: x, y Lauseella INTRINSIC SQRT kerrotaan, että ohjelmassa käytetään Fortranin standardifunktiota SQRT, joka laskee luvun neliöjuuren arvon. Muuttujaan x luetaanarvonäppäimistöltä, jatämänjälkeensijoitetaanlausekkeen x**2 + 1 arvo muuttujaan y rivillä y = x**2 + 1 Lopuksi ohjelma tulostaa muuttujan y arvon sekä lausekkeen SQRT(y) arvon. Seuraavassa on esimerkki ohjelman käytöstä: Syötä luku x: 2.345 Luku x: 2.3450000 Arvo x**2 + 1: 6.4990253 Arvo SQRT(x**2 + 1): 2.5493186 Ohjelma tulostaa reaaliluvut kahdeksan numeron pituisina. Tulostetuissa arvoissa on noin kuusi merkitsevää desimaalinumeroa, koska reaaliluvuilla lasketaan äärellisellä tarkkuudella. 3.10 Omien funktioiden määrittely ja käyttö Edellä käytimme Fortranin standardifunktiota SQRT neliöjuuren laskemiseksi. Myös omien funktioiden määritteleminen on mahdollista. Seuraavassa ohjelmakoodissa määrittelemme funktion f, joka vastaa matemaattista määritelmää f(a) = a 2 + 1: PROGRAM funktio_esimerkki! Ohjelma lukee reaaliluvun x ja tulostaa! funktion f arvon tässä pisteessä.

3. Johdatus ohjelmointiin Fortran 95:llä 31 REAL :: x WRITE (*,*) Syötä luku x: READ (*,*) x WRITE (*,*) Luku x:, x WRITE (*,*) Arvo f(x):, f(x) CONTAINS FUNCTION f(a) RESULT(f_arvo) REAL :: a, f_arvo f_arvo = a**2 + 1 END FUNCTION f END PROGRAM funktio_esimerkki Tämä esimerkkiohjelma toimii seuraavasti: Syötä luku x: 2.345 Luku x: 2.345000 Arvo f(x): 6.499025 Funktion f arvo lasketaan funktiokutsulla f(x). Funktio f on määritelty pääohjelman sisäisenä funktiona CONTAINS-lauseen jälkeen. Funktioista kerromme lisää luvussa 8 sivulta 99 alkaen. Seuraavassa on ote funktion f määrittelystä: FUNCTION f(a) RESULT(f_arvo) REAL :: a, f_arvo Funktion f muodollinen argumentti a on määritelty funktion otsikkorivillä. Muodollinen argumentti saa arvokseen funktiokutsussa f(x) esiintyvän todellisen argumentin x arvon. Funktion f arvo lasketaan muuttujaan f_arvo seuraavasti: f_arvo = a**2 + 1 Sekä muodollinen argumentti a että funktion palauttama arvo f_arvo ovat tässä tapauksessa tyyppiä REAL. Voimme käyttää funktiota f esimerkiksi seuraavasti: y = f(x) y = f(1.0) y = f(1.23e2) Toisaalta funktiokutsut y = f(1) y = f(1,0) johtavat käännösaikaiseen virheeseen: ensimmäisessä kutsussa argumentti on väärää tyyppiä (kokonaisluku) ja toisessa kutsussa on lisäksi väärä määrä argumentteja. Käännösaikaiset argumenttilistojen tarkistukset ovat hyödyllisiä ohjelmankehityksen kaikissa vaiheissa. Jos edellisessä esimerkkikoodissa desimaali-

32 Fortran 95/2003 piste olisi muuttunut vahingossa pilkuksi, huomataan virheellinen funktiokutsu f(1,0) jo käännösaikana. Tätä ominaisuutta ei ollut FORTRAN 77:ssä. 3.11 Toistorakenteet Fortranissa hoidetaan lauseiden toistaminen DO-silmukkojen avulla. Laskemme esimerkkinä lausekkeen ( 1 + 1 ) x x arvot, kun x on 2 1, 2 2,...,2 10 eli 2, 4,...,1024. Seuraava ohjelmakoodi tulostaa halutut arvot: PROGRAM silmukka REAL :: x INTEGER :: i DO i = 1, 10 x = REAL(2**i) WRITE (*,*) arvot:, x, (1 + 1/x)**x END DO END PROGRAM silmukka Muuttuja x on määritelty REAL-tyyppiseksi, jolloin lausekkeessa 1/x vältetään kokonaislukujenjakolasku. Funktiokutsu REAL(2**i) muuttaa puolestaan kokonaislukulausekkeen 2**i reaalilukutyyppiseksi. DO-silmukka määritellään seuraavasti: DO silmukkamuuttuja = alaraja, yläraja lauseet END DO Silmukkamuuttuja käy järjestyksessä läpi arvot alaraja, alaraja + 1, alaraja + 2,..., yläraja. Tässä täytyy silmukkamuuttujan sekä ala- ja ylärajojen olla kokonaislukutyyppiä. Edellisessä esimerkissä silmukkamuuttuja i käy läpi arvot 1, 2, 3,...,10. Ohjelma tulostaa esimerkiksi seuraavaa (tulostusta muotoillaan paremman näköiseksi jatkossa): arvot: 2.0000000 2.2500000 arvot: 4.0000000 2.4414062 arvot: 8.0000000 2.5657845 arvot: 16.0000000 2.6379285 arvot: 32.0000000 2.6769900 arvot: 64.0000000 2.6973450 arvot: 1.2800000E+02 2.7077391 arvot: 2.5600000E+02 2.7129917