Σημειώσεις Fortran 95
Embed Size (px)
Transcript of Σημειώσεις Fortran 95
-
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