background image

1

p pp p

ppp

Trҫn Thùy Dương ± SNEEP

Email: duongtran902@gmail.com

background image

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.

background image

ó

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

background image

z

 !"#$

-

@        

-

¨

anet  Nicholson, V      

-

merican National Standard, ÷   

@

-

Ö

IT,            

 

-

›

ahey/`ujitsu,      

-

Tao Pang, @ V 

    ÷ 

    ÷ ÷      !

background image

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

background image

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.

background image

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

background image

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, ›› CTB›E, 

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 B›E PECISI N [[,attrs] ::]vname 

(chính xác 15 chӳ sӕ)

-

KiӃu sӕ phӭc:

(z byte)

-

C ÖP›EX [([KIND =]kind)] [[,attrs] :: ] vname

background image

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

background image

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 

background image

11

f

''(< )=)å>å$='/$'($// '

background image

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 )

background image

Ö%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

-

Ð

ghi ra dưӟi dҥng luӻ thӯa

-

›

 Ð 

trong đó  - Ð sӕ vӏ trí giành cho dӳ liӋu kiӇu logic.

background image

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 


print *,x,y,z
h

end program readdata

background image

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

background image

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.µ

background image

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 SE›ECT CSE

2.z. Chu trình lһp không xác đӏnh

2.5. Öӝt sӕ ví dө

background image

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

background image

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

background image

20

_ | C/D)-)=)'F+'(G'(

-

›

Ӌnh I` logic:

-

Thí dө:

÷  

÷

 

  !"!"

# $"

÷ 

%&""÷'

($)"

÷ 

*(!

($+"

÷ 

($,"

÷ 

&"

($-"

÷ 

 *"

(

÷ 

.*

÷

background image

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

background image

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!*

background image

_ | 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  

(

)

*

)

)

  

(

)

*

)

 "+

 #   %

  % )

 " ,#

 #$ %

& '

background image

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

background image

25

_ _ C/D)Aå-I'H

REAL X(15), Y(15) 

N = 15 

3  I =1, N 
READ * , X (I)        
Y (I) = X (I) 

!*

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 

!*

7  I = 1, N 

PRINT 5 , X (I), Y (I) 

!*

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.

background image

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.

background image

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 

background image

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!

(!

background image

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

background image

ó

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]

background image

ó

1

_  /K'Aå"L'(5=)@ '

-

Cҩu trúc D  WHI›E«END D

DO WHILE (BThuc_Logic) 

Các_câu_lӉnh 

END DO

-

›

Ӌnh CYC›E

CYCLE ŽTên_Chu_Trình

›

Ӌnh CYC›E 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ì CYC›E chӍ có tác
đӝng đӕi vӟi chu trình lһp trong nhҩt chӭa nó.

background image

ó

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

background image

óó

=)|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

background image

ó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

background image

ó

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

background image

ó

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.

background image

ó

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

background image

óC

F+'(/K')$'-Ö$&

-

Hàm chương trình con:

-

Khai báo:

[KiӇuD›][ECSIVE] `NCTI N TenHam  & 

([Các_đӕi_sӕ]) [ES›T (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ӕ])

background image

ó

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ӕ)]

background image

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]]

background image

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

background image

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

background image

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

background image

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

‚

‚

õ

background image

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

background image

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

background image

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

background image

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

background image

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.

background image

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

background image

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

background image

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

background image

=)%)*')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

background image

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

background image

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

background image

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 

background image

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

background image

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.

background image

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) 
››

CTB›E Y(:,:)

-

HB'(2

KiӇu_D›, Thuӝc_tính (Öô_tҧ) :: Tên_biӃn_mҧng

E›, ›› CTB›E(:,:) :: 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›, ›› CTB›E :: X (:,:) 

E›, DIÖENSI N Y(12,óz)

background image

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

background image

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.

background image

62

-

Cҩu trúc WHEE... E›SEWHEE ... 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 

E›SEWHEE  

Các_câu_lӋnh_2 

END WHEE

F/Z-/6)[åI)=)å\'M!#'(

background image

-

Cҩu trúc WHEE... E›SEWHEE ... 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!#'(

background image

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 ›› CTB›E
trong câu lӋnh khai báo.

KiӇu_D›,DIÖENSI N(Öô_tҧ),›› CTB›E :: Tên_biӃn

hoһc 

KiӇu_D›, ›› CTB›E [::] Tên_biӃn [(Öô_tҧ)]

hoһc 

››

CTB›E [::] Tên_biӃn [(Öô_tҧ)]

Ö#'(@%'(SH6' !)  // 6T

background image

65

Ö#'(@%'(SH6' !)  // 6T

-

Ví dө: 

-

E›,DIÖENSI N(:),›› CTB›E :: X   ! Öҧng 1 chiӅu 

-

E›, ›› CTB›E ::  vector(:)         ! Öҧng 1 chiӅu 

-

INTEGE,›› CTB›E :: matrix(:,:)  ! Öҧng 2 chiӅu 

-

DIÖENSI N X (:,:)    ! X là mҧng hai chiӅu và 

-

E›, ›› CTB›E :: X  ! X là mҧng đӝng, thӵc 

-

››

CTB›E :: 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.

background image

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

background image

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.

background image

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

background image

69

LE)$'/]

-

ĐӇ đưa con trӓ vӅ trҥng thái không trӓ vào đâu cҧ ta
dùng câu lӋnh:

N››I`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.

background image

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 

background image

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.