1
p pp p
ppp
Trҫn Thùy Dương ± SNEEP
Email: duongtran902@gmail.com
2
p
-
`
TN (
`
mular
TN
slator): mӝt trong nhӳng ngôn ngӳ lұp
trình cũ nhҩt (phát hành vào năm 1957) đưӧc thiӃt kӃ cho các tính toán
trong khoa hӑc kӻ thuұt.
-
Các phiên bҧn cӫa `ortran
-
`
TN 1957
-
`
TN II
-
`
TN IV
-
`
TN 66 (đưӧc phát hành theo tiêu chuҭn NSI 1966)
-
`
TN 77 (chuҭn NSI 1977)
-
`
TN 90 (Chuҭn NSI 1990)
-
`
TN 95 (Chuҭn NSI mӟi nhҩt)
-
Có nhiӅu phiên bҧn µbҧn đӏa hóa¶ khác nhau.
-
NhiӅu chương trình tính toán trong khoa hӑc kӻ thuұt đưӧc viӃt sҹn
dưӟi dҥng các Sub`unction hoһc Suboutine.
ó
pp
-
`
TN đưӧc tҥo ra đӇ viӃt các chương trình giҧi
các bài toán khoa hӑc kӻ thuұt
-
Đưa vào kiӇu biӃn nguyên và dҩu chҩm đӝng (floating point)
-
Đưa vào kiӇu dӳ liӋu mҧng cho các tính toán toán hӑc
-
Đưa vào các subroutines và subfunctions
-
Trình biên dӏch có thӇ tҥo ra mã tӕi ưu cao (chҥy nhanh)
-
Có sҹn rҩt nhiӅu thư viӋn sӕ toán (numerical-math)
-
Các khó khăn và nhưӧc điӇm cӫa `ortran:
-
Cho phép sӱ dөng lӋnh G T rҩt tӵ do nên khó đӇ đӑc
hiӇu các đoҥn mã lӋnh và làm rӕi chương trình
-
Khó kiӇm soát các dӳ liӋu dҥng phi sӕ (nonnumerical)
-
Không có khҧ năng lұp trình đӋ qui
z
!"#$
-
@
-
¨
anet Nicholson, V
@
-
merican National Standard, ÷
@
-
Ö
IT,
-
ahey/`ujitsu,
-
Tao Pang, @ V
÷
÷ ÷ !
5
p%&'()*'
1.
Cơ bҧn vӅ `ortran
2.
Cҩu trúc điӅu khiӇn
ó
.
Ö
odule và thӫ tөc
z
.
Sӕ liӋu dҥng array
5.
BiӃn con trӓ
6.
Ӌnh Vào/ a
6
|
+,#'-.$// '
-
Cҩu trúc tәng quát cӫa chương trình `ortran:
-
Cҩu trúc câu lӋnh cӫa `ortran:
-
Ö
ӝt dòng lӋnh không quá 1ó2 ký tӵ (kӇ cҧ dҩu cách);
-
Câu lӋnh quá dài: đһt ký tӵ ³
&
´ ӣ cuӕi dòng đӇ nӕi vӟi
dòng tiӃp theo.
-
Ö
ӑi ký tӵ sau dҩu ³
!
´ là lӡi chú thích.
7
|
+,#'-.$// '
-
Ví dө chương trình `ortran đơn giҧn:
å
/$(/ !0!
!a: tên chương trình
!an example of program structure !b: chú thích
/1 22 '031/4546
!c: khai báo biӃn
å
/'7489'1/3$'!,1/08
!d: dӳ liӋu ra
/1 &745
!e: dӳ liӋu vào
/1 &746
!e: dӳ liӋu vào
'031/:5;6
!f : phép toán sӕ hӑc
å
/'7481$ 084 '031/
!g: dӳ liӋu ra
1'&å/$(/ !0!
!h: kӃt thúc chương trình
C
|
+,#'-.$// '
-
Dӳ liӋu và cách biӇu diӉn dӳ liӋu trong `ortran
-
KiӇu sӕ nguyên:
(z byte)
-
Giá trӏ tӯ: - 21z7zCó6z7 (2
ó
1
) to 21z7zCó6z (2
ó
1
-1)
-
Khai báo:
INTEGE [([KIND=]kind)][,attrs] ::] vname
(
Kind
=1,2,z,C;
attrs:
PÖETE, DIÖENSI N, CTBE,
P INTE..)
-
KiӇu sӕ thӵc:
(eal: z byte; Double: C byte )
-
E [([KIND=]kind)][[,attrs] ::] vname
(chính xác 6 chӳ sӕ)
-
D BE PECISI N [[,attrs] ::]vname
(chính xác 15 chӳ sӕ)
-
KiӃu sӕ phӭc:
(z byte)
-
C ÖPEX [([KIND =]kind)] [[,attrs] :: ] vname
9
|
+,#'-.$// '
-
Dӳ liӋu và cách biӇu diӉn dӳ liӋu trong `ortran
-
KiӇu ký tӵ (
z
byte), khai báo:
-
CHCTE (length) vname
-
hoһc
CHCTE (type[,type«])[attrib[,attrib]«] :: vname
-
hoһc
CHCTE [*chrs] vname [*lengths][(dim)] &
[/values/][,vname [*lengths][(dim)]] [/values/]
-
KiӇu logic
(z byte)
-
ChӍ nhұn 2 giá trӏ:
9
và
9
-
Khai báo:
GIC [([KIND=]kind)] [, attrs ::] vname
10
|
+,#'-.$// '
-
Dӳ liӋu và cách biӇu diӉn dӳ liӋu trong `ortran:
Interger X,Y(10)
Real, parameter :: A=2010
Complex(4), Dimension(8) :: cz, cq
CHARACTER (20) St1, St2*30
LOGICAL, ALLOCATABLE :: flag1, flag2
11
f
''(< )=)å>å$='/$'($// '
12
|
+,#'-.$// '
-
Nhұp và xuҩt dӳ liӋu đơn giҧn
-
Ӌnh nhұp dӳ liӋu:
ED*, list
-
Ӌnh in dӳ liӋu không đӏnh dҥng:
PINT*,list
Thí dө:
PINT*, "Can bac hai cua ", 2, ³la´, SQT(2.0)
-
Ӌnh in dӳ liӋu đӏnh dҥng:
-
Cú pháp:
k ` ÖT (danh sách các đһc tҧ)
-
k là nhãn cӫa dòng lӋnh
Thí dө:
X = 12ó.z567
PINT 10, X
10 ` ÖT( `C.2 )
1ó
Ö%0?@A)#/$'(''@ '&B'(
-
H
trong đó - n sӕ vӏ trí đӇ xuҩt dӳ liӋu văn bҧn. Thí dө
:
PINT 5 , Y
5 ` ÖT (16H TICH PHN BNG , `9.ó)
-
X
sӁ chèn dҩu trӕng vào bҧn ghi. Thí dө:
PINT ó5
ó
5 ` ÖT ('1' , 25X , 'THI NGHIEÖ S 1')
-
Ð
:
Ð
là sӕ vӏ trí giành cho 1 biӃn là xâu ký tӵ
-
IÐ
Ð
là sӕ vӏ trí dùng cho 1 biӃn sӕ nguyên
-
`Ð
dùng biӇu diӉn dҥng thұp phân cӫa sӕ thӵc, - Ð
tәng sӕ vӏ trí dành cho sӕ thӵc kӇ cҧ dҩu chҩm thұp phân,
- sӕ chӳ sӕ thұp phân sau dҩu chҩm
-
E Ð
ghi ra dưӟi dҥng luӻ thӯa
-
Ð
trong đó - Ð sӕ vӏ trí giành cho dӳ liӋu kiӇu logic.
1z
|
+,#'-.$// '
-
Sӱ dөng file:
-
Đӑc tӯ file:
program readdata
implicit none
!Đӏc dӱ liӉu tӭ file tên là mydata.txt
real :: x,y,z
h
print *,x,y,z
h
end program readdata
15
|
+,#'-.$// '
-
Sӱ dөng file:
-
ViӃt vào file:
program io2
real :: num
integer :: i
h h
do i = 1,100
num = i/3.0
end do
h
print *, 'finished'
end program io2
16
|
+,#'-.$// '
-
Sӱ dөng file:
-
`
ortran ngҫm đӏnh mӝt sӕ thiӃt bӏ chuҭn liên kӃt vӟi
đӏnh danh NIT như sau:
Dҩu sao (*): Öàn hình hoһc bàn phím
í NIT = 0: Öàn hình hoһc bàn phím
í NIT = 5: Bàn phím
í NIT = 6: Öàn hình
Thí dө:
OPEN (UNIT = 10, FILE = µTEST.dat')
WRITE(10,'(A18,\)µ)'Ghi vao File TEST.dat &
da lien ket voi UNIT 10¶
WRITE (*, '(1X, A30,\)') ' In ra man hinh.µ
17
_ C/D)@."E'
2.1. Cҩu trúc I` và các lӋnh tương ӭng
2.2. Cҩu trúc lһp vӟi lӋnh D
2.ó. Cҩu trúc SEECT CSE
2.z. Chu trình lһp không xác đӏnh
2.5. Öӝt sӕ ví dө
1C
_ | C/D)-)=)'F+'(G'(
-
Ӌnh I` logic:
-
Dҥng 1:
-
Dҥng 2:
(BiӇu thӭc logic) 9p
lӋnh 1
....
lӋnh n
9pH
(BiӇu thӭc logic) 9p
lӋnh 1
....
lӋnh n
99
lӋnh n + 1
....
lӋnh m
9pH
19
_ | C/D)-)=)'F+'(G'(
-
Ӌnh I` logic:
-
Dҥng ó:
(BiӇu thӭc lôgic 1) 9p
lӋnh 1
...
lӋnh m
99(BiӇu thӭc lôgic 2) 9p
lӋnh m+1
...
lӋnh n
99(BiӇu thӭc lôgic ó) 9p
lӋnh n+1
...
lӋnh p
99
lӋnh p+1
...
lӋnh q
9pH
20
_ | C/D)-)=)'F+'(G'(
-
Ӌnh I` logic:
-
Thí dө:
÷
÷
!"!"
# $"
÷
%&""÷'
(÷
($)"
÷
*(!
($+"
÷
($,"
÷
&"
($-"
÷
*"
(
÷
.*
÷
21
_ | C/D)-)=)'F+'(G'(
-
Ӌnh I` logic: mӝt sӕ biӇu thӭc lôgic
Toán tӱ
Dҥng khác
Thí dө
Giҧi thích
==
.eq.
If(i==j) then...
bҵng
>
.gt.
If (i.gt.j) then ...
ӟn hơn
>=
.ge.
If (i.ge.j) then ...
ӟn hơn hoһc bҵng
<
.lt.
If (i.lt.j) then ...
Nhӓ hơn
<=
.le.
If (i.le.j) then ...
Nhӓ hơn hoһc bҵng
/=
.ne.
If (i.ne.j) then ...
Khác nhau
.not.
If (not.k) then ...
.true. nӃu k là .false.
và ngưӧc lҥi
.or.
If(i>j.or.j<k) then...
Phép lôgic
.and.
If(i>j.and.j<k) then...
Phép lôgic ND
22
_ | C/D)-)=)'F+'(G'(
-
Ӌnh I` sӕ hӑc
-
Ӌnh I` sӕ hӑc cho phép thӵc hiӋn rӁ nhánh chương
trình thành ba nhánh tùy thuӝc vào giá trӏ cӫa biӇu
thӭc sӕ hӑc.
-
Dҥng tәng quát:
I` (BThuc_SoHoc) m1, m2, mó
÷
"÷(*.
-/
÷ (.""-
0
÷ (.-
0
/÷ (."-
0!*
2ó
_ | C/D)-)=)'F+'(G'(
-
Ӌnh nhҧy vô điӅu kiӋn G T :
-
Cú pháp:
G T
"
#$ %
& '
-
Ӌnh G T tính toán:
-
Cú pháp:
G T
(
)
*
)
)
(
)
*
)
"+
# %
% )
" ,#
#$ %
& '
2z
_ _ C/D)Aå-I'H
-
Dҥng 1:
D
-) [, !]
!bdk: biӃn điӅu khiӇn
Các_câu_lӋnh
Câu_lӋnh_kӃt_thúc
-
Dҥng 2:
D
-) [, !]
Các_câu_lӋnh
C NTINE
-
Dҥng ó:
D
-) [, !]
Các_câu_lӋnh
END D
25
_ _ C/D)Aå-I'H
REAL X(15), Y(15)
N = 15
3 I =1, N
READ * , X (I)
Y (I) = X (I)
3
!*
2 I = 1, N-1
K = I
4 J = I + 1, N
IF (Y(K).LT.Y(J)) K = J
4
!*
IF (K .NE. I) THEN
TG = Y(I)
Y(I) = Y(K)
Y(K) = TG
END IF
2
!*
7 I = 1, N
PRINT 5 , X (I), Y (I)
7
!*
5 FORMAT (1X, 2F10.2)
END
* &J |
: ViӃt chương
trình nhұp 15 phҫn tӱ
cӫa mҧng sӕ thӵc X, sҳp
xӃp lҥi các phҫn tӱ mҧng
theo thӭ tӵ giҧm dҫn và
in lên màn hình các mҧng
cũ và mӟi thành hai cӝt.
26
_ _ C/D)Aå-I'H
÷
!" #'
1
÷
÷
22-
*&J_
: ViӃt chương trình tính tәng các sӕ nguyên liên tiӃp tӯ
N1 đӃn N2, trong đó N1 và N2 đưӧc nhұp vào tӯ bàn phím.
27
_ C/D)999
-
Dҥng tәng quát:
(!!(3!h
!(!h
!333
!(!h
!333
!(*
!333
(!
BThuc_Chon, Chon1, Chon2,« phҧi có cùng kiӇu dӳ liӋu
sӕ nguyên, lôgic hoһc CHCTE*1
2C
_ C/D)999
-
*&J2
gõ mӝt ký tӵ và cho biӃt đó là chӳ cái hay chӳ sӕ.
!" !
÷
"4hh5
!
(!!(
!()
2h2!
!(6
22!
!(*
25h4 h7
45h4 2
252!
(!
29
_ /K'Aå"L'(5=)@ '
-
Cҩu trúc kӃt hӧp I` và G T
!8393:;3<=43>
!?38393@ 3h3h43<=43>
3h4
hoһc:
!8393:;3<=43>
!?38393@ 3h3h43<=43>
3h4"
!?38393A3B3CD353> 3E
ó
0
_ /K'Aå"L'(5=)@ '
-
Cҩu trúc D và EXIT
Dҥng 1:
TenChuTrinh:] DO
IF (BThuc_Logic) EXIT
Các_câu_lӉnh
END DO TenChuTrinh]
Dҥng 2:
TenChuTrinh:] DO
Các_câu_lӉnh
IF (BThuc_Logic) EXIT
END DO TenChuTrinh]
ó
1
_ /K'Aå"L'(5=)@ '
-
Cҩu trúc D WHIE«END D
DO WHILE (BThuc_Logic)
Các_câu_lӉnh
END DO
-
Ӌnh CYCE
CYCLE Tên_Chu_Trình
Ӌnh CYCE có thӇ nҵm trong các chu trình lӗng nhau.
NӃu không chӍ ra Tên_Chu_Trình thì CYCE chӍ có tác
đӝng đӕi vӟi chu trình lһp trong nhҩt chӭa nó.
ó
2
_ /K'Aå"L'(5=)@ '
-
Thí dө: Tính sӕ PI theo công thӭc
Đây là tәng cӫa mӝt chuӛi đan dҩu mà sӕ hҥng
tәng quát là:
´
i
i
i
óó
=)|2M&J'()/K'Aå"NOå
-
PROGRAM TINHPI1 ! Cach 1: IF & GOTO
REAL EPS, SS, PI, TMP
INTEGER :: N, DAU = 1
EPS=0.0001
TMP=0.0
N=1
100 PI=TMP+DAU/FLOAT(2*N-1)
DAU = íDAU
SS=ABS((PI-TMP)/PI)
PRINT*,'Vong lap thu ',N,' Sai so=',SS
IF (SS >= EPS) THEN
TMP = PI
N=N+1
GOTO 100
ELSE
PI=PI*4.0
WRITE(*,300)PI
300 FORMAT(4X,' PI = ',F10.4)
END IF
END
óz
=)_2M&J'()/K'Aå"NOå
H-9P
PROGRAM TINHPI2 ! CACH 2: DO & EXIT
REAL EPS, SS, PI, TMP
INTEGER :: N, DAU = 1
EPS=0.0001
TMP=0.0
N=1
DO
PI=TMP+DAU/FLOAT(2*N-1)
DAU = íDAU
SS=ABS((PI-TMP)/PI)
PRINT*,'Vong lap thu ',N,' Sai so=',SS
IF (SS < EPS) EXIT
TMP = PI
N=N+1
END DO
PI=PI*4.0
WRITE(*,300)PI
300 FORMAT(4X,' PI = ',F10.4)
END
ó
5
=)2M&J'()C/D)HQ9
PROGRAM TINHPI3 ! CACH 3: DO WHILE
REAL EPS, SS, PI, TMP
INTEGER :: N, DAU = 1
EPS=0.0001
TMP=0.0
N=1
SS=1.0
DO WHILE (SS >= EPS)
PI=TMP+DAU/FLOAT(2*N-1)
DAU = íDAU
SS=ABS((PI-TMP)/PI)
PRINT*,'Vong lap thu ',N,' Sai so=',SS
TMP = PI
N=N+1
END DO
PI=PI*4.0
WRITE(*,300)PI
300 FORMAT(4X,' PI = ',F10.4)
END
ó
6
F+'(/K')$'-Ö$&
-
ĐӇ tә chӭc mӝt chương trình gӑn gàng, dӉ khai thác,
`
ortran cho phép phân mҧnh chương trình và tҥo thành
các chương trình con là thӫ tөc (
SB TINE
) và
hàm (
`
NCTI N
)
-
Các chương trình con cũng có thӇ chia thành hai loҥi:
chương trình con trong và chương trình con ngoài.
-
Có thӇ chӑn ra nhӳng chương trình con trong sӕ các
chương trình con đӇ tҥo ra mӝt thư viӋn riêng. Tұp hӧp
các chương trình con này đưӧc gӑi là modul.
ó
7
F+'(/K')$'-Ö$&
-
Hàm lӋnh:
-
Dҥng tәng quát:
R'!S& '0=)@?0?T:UEG)
-
Đưӧc khai báo ӣ đҫu chương trình, cùng vӟi các lӋnh
khai báo dӳ liӋu.
PROGRAM BT_HAM1
REAL X, Fx
Fx = 3*x**2 - 5*x + 2
Print*,' Cho gia tri cua X: '
Read*,x
Print '('' Gia tri ham F(x)='',F10.3)', Fx
END
óC
F+'(/K')$'-Ö$&
-
Hàm chương trình con:
-
Khai báo:
[KiӇuD][ECSIVE] `NCTI N TenHam &
([Các_đӕi_sӕ]) [EST (TenKetQua) ]
[Các_câu_lӋnh_khai_báo]
[Các_câu_lӋnh_thӵc hiӋn]
[TenHam = ...]
END `NCTI N [TenHam]
-
Hàm có thӇ đưӧc gӑi tӟi bҵng cách hoһc gán giá trӏ
hàm cho biӃn, hoһc hàm tham gia vào biӇu thӭc tính:
TenBien = TenHam ([Các_đӕi_sӕ])
ó
9
F+'(/K')$'-Ö$&
-
Thӫ tөc con:
-
Cú pháp khai báo thӫ tөc:
SB TINE TenThuTuc [( Các_đӕi_sӕ )]
[Các_câu_lӋnh_khai_báo]
[Các_câu_lӋnh_thӵc_hiӋn]
END SB TINE [TenThuTuc]
-
ӡi gӑi thӫ tөc:
C TenThuTuc [( Các_đӕi_sӕ)]
z
0
F+'(/K')$'-Ö$&
-
Câu lӋnh
C NTINS
:
-
Phân cách thân chương trình chính vӟi các chương
trình con trong thuӝc nó.
-
Các chương trình con trong đưӧc sҳp xӃp ngay sau
câu lӋnh C NTINS và trưӟc tӯ khóa END cӫa
chương trình chính.
-
Bӕ cөc tәng quát:
P GÖ TenChuongTrinh
[Các_câu_lӋnh_khai_báo]
[Các_câu_lӋnh_thӵc_hiӋn]
[C NTINS
Các_chương_trình_con_trong ]
END [P GÖ [TenChuongTrinh]]
z
1
F+'(/K')$'-Ö$&
-
Thí dө 1:
-
Giҧi phương trình f(x) = 0 bҵng phương pháp lһp
Newton
-
Các bưӟc:
B1) Khӣi tҥo nghiӋm x bҵng mӝt giá trӏ ban đҫu nào đó
B2) Gán x bӣi xí f(x)/f¶(x), trong đó f¶(x) là đҥo hàm bұc
nhҩt cӫa f(x)
Bó) T nh và kiӇm tra điӅu kiӋn f(x) ~ 0
NӃu chưa thӓa mãn thì quay lҥi bưӟc 2.
NӃu thӓa mãn thì in kӃt quҧ và kӃt thúc chương trình
.
z
2
#åF+'(/K'VS5T:5
;5
PROGRAM Newton
! Giai PT f(x) = 0 bang PP Newton
IMPLICIT NONE
INTEGER :: Its = 0 ! Dem lan lap
INTEGER :: MaxIts = 20 ! So lan lap cuc dai
LOGICAL :: Converged = .false. ! Dieu kien hoi tu
REAL :: Eps = 1E-6 ! Sai so cho phep
REAL :: X = 2. ! Gia tri nghiem khoi tao
DO WHILE (.NOT. Converged .AND. Its < MaxIts)
X = X - F(X) / DF(X)
PRINT *, X, F(X)
Its = Its + 1
Converged = ABS(F(X)) <= Eps
END DO
zó
IF (Converged) THEN
PRINT *,'Hoi tu'
ELSE
PRINT *,'Phan ky'
END IF
PRINT *,¶Nghiem PT: X = µ,X
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
CONTAINS
FUNCTION F(X)
REAL F, X
F = X ** 3 + X - 3
END FUNCTION F
!!!!!!!!!!!!!!!!!!!!!!!!!!!!
FUNCTION DF(X)
REAL DF, X
DF = 3 * X ** 2 + 1
END FUNCTION DF
END PROGRAM Newton
zz
F+'(/K')$'-Ö$&
-
Thí dө 2:
Tính các đһc trưng thӕng kê: trung bình,
phương sai và đӝ lӋch chuҭn cӫa chuӛi x gӗm n phҫn tӱ
theo công thӭc sau:
i
i
õ
i
i
õ
z
5
PROGRAM THKE
INTEGER N, I
REAL X(99), TBINH, PSAI, DLC
PRINT *, ' NHAP DO DAI CHUOI (<100)'
READ *, N
PRINT *, ' NHAP CAC GIA TRI CUA X:'
5 FORMAT (1X, ' X(', I2, '): ')
DO I = 1, N
WRITE (*, 5) I
READ *, X (I)
ENDDO
CALL STAT(X, N, TBINH, PSAI, DLC)
WRITE(*, 8) TBINH, PSAI, DLC
8 FORMAT (1X, 'T.BINH = ', F7.2, µ PH.SAI = ',&
F7.2, ' DL CHUAN = ', F7.2)
END
z
6
SUBROUTINE STAT (X, N, AVER, VARI, STDV)
REAL X (N), AVER, VARI, STDV
INTEGER N, I
AVER = 0.0
VARI = 0.0
DO I = 1, N
AVER = AVER + X (I)
VARI = VARI + X (I) * X (I)
END DO
AVER = AVER / REAL (N)
VARI = VARI / REAL (N-1) - AVER * AVER
STDV = SQRT (VARI)
RETURN
END
z
7
!/#-.'.(=/
-
`
ortran 90 cho phép đӏnh nghĩa hàm vӟi khҧ năng trҧ vӅ nhiӅu
giá trӏ.
-
Thí dө ó: giҧ sӱ có hàm f(x)= óx
2
+ 2x -5. Hãy tính giá trӏ cӫa
hàm tҥi các giá trӏ cӫa đӕi sӕ x
1
, x
2
,..., x
n
.
INTEGER, PARAMETER :: N = 7
REAL, DIMENSION (N) :: X, FX
DATA X /-3., -2., -1., 0., 1., 2., 3./
FX = F(X,N)
PRINT*, FX
CONTAINS
FUNCTION F(X,N)
INTEGER, INTENT (IN) :: N
REAL, DIMENSION(N),INTENT(IN) :: X
REAL, DIMENSION(SIZE(X)):: F
F(:) = 3*X(:)*X(:) + 2*X(:) - 5
END FUNCTION
END
zC
!/#-.'.(=/
-
NӃu `(X,N) đưӧc khai báo như mӝt hàm ngoài thì trong phҫn
khai báo cӫa chương trình gӑi cҫn phҧi có khӕi giao diӋn như
sau:
INTEGER, PARAMETER :: N = 7
REAL, DIMENSION (N) :: X, FX
!
*!
(
((6
*!
END INTERFACE
DATA X /-3., -2., -1., 0., 1., 2., 3./
FX = F(X,N)
PRINT*, FX
END
FUNCTION F(X,N)
INTEGER, INTENT (IN) :: N
REAL, DIMENSION(N),INTENT(IN) :: X
REAL, DIMENSION(SIZE(X)):: F
F(:) = 3*X(:)*X(:) + 2*X(:) - 5
END FUNCTION
z
9
=)%)*')W @?0?
-
%) *' p9p
: khi thӵc hiӋn lӡi gӑi đӃn mӝt
chương trình con, các đӕi sӕ hình thӭc sӁ đưӧc thay thӃ
bӣi các đӕi sӕ thӵc cӫa chương trình gӑi.
-
Cú pháp và tác đӝng cӫa tӯ khóa INTENT như sau:
INTENT (Öô_tҧ) [::] vname
hoһc
KiӇu_D, INTENT (Öô_tҧ) :: vname
(
vname
là danh sách biӃn đóng vai trò đӕi sӕ hình thӭc;
Ö
ô_tҧ
có thӇ nhұn mӝt trong các giá trӏ:
-
IN
: khi tham sӕ chӍ truyӅn vào cho chương trình con và
không thӇ bӏ làm thay đәi giá trӏ
-
T
: nӃu biӃn trҧ giá trӏ vӅ chương trình gӑi, nó cҫn phҧi có
mһt trong danh sách đӕi sӕ hình thӭc
-
IN T
: vӯa là tham sӕ truyӅn vào cho chương trình con
vӯa là biӃn trҧ giá trӏ vӅ cho chương trình gӑi.
50
=)%)*')W @?0?
-
Thí dө vӅ INTENT:
REAL X(20), SUM
CALL RANDOM_NUMBER (X) ! Tңo mҥng sӓ ngҭu nhiên X
PRINT*,X ! X truyӃn cho chương trình con
CALL TONG (X,20,SUM)
PRINT*,SUM ! BiӁn kӁt quҥ trҥ vӃ tӭ CTCon
PRINT*,X ! X trҥ vӃ tӭ chương trình con
CONTAINS
SUBROUTINE TONG (X,N,SUM)
INTEGER, INTENT (IN) :: N ! N chӋ IN
REAL, INTENT (INOUT) :: X(N) ! X vӭa IN vӭa OUT
REAL, INTENT (OUT) :: SUM ! SUM chӋ OUT
X = X + 10. ! Làm thay đӗi X
SUM = 0.
DO I=1,N
SUM=SUM+X(I)
END DO
END SUBROUTINE TONG
END
51
=)%)*')W @?0?
-
%)*'p2
-
Khi xây dӵng các chương trình con, danh sách các đӕi
sӕ hình thӭc có thӇ rҩt nhiӅu. ĐӇ tránh viӋc tham chiӃu
đӃn nhӳng đӕi sӕ không cҫn thiӃt ta có thӇ khai báo
trong chương trình con tҩt cҧ hoһc mӝt sӕ đӕi sӕ có
thuӝc tính tùy chӑn.
-
Tӯ khóa dùng đӇ khai báo đӕi sӕ tùy chӑn là PTI N
mà cú pháp và cách sӱ dөng cӫa nó đưӧc mô tҧ như
sau:
PTI N [::] vname
hoһc
KiӇu_D, PTI N :: vname
52
=)%)*')W @?0?
-
Thuӝc tính PTI N:
-
Thí dө:
SUBROUTINE TONG (X,N,SUM, A, B, C, D, E)
INTEGER, INTENT (IN) :: N
REAL, INTENT (INOUT) :: X(N)
REAL, INTENT (OUT) :: SUM
REAL, OPTIONAL :: A, B, C, D, E ! Các đӓi sӓ tùy chӏn
X = X + 10.
SUM = 0.
DO I=1,N
SUM=SUM+X(I)
END DO
A = X(1)
B = X(2)
C = A + B
D = X(3)
E = C * D
END SUBROUTINE TONG
5ó
=)%)*')W @?0?
-
Giҧ sӱ trong chương trình chính ta khai báo khӕi giao
diӋn cho chương trình này là:
INTERFACE
SUBROUTINE TONG (X,N,SUM, A, B, C, D, E)
REAL, INTENT (INOUT) :: X(N)
REAL, OPTIONAL :: A, B, C, D, E
END SUBROUTINE TONG
END INTERFACE
-
Khi đó chương trình con T NG có thӇ đưӧc gӑi đӃn
như sau:
CALL TONG (X,N,SUM) !Bӓ qua tҩt cҧ các đӕi sӕ tùy chӑn
CALL TONG (X,N,SUM,T) !Bӓ qua z đӕi sӕ tùy chӑn cuӕi cùng
CALL TONG (X,N,SUM,T,U) !Bӓ qua ó đӕi sӕ cuӕi cùng
5z
=)%)*')W @?0?
-
%)*'X92
-
Vùng bӝ nhӟ cung cҩp cho các biӃn đӏa phương trong
các chương trình con sӁ đưӧc giҧi phóng ngay sau khi
chương trình con trҧ kӃt quҧ vӅ cho chương trình gӑi.
NӃu muӕn lưu giӳ giá trӏ cӫa chúng cho lҫn gӑi sau ta
có thӇ đһt thuӝc tính SVE cho chúng.
-
Cú pháp khai báo thuӝc tính SVE như sau:
SVE [::] vname
hoһc
KiӇu_D, SVE :: vname
55
ÖH
-
`
ortran đӏnh nghĩa ó khái niӋm đơn vӏ chương trình (Program
nit) là: chương trình chính, chương trình con ngoài, và modul.
Ö
odul khác vӟi các chương trình con ӣ 2 điӇm quan trӑng:
-
Ö
odul có thӇ chӭa trong đó nhiӅu hơn mӝt chương trình con.
-
Ö
odul có thӇ chӭa nhӳng câu lӋnh khai báo và đһc tҧ mà chúng có thӇ
tham chiӃu đưӧc đӕi vӟi tҩt cҧ các đơn vӏ chương trình có sӱ dөng
modul.
-
Các modul cũng có thӇ đưӧc biên dӏch mӝt cách đӝc lұp. Cҩu trúc
chung cӫa modul có dҥng như sau:
MODULE TenModul
Các_câu_lӉnh_khai_báo]
CONTAINS
Các_chương_trình_con_modul]
END MODULE TenModul]]
-
ĐӇ sӱ dөng modul ta dùng câu lӋnh khai báo SE ngay đҫu
chương trình:
USE Tên_Modul_đưӥc_sӯ_dӧng
56
ÖH
PROGRAM EXAMP
USE MyModul
IMPLICIT NONE
REAL A, B
PRINT*, µ Cho mot so: µ
READ*, A
B = Pi ! Khai bao tu Modul
CALL DOI_CHO( A, B ) ! Khai bao tu Modul
PRINT*, A, B
END
MODULE MyModul
REAL, PARAMETER :: Pi = 3.1415927
CONTAINS
SUBROUTINE DOI_CHO ( X, Y )
REAL Tmp, X, Y
Tmp = X
X = Y
Y = Tmp
END SUBROUTINE DOI_CHO
END MODULE MyModul
57
Y'')&1
-
Ví dө, giҧ sӱ ta có file ³
PÖ.INC
´ lưu tҥi thư mөc
hiӋn thӡi vӟi nӝi dung là:
INTEGER, PARAMETER :: NMAX=200, MMAX=100
REAL, PARAMETER :: Re=6731, G=9.8
-
Khi đó chương trình sau đây:
PROGRAM CT1
INCLUDE ³PARAM.INC´
«
END
5C
Ö#'(
-
Ö
ҧng là mӝt tұp hӧp các phҫn tӱ có cùng kiӇu dӳ liӋu,
đưӧc sҳp xӃp theo mӝt trұt tӵ nhҩt đӏnh, trong đó mӛi
phҫn tӱ đưӧc xác đӏnh bӣi chӍ sӕ và giá trӏ cӫa chúng.
-
KiӇu dӳ liӋu cӫa các phҫn tӱ mҧng có thӇ là kiӇu sӕ
hoһc không phҧi sӕ. Öӛi mҧng đưӧc xác đӏnh bӣi tên
mҧng, sӕ chiӅu, kích thưӟc cӵc đҥi và cách sҳp xӃp
các phҫn tӱ cӫa mҧng.
-
Ö
ҧng có thӇ là mҧng tĩnh hoһc mҧng đӝng.
-
Khi khai báo mҧng cҫn phҧi chӍ ra tên và sӕ chiӅu cӫa
nó, nhưng có thӇ chưa cҫn chӍ ra kích thưӟc và cách
sҳp xӃp các phҫn tӱ mҧng. Có rҩt nhiӅu cách khai báo
biӃn mҧng.
59
Ö#'(
-
Ö
ӝt sӕ dҥng cú pháp tәng quát cӫa câu lӋnh khai báo mҧng thưӡng
đưӧc sӱ dөng:
-
HB'(|2
KiӇu_D Tên_biӃn_mҧng (Öô_tҧ)
E*z X (0:100)
E Y(12,óz)
-
HB'(_2
Thuӝc_tính Tên_biӃn_mҧng (Öô_tҧ)
DIÖENSI N N (10,20)
CTBE Y(:,:)
-
HB'(2
KiӇu_D, Thuӝc_tính (Öô_tҧ) :: Tên_biӃn_mҧng
E, CTBE(:,:) :: X
INTEGE, DIÖENSI N(12,óz) :: Y
-
HB'(2
KiӇu_D, Thuӝc_tính :: Tên_biӃn_mҧng(Öô_tҧ)
E, CTBE :: X (:,:)
E, DIÖENSI N Y(12,óz)
60
F/Z-/6)[åI)=)å\'M!#'(
-
Sӱ dөng lӋnh DT đӇ khӣi tҥo mҧng:
REAL, DIMENSION(10) :: A, B, C(3,3)
DATA A / 5*0, 5*1 /
! Gán 5 phҩn tӯ đҩu bҳng 0 và 5 phҩn tӯ tiӁp
!theo bҳng 1
DATA B(1:5) / 4, 0, 5, 2, -1 /
! ChӋ gán giá trӍ cho các phҩn tӯ tӭ B(1) đӁn
!B(5)
DATA ((C(I,J), J= 1,3), I=1,3) /3*0,3*1, 3*2/
! Gán giá trӍ cho các phҩn tӯ cөa C lҩn lưӥt
!theo hàng
61
F/Z-/6)[åI)=)å\'M!#'(
-
BiӇu thӭc mҧng:
-
Có thӇ thӵc hiӋn các phép toán trên các biӃn mҧng.
Trong trưӡng hӧp này các mҧng phҧi có cùng cҩu
trúc.
REAL, DIMENSION(10) :: X, Y
X + Y
!Cӛng tương ӫng các phҩn tӯ cөa X và Y:
!X(I) + Y(I)
X * Y
! Nhân tương ӫng các phҩn tӯ cөa X và Y:
!X(I) * Y(I)
X * 3
! Nhân tương ӫng các phҩn tӯ cөa X vӝi 3:
!X(I) * 3
X * SQRT(Y)
! Nhân các phҩn tӯ cөa X vӝi căn bүc 2
!cөa các phҩn tӯ tương ӫng cөa Y:
!X(I) * SQRT(Y(I))
X == Y
! Phép toán so sánh, cho kӁt quҥ .TRUE. nӁu
! X(I) == Y(I), và .FALSE. nӁu ngưӥc lңi.
62
-
Cҩu trúc WHEE... ESEWHEE ... END WHEE
-
Cú pháp lӋnh như sau:
WHEE (ĐiӅu_kiӋn) Câu_lӋnh
hoһc
WHEE (ĐiӅu_kiӋn)
Các_câu_lӋnh_1
ESEWHEE
Các_câu_lӋnh_2
END WHEE
F/Z-/6)[åI)=)å\'M!#'(
6ó
-
Cҩu trúc WHEE... ESEWHEE ... END
WHEE
REAL A (5), B(5), C(5)
A = (/ 89.5, 43.7, 126.4, 68.3, 137.7 /)
B = 0.0
C = 0.0
WHERE (A > 100.0)
A = 100.0
B = 2.3
ELSEWHERE
A = 50.0
C = -4.6
END WHERE
F/Z-/6)[åI)=)å\'M!#'(
6z
-
Ö
ҧng có kích thưӟc và cách sҳp xӃp các phҫn tӱ
không đưӧc xác đӏnh ngay tӯ lúc khai báo gӑi là mҧng
đӝng.
-
Các mҧng đӝng luôn phҧi có thuӝc tính CTBE
trong câu lӋnh khai báo.
KiӇu_D,DIÖENSI N(Öô_tҧ), CTBE :: Tên_biӃn
hoһc
KiӇu_D, CTBE [::] Tên_biӃn [(Öô_tҧ)]
hoһc
CTBE [::] Tên_biӃn [(Öô_tҧ)]
Ö#'(@%'(SH6' !) // 6T
65
Ö#'(@%'(SH6' !) // 6T
-
Ví dө:
-
E,DIÖENSI N(:), CTBE :: X ! Öҧng 1 chiӅu
-
E, CTBE :: vector(:) ! Öҧng 1 chiӅu
-
INTEGE, CTBE :: matrix(:,:) ! Öҧng 2 chiӅu
-
DIÖENSI N X (:,:) ! X là mҧng hai chiӅu và
-
E, CTBE :: X ! X là mҧng đӝng, thӵc
-
CTBE :: Y(:,:) ! Y là mҧng đӝng 2 chiӅu
-
Câu lӋnh
CTE
dùng đӇ đӏnh vӏ kích thưӟc và cách
sҳp xӃp các phҫn tӱ mҧng trong bӝ nhӟ (tӭc cҩp phát bӝ
nhӟ cho biӃn).
-
Câu lӋnh
DE CTE
dùng đӇ giҧi phóng vùng bӝ nhӟ
mà biӃn mҧng đӝng đã đưӧc cҩp phát.
66
Ö#'(@%'(SH6' !) // 6T
REAL, DIMENSION(:), ALLOCATABLE :: X, OldX
REAL A
INTEGER N
ALLOCATE (X(0)) ! Kích thưӝc cөa X (lúc đҩu bҳng 0)
N = 0
DO
Print*, µCho mot so: µ
READ(*,*) A
IF ( A < 0 ) EXIT ! NӁu A<0 thì thoát
N = N + 1 ! Tăng N lên 1 đơn vӍ
ALLOCATE(OldX(SIZE(X))) ! Cҧp phát kích thưӝc cөa
! OldX bҳng kích thưӝc cөa X
OldX = X ! Lưu X vào OldX
DEALLOCATE( X ) ! Giҥi phóng X
ALLOCATE(X(N)) ! Cҧp phát X có kích thưӝc bҳng N
X = OldX ! Gán toàn bӛ OldX cho X
X(N) = A !Gán giá trӍ mӝi cho phҩn tӯ thӫ N cөa X
DEALLOCATE( OldX ) ! Giҥi phóng OldX
END DO
PRINT*,N, ( X(I), I = 1, N )
END
67
LE)$'/]
-
Con trӓ là mӝt khái niӋm đӇ xác đӏnh biӃn có thuӝc tính
con trӓ. BiӃn con trӓ có thӇ là biӃn vô hưӟng hoһc biӃn
mҧng. Khai báo kiӇu con trӓ như sau:
P INTE [::] Tên_con_trӓ [(Öô_tҧ)] [, ...]
hoһc
KiӇu_D, P INTE :: Tên_con_trӓ [(Öô_tҧ)]
-
BiӃn con trӓ có thӇ đưӧc cҩp phát bӝ nhӟ bҵng lӋnh
CTE hoһc trӓ đӃn mӝt biӃn khác. BiӃn đưӧc con
trӓ trӓ đӃn hoһc là mӝt biӃn có thuӝc tính đích
(TGET) hoһc mӝt biӃn đã đưӧc xác đӏnh.
6C
LE)$'/]
INTEGER, POINTER :: P1 (:)
INTEGER, POINTER :: P2 (:)
INTEGER, ALLOCATABLE, TARGET :: D (:)
ALLOCATE (D (7)) ! Cҧp phát bӛ nhӝ cho biӁn ĐICH
D = 1
D (1:7:2) = 10.
PRINT*, 'DICH=',D
P1 => D ! Con trӑ trӑ vào biӁn ĐICH
PRINT*,'CON TRO P1=',P1
ALLOCATE (P1(10)) ! Cҧp phát bӛ nhӝ cho biӁn con trӑ
P1 = 5
P2 => P1 ! Con trӑ trӑ vào biӁn đã xác đӍnh
PRINT*,'CON TRO P1=',P1
print*
print*,'CON TRO P2=',P2
P2 = 8
PRINT*,'CON TRO P1=',P1
print*
print*,'CON TRO P2=',P2
END
69
LE)$'/]
-
ĐӇ đưa con trӓ vӅ trҥng thái không trӓ vào đâu cҧ ta
dùng câu lӋnh:
NI`Y (P)
!P là biӃn con trӓ
-
ĐӇ xác đӏnh trҥng thái hiӋn thӡi cӫa con trӓ có thӇ
dùng hàm:
SS CITED (P)
!P là biӃn con trӓ
Hàm này trҧ vӅ giá trӏ .TE. nӃu con trӓ đã liên kӃt vӟi mӝt biӃn, và
trҧ vӅ giá trӏ .`SE. nӃu con trӓ ӣ trҥng thái không trӓ vào đâu cҧ.
-
BiӃn con trӓ có thӇ đưӧc cҩp phát bӝ nhӟ bҵng câu
lӋnh CTE và đưӧc giҧi phóng bӣi câu lӋnh
DE CTE tương tӵ như mҧng đӝng.
70
U#'(
-
Đӏnh nghĩa mӝt bҧn ghi lưu trӳ thông tin cӫa mӝt sinh
viên như sau:
.÷"((F
CHARACTER (30) HoTen !bao gom ca ho va ten
CHARACTER (20), DIMENSION(4) :: DiaChi
! Tinh, huyen, xa, thon/xom
CHARACTER (10) DienThoai
CHARACTER (9) MaSo ! Vi du, K45003504
LOGICAL GioiTinh ! .TRUE. neu la Nu,
! .FALSE. doi voi Nam (!)
INTEGER NgaySinh ! Vi du, 19870308
REAL, DIMENSION(40) :: Diem !Diem cac mon hoc
.÷
71
U#'(
-
Khai báo:
TYPE (HOSOSV) SVien
hay
TYPE (HOSOSV), DIMENSION (24) :: KTHN_K51
-
Truy cұp:
SVien%HoTen = ³Hoang Anh Dung´
SVien%DiaChi(1) = ³Ha Noi´
SVien%DiaChi(2) = ³Hoan Kiem´
SVien%DiaChi(3) = ³Hang Bac´
SVien%DiaChi(4) = ³Dinh Tien Hoang´
SVien%GioiTinh = .FALSE.