Johdatus f90/95 ohjelmointiin H, R & R luvut 1-3
Fortran-kieli ( 3.1-3) IBM 1954, FORmula TRANslator ISO/ANSI standardit f90, f95, f2003 tieteellinen & teknillinen laskenta rinnakkaislaskenta (HPF, openmp)
Fortran-kieltä voi käyttää taskulaskimen tapaan ( 3.4) PROGRAM lasku WRITE (*,*) 7*52 + 1 END PROGRAM lasku % pgf90 -o lasku lasku.f90 %./lasku
Merkkijonon tulostus ( 3.4) PROGRAM lasku WRITE (*,*) '7*52 + 1 = ', 7*52 + 1 END PROGRAM lasku
Reaalilukulaskuja ( 3.6) PROGRAM laskuja WRITE (*,*) 52./7. WRITE (*,*) 0.52e2/0.7e1 WRITE (*,*) 52/7 WRITE (*,*) 52/7. END PROGRAM laskuja
Sulkumerkkejä voi käyttää laskutoimitusten ryhmittelyyn ( 3.6) PROGRAM laskuja WRITE (*,*) 52.0/7.0+1.0, (52.0/7.0)+1.0, & 52.0/(7.0 + 1.0) END PROGRAM laskuja
Lainausmerkkien sisältävä merkkijono ( 3.6) PROGRAM tokaisu WRITE (*,*) 'yht''äkkiä oli kesä' WRITE (*,*) "yht'äkkiä oli kesä" END PROGRAM tokaisu
Muuttujia ( 3.7) 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 https://extras.csc.fi/f95/esim-3.7.f90
Reaalilukutyypin muuttujia ( 3.8) PROGRAM potenssi! Ohjelma laskee ja tulostaa numeerisen lausekkeen 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 https://extras.csc.fi/f95/esim-3.8.f90
Sijoituslause ( 3.9) 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 https://extras.csc.fi/f95/esim-3.9.f90
Omien funktioiden määritteleminen ( 3.10) PROGRAM funktio_esimerkki! Ohjelma lukee reaaliluvun x ja tulostaa! funktion f arvon tässä pisteessä. 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 https://extras.csc.fi/f95/esim-3.10.f90
Toistorakenne: DO-silmukka ( 3.11) 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 https://extras.csc.fi/f95/esim-3.11.f90
Taulukko ( 3.12) PROGRAM keskiarvolasku INTEGER, PARAMETER :: lkm = 3 REAL, DIMENSION(lkm) :: arvosanat REAL :: keskiarvo INTRINSIC SUM arvosanat(1) = 7.25 arvosanat(2) = 7.0 arvosanat(3) = 9.5 keskiarvo = SUM(arvosanat)/lkm WRITE(*,*) keskiarvo END PROGRAM keskiarvolasku
Tulostuksen muotoilu ( 3.13) PROGRAM silmukka REAL :: x INTEGER :: i DO i = 1, 10 x = REAL(2**i) WRITE (*,'(A6,F7.1,F7.4)') 'arvot:',& x, (1 + 1/x)**x END DO END PROGRAM silmukka
Asuntolainan lyhennykset PROGRAM annuiteetti! Ohjelma laskee annuiteettilainan kuukausierän. REAL :: vuosikorko, kk_korko, lainasumma, kk_era INTEGER :: laina_aika WRITE (*,*) 'Anna vuosikorko prosentteina (%):' READ (*,*) vuosikorko WRITE (*,*) 'Anna alkuperäinen lainasumma (mk):' READ (*,*) lainasumma WRITE (*,*) 'Anna laina-aika kuukausissa (kk):' READ (*,*) laina_aika WRITE (*,'(A20, F12.2)') 'Vuosikorko (%):', vuosikorko WRITE (*,'(A20, F12.2)') 'Lainasumma (mk):', lainasumma WRITE (*,'(A20, I12)') 'Laina-aika (kk):', laina_aika IF (vuosikorko > 0.AND. lainasumma > 0 &.AND. laina_aika > 0) THEN! Syöttötiedot ovat kunnossa kk_korko = (vuosikorko/100.0)/12.0 kk_era = kk_korko*lainasumma/ & (1 - (1 + kk_korko)**(-laina_aika)) WRITE (*,'(A20,F12.2)') 'Kuukausimaksu (mk):', kk_era ELSE WRITE (*,*) 'Virhe: arvojen pitää olla positiivisia!' END IF END PROGRAM annuiteetti P = rl 1 (1+ r) m https://extras.csc.fi/f95/esim-3.14.f90
Simulointi PROGRAM pisteparit! Ohjelma simuloi pisteparin sijoittamista! yksikköneliöön. REAL, DIMENSION(2) :: a, b REAL :: d, s = 0.0 INTEGER :: i, n 1 WRITE (*,*) 'Anna lukuparien lkm:' READ (*,*) n WRITE (*,*) 'Pistepareja:', n, ' kpl' IF (n > 0) THEN DO i = 1, n CALL RANDOM_NUMBER(a) CALL RANDOM_NUMBER(b) s = s + SQRT(SUM((a - b)**2)) END DO d = s/n WRITE (*,*) 'Etäisyyden keskiarvo:', d ELSE WRITE (*,*) 'Lukumäärä negatiivinen!' END IF END PROGRAM pisteparit 0 0 a d b https://extras.csc.fi/f95/esim-3.16.f90 1
Moduulit MODULE taulukko_operaatiot CONTAINS FUNCTION jako(a, b, n) REAL :: a, b INTEGER :: n REAL, DIMENSION(n+1) :: jako REAL :: pituus INTEGER :: i pituus = ABS(a-b) jako = MIN(a,b) + (/ (i, i = 0, n) /)*pituus/n END FUNCTION jako END MODULE taulukko_operaatiot PROGRAM jakaminen USE taulukko_operaatiot INTEGER, PARAMETER :: n = 5 REAL, DIMENSION(n+1) :: arvot REAL :: pii pii = 4*ATAN(1.0) arvot = jako(0.0, pii, n) WRITE (*,*) 'arvot: ', arvot WRITE (*,*) 'SIN(arvot): ', SIN(arvot) END PROGRAM jakaminen https://extras.csc.fi/f95/esim-3.17.f90 % pgf90 -c taulukko_operaatiot.f90 % pgf90 jakaminen.f90 taulukko_operaatiot.o %./a.out
Harjoituksia Muuta ohjelmaa jakaminen siten, että sinifunktion arvo lasketaan pisteissä {-π, -9π/10, -8π/10,,0,,π}. Muuta ohjelmaa annuiteetti siten, että kuukausierän lisäksi tulostetaan kuukausittain jäljellä oleva lainapääoma. (Kuukausierään sisältyy sekä korkoa että lyhennystä.) Muuta simulointiohjelmaa pisteparit siten, että etäisyyden laskemiseen käytetään maksiminormia d = max( a 1 -b 1, a 2 -b 2 ) vihje: MAXVAL, ABS