Σημειώσεις fortran 95

161
Τ Ε Τ Υ Π Κ Εισαγωγή στη γλώσσα προγραμματισμού Fortran 95 Σημειώσεις Διαλέξεων Σ Σ

Upload: lamkiet

Post on 29-Jan-2017

254 views

Category:

Documents


7 download

TRANSCRIPT

  • Fortran 95

  • Copyright 20042018 , [email protected]

    Creative Commons - - 4.0 (CC-BY-NC-SA 4.0). , http://creativecommons.org/licenses/by-nc-sa/4.0/deed.el.

    X ELATEX. .

    6 2018. https://www.materials.uoc.gr/el/undergrad/courses/ETY114/notes.pdf

    [email protected]://creativecommons.org/licenses/by-nc-sa/4.0/deed.elhttp://creativecommons.org/licenses/by-nc-sa/4.0/deed.elhttps://www.materials.uoc.gr/el/undergrad/courses/ETY114/notes.pdf

  • i

    1 11.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.6 . . . . . . . . . . . . . . . . . . . . . . . . . . 51.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2 72.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7

    2.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72.1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82.1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

    2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

    2.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102.3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

    2.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.6 . . . . . . . . . . . . . . . . . . . . . . . . . . 13

    2.6.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132.6.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.6.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

    i

  • ii

    2.6.4 . . . . . . . . . . . 172.7 Fortran 95 . . . . . . . . . . . . . . . . 18

    2.7.1 . . . . . . . . 192.8 / . . . . . . . . . . . . . . . . . . . . . . . . . . 202.9 . . . . . . . . . . . . . . . . . . 21

    2.9.1 . . . . . . . . . . . . . . . . . . . . . . 242.10 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

    2.10.1 STOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262.11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27

    3 313.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

    3.2.1 IF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333.2.2 SELECT CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

    3.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

    4 414.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414.2 DO . . . . . . . . . . . . . . . . 41

    4.2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454.2.3 DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47

    4.3 DO . . . . . . . . . . . . . . . 484.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

    4.4.1 EXIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484.4.2 CYCLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 494.4.3 DO . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

    4.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

    5 575.1 . . . . . . . . . . . . . . . . . . . 57

    5.1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575.1.2 . . . . . . . . . . . . . . . . . . . . . . . . 585.1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585.1.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

    5.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 605.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625.4 / . . . . . . . . . . . . . 635.5 . . . . . . . . . . . . . . . . . . . . 655.6 / . . . . . . . . . . . . . . . 685.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715.8 . . . . . . . . . . . . . . . . . . . . . . . . 72

    5.8.1 WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72

  • iii

    5.9 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

    6 776.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

    7 / 837.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 837.2 FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

    7.2.1 FORMAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . 887.2.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    7.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897.3.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 897.3.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

    7.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

    8 998.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 998.2 . . . . . . . . . . . . . . . . . . . . . . . 1008.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

    8.3.1 . . . . . . . . . . . . . . . . . . . . . . 1078.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1078.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1088.6 RETURN . . . . . . . . . . . . . . . . . . . 1108.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

    8.7.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . 1118.7.2 . . . . . . . . . . . . . . . . . . . . . . . 1128.7.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

    8.8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1168.9 (recursive) . . . . . . . . . . . . . . . . . 1178.10 (ELEMENTAL) . . . . . . . . . . . . . 1198.11 MODULE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1218.12 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

    141.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

    .1.1 . . . . . . . . . . . . . . . . . . . . . . . . . . 141.1.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 141.1.3 hash . . . . . . . . . . . . . . . . . . . . . . . . . . . 142

    .2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.2.1 Bubble sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.2.2 Insertion sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143.2.3 Quick sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144.2.4 Merge sort . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

    .3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

  • iv

    149.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150.4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150.5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151.7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

    153

    155

  • 1

    .

    . -, , . , , .

    , , . , .

    - , , , (, ) -. , , , - . , (.. ), - (.. ), (.. ). , . , -/ , . .

    1

  • 2

    , , , - . , , .

    - . , , - .

    - Fortran 95 . .

    Fortran 95 - . Fortran 95 .

    1.1

    - : . , , :

    1. [ ].

    2. [ ] [- ].

    3. [ ] .

    . , (RAM) , .

    , Fortran, , , . :

    0. (, ).

    Fortran 95 - . :

  • 3

    PROGRAM diplasio

    IMPLICIT NONE

    ! 0INTEGER :: a, b

    ! 1READ *, a

    ! 2b = 2 * a

    ! 3PRINT *, "Todiplasioeinai"PRINT *, b

    END PROGRAM diplasio

    :

    1.2

    ( ) - PROGRAMEND PROGRAM :

    PROGRAM diplasio

    IMPLICIT NONE.........END PROGRAM diplasio

    diplasio. . .

    / 132 .

    PROGRAM ... . ( ) IMPLICIT NONE. , , .

  • 4

    END PROGRAM .... Fortran 95

    .

    1.3

    compiler ! . - ( ASCII).

    ! - , . - , , , . , , .

    1.4

    (variables) (, ) . , compiler . .

    INTEGER :: a, b

    . , . compiler (INTEGER) a b.

    1.5

    READ *, a

    - a. * ,

  • 5

    , READ. .

    . (2.2) ().

    1.6

    b = 2*a

    : , : a - 2. *. , .

    1.7

    PRINT *, "Todiplasioeinai"PRINT *, b

    : - ( ) b ( ).

    - .

    1.8

    1. , .1

    1 compiler - .

  • 6

  • 2

    2.1

    Fortran

    INTEGER , ,

    REAL DOUBLE PRECISION , ,

    COMPLEX , ,

    LOGICAL , ,

    CHARACTER , .

    2.1.1

    .. abc :

    INTEGER :: abc

    ..value1, value2, :

    REAL :: value1REAL :: value2

    , ,

    7

  • 8

    REAL :: value1, value2

    , compilers, 6 1.

    , REAL . . Fortran 95 ( 2.7), . Fortran 77.

    .. ab, :

    DOUBLE PRECISION :: ab

    -, 15 .

    ( ) :

    COMPLEX :: z

    .

    2.1.2

    , , , , , , . az, 0 9 _. 31 . . . _ .

    - .

    2.1.3

    , ., READ... a

    1 , , .

  • 9

    INTEGER :: a.....READ *, a

    , , ,

    INTEGER :: a.....READ (*,*) a

    (2.2),

    = [ ]

    ..

    REAL :: a, ba = 5.2b = 3.0 + 2 * a

    ( ). ..

    INTEGER :: k = 3

    k 32.

    .

    2.2

    = [ ]

    , . , , -, , .

    , 5.6.

    2 , 8.8.

  • 10

    2.3

    2.3.1

    , - . + ...,

    3, 12, 123456

    2.3.2

    , ( ) ( 6 ). . E, , 10 E :

    2.034, 0.23, .44, 23., 2e 4 ( 0.0002), 2.3E2 ( 230.0) .

    , ( ) D 10 ( 15 ). ..,

    2d 4 ( 0.0002d0), 2.3D2 ( 230.0d0) .

    Fortran - 3. - . , .. , .

    E D . - . , 3.2 , Fortran 3.2D0 . , - . . -, 15 16 , 0 15 16 . , - = 3.14159265358979323846 . . . Fortran 3.141593 ( , ) 3.14159265358979 D0.

    3, , , .

  • 11

    2.3.3

    Fortran , , . . .., 3.1 + 2i

    (3.1, 2.0),

    i

    (0.0, 1.0).

    2.4

    , , , PARAMETER . () ( , , , , ., ). .. ,

    DOUBLE PRECISION, PARAMETER :: pi = 3.14159265358d0

    2.5

    +,, , / , , .

    +,, -, , . / ,, , . MOD()

    INTEGER :: a, b, p, y

    a = 5b = 3p = a / b ! : p 1y = MOD(a,b) ! : y 2

    . .. x3 Fortran x**3.

    +, , , / ( ), .

  • 12

    , . . ..

    INTEGER :: i, j, k

    i = 2 + 3 ! i 5j = 2 * 3 ! j 6i = i + j ! i 11i = 2 * i + j ! i 28i = 17 / j ! i 2k = i * j / 3 + 2**3 ! k 12

    . ..

    INTEGER :: i, j, k

    i = 2j = 6k = 2 * i + j ! k 10k = 2 * (i + j) ! k 16k = j * i / 3 ! k 4k = j * (i / 3) ! k 0

    : +,, , / - (.. ), - . , , - , . , . ..

    INTEGER :: i, jREAL :: x, y

    i = 8.3 ! i 8j = 2y = 3.0

    x = 4.0 / 3 ! x 4.0/3.0 x 1.33333

    x = j + y ! x 2 + 3.0 x 2.0 + 3.0 x 5.0

    i = 4 / 3.0 ! i 4.0/3.0 i 1.33333 i 1

    x = 4 / 3 ! x 1 x 1.0

  • 13

    x = 2.0 * 4 / 3 ! x 8.0/3 x 8.0/3.0! x 2.66667

    x = 4 / 3 * 2.0 ! x 1 2.0 x 2.0

    : (.. ) . ; .

    PRINT *, 0.1d0-0.3d0+0.2d0PRINT *, 0.1d0+0.2d0-0.3d0

    2.6

    Fortran, INTEGER , REAL, DOUBLE PRECISION .

    2.6.1

    - , Fortran CHARACTER . .. ch :

    CHARACTER :: ch

    () ():

    ch = 'a'ch = 'D'ch = "R"

    , . , "Thisisamessage" 17 , , CHARACTER . -

    CHARACTER (17) :: ch

    ch = "Thisisamessage"

  • 14

    2.6.2

    (LOGICAL) (.. /, /,). , .. a, :LOGICAL :: a

    .TRUE. .FALSE.. .. - .TRUE. a a = .TRUE.

    2.6.3

    Fortran COMPLEX - . COMPLEX :: z

    , compiler, , , . Fortran 77 . Fortran 95 (2.7) . , Fortran, DOUBLE COMPLEX .

    Fortran

    , , , (,) . - :

    COMPLEX :: z

    z = (1.2, 4.56) ! z 1.2 + i4.56

    - 0

    COMPLEX :: z

    z = 2 ! z 2.0 + i0.0z = 2.3 ! z 2.3 + i0.0

    ( , ):

  • 15

    COMPLEX :: z, z1, z2

    z1 = 3 ! z1 3.0 + i0.0z2 = (4.6, -4.2) ! z2 4.6 i4.2z = z1 + z2 + 5.1 ! z 12.7 i4.2

    .

    . ..

    COMPLEX :: z

    READ *, z

    (1.6, -3.8)

    ( ).

    CMPLX().

    COMPLEX :: zREAL :: x, y

    x = 3.4y = -9.1

    z = CMPLX(x,y) ! z 3.4 i9.1

    z = (x,y)

    , .

    +,-,*,/,** .

    z1 = + i, z2 = + i,

    z1 z2 = ( ) + i( + ) .

  • 16

    * Fortran. /.

    2.2, 2.5, ( ), , . , . - , :

    COMPLEX :: zREAL :: x

    z = (2.3,4.5) ! z 2.3 + i4.5x = z ! x 2.3

    , - :

    COMPLEX :: zINTEGER :: i

    z = (2.3,4.5) ! z 2.3 + i4.5i = z ! i 2

    .

    /

    REAL() ( ) :

    COMPLEX :: zREAL :: x

    z = (1.2,-8.7) ! z 1.2 i8.7x = REAL(z) ! x 1.2

    AIMAG():

    COMPLEX :: zREAL :: x

    z = (1.2,-8.7) ! z 1.2 i8.7x = AIMAG(z) ! x 8.7

  • 17

    CONJG():

    COMPLEX :: z1, z2

    z1 = (1.2,-8.7) ! z1 1.2 i8.7z2 = CONJG(z1) ! z2 1.2 + i8.7

    () |z| ABS():

    COMPLEX :: zREAL :: norm

    z = (1.2,-8.7) ! z 1.2 i8.7norm = ABS(z) ! norm

    1.22 + 8.72

    2.6.4

    . ..

    DOUBLE PRECISION :: xINTEGER :: i, j

    i = 3j = 2

    x = i/j ! x 1.0d0

    x, , (1.5) .

    DOUBLE PRECISION :: xINTEGER :: i, j

    i = 3j = 2

    x = DBLE(i)/DBLE(j) ! x 1.5d0

    . . .

  • 18

    Fortran : REAL(), DBLE(),INT(), CMPLX(). (INTEGER , REAL, DOUBLE PRECISION , COMPLEX) REAL, DOUBLE PRECISION , INTEGER , COMPLEX . - .

    , -, x = 1.0d0 * i / j

    x = (i+0.0d0) / j

    x (;).

    2.7 Fortran 95

    Fortran , , , . Fortran 95 - , . Fortran 77 REAL DOUBLE PRECISION . Fortran 95 , . .

    Fortran 95 :REAL (prc) :: a

    , a (kind)prc. , . , .

    , prc , :

    SELECTED_REAL_KIND (). - ( ) ( ). ..INTEGER, PARAMETER :: prc = SELECTED_REAL_KIND(12)

    prc 12 .

  • Fortran 95 19

    KIND(). .

    INTEGER, PARAMETER :: prc = KIND(1.0D0)

    prc -.

    : -, - . , - REAL . :

    INTEGER, PARAMETER :: prc = SELECTED_REAL_KIND(12)

    REAL (prc) :: c

    INTEGER, PARAMETER :: prc = KIND(1.0D0)

    REAL (prc) :: b

    b 1.0D0, . , c 12 . , prc , .

    . - :

    INTEGER, PARAMETER :: prc = KIND(1.0D0)

    COMPLEX (prc) :: z

    z .

    2.7.1

    Fortran 95 2.3 ., 340 3.4E2 340.0 3.4D2 . , prc,

  • 20

    340.0_prc

    , ,

    3.4E2_prc

    :

    INTEGER, PARAMETER :: prc = KIND(1.0D0)

    REAL (prc) :: a, bREAL (prc), PARAMETER :: pi = 3.141592653589793_prc

    a = 2.4_prcb = a + 5.6E2_prc

    , , , - , .

    2.8 /

    a , , READ:

    READ *, a

    , ,

    READ (*,*) a

    PRINT

    PRINT *, a

    , , WRITE:

    WRITE (*,*) a

    -, . ..

    INTEGER :: aDOUBLE PRECISION :: b

    a = 4b = 4.5d0

    PRINT *, "Oitimeseinai", a, b

  • 21

    * READ(*,*)/WRITE(*,*) . . * - . READ */PRINT * , , * ( ).

    2.9

    (AIMAG(), CONJG(), CMPLX()) 2.6.3, Fortran . - 2.1.

    - () ., DOUBLE PRECISION - DOUBLE PRECISION .

    Fortran :

    PROGRAM riza

    IMPLICIT NONEDOUBLE PRECISION :: x

    PRINT *, "Dwseenapragmatiko"READ (*,*) x

    PRINT *, "Htetragwnikhrizaeinai"WRITE (*,*) SQRT(x)

    END PROGRAM riza

    PROGRAM imitono

    IMPLICIT NONEDOUBLE PRECISION :: theta, x

  • 22

    2.1:

    Fortran

    95(

    ).

    ABS(x)

    .

    .

    ABS(x)

    ( xx).

    .CEILING(x)

    O

    .

    .

    FLOOR(x)O

    -

    .

    .

    INT(x)

    |x|,

    x.

    ,

    -

    (

    ).

    NINT(x)

    .

    ,

    .

    AINT(x)

    |x|,

    x.

    .

    ANINT(x)

    x>0

    AINT(x+0.5)

    AINT(x-0.5).

    .

    SQRT(x)

    .

    -

    .

    EXP(x)

    (ex).

    LOG(x)

    (lnx).

    (,

    ].LOG10(x)

    (logx).

    .

    MOD(x,y)

    x/y,

    x-INT(x/y)*y.

    x,y

    ,

    .

    y=

    0.MODULO(x,y)

    R

    [0,y)

    x=Qy+R

    Q

    .

    x,y,

    y=0.

    MODULO(x,y)

    x-

    FLOOR(x/y)*y.

    x,y,

    y=

    0.

  • 23

    2.1:

    Fo

    rtran95

    (

    ).

    MA

    X(x1

    ,x2,

    ...)

    -

    .

    ,

    -

    .

    MIN(

    x1,x

    2,...)

    -

    .

    ,

    -

    .

    DIM(

    x,y)

    MA

    X(x-

    y,0.0)

    .

    ,

    -

    .

    REAL

    (x)

    .

    .

    DBLE

    (x)

    .

    .

    CONJ

    G(x)

    .

    .AI

    MAG(

    x)

    .

    .CO

    S(x)

    .

    rad.

    SIN(

    x)

    .

    rad.

    TAN(

    x)

    .

    rad.

    ACOS

    (x)

    .

    [1

    :1],

    [0

    :]

    rad.

    ASIN

    (x)

    .

    [1

    :1],

    [/2:/2]

    rad.

    ATAN

    (x)

    .

    [/2:/2]

    rad.

    ATAN

    2(y,

    x)

    tan1(y/x

    ).

    -

    .

    (

    :]

    rad.

    COSH

    (x)

    .

    SINH

    (x)

    .TA

    NH(x

    )

    .

  • 24

    PRINT *, "Dwseenapragmatiko"READ (*,*) theta

    x = SIN(theta)

    PRINT *, "Toimitonoeinai"WRITE (*,*) x

    END PROGRAM imitono

    ( ), , 2.1.

    (rad).

    2.9.1

    RANDOM_NUMBER () - . , - [0, 1). 8 CALL . , :

    PROGRAM randIMPLICIT NONEDOUBLE PRECISION :: x, y

    CALL RANDOM_NUMBER(x) ! to x einai tyxaios metaksy 0, 1CALL RANDOM_NUMBER(y) ! to y einai tyxaios metaksy 0, 1

    END PROGRAM rand

    RANDOM_NUMBER () RANDOM_SEED (). - .

    [a, b) . r [0, 1) x = r+ , x . x = (b a)r + a a x b.

  • 25

    RANDOM_NUMBER () elemental, 8.10, . N N .

    2.10

    , PROGRAMEND PROGRAM :

    PROGRAM onoma

    IMPLICIT NONE.........

    END PROGRAM onoma

    ( onoma) , - . - . Fortran 95, . , 132 , - , &. ..

    INTEGER :: a, b

    , ,

    INTEGER :: a, &b

    , & ( ).

    PROGRAM onoma . ( ) IMPLICIT NONE. , , .

    , modules, 8. .

  • 26

    2.10.1 STOP

    , - END PROGRAM . , STOP . . STOP , , 5 . , , STOP. STOP( ) .

  • 27

    2.11

    1. . ( copy-paste!) athroisi.f90, .PROGRAM athroisiIMPLICIT NONE

    INTEGER :: a, bINTEGER :: c

    PRINT *, "Dosedyoakeraious"READ *, a,b

    c = a + b

    PRINT *, "Toathroismatouseinai:"PRINT *, c

    END PROGRAM athroisi

    2. , , .

    3. ( ).

    4. 2.3167895443, 4 103, 102, 3/2. . ;

    5. , x,y,z:

    d = x2 + y2 + z2

    d = x2/y + z d = 2.45(x+ 1.5) + 3.1(y + 0.4) + 5.2 z/2 d = (12.8x+ 5y)/(11.3y + 4z) d = x2/3 + y2/3 + z2/3

    x = 1.5, y = 2.5, z = 3.5 :20.75, 4.4, 19.79, 0.7502958579881658, 5.457604592453865.

  • 28

    6. :

    () ,() ,() ( -

    ),() ( -

    ).

    = 2R E = R2.

    7. a, b, c a2+b2 = c2 . m, n m > n, a = m2 n2, b = 2mn, c = m2 + n2.4 .

    8. .: 10. ;

    9. - , , . : 200000, : 2 days, 7 hours, 33 min & 20 seconds.

    10. Gauss ( 2099) :

    .

    :() r1 = 19.() r2 = 4.() r3 = 7.() ra = 19r1 + 16.() r4 = ra 30.() rb = 2(r2 + 2r3 + 3r4).

    4 .

  • 29

    () r5 = rb 7.() rc = r4 + r5 + 3.

    rc , .5

    . - rc, .

    11.

    () ,() ,() .

    12. . 80 cm. - . . :

    () ,() cm,() km, m cm.

    , 1253 : 100 240 cm 1 km, 2m, 40 cm. (, 2001)

    13.

    = 4 tan1(1) ,

    = 8 tan1(1/3) + 4 tan1(1/7) .

    -, x ( )

    tan1(x) = cos1(1/1 + x2

    )= sin1

    (x/1 + x2

    ).

    = 3.14159265358979323846264338 . . .. - ;

    14. - , (, ), , , .

    5 rc 30, (rc 30) .

  • 30

  • 3

    3.1

    Fortran ( - ) ( 3.1). -

    == /= > < >= 2.0 .TRUE. 2/=1+1 .FALSE.. - . , , ==,/= .

    , - , 2.5, .

    : .

    Fortran .NOT., .AND., .OR., .EQV., .NEQV.. , , :

    31

  • 32

    .NOT. :

    .NOT. (4 > 3) .FALSE. .NOT. (4 < 3) .TRUE.

    .AND. .TRUE. .TRUE.. .FALSE.:

    (4 > 3) .AND. (3.0 > 2.0) .TRUE. (4 < 3) .AND. (3.0 > 2.0) .FALSE.

    .OR. .TRUE. .TRUE., .FALSE.:

    (4 > 3) .OR. (3.0 < 2.0) .TRUE. (4 < 3) .OR. (3.0 < 2.0) .FALSE.

    .EQV. .TRUE. .FALSE.:

    (4 < 3) .EQV. (3.0 < 2.0) .TRUE. (4 < 3) .EQV. (3.0 > 2.0) .FALSE.

    .NEQV. .TRUE. .FALSE.:

    (4 < 3) .NEQV. (3.0 < 2.0) .FALSE. (4 < 3) .NEQV. (3.0 > 2.0) .TRUE.

    , .EQV. .NEQV., - . - ==, /= .

    Fortran LOGICAL :

    LOGICAL :: a, bINTEGER :: i, max

    ...

    a = 3==2b = ( (i > 0) .AND. (i < max) )

  • 33

    3.2

    3.2.1 IF

    IF -. () -, . Fortran :

    IF (condition) THEN...... // block A

    ELSE...... // block B

    END IF

    (condition), , . , block ELSE END IF ( ).

    , , ...

    IF (val > 0.0d0) THENPRINT *, "Oarithmoseinaithetikos"max = val

    ELSEPRINT *, "Oarithmosdeneinaithetikos"

    END IF

    IF. () . .

    ELSE , ELSE :

    IF (condition) THEN......

    END IF

    ELSE IF,

    IF (condition) THENcommand

    END IF

  • 34

    :

    IF (condition) command

    THEN, END IF. IF IF, ..

    IF (cond1) THEN...

    ELSEIF (cond2) THEN

    ...ELSE

    ...END IF

    END IF

    IF (cond1) THEN...

    ELSE IF (cond2) THEN...

    ELSE...

    END IF

    , ELSE IF:

    IF (cond1) THEN...

    ELSE IF (cond2) THEN...

    ELSE IF (cond3) THEN...

    ELSE IF (cond4) THEN...

    ELSE...

    END IF

    IF, cond1, cond2, - . , . , ELSE ( ) IF.

  • 35

    3.2.2 SELECT CASE

    SELECT CASE , IF. :

    SELECT CASE (i)CASE (value1)...CASE (value2).........CASE (valueN)...CASE default...

    END SELECT

    i ( ) ( ), . value1, value2, ,valueN ( -).

    , i value1,value2,,valueN. , - CASE. , END SELECT . value1, value2,,valueN default , ., END SELECT .

    CASE .

    - . 0 , 1 , 2 , 3, .

    INTEGER :: iCHARACTER (5) :: direction

    READ *, i

    SELECT CASE (i)CASE (0)

    direction = "up"CASE (1)

  • 36

    direction = "down"CASE (2)

    direction = "left"CASE (3)

    direction = "right"CASE default

    direction = "none"END SELECT

    PRINT *, "Hkateythinsieinai", direction

    i, - . .., (0, 4, 8) (1, 5, 9), (2, 6) (3, 7).

    SELECT CASE (i)CASE (0,4,8)

    direction = "up"CASE (1,5,9)

    direction = "down"CASE (2,6)

    direction = "left"CASE (3,7)

    direction = "right"CASE default

    direction = "none"END SELECT

    , ,

    :

    , CASE

    CASE (0:9)...

    [0, 9]. , () Fortran. ..

    SELECT CASE (i)CASE (:-1)... ! entoles otan i < 0CASE (0)... ! entoles otan i == 0

  • 37

    CASE (1:)... ! entoles otan i > 0

    END SELECT

  • 38

    3.3

    1. , .: 2 0.

    2. - , . , .

    3. ax = b, a, b . a, b, : () a = 0, () a = 0 b = 0, () a = 0 b = 0.

    4. ax2 + bx + c = 0, () a, b, c . a,b,c, . (, ), , .

    5. .

    6. / 5 .

    7. - 2015 :

    ( ) 0 - 20000 22%

    20000,01 - 30000 29%30000,01 - 40000 37%

    40000,01 45% , 48000 , 20000 22% ( 4400 ), 10000 29% ( 2900 ), - 10000 37% ( 3700 ) 8000 45% ( 3600 ). 14600 . ( ) .

  • 39

    8. :

    , , , , , , 31 .

    , , , 30 . 28 ,

    29. 4,

    . 400. : 4 100 . 400.

    16 - 1923 ( ) 1 1923 ( )., 1923 15 .

    , SELECT CASE, .

    9. Zeller (, , ) : d (1, 2, 3, . . . , 31), m (1, 2, . . . , 12) y . 1 () 2 () m 12 1 y. ,

    () a 13(m+ 1) 5.() j, k ,

    100.() b j 4.() c k 4.() h a, b, c, d, k

    j.

    h 7 : 0 , 1 , . .

  • 40

  • 4

    4.1

    , . DO Fortran , - . :

    , , ,

    , .

    4.2 DO

    : 1, 2, 3, 4, 5, . , ,

    WRITE (*,*) 1WRITE (*,*) 2WRITE (*,*) 3WRITE (*,*) 4WRITE (*,*) 5

    . , , .. 500;

    41

  • 42

    . ,

    INTEGER :: i

    i=1WRITE (*,*) i

    i=2WRITE (*,*) i

    i=3WRITE (*,*) i

    i=4WRITE (*,*) i

    i=5WRITE (*,*) i

    , , , 1. DO

    INTEGER :: iDO i = 1,5

    WRITE (*,*) iEND DO

    , .. 500 : i.

    4.2.1

    DO

    DO = , , ........END DO

    . , , , .

  • DO 43

    ( (,) ) 1. , 0.

    :

    1. .

    2. :

    , .

    , .

    , - .

    3. 2 , END DO, .

    4. 2 , (, ) DO, END DO.

    5. 2.

    ( ) ,

    ( )

    , (.. EXIT, 4.4.1) .

    ( ) , , , , . , , . , DO END DO.

    - 1 9 s. ,

  • 44

    INTEGER :: ss = 1 + 3 + 5 + 7 + 9

    . , , :INTEGER :: ss = 0s = s + 1s = s + 3s = s + 5s = s + 7s = s + 9

    , , -, s, .

    , :INTEGER :: sINTEGER :: is = 0

    i = 1s = s + i

    i = i + 2s = s + i

    i = i + 2s = s + i

    i = i + 2s = s + i

    i = i + 2s = s + i

    :INTEGER :: sINTEGER :: is = 0DO i = 1, 9, 2

    s = s + iEND DO

  • DO 45

    4.2.2

    , -,

    = +

    ( , ).

    , - DO.

    100 , 1 100, - :INTEGER :: sum, isum = 0DO i = 1, 100

    sum = sum + iEND DO

    [0, 1000] - :INTEGER :: sum, isum = 0DO i = 0, 1000, 2

    sum = sum + iEND DO

    99, 97, 95,, 3, 1, , INTEGER :: iDO i = 99, 1, -2

    WRITE (*,*) iEND DO

    0.0, 0.1, 0.2, , 99.9, 100.0 INTEGER :: iDO i = 0, 1000

    WRITE (*,*) 0.1d0 * iEND DO

  • 46

    ( )

    DOUBLE PRECISION :: xDO x = 0.0d0, 100.0d0, 0.1d0 !

    WRITE (*,*) xEND DO

    [5 : 108]

    INTEGER :: k, ik = 0DO i = 5, 108

    IF (MOD(i,2) == 0) k = k + 1END DO

    , k - . 0 . - . , . .

    0,1,1,2,3,5,8,13,, , , , - Fibonacci. n , n2 . , . . - : a , b c . c=a+b. : - . . , - , : ,

  • DO 47

    , - . .

    INTEGER :: a,b,c,ka = 0b = 1PRINT *, aPRINT *, b

    DO k=2,nc = a+bPRINT *, ca = bb = c

    END DO

    , .

    4.2.3 DO

    DO -. :

    , , 1, 2, 3, 4, 5.

    WRITE (*,*) 1,2,3,4,5

    ,

    WRITE (*,*) (i, i=1,5)

    DO -, () .

    (, = , , )

    =, DO. 1. , . , DO .

    1, 3, 5, 7, 9

  • 48

    WRITE (*,*) (i, i=1,9,2)

    WRITE (*,*) (2*i+1, i=0,4)

    DO , , 5.

    4.3 DO

    - . .. - , . , . . Fortran 95 DO . :DO........END DO

    DO, DO END DO . , . Fortran 95 , , EXIT (4.4.1) .

    4.4

    4.4.1 EXIT

    EXIT DOEND DO - . , . END DO.

    : , DOUBLE PRECISION :: xDO

    READ (*,*) xIF (x > 0.0d0) EXIT

    END DO

    , .

  • 49

    4.4.2 CYCLE

    CYCLE DOEND DO. -, - DO , , . - DO . DO , 4.3, .

    : 10 , -.

    INTEGER :: iDOUBLE PRECISION :: xDO i=1,10

    READ (*,*) xIF (x < 0.0d0) CYCLE ! x

    WRITE (*,*) "Htetragwnikhrizaeinai", SQRT(x)END DO

    4.4.3 DO

    DO. ( :) DO, , END DO , :

    onoma: DO i=1, 10....

    END DO onoma

    , 2.1.2. DO EXIT CYCLE.

    , , -. , , , ,

    CYCLE onoma

    EXIT onoma

    onoma. ,

  • 50

    . EXIT .

    outer: DO i=1,10DO j=1,10

    DO k=1,20......IF (k > i+j) EXIT outer

    END DOEND DO

    END DO outer

    , EXIT ( ) END DO outer.

  • 51

    4.5

    1. 0.0, 0.1, 0.2,0.3, 0.4, , 2.5.

    2. 20 2 (20, 21, ...,219).

    3. . n! :

    n! = 1 2 3 . . . n, 0! = 1.

    n 12.

    4. 53 [3.5, 6.5] (- ).: n [a, b] , h. x1 = a, x2 = a + h, x3 = a + 2h, , xn =a+ (n 1)h. xn b, h = (b a)/(n 1).

    5. 30 - f(x) = x(x2 + 5 sin(x)) [5, 5]. .

    6. 1000 . H , 1.3%. 15 .

    7. , 2011 10815197. 0.53% , 15000000.

    8. () a,b. - 1. , - a b:

    a < b . b = 0 a . b > 0

    b a b.

    135 680.: 5

    1http://en.wikipedia.org/wiki/Euclidean_algorithm

    http://en.wikipedia.org/wiki/Euclidean_algorithm

  • 52

    9. . , . (.. 6 , 1, 2, 3, 6 1+2+3+6 = 12 = 26).

    10. .

    11. N Fibonacci2:

    fi+2 = fi+1 + fi, i 0, f0 = 0, f1 = 1 .

    : 0, 1, 1, 2, 3, 5, 8, . . .. . n . 0 n < 31.

    12. , . I: -: 1 . II: ( ) , 1 . - .

    13. . . .

    14. Gauss 10 28,

    () ,() ,() ,() 18 ,

    1930 .2http://oeis.org/A000045

    http://oeis.org/A000045

  • 53

    15. 8 39 - (, ).

    16. 8/2/2015. 8 39 17000 .

    17. . (n!!)

    n!! =

    1 3 5 (n 2) n n ,2 4 6 (n 2) n n ,

    1 n 0.

    n 15.

    18.

    ex

    ex =n=0

    xn

    n!,

    sinx

    sinx =k=0

    (1)kx2k+1

    (2k + 1)!,

    cosx

    cosx =k=0

    (1)kx2k

    (2k)!.

    - . - 1010.

    19. Gauss, a

    2a = n(n+ 1) +m(m+ 1) + k(k + 1)

    n,m,k . - a,

  • 54

    n,m,k . n,m,k (- n m k). 16 ([0, 1, 5] [0, 3, 4] [2, 2, 4]), 104 ([2, 4, 13] ), 111 ([1, 10, 10] [0, 9, 11] ).

    20. - Lagrange3. , ( ) -.: , . - , . 0 . .

    21. n=1

    [12

    n2cos

    (9

    n +(n + 3)(n 3)

    )]=

    2

    e3

    : ( 0). - 107.

    22. : . () 2 - . . /- 0. . , .

    23. 4 ( p, p+6, p+12 ) . 10000.

    3http://mathworld.wolfram.com/LagrangesFour-SquareTheorem.html4http://oeis.org/A047948

    http://mathworld.wolfram.com/LagrangesFour-SquareTheorem.htmlhttp://oeis.org/A047948

  • 55

    24. 1 , 2 , 5 , 10 , 20, 50 , 100 (= 1) 200 (= 2). -. 300 ;: , 300 , 150 , 60 5 . 300 .: 471363

    25. 120 - [100, 100]. RANDOM_NUMBER () (2.9.1). - .

    26.

    = 3 + 2k=1

    k(5k + 3)(2k 1)!k!2k1(3k + 2)!

    .

    106 106. .: - .

    27. 65728 ( ) :

    65728 = 123 + 403 = 313 + 333 .

    64232:

    64232 = 173 + 393 = 263 + 363 .

    k k = i3 + j3 ( ) i, j. i, j, k i j < k.

    28. -:

    3 = 1 + 2 12

  • 56

    5 = 3 + 2 12

    9 = 1 + 2 22 = 7 + 2 12

    15 = 7 + 2 22

    27 = 19 + 2 22... =

    ...

    .: 17, 137, 227, 977, 1187

    29. n - 1 n . .. 3142 . .: 1 .: 4231

    30. Goldbach. Goldbach . Goldbach, 4 Goldbach. [6, 10000].

  • 5

    , , , , . , - ( ) ( ), - ( ) TYPE 6.

    5.1

    5.1.1

    - . , ; 30 365 , - . H Fortran, , - , . , 30 30 . .. temperature

    DOUBLE PRECISION :: temperature(30)

    , ,

    DOUBLE PRECISION, DIMENSION (30) :: temperature

    57

  • 58

    , , - . ..

    DOUBLE PRECISION :: a, b(3), c(10)

    a, 3 , b, 10 , c, . , , :

    INTEGER, DIMENSION (10) :: a, b, c, d(4)

    , (a,b, c) 10 (d) 4.

    , . ,

    PARAMETER (2.4):

    INTEGER, PARAMETER :: n = 25DOUBLE PRECISION :: a(n)

    :

    INTEGER, PARAMETER :: n = 25DOUBLE PRECISION :: a(2*n*n-n/2+13)

    5.1.2

    ( - ) , 1 1. , temperature (1), temperature (2), temperature (30). . .., o 3 temperature

    DOUBLE PRECISION :: mo3

    mo3 = (temperature(1) + temperature(2) + temperature(3)) / 3d0

    5.1.3

    ( )...

    1 .

  • 59

    DOUBLE PRECISION :: a(5)

    a(1) = 3.4d0READ (*,*) a(2)

    :

    (/ /)2 . , 5 c, 3.0, 4.5, 2.0, 100.0, 0.99 ,

    DOUBLE PRECISION :: c(5)

    c = (/ 3.0d0, 4.5d0, 2.0d0, -1.0d2, 0.99d0 /)

    ( , ). ..

    DOUBLE PRECISION, DIMENSION (5) :: c, d

    c = (/ 3.0d0, 4.5d0, 2.0d0, -1.0d2, 0.99d0 /)d = c

    , READ :

    DOUBLE PRECISION :: c(5)

    READ (*,*) c ! 5

    - (RESHAPE(), SPREAD(), CSHIFT(), EOSHIFT(), .). .

    5.1.4

    , , 1. .. 6 2 (20,21, 22,,25) 0 5. . ..

    2 [ ] Fortran 2003.

  • 60

    INTEGER :: powersOf2(0:5)

    powersOf2 = (/1,2,4,8,16,32/)

    , 6 , powersOf2(0),powersOf2(1), , powersOf2(5). ,

    DOUBLE PRECISION :: a(M:N)

    , ,

    DOUBLE PRECISION, DIMENSION (M:N) :: a

    M,N NM, a NM+1 , a(M), a(M+1), , a(N).

    powersOf2, - [ , (/, /)] :

    INTEGER :: a(0:5)INTEGER :: i

    a = (/ (2**i,i=0,5) /)

    DO (4.2.3) . powersOf2 a , a, , ( 20 ;).

    5.2

    , - 2 3 , .. . Fortran 95 , , ( 7 ). 10 20

    DOUBLE PRECISION :: a(10,20)

    , ,

    DOUBLE PRECISION, DIMENSION (10,20) :: a

    i j a(i,j). , - 3.

    3 , , , , ., a, 23, a(1,1), a(2,1),a(1,2), a(2,2), a(3,1), a(3,2) .

  • 61

    .

    (C)1 5.02 7.53 6.4...

    ...157 19.1158 21.4

    ......

    364 4.5365 7.0

    1 365.

    , . , ( ) . , , :

    DOUBLE PRECISION :: tempr(365)

    ,

    1 2 . . . 14 15 . . . 30 31

    1 5.0 7.5 . . . 8.3 9.2 . . . 12.3 11.02 4.5 6.5 . . . 7.0 9.0 . . ....

    ......

    ......

    ......

    6 25.0 27.5 . . . 28.3 29.2 . . . 27.37 26.0 27.0 . . . 26.0 31.0 . . . 32.5 33.0...

    ......

    ......

    ......

    11 5.0 6.5 . . . 7.6 10.0 . . . 11.012 5.0 7.5 . . . 8.5 9.5 . . . 12.0 12.5

    .

    : () ()., 12 31,

    DOUBLE PRECISION :: tempr(12,31)

  • 62

    -. , 14 tempr(4,14)4.

    5.3

    , , PARAMETER , 2.4, - ( ) :

    DOUBLE PRECISION, PARAMETER :: c(3) = (/2.0d0,2.5d0,4.0d0/)

    ( ) . ..,

    DOUBLE PRECISION :: a(10)INTEGER :: i

    DO i = 1,10READ (*,*) a(i)

    END DO

    , . . , a 5 8

    DO i=1,5DO j=1,8

    READ (*,*) a(i,j)END DO

    END DO

    ( i j, i j, .) - , .

    4 ,

    .. (2, 30) (6, 31).

  • / 63

    IMPLICIT NONEDOUBLE PRECISION :: b1, b2, b3INTEGER :: i

    DO i = 1, 3READ (*,*) bi ! , bi

    END DO

    b1, b2, b3 , . .

    5.4 /

    , . Fortran 95 , , , . .. , . , .

    DOUBLE PRECISION, ALLOCATABLE :: a(:)

    a. . N , N , ,

    ALLOCATE(a(N))

    -

    DEALLOCATE(a)

    , 5.

    , a(M) a(N) M,N - ,

    ALLOCATE(a(M:N))

    (, , )

    5 ( 8), ( , 8.8) .

  • 64

    DOUBLE PRECISION, ALLOCATABLE :: b(:,:)

    ALLOCATE(b(M,N))

    M,N . DEALLOCATE(b)

    . ALLOCATE/DEALLOCATE -

    :PROGRAM alloc

    IMPLICIT NONEDOUBLE PRECISION, DIMENSION (:), ALLOCATABLE :: a, bDOUBLE PRECISION, DIMENSION (:,:), ALLOCATABLE :: cINTEGER :: M,N, K, P

    READ (*,*) M, N, K, P

    ALLOCATE (a(M), b(N), c(K,P))

    ! a, b, c! a, b, c

    DEALLOCATE(a)DEALLOCATE(b, c)

    END PROGRAM alloc

    - ( ALLOCATE) ( DEALLOCATE ). -, ( ).

    ALLOCATABLE , ALLOCATED() . .

    : - :INTEGER :: nDOUBLE PRECISION :: a(n) ! . n;READ (*,*) n

    ,

  • 65

    INTEGER :: nREAD (*,*) nDOUBLE PRECISION :: a(n) !

    , -, .

    5.5

    Fortran 95 . :

    SIZE(): , , - . Fortran 95 SIZE() . ,

    DOUBLE PRECISION, DIMENSION(10,10,30) :: a

    SIZE(a), SIZE(a,1), SIZE(a,2) SIZE(a,3) .

    LBOUND()/UBOUND(): . a LBOUND(a,1), LBOUND(a,2), . UBOUND(a,1),UBOUND(a,2), .

    SUM(): SUM() - 6. ..

    INTEGER :: a(10), s

    a = (/ 1, 5, 4, 2, 12, 9, 8, 2, -4, -7 /)s = SUM(a) ! s 32

    SUM() , :

    INTEGER :: a(10), s, i

    6 , , , + .

  • 66

    a = (/ 1, 5, 4, 2, 12, 9, 8, 2, -4, -7 /)s = 0DO i = 1, SIZE(a)

    s = s + a(i)END DO

    PRODUCT(): PRODUCT() 7. ..INTEGER :: a(10), p

    a = (/ 1, 5, 4, 2, 12, 9, 8, 2, -4, -7 /)p = PRODUCT(a) ! p 1935360

    p = 1DO i = LBOUND(a,1), UBOUND(a,1)

    p = p * a(i)END DO

    DOT_PRODUCT (): DOT_PRODUCT () - . DOT_PRODUCT(a,b)

    i aibi a .

    i ai bi a .

    a,b LOGICAL , DOT_PRODUCT(a,b) .TRUE. .TRUE., .FALSE..

    MATMUL(): MATMUL() - . (). , - . . , C = AB A, B, C , C=MATMUL(A,B). , M N B N P , C M P

    Cij =Nk=1

    aikbkj , 1 i M , 1 j P .

    7 , , , *

  • 67

    C=MATMUL(A,B) , , ,

    INTEGER :: i, j, kDOUBLE PRECISION :: s

    DO i = LBOUND(A,1), UBOUND(A,1)DO j = LBOUND(B,1), UBOUND(B,1)

    s = 0.0d0DO k = LBOUND(A,2), UBOUND(A,2)

    s = s + a(i,k) * b(k,j)END DOC(i,j) = s

    END DOEND DO

    TRANSPOSE(): TRANSPOSE() .

    DOUBLE PRECISION :: a(10,20), at(20,10)

    at = TRANSPOSE(a)

    at (i, j) (j, i) a.

    COUNT(): COUNT() - , , , -. .. COUNT(A > 10) ( ) 10.

    MAXVAL()/MINVAL(): MAXVAL() MINVAL() , , .

    MAXLOC()/MINLOC(): MAXLOC() MINLOC() / . .. a (2, 3) , MINLOC(a) 2 ( ), 3 ( ). , . 1, ( ).

  • 68

    ALL(): ALL() , -, . , .TRUE.. .FALSE..

    ANY(): ANY() , -, . - , .TRUE.. .FALSE..

    - .

    5.6 /

    Fortran 90 - Fortran 95 , - (elemental).

    =,+,, , /, 2.1 ( ). Fortran 95 . ,

    DOUBLE PRECISION :: x

    x = 3.4d0

    DOUBLE PRECISION :: a(10)INTEGER :: i

    DO i=1,SIZE(a)a(i) = 3.4d0

    END DO

    ,

    DOUBLE PRECISION :: a(10)

    a = 3.4d0

  • / 69

    = a.

    5.1.3. a = b, a, b , b a.

    . , DOUBLE PRECISION, DIMENSION (10) :: a, b, cINTEGER :: i...... ! a,b

    DO i=1,SIZE(a)c(i) = a(i) + b(i)

    END DO DOUBLE PRECISION, DIMENSION (10) :: a, b, c...... ! a,b

    c = a + b , DO. , DOUBLE PRECISION, DIMENSION (10) :: a, b, c...... ! a,b

    c = a * bDOUBLE PRECISION, DIMENSION (10) :: a, b, cINTEGER :: i...... ! a,b

    DO i=1,SIZE(a)c(i) = a(i) * b(i)

    END DO .

    , , - .

  • 70

    DOUBLE PRECISION :: lambda, a(10), b(20)

    a = lambda * a

    b = lambda * b

    : lambda a,b, . ,

    a = a * b

    . , -

    . ..

    DOUBLE PRECISION :: x, y..... ! x

    y = SQRT(x)

    x y. a b:

    DOUBLE PRECISION :: a(20), b(20)..... ! a

    b = SQRT(a)

    , ,

    DOUBLE PRECISION :: a(20), b(20)INTEGER :: i..... ! a

    DO i=1,SIZE(a)b(i) = SQRT(a(i))

    END DO

    , , - ( , 5.7), .

  • 71

    5.7

    Fortran ... a 10 , 3, 4, 5, 6, 7 - a(3:7) ( 5 ) SIZE(a(3:7)) 5. - 5 . ,

    DOUBLE PRECISION :: a(10), b(20)

    a = b(1:10)

    ( 10 b a), a=b . a a(1:SIZE(a)) a ( 1).

    , - , . , , , a 4 . a(1:7:2) . , . , a ,

    a( : : )

    , 1. . , .

    a(:10) a(1:10)a(4:) a(4:SIZE(a))a(:) a(1:SIZE(a)) a

    : .

    DOUBLE PRECISION :: a(100), tempINTEGER :: i

    DO i = 1, SIZE(a)/2temp = a(SIZE(a) - i + 1)a(SIZE(a) - i + 1) = a(i)a(i) = temp

    END DO

  • 72

    a(i), a(SIZE(a)-i+1). ,

    a = a(SIZE(a):1:-1)

    a a.

    . a 1020,

    INTEGER :: a(10,20)

    a(1:5,1:6) 56 5 6 .

    (.. ) (.. ) a a(3,:) a(:,5) . .

    5.8

    H Fortran 95 . -, , . .

    5.8.1 WHERE

    WHERE IF, , . , WHERE

    WHERE (condition)........

    ELSEWHERE........

    END WHERE

    condition, , , . WHERE . ,

  • 73

    ELSEWHERE . , ELSEWHERE . .., a b, b a .

    DO i = LBOUND(a,1),UBOUND(a,1)IF (a(i) > 0.0d0) THEN

    b(i) = a(i)ELSE

    b(i) = 0.0d0END IF

    END DO

    WHERE (a > 0.0d0)b = a

    ELSEWHEREb = 0.0d0

    END WHERE

    , ,

    b = MAX(a, 0.0d0)

    WHERE, , ELSEWHERE . , , , WHERE. , a b

    WHERE (a>=0.0d0) b = SQRT(a)

    b a .

  • 74

    5.9

    1. 100 . - i (i = 1, . . . , 100) i2 + 3i + 1. , .

    2. N . j (j = 1, . . . , N ) sin(j/N). , 0.4.

    3. A, B - 2030. (i, j) (i = 1, . . . , 20, j = 1, . . . , 30) A (i+ j)/3 B(i, j) 2i j/3.

    () BT B .

    () 8 A,BT - .

    () ( ) A BT .

    4. a, 100 . j (j =1, . . . , 100) cos(j/100). , 50 50 , , a(1) a(51), a(2) a(52),, a(50) a(100).

    5. 0 12. , ex

    ex x0/0! + x1/1! + x2/2! + + x12/12! .

    x . EXP().

    6.

    1

    =

    n=0

    ((2n)!)3(42n+ 5)

    (n!)6163n+1,

    8 AMN , BNP Aij , Bij , CMp

    Cij =

    Nk=1

    AikBkj .

  • 75

    . 15 3.1415926535898.: .

    7. - 1000 : 2 ( ). .

    8. , . n . : 1, 2, 3, . . . , n. . - ( ) ( ). n ( - ). i - i. . n, ;

    9. M N M = 20, N = 60, K = 400 1 0. 1 (2.9.1). , 'x' 'o' .

    10. 9 9 . , ( , , ). . . , , , . ( ) . , ( ) . .

  • 76

    . . .

  • 6

    , , , - . , , . , .

    , . .. - , , , - , . , , ( , , , , .), ( , , , , .), . - . , 500 3000

    INTEGER, PARAMETER :: N = 500 ! INTEGER, PARAMETER :: M = 3000 ! CHARACTER(30) :: studentName(N)CHARACTER(50) :: bookAuthor(M)CHARACTER(60) :: bookTitle(M)INTEGER :: studentAM(N), studentYear(N), bookYear(M)

    77

  • 78

    ( ) , - , . , compiler - . ( , , . , , , , , .) , , , , . , , , .

    , - -. : , - !

    Fortran 95 , . TYPE,

    TYPE onoma ......

    END TYPE onoma

    TYPE MODULE (8.11) TYPEEND TYPE . TYPE. , .

    :

    TYPE (onoma) :: x

    . , -.

    , - , , :

    TYPE student

  • 79

    CHARACTER(30) :: studentNameINTEGER :: studentAM, studentYear

    END TYPE student

    TYPE bookCHARACTER(50) :: bookAuthorCHARACTER(60) :: bookTitleINTEGER :: bookYear

    END TYPE book

    . ,

    TYPE studentCHARACTER(30) :: nameINTEGER :: am, year

    END TYPE student

    TYPE bookCHARACTER(50) :: authorCHARACTER(60) :: titleINTEGER :: year

    END TYPE book

    .

    TYPE (student) :: sTYPE (book) :: bINTEGER, PARAMETER :: N = 500 ! INTEGER, PARAMETER :: M = 3000 ! TYPE (student) :: students(N)TYPE (book) :: books(M)

    , s b, - student book.

    , %. ,

    TYPE (book) :: b

    b%title = "Fortran95/2003explained"b%author = "MichaelMetcalf,JohnReid,MalcolmCohen"b%year = 2004

  • 80

    , . .., PRINT *, b%titlePRINT *, b%author IF (b%year > 2003) THEN

    .....END IF

    , . , , TYPE (book) :: b, cb%title = "Fortran95/2003explained"b%author = "MichaelMetcalf,JohnReid,MalcolmCohen"b%year = 2004c = b - :TYPE (book) :: bb = book("MichaelMetcalf,JohnReid,MalcolmCohen", &

    "Fortran95/2003explained", 2004) - , . .

    , .

    , , , , READ :TYPE (book) :: bREAD *, b

    , , , .

    , .., 70 (, , ) .

  • 81

    INTEGER, PARAMETER :: N = 70INTEGER, DIMENSION (N) :: day, month, yearDOUBLE PRECISION :: temperature(N)

    , . ( !)

    INTEGER, PARAMETER :: N = 70INTEGER, DIMENSION (3,N) :: dateDOUBLE PRECISION :: temperature(N)

    date date(1,j) j , date(2,j) date(3,j) ( , !). - (date) (temperature),, , -: date(1,5), date(2,5), date(3,5), date(1,8) - .

    , - (date):

    TYPE dateINTEGER :: day, month, year

    END TYPE date

    , (measurement):

    TYPE measurementTYPE (date) :: dDOUBLE PRECISION :: temperature

    END TYPE measurement

    ,

    TYPE (measurement) :: meas(70)

    j

    meas(j)%d%day = 21meas(j)%d%month = 3meas(j)%d%year = 2014meas(j)%temperature = 24.5D0

  • 82

    6.1

    1. - . , , , - , , , . .

  • 7

    /

    7.1

    , READ/WRITE ( PRINT) , , - . , - , , . / . -/ , 2.6.1, FORMAT . FORMAT .

    FORMAT

    READ (*, "(......)") a, b, iWRITE (*, "(......)") f, g, hhhh

    , ,

    READ "(......)", a, b, iPRINT "(.......)", f, g, hhhh

    , * READ(*,*)/WRITE(*,*) * READ */PRINT *, , . -. , .

    83

  • 84 /

    , - FORMAT . FORMAT * /. FORMAT - , module , END CONTAINS module. END CONTAINS . FORMAT , READ/WRITE , - ( , ,, module) .

    READ (*, 12) a, b, i12 FORMAT (......)

    WRITE (*, 25) f, g, hhhh25 FORMAT (.......)

    READ 12, a, b, i12 FORMAT (......)

    PRINT 25, f, g, hhhh25 FORMAT (.......)

    FORMAT - .

    7.2 FORMAT

    FORMAT READ/WRITE.

    , - FORMAT , , , .

    ,

    I - w, . Iw.

    WRITE (*, "(I5)") 12

  • FORMAT 85

    12

    - . , , . , w *. - . ,

    -345

    , format 7, :

    READ (*, "(I7)") i

    , n, format Iw.n. n , 0. ,

    WRITE (*, "(I5.3)") 99

    099

    ( - ) E, EN, ES, F -, w, d ( ) . Ew.d, ENw.d, ESw.d, Fw.d. w - , . d -. FORMAT .: F . ,

    WRITE (*,"(F9.2)") -146.29d0

    -146.29

  • 86 /

    , 0, format w 0. . E, EN, ES FORMAT - E 10. , E 0.xxxxE yy 0.xxxxE yyy 0.xxxx yyy ( - yyy 99).

    WRITE (*, "(E10.2)") 123D5

    0.12E+08

    ES E E 1 10.

    WRITE (*, "(ES10.2)") 123D5

    1.23E+07

    EN E 3 E 1 1000.

    WRITE (*, "(EN10.2)") 123D5

    12.30E+06

    9.3729

    READ:

    READ (*, "(F8.2)") x ! E8.2 EN8.2 ES8.2

    93.729E-1

  • FORMAT 87

    READ 10

    READ (*, "(F10.1)") x ! E10.1 EN10.1 ES10.1

    , - F (), 0 .

    format , . ..

    WRITE (*,"(F6.1,E8.1)") (0.1d0, 100.0d0)

    0.10.1E+03

    , format ( - ) ( ) : ..

    WRITE (*,"(F6.1,'+i',E8.1)") (0.1d0, 100.0d0)

    0.1+i0.1E+03

    L - , w. .TRUE. .FALSE. - T F . .

    A, . - , . ..

    WRITE (*,"(A)") "Thisisastatement"

    Thisisastatement

    G , w, , d, Gw.d. , Iw, Lw, Aw Ew.d F.

  • 88 /

    ( 6), , , format , TYPE.

    , format . format . format , FORMAT . format , , . ,

    100 FORMAT (I4,I4,I4)

    100 FORMAT (3I4)

    200 FORMAT (I4,F4.2,I4,F4.2)

    200 FORMAT (2(I4,F4.2))

    format . * FORMAT .

    7.2.1 FORMAT

    , FORMAT ( )

    , ,

    /, ,

    nX, n . format n .

    , + - , FORMAT sp, format . ss FORMAT . ,

  • 89

    WRITE (*,"(F8.2,sp,F8.2)") 5.12d0, 2.3d0WRITE (*,"(F8.2)") 9.16d0WRITE (*,"(F8.2,sp,F8.2,F5.1,ss,F5.1)") 5.12d0, 2.3d0, 4.1d0, 3.5d0

    5.12+2.309.165.12+2.30+4.13.5

    7.2.2

    , WRITE advance="no". FORMAT ( *). ..

    WRITE (*, "(A)", advance="no") "Givenumber:"READ (*,*) x

    . -.

    7.3

    , . , , .

    .

    7.3.1

    . . OPEN .

    OPEN(unit = u, file = fname, status = stat, position = pos, &action = act)

    unit= . u , , - . 99. , file= .

  • 90 /

    , . , - input.dat 12,

    OPEN(unit = 12, file = "input.dat")

    OPEN(12, file = "input.dat")

    . , , .

    :

    status=stat, stat old, new, replace, scratch,unknown.

    1. ( ),2. ( ),3. , -

    ,4. (

    file=),5. .

    , - status="unknown". status="old" status="new" , .

    position=pos, pos

    1. rewind, ,

    2. append, , 3. asis ,

    OPEN. - position=.

    action=act act read, write readwrite , , .

    .. 34, data, ,

  • 91

    OPEN (unit = 34, file ="data", status = "old", action = "read") READ WRITE ,

    *, READ (unit = 34, fmt = "(F8.2)") x, ,READ (34, "(F8.2)") x

    . CLOSE (unit = u), CLOSE (u) u . , .

    READ , . READ . , ( ).

    -

    (filesystem) - (path), .

    . 5 6 . 0 ( ). - .

    . .

    7.3.2

    - , 2.6.1, - , . - .

  • 92 /

    , . READ/WRITE, *. , ,

    CHARACTER(50) :: strINTEGER :: i

    i = 3WRITE (str, "(A,I0,A)") "fname_", i, ".dat" ! str "fname_3.dat"

    FORMAT str. OPEN:

    OPEN(unit = 43, file = str)

    , 43 fname_3.dat.

    .

  • 93

    7.4

    1. - trig.dat. - , 0 359.9 0.1. 4 : ,, . .

    - trig.dat .

    2. calendar ( 2014):

    03/2014

    1 23 4 5 6 7 8 910 11 12 13 14 15 1617 18 19 20 21 22 2324 25 26 27 28 29 3031

    :

    () (, , ) .() .

    , Zeller 9 39. , 8 39.

    3. 1.0 9.9 0.1. 3 , :

    0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.91 0.000 0.041 0.079 0.114 0.146 0.176 0.204 0.230 0.255 0.2792 0.301 0.322 0.342 0.362 0.380 0.398 0.415 0.431 0.447 0.462...

    ......

    ......

    ......

    ......

    ......

    9 0.954 0.959 0.964 0.968 0.973 0.978 0.982 0.987 0.991 0.996

    . i j , (i, j).

  • 94 /

    4. Pascal. ,n n,

    P (i, 1) = P (1, j) = 1 i, j P (i, j) = P (i 1, j) + P (i, j 1) i, j > 1.

    .

    Pascal. . n = 7.

    pascal.

    5. ( -):

    2. 3 -

    1.

    n, . Collatz, , , 1. n.

    collatz.dat 2 100000 ( ) 1 ( ).

    , .

    6. () random.txt 10000 - [20, 20].

    () random.txt , 0 .

    7. Lemoine, 5, (

  • 95

    )1. m 7 999999: p, q m = p + 2q. m, p, q, , lemoine.dat, .

    8. - :

    : P1. : (

    ). 0 1 pixels

    : pixel 0 1. . 70.

    plain pbm (portable bitmap) .

    512 512 , - (, ), 1 0. , . .ppbm plain pbm.

    9. (ASCII) :

    : P2. : (

    ). K

    . 256. 255.

    pixels . pixel - 0 K . . 70 . pixel .

    1 1 .

  • 96 /

    plain pgm (portable graymap) . input.ppgm - output.ppgm : pixel (i, j) pixel (i, j) ( p). , (i, j) , pixels - (i p, j p). (i, j) , . p. o , http://fla.st/1KxdatB.

    10. - :

    : P3. :

    ( ). K, 255,

    . 255.

    pixels . - (R), (G), (B) pixel, . pixel K 0 0 ( K 255 255 0 0). pixel 0 K 0. 0 0 0 K K K . K K 0. RGB 0 K . 70 .

    plain ppm (portable pixmap) . france.pppm 2, 512 768 pixels, .

    11. Game of Life3 Dr. J. Conway. - .

    2 : , , .3http://www.math.com/students/wonders/life/life.html

    http://fla.st/1KxdatBhttp://fla.st/1KxdatBhttp://www.math.com/students/wonders/life/life.html

  • 97

    MN , ( ). K . ( ):

    () - ().

    () ().

    () ( !).

    - . plain pbm ( 8), 4. 512 512 1000 . - , (, ).

    12. (Langtons ant5) 128 128. . . ( (64, 64)), :

    , , 90 .

    , , 90 .

    12000. 100 plain pbm ( 8). ;

    13. 12 2 6,3 4, 2 2 3.

    4 UNIX, imagemagick, animate*.ppbm

    5http://mathworld.wolfram.com/LangtonsAnt.html

    http://mathworld.wolfram.com/LangtonsAnt.html

  • 98 /

    . , ( 1 ). . , . , 12 : 2 2 3, , ..13, : 13.

  • 8

    8.1

    - Fortran, - . , , , , , , . , , . , , , , , . , . , - .

    -, , -. .., , , , , . -, .

    99

  • 100

    (structured) (procedural) -.

    Fortran , , , PROGRAM END PROGRAM . , . -.

    8.2

    - . -

    f(x) = x2 + 5x 2 .

    , x2 + 5x 2, , f , - . , x, , . f(x) - f , , x. x . x2+5x2 x ( ) f , x. , ..,y = f(2.5) y = 2.52+52.52. - x, , , x. () . (). , . , .

    Fortran, : - . , . . , - , . .

  • 101

    ( ). - , , - . , . - - , 6. , , .

    _ FUNCTION (, ,)__ :: __ ::

    :: _, ... :: _, ...

    ...... ! END FUNCTION

    , (, , ):

    FUNCTION (, ,)__ :: __ :: _ ::

    :: _, ... :: _, ...

    ...... ! END FUNCTION

    , , .

    ( 6).

  • 102

    . , , , , , ( ). .

    SUBROUTINE (, ,)__ :: __ ::

    :: , ...

    ! ......END SUBROUTINE

    - .

    8.3

    :

    x2+x9 x = 1.3, x = 2.7, x = 0.5. :

    PROGRAM funIMPLICIT NONE

    DOUBLE PRECISION :: x1, x2, x3, y1, y2, y3

    x1 = 1.3d0y1 = x1**2 + x1 - 9.0d0

    x2 = 2.7d0y2 = x2**2 + x2 - 9.0d0

    x3 = -0.5d0y3 = x3**2 + x3 - 9.0d0

    ! ......END PROGRAM fun

  • 103

    , , - . , - .

    FUNCTION polynomial(x)IMPLICIT NONE

    DOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: polynomial

    polynomial = x*x + x - 9.0d0END FUNCTION polynomial

    ( polynomial) - , 2.1.2. - , , x, . . , , - . , , -, ,

    DOUBLE PRECISION FUNCTION polynomial(x)..........END FUNCTION polynomial

    -, , . . -, .

    . , , , x . , INTENT (in). . - - . , ,

  • 104

    ( ) INTENT (out). , INTENT (inout). , . .

    ( ), . , .

    , , :

    ln(1 + x) = k=1

    (x)k

    k, 1 < x 1 .

    ln(1.05) - (LOG()). , .

    PROGRAM logarithmIMPLICIT NONEDOUBLE PRECISION :: sum, y, x, termINTEGER :: k

    ! PART A: READDO

    READ *, yx = y - 1.0d0IF ( (-1.0d0 < x) .AND. ( x

  • 105

    END DO

    ! PART C: PRINTWRITE (*,*) "ln(", y, ")=", sumWRITE (*,*) "Timiapoenswmatomenisynartisi", LOG(y)

    END PROGRAM logarithm

    :

    1. ,

    2.

    3. .

    -. :

    sum ( ) !PART B !PART C. - sum:

    FUNCTION sumseries(x)IMPLICIT NONE

    DOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: sumseries

    DOUBLE PRECISION :: term, sumINTEGER :: k

    k = 1sum = 0.0d0DO

    term = -(-x)**k / kIF (ABS(term) < 1d-6) EXITsum = sum + termk = k + 1

    END DOsumseries = sum

    END FUNCTION sumseries

    - . , .

  • 106

    , -, . . ( , , ) .

    FUNCTION readxy(y)IMPLICIT NONEDOUBLE PRECISION, INTENT (out) :: yDOUBLE PRECISION :: readxy

    DOUBLE PRECISION :: x

    DOREAD *, yx = y - 1.0d0IF ( (-1.0d0 < x) .AND. ( x

  • 107

    8.3.1

    , , , , , , , , , . : , interface () . interface , - . , ( ), ( END). .. interface polynomial() :

    INTERFACEFUNCTION polynomial(x)

    IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: polynomial

    END FUNCTION polynomialEND INTERFACE

    readxy() :

    INTERFACESUBROUTINE readxy(x,y)

    IMPLICIT NONEDOUBLE PRECISION, INTENT (out) :: x, y

    END SUBROUTINE readxyEND INTERFACE

    INTERFACE .

    8.4

    , , (, , 1).

    1 .

  • 108

    - , , 2. , , , , . , .. polynomial() :y = polynomial(1.3d0)

    y = polynomial(2.4d0) + 2.0d0 * polynomial(3.5d0) + 4.0d0

    , ,WRITE (*,*) polynomial(4.6d0)

    , , , 3:polynomial(3.4d0) ! polynomial(3.4d0) = 4.0 ! y = polynomial !

    . , , . , - CALL . readxy() (!)DOUBLE PRECISION :: x, y

    CALL readxy(x,y)

    . ( INTENT (out)), . , x, y .

    8.5

    (logarithm), 8.3 104. , , sumseries() readxy()., :

    2 , 8.7.3. keywords .

    3 .

  • 109

    FUNCTION sumseries(x)IMPLICIT NONE

    DOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: sumseries

    DOUBLE PRECISION :: term, sumINTEGER :: k

    k = 1sum = 0.0d0DO

    term = -(-x)**k / kIF (ABS(term) < 1d-6) EXITsum = sum + termk = k + 1

    END DOsumseries = sum

    END FUNCTION sumseries

    SUBROUTINE readxy(x,y)IMPLICIT NONEDOUBLE PRECISION, INTENT (out) :: x, y

    DOREAD *, yx = y - 1.0d0IF ( (-1.0d0 < x) .AND. ( x

  • 110

    SUBROUTINE readxy(x,y)IMPLICIT NONEDOUBLE PRECISION, INTENT (out) :: x, y

    END SUBROUTINE readxyEND INTERFACE

    CALL readxy(x,y) ! READ

    sum = sumseries(x) ! COMPUTE

    WRITE (*,*) "ln(", y, ")=", sum ! PRINTWRITE (*,*) "Timiapoenswmatomenisynartisi", LOG(y)

    END PROGRAM logarithm

    . , - , .

    8.6 RETURN

    , , . , END FUNCTION /END SUBROUTINE RETURN . , .

    RETURN : - . , , - .

    SUBROUTINE riza(x)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: x

    IF (x < 0.0d0) THENWRITE (*,*) "Wrongargument"RETURN

    END IF

    WRITE (*,*) "Therootis", SQRT(x)END SUBROUTINE riza

  • 111

    , 4 .

    8.7

    , , -. , . , , 5.

    :

    8.7.1

    . :

    , ( -) . ..

    SUBROUTINE athr(a)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: a(3)

    WRITE (*,*) a(1) + a(2) + a(3)END SUBROUTINE athr

    3 .

    , (, -, .), , - (:). ,

    SUBROUTINE def(a)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: a(:,:)

    4 , 8.8.5 , 8.7.3, keywords

    .

  • 112

    WRITE (*,*) SUM(a)END SUBROUTINE def

    . - SIZE(). , ( )

    DOUBLE PRECISION :: b(SIZE(a,1), SIZE(a,2))

    ( ), ., a(m,n)

    SUBROUTINE def(a, m, n)IMPLICIT NONEINTEGER, INTENT (in) :: m,nDOUBLE PRECISION, INTENT (in) :: a(m,n)

    WRITE (*,*) SUM(a)END SUBROUTINE def

    , .

    INTENT .

    ALLOCATABLE 6., - (ALLOCATE/DEALLOCATE ). - ( ) ALLOCATABLE .

    8.7.2

    - . : - , INTERFACE .

    6ISO TR 15581 Fortran 2003.

  • 113

    , , , . - . ( ) , . :

    SUBROUTINE plot(a, b, f)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: a, b

    INTERFACEFUNCTION f(x)

    IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: f

    END FUNCTION fEND INTERFACE

    INTEGER :: iDOUBLE PRECISION :: x, step

    step = (b-a) / 100.0d0

    DO i=0,100x = a + i * stepWRITE (*,*) x, f(x)

    END DOEND SUBROUTINE plot

    FUNCTION g(x)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: g

    g = x*x - 2.0d0END FUNCTION g

    FUNCTION h(x)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: h

    h = 1.0d0 - 2.0d0 * x

  • 114

    END FUNCTION h

    PROGRAM testIMPLICIT NONEINTERFACE

    SUBROUTINE plot(a, b, f)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: a, b

    INTERFACEFUNCTION f(x)

    IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: f

    END FUNCTION fEND INTERFACE

    END SUBROUTINE plot

    FUNCTION g(x)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: g

    END FUNCTION g

    FUNCTION h(x)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: h

    END FUNCTION hEND INTERFACE

    CALL plot(0.0d0, 1.0d0, g)CALL plot(0.0d0, 1.0d0, h)

    END PROGRAM test

    plot , f, 101 a, b . g(x), h(x) 0.0, 1.0.

    - , , . Fortran 66

  • 115

    .

    8.7.3

    Fortran , OPTIONAL . . , . , .

    PRESENT() Fortran 95 , - , . , .. a, , PRESENT(a) .TRUE.., PRESENT(a) .FALSE. .

    :

    FUNCTION f(x,a)IMPLICIT NONEDOUBLE PRECISION, INTENT(in) :: xDOUBLE PRECISION, INTENT (in), OPTIONAL :: aDOUBLE PRECISION :: f

    IF (PRESENT(a)) THENf = x + a

    ELSEf = x + 10.0d0

    END IF

    END FUNCTION f

    , f() . , -, .

    f() ,

    PROGRAM addIMPLICIT NONEINTERFACE

    FUNCTION f(x,a)IMPLICIT NONEDOUBLE PRECISION, INTENT(in) :: x

  • 116

    DOUBLE PRECISION, INTENT (in), OPTIONAL :: aDOUBLE PRECISION :: f

    END FUNCTION fEND INTERFACE

    WRITE (*,*) f(3.0d0)WRITE (*,*) f(3.0d0, 20d0)

    END PROGRAM add

    8.8

    - . .

    - ( , , ). - SAVE , , .

    SUBROUTINE f(a)IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: a

    INTEGER, SAVE :: k = 0

    k = k + 1

    ! ...END SUBROUTINE f

    k . f().

    SAVE . . , .

  • (recursive) 117

    8.9 (recursive)

    . ..

    n! =

    {1 2 (n 1) n = (n 1)! n , n > 0 ,1 , n = 0 .

    n , ( n1). , , ,, . , , .

    Fortran 95 . , :

    ,

    . .

    (recursive) Fortran 95.

    FUNCTION par(n) ! IMPLICIT NONEINTEGER, INTENT (in) :: nINTEGER :: par

    IF (n == 0) THENpar = 1

    ELSEpar = par(n-1) * n

    END IFEND FUNCTION par

  • 118

    - ( n ). - Fortran, . - par() par(n)par(n-1) par(n-2) . . . ( - ) 0.

    , Fortran 95 ( - ).

    RECURSIVE FUNCTION par(n) RESULT (p)IMPLICIT NONEINTEGER, INTENT (in) :: nINTEGER :: p

    IF (n == 0) THENp = 1

    ELSEp = par(n-1) * n

    END IFEND FUNCTION par

    RECURSIVE () ( RESULT) ( ) . , , . .

    ( - , RECURSIVE ), Fortran 95 - Fortran 77.

    :

    . , Hermite, - .

    H0(x) = 1 ,

    H1(x) = 2x ,

  • (ELEMENTAL) 119

    H2(x) = 4x2 2 ,

    H3(x) = 8x3 12x ,

    H4(x) = 16x4 48x2 + 12 ,

    ...

    Hn(x) :

    Hn(x) = 2xHn1(x) 2(n 1)Hn2(x) , n 2 .

    (H0(x) = 1) (H1(x) = 2x) . , H1(x) H2(x) H3(x), .

    - Hermite, Hn(x), x, :

    RECURSIVE FUNCTION hermite(n,x) RESULT (h)IMPLICIT NONE

    INTEGER, INTENT (in) :: nDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: h

    IF (n==0) h = 1.0d0IF (n==1) h = 2.0d0 * xIF (n>=2) h = 2.0d0 * (x * hermite(n-1,x) - (n-1) * hermite(n-2,x))

    END FUNCTION hermite

    : ( , -, ) RECURSIVE RESULT .

    8.10 (ELEMENTAL)

    , . .. , . , Fortran . ,

    DOUBLE PRECISION :: x, y

  • 120

    x = 5.3d1y = SQRT(x)

    DOUBLE PRECISION, DIMENSION (100) :: x, yx(1) = ....x(2) = .......x(100) = ....

    y = SQRT(x)

    y(1) = SQRT(x(1))y(2) = SQRT(x(2))...y(100) = SQRT(x(100))

    ELEMENTAL . .. ELEMENTAL FUNCTION myexp(x)

    IMPLICIT NONEDOUBLE PRECISION, INTENT (in) :: xDOUBLE PRECISION :: myexp

    INTEGER :: iDOUBLE PRECISION :: term

    myexp = 0.0d0term = 1.0d0DO i = 0, 10

    myexp = myexp + termterm = term * x / (i+1)

    END DOEND FUNCTION myexp

    ( ), . - .

    ELEMENTAL - (8.8), STOP (2.10.1 . , -.

  • MODULE 121

    ELEMENTAL - INTENT (in). ELEMENTAL INTENT, INTENT (in).

    8.11 MODULE

    , ( ), -, . , . .

    - ( ). (.. ), ( - , .), ., , , , -. (.. ) . .

    ( , - ), module, - . - : , ,

    MODULE onoma

    END MODULE onoma

    MODULE , 2.1.2. - , - ( 6), (INTERFACE ), ( CONTAINS), .

    MODULE MODULE,

    USE onoma

  • 122

    ( IMPLICIT NONE). , PROGRAM ... FUNCTION ... SUBROUTINE ... MODULE .... MODULE, MODULE7.

    :

    MODULE constantsIMPLICIT NONE

    DOUBLE PRECISION, PARAMETER :: pi = 3.14159265358979323846d0END MODULE constants

    PROGRAM mainprogUSE constants

    IMPLICIT NONE!.....

    ! use piEND PROGRAM mainprog

    FUNCTION f(x)USE constants

    IMPLICIT NONE!.....

    ! use piEND FUNCTION f

    , MODULE . , , . module , - .

    , - : MODULE . INTERFACE , INTENT, . -, (

    7 PRIVATE .

  • MODULE 123

    ) MODULE . - . , modules , . .

    module Fortran 90 - (object based) .

  • 124

    8.12

    1. x ex2/2. x = 0.3, 1.4, 5.6.

    2. .

    3. () . 3!, 5!, 7!.

    4. - . - (3.2, 5.6, 8.1).

    5. , , ( ;). 89, 261, 1511.

    6. .

    7. . (,, MINVAL().)

    8. .(, , MAXLOC().)

    9. . , .

    10. ,

    i aibi a, b . (, -

    DOT_PRODUCT ().)

    11. [a, b] .

    12. , , http://tinyurl.com/114rndint.

    http://tinyurl.com/114rndint

  • 125

    -. 5744, 6789, 2774.

    13. , - , Mersenne. k Mersenne k+1 2. Mersenne 10000.

    14. ex

    ex x0/0! + x1/1! + x2/2! + + x12/12! .

    ex x = 0.5, 1.2, 4.1.

    15.

    sinx x1/1! x3/3! + x5/5! x7/7! + x9/9! x11/11! .

    - . 35.

    16.

    () ex

    ex =n=0

    xn

    n!,

    () sinx

    sinx =k=0

    (1)kx2k+1

    (2k + 1)!,

    () cosx

    cosx =k=0

    (1)kx2k

    (2k)!.

    - . - 1010.

  • 126

    17. . +, -, *, /. - - ( RETURN). , - . 2 + 3i,5.7 9i.

    18. - . - (C) (F ) . F = 9/5C + 32. - :

    22 C, 0 (273.15 C), (6000 C).

    100F.

    19. ax2 +bx+ c = 0 . a, b, c, . - .

    20. - http://tinyurl.com/114matrixA http://tinyurl.com/114matrixB. - . , , (1, 1), (1, 2), , (2, 1), (2, 2), .

    . . ,.

    ( ).

    , - , , 4 .

    http://tinyurl.com/114matrixAhttp://tinyurl.com/114matrixB

  • 127

    , .

    21. - . .

    2.3 i 1 7i 5.8 2.9 3.7i4.9i i 9 0.3i 2 + 0.72i8.2 + 4i 0.8 + i 0.2 + 5i 9 3i2.3i 7.1 + 9i 0.9 4i

    ;

    22. - x(t) = A cos(t)+B sin(t), A =3 cm, B =2 cm, =12Hz.

    () t x.

    () data t x(t) 4 , t = 0.0, 0.5, 1.0, ,100.0 s. .

    23. ()

    n! =

    {(n 1)! n , n > 0 ,1 , n = 0 .

    24. , , 2. . 4096, 65534, 1855932 2.

    25. () , , 10 .

    () - . - ( ) , . .. 19791, 4774 . .

  • 128

    () palindrome.dat . .

    26. palindrome.dat - ( 25) 1000000. .

    27. digit ,N d. d N. N . . , digit N=57960,d=2 6. d N, 0. http://tinyurl.com/ints201411. 3590 , . . , digit.txt, .

    28. ( ). {2, 8, 8, 3, 5, 5, 5, 8, 8, 1, 6, 7, 7, 7} 7.

    29. r = (x, y, z) x, r

    Rx() =

    1 0 00 cos sin 0 sin cos

    ,, xy

    z

    =1 0 00 cos sin 0 sin cos

    xy

    z

    . y, z

    Ry() =

    cos 0 sin

    0 1 0sin 0 cos

    http://tinyurl.com/ints201411http://tinyurl.com/ints201411

  • 129

    Rz() =

    cos sin 0sin cos 0

    0 0 1

    .()

    . , .

    () .

    () :i. x = 0.5, y = 0.3, z =

    1.2. 30 y, 35 x 58 z. .

    ii. ( ) .

    30. Hermite,Hn(x). n , 0, 1,. - Hermite

    H0(x) = 1

    H1(x) = 2x

    H2(x) = 4x2 2

    ... =...

    Hermite

    Hn(x) = 2xHn1(x) 2(n 1)Hn2(x) , n 2 .

    Hermite. n x . Hn(x).

    31. ( m V = kx2/2)

    n(y) =

    1

    2nn!

    (km

    h

    )1/4Hn(y)e

    y2/2 , (8.1)

  • 130

    y = x

    km/h. Hermite 30 () - (8.1). , n,x. m = k = h = 1. harmonic.dat - n = 5 60 x [6, 6], x ( , x ).

    32. Legendre,P(x), x [1, 1]. , 0, 1,. Legendre P0(x) = 1 P1(x) = x, :

    P(x) = (2 1)xP1(x) ( 1)P2(x) .

    Legen-dre. - x . P(x).

    33. , -, . http://tinyurl.com/114rndint , . . .

    34. N 1 x < 1, 1 y < 1. 1 (x2 + y2 = 1) . N (, ). .. N = 103,N = 104, , N = 109. N 2 2 ( ;)

    35. , (x, y) (, ) . plotdata x, y , =0,2,4,,360 = esin 2 cos(4) + sin5((2 )/24). () . .

    http://tinyurl.com/114rndint

  • 131

    36. N . 1000.

    37. Cliff Pickover8:

    xi+1 = |(100 ln(xi)) mod 1| ,

    x0 = 0.1. a mod 1 a. - xi [0, 1). 9 ( INTENT (out) ).

    38. - A N N 10

    detA =Ni=1

    (1)i+jaij det Aij ,

    j, .. 1. A i j aij , Aij A i j .

    39. 38 - Cramer11.

    40. ( )

    nm(r, , ) = Rn(r)Ym(, ) .

    ,

    Ym(, ) =

    2+ 1

    4

    (m)!(+m)!

    Pm (cos )eim .

    Legendre, Pm (x),

    = m

    Pm (x) = (1)m 1 3 5 (2m 1) (1 x2)m/2 ,

    8http://mathworld.wolfram.com/CliffRandomNumberGenerator.html9 8.8.10http://mathworld.wolfram.com/DeterminantExpansionbyMinors.html11http://mathworld.wolfram.com/CramersRule.html

    http://mathworld.wolfram.com/CliffRandomNumberGenerator.htmlhttp://mathworld.wolfram.com/DeterminantExpansionbyMinors.htmlhttp://mathworld.wolfram.com/CramersRule.html

  • 132

    = m+ 1Pm (x) = x(2m+ 1)P

    mm (x) ,

    (m)Pm (x) = x(2 1)Pm1(x) (l +m 1)Pm2(x) .

    [0, ] [0, 2) .

    -.

    Legendre,Pm (x).

    , Ym(, ). 50100

    Ym(, ). ylm_data sin cos, sin sin,cos , Ym(, )Y m(, ) (, x, y, z, ) , = 2, m = 0 (, d-).

    41. f(x), , x f(x) (f(x) = 0), Mller.

    () x0, x1, x2 - .

    ()

    q =x2 x1x1 x0

    ,

    A = q (f(x2) f(x1)) q2 (f(x1) f(x0)) ,B = (q + 1) (f(x2) f(x1)) +A ,C = (q + 1)f(x2) .

    ()

    x3 = x2 2C(x2 x1)

    D,

    D B +

    B2 4AC, B

    B2 4AC .

    () 41.() x0 x1, x1 x2, x2 x3.

    41.

  • 133

    () .

    , xn, q, A, B, C, D . f(x) = x3 x+1 - Mller.

    42. Bessel , n, Jn(x), -

    Jn(x) =

    m=0

    (1)m

    m!(m+ n)!

    (x

    2

    )2m+n.

    bessel.dat J0(x), J1(x),J2(x) 150 xi [0, 20].

    xi J0(xi) J1(xi) J2(xi)

    I: , , . 1012. II: . .

    43. a - : , x0. x0 = 1.

    xi+1 = xix3i + 2a

    2x3i + a

    x1, x2, . . .. ,

    x1 = x0x30 + 2a

    2x30 + a,

    x2 = x1x31 + 2a

    2x31 + a, .

    x1, x2, . . . 3a.

    xk |x3k a| , , .. 1012. .

  • 134

    20.0, 20.1, 20.2,,30.0. cbrt : 20.0, 20.1, 20.2,,30.0 . 12 .

    44. . , 3 3 , , N N , (.. X O) (, , N-) , , . , . - . . , , , , , .

    X|O|X| |O

    O|X|

    , , ( ) - .

    45. four-in-a-row . , M N ( 7 6 ). . , . , . . - . , ( ). , .

    46. N . NN , N > 3, N , . .

  • 135

    . - - .

    :

    N N . - board. 0 .

    N ..column. . i column(i).

    , (, , ) board. , - ( 0) ( 1). -.

    . 1 , . .

    . , , . - . , , . . , .

    , (N N , Q _).

    47. Sudoku. sudoku. - 9 9 , 33 19, ( ).

  • 136

    , . :

    () 1.

    () -. , 2, 3, . - . , .

    () -. 19, . , - . , , , ...

    5 3 76 1 9 5

    9 8 68 6 34 8 3 17 2 6

    6 2 84 1 9 5

    8 7 9

    48. fractal : , (x = 0, y = 0),

  • 137

    (x, y)

    x = a x+ b y + ey = c x+ d y + f

    a,b,c,d,e,f . - fractal (, x x y y (x, y)). . (x, y) , fractal. :

    () in.dat 4 . - 7 : 6 a, b, c, d, e, f p . . ,

    pi, 1.

    () r [0, 1). . , 0 r < p1 , p1 r < p1 + p2 .

    () 1000 fractal.dat.

    in.dat

    0 0 0 0.16 0 0 0.010.85 0.04 0.04 0.85 0 1.6 0.850.2 0.26 0.23 0.22 0 1.6 0.070.15 0.28 0.26 0.24 0 0.44 0.07

    0 0 0 0.25 0 0.4 0.020.95 0.005 0.005 0.93 0.002 0.5 0.840.035 0.2 0.16 0.04 0.09 0.02 0.070.04 0.2 0.16 0.04 0.083 0.12 0.07

    , fractal.dat .

    49. - . . 10 10 - . , , :

  • 138

    () 1 (5 ),() 1 (4 ),() 1 (3 ),() 1 (3 ),() 1 (2 ).

    . , , . , . . . . ( ) . . . .

    50. p(z). z0 ( p(z0) = 0) p(z), p(z), :

    zi+1 = zi p(zi)

    p(zi), i = 0, 1, 2, . . . .

    , z0, z1. z2, ., p(z), |p(zi)| . - NewtonRaphson , . p(z) = z3 1 a =1, b = ei2/3, c = ei2/3. , z = 0 + i0, . . , .., a (RGB = (255, 0, 0)). b (RGB = (0, 255, 0)) c (RGB = (0, 0, 255)). 0 + i0 (RGB = (255, 255, 255)).

    () N = 512 [1, 1] ( ): xi, i = 0, . . . , N 1.

  • 139

    () M = 512 [1, 1] ( ): yj , j = 0, . . . ,M 1.

    () z = xi + iyj .

    () pixels (i, j) newton.pppm. plain ppm ( 10 96). newton.pppm Newtonfractal.

  • 140

  • .1

    .1.1

    . (1 +N)/2 , N .

    .1.2

    N , 1+log2N , ( N ) , ., .

    , , :

    ( ) :

    , .

    , , , .

    , , , .

    141

  • 142

    , , , - . , -, . , , .

    - :

    0, .

    1, . , .

    1, ( ) . , , . , .

    .1.3 hash

    , (hash table), . - : . , , .

    -, , (hash function). - (hash). hash . , ..

    - (), .

    16 bit, [0, 655