You are on page 1of 153

Giáo trình Fortran

Ebook made by: Nguyễn Trung Hiếu – Email: mystery_kid1412@yahoo.com.vn - Blog: http://tusachnho.kute.pro

Ch­¬ng 1

Kh¸i niÖm vÒ lËp tr×nh m¸y tÝnh ®Ó gi¶i


c¸c bµi to¸n øng dông

1.1. PhÇn cøng vµ phÇn mÒm m¸y tÝnh

M¸y tÝnh ®­îc thiÕt kÕ ®Ó thùc hiÖn nh÷ng thao t¸c tu©n theo mét tËp nh÷ng c©u lÖnh do ng­êi dïng viÕt ra, gäi lµ ch­¬ng tr×nh.
C¸c m¸y tÝnh cã cÊu t¹o chung bªn trong nh­ trªn h×nh 1.1. Ng­êi dïng sö dông bµn phÝm, chuét hoÆc nh÷ng thiÕt bÞ nhËp d÷ liÖu kh¸c ®Ó ®­a th«ng tin vµo m¸y
tÝnh. Bé xö lý (processor) lµ mét phÇn cña m¸y tÝnh kiÓm so¸t tÊt c¶ c¸c phÇn kh¸c. Bé xö lý nhËn d÷ liÖu vµo vµ l­u chóng ë bé nhí (memory). Nã nhËn biÕt c¸c lÖnh cña
ch­¬ng tr×nh. NÕu ta muèn céng hai gi¸ trÞ, bé xö lý sÏ lÊy hai gi¸ trÞ ®ã tõ bé nhí vµ göi ®Õn khèi xö lý sè häc l«gic (ALU). Khèi nµy thùc hiÖn phÐp céng vµ bé xö lý
l­u kÕt qu¶ vµo bé nhí. Trong khi xö lý, bé xö lý vµ khèi sè häc l«gic sö dông mét l­îng bé nhí nhá gäi lµ bé nhí trong (internal memory). PhÇn lín d÷ liÖu ®­îc l­u ë
bé nhí ngoµi (external memory) nh­ ®Üa cøng, ®Üa mÒm, chóng còng nèi víi bé xö lý. Bé xö lý, bé nhí trong vµ ALU gäi chung lµ khèi xö lý trung t©m hay CPU.

7 8
Trong ch­¬ng tr×nh, ta th­êng lÖnh cho m¸y tÝnh in kÕt qu¶ tÝnh to¸n lªn mµn h×nh hay m¸y in nèi víi m¸y tÝnh vµ lµ nh÷ng thiÕt bÞ xuÊt d÷ liÖu.
PhÇn mÒm chøa nh÷ng chØ dÉn hoÆc lÖnh mµ ta muèn m¸y tÝnh thùc hiÖn. PhÇn mÒm cã thÓ ®­îc viÕt b»ng nhiÒu ng«n ng÷ vµ cho nhiÒu môc ®Ých. Nh÷ng ch­¬ng
tr×nh thùc hiÖn nh÷ng thao t¸c chung, th­êng ®­îc nhiÒu ng­êi sö dông gäi lµ nh÷ng phÇn mÒm c«ng cô. HÖ ®iÒu hµnh lµ tËp hîp c¸c ch­¬ng tr×nh gióp ng­êi dïng giao
tiÕp víi m¸y tÝnh. HÖ ®iÒu hµnh t¹o mét m«i tr­êng thuËn tiÖn cho ng­êi dïng “giao tiÕp” ®­îc víi m¸y tÝnh, thùc hiÖn nh÷ng ch­¬ng tr×nh øng dông nh­ c¸c bé biªn
dÞch ng«n ng÷ lËp tr×nh, c¸c phÇn mÒm c«ng cô... HÖ ®iÒu hµnh gåm mét sè ch­¬ng tr×nh cho phÐp thao t¸c víi file nh­ in, sao chÐp, hiÓn thÞ danh s¸ch file... Nh÷ng hÖ
®iÒu hµnh hiÖn ®¹i nh­ Windows cßn gióp m¸y tÝnh nhËn biÕt vµ qu¶n lý c«ng viÖc cña rÊt nhiÒu thiÕt bÞ ngo¹i vi nèi kÌm víi m¸y tÝnh nh­ c¸c thiÕt bÞ nhËp, xuÊt d÷ liÖu,
mµn h×nh, m¸y in, m¸y quÐt ¶nh, loa, c¸c m¸y quan tr¾c chuyªn dông...

External memory

Internal memory

Input Processor Output

ALU

CPU

H×nh 1.1. S¬ ®å khèi cña mét m¸y tÝnh

Th«ng th­êng hiÖn nay c¸c chuyªn gia lËp ch­¬ng tr×nh viÕt ra rÊt nhiÒu ch­¬ng tr×nh ®Ó m¸y tÝnh thùc hiÖn, tõ nh÷ng ch­¬ng tr×nh ®¬n gi¶n ®Ó gi¶i c¸c bµi to¸n
nhá, tÝnh to¸n mét vµi gi¸ trÞ, ®Õn nh÷ng ch­¬ng tr×nh ®å sé xö lý th«ng tin phøc t¹p, th«ng minh, gi¶i nh÷ng bµi to¸n khoa häc kÜ thuËt lín, chÕ b¶n v¨n b¶n, thiÕt kÕ ®å
häa, c¸c ch­¬ng tr×nh nghe nh¹c, xem phim, trß ch¬i, truy cËp Internet. Nh÷ng ch­¬ng tr×nh t­¬ng ®èi lín vµ phøc t¹p th­êng ®­îc gäi lµ nh÷ng phÇn mÒm. Ng­êi dïng
m¸y tÝnh cã thÓ sö dông nh÷ng ch­¬ng tr×nh ®ã. Ngµy nay chóng ta cã c¶m gi¸c r»ng m¸y tÝnh lµm ®­îc tÊt c¶ mäi viÖc. Tuy nhiªn, ph¶i nhí r»ng tÊt c¶ nh÷ng g× m¸y
tÝnh lµm ®­îc lµ do nã lµm theo mét ch­¬ng tr×nh do con ng­êi t¹o ra.

9 10
1.2. Thùc hiÖn mét ch­¬ng tr×nh m¸y tÝnh

Thùc hiÖn mét ch­¬ng tr×nh m¸y tÝnh th­êng cßn ®­îc gäi t¾t lµ ch¹y ch­¬ng tr×nh. Khi ng­êi dïng m¸y tÝnh muèn nã lµm mét viÖc g× ®ã, thÝ dô gi¶i mét bµi to¸n,
th× ng­êi dïng ph¶i viÕt ra mét ch­¬ng tr×nh ®Ó cho m¸y thùc hiÖn. Ng­êi lËp tr×nh th­êng viÕt c¸c ch­¬ng tr×nh m¸y tÝnh b»ng ng«n ng÷ bËc cao víi nh÷ng c©u lÖnh
gièng nh­ nh÷ng c©u tiÕng Anh, dÔ häc vµ sö dông. Ng«n ng÷ Fortran còng thuéc lo¹i ®ã. Mçi mét b­íc ta muèn m¸y tÝnh thùc hiÖn ph¶i ®­îc m« t¶ ra theo mét có ph¸p
ng«n ngò ®Æc thï (language syntax). Tuy nhiªn, ch­¬ng tr×nh ta viÕt nh­ vËy vÉn ph¶i ®­îc mét ch­¬ng tr×nh chuyªn (bé biªn dÞch - compiler) dÞch thµnh ng«n ng÷ m¸y
th× m¸y tÝnh míi hiÓu vµ thùc hiÖn ®­îc. Khi compiler dÞch c¸c dßng lÖnh ta viÕt, nã tù ®éng t×m c¸c lçi dÞch, hay lçi có ph¸p (syntax error), tøc c¸c lçi vÒ chÝnh t¶, c¸c
dÊu ph©n c¸ch... NÕu ch­¬ng tr×nh viÕt ra cã lçi dÞch, bé biªn dÞch sÏ th«ng b¸o ®Ó ng­êi viÕt ch­¬ng tr×nh söa. Sau khi ®· söa hÕt lçi, ta ch¹y l¹i ch­¬ng tr×nh b¾t ®Çu tõ
b­íc dÞch. Mét khi dÞch xong, mét ch­¬ng tr×nh so¹n th¶o liªn kÕt (linkage editor program) sÏ thùc hiÖn viÖc hoµn tÊt s½n sµng cho b­íc thùc hiÖn. ChÝnh lµ ë b­íc nµy
c¸c lÖnh ta viÕt ®­îc thùc hiÖn trong m¸y tÝnh. Lçi ch­¬ng tr×nh còng cã thÓ xuÊt hiÖn trong b­íc nµy, gäi lµ lçi trong khi ch¹y ch­¬ng tr×nh (run-time error) hay lçi l«gic.
Nh÷ng lçi nµy kh«ng liªn quan tíi có ph¸p cña lÖnh, mµ liªn quan tíi l«gic cña c¸c lÖnh, chØ lé ra khi m¸y tÝnh thùc thi c©u lÖnh. ThÝ dô, lÖnh
X = A/ B
lµ mét c©u lÖnh ®óng, b¶o m¸y tÝnh lÊy A chia cho B vµ gäi kÕt qu¶ lµ X . Tuy nhiªn, gi¶ sö nÕu B b»ng kh«ng, phÐp tÝnh chia cho sè kh«ng lµ phÐp tÝnh sai, kh«ng cã
nghÜa vµ ta ®­îc th«ng b¸o lçi ch¹y ch­¬ng tr×nh. C¸c lçi l«gic kh«ng ph¶i bao giê còng ®­îc th«ng b¸o. ThÝ dô, nÕu trong ch­¬ng tr×nh thay v× chia mét sè cho 0.10 ta
viÕt thµnh nh©n víi 0.10, khi ch¹y ch­¬ng tr×nh sÏ ch¼ng cã lçi nµo ®­îc th«ng b¸o, nh­ng ®¸p sè bµi to¸n, tøc kÕt qu¶ mµ ta mong ®îi, sÏ lµ sai.

1.3. Quy tr×nh gi¶i bµi to¸n trªn m¸y tÝnh

Nh×n chung c«ng viÖc gi¶i mét bµi to¸n b»ng m¸y tÝnh gåm n¨m b­íc sau:
1) Ph¸t biÓu bµi to¸n mét c¸ch râ rµng.
2) M« t¶ th«ng tin nhËp vµo vµ xuÊt ra.
3) Gi¶i bµi to¸n b»ng tay ®èi víi tËp d÷ liÖu ®¬n gi¶n.
4) Ph¸t triÓn c¸ch gi¶i bµi to¸n thµnh d¹ng tæng qu¸t.
5) KiÓm tra ®¸p sè víi nhiÒu tËp d÷ liÖu kh¸c nhau.
B©y giê ta minh häa n¨m b­íc trªn qua thÝ dô bµi to¸n tÝnh gi¸ trÞ trung b×nh cña mét tËp sè liÖu thùc nghiÖm.
B­íc 1: Ta ph¸t biÓu bµi to¸n mét c¸ch râ rµng nh­ sau: “TÝnh trÞ sè trung b×nh cña tËp c¸c gi¸ trÞ sè liÖu thùc nghiÖm".
B­íc 2: ChØ ra cô thÓ sè liÖu vµo vµ ra lµ g×, h×nh thøc ra sao. NÕu cã tê ghi mét sè gi¸ trÞ cña sè liÖu, ®ßi hái nhËp vµo m¸y qua bµn phÝm, khi nµo hÕt sè liÖu th× gâ
gi¸ trÞ 0.0 ®Ó b¸o hÕt, sau ®ã míi tÝnh trÞ sè trung b×nh vµ in ra kÕt qu¶ lµ trÞ sè trung b×nh ®ã. VËy th× ph¶i m« t¶ ë b­íc 2 nh­ sau: "§Çu vµo lµ chuçi c¸c gi¸ trÞ sè thùc
kh¸c kh«ng. §Çu ra lµ gi¸ trÞ trung b×nh, sÏ lµ mét sè thùc ®­îc in trªn mµn h×nh". Gi¶ sö nÕu ®Çu vµo lµ mét sè sè liÖu nh­ trªn nh­ng ®· ®­îc ghi vµo mét tÖp (file)

11 12
trong æ cøng, quy c¸ch ghi còng cã nh÷ng ®Æc ®iÓm nhÊt ®Þnh, th× b­íc m« t¶ vµo vµ ra sÏ hoµn toµn kh¸c vµ c¸ch gi¶i còng sÏ kh¸c. Khi ®ã ta ph¶i m« t¶ râ c¸ch thøc sè
liÖu ghi trong file. ThÝ dô, ta cã thÓ m« t¶ d÷ liÖu ®Çu vµo vµ ®Çu ra nh­ sau: D÷ liÖu ®Çu vµo lµ mét chuçi sè thùc ®­îc ghi trong file v¨n b¶n cã tªn lµ SOLIEU.DAT víi
quy c¸ch ghi nh­ sau: dßng trªn cïng ghi mét sè nguyªn chØ sè phÇn tö cña chuçi, c¸c dßng tiÕp sau lÇn l­ît ghi c¸c sè thùc, mçi sè trªn mét dßng.
B­íc 3: Dïng m¸y tÝnh tay tÝnh thö víi mét tËp ®¬n gi¶n gåm n¨m sè liÖu: thÝ dô:
Thø tù Gi¸ trÞ
1 23.43
2 37.43
3 34.91
4 28.37
5 30.62
Trung b×nh = 30.95

TËp sè liÖu nµy vµ kÕt qu¶ sÏ ®­îc dïng ®Ó kiÓm tra ë b­íc 5.
B­íc 4: Trong b­íc nµy ta kh¸i qu¸t l¹i nh÷ng thao t¸c cÇn lµm ë b­íc 3. TuÇn tù nh÷ng thao t¸c nµy ®Ó dÉn ®Õn gi¶i ®­îc bµi to¸n chÝnh lµ thuËt gi¶i hay thuËt to¸n
(algorithm). Ta sÏ m« t¶ tuÇn tù tõ ®Çu ®Õn cuèi qu¸ tr×nh gi¶i. Chia qu¸ tr×nh thµnh mét sè khèi vµ liÖt kª nh÷ng khèi ®ã ra. Sau nµy ch­¬ng tr×nh m¸y tÝnh sÏ tuÇn tù thùc
hiÖn c¸c khèi chia ®ã. Trong mçi khèi ta l¹i chi tiÕt ho¸ thªm ra ®Õn møc cã thÓ chuyÓn thµnh nh÷ng lÖnh m¸y tÝnh. VËy ë ®©y ®· ¸p dông hai ph­¬ng ph¸p: ph©n khèi vµ
chi tiÕt ho¸ tõng khèi. Víi bµi to¸n ®ang xÐt, tr­êng hîp d÷ liÖu ®Çu vµo cÇn nhËp tõ bµn phÝm, ta chia thµnh ba khèi:
- NhËp c¸c gi¸ trÞ sè vµ lÊy tæng cña chóng.
- Chia tæng cho sè gi¸ trÞ.
- In trÞ sè trung b×nh.
Cô thÓ ho¸ tõng khèi sÏ dÉn tíi gi¶ tr×nh cña ch­¬ng tr×nh nh­ sau:
1. Cho tæng cña c¸c gi¸ trÞ b»ng kh«ng.
2. Cho sè sè liÖu vµo b»ng kh«ng.
3. NhËp vµo tõng gi¸ trÞ vµ kiÓm tra chõng nµo gi¸ trÞ nhËp vµo cßn kh¸c sè 0.0 th×:
- Céng thªm gi¸ trÞ ®ã vµo tæng.
- Céng thªm 1 vµo sè sè liÖu.
4. Chia tæng cho sè sè liÖu ®Ó ®­îc gi¸ trÞ trung b×nh.
5. In gi¸ trÞ trung b×nh.
V× thuËt gi¶i ®· ®­îc m« t¶ kh¸ chi tiÕt, ta chuyÓn thuËt gi¶i ®ã thµnh ch­¬ng tr×nh nh­ sau:
PROGRAM TGTTB
13 14
INTEGER DEM
REAL X, TONG, TB
TONG = 0.0
DEM = 0
5 READ*, X
IF (X .NE. 0.0) THEN
TONG = TONG + X
DEM = DEM + 1
GOTO 5
END IF
TB = TONG / REAL(DEM)
PRINT 6, TB
6 FORMAT (1X, 'TRUNG BINH BANG ' , F6.2)
STOP
END

B­íc 5: Trong b­íc nµy ta thö ch¹y ch­¬ng tr×nh ®· viÕt víi tËp sè liÖu ®· ®­îc thö b»ng c¸ch tÝnh tay ë môc 3. §Çu ra trªn mµn h×nh m¸y tÝnh ph¶i nh­ sau:

TRU NG BI N H BAN G 30.95

Ngoµi ra, ta cã thÓ ch¹y thö víi mét sè tËp sè liÖu kh¸c nhau ®Ó tin ch¾c vµo tÝnh ®óng ®¾n l«gic vµ hoµn h¶o cña ch­¬ng tr×nh ®· x©y dùng.
Nh÷ng kh¸i niÖm thuËt gi¶i vµ gi¶ tr×nh trªn ®©y cã ý nghÜa rÊt quan träng. C¸ch gi¶i, ph­¬ng ph¸p gi¶i mét bµi to¸n chÝnh lµ thuËt gi¶i. C¸c bµi to¸n khoa häc kÜ
thuËt thùc hiÖn trªn m¸y tÝnh th­êng cã thuËt gi¶i lµ nh÷ng ph­¬ng ph¸p cña to¸n häc hoÆc cña c¸c khoa häc chuyªn ngµnh mµ ng­êi lËp tr×nh ®· biÕt. Mét sè nhiÖm vô,
bµi to¸n kh¸c cã thÓ cã c¸ch gi¶i xuÊt ph¸t tõ kinh nghiÖm thùc tÕ, tõ suy nghÜ l«gic th­êng ngµy cña chóng ta.
ThÝ dô, khi gi¶i ph­¬ng tr×nh bËc hai a x 2 + bx + c = 0 b»ng m¸y tÝnh, ta cã thÓ tÝnh gi¸ trÞ cña biÖt thøc ∆ . Sau ®ã tïy gi¸ trÞ cña ∆ cã thÓ lµ: ∆ < 0 ph­¬ng tr×nh
v« nghiÖm, ∆ = 0 ph­¬ng tr×nh cã mét nghiÖm kÐp vµ ∆ > 0 ph­¬ng tr×nh cã hai nghiÖm riªng biÖt mµ ®­a ra th«ng b¸o kÕt qu¶. Trong thÝ dô nµy, thuËt to¸n lµ ph­¬ng
ph¸p quen thuéc mµ chóng ta ®· häc trong ®¹i sè.
Mét thÝ dô kh¸c: Cã mét danh s¸ch sinh viªn cïng víi ®iÓm cña m«n thi. S¾p xÕp l¹i danh s¸ch ®ã sao cho ng­êi cã ®iÓm thi cao h¬n th× ë dßng trªn. Ta cã thÓ lµm
nh­ sau:
T¹m thêi xem ng­êi thø nhÊt lµ ng­êi ®øng ®Çu danh s¸ch. Dïng ngãn tay trá dâi theo tõng ng­êi cßn l¹i, kÓ tõ ng­êi thø hai cho ®Õn hÕt danh s¸ch, nÕu ai cã ®iÓm
thi cao h¬n th× chuyÓn ng­êi ®ã lªn ®Çu danh s¸ch vµ ng­êi ®ang ë ®Çu danh s¸ch chuyÓn xuèng chç cña ng­êi võa ®­îc thay. KÕt qu¶ ta ®­îc danh s¸ch míi víi ng­êi
cã ®iÓm thi cao nhÊt ë dßng ®Çu. Nh­ng tõ dßng thø hai ®Õn dßng cuèi cïng cña danh s¸ch cã thÓ thø tù vÉn cßn lén xén.
B©y giê ta chØ cßn viÖc s¾p xÕp l¹i tõ dßng thø hai trë ®i. Ta theo dâi tõ ng­êi thø ba cho ®Õn ng­êi cuèi cïng, nÕu ai cã ®iÓm thi cao h¬n th× ®­îc ®­a lªn dßng thø
hai vµ ng­êi ®ang ë dßng thø hai sÏ bÞ ®­a xuèng dßng cña ng­êi võa thay thÕ. KÕt qu¶ lµ ng­êi ë dßng thø hai trong danh s¸ch míi sÏ lµ ng­êi cã ®iÓm thi cao thø nh×.

15 16
Nh­ng tõ dßng thø ba ®Õn cuèi danh s¸ch vÉn cßn lén xén.
TiÕp tôc, ta ph¶i s¾p xÕp l¹i danh s¸ch kÓ tõ dßng thø ba theo ®óng c¸ch nh­ trªn. LÆp l¹i c«ng viÖc nh­ vËy cho ®Õn dßng tr­íc dßng cuèi cïng, ta sÏ ®­îc danh
s¸ch hoµn chØnh s¾p xÕp theo thø tù gi¶m dÇn cña ®iÓm thi.
Ta thÊy, trong tr­êng hîp nµy thuËt gi¶i cña bµi to¸n chÝnh lµ c¸i c¸ch mµ chóng ta cã thÓ vÉn th­êng lµm trong thùc tÕ ®êi sèng khi ph¶i s¾p xÕp l¹i danh s¸ch theo
thø tù nh­ng kh«ng dïng m¸y tÝnh. Vµ c¸ch lµm “b»ng tay” nµy còng cã thÓ ®­îc ¸p dông lµm thuËt to¸n cho c¸c lo¹i bµi to¸n s¾p xÕp trong m¸y tÝnh.
Chóng t«i giíi thiÖu chi tiÕt hai thÝ dô võa råi cèt lµ ®Ó sinh viªn ý thøc ®­îc r»ng t­ duy thuËt gi¶i, suy nghÜ vÒ c¸ch gi¶i lµ b­íc quan träng nhÊt khi b¾t tay vµo x©y
dùng ch­¬ng tr×nh m¸y tÝnh. Cã x¸c ®Þnh ®­îc thuËt gi¶i th× míi nãi ®Õn lËp ®­îc ch­¬ng tr×nh ®Ó gi¶i bµi to¸n trªn m¸y tÝnh.
Cßn gi¶ tr×nh gièng nh­ nh÷ng lêi chØ dÉn vÒ ph­¬ng ph¸p, c¸ch gi¶i cho ai ®ã tuÇn tù thùc hiÖn c¸c b­íc cña thuËt gi¶i bµi to¸n ®Ó dÉn tíi kÕt qu¶. B¹n h·y t­ëng
t­îng trong ®êi sèng nÕu b¹n muèn nhê ai ®ã thùc hiÖn mét nhiÖm vô. NÕu nhiÖm vô ®ã kh«ng qu¸ tÇm th­êng, th× th­êng Ýt ra b¹n ph¶i gi¶i thÝch tãm t¾t yªu cÇu, tuÇn
tù thùc hiÖn nhiÖm vô cho ng­êi ta - b¹n ®· ®Æt ch­¬ng tr×nh cho ng­êi ta thùc hiÖn. Nh­ vËy, ta thÊy thùc chÊt gi¶ tr×nh ®· lµ mét ch­¬ng tr×nh, chØ cã ®iÒu nã ®­îc viÕt
ra ng¾n gän b»ng vµi c©u, vµi kÝ hiÖu quen dïng, ch­a ®­îc viÕt b»ng mét ng«n ng÷ lËp tr×nh cô thÓ mµ th«i. Mét ch­¬ng tr×nh m¸y tÝnh viÕt b»ng ng«n ng÷ Fortran hay
bÊt kú mét ng«n ng÷ nµo kh¸c ch¼ng qua chØ lµ nh÷ng lêi chØ dÉn nµy ®­îc viÕt theo qui ­íc kÝ hiÖu ®Ó m¸y tÝnh hiÓu ®­îc mµ lµm thay cho ta.

1.4. Nh÷ng ch­¬ng tr×nh Fortran hoµn chØnh

Ch­¬ng tr×nh TGTTB ë môc tr­íc cã thÓ lµ mét thÝ dô vÒ mét ch­¬ng tr×nh hoµn chØnh. Nh­ vËy ta thÊy mét ch­¬ng tr×nh hoµn chØnh b¾t ®Çu b»ng lÖnh PROGRAM
chØ sù b¾t ®Çu cña ch­¬ng tr×nh. D¹ng tæng qu¸t cña lÖnh nµy nh­ sau:

PROGRAM Tªn ch­ ¬ng tr×nh


trong ®ã tªn ch­¬ng tr×nh lµ mét x©u ký tù gåm tõ mét ®Õn s¸u ký tù, b¾t ®Çu b»ng ch÷ c¸i vµ chØ chøa c¸c ch÷ c¸i la tinh vµ ch÷ sè. KÕt thóc ch­¬ng tr×nh lµ hai lÖnh:

STOP

END

LÖnh PROGRAM vµ lÖnh STOP lµ c¸c lÖnh tuú chän, cã thÓ kh«ng nhÊt thiÕt ph¶i cã. NÕu ta kh«ng viÕt, chóng cã thÓ ®­îc ch­¬ng tr×nh dÞch tù thªm vµo. PhÇn
th©n ch­¬ng tr×nh gåm tÊt c¶ c¸c lÖnh kh¸c nh»m thùc hiÖn bµi to¸n ®­îc gi¶i vµ chia thµnh hai nhãm: nhãm c¸c lÖnh thùc hiÖn (executable statement) vµ nhãm c¸c lÖnh
kh«ng thùc hiÖn (non-executable statement) hay gäi lµ c¸c lÖnh m« t¶, lÖnh khai b¸o. Nhãm c¸c lÖnh m« t¶ ph¶i n»m ë phÝa trªn cña th©n ch­¬ng tr×nh.
Nh­ vËy c¸c ch­¬ng tr×nh Fortran cã thÓ cã cÊu tróc tæng qu¸t nh­ sau:
PROGRAM Tªn ch­¬ng tr×nh
C¸c lÖnh kh«ng thùc hiÖn (Non-executable statements)
17 18
C¸c lÖnh thùc hiÖn (Executable statements)
STOP
END
Trong ch­¬ng tr×nh tÝnh gi¸ trÞ trung b×nh cña chuçi sè thùc ë thÝ dô trªn, ta thÊy sau tõ khãa PROGRAM lµ tªn ch­¬ng tr×nh - ®ã lµ côm ch÷ TGTTB. Nhãm c¸c
lÖnh kh«ng thùc hiÖn (nh÷ng lÖnh m« t¶) gåm 2 lÖnh:
INTEGER DEM
REAL X, TONG, TB
cßn nhãm lÖnh thùc hiÖn gåm c¸c lÖnh ë tiÕp sau hai lÖnh trªn:
TONG = 0.0
DEM = 0
5 READ*, X
IF (X .NE. 0.0) THEN
TONG = TONG + X
DEM = DEM + 1
GOTO 5
END IF
TB = TONG / REAL(DEM)
PRINT 6, TB
6 FORMAT (1X, 'TRUNG BINH BANG ' , F6.2)
Nh÷ng lÖnh thùc hiÖn th­êng lµ nh÷ng lÖnh g¸n, lÖnh tÝnh to¸n c¸c phÐp tÝnh, lÖnh chuyÓn ®iÒu khiÓn, ®äc, ghi sè liÖu vµ mét sè lÖnh kh¸c. Cuèi cïng ch­¬ng tr×nh
cã lÖnh STOP vµ END.
Trong thùc tÕ cã thÓ cã nh÷ng ch­¬ng tr×nh lín h¬n rÊt nhiÒu, gåm hµng ngh×n dßng lÖnh vµ cã cÊu tróc phøc t¹p. Nh­ng ta vÉn thÊy nã cã phÇn ®Çu, phÇn th©n vµ
phÇn cuèi, trong phÇn th©n ch­¬ng tr×nh còng chØ cã hai nhãm lÖnh gièng nh­ trong ch­¬ng tr×nh ®¬n gi¶n trªn ®©y.

1.5. Quy c¸ch so¹n th¶o mét ch­¬ng tr×nh Fortran

C¸c ch­¬ng tr×nh Fortran ®­îc so¹n th¶o nhê mét bé so¹n th¶o (editor) hoÆc phÇn mÒm so¹n v¨n b¶n nµo ®ã. C¸c lÖnh cña mét ch­¬ng tr×nh ®­îc viÕt thµnh c¸c
dßng nèi tiÕp nhau, mçi lÖnh trªn mét dßng míi. Trªn mµn h×nh so¹n th¶o chuÈn (*) ng­êi ta quy ­íc c¸c cét tõ 1 ®Õn 5 (h×nh 1.2) dïng ®Ó ghi sè hiÖu lÖnh hay gäi lµ nh·n

(*)
Tr­íc ®©y ng­êi ta ph¶i dïng giÊy chuyªn dông, gäi lµ blank, ®Ó viÕt ch­¬ng tr×nh Fortran. Sau ®ã tõng lÖnh ch­¬ng tr×nh tõ giÊy chuÈn ®­îc ghi vµo mét tê b×a chuyªn dông cã
h×nh d¸ng ®Æc biÖt b»ng m¸y ®ôc lç gióp tù ®éng m· hãa tõng ký tù cña dßng lÖnh thµnh mét hµng lç víi vÞ trÝ kh¸c nhau. Ngµy nay c¸c bé so¹n th¶o cã thÓ gióp chóng ta viÕt c¸c
19 20
lÖnh, cét 6 chuyªn dïng ®Ó ghi ký tù nèi dßng lÖnh, néi dung c¸c dßng lÖnh chØ ®­îc ghi trªn c¸c cét tõ 7 ®Õn 72. TÊt c¶ c¸c th«ng tin ë qu¸ cét 72 bÞ bá qua.

C¸c cét Cét C¸c cét


1-5 6 7-72

LÖnh Fortran
Ký tù nèi dßng
Nh·n lÖnh

H×nh 1.2. Quy c¸ch viÕt lÖnh Fortran trªn mµn h×nh so¹n th¶o

Nh·n lÖnh lµ nh÷ng sè nguyªn d­¬ng, kh¸c kh«ng, dïng ®Ó chØ sè hiÖu cña dßng lÖnh. ChØ nh÷ng dßng lÖnh nµo cÇn ®­îc chuyÓn ®iÒu khiÓn tíi bëi nh÷ng dßng
lÖnh kh¸c míi nhÊt thiÕt ph¶i cã nh·n lÖnh. DÊu nèi dßng lÖnh cã thÓ lµ bÊt cø ký tù nµo ngoµi ký tù trèng vµ sè kh«ng, th­êng ng­êi ta hay dïng dÊu * hoÆc dÊu +, ®Ó chØ
r»ng dßng hiÖn t¹i lµ phÇn nèi tiÕp cña lÖnh ë dßng trªn ®ã. Trong c¸c dßng lÖnh cã thÓ cã nh÷ng ký tù trèng ®Ó dÔ ®äc. Trong ch­¬ng tr×nh so¹n th¶o cã thÓ cã nh÷ng
dßng ghi chó (comment lines); nh÷ng dßng nµy kh«ng thuéc néi dung ch­¬ng tr×nh, kh«ng ®­îc dÞch khi dÞch ch­¬ng tr×nh, mµ chØ cã t¸c dông gîi nhí cho ng­êi lËp
tr×nh khi theo dâi kiÓm tra ch­¬ng tr×nh. TÊt c¶ c¸c dßng ghi chó ph¶i b¾t ®Çu b»ng mét ch÷ c¸i, th­êng ng­êi ta dïng ch÷ C (ch÷ c¸i ®Çu tiªn cña tõ comment), ®øng ë
cét thø nhÊt cña c¸c cét dïng ®Ó ghi nh·n. Trong s¸ch nµy sÏ lu«n sö dông ch÷ c¸i C ®Ó ®¸nh dÊu dßng ghi chó trong c¸c ch­¬ng tr×nh.
X©y dùng mét ch­¬ng tr×nh m¸y tÝnh nãi chung lµ mét c«ng viÖc khã vµ ®ßi hái tÝnh cÈn thËn, tØ mØ. Kinh nghiÖm cho thÊy r»ng ngay c¶ ®èi víi ng­êi lËp tr×nh thµnh th¹o,
khi viÕt mét ch­¬ng tr×nh dï ®¬n gi¶n vÉn cã thÓ m¾c lçi, trong ®ã cã c¶ nh÷ng lçi kh«ng ngê tíi. Do ®ã, ë mét sè s¸ch d¹y ng«n ng÷ lËp tr×nh, ng­êi ta cßn khuyªn ng­êi häc
ngay tõ ®Çu chó ý luyÖn thãi quen, hay phong c¸ch (style) so¹n th¶o ch­¬ng tr×nh. Mét ch­¬ng tr×nh ®Ñp lµ ch­¬ng tr×nh tÝnh ®óng c¸i mµ ta cÇn tÝnh, nh­ng ®¬n gi¶n, dÔ hiÓu vµ
s¸ng sña vÒ c¸ch tr×nh bµy. Trong tµi liÖu nµy dÇn dÇn còng sÏ cã nh÷ng chØ dÉn, nh÷ng lêi khuyªn quan träng cho ng­êi häc rÌn luyÖn phong c¸ch so¹n ch­¬ng tr×nh. ChÞu khã
rÌn luyÖn nh÷ng thãi quen tèt còng gãp phÇn gióp chóng ta tiÕn xa.

Bµi tËp
1. NÕu dïng ch÷ C lµm dÊu nèi dßng lÖnh th× cã ®­îc kh«ng?
2. C¸c nh·n trong ch­¬ng tr×nh cã cÇn t¨ng dÇn kh«ng?
3. Nªu c¸c b­íc gi¶i bµi to¸n s¾p xÕp chuçi sè nguyªn nhËp tõ bµn phÝm theo thø tù lín dÇn. ViÕt gi¶ tr×nh cho bµi to¸n ®ã.

lÖnh trùc tiÕp tõ bµn phÝm, khi viÕt c¸c ký tù vµ ký hiÖu hiÖn trªn mµn h×nh ®Ó dÔ theo dâi vµ chØnh söa gièng nh­ ta so¹n th¶o mét v¨n b¶n bÊt kú, sau ®ã l­u trong m¸y tÝnh d­íi
d¹ng file nguån.
21 22
Ch­¬ng 2

Nh÷ng yÕu tè c¬ b¶n cña Fortran

2.1. D÷ liÖu vµ c¸ch biÓu diÔn d÷ liÖu trong Fortran

Fortran cã thÓ thao t¸c víi s¸u lo¹i (kiÓu) d÷ liÖu c¬ b¶n th­êng gÆp trong thùc tÕ lµ: c¸c sè nguyªn, sè thùc, sè phøc, sè thùc ®é chÝnh x¸c gÊp ®«i, c¸c gi¸ trÞ l«gic
vµ d÷ liÖu v¨n b¶n. Trong ch­¬ng nµy ta sÏ lµm quen víi c¸c d÷ liÖu kiÓu sè nguyªn, sè thùc, gi¸ trÞ l«gic vµ v¨n b¶n (chuçi ký tù).
Sè nguyªn lµ liÖt c¸c sè thËp ph©n víi dÊu +, − hoÆc kh«ng cã dÊu. ThÝ dô:
0 ; 6 ; −400 ; +1234
C¸c sè nguyªn ®­îc biÓu diÔn d­íi d¹ng I . Gi¸ trÞ cùc ®¹i cña sè nguyªn gäi lµ kh¶ n¨ng biÓu diÔn sè nguyªn cña m¸y tÝnh.
Trong Fortran cã hai d¹ng biÓu diÔn sè thùc. D­íi d¹ng F sè thùc gåm phÇn nguyªn vµ phÇn thËp ph©n, c¸ch nhau bëi dÊu chÊm. Sè thùc cã thÓ cã dÊu dÊu +, −
hoÆc kh«ng cã dÊu. NÕu phÇn nguyªn hoÆc phÇn thËp ph©n b»ng kh«ng, cã thÓ kh«ng cÇn viÕt ra c¸c phÇn ®ã. DÊu chÊm thËp ph©n nhÊt thiÕt ph¶i cã mÆt. ThÝ dô:
−2.583 ; 14.3 ; 0.8 ; 12. ; .7 ; 14.
Gi¸ trÞ cùc ®¹i vµ sè ch÷ sè cã nghÜa cùc ®¹i trong d¹ng F phô thuéc vµo d¹ng khai b¸o sè thùc.
D¹ng E biÓu diÔn sè thùc thµnh hai phÇn: phÇn h»ng thùc n»m trong kho¶ng tõ 0,1 ®Õn 1,0 vµ phÇn bËc. BËc b¾t ®Çu b»ng ch÷ E , tiÕp sau lµ h»ng nguyªn gåm
kh«ng qu¸ hai ch÷ sè thËp ph©n, cã thÓ cã dÊu hoÆc kh«ng dÊu. ThÝ dô sè 25000 cã thÓ viÕt d­íi d¹ng E lµ 0.25E05. Sè ch÷ sè cã nghÜa cña phÇn h»ng thùc vµ h»ng
nguyªn còng tïy thuéc lo¹i sè thùc khai b¸o.
H»ng víi ®é chÝnh x¸c gÊp ®«i (d¹ng D ) cã thÓ viÕt nh­ sè víi dÊu chÊm thËp ph©n, chøa tõ 8 ®Õn 16 ch÷ sè cã nghÜa, hoÆc nh­ sè d¹ng mò víi ch÷ D thay v× E ,
trong ®ã phÇn h»ng thùc cã thÓ chøa tíi 16 ch÷ sè cã nghÜa. ThÝ dô:
2.71828182 ; 0.27182818D+1
TrÞ tuyÖt ®èi cùc ®¹i cña c¸c sè thùc th­êng vµ ®é chÝnh x¸c gÊp ®«i b»ng 10 −79 ®Õn 10 75 .
Sè phøc biÓu diÔn b»ng mét cÆp h»ng thùc trong dÊu ngoÆc ®¬n vµ c¸ch nhau bëi dÊu ph¶y. ThÝ dô (2.1, 0.5E2) biÓu diÔn sè phøc 2,1 + 50 i trong to¸n häc.
Hai sè trong dÊu ngoÆc øng víi c¸c phÇn thùc vµ phÇn ¶o ph¶i cïng ®é chÝnh x¸c biÓu diÔn.
C¸c gi¸ trÞ d÷ liÖu v¨n b¶n dïng ®Ó biÓu diÔn c¸c ®o¹n v¨n b¶n nh­ tªn c¸c ®¹i l­îng, c¸c kh¸i niÖm, thÝ dô côm ch÷ " Toc do", "Temperature", "BAO CAO SO 1"...
Ng­êi ta cßn gäi d÷ liÖu v¨n b¶n lµ d÷ liÖu ký tù, x©u ký tù, d÷ liÖu ch÷.
C¸c ch÷ sè 1, 2, ..., 9, 0 khi dïng víi t­ c¸ch lµ ®Ó biÓu diÔn c¸c gi¸ trÞ sè t­¬ng øng th× chóng còng lµ nh÷ng d÷ liÖu kiÓu v¨n b¶n.

23 24
D÷ liÖu l«gic dïng ®Ó chØ kh¶ n¨ng cã hay kh«ng cña mét sù kiÖn, ®óng hay sai cña mét biÓu thøc quan hÖ. Ng­êi ta dïng hai gi¸ trÞ l«gic lµ .TRUE. vµ .FALSE. ®Ó
chØ hai tr¹ng th¸i ®èi lËp nhau trong nh÷ng thÝ dô trªn vµ ng«n ng÷ Fortran cã thÓ xö lý víi nh÷ng gi¸ trÞ l«gic, tøc thùc hiÖn nh÷ng phÐp tÝnh ®èi víi c¸c gi¸ trÞ l«gic nh­
trong to¸n häc cã thÓ thùc hiÖn.
Së dÜ m¸y tÝnh lµm ®­îc nh÷ng viÖc nh­ chóng ta thÊy lµ v× nã cã thÓ xö lý th«ng tin, so s¸nh, tÝnh to¸n ®­îc víi nh÷ng kiÓu d÷ liÖu nµy vµ ®­a ra nh÷ng kÕt luËn,
th«ng b¸o... TÊt c¶ nh÷ng th«ng tin chóng ta gÆp trong ®êi sèng thùc tÕ ®Òu cã thÓ ®­îc biÓu diÔn b»ng nh÷ng d÷ liÖu kiÓu nµy hoÆc kiÓu kh¸c.
Trªn ®©y lµ nh÷ng kiÓu d÷ liÖu c¬ b¶n cña ng«n ng÷ lËp tr×nh Fortran. Sau nµy vµ ë c¸c ch­¬ng kh¸c, chóng ta sÏ thÊy cßn cã nh÷ng kiÓu d÷ liÖu kh¸c ®­îc tæ chøc
dùa trªn nh÷ng kiÓu d÷ liÖu c¬ b¶n võa tr×nh bµy.
ë ®©y chóng ta cÇn l­u ý r»ng nh÷ng kh¸i niÖm d÷ liÖu trong m¸y tÝnh nh­ sè nguyªn, sè thùc... nãi chung gièng víi nh÷ng kh¸i niÖm t­¬ng øng trong ®êi sèng hoÆc
trong to¸n häc. Nh­ng ®ång thêi còng cã nh÷ng nÐt kh¸c biÖt. ThÝ dô, Fortran chØ hiÓu vµ tÝnh to¸n ®­îc víi nh÷ng sè nguyªn lo¹i th­êng kh«ng lín h¬n 2 ⋅ 10 9 , ng«n
ng÷ lËp tr×nh Pascal chØ lµm viÖc víi nh÷ng sè nguyªn kh«ng lín h¬n 32767 vµ kh«ng nhá h¬n −32768, trong khi hµng ngµy chóng ta cã thÓ viÕt trªn giÊy hoÆc tÝnh to¸n
c¸c phÐp tÝnh víi nh÷ng sè nguyªn cã gi¸ trÞ tïy ý. T×nh h×nh còng t­¬ng tù nh­ vËy ®èi víi c¸c sè thùc. VËy trong m¸y tÝnh cã nh÷ng giíi h¹n nhÊt ®Þnh trong viÖc biÓu
diÔn c¸c sè, kh«ng ph¶i sè nµo m¸y tÝnh còng biÓu diÔn ®­îc vµ tÝnh to¸n ®­îc. Tuy nhiªn, víi nh÷ng giíi h¹n nh­ hiÖn nay, Fortran vÉn cho phÐp chóng ta lËp c¸c
ch­¬ng tr×nh ®Ó tÝnh to¸n, xö lý víi tÊt c¶ nh÷ng gi¸ trÞ sè gÆp trong ®êi sèng vµ khoa häc kü thuËt.

2.2. H»ng vµ biÕn

M¸y tÝnh xö lý d÷ liÖu hay thùc hiÖn nh÷ng tÝnh to¸n víi nh÷ng ®¹i l­îng. TÊt c¶ nh÷ng ®¹i l­îng ®ã ph¶i ®­îc l­u gi÷ trong m¸y tÝnh. Nh÷ng ®¹i l­îng kh«ng ®æi
trong suèt qu¸ tr×nh thùc hiÖn cña ch­¬ng tr×nh gäi lµ c¸c h»ng, cßn nh÷ng ®¹i l­îng cã thÓ nhËn nh÷ng gi¸ trÞ kh¸c nhau gäi lµ c¸c biÕn. Víi mçi h»ng hoÆc biÕn, trong
bé nhí m¸y tÝnh giµnh ra mét ®Þa chØ ®Ó l­u gi¸ trÞ. Tªn lµ ký hiÖu quy ­íc cña ®Þa chØ ®ã.

2.2.1. Tªn biÕn vµ tªn h»ng


Tªn biÕn trong Fortran chuÈn ®­îc biÓu diÔn b»ng tËp hîp tõ 1 ®Õn 6 c¸c ch÷ c¸i trong b¶ng ch÷ c¸i la tinh (26 ch÷ c¸i) hoÆc c¸c ch÷ sè 0, 1, ..., 9, nh­ng ph¶i b¾t
®Çu b»ng ch÷ c¸i.
Trong mét ch­¬ng tr×nh c¸c tªn biÕn kh«ng ®­îc trïng nhau. Trong c¸c phiªn b¶n Fortran hiÖn nay, ®Ó dïng lµm tªn kh«ng ph©n biÖt ch÷ c¸i hoa vµ ch÷ c¸i th­êng.
Ngoµi ra, cßn mét vµi ký tù kh¸c còng cã thÓ dïng ®Ó cÊu t¹o tªn. Phiªn b¶n Fortran 90 cho phÐp ®Æt tªn víi sè ký tù dµi h¬n 6 vµ trong tªn cã thÓ cã mét sè ký tù kh¸c
n÷a. Tuy nhiªn, sinh viªn nªn tËp thãi quen ®Æt tªn gän gµng theo Fortran chuÈn, bëi v× tËp hîp 6 ký tù ®· rÊt ®ñ ®Ó chóng ta m« t¶ c¸c bµi to¸n, kÓ c¶ nh÷ng bµi to¸n lín
vµ phøc t¹p.
ThÝ dô, c¸c tªn sau ®©y
X ; A ; X1 ; B2T5 ; SOHANG ; SUM lµ hîp lÖ, cßn c¸c tªn sau ®©y lµ sai:

25 26
1NGAY ; HE SO ; B*T
v× trong tªn thø nhÊt ký tù ®Çu tiªn lµ ch÷ sè, trong tªn thø hai cã ký tù dÊu c¸ch, trong tªn thø ba cã ký tù (*) kh«ng ph¶i lµ nh÷ng ký tù dïng ®Ó ®Æt tªn.
Quy t¾c ®Æt tªn biÕn trªn ®©y còng ¸p dông ®èi víi tªn ch­¬ng tr×nh, tªn h»ng, tªn c¸c ch­¬ng tr×nh con vµ tªn file. (Riªng víi tªn file cã thÓ cã thªm phÇn më réng
gåm kh«ng qu¸ ba ch÷ c¸i hoÆc ch÷ sè ng¨n víi phÇn tªn chÝnh bëi dÊu chÊm).

2.2.2. M« t¶ (khai b¸o) kiÓu biÕn vµ kiÓu h»ng


KiÓu cña biÕn t­¬ng øng víi kiÓu d÷ liÖu mµ nã biÓu diÔn. C¸c biÕn nguyªn biÓu diÔn c¸c d÷ liÖu sè nguyªn, c¸c biÕn thùc - sè thùc... Trong ch­¬ng tr×nh ph¶i chØ râ
c¸c biÕn ®­îc sö dông biÓu diÔn d÷ liÖu kiÓu nµo (nguyªn, thùc, l«gic, phøc, v¨n b¶n, sè thùc ®é chÝnh x¸c th­êng hay ®é chÝnh x¸c gÊp ®«i...).
Mçi biÕn chØ l­u gi÷ ®­îc nh÷ng gi¸ trÞ ®óng kiÓu cña nã. Mét biÕn ®· m« t¶ kiÓu lµ sè nguyªn th× kh«ng thÓ dïng ®Ó l­u gi¸ trÞ sè thùc hay gi¸ trÞ l«gic.
C¸ch m« t¶ Èn chØ dïng ®èi víi c¸c biÕn nguyªn vµ thùc: dïng tªn biÕn nguyªn b¾t ®Çu b»ng mét trong s¸u ch÷ c¸i I, J, K, L, M, N, cßn tªn biÕn thùc b¾t ®Çu b»ng
mét trong nh÷ng ch÷ c¸i ngoµi s¸u ch÷ c¸i trªn. Nãi chung, ng­êi míi häc lËp tr×nh kh«ng bao giê nªn dïng c¸ch m« t¶ Èn.
C¸ch m« t¶ hiÖn dïng c¸c lÖnh m« t¶ hiÖn nh­ INTEGER, REAL, CHARACTER, LOGICAL, DOUBLE PRECISION, COMPLEX... ®Ó chØ kiÓu d÷ liÖu mµ c¸c biÕn biÓu
diÔn. D­íi ®©y lµ quy t¾c viÕt nh÷ng lÖnh m« t¶ kiÓu d÷ liÖu: tuÇn tù nguyªn, thùc, l«gic, phøc, thùc ®é chÝnh x¸c gÊp ®«i vµ ký tù v¨n b¶n:

INTEGER Danh s¸ch c¸c biÕn nguyªn


REAL Danh s¸ch c¸c biÕn thùc
LOGICAL Danh s¸ch c¸c biÕn l«gic
COMPLEX Danh s¸ch c¸c biÕn phøc
DOUBLE PRECISION Danh s¸ch c¸c biÕn ®é chÝnh x¸c ®«i
CHARACTER Danh s¸ch c¸c biÕn ký tù

Trong danh s¸ch c¸c biÕn sÏ liÖt kª c¸c tªn biÕn, nÕu cã h¬n mét biÕn th× c¸c biÕn ph¶i c¸ch nhau bëi dÊu ph¶y.
ThÝ dô:
INTEGER I, TT, DEM
REAL X1, APSUAT, MAX, TIME, DELTA
COMPLEX P1, P2, SOPH

27 28
chØ r»ng c¸c biÕn I, TT, DEM biÓu diÔn c¸c gi¸ trÞ sè nguyªn, c¸c biÕn X1, APSUAT, MAX, TIME, DELTA biÓu diÔn c¸c gi¸ trÞ sè thùc, cßn ba biÕn P1, P2, SOPH - sè
phøc.
Nh÷ng gi¸ trÞ ®­îc gi÷ nguyªn nhÊt qu¸n trong suèt ch­¬ng tr×nh (tøc c¸c h»ng sè) th­êng ®­îc g¸n vµo c¸c ®Þa chØ nhí th«ng qua tªn trong lÖnh khai b¸o h»ng cã
d¹ng:

PARAMETER (ten1 = biÓu thøc 1, tªn 2 = biÓu thøc 2, ...)


ThÝ dô, trong ch­¬ng tr×nh nÕu ta nhiÒu lÇn dïng ®Õn gi¸ trÞ sè π = 3,141593 th× ta cã thÓ g¸n gi¸ trÞ 3,141593 cho mét tªn h»ng lµ PI b»ng lÖnh
PARAMETER (PI = 3.141593)
LÖnh sau ®©y
PARAMETER (HSMSD = 0.0026, RO = 1.0028)
khai b¸o hai h»ng sè: HSMSD vµ RO, HSMSD ®­îc g¸n gi¸ trÞ b»ng 0,0026, cßn RO ®­îc g¸n gi¸ trÞ 1,0028.
Trong ch­¬ng tr×nh tÊt c¶ nh÷ng lÖnh khai b¸o (m« t¶) võa giíi thiÖu trªn ®©y thuéc lo¹i c¸c lÖnh kh«ng thùc hiÖn vµ chóng ph¶i n»m ë ®Çu ch­¬ng tr×nh, tr­íc tÊt c¶
c¸c lÖnh thùc hiÖn.
Kh¸i niÖm vÒ tªn, kiÓu d÷ liÖu cña biÕn, cña h»ng lµ nh÷ng kh¸i niÖm c¬ b¶n, quan träng trong ng«n ng÷ lËp tr×nh.
ë ®Çu môc nµy ®· nãi mét tªn thùc chÊt lµ ký hiÖu quy ­íc cña mét ®Þa chØ trong bé nhí cña m¸y tÝnh ®Ó l­u gi¸ trÞ. LÖnh khai b¸o biÕn míi chØ ®Æt tªn cho mét ®Þa
chØ trong bé nhí vµ quy ®Þnh trong ®Þa chØ ®ã cã thÓ l­u gi÷ d÷ liÖu kiÓu g×. Cßn cô thÓ trong « nhí ®ã ®· cã chøa gi¸ trÞ ch­a hay chøa gi¸ trÞ b»ng bao nhiªu th× tïy
thuéc vµo c¸c lÖnh thùc hiÖn ë trong ch­¬ng tr×nh, t¹i tõng ®o¹n cña ch­¬ng tr×nh. §iÒu nµy gièng nh­ ta quy ­íc ®Þnh ra mét ng¨n trong tñ v¨n phßng ®Ó chuyªn gi÷ c¸c
c«ng v¨n, cßn trong ng¨n Êy cã c«ng v¨n hay kh«ng, hoÆc cã mÊy c«ng v¨n th× tïy thuéc lóc nµy hay lóc kh¸c. D­íi ®©y nªu mét thÝ dô ®Ó minh häa ý nghÜa cña viÖc ®Æt
tªn biÕn vµ m« t¶ kiÓu (d÷ liÖu) cña biÕn, ®ång thêi theo dâi gi¸ trÞ cña biÕn t¹i tõng thêi ®iÓm cña ch­¬ng tr×nh. Gi¶ sö ta viÕt mét ch­¬ng tr×nh ®Ó tÝnh diÖn tÝch s cña
h×nh tam gi¸c khi gi¸ trÞ ®é dµi ®¸y b b»ng 5,0 cm, chiÒu cao h b»ng 3,2 cm, in kÕt qu¶ tÝnh lªn mµn h×nh. Ch­¬ng tr×nh sau ®©y sÏ thùc hiÖn nh÷ng viÖc ®ã:
REAL DAY, CAO ! (1)
DAY = 5.0 ! (2)
CAO = 3.2 ! (3)
DAY = 0.5 * DAY * CAO ! (4)
PRINT *, ‘DIEN TICH TAM GIAC BANG’, DAY ! (5)
END ! (6)
Trong ch­¬ng tr×nh nµy cã s¸u lÖnh. LÖnh (1) khai b¸o hai biÕn tªn lµ DAY vµ CAO dù ®Þnh ®Ó l­u gi¸ trÞ sè thùc t­¬ng øng cña ®¸y b vµ chiÒu cao h cña tam
gi¸c. LÖnh (2) g¸n gi¸ trÞ b = 5,0 (cm) cho biÕn DAY. LÖnh (3) g¸n gi¸ trÞ h = 3,5 (cm) cho biÕn CAO. LÖnh (4) tÝnh gi¸ trÞ cña biÓu thøc 0,5 × b × h , tøc diÖn tÝch s cña
tam gi¸c, b»ng 8 (cm2) vµ g¸n cho biÕn DAY. LÖnh (5) in lªn mµn h×nh dßng ch÷ DIEN TICH TAM GIAC BANG vµ sau ®ã lµ gi¸ trÞ cña biÕn DAY. LÖnh (6) lµ lÖnh kÕt

29 30
thóc ch­¬ng tr×nh. Sinh viªn míi häc lËp tr×nh th­êng cã thÓ kh«ng hiÓu lÖnh thø n¨m, khi thÊy in diÖn tÝch h×nh tam gi¸c mµ l¹i in gi¸ trÞ cña biÕn DAY. Trong ®Çu hä
quen nghÜ khai b¸o DAY cã nghÜa DAY lµ ®é dµi c¹nh ®¸y tam gi¸c. Nh­ng nÕu hiÓu ®­îc r»ng lÖnh (1) khai b¸o REAL DAY, CAO thùc ra míi chØ dù ®Þnh dïng hai
tªn DAY vµ CAO ®Ó l­u c¸c sè thùc, kh«ng cÇn biÕt sè thùc ®ã b»ng bao nhiªu. ë ch­¬ng tr×nh trªn, khi lÖnh (2) thùc hiÖn xong th× trong biÕn DAY (trong « nhí cã tªn lµ
DAY) míi thùc sù cã sè 5,0, tøc ®é dµi ®¸y tam gi¸c. Nh­ng khi ch­¬ng tr×nh ch¹y xong lÖnh (4) th× trong biÕn DAY ®· lµ sè 8,0 chø kh«ng ph¶i lµ sè 5,0 n÷a. Vµ khi
thùc hiÖn xong lÖnh (5) th× trªn mµn h×nh sÏ in ®óng gi¸ trÞ diÖn tÝch tam gi¸c. N¾m v÷ng ®­îc ®iÒu nµy cã nghÜa lµ ®· hiÓu ®­îc ý nghÜa cña biÕn, tªn biÕn vµ tuÇn tù lµm
viÖc cña ch­¬ng tr×nh, tøc c¸c gi¸ trÞ ®­îc l­u trong m¸y tÝnh nh­ thÕ nµo trong khi ch­¬ng tr×nh ch¹y.
D­íi ®©y lµ hai lêi khuyªn ®Çu tiªn cã lÏ quan träng nhÊt ®èi víi sinh viªn míi häc lËp tr×nh:
1) Sau khi t×m hiÓu xong bµi to¸n cÇn gi¶i, ph¶i c©n nh¾c tõng ®¹i l­îng trong bµi to¸n cã kiÓu d÷ liÖu lµ sè nguyªn, sè thùc, ký tù v¨n b¶n... ®Ó ®Æt tªn vµ khai b¸o
kiÓu cho ®óng. Kinh nghiÖm cho thÊy r»ng sinh viªn nµo viÕt ®­îc nh÷ng lÖnh khai b¸o hÖ thèng c¸c tªn biÕn ®óng, võa ®ñ, s¸ng sña trong phÇn khai b¸o ë ®Çu ch­¬ng
tr×nh th× th­êng lµ sau ®ã viÕt ®­îc ch­¬ng tr×nh ®óng. Cßn nh÷ng sinh viªn kh«ng biÕt ®Æt tªn cho c¸c biÕn, võa b¾t tay vµo so¹n th¶o ch­¬ng tr×nh ®· loay hoay víi lÖnh
më file d÷ liÖu, tÝnh c¸i nµy c¸i kia, th× th­êng lµ kh«ng hiÓu g× vµ kh«ng bao giê lµm ®­îc bµi tËp.
2) Nªn tu©n thñ c¸ch ®Æt tªn cña Fortran chuÈn. Ta cã quyÒn chän nh÷ng ch÷ c¸i, ch÷ sè nµo ®Ó t¹o thµnh tªn lµ tïy ý, song nªn ®Æt tªn cã tÝnh gîi nhí ®Õn nh÷ng
®¹i l­îng t­¬ng øng trong bµi tËp. ThÝ dô, víi bµi to¸n võa nãi tíi trong môc nµy ta cã ba ®¹i l­îng lµ: ®é dµi c¹nh ®¸y, ®­êng cao vµ diÖn tÝch tam gi¸c. Nªn khai b¸o tªn
ba biÕn t­¬ng øng b»ng ba tõ t¾t cña tiÕng ViÖt víi lÖnh sau:
REAL DAY, CAO, DTICH
hoÆc b»ng ba tõ t¾t cña tiÕng Anh víi lÖnh:
REAL BASE, HEIGHT, SQRE
hoÆc b»ng ba ch÷ c¸i ®óng nh­ trong ®Çu ®Ò bµi tËp víi lÖnh:
REAL B, H, S
®Òu lµ nh÷ng lêi khai b¸o ®óng, dÔ hiÓu, trong ®ã lêi khai b¸o trªn cïng cã lÏ lµ tèt nhÊt, lêi khai b¸o sau cïng th× h¬i qu¸ ng¾n gän. Cßn víi cïng môc ®Ých khai b¸o mµ
dïng lÖnh sau ®©y th× mÆc dï kh«ng sai, nh­ng hoµn toµn kh«ng nªn, rÊt dÔ g©y nhÇm lÉn, mÖt mái trong khi kiÓm tra ch­¬ng tr×nh:
REAL X, IC, DT

2.3. BiÕn cã chØ sè (m¶ng)

2.3.1. Kh¸i niÖm m¶ng


M¶ng lµ tËp hîp cã s¾p xÕp cña c¸c ®¹i l­îng ®­îc ký hiÖu b»ng mét tªn duy nhÊt. C¸c thµnh phÇn cña tËp hîp gäi lµ nh÷ng phÇn tö m¶ng. Mçi phÇn tö ®­îc x¸c
®Þnh theo tªn cña m¶ng vµ vÞ trÝ cña phÇn tö ®ã trong m¶ng, tøc trÞ sè cña c¸c chØ sè. Tªn m¶ng ®­îc ®Æt tu©n theo quy t¾c nh­ tªn biÕn. C¸c chØ sè n»m trong dÊu ngoÆc

31 32
®¬n vµ nÕu cã h¬n mét chØ sè th× c¸c chØ sè ph¶i c¸ch nhau bëi dÊu ph¶y.
ThÝ dô: A(1), A(2), A(3) t­¬ng øng víi c¸ch viÕt th«ng th­êng cho c¸c biÕn a1 , a 2 , a3 trong to¸n häc. VËy ë ®©y ta ®· ®Æt cho tËp hîp c¶ 3 gi¸ trÞ nµy mét tªn chung
lµ A, nh­ng ®Ó chØ gi¸ trÞ thø nhÊt ta thªm chØ sè 1 vµo tªn - A(1), ®Ó chØ gi¸ trÞ thø hai ta thªm chØ sè 2 - A(2) vµ ®Ó chØ gi¸ trÞ thø ba ta thªm chØ sè 3 - A(3).
T­¬ng tù, c¸c phÇn tö cña ma trËn hai chiÒu trong ®¹i sè
 a11 a12 a13 
 
 a 21 a 22 a 23 
®­îc viÕt trong Fortran lµ A(1,1), A(1,2), A(1,3), A(2,1), A(2,2), A(2,3) (chØ sè thø nhÊt - sè hiÖu dßng, chØ sè thø hai - sè hiÖu cét).
Thªm mét thÝ dô n÷a vÒ m¶ng. Mét n¨m cã 12 th¸ng, mçi th¸ng cã mét tªn, thÝ dô trong tiÕng ViÖt: Th¸ng Giªng, Th¸ng Hai, ..., Th¸ng M­êi hai, trong tiÕng Anh:
January, February, ..., December. Ta hoµn toµn cã thÓ gép 12 tªn tiÕng Anh cña c¸c th¸ng trong n¨m vµo thµnh mét m¶ng cã tªn chung lµ EMONTH. VËy m¶ng
EMONTH sÏ lµ m¶ng cã 12 gi¸ trÞ (12 phÇn tö), mçi phÇn tö lµ mét tõ chØ tªn mét th¸ng. Khi nãi ®Õn January tøc lµ nãi tíi gi¸ trÞ thø nhÊt cña m¶ng EMONTH, ta viÕt
EMONTH(1), nãi ®Õn December lµ nãi tíi gi¸ trÞ thø 12 cña m¶ng EMONTH, ta viÕt EMONTH(12).
Trong Fortran IV, mét phiªn b¶n tr­íc ®©y cña ng«n ngò Fortran, cho phÐp dïng c¸c m¶ng tèi ®a 7 chØ sè. ChiÒu cña m¶ng øng víi sè chØ sè, cßn kÝch th­íc cña
m¶ng øng víi sè phÇn tö chøa trong m¶ng.
ChØ sè cña m¶ng cã thÓ ®­îc x¸c ®Þnh b»ng c¸c h»ng hoÆc biÕn nguyªn d­¬ng víi trÞ sè lín h¬n 0. Còng cã thÓ chØ sè x¸c ®Þnh b»ng biÓu thøc sè häc bÊt kú. NÕu
dïng biÓu thøc kiÓu thùc, th× sau khi tÝnh gi¸ trÞ cña biÓu thøc, gi¸ trÞ sè thùc ®­îc chuyÓn thµnh sè nguyªn, tøc c¾t bá phÇn thËp ph©n.
Trong môc 2.1 chóng ta ®· nãi vÒ c¸c kiÓu d÷ liÖu c¬ b¶n. Mçi mét biÕn kiÓu d÷ liÖu c¬ b¶n trong mét thêi ®iÓm ch¹y ch­¬ng tr×nh chØ l­u (chøa) ®­îc mét gi¸ trÞ.
B©y giê ta thÊy m¶ng lµ mét thÝ dô vÒ kiÓu d÷ liÖu míi cÊu t¹o tõ c¸c kiÓu c¬ b¶n - mét biÕn m¶ng trong mét thêi ®iÓm cã thÓ l­u ®­îc nhiÒu gi¸ trÞ sè nguyªn, sè thùc,
chuçi ký tù... Nh­ng cÇn l­u ý r»ng tÊt c¶ c¸c phÇn tö cña m¶ng, tøc tÊt c¶ c¸c gi¸ trÞ cña m¶ng ph¶i cã cïng kiÓu d÷ liÖu. ThÝ dô víi m¶ng EMONTH võa xÐt, ta kh«ng
thÓ ®­a mét gi¸ trÞ ký tù January vµo phÇn tö EMONTH(1) vµ sè thùc 1.27 vµo EMONTH(2).
M¶ng lµ mét yÕu tè rÊt quan träng trong Fortran. Sau nµy ta sÏ thÊy sö dông m¶ng trong ng«n ng÷ lËp tr×nh cã thÓ gióp viÕt nh÷ng ®o¹n ch­¬ng tr×nh rÊt ng¾n gän,
trong s¸ng. §Æc biÖt trong c¸c vßng lÆp, chØ b»ng vµi dßng lÖnh cã thÓ khiÕn m¸y tÝnh thùc hiÖn nhiÒu triÖu phÐp tÝnh sè häc.

2.3.2. M« t¶ m¶ng
M« t¶ m¶ng thùc hiÖn ngay ë ®Çu ch­¬ng tr×nh vµ chøa th«ng tin vÒ tªn, chiÒu vµ kÝch th­íc m¶ng víi to¸n tö DIMENSION:

DIMENSION A ( n1 , n2 , ..., nl ), MAT ( m1 , m2 , ..., mk )

trong ®ã A, MAT - tªn c¸c m¶ng; n1 , n 2 ,..., nl , m1 , m2 ,..., mk − c¸c giíi h¹n trªn cña c¸c chØ sè − chØ ra b»ng c¸c h»ng nguyªn d­¬ng (giíi h¹n d­íi lu«n b»ng 1 vµ
kh«ng cÇn chØ ®Þnh trong m« t¶).

33 34
Theo m« t¶ nµy, m¸y tÝnh sÏ giµnh trong bé nhí nh÷ng vïng ®Þa chØ ®Ó l­u tÊt c¶ c¸c phÇn tö cña c¸c m¶ng. C¸c phÇn tö cña m¶ng nhiÒu chiÒu ®­îc l­u liªn tiÕp
nhau sao cho chØ sè thø nhÊt biÕn ®æi nhanh nhÊt, chØ sè sau cïng biÕn ®æi chËm nhÊt.
Cã thÓ m« t¶ m¶ng b»ng c¸c lÖnh m« t¶ kiÓu hiÖn nh­ ®èi víi c¸c biÕn th«ng th­êng, thÝ dô:
REAL MAX, L(7), A(20,21)
Trong lÖnh m« t¶ nµy biÕn MAX ®­îc khai b¸o lµ biÕn sè thùc, cã thÓ gäi lµ biÕn ®¬n, cßn m¶ng L (biÕn cã chØ sè) lµ m¶ng mét chiÒu víi 7 phÇn tö sè thùc, m¶ng A
lµ m¶ng hai chiÒu (hai chØ sè) víi giíi h¹n trªn cña chØ sè thø nhÊt lµ 20, cña chØ sè thø hai lµ 21, nã gåm 420 phÇn tö.
V× c¸c giíi h¹n chØ sè (kÝch th­íc m¶ng) ph¶i ®­îc chØ ®Þnh tr­íc ë phÇn khai b¸o b»ng c¸c h»ng nguyªn d­¬ng, kh«ng thÓ lµ c¸c biÕn, nªn trong thùc tiÔn lËp tr×nh
ph¶i chó ý c©n nh¾c chän c¸c giíi h¹n chØ sè sao cho chóng kh«ng qu¸ lín lµm tèn bé nhí, nh­ng còng ph¶i võa ®ñ ®Ó biÓu diÔn hÕt c¸c phÇn tö cã thÓ cã cña m¶ng. ThÝ
dô cÇn biÓu diÔn mét b¶ng sè c¸c gi¸ trÞ nhiÖt ®é trung b×nh tõng th¸ng trong 100 n¨m th× ta khai b¸o m¶ng TEM(100,12) lµ hîp lý. NÕu dù ®Þnh gi¶i hÖ ph­¬ng tr×nh ®¹i
sè tuyÕn tÝnh kh«ng qu¸ 20 ph­¬ng tr×nh, ta nªn khai b¸o c¸c m¶ng REAL A(20,21), X(20) lµ võa ®ñ ®Ó biÓu diÔn ma trËn c¸c hÖ sè a i , j (kÓ c¶ c¸c hÖ sè tù do) vµ
c¸c nghiÖm x i . Víi m¶ng EMONTH võa nh¾c trong môc nµy th× lÖnh khai b¸o sau:
CHARACTER*9 EMONTH(12)
lµ hoµn toµn hîp lý v× mét n¨m chØ cã 12 th¸ng vµ tªn th¸ng dµi nhÊt (víi tiÕng Anh) lµ September gåm 9 ch÷ c¸i.

2.4. C¸c hµm chuÈn

Mét sè phÐp tÝnh nh­ lÊy c¨n bËc hai cña mét sè, tÝnh trÞ tuyÖt ®èi cña mét sè, tÝnh hµm sin cña mét gãc... th­êng xuyªn gÆp trong nhiÒu thuËt to¸n, nªn ®­îc x©y
dùng s½n thµnh c¸c hµm gäi lµ c¸c hµm riªng cã cña Fortran (intrinsic functions) hay cßn gäi lµ c¸c hµm chuÈn.
B¶ng 2.1 liÖt kª mét sè hµm chuÈn cña Fortran th­êng dïng trong s¸ch nµy.
Mçi hµm chuÈn cã mét tªn cña nã. Tªn cña hµm ®­îc tiÕp nèi víi ®Çu vµo, gäi lµ ®èi sè cña hµm, n»m trong cÆp dÊu ngoÆc ®¬n. §èi sè cña c¸c hµm chuÈn cã thÓ lµ
c¸c h»ng, biÕn, hay biÓu thøc. NÕu mét hµm cã nhiÒu ®èi sè th× c¸c ®èi sè ®­îc viÕt c¸ch nhau b»ng dÊu ph¶y. Khi cho c¸c gi¸ trÞ cô thÓ vµo c¸c ®èi sè th× hµm tÝnh ra
mét gi¸ trÞ cña hµm. V× vËy c¸c hµm th­êng dïng ®Ó tÝnh mét gi¸ trÞ nµo ®ã ®Ó g¸n vµo mét biÕn kh¸c, ng­êi ta gäi lµ gäi hµm ra ®Ó tÝnh. Hµm kh«ng bao giê cã mÆt ë
bªn tr¸i dÊu ‘ = ’ cña lÖnh g¸n.

B¶ng 2.1. Mét sè hµm chuÈn cña Fortran

Tªn hµm vµ
Gi¸ trÞ hµm
®èi sè

SQRT (X) x C¨n bËc hai cña x

35 36
ABS (X) x TrÞ tuyÖt ®èi cña x

SIN (X) sin(x ) x tÝnh b»ng ra®ian


COS (X) cos(x ) x tÝnh b»ng ra®ian
TAN (X) tg ( x) x tÝnh b»ng ra®ian
EXP (X) x
e e n©ng lªn luü thõa x
LOG (X) ln(x ) Logarit tù nhiªn cña x
LOG10 (X) lg( x ) Logarit c¬ sè 10 cña x
INT (X) ChuyÓn phÇn nguyªn cña sè thùc x thµnh sè nguyªn
REAL (I) Gi¸ trÞ thùc cña I (chuyÓn mét gi¸ trÞ nguyªn thµnh gi¸ trÞ thùc)
MOD (I,J) LÊy phÇn d­ nguyªn cña phÐp chia hai sè I / J

ThÝ dô, nh÷ng lÖnh sau ®©y gäi c¸c hµm ®Ó tÝnh mét sè gi¸ trÞ:

S = SIN (0.5)
TG = TAN (S)
C = COS (ANGLE * 3.141593 / 180.0)
Trong lÖnh thø nhÊt ta göi gi¸ trÞ h»ng 0,5 (ra®ian) cho ®èi sè cña hµm SIN ®Ó nã tÝnh ra gi¸ trÞ sin cña gãc 0,5 vµ g¸n gi¸ trÞ ®ã cho biÕn S. Trong lÖnh thø hai, ta ®·
göi gi¸ trÞ cña biÕn S vµo ®èi sè cña hµm TAN ®Ó tÝnh ra tang. Cßn trong lÖnh thø ba, ta ®· göi mét biÓu thøc vµo ®èi sè cña hµm COS ®Ó nã tÝnh ra gi¸ trÞ c«sin cña mét
gãc cã ®é lín b»ng gi¸ trÞ cña biÓu thøc ®ã. Trong tr­êng hîp nµy, m¸y tÝnh tr­íc hÕt ph¶i tÝnh (­íc l­îng) gi¸ trÞ cña biÓu thøc ®èi sè, sau ®ã míi tÝnh c«sin theo gi¸ trÞ
nhËn ®­îc.
ThÊy r»ng mét hµm biÓu diÔn mét gi¸ trÞ. Gi¸ trÞ nµy cã thÓ ®­îc dïng trong c¸c tÝnh to¸n kh¸c hoÆc l­u ë ®Þa chØ nhí kh¸c. Mét hµm chuÈn còng cã thÓ lµm ®èi sè
cña mét hµm chuÈn kh¸c:
XLG = LOG(ABS(X))
Trong Fortran cã mét sè hµm chuÈn cho ra gi¸ trÞ víi kiÓu cïng kiÓu víi ®èi sè cña m×nh, chóng ®­îc gäi lµ c¸c hµm tù sinh (generic function). ThÝ dô hµm ABS(X),
nÕu ®èi sè X lµ sè nguyªn th× gi¸ trÞ hµm ABS(X) còng lµ sè nguyªn, nÕu X lµ sè thùc - ABS(X) còng lµ sè thùc. Mét sè hµm chØ ®Þnh kiÓu cña ®Çu vµo vµ ®Çu ra. ThÝ dô
hµm IABS lµ hµm ®ßi hái ®èi sè nguyªn vµ cho ra gi¸ trÞ tuyÖt ®èi lµ sè nguyªn. Danh s¸ch ®Çy ®ñ h¬n vÒ c¸c hµm chuÈn cña Fortran ®­îc dÉn trong phô lôc 1.
Khi dïng mét hµm chuÈn nµo ®ã ph¶i ®äc kü lêi m« t¶ xem nã tÝnh ra gi¸ trÞ g×, ®iÒu kiÖn cña c¸c ®èi sè ra sao. ThÝ dô c¸c hµm l­îng gi¸c ph¶i dïng ®èi sè lµ
ra®ian, nÕu ta cho gi¸ trÞ ®èi sè lµ ®é th× kÕt qu¶ tÝnh sÏ sai.

37 38
2.5. LÖnh g¸n vµ c¸c to¸n tö sè häc

2.5.1. LÖnh g¸n


C¸c tÝnh to¸n trong Fortran cã thÓ chØ ®Þnh b»ng lÖnh g¸n víi d¹ng tæng qu¸t nh­ sau:

Tªn biÕn = BiÓu thøc


Bªn tr¸i dÊu lÖnh g¸n (dÊu =) lµ tªn mét biÕn. BiÓu thøc bªn ph¶i cã thÓ lµ mét h»ng, mét biÕn, mét biÓu thøc sè häc gåm c¸c to¸n tö sè häc (b¶ng 2.2) thùc hiÖn
gi÷a c¸c to¸n h¹ng lµ c¸c h»ng, biÕn vµ hµm chuÈn hay mét biÓu thøc l«gic. Khi thùc hiÖn lÖnh g¸n, tr­íc hÕt m¸y ­íc l­îng (tÝnh) gi¸ trÞ cña biÓu thøc bªn ph¶i, råi g¸n
gi¸ trÞ ®ã cho biÕn bªn tr¸i, tøc l­u gi¸ trÞ tÝnh ®­îc cña biÓu thøc bªn ph¶i vµo ®Þa chØ nhí cã tªn biÕn bªn tr¸i. KiÓu d÷ liÖu cña biÕn vµ cña biÓu thøc ph¶i phï hîp.
ThÝ dô c¸c lÖnh g¸n:
PI = 3.141593
S = PI * BKINH **2
I = I +1
LÖnh thø nhÊt g¸n h»ng sè 3,141593 cho biÕn cã tªn lµ PI. LÖnh thø hai g¸n gi¸ trÞ cña biÓu thøc PI × ( BKINH ) 2 cho biÕn cã tªn lµ S. LÖnh thø ba lÊy gi¸ trÞ hiÖn t¹i cña
biÕn I céng thªm mét ®¬n vÞ vµ l¹i g¸n cho chÝnh biÕn I.
ë trªn ®· nãi, kiÓu d÷ liÖu cña biÕn vµ cña biÓu thøc ph¶i phï hîp. Tr­êng hîp biÕn bªn tr¸i lµ biÕn thùc, cßn biÓu thøc bªn ph¶i lµ gi¸ trÞ nguyªn th× m¸y tÝnh sÏ
chuyÓn gi¸ trÞ nguyªn ®ã thµnh gi¸ trÞ thùc (sè thùc víi phÇn thËp ph©n b»ng kh«ng) råi míi g¸n cho biÕn. Khi biÕn bªn tr¸i lµ biÕn nguyªn, biÓu thøc bªn ph¶i cã gi¸ trÞ
thùc, th× m¸y tÝnh c¾t bá phÇn thËp ph©n cña gi¸ trÞ thùc, ®æi sè thùc nhËn ®­îc thµnh sè nguyªn råi míi g¸n nã cho biÕn nguyªn. C¸c tr­êng hîp g¸n sai kh¸c ch­¬ng
tr×nh dÞch sÏ b¸o lçi.
Kh«ng nªn quan niÖm lÖnh g¸n nh­ dÊu b»ng trong to¸n häc.

2.5.2. C¸c phÐp tÝnh sè häc ®¬n gi¶n


C¸c phÐp tÝnh sè häc hay cßn gäi lµ c¸c to¸n tö sè häc gåm cã c¸c phÐp tÝnh céng, trõ, nh©n, chia vµ n©ng lªn luü thõa ®­îc ký hiÖu b»ng c¸c to¸n tö trong Fortran
nh­ trong b¶ng 2.2.
Gäi lµ nh÷ng phÐp tÝnh sè häc bëi v× c¸c to¸n h¹ng cña c¸c phÐp tÝnh lµ nh÷ng gi¸ trÞ sè, thÝ dô sè nguyªn, sè thùc, sè phøc. Sau nµy chóng ta sÏ thÊy m¸y tÝnh cã thÓ
tÝnh to¸n víi nh÷ng gi¸ trÞ kiÓu kh¸c nh­ gi¸ trÞ l«gic, gi¸ trÞ v¨n b¶n...

B¶ng 2.2. C¸c phÐp tÝnh sè häc

39 40
PhÐp tÝnh D¹ng ®¹i sè Trong Fortran

Céng A+B A+B


Trõ A−B A−B
Nh©n A× B A*B
A
Chia A/B
B
Luü thõa A
3 A** 3

2.5.3. ¦íc l­îng biÓu thøc sè häc


Khi tÝnh gi¸ trÞ cña biÓu thøc sè häc, nÕu biÓu thøc ®ã gåm nhiÒu phÐp tÝnh ®¬n, th× m¸y sÏ tÝnh to¸n tõng phÐp tÝnh ®¬n ®Ó nhËn c¸c kÕt qu¶ trung gian, sau ®ã tÝnh
gi¸ trÞ cuèi cïng cña biÓu thøc gäi lµ ­íc l­îng. Møc ­u tiªn khi ­íc l­îng gi¸ trÞ cña mét biÓu thøc sè häc gåm nhiÒu phÐp tÝnh ®¬n nªu trong b¶ng 2.3.
NÕu dÊu ©m ®øng tr­íc tªn biÕn ®Çu tiªn trong biÓu thøc, th× nã ®­îc tÝnh víi cïng møc ­u tiªn nh­ phÐp trõ. ThÝ dô: −A**2 b»ng −(A**2), −A*B b»ng −(A*B) vµ
−A+B b»ng (−A)+B.

B¶ng 2.3. Møc ­u tiªn c¸c phÐp tÝnh sè häc

¦u tiªn PhÐp tÝnh


1 DÊu ngoÆc
2 N©ng lªn luü thõa
3 Nh©n vµ chia
4 Céng vµ trõ

Khi c¸c phÐp tÝnh ë cïng møc ­u tiªn th× tÊt c¶ c¸c phÐp tÝnh ®­îc thùc hiÖn tõ tr¸i sang ph¶i, thÝ dô:
B − C + D ®­îc ­íc l­îng b»ng (B − C) + D
Riªng phÐp n©ng lªn luü thõa th× thùc hiÖn tõ ph¶i sang tr¸i:
A ** B ** C ®­îc ­íc l­îng b»ng A ** (B ** C)
ThÝ dô: 2 * *3 * *2 b»ng 2 9 hay 512 chø kh«ng ph¶i lµ
(2 * *3) * *2 = 82 = 64 .

41 42
2.5.4. Kh¸i niÖm vÒ c¾t vµ c¸c phÐp tÝnh hçn hîp
Khi mét phÐp tÝnh sè häc thùc hiÖn víi hai sè thùc th× ®­a ra kÕt qu¶ lµ gi¸ trÞ thùc. ThÝ dô, khi tÝnh chu vi h×nh trßn víi ®­êng kÝnh DKINH lµ sè thùc, ta cã thÓ
dïng mét trong hai lÖnh sau:
CHUVI = PI * DKINH
CHUVI = 3.141593 * DKINH
PhÐp tÝnh sè häc gi÷a hai sè nguyªn cho ra kÕt qu¶ lµ sè nguyªn. ThÝ dô, cho hai sè nguyªn I vµ J, trong ®ã I nhá h¬n hoÆc b»ng J, tÝnh sè sè nguyªn INTERV n»m
trong kho¶ng [I, J] cã thÓ thùc hiÖn b»ng lÖnh:
INTERV = J − I + 1
Gi¶ sö SIDE biÓu diÔn gi¸ trÞ thùc vµ LENGTH biÓu diÔn gi¸ trÞ nguyªn. B©y giê xÐt lÖnh:
LENGTH = SIDE * 3.5
PhÐp tÝnh nh©n gi÷a hai gi¸ trÞ thùc sÏ cho kÕt qu¶ sè thùc. Tuy nhiªn, gi¸ trÞ thùc ®­îc l­u vµo biÕn nguyªn. Khi ®ã m¸y tÝnh sÏ bá qua phÇn thËp ph©n vµ chØ l­u
phÇn nguyªn cña sè thùc; kiÓu lµm trßn nµy gäi lµ c¾t, nã kh¸c víi lµm trßn th«ng th­êng cho kÕt qu¶ lµ sè nguyªn gÇn nhÊt víi gi¸ trÞ cña sè thùc.
Khi c¸c phÐp tÝnh sè häc thùc hiÖn gi÷a c¸c biÕn cã kiÓu kh¸c nhau (hçn hîp) th­êng cho kÕt qu¶ rÊt bÊt ngê. Ta xÐt thÝ dô tÝnh thÓ tÝch V cña h×nh cÇu b¸n kÝnh
thùc R. NÕu dïng lÖnh:
V = (4/3)*3.141593*R**3
ta sÏ thu ®­îc kÕt qu¶ sai do nguyªn nh©n phÐp chia hai sè nguyªn 4/3 cho gi¸ trÞ trung gian b»ng 1, kh«ng ph¶i 1,333333. Do ®ã, lÖnh ®óng ®Ó tÝnh V sÏ lµ:
V = (4./3.)*3.141593*R**3
V× c¸c phÐp tÝnh hçn hîp ®«i khi cho kÕt qu¶ bÊt ngê, ta nªn cè g¾ng tr¸nh dïng nh÷ng biÓu thøc sè häc cã phÐp tÝnh hçn hîp.

2.5.5. Kh¸i niÖm vÒ sè qu¸ bÐ vµ sè qu¸ lín (underflow vµ overflow)


V× c¸c gi¸ trÞ lín nhÊt vµ bÐ nhÊt cã thÓ l­u trong mét biÕn tuú thuéc vµo chÝnh hÖ m¸y tÝnh, mét phÐp tÝnh cã thÓ ®­a ra kÕt qu¶ qu¸ lín hoÆc qu¸ bÐ. XÐt c¸c thÝ dô
sau:
1) X = 0.25E20 2) A = 0.25E−20
Y = 0.10E30 B = 0.10E+20
Z=X*Y C=A/B
KÕt qu¶ sè cña phÐp nh©n trong thÝ dô 1 b»ng 0.25E49, râ rµng lµ cã thÓ qu¸ lín, kh«ng l­u gi÷ ®­îc trong m¸y tÝnh víi bËc cùc ®¹i lµ 38, cßn kÕt qu¶ sè cña phÐp
chia trong thÝ dô 2 b»ng 0.25E−49 sÏ qu¸ bÐ. Trong nh÷ng tr­êng hîp nµy c¸c lÖnh Fortran hoµn toµn ®óng, nh­ng lçi sÏ ph¸t sinh khi ch¹y ch­¬ng tr×nh. C¸c lçi do bËc

43 44
qu¸ lín hoÆc qu¸ bÐ th­êng bÞ g©y bëi nh÷ng lçi ë nh÷ng ®o¹n tr­íc cña ch­¬ng tr×nh, thÝ dô mét biÕn ch­a ®­îc g¸n gi¸ trÞ ®óng l¹i cã mÆt trong biÓu thøc sè häc.

Bµi tËp
1. H·y biÓu diÔn thµnh d¹ng F vµ d¹ng E nh÷ng sè thùc sau:
d) 2,5 × 10
3
a) 3,14 b) 3,141593 c) 0,0026

e) −14,0 g) 6,023 × 10
23
f) 28,34
2. X¸c ®Þnh nh÷ng tªn sai trong nh÷ng tªn sau ®©y:
a) AVERG b) PTBACHAI c) REAL
d) 2LOG ®) GPTB2 e) HS-A1
f) X1 g) THANG*1 h) MONTH2

3. ViÕt thµnh d¹ng Fortran nh÷ng biÓu thøc tÝnh sau ®©y:
a) ThÓ tÝch V cña h×nh cÇu theo c«ng thøc
4
V = π R 3 ( R − b¸n kÝnh).
3
b) Hai nghiÖm x1 vµ x 2 cña ph­¬ng tr×nh bËc hai

− b ± b 2 − 4ac
x1, 2 = ( a, b, c − c¸c hÖ sè cña ph­¬ng tr×nh)
2a
c) Gi¸ trÞ hµm
1 2
y= sin x cos( 2 x − 1 2 ) (khi x cho b»ng ®é).
2
d) Gi¸ trÞ hµm mËt ®é ph©n bè Gauss
x2
1 −
F ( x) = e 2

e) Thªm mét ®¬n vÞ vµo biÕn nguyªn I vµ l­u vµo biÕn I
f) Kho¶ng c¸ch DIST gi÷a hai ®iÓm A vµ B nÕu biÕt c¸c to¹ ®é t­¬ng øng cña hai ®iÓm ®ã lµ ( x a , y a ), ( xb , y b ) .

45 46
4. ¦íc l­îng gi¸ trÞ cña c¸c biÓu thøc Fortran sau ®©y:
4/3*3.141593*(3/2)**3
SQRT (I+I/2) (nÕu I = 1)
SIN ((30/180)*PI) (nÕu PI = 3.141593)
COS (60/180*3.141593)

5. H·y ®äc chÝnh x¸c b»ng ng«n ng÷ Fortran nh÷ng lÖnh viÕt d­íi ®©y:
a) I = I + K +1
b) SS = 0.5 * SIN (A*3.1416 / 180.)
c) ERR = ABS (X1 - X2)

6. Hai ®o¹n ch­¬ng tr×nh sau nh»m tÝnh trÞ sè trung b×nh A cña ba sè nguyªn i1 = 1, i 2 = 2, i3 = 3 vµ in kÕt qu¶ lªn mµn h×nh. H·y thö xem kÕt qu¶ cã ®óng kh«ng.
NÕu thÊy sai th× chØ ra t¹i sao vµ kh¾c phôc b»ng c¸ch nµo?

a) I1 = 1
I2 = 2
I3 = 3
PRINT 4 , (I1 + I2 + I3)/3
4 FORMAT (1X, ' A = ',F4.1)

b) I1 = 1
I2 = 2
I3 = 3
PRINT 2, 1/3*(I1+I2+I3)
2 FORMAT (3X, F4.1)

7. Gi¶ sö c¸c cung ®Þa lý (t¸m cung) ®­îc ®¸nh sè hiÖu theo qui ­íc nh­ sau: 1 - b¾c; 2 - ®«ng b¾c; 3 - ®«ng; 4 - ®«ng nam; 5 - nam; 6 - t©y nam; 7 - t©y; 8 - t©y b¾c.
H­íng giã quan tr¾c ®­îc b»ng 165o. H·y viÕt biÓu thøc Fortran ®Ó tÝnh sè hiÖu cung cña h­íng giã ®ã.

47 48
Ch­¬ng 3
NhËp vµ xuÊt d÷ liÖu ®¬n gi¶n

3.1. C¸c lÖnh xuÊt vµ nhËp d÷ liÖu

M¸y tÝnh cã thÓ nhËp d÷ liÖu tõ c¸c nguån, c¸c thiÕt bÞ kh¸c nhau. T­¬ng tù, ta còng cã thÓ h­íng sù xuÊt d÷ liÖu ra c¸c thiÕt bÞ kh¸c nhau. Trong ch­¬ng nµy, ta xÐt
c¸ch nhËp d÷ liÖu tõ bµn phÝm vµ xuÊt d÷ liÖu ra mµn h×nh hoÆc m¸y in. ViÖc xuÊt vµ nhËp d÷ liÖu cã dïng c¸c file d÷ liÖu sÏ ®­îc xÐt trong ch­¬ng 6.
LÖnh xuÊt d÷ liÖu ®Þnh h­íng ra mµn h×nh:

PRINT * , Danh s¸ch c¸c môc in


LÖnh nhËp d÷ liÖu tõ bµn phÝm:

READ * , Danh s¸ch c¸c biÕn

C¸c môc in trong lÖnh in cã thÓ lµ mét h»ng, mét biÕn, mét biÓu thøc. NÕu trong danh s¸ch c¸c môc in cã tõ hai môc trë lªn, th× c¸c môc ph¶i c¸ch nhau bëi dÊu
ph¶y. Trong danh s¸ch c¸c biÕn cña lÖnh nhËp (®äc) d÷ liÖu, nÕu cã h¬n mét biÕn cÇn ®äc d÷ liÖu, th× nh÷ng biÕn ®ã ph¶i ®­îc liÖt kª c¸ch nhau bëi dÊu ph¶y. C¸c môc
®­îc in ra trªn mét dßng mµn h×nh theo thø tù ®­îc liÖt kª trong danh s¸ch. NÕu trong danh s¸ch kh«ng cã mét môc in nµo, th× m¸y tÝnh chØ ®¬n gi¶n lµ xuèng mét dßng
trªn mµn h×nh. ThÝ dô, xÐt ®o¹n ch­¬ng tr×nh sau ®©y:
GOC = 30.0
PRINT* , ' Khi X = ', GOC , ' 1/2 SinX = ', 0.5 * SIN (GOC *
* 3.141593 / 180.)
Ghi chó: Trong lÖnh PRINT võa råi cã mét dÊu nèi dßng. ë ®©y ®· dïng dÊu hoa thÞ bªn trong h×nh nh÷ nhËt nhá * ®Ó ph©n biÖt víi dÊu hoa thÞ b×nh th­êng lµ ký
hiÖu cña phÐp tÝnh nh©n. Tõ nay vÒ sau trong s¸ch nµy ë nh÷ng dßng lÖnh nµo cã dÊu nèi dßng sÏ quy ­íc dïng ký hiÖu nµy. Cßn khi so¹n ch­¬ng tr×nh trªn mµn h×nh
m¸y tÝnh, th× nh­ ®· nãi trong môc 1.5, chóng 1 ta chØ cÇn viÕt dÊu hoa thÞ vµo vÞ trÝ thø 6 cña dßng lÖnh.
Ta thÊy trong danh s¸ch c¸c môc in cña lÖnh PRINT cã 4 môc liÖt kª theo thø tù lµ:
1) Côm ch÷ ' Khi X ='
2) BiÕn cã tªn lµ GOC l­u gi¸ trÞ 30°
3) Côm ch÷ ' 1/2 SinX ='
4) BiÓu thøc

49 50
0.5 * SIN (GOC * 3.141593 / 180.0)
biÓu thÞ nöa sin cña gãc 30° ®· ®æi thµnh ra®ian.
Nh­ vËy, môc in thø nhÊt vµ thø ba lµ nh÷ng h»ng v¨n b¶n, môc in thø 2 lµ gi¸ trÞ cña biÕn sè thùc GOC vµ môc in thø t­ lµ mét biÓu thøc sè thùc. Tr­íc khi in môc
thø t­, m¸y tÝnh ph¶i tÝnh gi¸ trÞ cña biÓu thøc nµy (b»ng 0,25), råi sau ®ã míi in gi¸ trÞ ®ã lªn mµn h×nh. KÕt qu¶ trªn mµn h×nh sÏ nh­ sau:

Khi X = 30.00000 1/2 SinX =


0.2500000
H·y chó ý r»ng víi lÖnh PRINT * trªn ®©y c¸c môc in lµ nh÷ng côm d÷ liÖu v¨n b¶n ®­îc in ra ®óng nh­ ta nh×n thÊy trong dßng lÖnh, tõng ký tù mét, kÓ c¶ dÊu
trèng. C¸c gi¸ trÞ cña biÕn vµ biÓu thøc thùc ®­îc in ra sau mét kho¶ng trèng vµ sè nh÷ng ch÷ sè cã nghÜa sau dÊu chÊm thËp ph©n kh¸c nhau. NÕu gi¸ trÞ cña c¸c biÕn lµ
nh÷ng sè kh¸ nhá hoÆc kh¸ lín, th× m¸y sÏ in ra nh÷ng gi¸ trÞ ®ã d­íi d¹ng biÓu diÔn E hoÆc D (xem môc 2.1). KiÓu in d÷ liÖu nh­ trªn gäi lµ in kh«ng ®­îc ®Þnh d¹ng
hay in kh«ng cã format.
Chó ý r»ng, trong READ *, sau dÊu ph¶y lµ danh s¸ch c¸c biÕn, khi thùc hiÖn lÖnh nµy, m¸y tÝnh chê ta gâ tõ bµn phÝm nh÷ng gi¸ trÞ (c¸c ký tù v¨n b¶n, sè nguyªn,
sè thùc...) t­¬ng xøng vÒ kiÓu víi danh s¸ch biÕn, mçi gi¸ trÞ c¸ch nhau mét dÊu ph¶y hay Ýt nhÊt mét dÊu trèng, riªng nh÷ng ký tù v¨n b¶n ph¶i n»m trong cÆp dÊu nh¸y
trªn (' '). KÕt thóc danh s¸ch c¸c gi¸ trÞ ph¶i gâ lÖnh phÝm Enter (↵). M¸y tÝnh sÏ tuÇn tù g¸n nh÷ng gi¸ trÞ nhËn tõ bµn phÝm vµo nh÷ng biÕn t­¬ng øng trong danh s¸ch
biÕn cña lÖng READ. NÕu ta gâ ch­a ®ñ sè gi¸ trÞ theo danh s¸ch biÕn, th× m¸y chê ta gâ cho ®Õn khi ®ñ c¸c gi¸ trÞ míi kÕt thóc thùc hiÖn lÖnh READ. NÕu kiÓu d÷ liÖu
gâ vµo sai so víi kiÓu d÷ liÖu cña biÕn, th× lËp tøc ch­¬ng tr×nh ngõng thùc hiÖn vµ b¸o lçi ch¹y ch­¬ng tr×nh. ThÝ dô lÖnh
READ * , I , NAM , TEMP , GHICHU
®ßi hái ta gâ vµo tõ bµn phÝm mét sè nguyªn cho biÕn I, mét sè nguyªn n÷a cho biÕn NAM vµ mét sè thùc cho biÕn TEMP, mét x©u ký tù cho biÕn v¨n b¶n GHICHU,
muèn nhËp ®óng yªu cÇu ta cã thÓ gâ vµo bµn phÝm nh­ sau:

1 1982 25.36 'SL quan trac' ↵ hay 1,1982,25.36,'SL quan trac' ↵.

LÖnh in cã quy c¸ch (cã ®Þnh d¹ng):

PRINT k , Danh s¸ch c¸c môc in


Còng gièng nh­ lÖnh in kh«ng ®Þnh d¹ng, danh s¸ch c¸c môc in chØ ra nh÷ng h»ng, biÕn hay c¸c biÓu thøc cÇn in theo thø tù liÖt kª. Tham sè k nguyªn d­¬ng chØ
tíi nh·n cña lÖnh FORMAT m« t¶ quy c¸ch in th«ng tin ra mµn h×nh nh­ vÞ trÝ in, kho¶ng c¸ch gi÷a c¸c môc in, sè ch÷ sè thËp ph©n cÇn in ®èi víi gi¸ trÞ sè thùc... D¹ng
tæng qu¸t cña lÖnh FORMAT nh­ sau:

k FORMAT (Danh s¸ch c¸c ®Æc t¶)

51 52
trong ®ã k lµ nh·n cña dßng lÖnh FORMAT. Danh s¸ch c¸c ®Æc t¶ n»m trong cÆp dÊu ngoÆc ®¬n b¸o cho m¸y tÝnh biÕt vÒ c¸ch d·n dßng theo chiÒu th¼ng ®øng vµ bè trÝ
c¸c ký tù trong dßng th«ng tin in ra. NÕu in ra trªn giÊy m¸y in, th× tuú chän d·n dßng b¸o cho m¸y in ®iÒu khiÓn kÐo giÊy ®Ó in sang ®Çu trang míi, xuèng dßng míi,
xuèng hai dßng míi hay in ngay trªn dßng hiÖn thêi... M¸y tÝnh sÏ thiÕt lËp mçi dßng in bªn trong bé nhí tr­íc khi thùc sù in dßng ®ã lªn giÊy. Vïng bé nhí bªn trong
®ã gäi lµ vïng ®Öm buffer. Nh÷ng ký tù ®Çu tiªn trong vïng buffer gäi lµ ký tù ®iÒu khiÓn kÐo giÊy cña m¸y in cã nh÷ng ý nghÜa nh­ sau:

1 Sang trang míi


DÊu trèng Xuèng mét dßng
0 Xuèng hai dßng
+ Kh«ng xuèng dßng

B©y giê ta lµm quen víi nh÷ng ®Æc t¶ ®¬n gi¶n sau ®©y. Trong ch­¬ng 4 sÏ cßn trë l¹i vÊn ®Ò ®Þnh d¹ng phøc t¹p h¬n khi lµm viÖc víi c¸c file d÷ liÖu.

3.2. C¸c ®Æc t¶ trong lÖnh FORMAT

1) C¸c ®Æc t¶ v¨n b¶n th­êng dïng ®Ó xuÊt d÷ liÖu lµ nh÷ng ký tù, c¸c ®o¹n v¨n b¶n, hay dïng in tiªu ®Ò c¸c b¸o c¸o. §Æc t¶ v¨n b¶n cho phÐp ®­a c¸c ký tù trùc
tiÕp vµo buffer. C¸c ký tù ph¶i n»m trong cÆp dÊu nh¸y trªn hay dÊu ngoÆc kÐp. ThÝ dô:
PRINT 4
4 FORMAT ('1' , 'KET QUA THI NGHIEM')
Ta còng cã thÓ dïng ®Æc t¶ w H trong ®ã w − sè vÞ trÝ ®Ó xuÊt d÷ liÖu v¨n b¶n. ThÝ dô
PRINT 5 , Y
5 FORMAT (16H TICH PHAN BANG , F9.3)

2) §Æc t¶ n X sÏ chÌn n dÊu trèng vµo b¶n ghi, th­êng dïng ®Ó c¨n gi÷a c¸c tiªu ®Ò b¸o c¸o, thÝ dô:
PRINT 35
35 FORMAT ('1' , 25X , 'THI NGHIEM SO 1')

3) §Æc t¶ A w dïng cho c¸c h»ng vµ biÕn x©u ký tù, c¸c th«ng tin v¨n b¶n, tuú chän w b¸o cho m¸y tÝnh sè vÞ trÝ giµnh cho mét biÕn x©u ký tù (v¨n b¶n) cÇn in.
Môc v¨n b¶n in ra c¨n lÒ bªn tr¸i.

4) §Æc t¶ I w dïng cho sè nguyªn, trong ®ã w sè vÞ trÝ dïng ®Ó in gi¸ trÞ sè nguyªn.

53 54
5) §Æc t¶ F w . d dïng biÓu diÔn d¹ng thËp ph©n cña sè thùc, w − tæng sè vÞ trÝ dµnh cho sè thùc kÓ c¶ dÊu chÊm thËp ph©n, d − sè ch÷ sè thËp ph©n sau dÊu chÊm.
Trong hai ®Æc t¶ I w vµ F w . d c¸c sè in ra ®­îc c¨n lÒ bªn ph¶i. NÕu ®Æc t¶ thiÕu vÞ trÝ ®Ó biÓu diÔn gi¸ trÞ, th× gi¸ trÞ sè sÏ kh«ng ®­îc in ra, mµ t¹i c¸c vÞ trÝ in sÏ xuÊt
hiÖn c¸c dÊu sao (*) ®Ó b¸o hiÖu cho ta biÕt r»ng ®Æc t¶ cña lÖnh FORMAT kh«ng phï hîp, cÊp thiÕu vÞ trÝ so víi gi¸ trÞ cña ®¹i l­îng cÇn in.

6) §Æc t¶ E w . d dïng ghi ra d­íi d¹ng luü thõa nh÷ng gi¸ trÞ rÊt lín hoÆc rÊt nhá vµ khi ta ch­a h×nh dung râ vÒ ®é lín cña ®¹i l­îng.
Th«ng th­êng hai lÖnh PRINT vµ FORMAT ®i kÌm gÇn nhau. ThÝ dô:
PRINT 5 , I, NAM, TEMP, GHICHU
5 FORMAT (1X, I3, I8, F10.2, 1X, A20)

Sau lÖnh READ vµ c¸c d÷ liÖu ®­îc gâ vµo tõ bµn phÝm ®· nãi trong môc 3.2.1, th× kÕt qu¶ cÆp lÖnh in nµy trªn mµn h×nh sÏ nh­ sau:

1 1982 25.36 SL
quan trac

7) C¸c ®Æc t¶ A w , I w , F w . d vµ E w . d còng dïng víi lÖnh ®äc sè liÖu.

8) §èi víi c¸c gi¸ trÞ l«gic trong Fortran dïng ®Æc t¶ L w , trong ®ã w − sè vÞ trÝ giµnh cho d÷ liÖu. ThÝ dô theo lÖnh
16 FORMAT (L5)
nÕu t¹i mét trong 5 vÞ trÝ giµnh cho biÕn cã ch÷ T, th× gi¸ trÞ .TRUE. sÏ ®­îc g¸n vµo biÕn l«gic trong lÖnh ®äc. Khi xuÊt, ch÷ c¸i T hoÆc F (t­¬ng øng víi .TRUE. hoÆc
.FALSE. sÏ in ra t¹i vÞ trÝ thø 5, tøc vÞ trÝ cuèi cïng bªn ph¶i trong 5 vÞ trÝ.
9) Chóng ta cã thÓ sö dông mét sè ®Æc ®iÓm bæ sung trong c¸ch viÕt c¸c ®Æc t¶ cña lÖnh FORMAT nh»m n©ng cao chÊt l­îng b¶n ghi, theo ®óng ý ®Þnh biÓu diÔn
cña m×nh hay lµm cho lÖnh FORMAT tr«ng ng¾n gän. Cã thÓ dïng nh÷ng c¸ch d­íi ®©y:
C¸ch viÕt lÆp l¹i c¸c ®Æc t¶: ThÝ dô nh÷ng cÆp lÖnh sau ®©y hoµn toµn t­¬ng ®­¬ng:
10 FORMAT (3X, I2, 3X, I2)
10 FORMAT (2 (3X, I2))
20 FORMAT (1X, F4.1, F4.1, 1X, I3, 1X, I3, 1X, I3)
20 FORMAT (1X, 2F4.1, 3 (1X, I3))
Dïng dÊu g¹ch chÐo (/) trong lÖnh FORMAT chØ kÕt thóc dßng in tr­íc khi b¾t ®Çu c¸c ®Æc t¶ sau nã. ThÝ dô, khi cÇn in dßng tiªu ®Ò cña mét b¶ng sè cïng víi
nh÷ng tiªu ®Ò cét, chóng ta cã thÓ dïng:
PRINT 5

55 56
5 FORMAT (1X, 'KET QUA QUAN TRAC' // 2X, 'Gio', 3X,
* 'Toc do', 3X, 'Huong')

Sau khi in xong ®o¹n v¨n b¶n KET QUA QUAN TRAC, dÊu g¹ch chÐo thø nhÊt chØ dÉn cho m¸y kÕt thóc dßng, xuèng dßng míi, dÊu g¹ch chÐo thø hai chØ dÉn bá
qua ngay dßng nµy kh«ng in, ph¸t sinh ra mét dßng trèng tr­íc khi in c¸c tiªu ®Ò cét ë dßng thø ba nh­ ta thÊy d­íi ®©y:

K ET Q U A Q U A N T R A C

G io To c do H uong

Dïng ®Æc t¶ b¶ng T, TR, TL ®Ó c¨n lÒ tr¸i c¸c tiªu ®Ò cét mét b¶ng sè. ThÝ dô c¸c cÆp lÖnh cïng nh·n sau ®©y sÏ lµ t­¬ng ®­¬ng víi nhau:
600 FORMAT (F6.1, 15X, I7)
600 FORMAT (F6.1, T22, I7)
ë lÖnh thø hai: sau khi ghi ra sè thùc víi 6 vÞ trÝ, nh¶y ngay tíi vÞ trÝ 22 ®Ó b¾t ®Çu ghi sè nguyªn.
85 FORMAT (1X, 25X, 'Do cao', 5X, 'Huong')
85 FORMAT (T27, 'Do cao', TR5, 'Huong')
ë lÖnh thø hai: nh¶y ngay tíi vÞ trÝ thø 27 ®Ó ghi tiªu ®Ò "Do cao", sau ®ã do cã ®Æc t¶ TR5 xuÊt ph¸t tõ vÞ trÝ hiÖn thêi sÏ nh¶y sang ph¶i 5 vÞ trÝ ®Ó ghi tiªu ®Ò "Huong".
§Æc t¶ \ cã t¸c dông ng¨n kh«ng xuèng dßng trong mét lÖnh in hoÆc ®äc. Cã thÓ dïng ®Æc t¶ nµy trong tr­êng hîp muèn viÕt mét lêi nh¾c yªu cÇu ng­êi dïng nhËp
th«ng tin tõ bµn phÝm nh­ng sau khi viÕt lêi nh¾c th× kh«ng xuèng dßng, con nh¸y ®øng trªn cïng dßng ngay sau lêi nh¾c chê ng­êi dïng nhËp th«ng tin tõ bµn phÝm theo
yªu cÇu cña lÖnh ®äc. ThÝ dô nhãm lÖnh sau ®©y sÏ lµm chøc n¨ng ®ã:
PRINT 7
7 FORMAT (1X, 'Ten file so lieu: ', \)
READ (*, '(A50)') NAME
VÒ sè l­ îng c¸c ®Æc t¶: Khi sè c¸c ®Æc t¶ nhiÒu h¬n sè môc trong danh s¸ch c¸c môc in, thÝ dô:
PRINT 1, TOCDO, KHOANG
1 FORMAT (4 F5.2)
m¸y sÏ chän lÊy sè tèi ®a c¸c ®Æc t¶ cÇn dïng, sè ®Æc t¶ cßn l¹i bÞ bá qua. Trong tr­êng hîp nµy lÖnh in cã 2 môc in - 2 gi¸ trÞ sè thùc, nh­ng lÖnh FORMAT cã 4 ®Æc t¶
sè thùc, nh­ vËy sè ®Æc t¶ lµ thõa. M¸y sÏ chän lÊy hai ®Æc t¶ vµ in b×nh th­êng nh­ chóng ta mong muèn.

57 58
Khi sè ®Æc t¶ Ýt h¬n sè môc in, thÝ dô trong lÖnh in sau:
PRINT 20, TEM, VOL
20 FORMAT (1X, f6.2)
Trong tr­êng hîp nµy m¸y c¨n c¸c môc in vµ ®Æc t¶ cho ®Õn hÕt danh s¸ch ®Æc t¶, sau ®ã cã thÓ x¶y ra hai kh¶ n¨ng:
1) In lu«n buffer hiÖn t¹i vµ b¾t ®Çu mét buffer míi.
2) Quay trë l¹i ®Çu danh s¸ch ®Æc t¶ cho ®Õn khi gÆp dÊu ngoÆc ®¬n tr¸i vµ l¹i c¨n tõng cÆp môc in, ®Æc t¶ cho c¸c môc in cßn l¹i.
Trong lÖnh in trªn gi¸ trÞ cña TEM ®­îc c¨n theo ®Æc t¶ F6.2. V× kh«ng cã ®Æc t¶ cho VOL nªn ta lµm nh­ sau:
1) In gi¸ trÞ cña TEM sau mét vÞ trÝ trèng.
2) Khi quay trë l¹i vÒ phÝa ®Çu cña danh s¸ch c¸c ®Æc t¶ (dÊu ngoÆc tr¸i) vµ c¨n F6.2 cho gi¸ trÞ VOL. Sau ®ã ta ®¹t tíi ®Çu cña danh s¸ch vµ dÊu trèng ®Ó in VOL.
Do ®ã TEM vµ VOL ®­îc in trªn hai dßng riªng biÖt.
Trong Fortran 90 cho phÐp c¸c tham sè ®é réng ®Æc t¶, sè lÇn lÆp cña ®Æc t¶ cã thÓ lµ biÕn. ThÝ dô FORMAT (<M>F8.2).

Bµi tËp
1. ViÕt ®o¹n ch­¬ng tr×nh ®äc gi¸ trÞ vµo hai biÕn thùc A vµ B, ®æi gi¸ trÞ cña hai biÕn ®ã cho nhau.
2. §iÒu g× sÏ x¶y ra khi thùc hiÖn ch­¬ng tr×nh sau vµ ta nhËp vµo bµn phÝm lÇn l­ît sè 1, dÊu ph¶y, sè 10 vµ dÊu chÊm råi gâ phÝm Enter.
PRINT *, ' Cho cac gia tri cua hai so nguyen I1, I2 ! '
READ * , IDAU, ICUOI
PRINT 4, IDAU, ICUOI
4 FORMAT (1X, 'I1 = ', I5, 'I2 = ', I5)
END
3. M« t¶ nh÷ng g× sÏ in lªn mµn h×nh khi thùc hiÖn c¸c lÖnh d­íi ®©y:
REAL X
X = −27.632
PRINT 5 , X
5 FORMAT (1X, 'X = ', F7.1, ' DEGREES')
4. M« t¶ nh÷ng g× sÏ in ra m¸y in khi thùc hiÖn nh÷ng lÖnh d­íi ®©y:
A = 3.184
PRINT 1
1 FORMAT (1X, '0')

59 60
PRINT 2
2 FORMAT ('+' , '- = ' , F5.2)
5. M« t¶ nh÷ng g× sÏ in lªn mµn h×nh khi thùc hiÖn c¸c lÖnh d­íi ®©y:
REAL DIST , VEL
DIST = 28732.5
VEL = −2.6
PRINT 10, DIST, VEL
10 FORMAT (1X, 'DISTANCE = ' , E10.3,
* 5X , 'VELOCITY = ' , F5.2)
6. ViÕt ®o¹n ch­¬ng tr×nh nhËp vµo tõ bµn phÝm tªn 5 m«n thi cña häc kú cïng víi ®iÓm thi tõng m«n cña m×nh. TÝnh ®iÓm trung b×nh vµ in lªn mµn h×nh thµnh mét
b¶ng cã h×nh thøc nh­ sau:

BANG DIEM THI HOC KY


--------------------------------------------
TT TEN MON HOC DIEM
--------------------------------------------
1 Tªn m«n thø 1 8
2 Tªn m«n thø 2 7
3 Tªn m«n thø 3 8
4 Tªn m«n thø 4 7
5 Tªn m«n thø 5 9
--------------------------------------------
Diem trung binh hoc ky 7,8

Ch­¬ng 4
C¸c cÊu tróc ®iÒu khiÓn

Trong c¸c ch­¬ng tr­íc ta ®· xÐt mét vµi ch­¬ng tr×nh ®¬n gi¶n. ThÊy r»ng nh÷ng ch­¬ng tr×nh nµy thùc sù rÊt ®¬n gi¶n, chØ gåm mét vµi lÖnh thùc hiÖn tuÇn tù lµ

61 62
dÉn ®Õn kÕt qu¶ bµi to¸n cÇn gi¶i. Trong ch­¬ng nµy, sÏ giíi thiÖu nh÷ng lÖnh cña Fortran cho phÐp ta ®iÒu khiÓn ®­îc thø tù c¸c b­íc cÇn thùc hiÖn. Sù ®iÒu khiÓn ®­îc
thùc hiÖn th«ng qua nh÷ng lÖnh cho phÐp ta chän nh÷ng nh¸nh kh¸c nhau trong ch­¬ng tr×nh vµ nh÷ng lÖnh cho phÐp ta lÆp l¹i nh÷ng phÇn nµo ®ã cña ch­¬ng tr×nh.
Nh÷ng lÖnh nh­ vËy gäi lµ nh÷ng lÖnh ®iÒu khiÓn.

4.1. Kh¸i niÖm vÒ cÊu tróc thuËt to¸n

4.1.1. C¸c thao t¸c c¬ b¶n. Gi¶ tr×nh vµ l­u ®å


Trong môc 1.3, ch­¬ng 1 ®· s¬ l­îc nãi vÒ quy tr×nh n¨m b­íc gi¶i bµi to¸n. §èi víi nh÷ng bµi to¸n phøc t¹p vÒ c¸ch gi¶i th× b­íc 4 lµ b­íc khã kh¨n nhÊt. Ng­êi
lËp tr×nh ph¶i m« t¶ tuÇn tù c¸c c«ng ®o¹n tõ ®Çu ®Õn cuèi qu¸ tr×nh gi¶i, chia qu¸ tr×nh nµy thµnh mét sè khèi vµ liÖt kª nh÷ng khèi ®ã ra ®Ó sau nµy ch­¬ng tr×nh m¸y
tÝnh sÏ tuÇn tù thùc hiÖn. Trong mçi khèi ng­êi lËp tr×nh l¹i ph¶i chi tiÕt ho¸ thªm ®Õn møc cã thÓ chuyÓn thµnh nh÷ng lÖnh m¸y tÝnh. C¸ch chia khèi vµ chi tiÕt ho¸ tõng
khèi nh­ vËy cã thÓ gäi lµ ph­¬ng ph¸p chia vµ chinh phôc. KÕt qu¶ cuèi cïng cña chia khèi vµ chi tiÕt ho¸ tõng khèi chÝnh lµ thuËt gi¶i (algorithm).

B¶ng 4.1. C¸c thao t¸c c¬ b¶n vµ quy ­íc t­¬ng øng trong gi¶ tr×nh vµ l­u ®å

D¹ng thao t¸c Chó gi¶i gi¶ tr×nh BiÓu t­îng l­u ®å


TÝnh to¸n TB ← TONG / N TB = TONG / N


NhËp d÷ liÖu §äc A, B §äc A, B


XuÊt d÷ liÖu In A, B
In A, B

§
So s¸nh NÕu A > B
A>B? →
↓S

63 64
B¾t ®Çu
B¾t ®Çu thuËt gi¶i Tªn bµi to¸n


KÕt thóc thuËt gi¶i KÕt thóc

Nh÷ng h×nh thøc ®Ó biÓu diÔn trùc quan thuËt gi¶i sao cho dÔ dµng chuyÓn thµnh ch­¬ng tr×nh lµ gi¶ tr×nh vµ l­u ®å. Mét ng­êi lËp tr×nh cã thÓ chän h×nh thøc nµy
hoÆc h×nh thøc kia. Theo c¸ch gi¶ tr×nh, mçi cÊu tróc cña thuËt gi¶i ®­îc quy ­íc bëi mét chó gi¶i ng¾n gän gÇn gièng víi ng«n ng÷ viÕt cña chóng ta; cßn trong c¸ch
biÓu diÔn l­u ®å, mçi cÊu tróc ®ã ®­îc m« t¶ b»ng mét biÓu t­îng h×nh häc.
DÇn dÇn ta sÏ thÊy r»ng, nãi chung nh÷ng thao t¸c c¬ b¶n trong mét thuËt gi¶i th­êng lµ nh÷ng tÝnh to¸n, nhËp, xuÊt d÷ liÖu vµ so s¸nh. Nãi chung mét ch­¬ng tr×nh
m¸y tÝnh dï ®¬n gi¶n hay phøc t¹p ®Õn ®©u còng chØ gåm cã nh÷ng thao t¸c c¬ b¶n ®ã. Mét sè thao t¸c (hay lÖnh) cã thÓ nhãm l¹i víi nhau t¹o thµnh mét khèi hay mét
khèi cÊu tróc. Nh÷ng chó gi¶i gi¶ tr×nh vµ nh÷ng biÓu t­îng l­u ®å chÝnh lµ ®Ó thÓ hiÖn nh÷ng thao t¸c c¬ b¶n ®ã (xem b¶ng 4.1).

4.1.2. C¸c cÊu tróc tæng qu¸t trong thuËt gi¶i


C¸c b­íc trong mét thuËt gi¶i cã thÓ ph©n chia thµnh ba d¹ng cÊu tróc tæng qu¸t - ®ã lµ cÊu tróc tuÇn tù, lùa chän vµ lÆp. CÊu tróc tuÇn tù lµ chuçi c¸c b­íc thùc hiÖn
mét c¸ch kÕ tiÕp nhau. CÊu tróc lùa chän (hay cßn gäi lµ cÊu tróc rÏ nh¸nh) cho phÐp so s¸nh hai gi¸ trÞ, sau ®ã tuú kÕt qu¶ so s¸nh mµ ®Þnh ra mét chuçi c¸c b­íc kh¸c
nhau ph¶i thùc hiÖn. CÊu tróc lÆp ®­îc dïng khi qu¸ tr×nh gi¶i cÇn lÆp l¹i mét sè thao t¸c cho ®Õn khi tho¶ m·n mét ®iÒu kiÖn. Trong thuËt gi¶i phøc t¹p h¬n mét chót cã
thÓ thÊy c¸c cÊu tróc tæng qu¸t nµy lång vµo nhau, trong cÊu tróc lÆp cã nh÷ng ®o¹n gåm nh÷ng thao t¸c tuÇn tù ®­îc thùc hiÖn, cã nh÷ng ®o¹n xuÊt hiÖn sù rÏ nh¸nh tuú
theo mét ®iÒu kiÖn so s¸nh nµo ®ã.

4.1.3. ThÝ dô øng dông thuËt to¸n cÊu tróc


B©y giê ta t×m hiÓu ph­¬ng ph¸p x©y dùng thuËt gi¶i theo kü thuËt chia khèi vµ chi tiÕt ho¸ tõng khèi, ph©n tÝch cÊu tróc thuËt gi¶i th«ng qua mét thÝ dô cô thÓ vÒ bµi
to¸n ph©n tÝch c¸c sè liÖu thùc nghiÖm.
1) Ph¸t biÓu bµi to¸n: X¸c ®Þnh gi¸ trÞ lín nhÊt, nhá nhÊt vµ biªn ®é c¸c gi¸ trÞ cña tËp sè liÖu quan tr¾c.
2) M« t¶ d÷ liÖu vµo vµ ra: D÷ liÖu vµo lµ mét chuçi c¸c sè liÖu quan tr¾c. §Çu ra lµ trÞ cùc ®¹i, cùc tiÓu vµ biªn ®é c¸c gi¸ trÞ.
3) TÝnh thö víi tËp sè liÖu quan tr¾c sau:
Chuçi sè liÖu thö:
40.56
55.92

65 66
66.31
58.35
62.88
41.99
49.70
53.21

Thùc hiÖn t×m trÞ cùc ®¹i nh­ sau: Tr­íc hÕt so s¸nh sè thø nhÊt cña chuçi víi sè thø hai ®Ó x¸c ®Þnh sè lín h¬n, coi lµ cùc ®¹i t¹m thêi. B©y giê xÐt sè thø ba vµ so
s¸nh nã víi cùc ®¹i t¹m thêi. NÕu cùc ®¹i t¹m thêi lín h¬n, ta xÐt tíi sè thø t­; nh­ng nÕu sè thø ba lín h¬n cùc ®¹i t¹m thêi, ta thay thÕ sè ®ã vµo cùc ®¹i t¹m thêi. TiÕp
tôc qu¸ tr×nh nµy víi toµn bé chuçi sè liÖu sÏ dÉn tíi kÕt qu¶ lµ cùc ®¹i t¹m thêi chÝnh lµ trÞ cùc ®¹i trong c¶ chuçi. Mét qu¸ tr×nh t­¬ng tù sÏ cho phÐp t×m cùc tiÓu. Víi
tËp sè liÖu ®ang xÐt, kÕt qu¶ lµ:
Gi¸ trÞ cùc ®¹i = 66.31
Gi¸ trÞ cùc tiÓu = 40.56
TÝnh biªn ®é b»ng hiÖu gi÷a cùc ®¹i vµ cùc tiÓu = 66.31 − 40.56 = 25.73
4) X©y dùng thuËt gi¶i: Kh¸i qu¸t l¹i c¸c b­íc thùc hiÖn ë b­íc (3) ta cã thÓ chia bµi to¸n thµnh ba khèi:
- §äc sè liÖu vµ x¸c ®Þnh c¸c trÞ cùc ®¹i vµ cùc tiÓu
- TÝnh hiÖu gi÷a cùc ®¹i vµ cùc tiÓu ®Ó nhËn biªn ®é
- In cùc ®¹i, cùc tiÓu vµ biªn ®é
Víi thÝ dô nµy, ta chi tiÕt ho¸ c¸ch gi¶i b»ng gi¶ tr×nh. Râ rµng khèi thø nhÊt ®ßi hái ph¶i chi tiÕt ho¸ nhiÒu h¬n n÷a, v× nã võa bao gåm c¶ viÖc chän trÞ cùc ®¹i, cùc
tiÓu xuÊt ph¸t, võa bao gåm c¶ qu¸ tr×nh lÆp (lÆp ®Ó ®äc sè liÖu vµ lÆp ®Ó cËp nhËt cùc trÞ khi cÇn). Cùc ®¹i vµ cùc tiÓu xuÊt ph¸t th­êng ®­îc g¸n b»ng gi¸ trÞ cña quan
tr¾c thø nhÊt, do ®ã ta ®äc mét sè liÖu ®Çu ®Ó g¸n cho chóng. Sau ®ã ta ®äc sè thø hai vµ ®i vµo vßng lÆp. "Chõng nµo sè kh«ng ph¶i lµ zero", ta cËp nhËt trÞ cùc ®¹i vµ cùc
tiÓu nÕu cÇn thiÕt. B©y giê ta m« t¶ nh÷ng b­íc ®· ®ñ chi tiÕt nµy b»ng gi¶ tr×nh nh­ sau:

Gi¶ tr×nh: §äc sè


Cùc ®¹i ← Sè
Cùc tiÓu ← Sè
§äc sè
Chõng nµo sè kh«ng b»ng zero th×
NÕu sè > Cùc ®¹i th×
Cùc ®¹i ← Sè

67 68
NÕu sè < Cùc tiÓu th×
Cùc tiÓu ← Sè
§äc sè
Biªn ®é ← Cùc ®¹i − Cùc tiÓu
In 'GIA TRI CUC DAI = ', Cùc ®¹i
In 'GIA TRI CUC TIEU = ', Cùc tiÓu
In 'BIEN DO GIA TRI = ', Biªn ®é

§©y lµ mét thuËt gi¶i ®¬n gi¶n. ChØ cã mét khèi thø nhÊt cÇn chi tiÕt ho¸. ThÊy r»ng khi thuËt gi¶i ®· chi tiÕt ho¸ tíi møc nh­ vËy, th× viÖc chuyÓn thµnh ch­¬ng
tr×nh Fortran sÏ kh«ng cßn lµ vÊn ®Ò khã kh¨n. Trong c¸c môc tiÕp sau, ta sÏ nghiªn cøu c¸c lÖnh Fortran chuyªn trî gióp cho viÖc thiÕt kÕ c¸c cÊu tróc ®iÒu khiÓn cña bµi
to¸n nµy vµ nhiÒu bµi to¸n t­¬ng tù.

4.2. CÊu tróc IF vµ c¸c lÖnh t­¬ng øng

4.2.1. BiÓu thøc l«gic


BiÓu thøc l«gic ®­îc t¹o bëi c¸c to¸n tö quan hÖ:
.EQ. b»ng .NE. kh«ng b»ng
.LT. nhá h¬n .LE. nhá h¬n hoÆc b»ng
.GT. lín h¬n .GE. lín h¬n hoÆc b»ng

nèi hai biÕn sè ë hai bªn.


Tuú theo quan hÖ gi÷a hai biÕn sè ®ã mµ biÓu thøc l«gic cã mét trong hai gi¸ trÞ l«gic:
®óng (.TRUE.) hoÆc sai (.FALSE.).
ThÝ dô, xÐt biÓu thøc A .EQ. B trong ®ã A vµ B lµ c¸c biÕn sè thùc. NÕu gi¸ trÞ cña A b»ng gi¸ trÞ cña B th× biÓu thøc l«gic sÏ cã gi¸ trÞ lµ ®óng .TRUE.. NÕu kh«ng
th× biÓu thøc cã gi¸ trÞ lµ sai .FALSE.. T­¬ng tù, nÕu X b»ng 4,5 th× biÓu thøc X .GT. 3.0 cã gi¸ trÞ b»ng ®óng .TRUE..

Ta cã thÓ nèi hai biÓu thøc l«gic b»ng mét trong c¸c to¸n tö l«gic .OR. vµ .AND. thµnh mét biÓu thøc l«gic kÕt hîp.
Khi hai biÓu thøc l«gic nèi víi nhau bëi .OR. th× biÓu thøc l«gic kÕt hîp sÏ cã gi¸ trÞ lµ ®óng nÕu mét hoÆc c¶ hai biÓu thøc cã gi¸ trÞ lµ ®óng. Ta cã thÓ gäi .OR. lµ
69 70
to¸n tö céng l«gic.
Khi hai biÓu thøc nèi víi nhau bëi .AND. th× biÓu thøc kÕt hîp cã gi¸ trÞ ®óng chØ khi c¶ hai biÓu thøc cã gi¸ trÞ lµ ®óng. Ta cã thÓ gäi to¸n tö .AND. lµ to¸n tö nh©n
l«gic.

To¸n tö .NOT. cã thÓ ®øng tr­íc biÓu thøc l«gic vµ ®æi gi¸ trÞ cña nã thµnh gi¸ trÞ ng­îc l¹i. ThÝ dô, nÕu A. GT. B lµ ®óng (gi¸ trÞ b»ng .TRUE.) th× .NOT. A. GT. B
lµ sai (.FALSE.).
Mét biÓu thøc l«gic cã thÓ chøa nhiÒu to¸n tö l«gic, thÝ dô nh­ trong biÓu thøc sau:
.NOT. (A .LT. 15.4) .OR. KT .EQ. ISUM
QuyÒn ­u tiªn tõ cao nhÊt xuèng thÊp nhÊt lµ
.NOT., .AND. vµ .OR.

Trong biÓu thøc trªn, biÓu thøc A .LT. 15.4 sÏ ®­îc ­íc l­îng tr­íc tiªn, sau ®ã gi¸ trÞ cña nã (.TRUE. hoÆc .FALSE.) ®­îc ®æi ng­îc l¹i. Gi¸ trÞ nµy sÏ ®­îc xÐt
cïng víi gi¸ trÞ cña KT .EQ. ISUM. ThÝ dô, nÕu A lµ 5.0, KT lµ 5 vµ ISUM lµ 5, th× biÓu thøc bªn tr¸i cña to¸n tö .OR. cã gi¸ trÞ sai .FALSE., biÓu thøc bªn ph¶i cã gi¸ trÞ
®óng .TRUE. vµ toµn bé biÓu thøc sÏ cã gi¸ trÞ lµ ®óng .TRUE..

Gi¸ trÞ cña biÓu thøc l«gic cã thÓ ®­îc g¸n cho biÕn l«gic b»ng lÖnh g¸n gièng nh­ lÖnh g¸n dïng víi c¸c biÕn sè vµ biÓu thøc sè, thÝ dô:
LOGICAL DONE, OK
DONE = .FALSE.
OK = DONE .AND. I .GT. 24

Khi so s¸nh hai biÓu thøc l«gic hay hai biÕn l«gic cã t­¬ng ®­¬ng nhau hay kh«ng, trong Fortran kh«ng dïng c¸c to¸n tö quan hÖ nh­ khi so s¸nh hai biÓu thøc sè,
mµ dïng c¸c to¸n tö l«gic .EQV. vµ .NEQV..
B¶ng 4.2. tãm t¾t quy t¾c ­íc l­îng cña c¸c to¸n tö l«gic cho mäi tr­êng hîp cã thÓ x¶y ra.

B¶ng 4.2. C¸c to¸n tö l«gic

A B .NOT. A A.AND.B A.OR.B A.EQV.B A.NEQV.B

False False True False False True False


False True True False True False True
True False False False True False True

71 72
True True False True True True False

Khi c¸c to¸n tö sè häc, quan hÖ vµ l«gic cïng cã mÆt trong mét biÓu thøc th× c¸c to¸n tö sè häc thùc hiÖn tr­íc tiªn; sau ®ã c¸c to¸n tö quan hÖ dïng ®Ó ph¸t sinh
c¸c gi¸ trÞ TRUE hoÆc FALSE; vµ c¸c gi¸ trÞ nµy ®­îc ®¸nh gi¸ b»ng c¸c to¸n tö l«gic theo thø tù ­u tiªn .NOT., .AND., vµ .OR.. C¸c quan hÖ .EQV. vµ .NEQV. ®­îc
thùc hiÖn sau cïng.

4.2.2. LÖnh IF l«gic


1) C¸c lÖnh IF l«gic cã thÓ cã mét sè d¹ng sö dông. D¹ng thø nhÊt gäi lµ Logical IF viÕt nh­ sau:

IF (BiÓu thøc l«gic) LÖnh thùc hiÖn

Theo lÖnh nµy, nÕu biÓu thøc l«gic ë trong cÆp dÊu ngoÆc ®¬n cã gi¸ trÞ True th× thùc hiÖn lÖnh n»m trªn cïng dßng víi biÓu thøc l«gic, nÕu biÓu thøc l«gic cã gi¸ trÞ
False th× kh«ng thùc hiÖn lÖnh cïng dßng mµ chuyÓn ngay tíi lÖnh tiÕp theo phÝa d­íi trong ch­¬ng tr×nh. Chó ý r»ng lÖnh thùc hiÖn ghi sau biÓu thøc l«gic cã thÓ lµ mét
trong nh÷ng lÖnh tÝnh to¸n (g¸n), xuÊt, nhËp d÷ liÖu..., nh­ng kh«ng thÓ lµ mét lÖnh IF kh¸c. BiÓu thøc l«gic bao giê còng ph¶i ®Æt trong cÆp dÊu ngoÆc ®¬n. ThÝ dô,
nh÷ng lÖnh IF sau ®©y lµ nh÷ng lÖnh ®óng:
IF (A. GT. 0.0) SUM = SUM + A
IF (TIME .GT. 1.5) READ *, DIST

2) D¹ng thø hai gäi lµ Block IF: NÕu biÓu thøc l«gic cã gi¸ trÞ True m¸y thùc hiÖn c¸c lÖnh tõ lÖnh 1 ®Õn lÖnh n , sau ®ã chuyÓn tíi lÖnh tiÕp sau END IF. NÕu biÓu
thøc l«gic cã gi¸ trÞ False, ®iÒu khiÓn chuyÓn ngay xuèng lÖnh ®øng sau END IF:

IF (BiÓu thøc l«gic) THEN


lÖnh 1
...
lÖnh n
END IF

3) D¹ng thø ba gäi lµ d¹ng IF − ELSE: Khi biÓu thøc l«gic cã gi¸ trÞ True c¸c lÖnh tõ 1 ®Õn n ®­îc thùc hiÖn, nÕu biÓu thøc l«gic cã gi¸ trÞ False c¸c lÖnh tõ n + 1
®Õn m ®­îc thùc hiÖn:

73 74
IF (BiÓu thøc l«gic) THEN
lÖnh 1
...
lÖnh n
ELSE
lÖnh n+ 1
...
lÖnh m
END IF

4) D¹ng thø t­ gäi lµ IF − ELSE IF: NÕu biÓu thøc l«gic 1 cã gi¸ trÞ True th× lo¹t c¸c lÖnh tõ 1 ®Õn m ®­îc thùc hiÖn; nÕu biÓu thøc l«gic 1 cã trÞ False, biÓu thøc
l«gic 2 cã trÞ True th× lo¹t lÖnh tõ m + 1 ®Õn n thùc hiÖn; nÕu c¸c biÓu thøc l«gic 1 vµ 2 lµ False vµ biÓu thøc l«gic 3 True th× c¸c lÖnh tõ n + 1 tíi p thùc hiÖn. NÕu
kh«ng mét biÓu thøc l«gic nµo cã gi¸ trÞ True th× chØ cã c¸c lÖnh tõ p + 1 tíi q ®­îc thùc hiÖn. Trong thùc tÕ ta cã thÓ cÊu t¹o sè nh¸nh ELSE IF nhiÒu h¬n hoÆc Ýt h¬n,
chø kh«ng nhÊt thiÕt chØ lµ hai nh¸nh nh­ ®· viÕt d­íi ®©y:

IF (BiÓu thøc l«gic 1) THEN


lÖnh 1
...
lÖnh m
ELSE IF (BiÓu thøc l«gic 2) THEN
lÖnh m+ 1
...
lÖnh n
ELSE IF (BbiÓu thøc l«gic 3) THEN
lÖnh n+1
...
lÖnh p
ELSE
lÖnh p+1
...
lÖnh q
END IF

ThÝ dô 1: Sö dông c¸c lÖnh IF l«gic ®Ó ®iÒu khiÓn rÏ nh¸nh. LËp ch­¬ng tr×nh gi¶i hÖ ph­¬ng tr×nh bËc hai

75 76
ax 2 + bx + c = 0 (c¸c hÖ sè a, b, c nhËp tõ bµn phÝm, a ≠ 0 ).
Ta cã thÓ cô thÓ hãa thuËt gi¶i cña bµi to¸n nµy b»ng l­u ®å nh­ trªn h×nh 4.1. Tõ ®ã viÕt m· nguån cña ch­¬ng tr×nh Fortran nh­ d­íi ®©y.

B¾t ®Çu

In ‘N hap H S’
§ äc a, b, c

TÝnh ∆

S

§
∆=0 ← ∆<0

↓ S↓ ↓§
I n - b / (2a) ∆ = ∆ I n ‘V« nghiÖm’
a = 2a

I n (- b + ∆) / a
I n (- b - ∆) / a

↓ ↓ → KÕt t hóc

H×nh 4.1. L­u ®å thuËt gi¶i bµi to¸n cña thÝ dô 1

PRINT * , ' HE SO A BANG'


READ * , A
PRINT * , ' HE SO B BANG'
READ * , B
PRINT * , ' HE SO C BANG'
READ * , C
DELT = B**2 − 4.*A*C
IF (DELT .LT. 0.) THEN

77 78
PRINT * , ' PHUONG TRINH VO NGHIEM'
ELSE IF (DELT .EQ. 0.) THEN
PRINT 5 , −B / (2.0 *A)
5 FORMAT (1X, 'NGHIEM KEP BANG' , F10.2)
ELSE
DELT = SQRT (DELT)
A = 2. * A
PRINT 7 , (−B + DELT) / A , (−B − DELT) / A
7 FORMAT (1X, 'HAI NGHIEM: X1 = ',
* F10.2, 5X, 'X2 = ', F10.2)
END IF
END

4.2.3. LÖnh IF sè häc


LÖnh IF 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 cña lÖnh nµy viÕt nh­ sau:

IF (BiÓu thøc sè häc) n1 , n2 , n3

trong ®ã n1 , n2 , n3 − nh·n cña c¸c lÖnh thùc hiÖn. NÕu biÓu thøc sè häc cã gi¸ trÞ ©m th× ®iÒu khiÓn ®­îc chuyÓn tíi lÖnh cã nh·n lµ n1 , b»ng kh«ng − nh·n n 2 , vµ d­¬ng
− nh·n n3 .
ThÝ dô, theo lÖnh
IF (I − 10) 4, 8, 7

nÕu I < 10 ®iÒu khiÓn chuyÓn ®Õn lÖnh cã nh·n lµ 4, nÕu I = 10 − chuyÓn ®Õn nh·n 8 vµ nÕu I > 10 − chuyÓn ®Õn nh·n 7.
Trong lÖnh
IF (X − 3.5) 3, 6, 6
khi X ≥ 3,5 ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 6, khi X < 3,5 ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 3.

79 80
ThÝ dô 2: Dïng lÖnh IF sè häc ®Ó thiÕt kÕ vßng lÆp. ViÕt ch­¬ng tr×nh tÝnh vµ in gi¸ trÞ hµm

f ( x) = e − x cos (t x + 1) ,
3

trong ®ã x biÕn thiªn tõ 1 ®Õn 3 víi b­íc 0,1 vµ t = 0,1 .


L­u ®å gi¶i bµi to¸n nµy tham kh¶o trªn h×nh 4.2.

B¾t ®Çu


T = 0.1
X = 1.0

→ TÝnh F


I n X, F


X = X + 0.1

S ↓
← X>3

↓§
K Õt thóc

H×nh 4.2. L­u ®å thuËt gi¶i bµi to¸n cña thÝ dô 2

T = 0.1
X = 1.0
12 F = EXP (− X ** 3) * COS (T * X + 1)
WRITE (6 , 9) X , F
9 FORMAT (F5.2, E12.2)
X = X + 0.1

81 82
IF (X − 3.0) 12 , 12 , 4
4 STOP
END

4.2.4. LÖnh chuyÓn ®iÒu khiÓn v« ®iÒu kiÖn GO TO


LÖnh nµy cã d¹ng

GO TO n

trong ®ã n − nh·n cña lÖnh mµ ®iÒu kiÓn cÇn chuyÓn tíi.


LÖnh cÇn chuyÓn tíi nhÊt thiÕt ph¶i cã nh·n. Ngoµi ra trong ch­¬ng tr×nh kh«ng thÓ cã nh÷ng lÖnh cã cïng nh·n nh­ nhau. LÖnh GO TO cã thÓ chuyÓn ®iÒu khiÓn
tíi bÊt kú lÖnh thùc hiÖn nµo ®øng tr­íc hoÆc ®øng sau lÖnh GO TO. ThÝ dô:

GO TO 5 7 I=I+1
... X (I)=Y (I)
5 X = X + 1.0 GO TO 7

ThÝ dô 3: ViÕt ch­¬ng tr×nh nhËp n phÇn tö cña m¶ng mét chiÒu X, s¾p xÕp l¹i c¸c phÇn tö m¶ng ®ã theo thø tù t¨ng dÇn vµ in ra mµn h×nh.

REAL X (20), TG
INTEGER N, I, J, K
N = 10
PRINT * , 'NHAP CAC PHAN TU MANG'
I=0
7 I=I+1
PRINT *, 'PHAN TU ', I
READ *, X (I)
IF (I .LT. N) GOTO 7
C S¾p xÕp m¶ng X theo thø tù t¨ng dÇn
I=1
2 K=I
83 84
J=I+1
1 IF (X (J) .LT. X (K)) K = J
J=J+1
IF (J .LE. N) GOTO 1
TG = X(I)
X(I) = X(K)
X(K) = TG
I=I+1
IF (I. LT. N) GOTO 2
C LÇn l­ît in c¸c gi¸ trÞ cña m¶ng X ®· s¾p xÕp
I=1
3 PRINT 8 , X(I)
8 FORMAT (F12.2)
I=I+1
IF (I .LE. N) GOTO 3
END

4.2.5. LÖnh GO TO tÝnh to¸n


LÖnh GO TO tÝnh to¸n dïng ®Ó thùc hiÖn chuyÓn ®iÒu khiÓn tíi mét trong sè nh÷ng lÖnh cã nh·n ®­îc liÖt kª trong lÖnh GOTO tuú thuéc vµo gi¸ trÞ cña mét biÕn
trong lÖnh. D¹ng tæng qu¸t cña lÖnh nh­ sau:

GO TO ( n1 , n 2 , ..., n m ) , i

trong ®ã n1 , n 2 , ..., n m − c¸c nh·n cña nh÷ng lÖnh thùc hiÖn, i − biÕn nguyªn kh«ng chØ sè. Theo lÖnh nµy, ®iÒu khiÓn ®­îc chuyÓn tíi mét trong c¸c lÖnh n1 , n 2 , ..., n m
tuú thuéc vµo gi¸ trÞ cña i , cô thÓ khi i = 1 ®iÒu khiÓn sÏ chuyÓn tíi lÖnh cã nh·n n1 , khi i = 2 − nh·n n 2 , ..., khi i = m − nh·n n m . NÕu gi¸ trÞ cña i n»m ngoµi
kho¶ng 1 ≤ i ≤ m th× ®iÒu khiÓn chuyÓn xuèng lÖnh ®øng sau lÖnh GO TO ®Ó thùc hiÖn.
ThÝ dô, theo lÖnh
GO TO (17 , 2 , 115 , 19) , KA
khi KA = 1 ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 17, khi KA = 2 ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 2, khi KA = 3 ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 115 vµ khi
KA = 4 ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 19.

85 86
ThÝ dô 4: øng dông lÖnh GOTO tÝnh to¸n. ViÕt ch­¬ng tr×nh tÝnh gi¸ trÞ cña ®a thøc Lejandre víi x = 0,4 theo c«ng thøc

 1 khi l = 0
 x khi l = 1
 1
Pl ( x) =  (3 x − 1) khi l = 2
2

 2
 1
(5 x 3 − 3 x) khi l = 3
 2
REAL X, P
INTEGER L, I
X = 0.4
L=0
28 I=L+1
GO TO (12, 17, 21, 6) , I
12 P = 1.0
GO TO 24
17 P=X
GO TO 24
21 P = 0.5 * (3.0 * X ** 2 − 1.0)
GO TO 24
6 P = 0.5 * (5.0 * X ** 3 − 3.0 * X)
24 WRITE (* , 8) L , P
8 FORMAT (I3 , F12.5)
L=L+1
IF (L − 3) 28 , 28 , 30
30 STOP
END

ThÝ dô 5: S¾p xÕp danh s¸ch. ViÕt ch­¬ng tr×nh nhËp hä tªn vµ ®iÓm ba m«n häc cña nhãm gåm n sinh viªn. TÝnh ®iÓm trung b×nh céng ba m«n häc. In b¶ng cã
tiªu ®Ò vµ c¸c cét thø tù, hä tªn, ®iÓm ba m«n vµ ®iÓm trung b×nh, ghi chó xÕp lo¹i theo ®iÓm trung b×nh: trung b×nh < 6.0 , kh¸ 6 ÷ 8,9 , giái > 9,0 . Danh s¸ch xÕp theo
thø tù tõ cao xuèng thÊp dùa theo ®iÓm trung b×nh.

87 88
PARAMETER (N = 15)
INTEGER I , J , K , D1 (50) , D2 (50) , D3 (50), ID
REAL D , TB (50)
CHARACTER * 20 TEN (50) , TENTG
C NhËp hä tªn, ®iÓm thi vµ tÝnh ®iÓm trung b×nh
I=0
7 I=I+1
PRINT * , ' NHAP SINH VIEN ' , I
READ (* , '(A20)') TEN(I)
READ * , D1 (I) , D2 (I) , D3 (I)
TB (I) = (D1 (I) + D2 (I) + D3 (I)) / 3.0
IF (I .LT. N) GO TO 7
C S¾p xÕp danh s¸ch theo thø tù ®iÓm trung b×nh gi¶m dÇn
I=1
2 K=I
J=I+1
1 IF (TB(J) .GT. TB(K)) K = J
J=J+1
IF (J .LE. N) GO TO 1
TENTG = TEN (I)
TEN (I) = TEN (K)
TEN (K) = TENTG
ID = D1 (I)
D1 (I) = D1 (K)
D1 (K) = ID
ID = D2 (I)
D2 (I) = D2 (K)
89 90
D2 (K) = ID
ID = D3 (I)
D3 (I) = D3 (K)
D3 (K) = ID
D = TB (I)
TB (I) = TB (K)
TB (K) = D
I=I+1
IF (I .LT. N) GO TO 2

C In tiªu ®Ò danh s¸ch lªn mµn h×nh

PRINT 100
100 FORMAT (21X , 'BANG DIEM' // , 1X , 'TT' , 7X,
* 'HO TEN' ,9X , 'D1 D2 D3 TB XEP LOAI' /)
C In tõng sinh viªn theo danh s¸ch
60 FORMAT (1X, I2, 1X, A20, I3, I3, I3, F5.1, 1X, 'GIOI')
50 FORMAT (1X, I2, 1X, A20, I3, I3, I3, F5.1, 1X, 'KHA')
40 FORMAT (1X, I2, 1X, A20, I3, I3, I3, F5.1, 1X,
* 'TRUNG BINH')
I=1
3 IF (TB (I) .LT. 9.0) THEN
IF (TB (I) .LT. 6.0) THEN
PRINT 40 , I , TEN (I) , D1 (I) , D2 (I) , D3 (I) , TB (I)
ELSE
PRINT 50 , I , TEN (I) , D1 (I) , D2 (I) , D3 (I) , TB (I)
END IF

91 92
ELSE
PRINT 60 , I , TEN (I) , D1 (I) , D2 (I) , D3 (I) , TB (I)
END IF
I=I+1
IF (I. LE. N) GO TO 3
STOP
END

ThÝ dô 6: ViÕt ch ­¬ng tr×nh tÝnh tÝch ph©n x¸c ®Þnh:


b
I = ∫ x 2 sin x
a
theo c«ng thøc h×nh thang víi sai sè ε = 0,0001; a, b − cho tr­íc.
Gîi ý: ë b­íc xÊp xØ ®Çu, xem sè h×nh thang con n = 1 , tÝch ph©n b»ng
S1 = 0,5 ( y a + y b ) (b − a ) .
B­íc xÊp xØ sau t¨ng sè h×nh thang con n thªm 1 vµ tÝch ph©n b»ng ( h×nh 4.3)
n
S 2 = ∑ 0,5 ( y i + y i +1 ) ( x i +1 − x i )
i

TiÕp tôc t¨ng n ®Õn khi S1 − S 2 < ε .

y = f (x )
y2
y1 H×nh 4.3. Minh häa s¬ ®å tÝnh
gÇn ®óng tÝch ph©n x¸c ®Þnh theo
x1 = a x2 xn = b ph­¬ng ph¸p h×nh thang

93 94
EPSIL = 0.0001
A = 0.0
B = 3.141593
S1 = 0.5 * (A ** 2 * SIN (A) + B ** 2 * SIN (B) ) * (B−A)
SOHINH = 2.0
7 DX = (B−A) / SOHINH
HINH = 1.0
X1 = A
Y1 = X1 ** 2 * SIN (X1)
S2 = 0.0
5 X2 = X1 + DX
Y2 = X2 ** 2 * SIN (X2)
S2 = S2 + 0.5*(Y1 + Y2) * DX
IF (HINH .LT. SOHINH) THEN
HINH = HINH + 1.0
X1 = X2
Y1 = Y2
GOTO 5
END IF
IF (ABS (S2−S1) .GT. EPSIL) THEN
SOHINH = SOHINH + 1.0
S1 = S2
GOTO 7
END IF
PRINT 3 , S2

95 96
3 FORMAT (1X , 'TICH PHAN BANG', F15.4)
END
ThÝ dô 7: Vßng lÆp ®Ó tÝnh tæng chuçi. B×nh ph­¬ng cña sin cña gãc x tÝnh theo c«ng thøc chuçi nh­ sau:
23 x 4 25 x 6 ∞
( −1) n +1 2 2 n −1 x 2n
sin 2 x = x 2 − + − ... = ∑ .
4! 6! n =1 ( 2n ) !
H·y viÕt ch­¬ng tr×nh ®äc vµo mét gãc x b»ng ®é, ®æi ra ra®ian, tÝnh vµ in ra b¶ng so s¸nh kÕt qu¶ tÝnh sin 2 x theo c«ng thøc nµy víi nh÷ng sè sè h¹ng chuçi n lÎ
− 2 x2
tõ 1 ®Õn 15. ThÊy r»ng sè h¹ng ®Çu khi n = 1 lµ x 2 , mçi sè h¹ng tiÕp sau b»ng sè h¹ng tr­íc nh©n víi .
n ( 2n − 1)

Trong thÝ dô nµy, ta øng dông ph­¬ng ph¸p chia khèi bµi to¸n vµ chi tiÕt ho¸ tõng khèi nh­ ®· tr×nh bµy trong môc 4.1 ®Ó x©y dùng thuËt gi¶i vµ diÔn ®¹t thuËt gi¶i
®ã b»ng l­u ®å, sau ®ã dÉn ch­¬ng tr×nh Fortran.
ThÊy r»ng bµi to¸n cã thÓ chia thµnh ba khèi sau:
Khèi 1: NhËp gi¸ trÞ gãc x .
Khèi 2: In tiªu ®Ò cña b¶ng kÕt qu¶.
Khèi 3: TÝnh gi¸ trÞ sin 2 x theo c«ng thøc chuçi vµ in ra kÕt qu¶ kh¶o s¸t víi sè sè h¹ng chuçi tõ 1 ®Õn 15.
B©y giê ta ph©n tÝch chi tiÕt tõng khèi ®Ó dÉn l­u ®å thùc hiÖn trong mçi khèi.
ThÊy r»ng khèi 1 cã thÓ chi tiÕt ho¸ thµnh ba b­íc con: V× c«ng thøc khai triÓn chuçi trªn ®©y héi tô nhanh ®èi víi nh÷ng gãc x nhá, do ®ã nÕu x n»m trong
kho¶ng:
90 < x ≤ 180 ta thay b»ng gãc 180 − x ,
nÕu x n»m trong kho¶ng:
180 < x ≤ 270 ta thay b»ng gãc x − 180 ,
nÕu x n»m trong kho¶ng:

270 < x ≤ 360 ta thay b»ng gãc x − 360 .


Sau ®ã ®æi x thµnh ra®ian (h×nh 4.4).

97 98
Read X

F
← X > 90

T↓

Khèi 1
F
X > 270

F
T ↓ X >180
X = X − 360
↓T ↓
X =X − 180 X = 180 − X

← ↓ ↓ ↓

X = X*3.1415 / 180

H×nh 4.4. L­u ®å khèi 1 (thÝ dô 7)

Print tiªu ®Ò b¶ng


Khèi 2


Print tiªu ®Ò cét

H×nh 4.5. L­u ®å khèi 2 (thÝ dô 7)

99 100
Ta thÊy khèi 2 chØ gåm hai viÖc tuÇn tù lµ in dßng tiªu ®Ò cña b¶ng kh¶o s¸t, in c¸c tiªu ®Ò ®Çu b¶ng (h×nh 4.5).

Khèi 3
S=0
N=1
THEM = X 2


S = S + THEM


T
N lÎ

F Print N, S, sin 2 X



N=N+1
THEM = THEM *2 * X 2 / (N* (2N−1)


F
N>15

H×nh 4.6. L­u ®å khèi 3 (thÝ dô 7)

Khèi 3 lµ phøc t¹p nhÊt cÇn ®­îc chi tiÕt ho¸ mét c¸ch tèi ®a. Ta thÊy khèi nµy gåm c¸c b­íc cô thÓ sau:
• G¸n 0 cho biÕn S (gi¸ trÞ khëi t¹o cña sin 2 x cÇn tÝnh).
• G¸n 1 cho N (b¾t ®Çu xÐt sè h¹ng thø nhÊt).
• G¸n x 2 cho biÕn THEM (gi¸ trÞ cña sè h¹ng thø nhÊt).
• Chõng nµo N ≤ 15 thùc hiÖn tuÇn tù 4 b­íc sau:
♦ Céng sè h¹ng (THEM) vµo biÕn S.

101 102
♦ NÕu N lÎ in gi¸ trÞ N , S , sin 2 x (tÝnh theo hµm chuÈn).
♦ T¨ng thªm 1 ®¬n vÞ cho N .
−2X2
♦ TÝnh l¹i biÕn THEM b»ng c¸ch nh©n chÝnh nã víi .
N ( 2 N − 1)
Gi¶ tr×nh nµy t­¬ng ®­¬ng víi l­u ®å khèi trªn h×nh 4.6.
Nh­ vËy, ta ®· chi tiÕt ho¸ tÊt c¶ c¸c b­íc trong ba khèi d­íi d¹ng c¸c l­u ®å. C«ng viÖc cßn l¹i ®¬n gi¶n lµ g¾n c¬ häc ba l­u ®å l¹i ta ®­îc l­u ®å chung cña toµn
thuËt to¸n. Tõ ®ã dÔ dµng chuyÓn sang ch­¬ng tr×nh Fortran d­íi ®©y:

PRINT * , ' HAY CHO MOT GOC BANG DO'


READ *, X
IF (X .GT. 90.0) THEN
IF (X .GT. 270.0) THEN
X = X − 360.0
ELSE IF (X .GT. 180.0) THEN
X = X − 180.0
ELSE
X = 180.0 − X
END IF
END IF
X = X * 3.141593 / 180.0
PRINT 2
2 FORMAT (1X, 35H KHAO SAT CONG THUC BINH
* PHUONG SIN // , 1X , 2H N, 17H THEO CONG THUC,
* 17H THEO HAM CHUAN)
S = 0.

103 104
N=1
THEM = X ** 2
5 S = S + THEM
IF (MOD (N , 2) .EQ. 1) PRINT 4 , N , S , SIN (X) ** 2
4 FORMAT (1X , I2 , 2F17.7)
N=N+1
THEM = − THEM * 2.0 * X**2 / (N * (2 * N −1))
IF (N .LE. 15) GO TO 5
END

ThÝ dô 8: Néi suy tuyÕn tÝnh chuçi sè liÖu quan tr¾c. Gi¶ sö cã nh÷ng sè liÖu quan tr¾c vÒ nhiÖt ®é n­íc biÓn t¹i c¸c tÇng s©u ë ®iÓm cã täa ®é 120oK§-20oVB ®­îc
cho trong b¶ng 4.3. LËp ch­¬ng tr×nh nhËp nh÷ng sè liÖu nµy vµ néi suy gi¸ trÞ nhiÖt ®é cho mét ®é s©u bÊt kú nhËp tõ bµn phÝm, th«ng b¸o lªn mµn h×nh kÕt qu¶ néi suy
d­íi d¹ng nh­ sau:
DO SAU = .... M
NHIET DO = ..... DO C
Ph©n tÝch bµi to¸n nµy, ta thÊy cã thÓ chia nã thµnh ba khèi: 1) NhËp tõ bµn phÝm mét gi¸ trÞ ®é s©u t¹i ®ã cÇn néi suy nhiÖt ®é; 2) NhËp sè liÖu vÒ ®é s©u vµ nhiÖt ®é
vµo m¸y tÝnh; 3) Néi suy gi¸ trÞ nhiÖt ®é t¹i ®é s©u cÇn t×m vµ in kÕt qu¶ lªn mµn h×nh.
Khèi thø nhÊt rÊt ®¬n gi¶n vµ quen thuéc. §Ó thùc hiÖn khèi thø hai ta tæ chøc mét vßng lÆp ®Ó tuÇn tù nhËp ®é s©u vµ nhiÖt ®é t¹i c¸c ®iÓm nót (xem l­u ®å cña khèi
2 trªn h×nh 4.7).

B¶ng 4.3. Ph©n bè nhiÖt ®é n­íc biÓn (oC) theo ®é s©u (m)

§é s©u 0 5 10 20 30 40 50 60
NhiÖt ®é 24,31 24,26 24,20 24,18 24,13 24,05 23,98 23,89
§é s©u 70 80 90 100 120 140 160 180
NhiÖt ®é 23,87 23,57 23,14 22,74 21,31 20,03 18,49 17,58
§é s©u 200 220 240 260 280 300 350 400
NhiÖt ®é 16,66 15,61 14,73 13,97 13,47 12,93 11,40 10,18

105 106
§é s©u 500 600 700 800 900 1000 1200 1400
NhiÖt ®é 9,39 8,56 8,49 7,83 7,27 6,71 6,16 5,44

N = 32
K=1


§äc H (K)

Khèi 2
§äc T (K)

K=K+1

H×nh 4.7. L­u ®å khèi 2 (thÝ dô 8) - nhËp K>N →
chuçi ®é s©u vµ nhiÖt ®é F
T

B©y giê ta cô thÓ hãa thªm khèi thø 3 vµ sau ®ã dÉn ch­¬ng tr×nh Fortran hoµn chØnh cña bµi to¸n nµy.
Nh­ ®· thÊy, c¸c gi¸ trÞ quan tr¾c nhiÖt ®é ®­îc cho chØ t¹i 32 ®é s©u gäi lµ 32 ®iÓm nót. Muèn néi suy gi¸ trÞ nhiÖt ®é t¹i ®é s©u bÊt kú ta cÇn t×m xem ®é s©u ®ã
n»m gi÷a hai nót nµo. Gäi ®é s©u cÇn néi suy nhiÖt ®é lµ h0 . Gi¶ sö ®é s©u nµy n»m gi÷a c¸c ®é s©u nót hi vµ hi +1 , tøc tháa m·n bÊt ®¼ng thøc kÐp:

hi ≤ h0 ≤ hi +1 ,
trong ®ã i cã thÓ biÕn thiªn tõ 1 ®Õn 31. Nh­ vËy, ®Ó t×m i , ta ph¶i gi¶ sö i = 1 vµ kiÓm tra bÊt ®¼ng thøc kÐp trªn ®©y. NÕu bÊt ®¼ng thøc kh«ng tháa m·n, th× ta t¨ng i
lªn mét ®¬n vÞ vµ tiÕp tôc cho tíi khi bÊt ®¼ng thøc tháa m·n.

107 108
I=1

Khèi 3

H (I +1) ≥ H0 ≥ H (I)
T

F ↓
↓ I=I+1 →

T0 = T(I) + (T(I +1)-T(I)) × (H0 - H(I)) / (H(I +1)-H(I))


In H0, T0

H×nh 4.8. L­u ®å khèi 3 (thÝ dô 8) - néi suy gi¸ trÞ nhiÖt ®é vµ in kÕt qu¶

Khi t×m ®­îc i , gi¸ trÞ t 0 cÇn néi suy cã thÓ tÝnh theo c«ng thøc néi suy tuyÕn tÝnh nh­ sau:

(t i +1 − t i ) ( h0 − hi )
t0 = ti + .
hi +1 − hi
TÊt c¶ nh÷ng ®iÒu võa ph©n tÝch ®­îc thÓ hiÖn trªn l­u ®å khèi ë h×nh 4.8. D­íi ®©y lµ ch­¬ng tr×nh cña bµi to¸n

INTEGER N, I, K
REAL H0, T0, H (40), T (40)

C In lêi nh¾c vµ nhËp ®é s©u cÇn néi suy nhiÖt ®é


PRINT * , ' NHAP DO SAU XAC DINH NHIET DO'
READ *, H0

C In lêi nh¾c vµ nhËp 32 cÆp gi¸ trÞ ®é s©u vµ nhiÖt ®é


N = 32
109 110
K =1
5 PRINT *, ‘ NHAP DO SAU VA NHIET DO TANG ‘, K
READ *, H(K), T(K)
K = K +1
IF (K .GT. N) GOTO 4
GOTO 5

C Néi suy gi¸ trÞ nhiÖt ®é t¹i ®é s©u H0


4 I=N -1
IF (H0 .GT. H(N)) GOTO 1
I=1
2 IF (H0 .GE. H (I) .AND. H0 .LE. H (I+1)) GOTO 1
I=I+1
GOTO 2
1 T0 = T(I) + (T(I+1)-T (I))*(H0-H(I)) / (H(I+1)-H(I))
PRINT 3, H0
PRINT 6, T0
3 FORMAT (1X, ‘DO SAU = ‘, F6.1, ‘ M’)
6 FORMAT (1X,’NHIET DO = ‘, F5.1, ’ DO C’)
END
Qua thÝ dô ë môc 4.1.3 vµ nh÷ng thÝ dô ë ch­¬ng nµy ta thÊy viÖc ¸p dông quy tr×nh 5 b­íc gi¶i bµi to¸n vµ chiÕn l­îc chia khèi vµ chi tiÕt ho¸ tõng khèi ®Ó ph¸t
triÓn thuËt gi¶i lµ mét c«ng cô lËp tr×nh rÊt hiÖu qu¶. Bµi to¸n dï lín, cã cÊu tróc phøc t¹p còng trë nªn s¸ng tá, trùc quan.
Tõ thêi ®iÓm nµy sinh viªn cÇn rÌn luyÖn cho m×nh thãi quen ¸p dông ph­¬ng ph¸p trªn ngay c¶ víi nh÷ng bµi tËp ®¬n gi¶n còng nh­ víi nh÷ng bµi to¸n t­¬ng ®èi
phøc t¹p khi thiÕt kÕ thuËt gi¶i. Cßn chän c«ng cô gi¶ tr×nh hay l­u ®å lµ tuú thÝch.

Bµi tËp

1. H·y thÓ hiÖn b»ng gi¶ tr×nh hoÆc l­u ®å thuËt to¸n s¾p xÕp c¸c phÇn tö cña m¶ng mét chiÒu theo thø tù gi¶m dÇn.

2. Cho c¸c gi¸ trÞ:


A = 2.2 B = −1.2 I =1 DONE = .TRUE.

111 112
X¸c ®Þnh gi¸ trÞ cña c¸c biÓu thøc l«gic sau ®©y:
1) A .LT. B2) A − B .GE. 6.5
3) I .NE. 5 4) A + B .GE. B
5) I .LE. I −5 6) .NOT. (A .EQ. 2 * B)
7) (A .LT. 10.0) .AND. (B .GT. 5.0)
8) (ABS (I) .GT. 2) .OR. DONE
9) A .LT. B .NEQV. DONE
3. ViÕt ch­¬ng tr×nh tÝnh gi¸ trÞ cña y theo c«ng thøc

 x 2 khi x ≤ 0;
y= 3
 x khi x > 0,
víi x cho tr­íc.
4. ViÕt ch­¬ng tr×nh ®äc tõ bµn phÝm mét trÞ sè nhiÖt ®é Celsius, liÖt kª trªn mµn h×nh ba ph­¬ng ¸n chuyÓn ®æi: sang ®é Fahrenheit, Kelvin vµ Rankin. Theo ng­êi
dïng chØ ®Þnh ph­¬ng ¸n chuyÓn ®æi mµ in ra nhiÖt ®é ®· cho vµ kÕt qu¶ chuyÓn ®æi kÌm c¸c ký hiÖu nhiÖt ®é t­¬ng øng. C¸c c«ng thøc chuyÓn ®æi nh­ sau:
TF = TR − 459,67 o R
9
TF = TC + 32 o F
5
9
TR = T K
5
15
5. ViÕt ch­¬ng tr×nh tÝnh tÝch ph©n I = ∫ y ( x )dx víi hµm y (x ) cho d­íi d¹ng b¶ng c¸c gi¸ trÞ thùc nghiÖm nh­ trong b¶ng 4.4.
1

B¶ng 4.4
x 1,0 2,1 3,0 3,9 4,8 6,2 7,1 7,8
y 3,3 4,7 7,3 8,7 11,3 12,7 15,3 16,7
x 9,4 10,1 11,3 12,1 13,5 13,9 15,0
y 19,3 20,7 23,3 24,7 27,3 28,7 31,3
6. ViÕt ch­¬ng tr×nh cho phÐp ®äc vµo tõ bµn phÝm mét trÞ sè cña x vµ x¸c ®Þnh trÞ sè cña hµm y b»ng c¸ch néi suy tuyÕn tÝnh theo b¶ng gi¸ trÞ thùc nghiÖm (thÝ dô
b¶ng 4.4).

113 114
7. HÖ sè nhít ph©n tö ( g ⋅ cm −1 ⋅ s−1 ) cña n­íc biÓn phô thuéc vµo nhiÖt ®é t (°) vµ ®é muèi S (%o) theo b¶ng 4.5. ViÕt ch­¬ng tr×nh néi suy tuyÕn tÝnh b¶ng nµy
cho mét cÆp trÞ sè bÊt kú cña t o vµ S .
8. ViÕt ch­¬ng tr×nh tÝnh sè π theo c«ng thøc khai triÓn chuçi sau ®©y víi sai sè kh«ng qu¸ 0,0001:
π 1 1 1 1
= 1 − + − + ....
4 3 5 7 9

B¶ng 4.5

§é muèi 0° 5° 10° 15° 20° 25° 30°


0 17,94 15,19 13,10 11,45 10,09 8,95 8,00
5 18,06 15,28 13,20 11,54 10,18 9,08 8,09
10 18,18 15,39 13,28 11,68 10,27 9,18 8,17
15 18,30 15,53 13,41 11,77 10,40 9,26 8,27
20 18,41 15,66 13,57 11,90 10,47 9,35 8,34
25 18,53 15,79 13,73 12,03 10,58 9,48 8,43
30 18,64 15,93 13,84 12,12 10,68 9,58 8,52
35 18,83 16,07 14,00 12,23 10,82 9,67 8,59

9. ViÕt ch­¬ng tr×nh cho phÐp liªn tôc nhËp tõ bµn phÝm hai sè nguyªn bÊt kú, t×m vµ in lªn mµn h×nh ­íc sè chung lín nhÊt cña nh÷ng sè ®ã d­íi d¹ng th«ng b¸o:
USCLN CUA CAC SO: 36 VA 24 BANG 12
vµ kÕt thóc khi nµo ng­êi dïng nhËp vµo hai sè b»ng nhau hoÆc mét trong hai sè b»ng 1.
10. LËp l­u ®å thuËt gi¶i ®Ó gi¶i gÇn ®óng ph­¬ng tr×nh x = f (x ) b»ng ph­¬ng ph¸p lÆp Siedel. XÊp xØ ban ®Çu x0 vµ sai sè cho phÐp ε ®­îc cho tr­íc. NÕu t×m
®­îc nghiÖm víi ®é chÝnh x¸c ®· cho th× in gi¸ trÞ nghiÖm kÌm theo sè b­íc lÆp, cßn nÕu sau 100 lÇn lÆp mµ ch­a nhËn ®­îc nghiÖm th× th«ng b¸o lªn mµn h×nh dßng ch÷
'KHONG TIM DUOC NGHIEM'. (Gîi ý: Theo ph­¬ng ph¸p lÆp Seidel, ng­êi ta thÕ gi¸ trÞ x0 tuú chän vµo biÓu thøc f (x) ë vÕ ph¶i cña ph­¬ng tr×nh x = f (x ) ®Ó
tÝnh ra gi¸ trÞ x1 − gäi lµ xÊp xØ bËc 1, sau ®ã kiÓm tra nÕu kh¸c nhau gi÷a x1 vµ x0 lín h¬n sai sè cho phÐp ε th× gi¸ trÞ x1 l¹i ®­îc thÕ vµo vÕ ph¶i vµ tiÕp tôc tÝnh x2
(xÊp xØ bËc 2)..., qu¸ tr×nh nµy tiÕp diÔn cho ®Õn khi chªnh lÖch gi÷a hai b­íc xÊp xØ liÒn nhau kh«ng lín h¬n ε th× ng­êi ta chÊp nhËn gi¸ trÞ xÊp xØ cuèi cïng lµm
nghiÖm cña ph­¬ng tr×nh x = f (x ) .

115 116
Ch­¬ng 5
CÊu tróc lÆp víi lÖnh DO

Trong ch­¬ng 4 ®· xÐt sù ®iÒu khiÓn ®­îc thùc hiÖn th«ng qua nh÷ng lÖnh cho phÐp ch­¬ng tr×nh chän nh÷ng nh¸nh kh¸c nhau ®Ó thùc hiÖn. §ång thêi, ta còng ®·
mét sè lÇn sö dông kÕt hîp lÖnh IF l«gic vµ lÖnh chuyÓn ®iÒu khiÓn v« ®iÒu kiÖn GOTO ®Ó tæ chøc nh÷ng vßng lÆp d¹ng:
n IF (BiÓu thøc l«gic) THEN
LÖnh 1
LÖnh 2
...
LÖnh m
GOTO n
END IF
CÊu tróc nµy gäi lµ vßng lÆp cã ®iÒu kiÖn (While Loop): Khi vµ chõng nµo biÓu thøc l«gic trong lÖnh IF cã gi¸ trÞ .TRUE. th× nhãm lÖnh tõ lÖnh 1 ®Õn lÖnh m lÇn
l­ît thùc hiÖn, nh­ng lÖnh GOTO ë cuèi lu«n lu«n chuyÓn ®iÒu khiÓn lªn nh·n n vµ h×nh thµnh vßng lÆp. Vßng lÆp nµy cã nh÷ng ®Æc ®iÓm sau:
1) Tr­êng hîp biÓu thøc l«gic cã gi¸ trÞ .FALSE. ngay tõ ®Çu, th× qu¸ tr×nh lÆp sÏ kh«ng x¶y ra;
2) Trong nhãm lÖnh tõ lÖnh 1 ®Õn lÖnh m bªn trong vßng lÆp nhÊt thiÕt ph¶i cã mét lÖnh nµo ®ã lµm thay ®æi gi¸ trÞ cña biÓu thøc l«gic thµnh .FALSE., vËy sè lÇn
lÆp phô thuéc vµo gi¸ trÞ khëi ®Çu cña biÓu thøc l«gic vµ sù biÕn ®æi gi¸ trÞ cña nã bªn trong chÝnh vßng lÆp.
Trong bµi nµy ta xÐt mét cÊu tróc lÆp kh¸c mµ ®iÒu kiÖn vµ sè lÇn lÆp ®­îc x¸c ®Þnh ngay tõ khi b¾t ®Çu qu¸ tr×nh lÆp víi viÖc sö dông vßng lÆp DO (DO Loop).
Trong ch­¬ng tiÕp sau sÏ xÐt mét tÝnh n¨ng quan träng cña vßng lÆp DO, gäi lµ vßng lÆp Èn, ®Ó tæ chøc nhËp, xuÊt c¸c biÕn cã chØ sè rÊt hay gÆp trong thùc tiÔn.

5.1. Vßng lÆp DO

5.1.1. Có ph¸p cña lÖnh DO vµ vßng lÆp DO


D¹ng tæng qu¸t cña lÖnh DO nh­ sau:

DO n ind = ini , lim , inc


trong ®ã h»ng n lµ nh·n cña lÖnh kÕt thóc cña vßng lÆp, ind − lµ mét biÕn sè ®­îc dïng nh­ lµ chØ sè ®Õm vßng lÆp, ini − gi¸ trÞ ®Çu g¸n cho chØ sè ®Õm, lim − gi¸ trÞ
117 118
cuèi dïng ®Ó x¸c ®Þnh khi nµo vßng lÆp DO kÕt thóc vµ inc − gia sè, gi¸ trÞ ®­îc céng vµo chØ sè ®Õm mçi lÇn vßng lÆp thùc hiÖn.
Nh÷ng gi¸ trÞ ®Çu, gi¸ trÞ cuèi vµ gia sè gäi lµ c¸c tham sè cña vßng lÆp. NÕu trong lÖnh DO kh«ng ghi gia sè th× ngÇm ®Þnh lµ 1. Khi gi¸ trÞ cña chØ sè ®Õm lín h¬n
gi¸ trÞ cuèi th× ®iÒu khiÓn ®­îc chuyÓn cho lÖnh ®øng sau lÖnh kÕt thóc vßng lÆp. LÖnh kÕt thóc vßng lÆp th­êng dïng lµ lÖnh CONTINUE, cã d¹ng tæng qu¸t lµ

n CONTINUE
trong ®ã nh·n n phï hîp víi nh·n mµ lÖnh DO ë trªn ®· chØ ®Þnh.
VËy d¹ng tæng qu¸t cña vßng lÆp DO cã thÓ viÕt nh­ sau:

DO n ind = ini , lim , inc


LÖnh 1
...
LÖnh m
n CONTINUE

Ta lÊy thÝ dô gi¶i bµi to¸n tÝnh tæng cña 50 sè nguyªn d­¬ng ®Çu tiªn
50
∑ i = 1 + 2 + . . . + 49 + 50
i =1

®Ó minh häa vßng lÆp DO vµ so s¸nh nã víi vßng lÆp While mµ ta ®· xÐt ë bµi tr­íc:

Vßng lÆp DO Vßng lÆp While

SUM = 0.0 SUM = 0.0


DO 10 NUM = 1, 50 NUM = 1
SUM = SUM + NUM 10 IF (NUM .LE. 50) THEN
10 CONTINUE SUM = SUM + NUM
NUM = NUM + 1
GO TO 10
END IF

119 120
Trong vßng lÆp DO trªn ®©y chØ sè ®Õm NUM ®­îc khëi x­íng b»ng 1. Vßng tiÕp tôc lÆp cho ®Õn khi gi¸ trÞ cña NUM lín h¬n 50. V× tham sè thø ba bá qua nªn
NUM tù ®éng t¨ng lªn 1 ë cuèi mçi lÇn lÆp. Ta thÊy r»ng vßng lÆp DO viÕt ng¾n gän h¬n vßng lÆp While, nh­ng c¶ hai tÝnh cïng mét gi¸ trÞ cña biÕn SUM. Tuy nhiªn,
trong vßng lÆp While ë mçi lÇn lÆp biÓu thøc l«gic lu«n ph¶i ®­îc ­íc l­îng l¹i v× mçi lÇn biÕn NUM ®­îc thay bëi gi¸ trÞ míi.. Trong khi ®ã ë vßng lÆp DO sè lÇn lÆp ®·
®­îc tÝnh tr­íc trong lÖnh DO. §ã lµ sù kh¸c nhau c¬ b¶n cña hai lo¹i vßng lÆp.
Ng­êi ta còng cã thÓ dïng có ph¸p sau ®©y cho vßng lÆp DO:

DO ind = ini, lim , inc


LÖnh 1
...
LÖnh m
END DO

5.1.2. Nh÷ng quy t¾c cÊu tróc vµ thùc hiÖn vßng lÆp DO
1) ChØ sè ®Õm ph¶i lµ mét biÕn sè, biÕn ®ã cã thÓ lµ kiÓu nguyªn hoÆc thùc, nh­ng kh«ng thÓ lµ biÕn cã chØ sè.
2) C¸c tham sè cña vßng DO cã thÓ lµ h»ng, biÕn hay biÓu thøc nguyªn hoÆc thùc. Gia sè cã thÓ lµ sè d­¬ng, sè ©m, nh­ng kh«ng thÓ b»ng kh«ng.
3) Vßng DO cã thÓ dïng bÊt kú lÖnh thùc hiÖn nµo kh«ng ph¶i lµ mét lÖnh chuyÓn ®iÒu khiÓn, lÖnh IF hay mét lÖnh DO kh¸c lµm lÖnh cuèi vßng. LÖnh CONTINUE
lµ mét lÖnh thùc hiÖn chuyªn dïng lµm lÖnh cuèi vßng; mÆc dï cã thÓ dïng nh÷ng lÖnh kh¸c, nh­ng nãi chung nªn dïng lÖnh CONTINUE ®Ó chØ cuèi vßng lÆp mét c¸ch
t­êng minh.
4) Sù kiÓm tra kÕt thóc lÆp thùc hiÖn ë ®Çu vßng lÆp. NÕu gi¸ trÞ ®Çu cña chØ sè ®Õm lín h¬n gi¸ trÞ cuèi vµ gia sè lµ sè d­¬ng th× sù lÆp kh«ng diÔn ra, c¸c lÖnh bªn
trong vßng lÆp bÞ bá qua vµ ®iÒu khiÓn chuyÓn tíi lÖnh ®øng sau lÖnh cuèi cïng cña vßng lÆp.
5) Kh«ng ®­îc thay ®æi gi¸ trÞ cña chØ sè ®Õm b»ng mét lÖnh nµo kh¸c bªn trong vßng DO trong khi thùc hiÖn vßng lÆp.
6) Sau khi vßng lÆp ®· b¾t ®Çu thùc hiÖn th× nh÷ng thay ®æi c¸c gi¸ trÞ cña c¸c tham sè kh«ng cã ¶nh h­ëng g× tíi sù lÆp.
7) NÕu gia sè lµ ©m, sù lÆp sÏ kÕt thóc khi gi¸ trÞ chØ sè ®Õm nhá h¬n gi¸ trÞ cuèi.
8) Ta cã thÓ tho¸t ra khái vßng DO tr­íc khi nã kÕt thóc lÆp. Khi ®ã gi¸ trÞ cña chØ sè ®Õm sÏ b»ng gi¸ trÞ ngay tr­íc khi tho¸t. (Nh­ng nãi chung kh«ng nªn lµm
®iÒu nµy. NÕu ta muèn tho¸t ra khái vßng lÆp tr­íc khi nã kÕt thóc mét c¸ch tù nhiªn, th× ta cÊu tróc l¹i vßng lÆp theo kiÓu vßng lÆp While ®Ó gi÷ tÝnh cÊu tróc cña ch­¬ng
tr×nh).
9) Thùc hiÖn xong vßng lÆp, chØ sè ®Õm chøa mét gi¸ trÞ v­ît qu¸ gi¸ trÞ cuèi.
10) Bao giê còng ®i vµo vßng lÆp th«ng qua lÖnh DO ®Ó vßng lÆp ®­îc khëi x­íng mét c¸ch ®óng ®¾n. Kh«ng bao giê ®­îc dïng lÖnh GO TO chuyÓn tõ bªn ngoµi

121 122
vµo bªn trong vßng DO.
11) Sè lÇn lÆp cã thÓ tÝnh b»ng c«ng thøc
 lim -ini 
 inc  + 1
 
trong ®ã dÊu ngoÆc vu«ng chØ sù c¾t bá thËp ph©n cña th­¬ng sè. NÕu gi¸ trÞ nµy ©m th× sù lÆp kh«ng x¶y ra.

5.1.3. ThÝ dô øng dông vßng lÆp DO


ThÝ dô 9: LËp vßng lÆp b»ng lÖnh DO. LËp b¶ng gi¸ trÞ cña ®a thøc 3 t 2 + 4,5 trªn ®o¹n t tõ 1 ®Õn 10 víi b­íc ∆t = 1 .

PRINT * , ' POLYNOMIAL MODEL'


PRINT *
PRINT * , 'TIME POLYNOMIAL'
DO 15 I = 1, 10
POLY = 3. * REAL (I) ** 2 + 4.5
PRINT 10 , I , POLY
10 FORMAT (1X, I2, 8X, F6.2)
15 CONTINUE
END

ThÝ dô 10: T×m phÇn tö cùc ®¹i cña chuçi sè b1 , b2 , ..., b10 . Ta gi¶i bµi to¸n nµy theo thuËt gi¶i biÓu diÔn bëi gi¶ tr×nh sau:

1) víi i tõ 1 ®Õn 10
nhËp bi
2) bmax ← b1
3) víi i tõ 2 ®Õn 10
nÕu bi > bmax th× bmax ← bi
4) in bmax
Tõ gi¶ tr×nh nµy dÔ dµng chuyÓn thµnh ch­¬ng tr×nh Fortran d­íi ®©y:

123 124
REAL B(10)
DO 2 I = 1, 10
READ *, B (I)
2 CONTINUE
BMAX = B (1)
DO 3 I = 2, 10
IF (BMAX .LT. B (I)) BMAX = B (I)
3 CONTINUE
PRINT *, ' B MAX = ' , BMAX
END
ThÝ dô 11: Tæ chøc vßng lÆp víi b­ íc sè thËp ph©n. In b¶ng gi¸ trÞ hµm y = sin ( x ) t¹i x = 0; 0,1; 0,2; ...; 1. Ta ®­a ra mét biÕn nguyªn I sao cho biÕn nµy sÏ nhËn
c¸c gi¸ trÞ 1, 2, ..., 11 t­¬ng øng víi x = 0; 0,1; 0,2; ...; 1. Khi ®ã x = 0,1 (i − 1) .
DO 17 I = 1, 11
X = 0.1 * (I − 1)
Y = SIN (X)
PRINT 10 , X, Y
10 FORMAT (20X, F4.2, 10X, E10.3)
17 CONTINUE
END
H·y l­u ý r»ng ë ®©y ta ®· tr¸nh sö dông vßng lÆp DO víi c¸c tham sè thùc nh­:
DO 15 X = 0.0 , 1.0 , 0.1
®Ó phßng ngõa hiÖn t­îng c¾t trong m¸y tÝnh. Gi¶ sö r»ng gi¸ trÞ 0.1 ®­îc l­u nh­ mét gi¸ trÞ h¬i nhá h¬n 0.1 trong hÖ m¸y tÝnh ®ang dïng, mçi lÇn thªm 0.1 cho chØ sè
®Õm, m¸y cã thÓ thªm Ýt h¬n theo dù ®Þnh. Ngoµi ra, trong tr­êng hîp nµy ta cã thÓ thùc hiÖn lÆp qu¸ mÊt mét lÇn theo dù ®Þnh v× gi¸ trÞ giíi h¹n cuèi còng cã thÓ kh«ng
chÝnh x¸c b»ng 1.0.

5.2. Vßng DO lång nhau

Vßng DO cã thÓ ®­îc lång trong mét vßng DO kh¸c, còng gièng nh­ cÊu tróc IF lång trong cÊu tróc IF kh¸c. Khi tæ chøc c¸c vßng DO lång h·y tu©n thñ nh÷ng quy

125 126
t¾c sau ®©y:
1) Vßng DO lång bªn trong kh«ng thÓ dïng chÝnh chØ sè ®Õm cïng víi vßng DO ngoµi chøa nã.
2) Vßng DO lång ph¶i kÕt thóc bªn trong vßng DO ngoµi.
3) C¸c vßng DO ®éc lËp nhau cã thÓ dïng cïng chØ sè ®Õm, thËm chÝ khi chóng cïng n»m trong mét vßng DO ngoµi.
4) Khi mét vßng DO lång bªn trong mét vßng DO kh¸c, th× vßng DO trong thùc hiÖn trän vÑn tõng lÇn lÆp ë vßng DO ngoµi.
5) MÆc dï c¸c vßng DO lång cã thÓ dïng cïng mét dßng lÖnh cuèi CONTINUE, nh­ng ta nªn kÕt thóc mçi vßng b»ng mét lÖnh CONTINUE riªng biÖt ®Ó lµm s¸ng
râ ch­¬ng tr×nh.
D­íi ®©y dÉn mét sè thÝ dô vÒ c¸c vßng DO ®óng vµ c¸c vßng DO sai:
a) Nh÷ng vßng DO ®óng:
DO 15 I = 1, 5 DO 15 I = 1, 5
DO 10 J = 1, 8 DO 10 K = 1, 8
DO 5 K = 2, 10, 2 ...
... 10 CONTINUE
5 CONTINUE DO 5 K = 2, 10, 2
10 CONTINUE ...
15 CONTINUE 5 CONTINUE
15 CONTINUE
b) Nh÷ng vßng DO sai:
DO 15 I = 1, 5 DO 20 J = 1, 5
DO 10 J = 1, 8 DO 10 J = 1, 8
DO 5 K = 2, 10, 2 ...
... 10 CONTINUE
10 CONTINUE DO 15 K = 2, 10, 2
... DO 15 K = 2, 10, 2
5 CONTINUE ...
15 CONTINUE 15 CONTINUE
20 CONTINUE
ThÝ dô 12: Tæ chøc vßng DO lång nhau. 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.

127 128
REAL X(15), Y(15)
N = 15
DO 3 I =1, N
READ * , X (I)
Y (I) = X (I)
3 CONTINUE
DO 2 I = 1, N−1
K=I
DO 4 J = I + 1, N
IF (Y (K) .LT. Y (J)) K = J
4 CONTINUE
IF (K .NE. I) THEN
TG = Y (I)
Y (I) = Y (K)
Y (K) = TG
END IF
2 CONTINUE
DO 7 I = 1, N
PRINT 5 , X (I), Y (I)
7 CONTINUE
5 FORMAT (1X, 2F10.2)
END
Trong thÝ dô nµy, ta thÊy cã mÆt ba vßng DO ®éc lËp nhau:
DO 3 I =1, N (dßng thø 3)
DO 2 I =1, N−1 (dßng thø 7)
DO 7 I = 1, N (dßng thø 18)

do ®ã, chóng cã thÓ dïng cïng mét chØ sè ®Õm lµ biÕn I. Bªn trong vßng DO thø hai, ta thÊy xuÊt hiÖn mét vßng DO thø t­:
DO 4 J = I + 1, N (dßng thø 9),
vßng DO nµy lµ vßng DO lång, nã ph¶i cã chØ sè ®Õm riªng vµ ta dïng lÖnh kÕt thóc nã lµ lÖnh

129 130
4 CONTINUE
®Ó nhÊn m¹nh sù ph©n biÖt víi vßng DO ngoµi cã lÖnh kÕt thóc lµ
2 CONTINUE

ThÝ dô 13: TÝnh giai thõa. Khi sè nguyªn N kh«ng ©m, biÓu thøc N ! gäi lµ giai thõa cña N . C¸c gi¸ trÞ cña giai thõa ®­îc tÝnh theo quy luËt:
0 != 1
1! = 1
2 != 1 × 2 = 2
3!= 1 × 2 × 3 = 6
.. .
Gi¸ trÞ cña giai thõa cña sè nguyªn N còng cßn ®­îc ­íc l­îng b»ng c«ng thøc Stirling cã d¹ng:
N
N
N ! = 2π N  
e
trong ®ã e = 2,718282 . ViÕt ch­¬ng tr×nh in c¸c gi¸ trÞ giai thõa cña c¸c sè nguyªn tõ 0 ®Õn 10 theo c¸ch tÝnh chÝnh x¸c vµ theo c«ng thøc ­íc l­îng
cña Stirling.
PRINT 4
4 FORMAT (1X, 'GIAI THUA CUA CAC SO TU 0 DEN 10'
* //1X, T3, 'N', T12, 'N!', T16, 'STIRLING''S FORMULA' /)
FAC = 1.
DO 7 I = 0, 10
IF (I .GT. 1) FAC = FAC * I
PRINT 5, I, FAC, SQRT (2.*3.141593*I)*(I / 2.718282)** I
5 FORMAT (1X, I2, F10.0, F20.0)
7 CONTINUE
END

Trong ch­¬ng tr×nh nµy, v× giai thõa ®­îc tÝnh liªn tôc víi c¸c sè tõ 0 ®Õn 10, nªn giai thõa cña mét sè sau ®­îc tÝnh b»ng tÝch cña sè ®ã nh©n víi giai thõa cña sè
tr­íc nã. H·y chó ý c¸ch dïng dÊu g¹ch chÐo ®Ó t¹o xuèng dßng khi in tiªu ®Ò: hai dÊu g¹ch chÐo ®Çu chØ ®Þnh cho lÖnh PRINT in xong dßng ch÷ GIAI THUA CUA
CAC SO TU 0 DEN 10 th× xuèng dßng hai lÇn, sau khi in dßng tiªu ®Ò cét, dÊu g¹ch chÐo thø ba g©y xuèng dßng mét lÇn ®Ó chuÈn bÞ in d÷ liÖu theo dßng lÖnh in trong
vßng lÆp DO. C¸c ®Æc t¶ T3, T12, T16 trong dßng lÖnh 4 FORMAT chØ ®Þnh xuÊt ch÷ N ë vÞ trÝ 3, N! ë vÞ trÝ 12 vµ 13, ch÷ STIRLING'S FORMULA b¾t ®Çu ë vÞ trÝ thø

131 132
16 cña dßng tiªu ®Ò cét. KÕt qu¶ xuÊt ra cña ch­¬ng tr×nh nµy sÏ cã d¹ng d­íi ®©y:
GIA TRI GIAI THUA CAC SO TU 0 DEN 10

N N! STIRLING'S FORMULA

0 1. 0.
1 1. 1.
2 2. 2.
3 6. 6.
4 24. 24.
5 120. 118.
6 720. 710.
7 5040. 4980.
8 40320. 39902.
9 362880. 359537.
10 3628800. 3598694.
Bµi tËp

1. TÝnh sè lÇn lÆp trong c¸c tr­êng hîp dïng lÖnh DO sau ®©y. Gi¶ thiÕt r»ng c¸c chØ sè ®Õm lµ nh÷ng biÕn nguyªn:
1) DO 5 I = 1, 8 2) DO 10 COUNT = -4, 4
3) DO 10 K = 15, 3, −1 4) DO 10 TIME = −5, 15, 3
5) DO 10 TIME = 50, 250, 25 6) DO 10 IND = 72, 432, 4

2. X¸c ®Þnh gi¸ trÞ cña biÕn nguyªn IDEM sau khi nh÷ng vßng DO d­íi ®©y thùc hiÖn xong. Gi¶ sö biÕn nµy ®­îc g¸n gi¸ trÞ kh«ng tr­íc mçi vßng lÆp.

1) DO 5 I = 1, 8 2) DO 5 IDEX =0, 7
IDEM = IDEM + 1 IDEM = IDEM − 2
5 CONTINUE 5 CONTINUE

3) DO 5 NUM = 8, 0, −1 4) DO 5 M = 5, 5
IDEM = IDEM + 2 IDEM = IDEM + (−1) **M
5 CONTINUE 5 CONTINUE

3. Mét hßn ®¸ ®­îc nÐm víi tèc ®é ban ®Çu v vµ nghiªng mét gãc θ so víi mÆt ®Êt. NÕu bá qua lùc c¶n ma s¸t víi kh«ng khÝ th× kho¶ng c¸ch d theo chiÒu ngang
kÓ tõ vÞ trÝ ban ®Çu vµ ®é cao h (tÝnh b»ng mÐt) cña nã t¹i thêi gian t (gi©y) biÓu thÞ b»ng c¸c ph­¬ng tr×nh sau:

133 134
d = v t cos θ ,
1 2
h = v t sin θ − gt ,
2
trong ®ã g − gia tèc träng lùc ( 9,8 m/s 2 ). ViÕt ch­¬ng tr×nh ®äc vËn tèc ban ®Çu vµ gãc vµ sau ®ã in b¶ng c¸c kho¶ng c¸ch vµ ®é cao cña hßn ®¸ víi thêi gian c¸ch nhau
0,25 gi©y cho tíi khi ®é cao trë thµnh gi¸ trÞ ©m, tøc lóc hßn ®¸ r¬i xuèng mÆt ®Êt.

4. H·y tæ chøc l¹i c¸c vßng lÆp trong thÝ dô 13 b»ng c¸ch sö dông kÕt hîp lÖnh IF l«gic vµ lÖnh chuyÓn ®iÒu khiÓn v« ®iÒu kiÖn GOTO. Ph©n tÝch sù kh¸c nhau cña
hai c¸ch tæ chøc vßng lÆp.

5. Gi¶ sö c¸c gi¸ trÞ quan tr¾c hai ®¹i l­îng x vµ y ®­îc cho nh­ trong b¶ng 4.4 (trang 79). H·y viÕt ch­¬ng tr×nh tÝnh c¸c ®Æc tr­ng thèng kª: trung b×nh m x , m y ,
ph­¬ng sai D x , D y , ®é lÖch b×nh ph­¬ng trung b×nh σ x , σ y , hÖ sè t­¬ng quan r gi÷a hai ®¹i l­îng vµ lËp ph­¬ng tr×nh håi quy d¹ng:
y=a x+b,
trong ®ã:
σy
a= r, b = m y − amx ,
σx
n n
∑ xi ∑ xi2
i =1 i =1
mx = , Dx = − m x2 , σ x = Dx
n n −1
n n
∑ yi ∑ yi2
i =1 i =1
my = , Dy = − m 2y , σ x = Dx
n n −1
n
∑ xi yi
i =1
− m xm y
r = n −1 .
σ xσ y

6. ViÕt ch­¬ng tr×nh tÝnh trÞ gÇn ®óng cña tÝch ph©n
b
I = ∫ x 2 sin xdx
a

135 136
theo c«ng thøc h×nh thang víi sai sè kh«ng lín h¬n 0,0001, x¸c ®Þnh sè h×nh thang cÇn chia ®Ó ®¹t sai sè ®ã. Ch­¬ng tr×nh cho phÐp nhËp tõ bµn phÝm c¸c cËn tÝch ph©n
vµ in kÕt qu¶ lªn mµn h×nh thµnh c¸c dßng nh­ sau (thÝ dô nÕu a = 0,5 vµ b = 1,5 ):
A = 0.5
B = 1.5
SO HINH THANG = 16
TICH PHAN BANG = 0.9604

7. ViÕt ch­¬ng tr×nh cho phÐp nhËp tõ bµn phÝm mét gãc a tÝnh b»ng ®é, ®æi gãc ®ã thµnh ra®ian vµ tÝnh gi¸ trÞ gÇn ®óng cña cos a víi ®é chÝnh x¸c tíi 0,0001
theo c«ng thøc khai triÓn sau ®©y:
a 2 a 4 a6
cos a = 1 − + − + ...
2! 4! 6!
In kÕt qu¶ lªn mµn h×nh thµnh mét dßng nh­ sau (thÝ dô):
A = 60.000 (DO) cos A = 0.5000 cos A theo hµm chuÈn = 0.5000

8. ViÕt ch­¬ng tr×nh cho phÐp nhËp tõ bµn phÝm hai sè nguyªn (nhá h¬n 10) tuÇn tù chØ sè dßng vµ sè cét cña mét ma trËn. Sau ®ã tÝnh c¸c phÇn tö cña ma trËn sao
cho mçi phÇn tö lµ mét sè nguyªn gåm hai ch÷ sè, ch÷ sè ®Çu chØ sè thø tù dßng vµ ch÷ sè sau chØ sè thø tù cét. In ma trËn ®ã lªn gi÷a mµn h×nh d­íi d¹ng b¶ng sè th¼ng
dßng, th¼ng cét, thÝ dô:

11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
51 52 53 54
61 62 63 64

Ch­¬ng 6

137 138
File d÷ liÖu vµ tæ chøc file d÷ liÖu trong Fortran

6.1. Kh¸i niÖm vÒ file d÷ liÖu vµ tæ chøc l­u tr÷ d÷ liÖu

ë c¸c ch­¬ng tr­íc, trong qu¸ tr×nh thùc hiÖn ch­¬ng tr×nh, khi nµo cÇn ta ®· sö dông lÖnh READ ®Ó nhËp th«ng tin vµo qua bµn phÝm cho ch­¬ng tr×nh xö lý. ThÝ
dô: khi ch¹y ch­¬ng tr×nh gi¶i ph­¬ng tr×nh bËc hai trong thÝ dô 1 ë ch­¬ng 4, ta ph¶i nhËp ba hÖ sè a, b, c . Víi mét l­îng th«ng tin kh«ng nhiÒu, thÝ dô mét vµi gi¸ trÞ
sè hay mét vµi ký tù v¨n b¶n, th× h×nh thøc giao tiÕp nµy gi÷a ng­êi vµ m¸y lµ b×nh th­êng. Nh­ng khi lµm viÖc víi nhiÒu sè liÖu, sÏ lµ bÊt tiÖn nÕu ph¶i nhËp d÷ liÖu b»ng
tay nh­ vËy mçi lÇn ch¹y ch­¬ng tr×nh. ThÝ dô, trong bµi to¸n ®· xÐt ë thÝ dô 8 (trang 74) ta ph¶i nhËp tõ bµn phÝm hai chuçi gi¸ trÞ ®é s©u vµ nhiÖt ®é gåm vµi chôc sè
liÖu ë c¸c tÇng kh¸c nhau (64 sè) chØ ®Ó néi suy mét gi¸ trÞ nhiÖt ®é. Ngoµi ra, nÕu trong khi ch¹y ch­¬ng tr×nh mµ ta gâ nhÇm sè liÖu th× ph¶i ch¹y l¹i ch­¬ng tr×nh tõ ®Çu
vµ ®­¬ng nhiªn ph¶i nhËp l¹i sè liÖu mét lÇn n÷a. C«ng viÖc ®ã tá ra rÊt mÖt mái vµ kh«ng tèi ­u.
V× vËy, ng­êi ta th­êng nhËp d÷ liÖu vµo m¸y mét lÇn vµ l­u trong m¸y (®Üa cøng, ®Üa mÒm...) d­íi d¹ng c¸c tÖp (file). Trong tr­êng hîp nµy ng­êi sö dông m¸y
ph¶i dïng mét phÇn mÒm so¹n th¶o nµo ®ã ®Ó nhËp d÷ liÖu vµo m¸y vµ l­u l¹i d­íi d¹ng c¸c file. Ngoµi ra, d÷ liÖu (th­êng lµ nh÷ng gi¸ trÞ sè) còng cã thÓ do mét thiÕt bÞ
quan tr¾c cã bé phËn ghi l­u vµo ®Üa tõ, b¨ng tõ, æ cøng m¸y tÝnh theo mét quy c¸ch nµo ®ã sau nµy m¸y tÝnh cã thÓ ®äc ®­îc. D÷ liÖu còng cã thÓ lµ kÕt qu¶ tÝnh to¸n, xö
lý cña mét ch­¬ng tr×nh m¸y tÝnh, sau ®ã ®­îc ghi l¹i thµnh file ®Ó ng­êi sö dông m¸y xem nh­ lµ kÕt qu¶ tÝnh to¸n ®Ó ph©n tÝch, nhËn xÐt, sau nµy cã thÓ in ra giÊy nh­
lµ mét b¶n b¸o c¸o, hay ®Ó mét ch­¬ng tr×nh kh¸c ®äc vµ tiÕp tôc xö lý, chÕ biÕn.
Trong ch­¬ng nµy chóng ta sÏ nghiªn cøu nh÷ng lÖnh cña Fortran thao t¸c víi d÷ liÖu, t×m hiÓu nh÷ng ®Æc ®iÓm cña chóng ®Ó h×nh thµnh kü thuËt tæ chøc l­u d÷ liÖu
trong m¸y tÝnh.
File d÷ liÖu lµ file trong m¸y tÝnh chøa nh÷ng th«ng tin cã quan hÖ víi nhau theo mét nghÜa nµo ®ã mµ mét ch­¬ng tr×nh cã thÓ ®äc, hay truy cËp ®­îc nÕu ta muèn
ch­¬ng tr×nh xö lý tù ®éng nh÷ng th«ng tin ®ã.
Ch­¬ng tr×nh m¸y tÝnh truy cËp ®Õn c¸c file theo tªn cña chóng. Tªn file ®­îc ®Æt tu©n theo quy t¾c tªn nh­ ®èi víi c¸c biÕn. Ngoµi ra tªn file cßn cã thÓ cã mét
phÇn më réng, cßn gäi lµ ®u«i file, gåm tæ hîp kh«ng qu¸ ba ch÷ c¸i hoÆc ch÷ sè. PhÇn më réng nµy ®øng sau phÇn tªn chÝnh cña file vµ ng¨n c¸ch b»ng dÊu chÊm.
Trong thùc hµnh ng­êi ta th­êng ®Æt tªn file b»ng tËp hîp mét sè ch÷ c¸i vµ ch÷ sè cã ý nghÜa gîi cho ng­êi dïng dÔ nhí ®ã lµ file chøa nh÷ng d÷ liÖu g×. ThÝ dô,
nÕu chóng ta cã nh÷ng sè liÖu quan tr¾c vÒ nhiÖt ®é kh«ng khÝ cña mét sè th¸ng muèn l­u trong mét sè file th× cã thÓ nªn ®Æt tªn c¸c file ®ã lµ NHIET.1, NHIET.2 v.v...
ë ®©y ngô ý muèn dïng côm ch÷ NHIET ®Ó chØ c¸c file ®ã l­u tr÷ sè liÖu vÒ nhiÖt ®é, cßn phÇn ®u«i cña tªn file nh»m chØ sè liÖu vÒ nhiÖt nh­ng riªng cho th¸ng 1, th¸ng
2... C¸c file trong m¸y tÝnh l¹i cã thÓ ®­îc ghi vµo nh÷ng th­ môc cã tªn kh¸c nhau. Trong mçi th­ môc l¹i cã thÓ gåm mét sè th­ môc con còng cã tªn cña chóng, h×nh
thµnh mét c©y th­ môc. Mét nhãm file cã quan hÖ t­¬ng ®èi víi nhau theo nghÜa nµo ®ã cã thÓ ghi chung vµo mét th­ môc, mét sè file kh¸c th× cã thÓ ghi trong nh÷ng th­
môc kh¸c. Kinh nghiÖm cho thÊy r»ng viÖc tæ chøc l­u c¸c file trong m¸y tÝnh mét c¸ch cã hÖ thèng, khoa häc sÏ gi¶m nhÑ vµ n©ng cao hiÖu qu¶ c«ng viÖc cña ng­êi sö
dông m¸y tÝnh.
XÐt vÒ ph­¬ng diÖn l­u tr÷ d÷ liÖu l©u dµi th× ng­êi ta th­êng cè g¾ng ghi trong file sao cho phong phó th«ng tin, ®¸p øng viÖc xö lý nhiÒu môc ®Ých. ThÝ dô, víi file
chøa nh÷ng sè liÖu c¸c tham sè khÝ t­îng thuû v¨n ë mét tr¹m quan tr¾c nµo ®ã, th× ngoµi nh÷ng gi¸ trÞ sè cña c¸c tham sè ®ã, nªn cã thªm nh÷ng th«ng tin vÒ tªn tr¹m,

139 140
täa ®é tr¹m, thêi kú quan tr¾c, cã thÓ ghi tªn c¸c tham sè quan tr¾c mét c¸ch t­êng minh...
Tuú theo ®Æc ®iÓm vµ kh¶ n¨ng xö lý cña ch­¬ng tr×nh hay phÇn mÒm mµ ng­êi ta ghi c¸c d÷ liÖu trong file sao cho gän, dÔ ®äc, dÔ chuyÓn ®æi tõ ®Þnh d¹ng
(format) nµy sang ®Þnh d¹ng kh¸c, tøc xu thÕ chuÈn ho¸ ®Þnh d¹ng d÷ liÖu ®Ó nhiÒu ch­¬ng tr×nh, nhiÒu phÇn mÒm cã thÓ ®äc ®­îc.
Trong ch­¬ng nµy chóng ta häc c¸ch lµm viÖc víi nh÷ng file d÷ liÖu sè, lµm thÕ nµo ®Ó ®äc th«ng tin tõ file d÷ liÖu hiÖn tån t¹i vµ lµm thÕ nµo ®Ó t¹o ra file d÷ liÖu
míi trong ch­¬ng tr×nh Fortran mµ chóng ta viÕt.

6.2. C¸c lÖnh nhËp, xuÊt d÷ liÖu víi file

§Ó sö dông c¸c file víi ch­¬ng tr×nh cña m×nh, chóng ta ph¶i dïng nh÷ng lÖnh míi ®Ó thao t¸c víi file vµ nh÷ng më réng ®èi víi mét sè lÖnh ®· nghiªn cøu trong
c¸c ch­¬ng tr­íc. Nh÷ng lÖnh nµy truy cËp ®Õn tªn file mµ ta ®· g¸n khi t¹o lËp file. NÕu ta t¹o lËp mét file d÷ liÖu b»ng phÇn mÒm so¹n th¶o, ta g¸n tªn cho file khi nhËp
d÷ liÖu. NÕu ta t¹o ra mét file b»ng mét ch­¬ng tr×nh, ta ph¶i dïng mét lÖnh trong ch­¬ng tr×nh cÊp cho file mét tªn nhÊt ®Þnh.
NÕu mét file chuÈn bÞ ®­îc dïng trong ch­¬ng tr×nh, file ®ã ph¶i ®­îc më ra tr­íc khi cã mét thao t¸c nµo ®ã víi nã. LÖnh më file OPEN b¸o cho ch­¬ng tr×nh mét
sè th«ng tin cÇn thiÕt vÒ file nh­ tªn file, file ®ã më ra ®Ó ®äc hay ®Ó ghi d÷ liÖu. Ngoµi ra lÖnh OPEN g¾n file ®­îc më víi mét sè hiÖu file ®Ó khi nµo ch­¬ng tr×nh truy
cËp file th× nã sö dông sè hiÖu ®ã. D¹ng tæng qu¸t cña lÖnh OPEN mµ ta sö dông trong ch­¬ng nµy nh­ sau:

OPEN (UNIT = biÓu thøc nguyªn, FILE = tªn file, STATUS = v¨n b¶n)

trong ®ã biÓu thøc nguyªn chØ ®Þnh mét sè hiÖu thiÕt bÞ ®­îc g¸n cho file, tªn file chØ ®Þnh mét tªn mµ ta ®· g¸n cho file khi t¹o lËp ra nã vµ v¨n b¶n STATUS b¸o cho
ch­¬ng tr×nh biÕt file më ra ®Ó ®äc hay ®Ó ghi, file ®· tån t¹i hay chuÈn bÞ t¹o ra. NÕu lµ file ®Ó ®äc, ta chØ ®Þnh
STATUS = 'OLD'
nÕu file më ra ®Ó xuÊt, ta chØ ®Þnh
STATUS = 'NEW'
cßn
STATUS = 'UNKNOWN'
cho phÐp më file míi hoÆc ghi ®Ì lªn file ®· tån t¹i.
LÖnh OPEN ph¶i ®øng trªn nh÷ng lÖnh READ hoÆc WRITE sö dông file.
§Ó ®äc file d÷ liÖu, ta sö dông lÖnh READ më réng d­íi d¹ng:

READ (Sè hiÖu thiÕt bÞ , *) Danh s¸ch c¸c biÕn

141 142
§Ó ghi th«ng tin vµo file d÷ liÖu ta sö dông lÖnh WRITE. Gièng nh­ lÖnh PRINT, lÖnh WRITE cã thÓ sö dông ®Ó xuÊt th«ng tin ra d­íi d¹ng danh s¸ch liÖt kª vµ
d­íi d¹ng ghi kh«ng ®Þnh d¹ng hoÆc cã ®Þnh d¹ng:

WRITE (Sè hiÖu thiÕt bÞ , *) Danh s¸ch c¸c biÓu thøc

WRITE (Sè hiÖu thiÕt bÞ , n ) Danh s¸ch c¸c biÓu thøc

trong ®ã n lµ nh·n cña lÖnh FORMAT (®Þnh d¹ng) t­¬ng øng. Trong tÊt c¶ c¸c d¹ng tæng qu¸t trªn ®©y sè hiÖu thiÕt bÞ phï hîp víi sè hiÖu thiÕt bÞ ®· g¸n trong lÖnh
OPEN. DÊu sao * ®øng sau sè hiÖu thiÕt bÞ chØ r»ng ta ®ang sö dông c¸ch nhËp vµ xuÊt kh«ng ®Þnh d¹ng (kh«ng format).
C¸c m¸y tÝnh cã thÓ cã mét sè thiÕt bÞ nhËp hoÆc xuÊt ®i kÌm. Mçi thiÕt bÞ ®­îc g¸n mét sè hiÖu. ThÝ dô, nÕu m¸y in lazer ®­îc g¸n sè hiÖu 8 th× lÖnh in sau ®©y sÏ
ghi gi¸ trÞ cña c¸c biÕn X vµ Y ra m¸y in laser
WRITE (8 , *) X, Y
§a sè c¸c hÖ m¸y tÝnh g¸n thiÕt bÞ nhËp chuÈn (bµn phÝm) b»ng sè 5 vµ thiÕt bÞ xuÊt chuÈn (mµn h×nh) b»ng sè 6; nh÷ng thiÕt bÞ nµy ®· ®­îc dïng ngÇm ®Þnh víi c¸c
lÖnh READ * hay PRINT *. Do ®ã kh«ng nªn dïng nh÷ng sè hiÖu thiÕt bÞ ®· g¸n tr­íc nµy cho c¸c file d÷ liÖu. Ta cã thÓ dïng bÊt kú nh÷ng sè hiÖu kh¸c trong c¸c sè
nguyªn tõ 1 ®Õn 15 ®Ó chØ ®¬n vÞ file.
Sau khi kÕt thóc ®äc hoÆc ghi file, c¸c file tù ®éng ®ãng l¹i tr­íc khi ch­¬ng tr×nh kÕt thóc. Còng cã nh÷ng tr­êng hîp ta muèn chñ t©m ®ãng hay t¸ch mét file khái
ch­¬ng tr×nh cña m×nh, vµ ®iÒu nµy nªn lµm. Ta sÏ dïng lÖnh ®ãng file cã d¹ng tæng qu¸t nh­ sau:

CLOSE (UNIT = BiÓu thøc nguyªn)

Nh÷ng lÖnh më, ®ãng file, xuÊt nhËp th«ng tin víi file trªn ®©y cßn cã nhiÒu tuú chän bæ sung kh¸c n÷a, sÏ ®­îc nh¾c tíi ë nh÷ng n¬i thÝch hîp trong c¸c môc vµ
c¸c ch­¬ng sau.
D­íi ®©y tãm t¾t mét sè quy t¾c quan träng cÇn nhí khi ®äc d÷ liÖu tõ c¸c file:
1. Mçi lÖnh READ sÏ b¾t ®Çu ®äc víi mét dßng d÷ liÖu míi, gäi lµ mét b¶n ghi (record). NÕu cßn thõa c¸c gi¸ trÞ ë dßng tr­íc, th× nh÷ng gi¸ trÞ ®ã bÞ bá qua kh«ng
®äc.
2. NÕu mét dßng kh«ng chøa ®ñ c¸c gi¸ trÞ so víi danh s¸ch c¸c biÕn cÇn ®äc trong lÖnh READ, th× c¸c dßng d÷ liÖu sau ®ã sÏ tù ®éng ®­îc ®äc cho ®Õn khi ®ñ gi¸
trÞ cho c¸c biÕn liÖt kª trong lÖnh READ.
3. Mét lÖnh READ kh«ng cÇn ph¶i ®äc tÊt c¶ c¸c gi¸ trÞ trªn dßng d÷ liÖu hiÖn thêi. Nh­ng nã ph¶i ®äc tÊt c¶ nh÷ng gi¸ trÞ trªn dßng ë tr­íc gi¸ trÞ mµ ta muèn nã
®äc. ThÝ dô nÕu mét file cã 5 gi¸ trÞ ghi trªn mét dßng vµ ta cÇn c¸c gi¸ trÞ thø ba vµ thø t­, ta ph¶i ®äc qua c¸c gi¸ trÞ thø nhÊt vµ thø hai ®Ó ®¹t tíi c¸c gi¸ trÞ thø ba vµ thø
t­, nh­ng ta kh«ng cÇn ph¶i ®äc gi¸ trÞ thø n¨m.
§Ó sö dông ®óng lÖnh READ, ta cÇn biÕt c¸c gi¸ trÞ ®· ®­îc ghi trong file nh­ thÕ nµo. ThÝ dô, gi¶ sö r»ng mçi dßng cña file d÷ liÖu chøa hai sè tuÇn tù biÓu thÞ thêi

143 144
gian TIME vµ sè ®o nhiÖt ®é TEMP vµ ba dßng ®Çu tiªn ghi nh­ sau:
0.0 28.3 (dßng 1)
0.1 29.1 (dßng 2)
0.2 29.5 (dßng 3)
th× lÖnh sau ®©y sÏ ®äc ®­îc ®óng mét cÆp gi¸ trÞ thêi gian vµ nhiÖt ®é tõ file d÷ liÖu
READ (10, *) TIME, TEMP
Nh­ng sÏ lµ sai nÕu ta dïng hai lÖnh sau
READ (10, *) TIME
READ (10, *) TEMP
Thùc hiÖn hai lÖnh nµy sÏ ®äc hai dßng cña file d÷ liÖu: gi¸ trÞ cña biÕn TIME sÏ b»ng 0.0 vµ gi¸ trÞ cña biÕn TEMP sÏ b»ng 0.1. Trong tr­êng hîp nµy ch­¬ng tr×nh
vÉn lµm viÖc b×nh th­êng nh­ng kÕt qu¶ xö lý sÏ sai. ThÝ dô nµy minh ho¹ sù quan träng cña viÖc kiÓm tra ch­¬ng tr×nh cña chóng ta ®èi víi d÷ liÖu ®· biÕt, tr­íc khi sö
dông nã víi file d÷ liÖu kh¸c.

6.3. Kü thuËt ®äc c¸c file d÷ liÖu

§Ó ®äc c¸c d÷ liÖu tõ file d÷ liÖu, tr­íc hÕt ta ph¶i biÕt mét sè th«ng tin vÒ file. Ngoµi tªn file, ta ph¶i biÕt d÷ liÖu g× ®­îc l­u trong file vµ cô thÓ ghi nh­ thÕ nµo: cã
bao nhiªu sè ghi trªn mét dßng vµ c¸c ®¬n vÞ ®o cña mçi gi¸ trÞ. Ta còng ph¶i biÕt trong file cã th«ng tin g× ®Æc biÖt cã Ých ®Ó ph©n ®Þnh ®­îc sè dßng ghi trong file, hay
®Ó x¸c ®Þnh khi nµo ta ®· ®äc hÕt dßng ghi cuèi cïng. Th«ng tin nµy quan träng, v× nÕu ta thùc hiÖn mét lÖnh READ sau khi tÊt c¶ c¸c dßng ghi trong file ®· ®­îc ®äc hÕt
råi th× sÏ bÞ lçi thùc hiÖn ch­¬ng tr×nh. Ta cã thÓ tr¸nh lçi ®ã b»ng c¸ch sö dông th«ng tin vÒ file ®Ó quyÕt ®Þnh xem lo¹i vßng lÆp nµo nªn dïng khi ®äc file. ThÝ dô, nÕu ta
biÕt cã 200 dßng ghi trong file th× ®­¬ng nhiªn cã thÓ dïng vßng lÆp DO thùc hiÖn 200 lÇn ®äc vµ tÝnh to¸n víi sè liÖu ®äc ®­îc. NhiÒu khi ta kh«ng biÕt tr­íc cã bao
nhiªu dßng ghi trong file, nh­ng ta biÕt dßng ghi cuèi cïng chøa nh÷ng gi¸ trÞ ®Æc biÖt lµm cho ch­¬ng tr×nh cña chóng ta cã thÓ kiÓm tra ®­îc. ThÝ dô, nÕu mét file chøa
c¸c sè liÖu vÒ thêi gian vµ sè ®o nhiÖt ®é d­íi d¹ng hai cét, th× c¶ hai cét ë dßng cuèi cïng nªn chøa hai sè −999 ®Ó ký hiÖu r»ng ®©y lµ dßng cuèi cïng cña file. Trong
tr­êng hîp nµy ta cã thÓ lËp vßng lÆp While ®Ó ®äc c¸c dßng sè liÖu vµ ®iÒu kiÖn kÕt thóc vßng lÆp nµy lµ hai gi¸ trÞ thêi gian vµ nhiÖt ®é ®Òu b»ng −999. Cã tr­êng hîp ta
kh«ng biÕt cã bao nhiªu dßng ghi vµ ë cuèi file còng kh«ng cã c¸c gi¸ trÞ ®Æc biÖt ®Ó nhËn biÕt. Khi ®ã ta ph¶i nhê ®Õn c¸c tuú chän (options) cña lÖnh READ.

6.3.1. Sè dßng ghi ®­îc chØ ®Þnh


NÕu ta biÕt ch¾c sè dßng ghi, cã thÓ dïng vßng lÆp DO ®Ó xö lý file. Khi t¹o lËp file, ngay ë dßng ghi ®Çu, ta nªn ghi mét sè th«ng tin chuyªn dông vÒ file, trong ®ã
cã sè dßng ghi (sè sè liÖu) trong file. VÒ sau, mçi lÇn bæ sung sè liÖu vµo file d÷ liÖu, ta cÇn söa l¹i dßng ghi nµy. Khi xö lý file, ta ®äc sè nµy vµo mét biÕn. Sau ®ã dïng
vßng lÆp DO víi biÕn ®ã lµm giíi h¹n cuèi cña vßng lÆp ®Ó ®äc hÕt sè liÖu trong file.

145 146
ThÝ dô 14: C¸ch ®äc file cã th«ng tin vÒ sè dßng sè liÖu ë dßng ®Çu file. Gi¶ sö file cã tªn lµ SOLIEU.DAT chøa c¸c gi¸ trÞ trung b×nh ngµy cña nhiÖt ®é, ®é Èm
kh«ng khÝ vµ ¸p suÊt khÝ quyÓn t¹i mét tr¹m quan tr¾c trong nhiÒu ngµy. Mçi dßng cña file ghi tuÇn tù ba ®¹i l­îng trªn cho mét ngµy. Riªng dßng thø nhÊt ghi tæng sè sè
liÖu (sè ngµy). §o¹n ch­¬ng tr×nh ®äc sè liÖu tõ file nµy vµ tÝnh gi¸ trÞ trung b×nh cña ba ®¹i l­îng cã thÓ nh­ sau:

INTEGER N, K
REAL ND, DA, AS, NDTB, DATB, ASTB
OPEN (UNIT = 2, FILE = 'SOLIEU.DAT', STATUS = 'OLD')
READ (2 ,*) N
IF (N .LT. 1) THEN
PRINT *, ' TRONG FILE KHONG CO SO LIEU '
ELSE
NDTB = 0.0
DATB = 0.0
ASTB = 0.0
DO 15 K = 1, N
READ (2, *) ND, DA, AS
NDTB = NDTB + ND
DATB = DATB + DA
ASTB = ASTB + AS
15 CONTINUE
NDTB = NDTB / REAL (N)
DATB = DATB / REAL (N)
ASTB = ASTB / REAL (N)
PRINT 25 , N, NDTB, DATB, ASTB
END IF
25 FORMAT (1X, 'SO NGAY = ' , I5 , ' ND =' , F6.2 , ' DA =' ,
* F6.2 , ' AS =' , F7.1)

147 148
CLOSE (2)
END

Trong thÝ dô nµy, sè sè liÖu ®­îc ®äc tõ dßng thø nhÊt cña file vµ g¸n vµo biÕn N . LÖnh IF kiÓm tra nÕu N < 1 th× th«ng b¸o kh«ng cã sè liÖu; nÕu cã sè liÖu th× ®äc
hÕt tÊt c¶ sè liÖu vµ tÝnh c¸c gi¸ trÞ trung b×nh. Vµ ta thÊy biÕn N ®­îc dïng lµm tham sè giíi h¹n cuèi cña lÖnh DO.

6.3.2. Dßng ký hiÖu kÕt thóc d÷ liÖu


Nh÷ng gi¸ trÞ ®Æc biÖt dïng ®Ó ®¸nh dÊu sù kÕt thóc cña file d÷ liÖu gäi lµ ký hiÖu kÕt thóc (Trailer hay Flags). Khi t¹o lËp file, ta thªm mét sè con sè ®Æc biÖt trong
dßng ghi cuèi cïng. VÒ sau, nÕu ta thªm hoÆc xo¸ ®i mét sè sè liÖu trong file, sÏ kh«ng ph¶i söa l¹i sè ghi tæng sè sè liÖu. Tuy nhiªn, nÕu dïng ph­¬ng ph¸p nµy ®Ó ®¸nh
dÊu hÕt file, th× ph¶i cÈn thËn sao cho ch­¬ng tr×nh cña chóng ta kh«ng ®­îc ®­a nh÷ng gi¸ trÞ ®Æc biÖt vµo xö lý nh­ c¸c gi¸ trÞ b×nh th­êng kh¸c. Cã thÓ chóng ta ph¶i
ghi chó vÒ ®iÒu nµy ë dßng ®Çu file. Ngoµi ra, nÕu dßng sè liÖu b×nh th­êng chøa bao nhiªu gi¸ trÞ th× dßng ký hiÖu kÕt thóc còng nªn cã chõng ®ã gi¸ trÞ ®Æc biÖt ®Ó ®¶m
b¶o cho lÖnh ®äc kh«ng m¾c lçi ch¹y ch­¬ng tr×nh. Ng­êi ta th­êng chän c¸c gi¸ trÞ ®Æc biÖt sao cho chóng kh¸c h¼n víi nh÷ng gi¸ trÞ b×nh th­êng, dÔ nhËn ra khi xem
b»ng m¾t c¸c sè liÖu trong file, thÝ dô nh­ sè nguyªn lín nhÊt 32767, mét tËp hîp c¸c sè chÝn nh­ 99999. Ta còng cã thÓ dïng c¸ch nµy ®Ó ®¸nh dÊu nh÷ng gi¸ trÞ khuyÕt
trong c¸c chuçi sè liÖu (Flags - cê hiÖu b¸o hÕt file hoÆc khuyÕt sè liÖu).

ThÝ dô 15: C¸ch ®äc file cã dßng sè liÖu ®¸nh dÊu hÕt file ë cuèi file vµ cê hiÖu b¸o khuyÕt sè liÖu. Gi¶ sö file d÷ liÖu víi néi dung nh­ trong thÝ dô 14, nh­ng ®­îc
t¹o ra theo c¸ch ®¸nh dÊu kÕt thóc d÷ liÖu b»ng dßng gåm ba côm sè 99999. Ngoµi ra, trong c¸c dßng sè liÖu b×nh th­êng cã nh÷ng gi¸ trÞ khuyÕt, kh«ng quan tr¾c, ®­îc
®¸nh dÊu b»ng con sè 32767. Ch­¬ng tr×nh sau ®©y cho phÐp ®äc vµ tÝnh to¸n ®óng c¸c trÞ sè trung b×nh cña ba ®¹i l­îng:

INTEGER N1, N2, N3


REAL ND, DA, AS, NDTB, DATB, ASTB
OPEN (UNIT = 2, FILE = 'SOLIEU.DAT', STATUS = 'OLD')
N1 = 0
N2 = 0
N3 = 0
NDTB = 0.0
DATB = 0.0
ASTB = 0.0
60 READ (2, *) ND, DA, AS

IF (ND.NE. 99999 .OR. DA .NE. 99999 .OR. AS .NE. 99999) THEN

149 150
IF (ND .NE. 32767.) THEN
NDTB = NDTB + ND
N1 = N1 + 1
END IF
IF (DA .NE. 32767.) THEN
DATB = DATB + DA
N2 = N2 + 1
END IF
IF (AS .NE. 32767.) THEN
ASTB = ASTB + AS
N3 = N3 + 1
END IF
GOTO 60
END IF
CLOSE (2)
IF (N1 .EQ. 0 .AND. N2 .EQ. 0 .AND. N3 .EQ. 0) THEN
PRINT * , ' TRONG FILE KHONG CO SO LIEU '
ELSE
IF (N1 .GT. 0) PRINT * , ' NHIET DO TRUNG BINH = ',
* NDTB / REAL (N1)
IF (N2 .GT. 0) PRINT * , ' DO AM TRUNG BINH = ',
* DATB / REAL (N2)
IF (N3 .GT. 0) PRINT * , ' AP SUAT TRUNG BINH = ',
* ASTB / REAL (N3)
END IF
END

6.3.3. Sö dông tuú chän END


Tr­êng hîp kh«ng biÕt sè dßng d÷ liÖu trong file vµ kh«ng cã dßng th«ng tin vÒ dÊu hiÖu kÕt thóc d÷ liÖu trong file, ta ph¶i sö dông mét kü thuËt kh¸c. LÖnh READ

151 152
trong Fortran cã mét tuú chän gióp kiÓm tra sù kÕt thóc cña file vµ rÏ nh¸nh sang mét lÖnh ®­îc chØ ®Þnh nÕu ph¸t hiÖn hÕt file. LÖnh READ víi tuú chän nµy cã d¹ng
sau:

READ (Sè hiÖu file , * , END = n ) Danh s¸ch c¸c biÕn

Khi nµo cßn d÷ liÖu trong file lÖnh nµy thùc hiÖn gièng nh­ lÖnh
READ (Sè hiÖu file , *) Danh s¸ch c¸c biÕn
Tuy nhiªn, nÕu dßng d÷ liÖu cuèi cïng ®· ®äc xong vµ ta thùc hiÖn lÖnh READ víi tïy chän END th× thay v× ph¹m lçi thùc hiÖn lÖnh, ®iÒu khiÓn ®­îc chuyÓn tíi
lÖnh cã nh·n n trong tuú chän END. NÕu lÖnh READ thùc hiÖn mét lÇn n÷a sau khi ®· ®¹t ®Õn cuèi file, th× lçi ch¹y ch­¬ng tr×nh sÏ xuÊt hiÖn.
LÖnh READ víi tuú chän END thùc sù lµ mét d¹ng ®Æc biÖt cña vßng lÆp ®iÒu kiÖn While:

5 READ (10, *, END = 15) TEMP


SUM = SUM + TEMP
N = N +1
GOTO 5
15 PRINT * , SUM
D¹ng ®Æc biÖt nµy cña vßng lÆp ®iÒu kiÖn chØ nªn thùc hiÖn khi nµo ta kh«ng biÕt sè dßng d÷ liÖu vµ kh«ng cã dßng ký hiÖu b¸o hÕt d÷ liÖu. ViÖc chän kü thuËt hîp
lý ®Ó ®äc d÷ liÖu tõ file phô thuéc vµo th«ng tin trong file d÷ liÖu.

ThÝ dô 16: Sö dông tïy chän END. Víi file d÷ liÖu néi dung nh­ trong thÝ dô 14, gi¶ sö kh«ng cã dßng ®Çu tiªn th«ng b¸o vÒ ®é dµi chuçi d÷ liÖu, ta thùc hiÖn
ch­¬ng tr×nh tÝnh c¸c trÞ sè trung b×nh nh­ sau:

INTEGER N, K
REAL ND, DA, AS, NDTB, DATB, ASTB
OPEN (UNIT = 2, FILE = 'SOLIEU.DAT', STATUS = 'OLD')
NDTB = 0.0
DATB = 0.0
ASTB = 0.0
N=0
C NÕu ®äc hÕt sè liÖu tïy chän END = 15 sÏ chuyÓn ®Õn lÖnh 15
5 READ (2, *, END = 15) ND, DA, AS
NDTB = NDTB + ND
153 154
DATB = DATB + DA
ASTB = ASTB + AS
N=N+1
GOTO 5
15 CLOSE (2)
IF (N .EQ. 0) THEN
PRINT *, ' TRONG FILE KHONG CO DU LIEU'
ELSE
NDTB = NDTB / REAL (N)
DATB = DATB / REAL (N)
ASTB = ASTB / REAL (N)
PRINT 25 , N, NDTB, DATB, ASTB
END IF
25 FORMAT (1X, ' SO NGAY = ', I5 , ' ND =' , F6.2 , ' DA =' ,
* F6.2 , ' AS =' , F7.1)
END

6.4. T¹o lËp c¸c file d÷ liÖu

§Ó t¹o míi file d÷ liÖu, chóng ta sö dông c¸c lÖnh OPEN vµ WRITE. Tuy nhiªn, tr­íc khi ta b¾t ®Çu viÕt c¸c lÖnh Fortran, cÇn c©n nh¾c xem sau nµy ®äc file d÷ liÖu
sÏ sö dông kü thuËt nµo trong ba kü thuËt ®· m« t¶ trong môc 6.3.
Khi t¹o lËp file víi dßng ký hiÖu b¸o hÕt d÷ liÖu ph¶i cÈn thËn lùa chän gi¸ trÞ dïng lµm ký hiÖu. Ph¶i tin ch¾c r»ng gi¸ trÞ ®­îc chän lµm gi¸ trÞ b¸o hÕt d÷ liÖu
kh«ng thÓ nµo nhÇm víi gi¸ trÞ d÷ liÖu thùc sù. Cã thÓ chóng ta ph¶i cã ghi chó ë ®Çu file ®Ó mäi ng­êi dïng file ®­îc biÕt.
NÕu ta quyÕt ®Þnh t¹o file víi th«ng tin b¸o tæng sè dßng d÷ liÖu trªn ®Çu file, th× ph¶i chó ý cËp nhËt dßng ®Çu file mçi khi bæ sung hoÆc c¾t bít sè dßng d÷ liÖu.
NÕu sè dßng d÷ liÖu kh«ng ®óng, th× hoÆc ch­¬ng tr×nh ®äc sÏ ®äc sè dßng d÷ liÖu Ýt h¬n sè dßng thùc cã, hoÆc ch­¬ng tr×nh cè ®äc nhiÒu dßng h¬n trong file thùc cã vµ
dÉn ®Õn lçi trong khi ch¹y ch­¬ng tr×nh.
So s¸nh ba ph­¬ng ¸n tæ chøc th«ng tin d÷ liÖu ë trªn, ta thÊy vÒ ph­¬ng diÖn tèi ­u ch­¬ng tr×nh th× c¸ch dïng sè b¸o sè dßng d÷ liÖu ë ®Çu file lµ tèt h¬n c¶, v× khi
®äc ®­îc tæng sè dßng sè liÖu ta cã thÓ ®äc hÕt d÷ liÖu b»ng vßng lÆp DO, trong khi hai ph­¬ng ¸n sau ch­¬ng tr×nh lu«n lu«n ph¶i kiÓm tra biÓu thøc l«gic trong khi ®äc
lÆp. Ngoµi ra rÊt cã thÓ cã nh÷ng nhiÖm vô xö lý kh«ng cÇn ®äc hÕt file, mµ chØ cÇn ®äc sè l­îng sè liÖu cña file ë dßng ®Çu.

155 156
6.5. Kü thuËt trî gióp t×m lçi ch­¬ng tr×nh

ThËt v« nghÜa nÕu mét ch­¬ng tr×nh xö lý d÷ liÖu mµ l¹i ®äc sai d÷ liÖu trong file. Mµ ®iÒu nµy kh«ng ph¶i lµ kh«ng bao giê x¶y ra. Tr­êng hîp sè dßng d÷ liÖu thùc
tÕ trong file cã Ýt h¬n sè vßng lÆp ®äc d÷ liÖu th× ch­¬ng tr×nh sÏ b¸o lçi ch¹y ch­¬ng tr×nh. Khi ®ã chóng ta buéc ph¶i xem l¹i ch­¬ng tr×nh hoÆc xem l¹i file d÷ liÖu vµ dÔ
dµng ph¸t hiÖn lçi ë ®©u. Tuy nhiªn cã nh÷ng tr­êng hîp lçi ch¹y ch­¬ng tr×nh kh«ng ph¸t sinh, nh­ng kÕt qu¶ ch­¬ng tr×nh cho ra sai. NÕu kÕt qu¶ sai v« lý, râ rµng th×
chóng ta còng biÕt vµ t×m nguyªn nh©n ë ch­¬ng tr×nh hay ë file d÷ liÖu. §¸ng sî nhÊt lµ nh÷ng tr­êng hîp ®äc “nhÇm d÷ liÖu”, ®äc h¬i thiÕu d÷ liÖu. Khi ®ã ch­¬ng
tr×nh lµm viÖc b×nh th­êng, kÕt qu¶ tá ra chÊp nhËn ®­îc, nh­ng thùc chÊt lµ sai hoÆc kh«ng chÝnh x¸c. Do ®ã, trong lËp tr×nh ph¶i rÊt thËn träng víi file d÷ liÖu.
Khi t×m lçi mét ch­¬ng tr×nh lµm viÖc víi c¸c file d÷ liÖu, ®iÒu rÊt quan träng lµ kiÓm tra xem c¸c lÖnh nhËp, xuÊt d÷ liÖu cã lµm viÖc ®óng ®¾n, chÝnh x¸c kh«ng.
Trong thùc tÕ c¸c file d÷ liÖu cã thÓ do b¶n th©n ng­êi lËp tr×nh x©y dùng, còng cã thÓ ng­êi lËp tr×nh nhËn ®­îc trong qu¸ tr×nh trao ®æi d÷ liÖu víi ®ång nghiÖp cña
m×nh. Trong nh÷ng tr­êng hîp ®ã, tr­íc khi viÕt nh÷ng lÖnh ®äc file d÷ liÖu ph¶i nghiªn cøu kÜ cÊu tróc cña file, ®äc kÜ tµi liÖu m« t¶ file, ph¶i tin ch¾c tuyÖt ®èi nh÷ng
th«ng tin trong file lµ nh÷ng th«ng tin g×, c¸ch thøc ghi ë trong ®ã ra sao th× míi ®äc file ®óng vµ chÝnh x¸c. §Æc biÖt lÇn ®Çu tiªn lµm viÖc víi mét lo¹i file ph¶i kiÓm tra
kÜ l­ìng kÕt qu¶ ®äc file.
H·y nªn nhí r»ng trong sè nh÷ng yÕu tè cña Fortran th× vÊn ®Ò lµm viÖc víi file cã thÓ xem lµ vÊn ®Ò khã nhÊt vµ lý thó nhÊt.
Víi c¸c file d÷ liÖu nhËp, ta nªn thö ch­¬ng tr×nh víi mét file d÷ liÖu nhá, sao cho ta cã thÓ in lªn mµn h×nh tõng dßng d÷ liÖu khi ch­¬ng tr×nh ®äc vµo. H·y kiÓm
tra xem ch­¬ng tr×nh cã bá qua dßng d÷ liÖu, hoÆc mét gi¸ trÞ nµo kh«ng. NÕu file d÷ liÖu cã ghi sè dßng d÷ liÖu, th× h·y in sè ®ã ra sau khi ®äc.
Víi c¸c file d÷ liÖu xuÊt, sau khi t¹o lËp ra nã, h·y më ra xem l¹i néi dung file. Nªn xem cÊu tróc file cã nh­ ta dù ®Þnh kh«ng, nh÷ng gi¸ trÞ cã ®óng lµ n»m ë
nh÷ng chç nã cÇn n»m kh«ng. Ngoµi ra cÇn ph¶i kiÓm tra file ®Çu ra trong nhiÒu ph­¬ng ¸n ch¹y ch­¬ng tr×nh. RÊt cã thÓ trong mét tr­êng hîp ta thÊy mäi chuyÖn ®Òu
æn, nh­ng ®Õn tr­êng hîp kh¸c th× t×nh h×nh kh«ng ph¶i nh­ vËy. ChØ cã kiÓm tra kÜ th× míi tr¸nh ®­îc nh÷ng lçi tiÒm Èn khã nhËn biÕt trong ch­¬ng tr×nh.

Bµi tËp
1. File d÷ liÖu LAB1 chøa nh÷nng th«ng tin vÒ thêi gian vµ nhiÖt ®é trªn mçi dßng nh­ sau:
0.026.5 (dßng 1)
0.528.7 (dßng 2)
1.029.1 (dßng 3)
1.529.2 (dßng 4)
2.029.4 (dßng 5)
2.529.7 (dßng 6)
H·y cho biÕt gi¸ trÞ cña c¸c biÕn sau khi mçi nhãm lÖnh d­íi ®©y thùc hiÖn. Gi¶ sö r»ng tr­íc khi thùc hiÖn mçi nhãm lÖnh ®ã, th× file d÷ liÖu ®· ®­îc më vµ ch­a
tõng cã mét lÖnh READ nµo ®­îc thùc hiÖn:

157 158
1) READ (1, *) TIM, TEM
2) READ (1, *) TIM1, TEM1, TIM2, TEM2
3) READ (1, *) TIM
4) READ (1, *) TIM1, TEM1
READ (1, *) TEM
READ (1, *) TIM2, TEM2
5) READ (1, *) TIM1
6) READ (1, *) TIM1, TIM2
READ (1, *) TEM1
READ (1, *) TEM1, TEM2
READ (1, *) TIM2
READ (1, *) TEM2
2. File d÷ liÖu cã tªn CONDAO.TEM cã néi dung ghi nh­ sau: Dßng thø nhÊt - tiªu ®Ò b¸o r»ng ®©y lµ sè liÖu vÒ biÕn thiªn nhiÖt ®é kh«ng khÝ t¹i tr¹m C«n §¶o.
Dßng thø hai - ®¬n vÞ ®o (°C). Dßng thø ba tuÇn tù ghi c¸c tham sè: sè n¨m quan tr¾c, th¸ng, n¨m b¾t ®Çu vµ th¸ng, n¨m kÕt thóc quan tr¾c. Dßng thø t­ gåm 12 cét ghi
c¸c th¸ng trong n¨m. C¸c dßng tiÕp sau tuÇn tù ghi nh÷ng gi¸ trÞ nhiÖt ®é øng víi tõng th¸ng thµnh 12 cét, trong ®ã nh÷ng th¸ng khuyÕt sè liÖu ®­îc ghi b»ng sè −9.9
(b¶ng phÝa d­íi).
OSCILLATION OF TEMPERATURE OF THE AIR AT STATION CONDAO
degree C
12 1 1979 12 1990
1 2 3 4 5 6 7 8 9 10 11 12
25.2 25.7 27.3 28.7 29.0 27.7 27.2 27.5 27.2 -9.9 26.8 25.3
25.0 25.6 27.2 28.5 28.6 27.6 27.8 27.0 27.4 26.7 26.8 25.8
24.6 25.0 26.9 28.6 28.1 28.0 28.0 27.9 26.9 27.0 26.3 25.0
24.5 25.2 -9.9 -9.9 28.3 27.8 27.2 27.2 27.4 26.7 27.4 26.1
25.3 25.7 26.6 28.2 29.1 28.2 28.0 27.5 26.9 27.2 25.9 25.5
24.7 25.1 25.9 27.9 27.8 27.2 27.2 27.8 26.3 26.5 26.9 25.8
25.4 26.4 27.0 27.3 27.7 28.3 27.5 28.0 26.8 26.5 26.9 25.7
24.5 24.8 25.6 28.1 28.8 28.2 27.8 27.6 26.8 26.8 26.4 25.5
25.2 25.2 27.0 28.9 28.5 28.0 28.6 27.7 27.3 26.9 27.2 25.9

159 160
25.8 26.6 27.1 28.3 28.1 28.0 27.3 27.6 27.2 27.0 26.1 24.8
25.3 24.7 25.9 27.2 27.6 27.9 27.7 27.3 27.4 26.6 26.7 25.4
25.6 26.0 27.2 29.0 28.5 28.3 28.2 27.8 27.6 27.4 26.6 25.8

H·y lËp ®o¹n ch­¬ng tr×nh ®äc file nµy vµ in l¹i lªn mµn h×nh toµn bé d÷ liÖu gèc cïng biÕn tr×nh n¨m trung b×nh cña nhiÖt ®é kh«ng khÝ ë dßng cuèi cïng.

3. LËp ®o¹n ch­¬ng tr×nh ®äc file d÷ liÖu víi néi dung nh­ trong bµi tËp 2 vµ ghi l¹i thµnh file cïng tªn, ¸p dông kü thuËt dïng dßng ký hiÖu ®¸nh dÊu kÕt thóc d÷
liÖu trong môc 6.3.2.

4. Trong file tªn lµ DATA1, mçi dßng ghi thêi gian tÝnh b»ng gi©y vµ nhiÖt ®é tÝnh b»ng ®é C. Dßng cuèi cïng lµ dßng b¸o hÕt d÷ liÖu chøa gi¸ trÞ −999.9 cho c¶
thêi gian vµ nhiÖt ®é. H·y ®äc file d÷ liÖu nµy vµ s¾p xÕp gi¸ trÞ nhiÖt ®é theo thø tù gi¶m dÇn. In chuçi nhiÖt ®é ®· s¾p xÕp thµnh d¹ng 10 gi¸ trÞ mét dßng. Gi¶ sö trong
file cã kh«ng qu¸ 200 dßng d÷ liÖu.

5. Trong file tªn lµ DATA2, mçi dßng ghi thêi gian tÝnh b»ng gi©y vµ nhiÖt ®é tÝnh b»ng ®é C. Kh«ng cã dßng tiªu ®Ò vµ kh«ng cã dßng b¸o hÕt d÷ liÖu. H·y ®äc file
d÷ liÖu nµy vµ in ra sè gi¸ trÞ nhiÖt ®é, gi¸ trÞ nhiÖt ®é trung b×nh vµ sè gi¸ trÞ nhiÖt ®é lín h¬n trung b×nh. Gi¶ sö trong file cã kh«ng qu¸ 200 dßng d÷ liÖu.

6. ViÕt ch­¬ng tr×nh söa l¹i file CONDAO.TEM trong bµi tËp 2 sao cho ë mçi dßng sè liÖu cã chØ n¨m quan tr¾c t­¬ng øng ë ®Çu dßng, gi¸ trÞ nhiÖt ®é trung b×nh
n¨m ë cuèi dßng vµ gi¸ trÞ nhiÖt ®é trung b×nh nhiÒu n¨m cña tõng th¸ng ë dßng d­íi cïng.

1 x
7. ViÕt ch­¬ng tr×nh t×m nghiÖm gÇn ®óng víi sai sè cho phÐp 0,0001 cña ph­¬ng tr×nh e −x − e + 3,7 − x = 0 trong kho¶ng [0, 2] theo ph­¬ng ph¸p lÆp vµ
3
in th«ng b¸o kÕt qu¶ lªn mµn h×nh víi 4 ch÷ sè thËp ph©n.

8. ViÕt ch­¬ng tr×nh nhËp mét sè tù nhiªn n nhá h¬n 21, mét sè thùc x bÊt kú nhá h¬n 1. X¸c ®Þnh tæng:
sin x sin x + sin 2 x sin x + sin 2 x + sin 3 x sin x + sin 2 x + ... + sin nx
+ + + ... +
cos x cos x + cos 2 x cos x + cos 2 x + cos 3x cos x + cos 2 x + ... + cos nx

Ch­¬ng 7
Sö dông biÕn cã chØ sè trong Fortran
161 162
Trong ch­¬ng 2, môc 2.3 ®· xÐt c¸ch khai b¸o kiÓu biÕn cã chØ sè vµ kh¸i niÖm m¶ng trong Fortran, nªu mét sè ®Æc ®iÓm vÒ l­u gi÷ ®èi víi c¸c biÕn cã chØ sè hay
gäi lµ biÕn m¶ng.
Ch­¬ng nµy sÏ cung cÊp thªm ph­¬ng ph¸p l­u gi÷ vµ xö lý nh÷ng nhãm gi¸ trÞ mµ kh«ng cÇn cung cÊp tªn mét c¸ch t­êng minh cho tõng gi¸ trÞ ®ã. Trong thùc tÕ,
ta th­êng xö lý mét nhãm c¸c gi¸ trÞ Ýt nhiÒu liªn hÖ hoÆc hoµn toµn kh«ng liªn hÖ víi nhau. Trong tr­êng hîp nµy, nÕu sö dông biÕn m¶ng, c¶ nhãm d÷ liÖu sÏ cã mét tªn
chung, nh­ng nh÷ng gi¸ trÞ riªng biÖt cã chØ sè riªng duy nhÊt. Kü thuËt nµy cho phÐp ta ph©n tÝch d÷ liÖu sö dông c¸c vßng lÆp mét c¸ch thuËn tiÖn. Trong c¸c môc d­íi
®©y sÏ bæ sung thªm nh÷ng cÊu tróc, nh÷ng lÖnh cña Fortran cho phÐp thao t¸c thuËn lîi víi c¸c biÕn m¶ng, kü thuËt ®äc d÷ liÖu tõ file ®Ó g¸n vµo c¸c biÕn m¶ng v.v...
M¶ng lµ yÕu tè quan träng vµ m¹nh mÏ nhÊt cña Fortran. NÕu so s¸nh víi mét sè ng«n ng÷ lËp tr×nh kh¸c, thÝ dô nh­ Pascal, ta thÊy trong Fortran cho phÐp khai b¸o
nh÷ng m¶ng d÷ liÖu rÊt lín vµ thao t¸c rÊt mÒm dÎo. NhiÒu khi kh¶ n¨ng khai b¸o m¶ng d÷ liÖu lín lµm cho thuËt gi¶i cña ch­¬ng tr×nh xö lý trë nªn ®¬n gi¶n. Ngoµi ra,
sö dông m¶ng ®óng ®¾n vµ thµnh th¹o sÏ gióp chóng ta viÕt nh÷ng ch­¬ng tr×nh hoÆc nh÷ng ®o¹n ch­¬ng tr×nh rÊt ng¾n gän.

7.1. M¶ng mét chiÒu

Trong lËp tr×nh, m¶ng mét chiÒu th­êng dïng ®Ó biÓu diÔn mét dßng hoÆc mét cét d÷ liÖu.
VÒ ph­¬ng diÖn ng«n ng÷, mét m¶ng lµ mét nhãm ®Þa chØ l­u gi÷ trong bé nhí m¸y tÝnh cã cïng tªn. Tõng thµnh phÇn cña m¶ng ®­îc gäi lµ phÇn tö m¶ng vµ ®­îc
ph©n biÖt víi phÇn tö kh¸c bëi tªn chung kÌm theo chØ sè trong cÆp dÊu ngoÆc. Nh÷ng chØ sè ®­îc biÓu diÔn b»ng nh÷ng sè nguyªn liªn tiÕp nhau, th­êng lµ b¾t ®Çu (chØ
sè ®Çu) b»ng sè nguyªn 1. Nh÷ng tr­êng hîp dïng chØ sè ®Çu kh¸c 1 th­êng liªn quan tíi tÝnh thuËn tiÖn thao t¸c c¸c c«ng thøc to¸n häc hoÆc ph­¬ng diÖn thùc tiÔn. ThÝ
dô muèn biÓu diÔn c¸c hÖ sè a cña ph­¬ng tr×nh håi quy nhiÒu biÕn liªn hÖ gi÷a ®¹i l­îng y vµ c¸c ®¹i l­îng x 1 , x 2 , ..., x m

y = a 0 + a1 x1 + a 2 x 2 + ... + a m x m
ta cã thÓ dïng m¶ng mét chiÒu víi tªn A ®Ó chØ tÊt c¶ c¸c hÖ sè, kÓ c¶ hÖ sè tù do, cña ph­¬ng tr×nh håi quy nµy vµ khai b¸o nh­ sau:

REAL A (0 : 20)
Trong tr­êng hîp nµy phÇn tö thø nhÊt A(0) cña m¶ng A biÓu diÔn hÖ sè a0 . Nh­ vËy rÊt thuËn tiÖn trong khi sö dông c¸c c«ng thøc cña ®¹i sè.
NÕu ta cã tËp hîp sè liÖu vÒ l­îng m­a n¨m trong thÕ kû nµy t¹i mét tr¹m khÝ t­îng nµo ®ã, ta cã thÓ dïng m¶ng
REAL RAIN (1900 : 2000)
Trong tr­êng hîp nµy, nÕu muèn truy cËp l­îng m­a n¨m 1985, ta chØ ®Þnh phÇn tö m¶ng RAIN (1985).
§Ó ®äc d÷ liÖu vµo mét m¶ng mét chiÒu tõ bµn phÝm hoÆc tõ file d÷ liÖu, ta sö dông lÖnh READ. NÕu muèn ®äc toµn bé m¶ng, ta dïng tªn m¶ng kh«ng cã c¸c chØ
sè. Ta còng cã thÓ chØ ®Þnh nh÷ng phÇn tö cô thÓ trong lÖnh READ, thÝ dô
READ *, B

163 164
READ *, B(1), B(2), B(3)
CÇn chó ý r»ng, trong thÝ dô nµy, nÕu m¶ng B theo khai b¸o chøa 3 phÇn tö th× hai lÖnh READ trªn t­¬ng ®­¬ng nhau. Nh­ng nÕu m¶ng B chøa 8 phÇn tö th× cã sù
kh¸c nhau quan träng gi÷a hai lÖnh READ trªn ®©y, lµ v×: lÖnh thø nhÊt ®äc vµo toµn bé 8 phÇn tö cña m¶ng B, trong khi lÖnh thø hai chØ ®äc c¸c gi¸ trÞ cña ba phÇn tö
®Çu tiªn.
C¸c gi¸ trÞ cña biÕn m¶ng cßn cã thÓ ®äc víi vßng lÆp DO Èn. ThÝ dô, nÕu muèn ®äc 5 phÇn tö ®Çu tiªn cña m¶ng B ta sö dông lÖnh READ nh­ sau
READ *, (B (I) , I = 1 , 5)
Trong lÖnh nµy, chóng ta thÊy kh«ng cã mÆt tõ khãa DO, chØ cã chØ sè I cña biÕn m¶ng B biÕn thiªn tõ 1 tíi 5 víi gia sè b»ng 1. Nh­ vËy víi mét lÖnh READ m¸y
®äc ®­îc liªn tôc 5 phÇn tö cña m¶ng B.

ThÝ dô 17: Mét tËp hîp 50 sè liÖu l­îng m­a n¨m ®­îc l­u trong file d÷ liÖu, mçi sè liÖu mét dßng. Gi¶ sö ®¬n vÞ file lµ 9. ViÕt nhãm lÖnh ®äc nh÷ng sè liÖu nµy
vµo m¶ng LMUA.
C¸ch 1: Dïng lÖnh READ ®äc tõng sè, nh­ng vßng lÆp thùc hiÖn 50 lÇn vµ ®äc toµn bé m¶ng:

REAL LMUA (50)


DO 10 I = 1 , 50
READ (9, *) LMUA (I)
10 CONTINUE
C¸ch 2: Dïng lÖnh READ kh«ng chøa chØ sè, nã sÏ ®äc toµn bé m¶ng, tøc ®äc liÒn 50 phÇn tö:
REAL LMUA (50)
READ (9, *) LMUA
C¸ch 3: LÖnh READ chøa vßng lÆp Èn:
REAL LMUA (50)
READ (9, *) (LMUA (I), I = 1, 50)

7.2. LÖnh DATA

LÖnh DATA lµ lÖnh ®Æc t¶, thuéc lo¹i lÖnh kh«ng thùc hiÖn. Nã dïng ®Ó khëi t¹o gi¸ trÞ ban ®Çu cho c¸c biÕn ®¬n vµ c¸c m¶ng. D¹ng tæng qu¸t cña lÖnh DATA nh­
sau

165 166
DATA Danh s¸ch tªn biÕn / Danh s¸ch h»ng /

Theo lÖnh nµy c¸c gi¸ trÞ d÷ liÖu trong danh s¸ch h»ng n»m trong hai dÊu g¹ch chÐo ®­îc g¸n cho c¸c biÕn trong danh s¸ch tªn biÕn theo tuÇn tù. KiÓu cña c¸c gi¸ trÞ
d÷ liÖu còng nªn phï hîp kiÓu cña c¸c biÕn, sao cho m¸y tÝnh kh«ng ph¶i chuyÓn ®æi. C¸c lÖnh DATA ph¶i ®Æt tr­íc c¸c lÖnh thùc hiÖn, tøc ë gÇn ®Çu ch­¬ng tr×nh, ngay
sau nh÷ng lÖnh m« t¶ kiÓu nh­ lÖnh REAL, INTEGER, LOGICAL, DIMENSION...
ThÝ dô, lÖnh
DATA A , B, C , I / 0.0 , 32.75 , −2.5 , 10 /
sÏ khëi t¹o gi¸ trÞ 0,0 cho biÕn A, 32,75 cho biÕn B, −2,5 cho biÕn C vµ 10 cho biÕn I.
Chó ý r»ng lÖnh DATA chØ khëi t¹o gi¸ trÞ ë ®Çu ch­¬ng tr×nh. LÖnh DATA kh«ng thÓ sö dông trong vßng lÆp ®Ó t¸i t¹o gi¸ trÞ c¸c biÕn. NÕu cÇn t¸i t¹o c¸c biÕn, ta
ph¶i sö dông c¸c lÖnh g¸n. LÖnh DATA còng kh«ng thÓ n»m trong ch­¬ng tr×nh con.
NÕu c¸c gi¸ trÞ lÆp l¹i trong danh s¸ch h»ng, ta cã thÓ dïng c¸ch viÕt lÖnh DATA ng¾n gän. ThÝ dô, nÕu muèn khëi t¹o gi¸ trÞ 1 cho c¸c biÕn I, J, K vµ gi¸ trÞ 0,5 cho
c¸c biÕn X, Y, Z, th× hai lÖnh sau ®©y t­¬ng ®­¬ng nhau:
DATA I, J, K, X, Y, Z / 1, 1, 1, 0.5, 0.5, 0.5 /
DATA I, J, K, X, Y, Z / 3*1, 3*0.5 /
LÖnh DATA cã thÓ sö dông ®Ó khëi t¹o mét hoÆc mét sè phÇn tö cña m¶ng. ThÝ dô, c¸c lÖnh sau khëi t¹o tÊt c¸c c¸c phÇn tö cña m¶ng J vµ TIME:
INTEGER J (5)
REAL TIME (4)
DATA J, TIME / 5*0, 1.0, 2.0, 3.0, 4.0 /
Nhãm lÖnh
REAL HOUR (5)
DATA HOUR (1) / 10.0 /
chØ khëi t¹o mét gi¸ trÞ cña phÇn tö ®Çu tiªn cña m¶ng HOUR, c¸c phÇn tö tõ thø 2 ®Õn 5 cña nã ch­a biÕt.
Cã thÓ sö dông vßng DO Èn trong lÖnh DATA. ThÝ dô:
INTEGER Y (100)
DATA (Y (I), I = 1, 50) / 50*0 /
khëi t¹o gi¸ trÞ 0 cho 50 phÇn tö ®Çu cña m¶ng Y, 50 phÇn tö cßn l¹i ch­a ®­îc khëi t¹o.

167 168
7.3. M¶ng hai chiÒu

C¸c lÖnh m« t¶ m¶ng hai chiÒu gièng nh­ víi m¶ng mét chiÒu, kh¸c biÖt duy nhÊt lµ dïng hai tham sè kÝch th­íc m¶ng. Mçi phÇn tö m¶ng ®­îc truy cËp bëi tªn
m¶ng víi hai chØ sè n»m trong cÆp dÊu ngoÆc.
Trong thùc tÕ lËp tr×nh ng­êi ta th­êng biÓu diÔn c¸c ma trËn, c¸c b¶ng d÷ liÖu gåm mét sè cét, mçi cét cã mét sè dßng gi¸ trÞ thµnh m¶ng hai chiÒu.
ThÝ dô, ma trËn c¸c hÖ sè ®øng tr­íc c¸c Èn cña hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh a i , j (i = 1..10, j = 1..10) th­êng biÓu diÔn b»ng m¶ng hai chiÒu A víi lÖnh m« t¶
nh­ sau
REAL A(10, 10)
C¸c gi¸ trÞ quan tr¾c tõng giê vÒ mùc n­íc biÓn trong vßng mét th¸ng cã thÓ biÓu diÔn thµnh mét b¶ng sè liÖu gåm 31 dßng, 24 cét. C¸c dßng tuÇn tù øng víi c¸c
ngµy trong th¸ng. C¸c cét tuÇn tù øng víi 24 giê trong mét ngµy. Trong Fortran, b¶ng sè liÖu nµy cã thÓ biÓu diÔn b»ng m¶ng hai chiÒu
REAL SLEV (31, 24)
theo c¸ch nµy, khi thao t¸c víi mùc n­íc t¹i mét ngµy, giê cô thÓ nµo ®ã, ng­êi ta chØ cÇn chØ ®Þnh phÇn tö SLEV (I, J), víi chØ sè thø nhÊt I chØ ngµy, chØ sè thø hai J chØ
giê trong ngµy ®ã. Khi cÇn tÝnh mùc n­íc trung b×nh ngµy, thÝ dô cña ngµy thø nhÊt trong th¸ng, ng­êi ta chØ cÇn céng tÊt c¶ c¸c phÇn tö víi chØ sè I = 1:
SLEV (1, 1) + SLV (1, 2) + ... + SLEV (1, 24)
Sö dông c¸c m¶ng rÊt tiÖn lîi khi lËp ch­¬ng tr×nh ph©n tÝch, tÝnh to¸n víi nh÷ng ma trËn, nh÷ng tËp sè liÖu lín.

ThÝ dô 18: LËp ma trËn ®¬n vÞ (ma trËn vu«ng víi c¸c phÇn tö trªn ®­êng chÐo chÝnh b»ng 1, cßn tÊt c¶ c¸c phÇn tö kh¸c b»ng 0). ThÝ dô ma trËn kÝch th­íc n = 3 ,
tøc cã 3 dßng vµ 3 cét, sÏ lµ
1 0 0
0 1 0 .
 
0 0 1

§o¹n ch­¬ng tr×nh Fortran thùc hiÖn viÖc nµy sÏ nh­ sau:
INTEGER IDMAT(3,3)
DO I = 1, 3
DO J = 1, 3
IF (I .EQ. J) THEN
IDMAT (I, J) = 1

169 170
ELSE
IDMAT (I, J) = 0
ENDIF
END DO
END DO

ThÝ dô 19: §äc c¸c gi¸ trÞ m¶ng hai chiÒu tõ file d÷ liÖu. Gi¶ sö cã c¸c sè liÖu vÒ l­u l­îng n­íc trung b×nh n¨m cña mét sè con s«ng. Nh÷ng sè liÖu nµy ghi trong
file SONG.LLG. Dßng trªn cïng cña file ghi hai sè nguyªn tuÇn tù chØ sè n¨m quan tr¾c vµ sè con s«ng. Sau ®ã cã n dßng, mçi dßng sè liÖu tuÇn tù øng víi mét n¨m,
trong mçi dßng cã m gi¸ trÞ, mçi gi¸ trÞ øng víi mét con s«ng. Ta dïng m¶ng hai chiÒu ®Ó biÓu diÔn tËp sè liÖu nµy, chØ sè thø nhÊt cña m¶ng chØ thø tù n¨m, chØ sè thø
hai chØ thø tù con s«ng. §o¹n ch­¬ng tr×nh sau ®©y cho phÐp ®äc sè liÖu tõ file, tÝnh l­u l­îng trung b×nh cña tÊt c¶ c¸c s«ng vµ in kÕt qu¶ lªn mµn h×nh.

REAL SLL (100, 15), TB (15)


OPEN (1, FILE = 'SONG.LLG', STATUS = 'OLD')
READ (1, *) N, M
DO I = 1 , N
READ (1, *) (SLL (I , J) , J = 1 , M)
ENDDO
CLOSE (1)
DO J = 1, M
TB (J) = 0.0
DO I = 1, N
TB (J) = TB (J) + SLL (I, J)
ENDDO
ENDDO
PRINT 4, (TB (J) , J = 1 , M)
4 FORMAT (1X, 15 F8.0)
H·y l­u ý c¸ch ®äc sè liÖu l­îng m­a trong ch­¬ng tr×nh nµy. Nh­ ®· m« t¶ c¸ch ghi sè liÖu trong file, l­îng m­a ®­îc ghi thµnh n dßng, mçi dßng øng víi mét
n¨m, trªn mçi dßng l¹i cã m gi¸ trÞ l­îng m­a øng víi m con s«ng. Muèn ®äc liªn tôc sè liÖu trong n n¨m ta ®· dïng hai vßng DO lång nhau:
DO I = 1 , N
READ (1, *) (SLL (I , J) , J = 1 , M)

171 172
END DO
trong ®ã vßng DO bªn trong lµ vßng DO Èn víi chØ sè J ch¹y tõ 1 ®Õn M. B»ng vßng lÆp Èn nµy ta ®· ®äc ®­îc m gi¸ trÞ sè thùc øng víi m s«ng trªn cïng mét dßng.
Mét c¸ch tæng qu¸t, ®©y lµ c¸ch ®äc th­êng dïng nhÊt ®Ó b»ng mét lÖnh ®äc cã thÓ nhËn liªn tiÕp tÊt c¶ c¸c phÇn tö trªn mét hµng cña ma trËn.
NÕu ta dïng hai vßng lÆp th«ng th­êng:
DO I = 1, N
DO J = 1, M
READ (1, *) SLL (I, J)
END DO
END DO
th× sÏ ph¹m sai lÇm, bëi v× hai vßng DO nµy t­¬ng ®­¬ng víi n × m lÖnh READ, vµ nh­ ta ®· biÕt, mçi lÇn lÖnh READ thùc hiÖn xong th× ®Çu ®äc file sÏ xuèng dßng
míi. Nh­ vËy m¸y sÏ ®äc n × m dßng trong khi trong file chØ cã n dßng sè liÖu.
Ta ph¸t triÓn c¸ch dïng vßng DO Èn cho tr­êng hîp trªn cïng mét dßng trong file cã hai ®¹i l­îng. ThÝ dô, còng lµ file sè liÖu nh­ ®· m« t¶ trong thÝ dô 19, nh­ng
trªn mçi dßng ngoµi m gi¸ trÞ l­u l­îng cßn cã m gi¸ trÞ ®é ®ôc øng víi m con s«ng. Trong tr­êng hîp nµy ta khai b¸o thªm mét biÕn DD (100, 15) vµ lÖnh ®äc c¶ l­u
l­îng vµ ®é ®ôc sÏ lµ:
DO I = 1 , N

173 174
READ (1, *) (SLL (I , J), J = 1 , M) , (DD (I , J), J = 1, M)
END DO
Tr­êng hîp ë ®Çu mçi dßng cã ghi n¨m quan tr¾c, ta sÏ dïng
DO I = 1 , N
READ (1, *) NAM (I), (SLL (I, J) , J = 1, M) , (DD (I , J) , J = 1, M)
END DO

7.3. M¶ng nhiÒu chiÒu

Fortran cho phÐp sö dông c¸c m¶ng víi sè chiÒu tèi ®a b»ng 7. Chóng ta cã thÓ h×nh dung m¶ng ba chiÒu gièng nh­ h×nh hép ch÷ nhËt t¹o bëi nhiÒu h×nh lËp ph­¬ng
con. C¸c phÇn tö cña m¶ng ba chiÒu gièng nh­ nh÷ng h×nh lËp ph­¬ng con, xÕp thµnh mét sè líp, mçi líp cã mét sè hµng vµ mçi hµng cã mét sè h×nh lËp ph­¬ng. Tõ ®ã
ta biÓu diÔn vÞ trÝ cña mét phÇn tö nµo ®ã nh­ lµ vÞ trÝ cña h×nh lËp ph­¬ng con: thø tù cña nã trong mét hµng b»ng chØ sè I, thø tù hµng b»ng chØ sè J vµ thø tù líp b»ng
chØ sè K.
ThÝ dô, m¶ng ba chiÒu cã thÓ ®Þnh nghÜa b»ng lÖnh:

175 176
REAL T (3, 4, 4)
NÕu sö dông tªn m¶ng ba chiÒu kh«ng cã chØ sè, ta xö lý m¶ng víi chØ sè thø nhÊt biÕn thiªn nhanh nhÊt, chØ sè thø hai biÕn thiªn nhanh thø hai vµ chØ sè thø ba biÕn
thiªn chËm nhÊt. ThÝ dô víi m¶ng T, hai lÖnh ®äc sau ®©y lµ t­¬ng ®­¬ng:

READ*, T
READ*,(((T(I,J,K),I=1,3),J=1,4),K=1,4)
T­¬ng tù ta h×nh dung m¶ng bèn chiÒu nh­ lµ mét chuçi c¸c m¶ng ba chiÒu...

H×nh 7.1. BiÓu diÔn m¶ng ba chiÒu trong biÓn

Trong khÝ t­îng thñy v¨n m¶ng ba chiÒu th­êng ®­îc dïng ®Ó biÓu diÔn nh÷ng sè liÖu quan tr¾c trong kh«ng gian ba chiÒu. ThÝ dô, ta cã thÓ biÓu diÔn tr­êng ¸p
suÊt n­íc biÓn t¹i c¸c ®iÓm nót kinh, vÜ tuyÕn cña mét miÒn h×nh ch÷ nhËt trªn mÆt biÓn vµ mét sè tÇng s©u. Trong tr­êng hîp nµy cã thÓ quy ­íc chØ sè thø nhÊt cña
m¶ng i biÕn thiªn theo trôc x h­íng sang phÝa ®«ng, chØ sè thø hai j biÕn thiªn theo trôc y h­íng lªn b¾c, cßn chØ sè thø ba k biÕn thiªn theo trôc z h­íng th¼ng
®øng tõ mÆt xuèng ®¸y biÓn ®Ó chØ gi¸ trÞ ¸p suÊt øng víi kinh ®é, vÜ ®é vµ mét tÇng s©u nµo ®ã trong biÓn (h×nh 7.1). Trong khÝ t­îng häc, hai chØ sè ®Çu hoµn toµn t­¬ng
tù, cßn chØ sè thø ba cña m¶ng ba chiÒu biÕn thiªn theo trôc z h­íng th¼ng ®øng tõ mÆt ®Êt lªn trªn, cã thÓ dïng ®Ó chØ quan tr¾c t¹i mét tÇng cao.
Theo quy ­íc ®ã th× m¶ng hai chiÒu lµ mét tr­êng hîp riªng cña m¶ng ba chiÒu dïng ®Ó biÓu thÞ tr­êng yÕu tè khÝ t­îng thñy v¨n nµo ®ã trªn mét miÒn ph¼ng h×nh
ch÷ nhËt, thÝ dô tr­êng khÝ ¸p mÆt ®Êt, tr­êng nhiÖt ®é n­íc mÆt biÓn... M¶ng bèn chiÒu cã thÓ dïng ®Ó biÓu diÔn nh÷ng tr­êng ba chiÒu võa m« t¶ ë trªn nh­ng t¹i nhiÒu
thêi ®iÓm t kh¸c nhau.
Trong thñy v¨n, chØ sè thø nhÊt cña m¶ng ba chiÒu th­êng dïng biÓu diÔn yÕu tè quan tr¾c t¹i c¸c ®é s©u kh¸c nhau cña mét mÆt c¾t, däc theo s«ng ta cã cã thÓ cã
nhiÒu mÆt c¾t ®­îc biÓu diÔn b»ng biÕn thiªn cña chØ sè thø hai, yÕu tè quan tr¾c l¹i cã thÓ biÕn ®æi theo thêi gian vµ ®­îc chØ ®Þnh b»ng chØ sè thø ba. NÕu xÐt nhiÒu s«ng
cïng mét lóc, ta cÇn ®Õn m¶ng bèn chiÒu.
ChÝnh lµ trong khÝ t­îng, h¶i d­¬ng häc chóng ta ®­îc biÕt tíi nh÷ng m« h×nh dù b¸o thêi tiÕt hay hoµn l­u vµ nhiÖt muèi ®¹i d­¬ng th­êng sö dông c¸c tr­êng ba
chiÒu ban ®Çu vµ ph¸t sinh ra nh÷ng tr­êng bèn chiÒu víi kÝch th­íc khæng lå (do ®é ph©n gi¶i kh«ng gian cao vµ b­íc thêi gian m« pháng, dù b¸o nhá) ph¶i l­u tr÷ vµ
qu¶n lý trong m¸y tÝnh.
C¸c m¶ng cã sè chiÒu lín h¬n bèn cã thÓ lµ khã h×nh dung trùc quan h¬n. Tuy nhiªn, nÕu chóng ta quy ­íc râ rµng, nhÊt qu¸n c¸c chØ sè thø nhÊt, thø hai... t­¬ng
øng víi biÕn sè nµo trong thùc tÕ vµ n¾m v÷ng quy t¾c biÕn thiªn chØ sè cña m¶ng th× vÉn cã thÓ truy cËp, thao t¸c ®óng víi mét phÇn tö bÊt kú cña m¶ng trong ch­¬ng
tr×nh.

ThÝ dô 20: TÝnh tÇn suÊt m­ a. Sè liÖu gi¸ trÞ ngµy cña c¸c yÕu tè khÝ t­îng thñy v¨n t¹i tr¹m Hßn DÊu ®­îc l­u trong file HONDAU.MAT cã quy c¸ch ghi nh­ sau:
Dßng trªn cïng ghi tªn tr¹m. Dßng thø 2 cã hai sè nguyªn viÕt c¸ch nhau lÇn l­ît chØ tæng sè ngµy quan tr¾c vµ sè yÕu tè ®­îc quan tr¾c. Dßng thø ba cã 6 sè nguyªn viÕt
c¸ch nhau lÇn l­ît chØ ngµy, th¸ng, n¨m ®Çu vµ ngµy, th¸ng, n¨m cuèi quan tr¾c. Dßng thø 4 lµ tiªu ®Ò cét liÖt kª tªn tÊt c¶ c¸c yÕu tè ®­îc quan tr¾c, mçi tªn ®­îc ghi víi
®é réng 8 vÞ trÝ. C¸c dßng tiÕp theo lÇn l­ît ghi gi¸ trÞ cña c¸c yÕu tè, mçi dßng mét ngµy. Gi¶ sö l­îng m­a ngµy ghi ë cét sè 6. ViÕt ch­¬ng tr×nh ®äc vµ tÝnh xem trong

177 178
suèt thêi gian quan tr¾c cã bao nhiªu lÇn m­a kÐo dµi 1 ngµy, bao nhiªu lÇn m­a kÐo dµi 2 ngµy liÒn, bao nhiªu lÇn m­a kÐo dµi 3 ngµy liÒn...
REAL X (5000)
INTEGER TS (5000)
OPEN (1, FILE = 'HONDAU.MAT', STATUS = 'OLD')
READ (1, *)
READ (1, *) N
READ (1, *)
READ (1, *)
DO I = 1, N
READ (1, *) (X (I), J = 1, 6)
END DO
CLOSE (1)
TS = 0
I=1
100 IF (I .GT. N) GOTO 15
IF (X (I) .EQ. 0.0) THEN
I=I+1
GOTO 100
ELSE
J=1
300 IF (I .EQ. N .OR. X(I + 1) .EQ. 0.0) THEN
TS (J) = TS (J) + 1
I=I+1
GOTO 100
ELSE
J=J+1
I=I+1
GOTO 300
END IF
END IF
15 I=N
16 IF (TS (I) .EQ. 0) THEN
I=I-1
GOTO 16
ELSE
DO N = 1, I
PRINT ‘(2I5)’, N, TS (N)
END DO
END IF

179 180
END

ThÝ dô 21: TÝnh ma trËn t ­¬ng quan cña tËp sè liÖu quan tr¾c c¸c yÕu tè khÝ t­ îng thñy v¨n. Víi file sè liÖu trong thÝ dô 20, viÕt ch­¬ng tr×nh ®äc c¸c th«ng tin cÇn
thiÕt trong file vµ in ma trËn t­¬ng quan cña c¸c yÕu tè quan tr¾c lªn mµn h×nh.
Ta thÊy, mét c¸ch tù nhiªn mçi chuçi gi¸ trÞ ngµy cña mét yÕu tè quan tr¾c cã thÓ ®­îc biÓu diÔn thµnh m¶ng mét chiÒu, chØ sè m¶ng sÏ biÕn thiªn theo thø tù ngµy
quan tr¾c. Tuy nhiªn, ta cã thÓ gép tÊt c¶ c¸c m¶ng mét chiÒu thµnh mét m¶ng hai chiÒu víi chØ sè thø hai biÕn thiªn theo thø tù yÕu tè quan tr¾c: 1, 2, ... B»ng c¸ch dïng
m¶ng hai chiÒu X (5000, 15) nh­ trong ch­¬ng tr×nh d­íi ®©y sÏ rÊt thuËn tiÖn cho viÖc sö dông c¸c vßng lÆp DO víi tham sè ®Õm cña vßng DO ®ång thêi lµ chØ sè cña
m¶ng.
REAL X (5000, 15), MX (15), DX (15) , R (15, 15)
OPEN (1, FILE = 'HONDAU.MAT', STATUS = 'OLD')
READ (1, *)
READ (1, *) N, M
READ (1, *)
READ (1, *)
DO I = 1, N
READ (1, *) (X (I, J), J = 1, M)
END DO
CLOSE (1)
C TÝnh trung b×nh vµ ®é lÖch qu©n ph­¬ng cña M yÕu tè
DO I = 1, M
MX (I) = X (1, I)
DX (I) = X (1, I)*X (1, I)
DO J = 2, N
MX (I) = MX (I) + X (J, I)
DX (I) = DX (I) + X (J, I) * X(J, I)
END DO
MX (I) = MX (I) / N
DX (I) = SQRT (DX (I) / N - MX (I) * MX (I))
END DO
C TÝnh ma trËn t­¬ng quan
DO I = 1, M - 1
DO J = I + 1, M
R (I, J) = 0.0
DO K = 1, N
R (I, J) = R (I, J) + X (K, I) * X (K, J)
END DO
R (I, J) = R (I, J) / N - MX (I) * MX (J)
R (I, J) = R (I, J) / (DX (I) * DX (J))
END DO

181 182
END DO
DO I = 1, M
R (I, I) = 1.0
END DO
DO I = 1, M
PRINT 4, (R (K, I), K = 1, I - 1), (R (I, J), J = I, M)
END DO
4 FORMAT (<M>F6.2)
END

7.4. Nh÷ng ®iÒu cÇn chó ý khi sö dông c¸c m¶ng

Trong c¸c môc tr­íc cña ch­¬ng nµy ta ®· häc sö dông mét m¶ng - mét nhãm c¸c ®Þa chØ l­u gi÷ c¸c gi¸ trÞ cã mét tªn chung, nh­ng ph©n biÖt víi nhau bëi mét
hoÆc mét sè chØ sè. M¶ng lµ mét yÕu tè m¹nh mÏ nhÊt trong Fortran, v× nã cho phÐp l­u gi÷ mét tËp hîp d÷ liÖu lín ®Ó dÔ xö lý trong ch­¬ng tr×nh cña chóng ta.
MÆc dï víi tiÖn lîi c¬ b¶n nh­ trªn, c¸c m¶ng còng th­êng cã thÓ g©y ra nh÷ng lçi míi. Mét khi b¹n dù ®Þnh sö dông m¶ng ®Ó m« t¶ d÷ liÖu, h·y tù hái "ta cã cÇn sö
dông d÷ liÖu nµy nhiÒu lÇn kh«ng" vµ "d÷ liÖu nµy cã cÇn ph¶i l­u tr­íc khi ta sö dông nã kh«ng". NÕu c©u tr¶ lêi cho c¸c c©u hái trªn lµ "kh«ng", nªn h¹n chÕ dïng
m¶ng, mµ dïng c¸c biÕn ®¬n.
Mét khi m¶ng lµ cÇn thiÕt, nh­ng ch­¬ng tr×nh lµm viÖc sai, tr­íc hÕt h·y kiÓm tra nh÷ng ®iÒu sau ®©y:
♠ KÝch th­íc m¶ng: M« t¶ m¶ng ph¶i chØ ra sè phÇn tö tèi ®a dù ®Þnh l­u gi÷ trong m¶ng. MÆc dï chóng ta kh«ng nhÊt thiÕt ph¶i dïng hÕt tÊt c¶ c¸c phÇn tö cña
m¶ng, nh­ng chóng ta kh«ng ®­îc sö dông nhiÒu phÇn tö h¬n so víi sè phÇn tö ®· m« t¶ ë phÇn khai b¸o cña ch­¬ng tr×nh. VËy víi mçi bµi to¸n cô thÓ nÕu cÇn sö dông
m¶ng, h·y h×nh dung tr­íc kÝch th­íc tèi ®a cña mçi chiÒu cña m¶ng ®Ó khai b¸o cho ®óng, cã thÓ h¬i d­ ra mét Ýt, nh­ng d­ nhiÒu qu¸ sÏ tèn bé nhí, cßn khai b¸o thiÕu
th× khi ch¹y ch­¬ng tr×nh sÏ ph¸t sinh lçi l«gic.
♠ ChØ sè m¶ng: H·y kiÓm tra tõng chØ sè, ®Æc biÖt nh÷ng chØ sè lµ biÓu thøc sè häc, ®Ó tin ch¾c r»ng nã lµ sè nguyªn n»m trong giíi h¹n ®óng ®¾n, kh«ng v­ît ra
ngoµi kho¶ng biÕn thiªn cña chØ sè. NÕu chØ sè m¶ng v­ît ra ngoµi giíi h¹n cho phÐp th× h·y xem c¸c biÕn trong biÓu thøc sè häc tÝnh chØ sè cã bÞ nhÇm kh«ng. Cã thÓ
dïng lÖnh in lªn mµn h×nh ®Ó theo dâi diÔn biÕn cña chØ sè.
♠ Vßng lÆp DO: NÕu b¹n dïng chØ sè m¶ng lµm tham sè ®Õm cña vßng lÆp DO, h·y tin ch¾c r»ng b¹n ®· sö dông ®óng tªn biÕn trong ch­¬ng tr×nh cña b¹n. ThÝ dô,
nÕu trong mét vßng lÆp DO víi m¶ng ba chiÒu b¹n ®Þnh cho chØ sè thø ba cña m¶ng (K) biÕn thiªn, h·y kiÓm tra xem b¹n cã dïng I thay v× K kh«ng. Lçi th­êng gÆp lµ
chØ sè ®¶o ng­îc: H·y tù hái chç nµy cÇn B (K, L) hay B (L, K)? H·y cã ý thøc vÒ ®Æt tªn cho chØ sè. TËp qu¸n chung lµ sö dông biÕn I cho chØ sè thø nhÊt, J - thø hai vµ
K - thø ba; nh­ vËy rÊt tiÖn lîi khi sö dông c¸c vßng lÆp lång nhau vµ chØ sè ®Õm cña vßng lÆp DO ®ång thêi lµ chØ sè m¶ng.

Bµi tËp
1. File d÷ liÖu víi ®¬n vÞ file 9 chøa 28 sè liÖu l­îng m­a ngµy trong bèn tuÇn lÔ liªn tiÕp, ghi thµnh 4 dßng, mçi tuÇn mét dßng. Nhãm lÖnh sau

183 184
REAL DMUA (28)
DO I = 1, 28
READ (9, *) DMUA (I)
END DO

cã ®äc ®óng c¸c sè liÖu l­îng m­a øng víi tõng ngµy kh«ng. NÕu kh«ng ®óng, chØ ra ph­¬ng ¸n ®äc ®óng.
2. ViÕt ch­¬ng tr×nh cho phÐp ®äc tõ bµn phÝm ba sè nguyªn, kiÓm tra xem ba sè nguyªn ®ã cã thÓ chØ ngµy, th¸ng, n¨m hîp lý kh«ng. KÕt qu¶ kiÓm tra ghi thµnh
dßng th«ng b¸o thÝch hîp lªn mµn h×nh.
3. ViÕt ch­¬ng tr×nh ®äc mét chuçi Y gåm 20 gi¸ trÞ thùc tõ file EXPER, trong ®ã mçi gi¸ trÞ ghi trªn mét dßng. LËp mét chuçi Z gåm 20 gi¸ trÞ tho¶ m·n c¸c ®iÒu
kiÖn:
Yi −1 + Yi + Yi+1
Z1 = Y1; Z 20 = Y20 ; Zi = (i = 2..19)
3
In chuçi xuÊt ph¸t vµ chuçi míi c¹nh nhau thµnh b¶ng hai cét.
4. ViÕt ch­¬ng tr×nh däc file RAIN chøa b¶ng d÷ liÖu l­îng m­a gåm 12 dßng (mçi dßng t­¬ng øng mét th¸ng) vµ 5 cét (mçi cét t­¬ng øng mét n¨m trong c¸c n¨m
1978-1982). X¸c ®Þnh vµ in b¶ng th«ng tin sau ®©y:
LUONG MUA TRUNG BINH
1978 - XXX.XX
1979 - XXX.XX
1980 - XXX.XX
1981 - XXX.XX
1982 - XXX.XX
LUONG MUA CUC DAI
THANG XX NAM XXXX
LUONG MUA CUC TIEU
THANG XX NAM XXXX
5. File d÷ liÖu tªn lµ SCS1.TEM ghi sè liÖu vÒ tr­êng nhiÖt ®é n­íc biÓn trung b×nh th¸ng 1 ë vïng biÓn §«ng cã quy c¸ch ghi nh­ sau:
- Dßng thø nhÊt gåm tuÇn tù c¸c tham sè: kinh tuyÕn biªn phÝa t©y, kinh tuyÕn biªn phÝa ®«ng, vÜ tuyÕn biªn phÝa nam, vÜ tuyÕn biªn phÝa b¾c (c¸c sè thùc) cña vïng,

185 186
b­íc l­íi theo ph­¬ng t©y ®«ng, b­íc l­íi theo ph­¬ng b¾c nam (®o b»ng phót, c¸c sè nguyªn) cña l­íi.
- Dßng thø hai ghi kÝch th­íc cña ma trËn sè liÖu (c¸c sè nguyªn) theo dßng (ph­¬ng b¾c nam), theo cét (ph­¬ng t©y ®«ng), theo chiÒu s©u tõ mÆt biÓn xuèng d­íi
vµ mét sè nguyªn −32767 chØ gi¸ trÞ khuyÕt cña sè liÖu nhiÖt ®é.
- PhÇn cßn l¹i gåm: mét sè nguyªn chØ tÇng s©u quan tr¾c (mÐt) ghi ë mét dßng; sau ®ã lµ m¶ng sè liÖu nhiÖt ®é øng víi tÇng ®ã ghi thµnh c¸c dßng tõ b¾c xuèng
nam, c¸c cét tõ t©y sang ®«ng (c¸c sè thùc kh«ng dÝnh nhau). TiÕp tôc nh­ vËy cho ®Õn tÇng s©u d­íi cïng.
H·y viÕt ch­¬ng tr×nh ®äc d÷ liÖu, chän ra mét profil nhiÖt ®é cho ®iÓm bÊt kú thuéc miÒn tÝnh. KÕt qu¶ ghi lªn mµn h×nh nh­ sau:
KINH DO XXX.XX
VI DO XX.XX
TANG (m) NHIET DO
XXXX XX.XX
XXXX XX.XX
.....
6. Cho file d÷ liÖu SCS1.TEM ®· m« t¶ trong bµi tËp 5. H·y viÕt ch­¬ng tr×nh ®äc d÷ liÖu vµ tÝnh c¸c gi¸ trÞ nhiÖt ®é trung b×nh cña tõng tÇng quan tr¾c vµ gi¸ trÞ
nhiÖt ®é trung b×nh toµn biÓn kÓ tõ tÇng mÆt cho tíi tÇng quan tr¾c d­íi cïng.
7. Cho file d÷ liÖu SCS1.TEM ®· m« t¶ trong bµi tËp 5. H·y viÕt ch­¬ng tr×nh ®äc d÷ liÖu vµ in ra file SECT17.TEM mét b¶ng sè liÖu nhiÖt ®é n­íc cña mÆt c¾t däc
vÜ tuyÕn 17°N víi quy c¸ch nh­ sau:
- Dßng trªn cïng lµ tiªu ®Ò:
"Ph©n bè nhiÖt ®é n­íc trªn mÆt c¾t däc vÜ tuyÕn 17".
- Dßng thø hai liÖt kª c¸c kinh ®é tõ t©y sang ®«ng.
- C¸c dßng tiÕp d­íi ghi ®é s©u tÇng quan tr¾c ë mçi ®Çu dßng t­¬ng øng, sau ®ã lµ c¸c gi¸ trÞ nhiÖt ®é n­íc (lÊy ®Õn hai ch÷ sè thËp ph©n) ghi th¼ng cét víi nh÷ng
kinh ®é t­¬ng øng ®· liÖt kª ë dßng thø hai. Nh÷ng gi¸ trÞ khuyÕt (−32767) ghi b»ng sè 99.99 hoÆc n¨m dÊu hoa thÞ (*****).

Ch­¬ng 8

187 188
Ch­¬ng tr×nh con lo¹i hµm

Khi x©y dùng ch­¬ng tr×nh gi¶i mét bµi to¸n t­¬ng ®èi phøc t¹p, ta sÏ thÊy ch­¬ng tr×nh th­êng dµi vµ khã ®äc. NhiÒu khi cïng mét sè thao t¸c nh­ nhau ®­îc thùc
hiÖn lÆp l¹i ë mét sè chç trong mét ch­¬ng tr×nh còng lµm cho ch­¬ng tr×nh cña chóng ta trë thµnh dµi h¬n. Nh÷ng vÊn ®Ò nµy cã thÓ kh¾c phôc b»ng c¸ch sö dông nh÷ng
ch­¬ng tr×nh con (subprogram) - lµ mét nhãm c¸c lÖnh ®­îc t¸ch riªng ra vµ sau ®ã sÏ ®­îc gäi thùc hiÖn khi cÇn trong ch­¬ng tr×nh cña chóng ta. Trong Fortran cã hai
lo¹i ch­¬ng tr×nh con: ch­¬ng tr×nh con lo¹i hµm (function) vµ ch­¬ng tr×nh con lo¹i thñ tôc (subroutine). Trong môc 2.4 ch­¬ng 2 ®· giíi thiÖu vµ thØnh tho¶ng trong c¸c
bµi kh¸c chóng ta ®· sö dông mét vµi hµm chuÈn hay hµm riªng cña Fortran. ThÝ dô, khi tÝnh sin cña mét gãc ta dïng hµm SIN, khi cÇn gi¸ trÞ tuyÖt ®èi cña mét ®¹i l­îng
ta dïng hµm ABS... Nh÷ng hµm nµy thùc chÊt còng lµ nh÷ng ch­¬ng tr×nh con, nh­ng chóng ®· ®­îc x©y dùng s½n (hµm chuÈn) vµ n»m trong bé biªn dÞch, chóng ta chØ
viÖc gäi trùc tiÕp trong ch­¬ng tr×nh khi cÇn. Trong ch­¬ng nµy sÏ tãm t¾t vÒ nh÷ng ®Æc ®iÓm cña c¸c hµm chuÈn. Sau ®ã ta häc c¸ch tù x©y dùng nh÷ng ch­¬ng tr×nh con
lo¹i hµm ®Ó gi¶i quyÕt nh÷ng bµi to¸n riªng cña m×nh. Nh÷ng ch­¬ng tr×nh con lo¹i thñ tôc sÏ xÐt trong ch­¬ng 9.

8.1. C¸c hµm chuÈn

Mét hµm tÝnh ra mét gi¸ trÞ, thÝ dô c¨n bËc hai cña mét sè hay gi¸ trÞ trung b×nh cña mét m¶ng. Fortran cã rÊt nhiÒu hµm chuÈn (xem danh s¸ch c¸c hµm chuÈn trong
phô lôc 1).
Nh÷ng ®Æc ®iÓm chÝnh cña c¸c hµm chuÈn lµ:
1) Tªn hµm vµ c¸c gi¸ trÞ ®Çu vµo (c¸c ®èi sè) cïng thÓ hiÖn mét gi¸ trÞ.
2) Mét hµm kh«ng thÓ ®­îc sö dông ë vÕ tr¸i cña dÊu = trong mét lÖnh g¸n.
3) Tªn cña hµm chuÈn x¸c ®Þnh kiÓu d÷ liÖu cña ®Çu ra cña hµm. ThÝ dô, nÕu tªn b¾t ®Çu b»ng mét trong c¸c ch÷ c¸i tõ I ®Õn N th× gi¸ trÞ hµm lµ sè nguyªn.
4) C¸c ®èi sè cña hµm th­êng cïng kiÓu nh­ hµm, trõ mét sè ngo¹i lÖ (xem phô lôc 1).
5) C¸c ®èi sè cña mét hµm ph¶i n»m trong cÆp dÊu ngoÆc ®¬n.
6) C¸c ®èi sè cña mét hµm cã thÓ lµ c¸c h»ng, biÕn, biÓu thøc hay c¸c hµm kh¸c.
7) C¸c hµm tù sinh (generic function) chÊp nhËn nhiÒu kiÓu ®èi sè vµ tr¶ l¹i gi¸ trÞ hµm cïng kiÓu víi ®èi sè. (ThÝ dô hµm ABS(X) nÕu ®èi sè X lµ sè nguyªn th× gi¸
trÞ hµm ABS(X) cho ra gi¸ trÞ tuyÖt ®èi lµ sè nguyªn, nÕu X thùc th× gi¸ trÞ hµm sÏ lµ thùc.)

ThÝ dô 22: §äc tõ bµn phÝm mét sè nguyªn. KiÓm tra xem nã lµ sè ch½n hay sè lÎ vµ in ra th«ng b¸o thÝch hîp. Ta cã thÓ sö dông hµm chuÈn MOD (I, J) trong bµi
tËp nµy. Hµm MOD cã hai ®èi sè nguyªn I vµ J. Hµm nµy tr¶ vÒ sè d­ cña phÐp chia I/J. VËy ch­¬ng tr×nh gi¶i bµi tËp nµy cã thÓ nh­ sau:

PRINT *, ' NHAP MOT SO NGUYEN '

189 190
READ *, K
IF (MOD (K, 2) .EQ. 0) THEN
PRINT 5, K
ELSE
PRINT 8, K
END IF
5 FORMAT ( 1X, I5, ' LA SO CHAN')
8 FORMAT ( 1X, I5, ' LA SO LE')

8.2. C¸c hµm ch­¬ng tr×nh con

Trong thùc tÕ lËp tr×nh gi¶i c¸c bµi to¸n khoa häc kü thuËt nhiÒu khi ®ßi hái nh÷ng hµm ch­a cã trong danh s¸ch c¸c hµm chuÈn cña Fortran. NÕu tÝnh to¸n hay lÆp
l¹i th­êng xuyªn vµ ®ßi hái mét sè b­íc, ta nªn thùc hiÖn nh­ lµ mét hµm thay v× mçi lÇn cÇn l¹i ph¶i viÕt ra c¸c lÖnh tÝnh to¸n. Fortran cho phÐp chóng ta tù x©y dùng
nh÷ng hµm cña riªng m×nh theo hai c¸ch: hµm lÖnh (statement function) vµ hµm ch­¬ng tr×nh con (function subprogram). NÕu tÝnh to¸n cã thÓ viÕt trong mét lÖnh g¸n
duy nhÊt, th× ta sö dông hµm lÖnh; ng­îc l¹i, nÕu ph¶i thùc hiÖn nhiÒu tÝnh to¸n hay thao t¸c míi dÉn tíi mét gi¸ trÞ kÕt qu¶, th× ta dïng hµm ch­¬ng tr×nh con.

8.2.1. Hµm lÖnh


D¹ng tæng qu¸t cña hµm lÖnh lµ

Tªn hµm (Danh s¸ch ®èi sè) = BiÓu thøc

Nh÷ng quy t¾c ph¶i tu©n thñ khi viÕt vµ dïng hµm lÖnh:
1) Hµm lÖnh ®­îc ®Þnh nghÜa ë ®Çu ch­¬ng tr×nh, cïng víi c¸c lÖnh khai b¸o kiÓu d÷ liÖu.
2) §Þnh nghÜa hµm lÖnh gåm tªn cña hµm, sau ®ã ®Õn c¸c ®èi sè n»m trong cÆp dÊu ngoÆc ®¬n ë vÕ bªn tr¸i cña dÊu b»ng; biÓu thøc tÝnh gi¸ trÞ hµm ë vÕ bªn ph¶i
cña dÊu b»ng.
3) Tªn hµm cã thÓ khai b¸o trong lÖnh khai b¸o kiÓu; nÕu kh«ng th× kiÓu cña hµm sÏ ®­îc x¸c ®Þnh theo c¸ch ®Þnh kiÓu Èn.

ThÝ dô 23: DiÖn tÝch cña tam gi¸c cã thÓ tÝnh theo hai c¹nh vµ gãc xen gi÷a chóng:
DiÖn tÝch= 0,5 × c¹nh 1 × c¹nh 2 × sin (gãc) .
ViÕt ch­¬ng tr×nh ®äc ®é dµi ba c¹nh cña mét tam gi¸c vµ c¸c gãc ®èi diÖn mçi c¹nh. TÝnh vµ in diÖn tÝch cña tam gi¸c theo ba ph­¬ng ¸n: trong mçi ph­¬ng ¸n sö

191 192
dông mét cÆp c¹nh vµ gãc t­¬ng øng.
Trong bµi tËp nµy ta ph¶i tÝnh diÖn tÝch tam gi¸c ba lÇn, do ®ã cã thÓ dïng hµm lÖnh ®Ó tÝnh diÖn tÝch tam gi¸c. Ch­¬ng tr×nh cã thÓ nh­ sau:
PROGRAM DTTG
REAL CA, CB, CC, A, B, C, DT, DT1, DT2, DT3,
* C1, C2, GOC
DT (C1, C2, GOC) = 0.5 * C1 * C2 * SIN (GOC)
PRINT *, ' Nhap ba canh tam giac theo thu tu sau:'
PRINT *, ' Canh A Canh B Canh C'
READ *, CA, CB, CC
PRINT *, ' Nhap ba goc (radian) theo thu tu sau:'
PRINT *, ' Doi dien: canh A canh B canh C'
READ *, A, B, C
DT1 = DT (CB, CC, A)
DT2 = DT (CC, CA, B)
DT3 = DT (CA, CB, C)
PRINT *
PRINT *, 'Cac dien tich tinh theo ba phuong an la:'
PRINT 5, DT1, DT2, DT3
5 FORMAT (1X, 3F7.2)
END
NhËn xÐt r»ng trong ch­¬ng tr×nh nµy hµm tÝnh diÖn tÝch tam gi¸c ®­îc ®Þnh nghÜa ë ®Çu ch­¬ng tr×nh bëi tªn DT vµ ba ®èi sè h×nh thøc C1, C2, GOC vµ gi¸ trÞ cña
hµm ®­îc tÝnh chØ b»ng mét lÖnh g¸n (dßng lÖnh thø ba). Trong ch­¬ng tr×nh, ë c¸c dßng lÖnh thø 10−12 ta gäi hµm ba lÇn, mçi lÇn ta chuyÓn c¸c biÕn kh¸c nhau vµo vÞ
trÝ cña c¸c ®èi sè h×nh thøc. KiÓu d÷ liÖu cña hµm DT ®­îc m« t¶ t­êng minh t¹i lÖnh m« t¶ REAL ë ®Çu ch­¬ng tr×nh. Trong ch­¬ng tr×nh chÝnh c¸c gãc ®­îc cho b»ng
ra®ian. NÕu c¸c gãc nhËp vµo ®­îc cho b»ng ®é vµ ®Ó kh«ng cÇn chuyÓn ®æi thµnh ra®ian tr­íc khi gäi hµm DT tÝnh c¸c diÖn tÝch, ta cã thÓ ®Þnh nghÜa l¹i hµm DT nh­
sau:
DT(C1, C2, GOC) = 0.5*C1*C2*SIN (GOC * 3.14159 / 180.0)

8.2.2. Hµm ch­¬ng tr×nh con

193 194
Thùc chÊt cña hµm ch­¬ng tr×nh con lµ mét hµm do ng­êi lËp tr×nh tù x©y dùng, do ®ã ng­êi ta cßn gäi lµ hµm do ng­êi dïng ®Þnh nghÜa. Hµm lo¹i nµy kh¸c víi
hµm lÖnh ë chç nã ®­îc tÝnh kh«ng ph¶i b»ng mét lÖnh g¸n duy nhÊt mµ b»ng mét sè lÖnh. Hµm ch­¬ng tr×nh con b¾t ®Çu víi lÖnh kh«ng thùc hiÖn ®Ó ®Æc t¶ hµm b»ng
mét tªn vµ mét danh s¸ch ®èi sè nh­ sau

FUNCTION Tªn hµm (danh s¸ch ®èi sè)

Sau c¸c lÖnh m« t¶ vµ tÝnh to¸n, lÖnh RETURN chuyÓn ®iÒu khiÓn vÒ ch­¬ng tr×nh chÝnh vµ lÖnh END b¸o cho ch­¬ng tr×nh dÞch sù kÕt thóc cña ch­¬ng tr×nh con.
Tªn hµm ®­îc chän theo quy t¾c nh­ tªn h»ng, tªn biÕn cña Fortran. Tªn hµm cã ý nghÜa m« t¶ Èn kiÓu gi¸ trÞ cña hµm nÕu trong ch­¬ng tr×nh chÝnh ch­a khai b¸o t­êng
minh. Trong danh s¸ch ®èi sè nÕu cã tõ hai ®èi sè trë lªn th× c¸c ®èi sè c¸ch nhau bëi dÊu ph¶y. Tªn c¸c ®èi sè còng cã ý nghÜa m« t¶ Èn kiÓu d÷ liÖu cña ®èi sè. Tuy
nhiªn, nªn m« t¶ t­êng minh c¸c ®èi sè cña hµm trong phÇn khai b¸o c¸c biÕn cña hµm. Trong phÇn khai b¸o nµy, ngoµi c¸c ®èi sè cßn cã thÓ khai b¸o c¸c biÕn kh¸c
®­îc dïng chØ trong néi bé hµm ch­¬ng tr×nh con. VËy h×nh d¸ng tæng qu¸t cña mét hµm chu¬ng tr×nh con nh­ sau:

FUNCTION Tªn (®èi sè 1, ®èi sè 2, ...)


C¸c lÖnh m« t¶ c¸c ®èi sè, c¸c biÕn côc bé
C¸c lÖnh thùc hiÖn
RETURN
END
C¸c hµm ch­¬ng tr×nh con ®­îc viÕt t¸ch ra khái ch­¬ng tr×nh chÝnh vµ n»m sau lÖnh END cña ch­¬ng tr×nh chÝnh. Trong ch­¬ng tr×nh chÝnh, khi cÇn tíi hµm con
ng­êi ta th­êng dïng lÖnh g¸n ®Ó g¸n gi¸ trÞ tÝnh ®­îc bëi hµm con vµo mét biÕn hoÆc dïng trùc tiÕp tªn hµm con trong c¸c biÓu thøc. Nh÷ng gi¸ trÞ cña c¸c ®èi sè thùc tÕ
göi vµo c¸c ®èi sè h×nh thøc ph¶i phï hîp vÒ kiÓu vµ ®óng tuÇn tù nh­ trong danh s¸ch ®èi sè. Ta xÐt thÝ dô vÒ x©y dùng hµm con vµ c¸ch dïng nã trong ch­¬ng tr×nh
chÝnh qua thÝ dô 24 d­íi ®©y.

ThÝ dô 24: C¸c m« h×nh sè th­êng tÝnh ra c¸c gi¸ trÞ cña c¸c thµnh phÇn kinh h­íng Vk vµ vÜ h­íng Vv cña tèc ®é giã ë nh÷ng ®iÓm kh¸c nhau. Tõ nh÷ng cÆp gi¸
trÞ thµnh phÇn kinh h­íng vµ vÜ h­íng cÇn tÝnh ra tèc ®é V vµ h­íng giã d . Tèc ®é giã tÝnh b»ng c«ng thøc

V = Vk2 + Vv2 ,
cßn h­íng giã (gãc gi÷a vect¬ giã vµ h­íng b¾c) tÝnh theo c«ng thøc
α nÕu Vv ≥ 0, Vk > 0

180 − α nÕu Vv ≥ 0, Vk < 0
d=
180 + α nÕu Vv < 0, Vk < 0
360 − α Vv < 0, Vk > 0
 nÕu

195 196
180 Vv
trong ®ã α = arctg .
π Vk
Gi¶ sö c¸c gi¸ trÞ cña c¸c thµnh phÇn kinh h­íng vµ vÜ h­íng cña tèc ®é giã ®· l­u trong file GIOKV.KQ1 thµnh hai cét, dßng ®Çu tiªn cña file ghi sè dßng d÷ liÖu
cã trong file. ViÕt ch­¬ng tr×nh ®äc file GIOKV.KQ1 vµ ghi kÕt qu¶ tÝnh tèc ®é vµ h­íng giã vµo file míi GIO.KQ2 thµnh 4 cét d¹ng sau:
TT Vk Vv m/s HUONG
XX XX.X XX.X XXX XXX
XX XX.X XX.X XXX XXX
...
Khi lËp ch­¬ng tr×nh gi¶i quyÕt nhiÖm vô nµy ta nhËn thÊy cÇn tÝnh m« ®un cña tèc ®é giã vµ h­íng giã nhiÒu lÇn. VËy cã thÓ sö dông c¸c hµm, ngoµi ra, ®Ó tÝnh tèc
®é giã cã thÓ dïng lo¹i hµm lÖnh, ®Ó tÝnh h­íng giã dïng hµm ch­¬ng tr×nh con. Ch­¬ng tr×nh cã thÓ nh­ sau:

REAL GIOK (200), GIOV (200), V, H, TOCDO, HUONG


INTEGER I, N
C M« t¶ hµm lÖnh tÝnh m« ®un tèc ®é giã
TOCDO (VK, VV) = SQRT (VK*VK+VV*VV)
OPEN (1, FILE = 'GIO.KQ1', STATUS = 'OLD')
READ(1,*) N
DO I = 1, N
READ(1,*) GIOK (I), GIOV (I)
END DO
CLOSE (1)
OPEN (1, FILE = 'GIO.KQ2', STATUS = 'UNKNOWN')
WRITE (1, 4) ‘TT’, ‘VK’, ‘VV’, ‘M/S’, ‘HUONG’
4 FORMAT(1X, I3, 4F7.1)
DO I = 1, N
V = TOCDO (GIOK (I), GIOV (I))
H = HUONG (GIOV (I), GIOK (I))
WRITE (1, 5) I, GIOK (I), GIOV (I), V, H
5 FORMAT (1X, I3, 4F7.1)
END DO

197 198
END
C Hµm ch­¬ng tr×nh con
FUNCTION HUONG (VV, VK)
REAL VV, VK, HG
IF (VK .EQ. 0.0) THEN
IF (VV .GE. 0.0) THEN
HG = 90.0
ELSE
HG = 270.0
ENDIF
ELSE
G = ATAN (ABS (VV / VK)) / 3.14159 * 180.0
IF (VK .GT. 0.0) THEN
IF (VV .GE. 0.0) THEN
HG = G
ELSE
HG = 360.0 - G
ENDIF
ELSE
IF (VV .GE. 0.0) THEN
HG = 180.0 - G
ELSE
HG = 180.0 + G
ENDIF
ENDIF
ENDIF
HUONG = HG
RETURN
END

Trong thÝ dô nµy, ta thÊy viÖc tÝnh m« ®un tèc ®é vµ h­íng ®­îc thùc hiÖn nhiÒu lÇn. Do ®ã ®· tæ chøc tÝnh chóng trong c¸c hµm. V× gi¸ trÞ m« ®un tÝnh ®¬n gi¶n
b»ng mét biÓu thøc nªn ®· dïng lo¹i hµm lÖnh, ®ã lµ hµm TOCDO ®­îc ®Þnh nghÜa ë dßng lÖnh thø ba cña ch­¬ng tr×nh chÝnh. ViÖc tÝnh h­íng ph¶i thùc hiÖn nhê mét sè

199 200
phÐp tÝnh vµ thao t¸c, do ®ã ®· dïng lo¹i hµm ch­¬ng tr×nh con HUONG. KiÓu d÷ liÖu cña hai hµm nµy ®­îc khai b¸o t­êng minh ë phÇn khai b¸o trong ch­¬ng tr×nh
chÝnh.

ThÝ dô 25: ¦íc l­îng nghiÖm cña ®a thøc bËc 4

f ( x) = a0 + a1 x + a2 x 2 + a3 x 3 + a4 x 4

trªn kho¶ng [−5, 5].


§Ó gi¶i bµi to¸n nµy, ta sö dông hai ph­¬ng ph¸p t×m nghiÖm cña ph­¬ng tr×nh lµ ph­¬ng ph¸p t×m hÑp dÇn vµ ph­¬ng ph¸p chia ®«i.
Trong ph­¬ng ph¸p t×m hÑp dÇn, miÒn t×m nghiÖm ®­îc chia thµnh nh÷ng kho¶ng ®ñ nhá sao cho thùc tÕ cã thÓ xem r»ng trong mét kho¶ng nµo ®ã chØ cã mét
nghiÖm. XÐt c¸c kho¶ng tõ tr¸i sang ph¶i, ta sÏ t×m nh÷ng chç mµ ®å thÞ cña ®a thøc c¾t trôc x : b»ng c¸ch tÝnh c¸c gi¸ trÞ cña ®a thøc t¹i c¸c ®Çu mót cña kho¶ng, nÕu dÊu
cña c¸c gi¸ trÞ cña ®a thøc t¹i c¸c ®Çu mót kh¸c nhau, th× ®å thÞ c¾t trôc x vµ Ýt nhÊt cã mét nghiÖm trong kho¶ng ®ã. Sau ®ã kho¶ng chøa nghiÖm l¹i ®­îc chia tiÕp thµnh
c¸c phô kho¶ng nhá h¬n vµ qu¸ tr×nh t×m l¹i b¾t ®Çu tõ ®Çu tr¸i cho ®Õn khi x¸c ®Þnh ®­îc kho¶ng chøa nghiÖm. Qu¸ tr×nh chia kho¶ng vµ t×m lÆp l¹i cho ®Õn khi nghiÖm
®­îc x¸c ®Þnh ®ñ ®é chÝnh x¸c.
Ph­¬ng ph¸p chia ®«i b¾t ®Çu víi mét kho¶ng ®· ®­îc biÕt lµ chøa mét nghiÖm. Kh¸c víi ph­¬ng ph¸p t×m hÑp dÇn chia kho¶ng chøa nghiÖm thµnh nhiÒu phô
kho¶ng tr­íc khi t×m, ph­¬ng ph¸p chia ®«i chØ chia kho¶ng chøa nghiÖm thµnh hai nöa, sau ®ã x¸c ®Þnh nöa nµo chøa nghiÖm. Sù chia ®«i tiÕp tôc cho ®Õn khi t×m ®­îc
nghiÖm víi ®é chÝnh x¸c mong muèn.
Trong thÝ dô nµy, ta kÕt hîp hai ph­¬ng ph¸p: ph­¬ng ph¸p t×m hÑp dÇn ®Ó x¸c ®Þnh kho¶ng chøa nghiÖm. Sau ®ã ph­¬ng ph¸p chia ®«i x¸c ®Þnh nghiÖm víi ®é
chÝnh x¸c cÇn thiÕt. Gi¶ sö ph­¬ng ph¸p chia ®«i tiÕp tôc lÆp cho ®Õn khi nöa kho¶ng nhá h¬n 0,01 vµ nghiÖm t×m ®­îc nÕu gi¸ trÞ tuyÖt ®èi cña ®a thøc kh«ng lín h¬n
0,001.
INTEGER I, N
REAL A (0 : 4)
REAL TRAI, PHAI, GIUA, KHOANG, NGHIEM
LOGICAL XONG
PRINT * , ' NHAP CAC HE SO A0, A1, A2, A3, A4 '
READ*, A
PRINT 5, A
5 FORMAT (/, ' DA THUC:'
* / 1X, 9X, '4', 11X, '3', 11X, '2' / 1X, 4(F7.3, ' X + '), F7.3)
N=0
DO I = 1, 40
TRAI = −5.0 + REAL (I-1) * 0.25
PHAI = TRAI + 0.25
IF (ABS(F(A, TRAI)) .LT. 0.001) THEN

201 202
PRINT 15, TRAI, F(A, TRAI)
15 FORMAT (1X, 'NGHIEM = ', F7.3, 3X,
* 'F(NGHIEM) = ', F7.3)
N=N+1
ELSE IF (F(A, TRAI)*F(A, PHAI) .LT. 0.0) THEN
XONG = .FALSE.
KHOANG = PHAI − TRAI
20 IF (KHOANG .GT. 0.01 .AND. .NOT. XONG ) THEN
GIUA = 0.5 *(TRAI + PHAI)
IF (ABS (F(A, GIUA)) .LT. 0.001) THEN
XONG = .TRUE.
ELSE IF (F(A, GIUA)*F(A, TRAI) .LT. 0.0) THEN
PHAI = GIUA
ELSE
TRAI = GIUA
END IF
KHOANG = PHAI − TRAI
GOTO 20
END IF
IF (KHOANG .GT. 0.01) THEN
NGHIEM = GIUA
ELSE
NGHIEM = 0.5 *(TRAI + PHAI)
END IF
PRINT 15, NGHIEM, F(A, NGHIEM)
N=N+1
END IF
END DO
TRAI = 5.0
IF (ABS (F (A, TRAI)) .LT. 0.001) THEN
PRINT 15, TRAI, F (A, TRAI)
N=N+1
END IF
IF (N .EQ. 0) THEN
PRINT *, ' KHONG NGHIEM TRONG KHOANG [-5,5]'
END IF
END

203 204
REAL FUNCTION F (A, X)
REAL A(0 : 4), X
F=A(0) + A(1)*X + A(2)*X**2 + A(3)*X**3 + A(4)*X**4
RETURN
END

Trong ch­¬ng tr×nh nµy, ta ®· chia miÒn t×m nghiÖm [−5, 5] thµnh 40 kho¶ng, mçi kho¶ng dµi 0,25 vµ thùc hiÖn viÖc kiÓm tra tõ tr¸i sang ph¶i xem trong nh÷ng
kho¶ng nµo cã thÓ cã nghiÖm b»ng ph­¬ng ph¸p t×m hÑp dÇn b»ng vßng DO. Trong mçi kho¶ng, nÕu gi¸ trÞ ®a thøc ë ®Çu mót tr¸i cña kho¶ng kh«ng kh¸c kh«ng qu¸
0,001 th× nhËn nghiÖm b»ng ®Çu mót tr¸i vµ chuyÓn sang xÐt kho¶ng tiÕp sau ë bªn ph¶i. Cßn nÕu gi¸ trÞ ®a thøc ë hai ®Çu mót cña kho¶ng ®ang xÐt kh¸c dÊu, th× ta t×m
nghiÖm theo ph­¬ng ph¸p chia ®«i. Qu¸ tr×nh lÆp ®Ó liªn tiÕp chia ®«i kho¶ng thùc hiÖn b»ng vßng lÆp IF l«gic vµ lÖnh GOTO v« ®iÒu kiÖn cho ®Õn khi kho¶ng trë nªn
nhá h¬n hoÆc b»ng 0,01 hoÆc gi¸ trÞ tuyÖt ®èi cña ®a thøc ë gi÷a kho¶ng kh«ng lín h¬n 0,001. ViÖc tÝnh gi¸ trÞ ®a thøc thùc hiÖn nhiÒu lÇn víi nh÷ng gi¸ trÞ x kh¸c nhau
nªn ta ®· tæ chøc hµm F ®Ó chuyªn lµm viÖc nµy.

ThÝ dô 26: ViÕt ch­¬ng tr×nh ®äc liªn tiÕp tõ bµn phÝm ba sè nguyªn, kiÓm tra xem chóng cã tuÇn tù chØ ngµy th¸ng n¨m hîp lý kh«ng vµ in ra th«ng b¸o phï hîp.
Ch­¬ng tr×nh kÕt thóc khi ta nhËp ngµy th¸ng n¨m ®Òu lµ nh÷ng sè kh«ng.
PROGRAM KTNGAY
INTEGER ID, IM, IY
10 PRINT *, 'HAY NHAP BA SO NGUYEN'
READ *, ID, IM, IY
IF (ID .NE. 0 .AND. IM .NE. 0 .AND. IY .NE. 0) THEN
IF (OKDATE (ID, IM, IY)) THEN
PRINT*, 'CO THE LA NGAY THANG NAM HOP LY'
ELSE
PRINT*, ‘KHONG THE LA ’,
* ‘NGAY THANG NAM HOP LY’
ENDIF
GOTO 10
ENDIF
END
INTEGER FUNCTION SNTT (M, Y)
INTEGER M,Y
IF (M. EQ. 2) THEN
SNTT = 28
IF ((MOD (Y,100) .NE. 0 .AND. MOD (Y,4) .EQ. 0) .OR.
205 206
* (MOD (Y,100) .EQ. 0 .AND. MOD (Y/100, 4) .EQ .0))
* SNTT = 29
ELSE IF (M.EQ.4 .OR. M.EQ.6 .OR. M.EQ.9 .OR. M.EQ.11) THEN
SNTT = 30
ELSE
SNTT = 31
ENDIF
RETURN
END
LOGICAL FUNCTION OKDATE (D, M, Y)
INTEGER D,M,Y,NNGAY
IF (D.LT.1.OR.D.GT.31.OR.M.LT.1.OR.M.GT.12) THEN
OKDATE = .FALSE.
ELSE
NNGAY = SNTT (M, Y)
OKDATE = D.LE.NNGAY
ENDIF
RETURN
END

Trong ch­¬ng tr×nh nµy dïng hai hµm con: hµm OKDATE vµ hµm SNTT. Hµm OKDATE cã ba ®èi sè nguyªn D, M, Y vµ ®­a ra gi¸ trÞ l«gic lµ .TRUE. nÕu D, M,
Y lµ nh÷ng sè nguyªn chØ ngµy th¸ng hîp lý. Hµm SNTT cã hai ®èi sè nguyªn vµ ®­a ra gi¸ trÞ nguyªn lµ sè ngµy cña th¸ng ®ang xÐt. NhËn thÊy r»ng ch­¬ng tr×nh chÝnh
gäi hµm con OKDATE, vÒ phÇn m×nh hµm con OKDATE trong khi thùc hiÖn l¹i gäi hµm con SNTT.

8.3. ChØ dÉn gì rèi vµ phong c¸ch viÕt ch­¬ng tr×nh cã hµm con

KiÓm tra sù lµm viÖc ®óng ®¾n cña hµm tù x©y dùng còng gièng nh­ kiÓm tra ch­¬ng tr×nh chÝnh. Nªn thö cho hµm con nh÷ng gi¸ trÞ ®èi sè kh¸c nhau xem nã cã
®­a ra gi¸ trÞ hµm ®óng ®¾n kh«ng. NÕu hµm con lµm viÖc kh«ng ®óng ®¾n, h·y kiÓm tra nh÷ng ®iÓm sau:
1) Sù phï hîp vÒ kiÓu vµ thø tù cña ®èi sè thùc tÕ vµ ®èi sè h×nh thøc.
2) Kh¼ng ®Þnh r»ng tr­íc lÖnh RETURN hµm ®· nhËn mét gi¸ trÞ ®óng.
3) In kiÓm tra gi¸ trÞ c¸c ®èi sè tr­íc vµ sau khi gäi hµm con.

207 208
4) Cã thÓ dïng lÖnh PRINT trong hµm con ®Ó ®Þnh vÞ chç lçi trong hµm con.
Sö dông hµm lÖnh vµ hµm ch­¬ng tr×nh con sÏ lµm ch­¬ng tr×nh cã tÝnh cÊu tróc h¬n vµ dÔ ®äc. Trong ch­¬ng tr×nh con còng nªn cã cÊu tróc s¸ng râ. NÕu hµm dµi
vµ khã ®äc, h·y dïng hµm con kh¸c trong hµm con. Mét khi b¹n quyÕt ®Þnh dïng hµm con, h·y c©n nh¾c nh÷ng ®iÒu sau ®©y:
1) Chän tªn hµm con sao cho tªn cã tÝnh gîi nhí.
2) Nªn dïng tªn c¸c ®èi sè h×nh thøc trong hµm con trïng víi tªn cña c¸c ®èi sè thùc tÕ. NÕu hµm ®­îc dïng nhiÒu lÇn víi nh÷ng ®èi sè thùc tÕ kh¸c nhau, th× h·y
chän tªn ®èi sè h×nh thøc hoµn toµn kh¸c ®Ó tr¸nh sù nhÇm lÉn víi c¸c biÕn cña ch­¬ng tr×nh chÝnh. Cã thÓ c¸ch sau ®©y lµ mét c¸ch nªn ®­îc dïng: tªn c¸c ®èi sè trong
hµm con ®Æt b»ng c¸c tõ tiÕng Anh, cßn tªn c¸c ®èi sè thùc tÕ - b»ng c¸c tõ t­¬ng øng cña tiÕng ViÖt.

Bµi tËp

1. ViÕt ch­¬ng tr×nh in gi¸ trÞ c¸c biÓu thøc sau:


6,9 + y
α=
y + 1 + 2y + 3y 2
2

sin y
β=
y + 1 + 2y 2 + 3y 4
4

2,3 z + z 4
γ =
z 2 + 1 + 2 z + 3z 2
1
δ =
sin 2 y + 1 + 2 sin y + 3 sin 2 y
trong ch­¬ng tr×nh h·y x©y dùng hµm con tªn lµ DENOM víi ®èi sè x chuyªn ®Ó tÝnh biÓu thøc

x 2 + 1 + 2 x + 3x 2 .
2. H·y c¶i tiÕn ch­¬ng tr×nh t×m nghiÖm cña ®a thøc ë thÝ dô 25 trang 139 sao cho nã cho phÐp ng­êi dïng nhËp kho¶ng x¸c ®Þnh nghiÖm thay v× dïng kho¶ng [−5,
5].
3. H·y c¶i tiÕn ch­¬ng tr×nh t×m nghiÖm cña ®a thøc ë thÝ dô 25 trang 139 sao cho nã cho phÐp ng­êi dïng nhËp kÝch th­íc cña phô kho¶ng trong phÇn t×m hÑp dÇn.
4. ViÕt hµm ch­¬ng tr×nh con nhËn gi¸ trÞ mét sè nguyªn vµ tr¶ vÒ giai thõa cña sè nguyªn ®ã.
5. C«sin cña mét gãc tÝnh theo c«ng thøc chuçi

209 210
x 2 x 4 x6
cos x = 1 − + − + ...
2! 4! 6!
trong ®ã x tÝnh b»ng ra®ian. H·y viÕt hµm ch­¬ng tr×nh con COSX víi ®Çu vµo lµ gãc tÝnh b»ng ®é, tÝnh ra c«sin cña gãc ®ã víi ®é chÝnh x¸c ≤ 0,000001, sö dông hµm
con tÝnh giai thõa ë bµi tËp 4. Sau ®ã viÕt ch­¬ng tr×nh chÝnh in b¶ng ba cét: cét thø nhÊt ( x ) chøa gãc tõ 0 ®Õn 360° víi gia sè 15°; cét thø hai chøa c«sin cña gãc tÝnh
theo hµm chuÈn COS cña Fortran vµ cét thø ba chøa c«sin tÝnh theo hµm con COSX.
6. ViÕt hµm ch­¬ng tr×nh con MEDIAN (X,N) víi ®Çu vµo lµ m¶ng REAL X(N) ®· s¾p xÕp t¨ng hoÆc gi¶m dÇn vµ sè gi¸ trÞ thùc tÕ cña m¶ng N, tr¶ vÒ gi¸ trÞ cña
trung vÞ cña chuçi x (n) theo ®Þnh nghÜa:
n 
- nÕu n lÎ trung vÞ b»ng x  + 1 ,
2 
x (n / 2) + x ( n / 2 + 1)
- nÕu n ch½n trung vÞ b»ng .
2
7. ViÕt hµm ch­¬ng tr×nh con DAD (D1, M1, Y1, D2, M2, Y2) víi 6 ®èi sè h×nh thøc kiÓu sè nguyªn: D1, M1, Y1, D2, M2, Y2 lÇn l­ît chØ ngµy, th¸ng, n¨m cña
hai ngµy bÊt kú. Hµm nµy sÏ cã gi¸ trÞ l«gic b»ng TRUE nÕu ngµy D2, M2, Y2 lµ ngµy muén h¬n ngµy D1, M1, Y1, cßn nÕu kh«ng th× nã sÏ cã gi¸ trÞ FALSE. Sau ®ã
h·y viÕt mét ch­¬ng tr×nh chÝnh cho phÐp ta nhËp tõ bµn phÝm mét ngµy bÊt kú trong qu¸ khø hoÆc trong t­¬ng lai, x¸c ®Þnh vµ in lªn mµn h×nh thø trong tuÇn cña ngµy
®ã. BiÕt r»ng ngµy 1-1-2001 lµ ngµy thø hai.

Ch­¬ng 9
Ch­¬ng tr×nh con lo¹i thñ tôc

Trong ch­¬ng 8 chóng ta ®· nghiªn cøu vÒ c¸c hµm chuÈn, c¸c hµm lÖnh vµ c¸c hµm do ng­êi lËp tr×nh tù x©y dùng. Trong khi mét hµm chØ giíi h¹n ë viÖc tÝnh ra
mét gi¸ trÞ, th× c¸c thñ tôc ch­¬ng tr×nh con (hay cßn gäi lµ thñ tôc do ng­êi lËp tr×nh tù x©y dùng) cã thÓ tÝnh ra mét sè gi¸ trÞ, hoÆc thùc hiÖn mét sè thao t¸c. Trong bµi
nµy ta häc c¸ch viÕt c¸c thñ tôc vµ sö dông c¸c thñ tôc trong c¸c bµi to¸n øng dông.

9.1. Khai b¸o vµ gäi ch­¬ng tr×nh con thñ tôc

211 212
NhiÒu quy t¾c viÕt vµ sö dông c¸c thñ tôc ch­¬ng tr×nh con gièng nh­ c¸c quy t¾c ®èi víi c¸c hµm ch­¬ng tr×nh con. D­íi ®©y liÖt kª nh÷ng kh¸c biÖt gi÷a c¸c thñ
tôc vµ c¸c hµm.
1) Mét thñ tôc kh«ng biÓu diÔn mét gi¸ trÞ, do ®ã tªn cña nã chØ lµ ®¹i diÖn cho mét ®o¹n ch­¬ng tr×nh, kh«ng chØ ®Þnh kiÓu cña d÷ liÖu ®Çu ra.
2) Dßng lÖnh ®Çu tiªn trong mét thñ tôc th«ng b¸o tªn thñ tôc vµ danh s¸ch ®èi sè

SUBROUTINE Tªn thñ tôc (danh s¸ch ®èi sè)


3) Ch­¬ng tr×nh chÝnh gäi mét thñ tôc b»ng lÖnh CALL cã d¹ng tæng qu¸t nh­ sau:

CALL Tªn thñ tôc (danh s¸ch ®èi sè)

4) Thñ tôc dïng danh s¸ch ®èi sè kh«ng chØ cho ®Çu vµo mµ c¶ cho nh÷ng gi¸ trÞ göi ra ch­¬ng tr×nh chÝnh gäi nã. C¸c ®èi sè cña thñ tôc ®­îc dïng trong lÖnh
CALL lµ nh÷ng ®èi sè thùc tÕ, cßn c¸c ®èi sè sö dông trong thñ tôc lµ nh÷ng ®èi sè h×nh thøc. C¸c ®èi sè trong lÖnh CALL ph¶i phï hîp vÒ kiÓu, sè l­îng vµ thø tù víi
nh÷ng ®èi sè trong thñ tôc.
5) Mét thñ tôc cã thÓ tÝnh ra mét gi¸ trÞ, nhiÒu gi¸ trÞ hoÆc kh«ng gi¸ trÞ nµo c¶. Mét thñ tôc cã thÓ sö dông mét gi¸ trÞ ®Çu vµo, nhiÒu gi¸ trÞ ®Çu vµo hoÆc kh«ng cã
gi¸ trÞ ®Çu vµo.
6) Nh·n lÖnh, tªn biÕn trong thñ tôc ®­îc chän ®éc lËp víi ch­¬ng tr×nh chÝnh. Nh÷ng biÕn dïng trong thñ tôc mµ kh«ng ph¶i lµ c¸c ®èi sè cña thñ tôc gäi lµ c¸c
biÕn côc bé, c¸c gi¸ trÞ cña chóng kh«ng xö lý ®­îc trong ch­¬ng tr×nh chÝnh.
7) CÇn ®Æc biÖt thËn träng khi sö dông c¸c m¶ng nhiÒu chiÒu trong c¸c thñ tôc. Nªn chØ ®Þnh c¶ kÝch th­íc khai b¸o vµ kÝch th­íc sö dông thùc tÕ víi c¸c m¶ng hai
hoÆc nhiÒu chiÒu.
8) Gièng nh­ c¸c hµm, lÖnh RETURN ë cuèi c¸c thñ tôc dïng ®Ó chuyÓn ®iÒu khiÓn trë vÒ ch­¬ng tr×nh chÝnh, lÖnh END ®Ó b¸o kÕt thóc thñ tôc.
9) Trong l­u ®å khèi c¸c thao t¸c ®­îc thùc hiÖn bªn trong thñ tôc ®­îc ký hiÖu b»ng biÓu t­îng ®å häa sau ®©y:

10) Mét thñ tôc cã thÓ dïng c¸c hµm con kh¸c hoÆc gäi c¸c thñ tôc kh¸c, nh­ng nã kh«ng thÓ tù gäi chÝnh nã. (Trong Fortran 90 cho phÐp dïng c¸c thñ tôc ®Ö quy
cã thÓ tù gäi chÝnh m×nh.)

9.2. Nh÷ng thÝ dô øng dông ch­¬ng tr×nh con thñ tôc

213 214
Nh÷ng thÝ dô d­íi ®©y gióp chóng ta häc c¸ch viÕt c¸c thñ tôc vµ sö dông nã trong ch­¬ng tr×nh chÝnh nh­ thÕ nµo.

ThÝ dô 27: Ch ­ ¬ng tr×nh 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 sè liÖu quan tr¾c. C¸c c«ng thøc sau tÝnh nh­ sau:
n n
∑ xi ∑ xi2
i =1 i =1
mx = , Dx = − m x2 , σ x = Dx .
n n −1
Ta thÊy r»ng mçi ®¹i l­îng trªn cã thÓ tÝnh ®­îc b»ng mét hµm riªng biÖt. Nh­ng ta còng cã thÓ tÝnh lu«n mét lóc c¶ ba ®¹i l­îng b»ng c¸ch tæ chøc tÝnh chóng
trong mét thñ tôc. Ch­¬ng tr×nh d­íi ®©y cho phÐp ®äc vµo kÝch th­íc n vµ c¸c gi¸ trÞ cña chuçi x . Sau ®ã gäi thñ tôc STAT ®Ó tÝnh c¸c ®Æc tr­ng thèng kª. Cuèi cïng lµ
in ra kÕt qu¶.
ThÊy r»ng thñ tôc STAT cã tÊt c¶ 5 ®èi sè h×nh thøc, trong ®ã hai ®èi sè ®Çu vµo lµ m¶ng mét chiÒu X vµ kÝch th­íc m¶ng N, ba ®èi sè ®Çu ra lµ AVER, VARI vµ
STDV. Khi gäi thñ tôc nµy trong ch­¬ng tr×nh chÝnh, ta göi vµo c¸c ®èi sè thùc tÕ lµ X, N, TBINH, PSAI vµ DLC. KÕt qu¶ tÝnh trung b×nh, ph­¬ng sai vµ ®é lÖch chuÈn
trong thñ tôc ch­¬ng tr×nh con ®­îc l­u vµo c¸c biÕn TBINH, PSAI, DLC cña ch­¬ng tr×nh chÝnh. H·y chó ý r»ng: v× thñ tôc ch­¬ng tr×nh con lµ m«®un ®éc lËp, nªn tªn
c¸c ®èi sè cña nã cã thÓ trïng víi tªn cña c¸c biÕn trong ch­¬ng tr×nh chÝnh, trong thÝ dô nµy lµ ®èi sè X vµ N. ë ®©y ta thÊy, trong ch­¬ng tr×nh con, cã thÓ ®Þnh nghÜa
kÝch th­íc cña m¶ng b»ng biÕn N (trong lÖnh REAL X(N)). Nhí r»ng ®iÒu nµy chØ cho phÐp trong ch­¬ng tr×nh con.
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)

215 216
END
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

ThÝ dô 28: Xö lý ngµy th¸ng. Trong thùc tÕ xö lý sè liÖu quan tr¾c khÝ t­îng thñy v¨n, ta th­êng hay ph¶i ®Ó ý ®Õn ngµy th¸ng cña sè liÖu. Trong môc nµy sÏ xÐt mét
thÝ dô vÒ xö lý ngµy th¸ng víi thÝ dô sau: ViÕt ch­¬ng tr×nh nhËp vµo mét ngµy th¸ng n¨m bÊt kú, in ra ngµy th¸ng n¨m cña ngµy h«m sau. ViÖc x¸c ®Þnh ngµy th¸ng n¨m
cña ngµy h«m sau so víi ngµy th¸ng n¨m hiÖn t¹i sÏ ®­îc thùc hiÖn trong mét ch­¬ng tr×nh con thñ tôc, ta gäi tªn lµ thñ tôc HOMSAU. V× ë ®©y kÕt qu¶ sÏ cho ra ba gi¸
trÞ nguyªn tuÇn tù chØ ngµy, th¸ng vµ n¨m. Ch­¬ng tr×nh cã thÓ nh­ sau:

PROGRAM TGNGAY
INTEGER ID, IM, IY
PRINT *, 'HAY NHAP NGAY THANG NAM BAT KY'
READ *, ID, IM, IY
CALL HOMSAU (ID, IM, IY)
PRINT 20, ID, IM, IY
20 FORMAT (1X, 'NGAY HOM SAU LA ', I2, '−', I2 , '−', I4)
END
SUBROUTINE HOMSAU (D, M, Y)
INTEGER D, M, Y

217 218
D=D+1
IF (D .GT. SNTT (M, Y)) THEN
D=1
M=M+1
IF (M .GT. 12) THEN
M=1
Y=Y+1
END IF
END IF
RETURN
END
INTEGER FUNCTION SNTT (M, Y)
INTEGER M, Y
IF (M .EQ. 2) THEN
SNTT = 28
IF ((MOD(Y,100) .NE. 0 .AND. MOD(Y,4) .EQ. 0) .OR.
* (MOD (Y,100) .EQ. 0 .AND. MOD (Y/100, 4) .EQ .0))
* SNTT = 29
ELSE IF (M.EQ.4.OR.M.EQ.6.OR.M.EQ.9.OR.M.EQ.11) THEN
SNTT = 30
ELSE
SNTT = 31
ENDIF
RETURN
END

C¸c thao t¸c ®Ó chuyÓn thµnh h«m sau ®­îc thùc hiÖn trong ch­¬ng tr×nh con thñ tôc HOMSAU. H·y chó ý r»ng trong thñ tôc con HOMSAU l¹i gäi thùc hiÖn mét
hµm con kh¸c lµ SNTT ®Ó tÝnh sè ngµy cña th¸ng ®ang xÐt. Hµm nµy ®· ®­îc nh¾c tíi trong thÝ dô 26, trang 142, ë ®©y ghi l¹i ®Ó sinh viªn tiÖn theo dâi.

D­íi ®©y ta xÐt mét thÝ dô vÒ xö lý sè liÖu khÝ t­îng cã liªn quan tíi ngµy th¸ng.

ThÝ dô 29: TÝnh c¸c gi¸ trÞ trung b×nh th¸ng cña mét yÕu tè khÝ t­ îng thñy v¨n. Gi¶ sö víi file d÷ liÖu vÒ c¸c yÕu tè khÝ t­îng thñy v¨n ®· m« t¶ trong thÝ dô 20
(trang 124).
219 220
Nhí l¹i r»ng file HONDAU.MAT cã quy c¸ch ghi nh­ sau: Dßng trªn cïng ghi tªn tr¹m. Dßng thø 2 cã hai sè nguyªn viÕt c¸ch nhau lÇn l­ît chØ tæng sè ngµy quan
tr¾c vµ sè yÕu tè ®­îc quan tr¾c. Dßng thø ba cã 6 sè nguyªn viÕt c¸ch nhau lÇn l­ît chØ ngµy, th¸ng, n¨m ®Çu vµ ngµy, th¸ng, n¨m cuèi quan tr¾c. Dßng thø 4 lµ tiªu ®Ò
cét liÖt kª tªn tÊt c¶ c¸c yÕu tè ®­îc quan tr¾c, mçi tªn ®­îc ghi víi ®é réng 8 vÞ trÝ. C¸c dßng tiÕp theo lÇn l­ît ghi gi¸ trÞ cña c¸c yÕu tè, mçi dßng mét ngµy. C¸c gi¸ trÞ
ngµy cña nhiÖt ®é kh«ng khÝ ®­îc ghi ë cét thø hai cña file nµy. ViÕt ch­¬ng tr×nh tÝnh gi¸ trÞ trung b×nh th¸ng cña nhiÖt ®é kh«ng khÝ trong tÊt c¶ c¸c n¨m quan tr¾c.
ë ®©y ta thÊy, muèn tÝnh trung b×nh th¸ng chØ viÖc céng tÊt c¶ c¸c gi¸ trÞ ngµy vµ chia tæng cho sè ngµy cña th¸ng ®ang xÐt. Nh­ng v× sè ngµy trong mçi th¸ng cã thÓ
kh¸c nhau, nªn ta cÇn cã nh÷ng thñ tôc xö lý ngµy th¸ng. Ch­¬ng tr×nh sau ®©y sÏ thùc hiÖn kiÓu xö lý nh­ vËy.
REAL X, TONG, TB (100, 12)
INTEGER D1, M1, Y1, D2, M2, Y2, YDAU, M
OPEN (1, FILE = ‘HONDAU.MAT’, STATUS = ‘OLD’)
READ (1, *)
READ (1, *) N
READ (1, *) D1, M1, Y1, D2, M2, Y2
READ (1, *)
Y = Y1
2 IF (Y1 .GT. Y2) GOTO 4
READ (1, *) X, X
IF (D1 .EQ. 1) THEN
TONG = 0.0
M = SNTT (M1, Y1)
END IF
TONG = TONG + X
IF (D1 .EQ. M) THEN
TB (I, M1) = TONG / M
END IF
CALL HOMSAU (D1, M1, Y1)
GOTO 2
4 CLOSE (1)
PRINT *, ‘ NHIET DO KHONG KHI TRUNG BINH THANG’
PRINT ‘(A5, 12I5)’, ‘NAM’, (J, J = 1, 12)
K=1
DO I = Y, Y2
PRINT ‘(A5, 12F5.1)’, I, (TB (K, J), J =1, 12)
K=K+1
END DO
END
Ta thÊy trong ch­¬ng tr×nh nµy ®· sö dông hµm SNTT vµ thñ tôc HOMSAU mµ chóng ta ®· x©y dùng trong thÝ dô 28. Hµm SNTT ®­îc gäi vµo mçi ngµy ®Çu th¸ng
®Ó tÝnh sè ngµy cña th¸ng ®ã vµ g¸n vµo biÕn M chuÈn bÞ cho viÖc tÝnh trung b×nh sau khi gi¸ trÞ nhiÖt ®é ngµy cuèi cïng cña th¸ng ®­îc céng vµo biÕn TONG. Cßn thñ

221 222
tôc HOMSAU ®­îc gäi liªn tôc ®Ó t¨ng ngµy hiÖn hµnh lªn mét ngµy sau khi mét sè liÖu ®­îc ®äc.
Qua thÝ dô 20 vµ thÝ dô nµy, sinh viªn còng cÇn chó ý ghi nhí c¸ch ®äc sè liÖu kiÓu bá qua mét sè cét trong file chøa b¶ng sè liÖu cã nhiÒu cét.
D­íi ®©y lµ hai thÝ dô liªn quan tíi c¸c thñ tôc thao t¸c chuçi th­êng cã thÓ rÊt cã Ých trong thùc tiÔn xö lý thèng kª chuçi sè liÖu khÝ t­îng thñy v¨n.

ThÝ dô 30: ChÌn mét gi¸ trÞ vµo danh s¸ch. Trong thÝ dô nµy, ta viÕt mét thñ tôc cho phÐp chÌn mét gi¸ trÞ míi vµo mét danh s¸ch ®· s¾p xÕp. C¸c ®èi sè cña thñ tôc
gåm m¶ng mét chiÒu X, biÕn COUNT chØ sè gi¸ trÞ d÷ liÖu thùc tÕ trong m¶ng, biÕn LIMIT chøa kÝch th­íc m« t¶ cña m¶ng vµ biÕn NEW chøa gi¸ trÞ cÇn chÌn vµo
m¶ng. Tr­êng hîp phÇn tö míi ®­îc chÌn vµo m¶ng ®· ®Çy, tøc gi¸ trÞ COUNT b»ng gi¸ trÞ LIMIT th× gi¸ trÞ cuèi cïng trong m¶ng sÏ bÞ c¾t bá.

SUBROUTINE INSERT (LIMIT, NEW, COUNT, X)


INTEGER LIMIT, NEW, COUNT, X (LIMIT), J, K
LOGICAL DONE
DONE = .FALSE.
J=1
5 IF (J .LE. COUNT .AND. .NOT. DONE) THEN
IF (X (J) .LT. NEW) THEN
J=J+1
ELSE
DONE = .TRUE.
END IF
GOTO 5
END IF
IF (J .GT. COUNT) THEN
IF (COUNT .LT. LIMIT) THEN
COUNT = COUNT + 1
X (COUNT) = NEW
END IF
ELSE
IF (COUNT .LT. LIMIT) COUNT = COUNT + 1
DO K = COUNT, J+1, −1
X (K) = X (K − 1)

223 224
END DO
X (J) = NEW
END IF
RETURN
END

ThÝ dô 31: Xo¸ mét gi¸ trÞ khái danh s¸ch. Trong tr­êng hîp nµy, ta t×m trong danh s¸ch gi¸ trÞ b»ng gi¸ trÞ ®Þnh xo¸ vµ lo¹i gi¸ trÞ ®ã khái danh s¸ch. Kh¸c víi thñ
tôc chÌn, trong thñ tôc xo¸ kh«ng cÇn ®èi sè LIMIT v× khi xo¸ mét gi¸ trÞ khái danh s¸ch th× sè phÇn tö thùc cña m¶ng chØ cã thÓ nhá ®i, kh«ng sî chØ sè m¶ng v­ît qu¸
kÝch th­íc m« t¶ cña m¶ng.

SUBROUTINE DELETE (OLD, COUNT, X)


INTEGER OLD, COUNT, X (COUNT), J, K
LOGICAL DONE
DONE = .FALSE.
J=1
5 IF (J .LT. COUNT .AND. .NOT. DONE) THEN
IF (X (J) .LT. OLD) THEN
J=J+1
ELSE
DONE = .TRUE.
END IF
GOTO 5
END IF
IF (J .GT. COUNT .OR. X (J) .GT. OLD) THEN
PRINT *, 'GIA TRI XOA KHONG CO TRONG DANH SACH'
ELSE
COUNT = COUNT - 1
DO K = J, COUNT
X (K) = X (K + 1)
END DO
END IF

225 226
RETURN
END

9.3. Nh÷ng chØ dÉn gì rèi khi sö dông c¸c thñ tôc

1) KiÓm tra xem c¸c biÕn, c¸c biÓu thøc trong danh s¸ch ®èi sè ë lÖnh CALL cã phï hîp vÒ kiÓu vµ thø tù nh­ trong lÖnh khai b¸o thñ tôc kh«ng.
2) Nªn khai b¸o t­êng minh tÊt c¶ c¸c biÕn trong thñ tôc ®Ó tr¸nh ®Þnh kiÓu ngÇm ®Þnh sai.
3) Sö dông lÖnh PRINT trong thñ tôc ®Ó ®Þnh vÞ lçi.
4) KiÓm tra thö tõng thñ tôc tr­íc khi gép chóng vµo ch­¬ng tr×nh chÝnh cïng víi nh÷ng ch­¬ng tr×nh con kh¸c.
5) KiÓm tra tõng thñ tôc víi mét sè tËp d÷ liÖu ®Ó ph¸t hiÖn nh÷ng ®iÒu kiÖn ®Æc biÖt g©y lçi.
6) Phong c¸ch lËp tr×nh:
- Khi quyÕt ®Þnh sö dông ch­¬ng tr×nh con thñ tôc h·y chän tªn thñ tôc sao cho nã cã tÝnh gîi nhí.
- H·y sö dông tªn c¸c biÕn trong danh s¸ch ®èi sè cña thñ tôc cïng tªn víi c¸c biÕn lµ ®èi sè thùc tÕ trong ch­¬ng tr×nh chÝnh. Trong tr­êng hîp thñ tôc ®­îc gäi
nhiÒu lÇn víi nh÷ng ®èi sè thùc tÕ kh¸c nhau, h·y chän tªn trong danh s¸ch ®èi sè kh¸c biÖt ®Ó tr¸nh nhÇm víi c¸c biÕn trong ch­¬ng tr×nh chÝnh.
- Trong danh s¸ch ®èi sè, nªn liÖt kª riªng c¸c ®èi sè ®Çu vµo tr­íc, sau ®ã míi ®Õn c¸c ®èi sè ®Çu ra.

Bµi tËp
1. Gi¶ sö cã m¶ng mét chiÒu X víi 100 gi¸ trÞ thùc. H·y viÕt mét thñ tôc t¹o ra m¶ng Y theo c¸ch mçi phÇn tö cña m¶ng Y b»ng phÇn tö t­¬ng øng cña m¶ng X trõ
®i phÇn tö nhá nhÊt.
2. ViÕt mét thñ tôc nhËn mét m¶ng gi¸ trÞ thùc X víi 50 hµng vµ 2 cét vµ tr¶ l¹i chÝnh m¶ng ®ã nh­ng d÷ liÖu ®­îc s¾p xÕp l¹i theo chiÒu t¨ng dÇn cña cét thø 2.
3. ViÕt mét thñ tôc nhËn mét m¶ng gi¸ trÞ thùc X víi n dßng m cét vµ tr¶ vÒ mét m¶ng Y cïng sè dßng, sè cét nh­ng d÷ liÖu ®­îc biÕn ®æi sao cho c¸c phÇn tö
t­¬ng øng cña cét thø nhÊt vµ cét thø J ®­îc ®æi chç cho nhau.
4. Gi¶ sö cho tr­íc hai ma trËn A ( n dßng, m cét) vµ ma trËn B ( m dßng, l cét). TÝch AB sÏ lµ ma trËn C ( n dßng, l cét) víi c¸c phÇn tö ®­îc tÝnh theo c«ng
thøc
m
ci , j = ∑ a i , k bk , j (i = 1, ..., n; j = 1, ..., l ) .
k =1

ViÕt thñ tôc TICHMT (A, B, N, M, L, C) víi c¸c ®èi sè ®Çu vµo lµ ma trËn A , ma trËn B , c¸c tham sè N, M, L vµ ®èi sè ®Çu ra lµ ma trËn C .
5. HÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh n Èn

227 228
a11 x1 + a12 x 2 + ... + a1n x n = b1 
+ + + = 
a 21 x1 a 22 x 2 ... a 2n x n b2 

... ... ... ... ... 
a n1 x1 + a n 2 x2 + ... + a nn x n = bn 

®­îc viÕt d­íi d¹ng ma trËn nh­ sau


Ax=b
trong ®ã
 a11 a12 ... a1n   b1   x1 
     
 b2  x =  x 2 
A = (a ij ) = 
 a 21 a 22 ... a 2n 
b =  ...  .
... ... ... ...  ; ... 
;
     
 ... a nn   b   x 
 a n1 an 2  n   n 
H·y viÕt thñ tôc GAUSS (A, B, N, X) nhËn vµo c¸c m¶ng A, B, sè Èn N cña hÖ vµ tÝnh ra m¶ng X theo ph­¬ng ph¸p lo¹i biÕn cña Gauss. Xem gi¶i thÝch vÒ ph­¬ng
ph¸p Gauss trong phô lôc 2.

Ch­¬ng 10
KiÓu d÷ liÖu v¨n b¶n

Ngoµi nh÷ng d÷ liÖu sè nh­ c¸c sè nguyªn, sè thùc, m¸y tÝnh cßn cã thÓ l­u gi÷ vµ xö lý nh÷ng d÷ liÖu v¨n b¶n nh­ nh÷ng ch÷ c¸i, nh÷ng ®o¹n v¨n b¶n, nh÷ng ch÷
sè vµ mét sè ký hiÖu kh¸c. Trong Fortran gäi chung nh÷ng dò liÖu nµy lµ d÷ liÖu ký tù. Trong bµi nµy chóng ta xÐt thªm nh÷ng ®Æc ®iÓm khai b¸o nh÷ng d÷ liÖu ký tù,
mét sè thao t¸c víi nh÷ng d÷ liÖu ký tù vµ øng dông cña chóng trong xö lý th«ng tin.

10.1. TËp c¸c ký tù cña Fortran

229 230
TËp ký tù cña Fortran gåm 26 ch÷ c¸i tiÕng Anh, m­êi ch÷ sè tõ 0 ®Õn 9, dÊu trèng vµ 12 ký hiÖu sau ®©y:
+ − * / = ( ) , . ' $ :
Ngoµi ra cßn mét sè ký tù kh¸c tïy thuéc vµo nh÷ng hÖ m¸y tÝnh kh¸c nhau.
C¸c h»ng ký tù bao giê còng n»m trong cÆp dÊu nh¸y trªn. Trong h»ng ký tù dÊu nh¸y trªn ' ®­îc biÓu thÞ b»ng hai dÊu nh¸y trªn '' (kh«ng ph¶i dÊu ngoÆc kÐp). ThÝ
dô ch÷ LET'S cña tiÕng Anh sÏ ®­îc viÕt lµ 'LET''S'.
Th«ng th­êng ng­êi ta xö lý trong m¸y tÝnh nh÷ng tõ, nh÷ng dßng ch÷ gåm mét sè ký tù ghÐp l¹i víi nhau. Trong tr­êng hîp ®ã ng­êi ta gäi lµ x©u ký tù. §é dµi
cña x©u ký tù lµ sè ký tù ®­îc ghÐp l¹i trong x©u ký tù ®ã. Mét ký tù còng cã thÓ coi lµ mét x©u ký tù víi ®é dµi b»ng 1. Do ®ã, ta gäi chung d÷ liÖu x©u ký tù lµ d÷ liÖu
ký tù hay d÷ liÖu v¨n b¶n. D­íi ®©y lµ thÝ dô vÒ c¸c h»ng ký tù vµ ®é dµi t­¬ng øng cña chóng:
'CHU NHAT' 8 ký tù
'SENSOR 23' 9 ký tù
'08:40−13:25' 11 ký tù
'LE QUY DON' 10 ký tù
' ' 2 ký tù
'''''' 2 ký tù

10.2. C¸c d¹ng khai b¸o biÕn ký tù

♦ BiÕn ký tù ®­îc khai b¸o b»ng lÖnh m« t¶ d¹ng tæng qu¸t nh­ sau:

CHARACTER * n Danh s¸ch biÕn


trong ®ã n chØ sè ký tù (®é dµi) trong mçi x©u ký tù. ThÝ dô lÖnh

CHARACTER * 8 TEN, NGAY


chØ r»ng TEN vµ NGAY lµ nh÷ng biÕn chøa 8 ký tù mçi biÕn.
♦ LÖnh CHARACTER biÕn thÓ sau ®©y cho phÐp ta khai b¸o nh÷ng biÕn ký tù víi ®é dµi kh¸c nhau trªn cïng mét dßng lÖnh
CHARACTER TITLE * 10, NUOC * 2
♦ Mét m¶ng chøa mét sè phÇn tö, mçi phÇn tö cã gi¸ trÞ lµ mét x©u ký tù ®­îc khai b¸o b»ng mét trong hai c¸ch t­¬ng ®­¬ng nh­ sau:

231 232
CHARACTER * 4 NAME (50)
CHARACTER NAME (50) * 4
♦ C¸c x©u ký tù còng cã thÓ ®­îc dïng trong c¸c ch­¬ng tr×nh con. X©u ký tù ph¶i ®­îc khai b¸o b»ng lÖnh CHARACTER trong c¶ ch­¬ng tr×nh chÝnh vµ ch­¬ng
tr×nh con. Còng nh­ c¸c m¶ng d÷ liÖu sè nguyªn, sè thùc, trong ch­¬ng tr×nh con cã thÓ khai b¸o biÕn ký tù mµ kh«ng cÇn chØ ®Þnh râ ®é dµi x©u vµ kÝch th­íc m¶ng. ThÝ
dô:
CHARACTER * (*) BCC
CHARACTER * (*) NAME (N)

10.3. NhËp, xuÊt d÷ liÖu ký tù

Khi x©u ký tù ®­îc dïng trong lÖnh xuÊt toµn bé x©u ®­îc in ra. Nh÷ng dÊu trèng ®­îc tù ®éng chÌn vµo x©u ®Ó t¸ch riªng x©u ký tù víi nh÷ng môc in kh¸c cïng
dßng. Trong lÖnh nhËp, gi¸ trÞ cña biÕn ký tù ph¶i ®­îc bao trong cÆp dÊu nh¸y trªn. NÕu sè ký tù trong cÆp dÊu nh¸y nhiÒu h¬n so víi ®é dµi ®· m« t¶ cña biÕn ký tù, th×
nh÷ng ký tù thõa ë bªn ph¶i sÏ bÞ bá qua (bÞ c¾t bá); nÕu sè ký tù Ýt h¬n − nh÷ng vÞ trÝ thõa ë bªn ph¶i ®­îc tù ®éng ®iÒn b»ng c¸c dÊu trèng. §Ó in x©u ký tù trong lÖnh
xuÊt cã ®Þnh d¹ng, cã thÓ dïng ®Æc t¶ A (chó ý, cã thÓ kh«ng cÇn chØ râ sè vÞ trÝ dµnh cho môc in). ThÝ dô: víi ®o¹n ch­¬ng tr×nh:
CHARACTER * 20 THU
PRINT *, ' HAY NHAP MOT NGAY TRONG TUAN'
READ *, THU
PRINT 5, THU
5 FORMAT (1X, 'NGAY VUA NHAP LA ', A)
END
th× t­¬ng t¸c trªn mµn h×nh sÏ nh­ sau:

HAY NHAP MOT NGAY TRONG TUAN


'CHU NHAT' ↵
NGAY VUA NHAP LA CHU NHAT

ThÊy r»ng sè ký tù gâ vµo biÕn THU chØ b»ng 8, kh«ng dµi tíi 20 nh­ ®· khai b¸o. Nh­ng khi in ra mµn h×nh ta kh«ng thÊy râ nh÷ng dÊu trèng ®­îc tù ®éng ®iÒn

233 234
vµo phÝa bªn ph¶i. NÕu lÖnh FORMAT cña lÖnh in cã d¹ng
FORMAT (1X, A, ' LA NGAY VUA NHAP')

th× trªn mµn h×nh sÏ thÊy râ nh÷ng dÊu trèng nh­ sau:

HAY NHAP MOT NGAY TRONG TUAN


'CHU NHAT'
CHU NHAT LA NGAY VUA NHAP

10.4. Nh÷ng thao t¸c víi d÷ liÖu ký tù

10.4.1. G¸n c¸c gi¸ trÞ ký tù


Nh÷ng gi¸ trÞ ký tù cã thÓ ®­îc g¸n cho c¸c biÕn ký tù b»ng lÖnh g¸n vµ mét h»ng ký tù. NÕu h»ng cã ®é dµi nhá h¬n sè ký tù ®· khai b¸o cña biÕn, th× c¸c dÊu trèng
sÏ tù ®éng ®­îc ®iÒn vµo bªn ph¶i; nÕu h»ng cã ®é dµi lín h¬n - c¸c ký tù thõa sÏ bÞ bá qua. ThÝ dô:
CHARACTER * 4 MONHOC (3)
MONHOC (1) = 'TOAN'
MONHOC (2) = 'LY'
MONHOC (3) = 'HOA HOC'

Trong nh÷ng lÖnh trªn ®©y ta khai b¸o m¶ng MONHOC gåm 3 phÇn tö, mçi phÇn tö lµ mét x©u dµi 4 ký tù. VËy trong MONHOC (1) sÏ l­u 'TOAN', trong
MONHOC (2) sÏ l­u 'LYbb', trong MONHOC (3) sÏ l­u 'HOAb' (ch÷ b chØ dÊu trèng). Qua thÝ dô nµy ta thÊy tÇm quan träng cña viÖc sö dông c¸c x©u cã cïng ®é dµi
m« t¶ cña biÕn; nÕu kh«ng c¸c lÖnh sÏ xö lý sai.
Mét biÕn ký tù còng cã thÓ ®­îc g¸n gi¸ trÞ cña biÕn ký tù kh¸c b»ng lÖnh g¸n, thÝ dô
CHARACTER * 4 LOAI1, LOAI2
LOAI1 = 'GIOI'
LOAI2 = LOAI1

235 236
Sau lÖnh g¸n nµy, c¶ hai biÕn LOAI1 vµ LOAI2 ®Òu l­u x©u ký tù 'GIOI'.
LÖnh DATA còng cã thÓ dïng ®Ó khëi x­íng gi¸ trÞ cña c¸c biÕn ký tù. ThÝ dô sau g¸n 12 tªn th¸ng tiÕng Anh vµo m¶ng THANG:
CHARACTER * 3 THANG (12)
DATA THANG / 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
* 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec' /

10.4.2. So s¸nh c¸c gi¸ trÞ ký tù


BiÓu thøc l«gic trong lÖnh IF l«gic còng cã thÓ lµ mét phÐp so s¸nh c¸c biÕn, h»ng ký tù. ThÝ dô, nÕu c¸c biÕn THANG, CH, TG lµ nh÷ng biÕn ký tù, c¸c lÖnh sau
®©y lµ nh÷ng lÖnh ®óng:
IF (THANG .EQ. 'FEB') NGAY = 28
IF (CH (I) .GT. CH (I+1)) THEN
TG = CH (I)
CH (I) = CH (I+1)
CH (I+1) = TG
END IF

Khi ®¸nh gi¸ mét biÓu thøc l«gic víi c¸c x©u ký tù, tr­íc hÕt ch­¬ng tr×nh xÐt ®é dµi cña hai x©u. NÕu mét x©u ng¾n h¬n x©u kh¸c, th× x©u ng¾n h¬n ®­îc bæ sung
thªm c¸c dÊu trèng ë bªn ph¶i sao cho hai x©u trë thµnh cã cïng ®é dµi. ViÖc so s¸nh hai x©u ký tù cïng ®é dµi thùc hiÖn tõ tr¸i sang ph¶i theo tõng ký tù mét. Hai x©u
b»ng nhau nÕu chóng cã cïng nh÷ng ký tù trong cïng mét thø tù. C¸c ký tù ®­îc so s¸nh víi nhau theo chuçi thø tù so s¸nh (collating sequence). Chuçi nµy liÖt kª c¸c ký
tù tõ thÊp ®Õn cao. ThÝ dô, mét phÇn cña chuçi thø tù so s¸nh ®èi víi c¸c ký tù ASCII liÖt kª c¸c ký tù d­íi ®©y:
Chuçi thø tù so s¸nh cña c¸c ký tù:
______________________________________
b''#$%&()*+,-./
0123456789
:;=?@
ABCDEFGHIJKLMNOPQRSTUVWXYZ
______________________________________
Theo chuçi nµy, nh÷ng so s¸nh sau lµ ®óng:
'A1' < 'A2'

237 238
'JOHN' < 'JOHNSTON'
'175' < '176'
'THREE' < 'TWO'
'$' < 'DOLLAR'

NÕu c¸c x©u ký tù chØ chøa c¸c ch÷ c¸i, th× thø tù tõ thÊp ®Õn cao lµ thø tù alphabª, ®­îc gäi lµ thø tù tõ vùng (lexicographic ordering).

10.4.3. TrÝch ra x©u con

X©u con lµ mét phÇn ®­îc trÝch ra tõ x©u xuÊt ph¸t vµ gi÷ nguyªn thø tù ban ®Çu. Trong Fortran x©u con ®­îc viÕt b»ng tªn cña x©u xuÊt ph¸t, kÌm theo hai biÓu
thøc nguyªn n»m trong cÆp dÊu ngoÆc ®¬n, c¸ch nhau bëi dÊu hai chÊm. BiÓu thøc thø nhÊt chØ vÞ trÝ ®Çu tiªn ë x©u xuÊt ph¸t mµ tõ ®ã x©u con ®­îc trÝch ra. BiÓu thøc
thø hai chØ vÞ trÝ cuèi cïng. ThÝ dô, nÕu x©u 'FORTRAN' ®­îc l­u trong biÕn LANG, ta cã thÓ cã nh÷ng x©u con nh­ sau
BiÕn X©u con

LANG (1 : 1) 'F'
LANG (1 : 7) 'FORTRAN'
LANG (2 : 3) 'OR'
LANG (7 : 7) 'N'
1) Ta cã thÓ kh«ng viÕt biÓu thøc thø nhÊt trong cÆp dÊu ngoÆc ®¬n nÕu gi¸ trÞ cña nã b»ng 1 vµ cã thÓ kh«ng viÕt biÓu thøc thø hai nÕu gi¸ trÞ cña nã b»ng ®é dµi cña
x©u xuÊt ph¸t. Ta còng cã thÓ kh«ng viÕt c¶ hai biÓu thøc. Nh­ng trong c¶ ba tr­êng hîp vÉn ph¶i cã dÊu hai chÊm (:) ë trong cÆp dÊu ngoÆc. ThÝ dô:
LANG (:4) lµ 'FORT'
LANG (5:) lµ 'RAN'
LANG (:) lµ 'FORTRAN'
2) Khi phÐp trÝch ra x©u con sö dông cïng mét tªn biÕn, c¸c biÓu thøc trong cÆp dÊu ngoÆc ®¬n kh«ng ®­îc phñ lªn nhau. ThÝ dô, nÕu biÕn LANG chøa x©u
'FORMATS', th× lÖnh
LANG (7: 7) = LANG (6: 6)
sÏ biÕn gi¸ trÞ cña LANG thµnh 'FORMATT'. Nh­ng lÖnh sau ®©y sÏ sai kh«ng thÓ thùc hiÖn ®­îc
LANG (3: 5) = LANG (2: 4)
3) Nh÷ng tr­êng hîp nh­: c¸c vÞ trÝ ®Çu hoÆc cuèi kh«ng ph¶i lµ sè nguyªn, lµ sè ©m, vÞ trÝ ®Çu lín h¬n vÞ trÝ cuèi, vÞ trÝ ®Çu hoÆc vÞ trÝ cuèi cã gi¸ trÞ lín h¬n ®é dµi
m« t¶ cña x©u con, viÖc trÝch ra x©u con sÏ kh«ng thÓ thùc hiÖn ®óng ®¾n.
ThÝ dô 32: §Õm sè ký tù trong mét v¨n b¶n. Gi¶ sö mét bøc ®iÖn dµi 50 ký tù. H·y ®Õm sè tõ trong bøc ®iÖn ®ã. Ta biÕt r»ng trong mét v¨n b¶n so¹n ®óng th× c¸c tõ
c¸ch nhau b»ng mét dÊu trèng, do ®ã ta chØ cÇn ®Õm sè dÊu trèng trong v¨n b¶n vµ sè tõ sÏ b»ng sè dÊu trèng céng thªm mét. Víi tr­êng hîp nµy ch­¬ng tr×nh sau sÏ

239 240
®Õm ®­îc ®óng sè tõ:

CHARACTER * 50 MESSGE
INTEGER COUNT, I
COUNT = 0
DO 10 I = 1, 50
IF (MESSGE (I: I) .EQ. ' ') COUNT = COUNT + 1
10 CONTINUE
PRINT 5, COUNT + 1
5 FORMAT (1X, 'BUC DIEN GOM ', I2, ' TU')
END

10.4.4. KÕt hîp c¸c x©u ký tù


KÕt hîp hay céng lµ thao t¸c ghÐp hai hoÆc mét sè x©u ký tù vµo thµnh mét x©u ký tù. Thao t¸c nµy thùc hiÖn bëi hai dÊu g¹ch chÐo //. ThÝ dô muèn cã tõ WORKED
ta cã thÓ dïng phÐp kÕt hîp
'WORK' // 'ED'
Nhãm lÖnh sau ®©y cho phÐp viÕt ra ngµy th¸ng theo quy c¸ch tiÕng ViÖt, tøc thªm c¸c g¹ch chÐo ng¨n c¸ch gi÷a c¸c ký hiÖu ngµy, th¸ng vµ n¨m:

CHARACTER DAY*2,MONTH*2,YEAR*4,DATE*10
READ *, DAY, MONTH, YEAR
DATE = DAY//'/'//MONTH//'/'//YEAR
PRINT *, DATE
END
Theo nhãm lÖnh nµy, nÕu khi thùc hiÖn lÖnh READ ta gâ tõ bµn phÝm '05' '10' '1999' ↵ th× trªn mµn h×nh sÏ in ra:
05/10/1999.

10.4.5. Nh÷ng hµm chuÈn xö lý x©u ký tù


• Hµm INDEX
Hµm nµy cã hai ®èi sè kiÓu x©u ký tù, ®­a ra mét sè nguyªn chØ vÞ trÝ cña x©u thø hai trong x©u thø nhÊt. ThÝ dô nÕu ta cã biÕn STR chøa mÖnh ®Ò 'TO BE OR NOT

241 242
TO BE' vµ dïng lÖnh
K = INDEX (STR, 'BE')
th× biÕn K sÏ cã gi¸ trÞ 4 v× x©u 'BE' xuÊt hiÖn lÇn ®Çu tiªn trong x©u STR ë vÞ trÝ thø 4.
• Hµm LEN
Hµm LEN cã mét ®èi sè kiÓu x©u ký tù, nã ®­a ra mét sè nguyªn chØ ®é dµi cña x©u ®ã. Hµm nµy rÊt cã Ých trong nh÷ng ch­¬ng tr×nh con chÊp nhËn c¸c x©u ký tù
®é dµi bÊt kú nh­ng cÇn biÕt ®é dµi thùc tÕ ë trong ch­¬ng tr×nh con.
ThÝ dô 33: CÊu t¹o tªn viÕt t¾t cña ng ­êi. ViÕt ch­¬ng tr×nh ®äc tõ bµn phÝm hä tªn ®Çy ®ñ (gåm hä, ch÷ ®Öm vµ tªn) cña mét ng­êi vµ in lªn mµn h×nh d¹ng viÕt t¾t.
(ThÝ dô, nÕu nhËp vµo hä tªn ®Çy ®ñ nh­ sau:
TRAN CONG MINH,
th× d¹ng in ra sÏ lµ
T. C. MINH.
Ch­¬ng tr×nh NAMEED d­íi ®©y cho phÐp ta gâ tõ bµn phÝm mét x©u ký tù gåm c¶ hä, ch÷ ®Öm vµ tªn trªn cïng mét dßng nh­ng c¸ch nhau bëi mét dÊu trèng.
Thñ tôc con EXTR cho phÐp t¸ch riªng phÇn hä, ch÷ ®Öm vµ tªn dùa vµo vÞ trÝ c¸c dÊu trèng trong hä tªn ®Çy ®ñ. Sau ®ã thñ tôc EDIT ghÐp c¸c ch÷ c¸i ®Çu tiªn cña phÇn
hä, ch÷ ®Öm kÌm theo c¸c dÊu chÊm vµ dÊu trèng víi tªn ®Ó cÊu t¹o thµnh tªn viÕt t¾t.

PROGRAM NAMEED
CHARACTER HO *10, DEM *10, TEN *20, HOTEN *25
PRINT *, 'Nhap ho, chu dem, ten cach nhau 1 dau trong'
READ 5, HOTEN
5 FORMAT (A)
CALL EXTR (HOTEN, HO, DEM, TEN)
CALL EDIT (HO, DEM, TEN, HOTEN)
PRINT *, HOTEN
END

SUBROUTINE EXTR (XHOTEN, XHO, XDEM, XTEN)


CHARACTER * (*) XHO, XTEN, XDEM, XHOTEN
INTEGER B1, B2
B1 = INDEX (XHOTEN, ' ')
B2 = B1 + INDEX (XHOTEN (B1 + 1:) , ' ')

243 244
XHO = XHOTEN (:B1-1)
XDEM = XHOTEN (B1+1: B2-1)
XTEN = XHOTEN (B2+1:)
RETURN
END

SUBROUTINE EDIT (XHO, XDEM, XTEN, XHOTEN)


INTEGER L
CHARACTER *(*) XHO, XTEN, XDEM, XHOTEN
XHOTEN = XHO(1: 1) // '.'
L = INDEX (XHOTEN, ' ') + 1
XHOTEN (L: L + 2) = XDEM (1: 1) // '. '
XHOTEN (L + 3:) = XTEN
RETURN
END

• C¸c hµm CHAR vµ ICHAR


C¸c hµm nµy thao t¸c víi c¸c ký tù trong chuçi thø tù so s¸nh dïng trong m¸y tÝnh. NÕu mét m¸y tÝnh cã 256 ký tù trong chuçi thø tù so s¸nh cña nã, th× c¸c ký tù
nµy ®­îc ®¸nh sè tõ 0 ®Õn 255. Hµm CHAR nhËn mét ®èi sè nguyªn vµ ®­a ra mét ký tù trong chuçi thø tù so s¸nh ë vÞ trÝ øng víi sè nguyªn ®ã. Hµm ICHAR lµ hµm
ng­îc cña hµm CHAR. Nã nhËn ®èi sè lµ biÕn mét ký tù vµ tr¶ vÒ mét sè nguyªn øng víi vÞ trÝ cña ký tù ®ã ë trong chuçi thø tù so s¸nh.
V× c¸c m¸y tÝnh kh¸c nhau cã c¸c chuçi thø tù so s¸nh kh¸c nhau, nªn c¸c hµm nµy cã thÓ dïng ®Ó x¸c ®Þnh vÞ trÝ cña nh÷ng ký tù trong chuçi thø tù so s¸nh.
ThÝ dô, nÕu b¹n muèn in ra mµn h×nh tÊt c¶ c¸c ký tù trong chuçi thø tù so s¸nh ®­îc dïng trong m¸y tÝnh cña m×nh tõ vÞ trÝ 0 ®Õn 255 cã thÓ dïng ch­¬ng tr×nh sau:

PROGRAM CSCHAR
DO I = 0, 255
PRINT *, I, ' ', CHAR (I)
END DO
END
Ch­¬ng tr×nh sau ®©y cho phÐp in ra mµn h×nh vÞ trÝ cña c¸c ch÷ c¸i in hoa tiÕng Anh, nh÷ng ch÷ c¸i th­êng vµ nh÷ng ch÷ sè tõ 0 ®Õn 9 trong chuçi thø tù so s¸nh
trong m¸y tÝnh b¹n ®ang dïng:

PROGRAM COLSEQ

245 246
CHARACTER *70 SET
SET (1: 26) = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
SET (27: 52) = 'abcdefghijklmnopqrstuvwxyz'
SET (53: 62) = '0123456789'
DO I = 1, 62
PRINT *, SET (I : I), ICHAR (SET (I : I))
END DO
END

Víi c¸c m¸y tÝnh th«ng dông ngµy nay, nÕu ch¹y ch­¬ng tr×nh nµy, ta sÏ thÊy tËp c¸c ch÷ sè tõ ‘0’ ®Õn ‘9’ tuÇn tù cã vÞ trÝ tõ 48 ®Õn 57, tËp c¸c ch÷ c¸i hoa tiÕng
Anh tõ ‘A’ ®Õn ‘Z’ cã vÞ trÝ tõ 65 ®Õn 90 vµ tËp c¸c ch÷ c¸i th­êng tiÕng Anh tõ ‘a’ ®Õn ‘z’ cã vÞ trÝ tõ 97 ®Õn 122 trong chuçi thø tù so s¸nh. C¸c vÞ trÝ cßn l¹i trong chuçi
thø tù so s¸nh sÏ øng víi nh÷ng ký tù kh¸c, trong ®ã cã nh÷ng ký tù chuyªn dïng ®Ó biÓu diÔn c¸c ch÷ c¸i Hy L¹p, c¸c ký tù dïng ®Ó kÎ biÓu b¶ng... Ta cã thÓ khai th¸c
nh÷ng chi tiÕt nµy ®Ó viÕt nh÷ng thñ tôc rÊt cã Ých nh­ in biÓu b¶ng kh¸ ®Ñp khi xuÊt d÷ liÖu lªn mµn h×nh, tù ®éng t¹o c¸c tªn file trong ch­¬ng tr×nh... khi cÇn thiÕt.

• C¸c hµm LGE, LGT, LLE, LLT

Nh÷ng hµm nµy cho phÐp ta so s¸nh nh÷ng x©u v¨n b¶n dùa trªn chuçi thø tù so s¸nh ASCII. Nh÷ng hµm nµy sÏ cã Ých nÕu mét ch­¬ng tr×nh cã so s¸nh c¸c x©u hay
s¾p xÕp ký tù vµ ®­îc dïng trong c¸c m¸y tÝnh kh¸c nhau. Nh÷ng hµm nµy tr¶ vÒ mét gi¸ trÞ l«gic - TRUE hoÆc FALSE tuú thuéc kÕt qu¶ so s¸nh hai ®èi sè kiÓu x©u ký
tù. ThÝ dô, nÕu ta cã hai biÕn ký tù XAU1, XAU2 th× LGE (XAU1, XAU2) sÏ cho gi¸ trÞ TRUE nÕu XAU1 lín h¬n hoÆc b»ng XAU2 vÒ ph­¬ng diÖn tõ vùng. C¸c hµm
LGT, LLE vµ LLT thùc hiÖn c¸c phÐp so s¸nh “lín h¬n vÒ tõ vùng”, “nhá h¬n hoÆc b»ng vÒ tõ vùng” vµ “nhá h¬n vÒ tõ vùng”. Nhí r»ng c¸c hµm nµy dùa trªn chuçi thø
tù so s¸nh ASCII chø kh«ng ph¶i chuçi thø tù so s¸nh cña m¸y tÝnh.
Trong Fortran 90 cßn cã c¸c hµm ADJUSTL, ADJUSTR dïng ®Ó dån mét x©u ký tù vÒ tr¸i hoÆc vÒ ph¶i b»ng c¸ch c¾t bá nh÷ng dÊu trèng ë phÝa tr¸i hoÆc ë phÝa
ph¶i cña x©u ®ã. Hµm TRIM c¾t bá nh÷ng dÊu trèng ë ®u«i mét x©u v¨n b¶n vµ gi¶m ®é dµi x©u cho t­¬ng xøng *.

ThÝ dô 34: S¾p xÕp danh s¸ch theo thø tù alphabª. ViÕt ch­¬ng tr×nh ®äc tõ bµn phÝm tªn vµ sè ®iÖn tho¹i cña 20 ng­êi. In lªn mµn h×nh danh s¸ch s¾p xÕp thø tù
alphabª theo tªn ng­êi. Trong thÝ dô nµy ta sö dông c¸c hµm so s¸nh ®èi víi b¶ng thø tù so s¸nh ASCII.

PROGRAM NMSORT
CHARACTER *8 TEN(20), TEL (20), TEMP

*
H×nh nh­ trong thùc tÕ hµm nµy vµ c¶ hµm LEN n÷a kh«ng lµm viÖc ®óng nh­ ng­êi ta m« t¶ nã trong tµi liÖu, ®é dµi x©u v¨n b¶n nhËn ®­îc vÉn chØ lµ ®é dµi m« t¶ chø kh«ng
ph¶i ®é dµi thùc tÕ.
247 248
DO I = 1, 20
PRINT *, 'NHAP TEN NGUOI THU ', I
READ 5, TEN(I)
PRINT *, 'SO DIEN THOAI'
READ 5, TEL (I)
ENDDO
5 FORMAT (A)
DO I = 1, 19
K=I
DO J = I+1, 20
IF (LGT (TEN (K), TEN (J))) K = J
END DO
TEMP = TEN (K)
TEN (K) = TEN (I)
TEN (I) = TEMP
TEMP = TEL (K)
TEL (K) = TEL (I)
TEL (I) = TEMP
PRINT *, TEN (I), TEL (I)
END DO
PRINT *, TEN (20), TEL (20)
END

ThÝ dô 35: M· ho¸ bøc ®iÖn. M· hãa bøc ®iÖn lµ lµm cho dßng v¨n b¶n b×nh th­êng cña bøc ®iÖn cã mét d¹ng kh¸c th­êng chØ cã ng­êi m· hãa míi hiÓu ®­îc néi
dung cña nã. Ng­êi ta cã thÓ m· ho¸ mét bøc ®iÖn theo c¸ch sau: LÊy mét x©u gåm 62 ch÷ c¸i vµ ch÷ sè lµm kho¸. Tõng ch÷ c¸i b×nh th­êng trong bøc ®iÖn ®­îc m· ho¸
b»ng mét ch÷ c¸i trong kho¸ sao cho ch÷ A b×nh th­êng ®­îc thay b»ng ch÷ c¸i ®Çu tiªn trong kho¸, ch÷ B ®­îc thay b»ng ch÷ c¸i thø hai... D­íi ®©y lµ mét ch­¬ng tr×nh
nhËn tõ bµn phÝm mét bøc ®iÖn vµ in ra mµn h×nh d¹ng m· ho¸ cña bøc ®iÖn ®ã. Trong ch­¬ng tr×nh nµy ta dïng mét kho¸ lµ chuçi c¸c ch÷ c¸i vµ ch÷ sè s¾p xÕp theo thø
tù kh¸c th­êng nh­ sau:
YXAZKLMBJOCFDVSWTREGHNIPUQ
yxazklmbjocfdvswtreghnipuq9087564312
ViÖc m· ho¸ c¸c ch÷ c¸i trong bøc ®iÖn ®­îc thùc hiÖn trong thñ tôc con ENCODE.

249 250
PROGRAM MSGCOD
CHARACTER DIEN*255, MADIEN*255,
CHARACTER KHOA*62, ALPH*62
ALPH = ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ’ //
* ‘abcdefghijklmnopqrstuvwxyz0123456789'
KHOA = 'YXAZKLMBJOCFDVSWTREGHNIPUQ’ //
* ‘yxazklmbjocfdvswtreghnipuq9087564312'
PRINT*, 'ENTER A MESSEAGE’,
* ‘(MAXIMUM 255 LETTERS)'
READ (5, '(A255)') DIEN
CALL ENCODE (KHOA, ALPH, DIEN, MADIEN)
PRINT 5, MADIEN
5 FORMAT (1X, /, 1X, 'THIS IS ENCODED AS' /, 1X, A /)
END
SUBROUTINE ENCODE (KEY, ALP, MESSGE, SECRET)
CHARACTER MESSGE * (*), SECRET * (*)
CHARACTER ALP * (*), KEY * (*), LETTER
DO I = 1, LEN (MESSGE)
LETTER = MESSGE (I : I)
J = INDEX (ALP, LETTER)
IF (J .EQ. 0) THEN
SECRET (I : I) = LETTER
ELSE
SECRET (I : I) = KEY (J : J)
END IF
END DO
RETURN
END

Bµi tËp

1. C¸c biÕn K vµ J sÏ cã gi¸ trÞ b»ng bao nhiªu sau khi thùc hiÖn nhãm lÖnh sau ®©y:

251 252
CHARACTER *18 STRG
INTEGER K, J
STR = 'TO BE OR NOT TO BE'
K = INDEX (STRG, 'BE')
J = INDEX (STR (K + 1:), 'BE') + K

2. Gi¶ sö c¸c bøc ®iÖn ®­îc m· ho¸ b»ng mét kho¸ nh­ trong thÝ dô 31, tøc dïng chuçi c¸c ch÷ c¸i vµ ch÷ sè:
YXAZKLMBJOCFDVSWTREGHNIPUQ
yxazklmbjocfdvswtreghnipuq9087564312
Ng­êi ta gi¶i m· nh­ sau: Tõng ch÷ c¸i trong m· ®iÖn sÏ ®­îc thay thÕ bëi mét ch÷ c¸i trong b¶ng ch÷ c¸i alphabª theo quy t¾c: nÕu ch÷ c¸i trong m· ®iÖn trïng víi
ch÷ c¸i thø nhÊt trong kho¸ th× ch÷ c¸i ®ã thay b»ng ch÷ A trong b¶ng ch÷ c¸i alphabª, nÕu trïng víi ch÷ c¸i thø hai th× thay nã b»ng ch÷ B... ThÝ dô, gi¶ sö m· ®iÖn lµ
dßng ch÷
DKKG YG YJRWSRG EYGHRZYU
th× theo quy t¾c trªn, ta cã bøc ®iÖn ®­îc gi¶i m· nh­ sau:
MEET AT AIRPORT SATURDAY

ViÕt ch­¬ng tr×nh cho phÐp ®äc tõ bµn phÝm mét bøc ®iÖn d­íi d¹ng m· ho¸ vµ in lªn mµn h×nh d¹ng ®· gi¶i m· cña nã.

3. Gi¶ sö danh môc sè ®iÖn tho¹i cña nh÷ng ng­êi quen cña b¹n l­u trong file TELNUM d­íi d¹ng nh÷ng dßng gåm tªn ng­êi ®Çy ®ñ vµ sè ®iÖn tho¹i cña mçi
ng­êi víi format A30, A8. File kh«ng cã dßng ®Çu b¸o th«ng tin vÒ sè dßng d÷ liÖu vµ còng kh«ng cã dßng ký hiÖu cuèi file b¸o hÕt d÷ liÖu. H·y viÕt ch­¬ng tr×nh ®äc
vµo tõ bµn phÝm mét tªn ng­êi nµo ®ã, sau ®ã kiÓm tra xem ng­êi ®ã cã trong danh môc ®iÖn tho¹i cña b¹n kh«ng. NÕu kh«ng cã th× ®­a ra th«ng b¸o 'KHONG CO
TRONG DANH MUC', nÕu cã th× in ra tªn ng­êi cïng víi sè ®iÖn tho¹i t×m ®­îc sao cho sè ®iÖn tho¹i ®­îc ®Æt trong cÆp dÊu ngoÆc ngay sau tªn.

4. File d÷ liÖu ADDR chøa kho¶ng 50 tªn ng­êi vµ ®Þa chØ. Dßng thø nhÊt cña mçi ng­êi chøa hä tªn ®Çy ®ñ (30 ký tù) gåm hä, ch÷ ®Öm vµ tªn. Dßng thø hai chøa
®Þa chØ sè nhµ vµ ®­êng phè (35 ký tù), tªn thµnh phè (15 ký tù) vµ sè ®iÖn tho¹i (15 ký tù). Mçi x©u ký tù ®­îc ghi trong cÆp dÊu nh¸y trªn. H·y viÕt ch­¬ng tr×nh ®äc d÷
liÖu vµ in ra th«ng tin vÒ tõng ng­êi theo mÉu nh·n sau ®©y (thÝ dô):

HUY, N. Q.
91 NGUYEN THIEN THUAT
NHA TRANG, (058)832536

253 254
Mçi nh·n c¸ch nhau bèn dßng. Chó ý sau tªn thµnh phè lµ dÊu ph¶y, kh«ng nªn ®Ó mét dÊu c¸ch nµo tr­íc dÊu ph¶y ®ã.

5. Gi¶ sö b¹n ®· biÕt r»ng ngµy ®Çu n¨m cña mét n¨m lµ ngµy thø mÊy trong tuÇn lÔ. H·y viÕt ch­¬ng tr×nh in tê lÞch th¸ng Giªng cña n¨m ®ã d­íi d¹ng dÔ nh×n.

6. Gi¶ sö b¹n ®· biÕt ngµy ®Çu n¨m cña mét n¨m nµo ®ã lµ thø mÊy trong tuÇn lÔ. H·y viÕt ch­¬ng tr×nh in tê lÞch cña mét th¸ng, n¨m bÊt kú trong t­¬ng lai d­íi
d¹ng dÔ nh×n. Th¸ng vµ n¨m nhËp tõ bµn phÝm.

7. ViÕt ch­¬ng tr×nh in b¶ng c¸c to¸n tö l«gic (b¶ng 4.2, ch­¬ng 4, trang 56).

8. ViÕt thñ tôc TDBANG (N, TENCOT) trong ®ã N lµ ®èi sè nguyªn, TENCOT lµ m¶ng mét chiÒu gåm N phÇn tö v¨n b¶n chuyªn dïng ®Ó in ra mét tiªu ®Ò cét cña
b¶ng. ThÝ dô nÕu ch­¬ng tr×nh gäi thñ tôc nµy vµ chuyÓn ®èi sè thùc tÕ b»ng 12 vµ mét m¶ng 12 tªn viÕt t¾t th¸ng tiÕng Anh ‘JAN’, ’FEB’, ‘MAR’, ‘APR’, ‘MAY’, ‘JUN’,
’JUL’, ‘AUG’, ‘SEP’, ‘OCT’, ‘NOV’, ‘DEC’ th× ch­¬ng tr×nh sÏ in ra tÝt ®Çu b¶ng cã d¹ng nh­ d­íi ®©y:
JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC

9. Sè liÖu gi¸ trÞ ngµy cña c¸c yÕu tè khÝ t­îng thñy v¨n t¹i tr¹m quan tr¾c ®­îc l­u trong file ASCII cã quy c¸ch ghi nh­ sau: Dßng trªn cïng ghi tªn tr¹m. Dßng thø
2 cã hai sè nguyªn viÕt c¸ch nhau lÇn l­ît chØ tæng sè ngµy quan tr¾c vµ sè yÕu tè ®­îc quan tr¾c. Dßng thø ba cã 6 sè nguyªn viÕt c¸ch nhau lÇn l­ît chØ ngµy, th¸ng,
n¨m ®Çu vµ ngµy, th¸ng, n¨m cuèi quan tr¾c. Dßng thø 4 lµ tiªu ®Ò cét liÖt kª tªn tÊt c¶ c¸c yÕu tè ®­îc quan tr¾c, mçi tªn ®­îc ghi víi ®é réng 8 vÞ trÝ vµ c¨n bªn ph¶i.
C¸c dßng tiÕp theo lÇn l­ît ghi gi¸ trÞ cña c¸c yÕu tè, mçi dßng mét ngµy. TÝnh gi¸ trÞ trung b×nh th¸ng cña tÊt c¶ c¸c yÕu tè trong tÊt c¶ c¸c n¨m quan tr¾c. KÕt qu¶ ghi
vµo nh÷ng file míi, mçi yÕu tè mét file, sao cho tªn file trïng víi tªn cña yÕu tè quan tr¾c.

255 256
Ch­¬ng 11
Nh÷ng ®Æc ®iÓm bæ sung vÒ file

11.1. C¸c file néi t¹i (Internal Files)

Khi mét ®¬n vÞ file trong c¸c lÖnh nhËp hoÆc xuÊt lµ tªn cña mét biÕn ký tù, th× lÖnh sÏ chuyÓn d÷ liÖu tõ mét vïng l­u gi÷ néi t¹i trong bé nhí sang mét vïng kh¸c.
Nh÷ng vïng l­u gi÷ nµy ®­îc gäi lµ c¸c file néi t¹i (internal file). ThÝ dô, ta cã thÓ ®äc d÷ liÖu tõ mét x©u ký tù thay v× ®äc tõ mét dßng d÷ liÖu trong file th«ng th­êng
víi nh÷ng lÖnh sau ®©y:
CHARACTER * 13 DATA1
INTEGER I, J
REAL X
DATA1 = '137 65 42.17'
READ (DATA1, *) I, J, X
Nh÷ng lÖnh trªn ®©y cã nghÜa r»ng chóng ta khai b¸o mét biÕn cã kiÓu v¨n b¶n DATA1 víi ®é dµi 13 ký tù. Sau ®ã g¸n cho biÕn nµy dßng v¨n b¶n:
‘137 65 42.17 ‘
§ã lµ viÖc b×nh th­êng, chóng ta ®· biÕt tõ tr­íc ®Õn nay. Nh­ng h·y chó ý ®Õn lÖnh cuèi cïng. §ã lµ lÖnh:
READ (DATA1, *) I, J, X
Tr«ng lÖnh nµy gièng nh­ mét lÖnh ®äc d÷ liÖu b×nh th­êng, chØ cã kh¸c lµ thay v× ®¬n vÞ file trong cÆp dÊu ngoÆc ®¬n ta ®· ®­a tªn biÕn DATA1 vµo ®ã. KÕt qu¶ lµ sau
lÖnh ®äc nµy c¸c ®o¹n v¨n b¶n biÓu diÔn nh÷ng ch÷ sè 137, 65 vµ 42.17 ®· ®­îc ®äc ra nh­ lµ nh÷ng sè nguyªn, sè thùc vµ g¸n vµo c¸c biÕn nguyªn I, J vµ biÕn thùc X
trong danh s¸ch c¸c biÕn cÇn ®äc cña lÖnh READ mét c¸ch ®óng ®¾n. Sau nh÷ng lÖnh nµy gi¸ trÞ c¸c biÕn sè sÏ nh­ sau:
I sÏ b»ng 137, J sÏ b»ng 65 vµ X b»ng 42.17.
§©y lµ mét ®Æc ®iÓm rÊt quan träng cña Fortran. Ta sÏ thÊy Ých lîi cña ®Æc ®iÓm nµy cña file néi t¹i qua thÝ dô sau:

INTEGER PTR
REAL AMOUNT
CHARACTER * 15 TEMP
...
...

257 258
READ (12, 5) TEMP
5 FORMAT (A10)
IF (INDEX (TEMP, '$') .NE. 0) THEN
PTR = INDEX (TEMP, '$')
TEMP (PTR: PTR) = ' '
END IF
READ (TEMP, *) AMOUNT

Víi ®o¹n ch­¬ng tr×nh nµy d÷ liÖu tõ trong ®¬n vÞ file (12) th«ng th­êng (file ngo¹i) ®­îc ®äc vµo biÕn ký tù TEMP. Trong tr­êng hîp d÷ liÖu cã kÌm theo dÊu $ ë
bªn tr¸i (c¸ch viÕt dÊu ®« la ®»ng tr­íc vµ dÝnh liÒn sè tiÒn cña nh÷ng ng­êi Mü th­êng lµm), th× lÖnh ®äc
READ (12,5) TEMP
vÉn kh«ng m¾c lçi vÒ kiÓu d÷ liÖu. Sau ®ã ta xö lý, thay ký tù $ b»ng ký tù dÊu trèng vµ ®äc lÊy gi¸ trÞ sè thùc AMOUNT b»ng lÖnh ®äc file néi t¹i
READ (TEMP, *) AMOUNT
NhËn thÊy r»ng lÖnh ®äc d÷ liÖu tõ file néi t¹i hoµn toµn t­¬ng tù lÖnh ®äc c¸c file th«ng th­êng. Thay v× sè hiÖu thiÕt bÞ hay sè hiÖu file, ta ghi tªn biÕn (ë ®©y lµ biÕn
TEMP) vµo vÞ trÝ cña thiÕt bÞ hay sè hiÖu file.
B©y giê ta xÐt mét thÝ dô vÒ sö dông file néi ®Ó chuyÓn ®æi d÷ liÖu sè thµnh d÷ liÖu v¨n b¶n. Gi¶ sö ta muèn t¹o ra 12 tªn file lÇn l­ît lµ ‘GIO.1’, ‘GIO.2’, ...,
‘GIO.12’. §o¹n ch­¬ng tr×nh sau ®©y cã thÓ lµm ®­îc viÖc ®ã:

INTEGER J
CHARACTER *6 TENF(12), TAM
DO J = 1, 12
IF (J .LT. 10) THEN
WRITE (TAM, ‘(I1)’) J
ELSE
WRITE (TAM, ‘(I2)’) J
END IF
TENF (J) = ‘GIO’ // ‘.’ // TAM
END DO

11.2. C¸c file truy nhËp tuÇn tù (Sequential Files)


259 260
C¸c file ®­îc sö dông trong tÊt c¶ c¸c thÝ dô tõ tr­íc tíi nay gäi lµ file truy nhËp tuÇn tù v× mét khi file ®· ®­îc t¹o ra, ta kh«ng thÓ cËp nhËt mét b¶n ghi ®¬n lÎ nµo
trong nã. Muèn thay ®æi mét b¶n ghi, ta ph¶i ®äc c¸c th«ng tin trong b¶n ghi, söa ®æi nã vµ sau ®ã ghi vµo mét file kh¸c. B©y giê ta sÏ xÐt lÖnh OPEN phøc t¹p cã thªm
nh÷ng chØ ®Þnh kh¸c so víi nh÷ng thÝ dô tr­íc ®©y:

OPEN (UNIT = BiÓu thøc nguyªn,


* FILE = BiÓu thøc ký tù,
* ACCESS = BiÓu thøc ký tù,
* STATUS = BiÓu thøc ký tù,
* FORM = BiÓu thøc ký tù,
* IOSTAT = BiÕn nguyªn,
* RECL = BiÓu thøc nguyªn,
* BLANK = BiÓu thøc ký tù,
* ERR = Nh·n lÖnh chuyÓn ®iÒu khiÓn)

BiÓu thøc nguyªn trong chØ ®Þnh UNIT, th­êng lµ mét h»ng, ®­îc sö dông trong c¸c lÖnh READ hoÆc WRITE ®Ó chØ ®¬n vÞ file ®­îc dïng.
BiÓu thøc ký tù trong chØ ®Þnh FILE lµ tªn cña file cÇn më. Hai chØ ®Þnh võa råi chóng ta ®· quen dïng trong c¸c ch­¬ng tr­íc.
BiÓu thøc ký tù trong chØ ®Þnh ACCESS ph¶i cã gi¸ trÞ b»ng 'DIRECT'' hoÆc ‘SEQUENTIAL' dïng ®Ó chØ file thuéc lo¹i truy cËp trùc tiÕp hay truy cËp tuÇn tù. NÕu
v¾ng mÆt chØ ®Þnh nµy th× ngÇm ®Þnh lµ 'SEQUENTIAL' nh­ tr­íc ®©y chóng ta ®· dïng.
BiÓu thøc ký tù cña chØ ®Þnh STATUS cã thÓ cã mét trong nh÷ng gi¸ trÞ lµ ‘NEW' (®Ó chØ file míi sÏ t¹o ra b»ng lÖnh WRITE), hoÆc 'OLD' (file ®ang tån t¹i), hoÆc
‘UNKNOWN’ (ch­a râ), hoÆc 'SCRATCH' (file xuÊt, sÏ bÞ xo¸ khi ch­¬ng tr×nh kÕt thóc).
BiÓu thøc ký tù trong chØ ®Þnh FORM hoÆc cã gi¸ trÞ lµ 'FORMATTED' hoÆc lµ 'UNFORMATTED' hay ‘BINARY’. C¸c file FORMATTED cã thÓ dïng víi c¶ lÖnh
READ vµ WRITE cã ®Þnh d¹ng hoÆc dïng víi c¸c lÖnh nhËp, xuÊt ®¬n gi¶n. Trong file UNFORMATTED d÷ liÖu ®­îc truy cËp nh­ lµ c¸c x©u nhÞ ph©n, kh«ng ph¶i lµ
c¸c sè hay c¸c ký tù. NÕu chØ ®Þnh FORM v¾ng mÆt th× ngÇm ®Þnh sÏ lµ ‘FORMATTED’ ®èi víi c¸c file tuÇn tù vµ ‘UNFORMATTED’ ®èi víi c¸c file trùc tiÕp.
IOSTAT cã thÓ dïng ®Ó kh«i phôc lçi khi më file. NÕu kh«ng cã lçi khi më file, biÕn nguyªn sÏ cã gi¸ trÞ 0. NÕu cã lçi, thÝ dô kh«ng t×m thÊy file víi tªn ®· chØ
®Þnh, th× mét gi¸ trÞ kh¸c 0 sÏ ®­îc l­u trong biÕn. Ng­êi ta th­êng kiÓm tra gi¸ trÞ cña biÕn nµy ®Ó quyÕt ®Þnh hµnh ®éng tiÕp theo. ThÝ dô
CHARACTER TEN *12, TEMP *70
PRINT *, ‘GO TEN FILE’
READ (*, ‘(A12)’) TEN
OPEN (UNIT=15, FILE=TEN, STATUS=’OLD’, IOSTAT=IERR)

261 262
IF (IERR .EQ. 0) THEN
...
...
...
ELSE
PRINT*, ‘LOI MO FILE ‘,IERR
END IF

§Æc t¶ IOSTAT còng cã thÓ dïng víi c¸c lÖnh READ vµ WRITE.
ChØ ®Þnh RECL cÇn cho c¸c file truy cËp trùc tiÕp, kh«ng dïng víi c¸c file truy cËp tuÇn tù. BiÓu thøc nguyªn nã chØ ®Þnh ®é dµi cña mét b¶n ghi.
BiÓu thøc ký tù cña chØ ®Þnh BLANK cã thÓ lµ 'NULL' hoÆc 'ZERO'. NÕu ®Æc t¶ lµ 'NULL' c¸c dÊu trèng trong c¸c tr­êng sè bÞ bá qua, nÕu lµ 'ZERO' c¸c dÊu trèng
®­îc xem lµ c¸c sè 0. NgÇm ®Þnh lµ 'NULL'.
ChØ ®Þnh ERR lµ tuú chän vµ cã gi¸ trÞ ®Ó xö lý lçi. NÕu lçi x¶y ra trong khi thùc hiÖn lÖnh OPEN hay mét lÖnh nµo ®ã cã chøa chØ ®Þnh nµy th× ch­¬ng tr×nh sÏ
chuyÓn ®iÒu khiÓn tíi lÖnh cã nh·n ghi trong chØ ®Þnh ERR thay v× t¹o ra lçi thùc hiÖn ch­¬ng tr×nh. ChØ ®Þnh ERR còng dïng víi c¸c lÖnh READ vµ WRITE.

• LÖnh CLOSE lµ mét lÖnh thùc hiÖn, nã ng¾t mét file ngo¹i khái ch­¬ng tr×nh. D¹ng tæng qu¸t nh­ sau:

CLOSE (UNIT = BiÓu thøc nguyªn,


* STATUS = BiÓu thøc ký tù,
* IOSTAT = BiÕn nguyªn,
* ERR = Nh·n lÖnh chuyÓn ®iÒu khiÓn)

LÖnh CLOSE vµ c¸c chØ ®Þnh lµ tuú chän. ChØ ®Þnh STATUS trong lÖnh CLOSE cã gi¸ trÞ ‘KEEP’ cã nghÜa file ®­îc gi÷ l¹i, ‘DELETE’ cã nghÜa file kh«ng cÇn n÷a
vµ nªn xo¸ ®i.

• LÖnh REWIND

REWIND (UNIT = BiÓu thøc nguyªn,


* IOSTAT = BiÕn nguyªn,
* ERR = Nh·n lÖnh ®iÒu khiÓn)

263 264
dïng ®Ó chuyÓn vÒ vÞ trÝ b¶n ghi thø nhÊt trong file tuÇn tù.

• LÖnh BACKSPACE

BACKSPACE (UNIT = BiÓu thøc nguyªn,


* IOSTAT = BiÕn nguyªn,
* ERR = Nh·n lÖnh ®iÒu khiÓn)
chuyÓn vÞ trÝ ®äc ng­îc l¹i vÒ phÝa tr­íc mét b¶n ghi trong file tuÇn tù.

• LÖnh ENDFILE

ENDFILE (UNIT = BiÓu thøc nguyªn,


* IOSTAT = BiÕn nguyªn,
* ERR = Nh·n lÖnh ®iÒu khiÓn)
ghi vµo file mét b¶n ghi chØ sù kÕt thóc file khi file ®· ®­îc t¹o ra.

11.3. C¸c file truy cËp trùc tiÕp (Direct-Access Files)

C¸c b¶n ghi trong c¸c file truy cËp trùc tiÕp ®­îc truy cËp kh«ng theo c¸ch tuÇn tù, mµ theo thø tù ®­îc chØ ®Þnh trong ch­¬ng tr×nh. Khi mét file trùc tiÕp ®­îc më,
chØ ®Þnh ACCESS trong lÖnh OPEN ph¶i ®Æt lµ ‘DIRECT’ vµ ®é dµi cña b¶n ghi ph¶i ®­îc cho víi chØ ®Þnh RECL. C¸c lÖnh READ vµ WRITE ph¶i chøa chØ ®Þnh REC ®Ó
cung cÊp sè hiÖu cña b¶n ghi cÇn truy cËp.
D¹ng tæng qu¸t cña c¸c lÖnh READ hoÆc WRITE víi file truy cËp trùc tiÕp nh­ sau:

READ (Sè hiÖu file, nh·n lÖnh FORMAT,


* REC = BiÓu thø nguyªn) Danh s¸ch biÕn

WRITE (Sè hiÖu file, nh·n lÖnh FORMAT,


* REC = BiÓu thøc nguyªn) Danh s¸ch biÕn

BiÓu thøc nguyªn trong chØ ®Þnh REC dïng ®Ó chØ sè hiÖu b¶n ghi cÇn xö lý. C¸c chØ ®Þnh ERR vµ IOSTAT cã thÓ ®­îc sö dông víi c¸c lÖnh READ hoÆc WRITE

265 266
trùc tiÕp. Tuú chän END cã thÓ chØ dïng víi lÖnh READ. Khi tæ chøc file truy cËp trùc tiÕp, ng­êi ta th­êng sö dông sè thø tù hoÆc sè hiÖu ph©n biÖt - mét phÇn cña b¶n
ghi lµm sè hiÖu b¶n ghi. ThÝ dô c¸c sè hiÖu ph©n biÖt cña sinh viªn trong mét tr­êng ®¹i häc th­êng b¾t ®Çu b»ng 00001 råi ®Õn 00002... Do ®ã th«ng tin vÒ sinh viªn sè
00210 cã thÓ ®­îc l­u trong b¶n ghi 210. §«i khi cã thÓ thùc hiÖn mét sè tÝnh to¸n víi mét tr­êng cña b¶n ghi ®Ó nhËn ®­îc sè hiÖu cña nã.
File truy cËp trùc tiÕp th­êng ®­îc t¹o ra b»ng c¸ch ghi th«ng tin vµo mét c¸ch tuÇn tù, víi b¶n ghi b¾t ®Çu b»ng 1 vµ t¨ng lªn 1 mçi lÇn cã mét b¶n ghi míi ®­îc
viÕt vµo. File nµy cã thÓ xö lý theo thø tù tuÇn tù b»ng c¸ch thay ®æi sè hiÖu b¶n ghi tõ 1 ®Õn tæng sè tÊt c¶ c¸c b¶n ghi. Tuy nhiªn, ­u ®iÓm cña file trùc tiÕp sÏ thÓ hiÖn râ
khi chóng ta muèn cËp nhËt th«ng tin trong mét sè b¶n ghi cña file. Thay v× ®äc tõng b¶n ghi mét c¸ch tuÇn tù, t×m b¶n ghi mµ ta muèn cËp nhËt, ta chØ cÇn chØ ®Þnh sè
hiÖu b¶n ghi vµ b¶n ghi ®ã tù ®éng ®­îc xö lý. Khi cËp nhËt th«ng tin xong, ta cã thÓ ghi th«ng tin míi vµo b¶n ghi. NÕu trong lÖnh READ ta chØ ®Þnh mét sè hiÖu b¶n ghi
mµ b¶n ghi ®ã kh«ng tån t¹i th× sÏ x¶y ra lçi. §Ó kh«i phôc lçi, chØ ®Þnh ERR cÇn ph¶i cã mÆt trong lÖnh READ.

11.4. LÖnh truy vÊn INQUIRE

LÖnh INQUIRE cã hai d¹ng:

INQUIRE ( FILE = biÓu thøc ký tù, danh s¸ch chØ ®Þnh truy vÊn)
INQUIRE ( UNIT = biÓu thøc nguyªn, danh s¸ch chØ ®Þnh truy vÊn)
LÖnh nµy lµ mét lÖnh thùc hiÖn, nã truy vÊn th«ng tin vÒ file hay sè hiÖu file. B¶ng 9.1 liÖt kª nh÷ng chØ ®Þnh truy vÊn. ThÝ dô:
INQUIRE (FILE = 'TSDATA', SEQUENTIAL = TRALOI)
INQUIRE (UNIT = 12, SEQUENTIAL = TRALOI)
B¶ng 11.1. C¸c chØ ®Þnh truy vÊn cña lÖnh INQUIRE

Gi¸ trÞ truy vÊn Gi¸ trÞ truy vÊn


ChØ ®Þnh truy vÊn KiÓu biÕn
file FILE ®¬n vÞ file UNIT

ACCESS = CHARACTER 'SEQUENTIAL' 'SEQUENTIAL'


'DIRECT' 'DIRECT'
'NULL' 'NULL'
BLANK = CHARACTER
'ZERO' 'ZERO'
'YES' _
DIRECT = CHARACTER 'NO'
ERR = INTEGER Sè hiÖu lÖnh xö lý lçi Sè hiÖu lÖnh xö lý lçi

EXIST = LOGICAL .TRUE. .TRUE.


.FALSE. .FALSE.
'FORMATTED' 'FORMATTED'
FORM = CHARACTER
'UNFORMATTED' 'UNFORMATTED'

267 268
'YES'
FORMATTED = CHARACTER 'NO' −
'UNKNOWN'
IOSTAT = INTEGER M· lçi M· lçi
NAME = CHARACTER − Tªn file nÕu file ®ã kh«ng
ph¶i lµ file lo¹i scratch
.TRUE.
NAMED + = LOGICAL _ .FALSE.
Sè hiÖu b¶n ghi tiÕp
Sè hiÖu b¶n ghi tiÕp theo
NEXTREC = INTEGER theo trong file truy
trong file truy cËp trùc tiÕp
cËp trùc tiÕp
NUMBER + = INTEGER §¬n vÞ file −
.TRUE. .TRUE.
OPEND = LOGICAL
.FALSE. .FALSE.
RECL = INTEGER §é dµi b¶n ghi §é dµi b¶n ghi
'YES'
SEQUENTIAL = CHARACTER 'NO' −
'UNKNOWN'
'YES'
UNFORMATTED = CHARACTER 'NO' −
'UNKNOWN'

ThÝ dô 36: Sù t­ ¬ng t¸c gi÷a ng ­êi dïng vµ ch­ ¬ng tr×nh. Gi¶ sö khi ch­¬ng tr×nh yªu cÇu ng­êi dïng gâ mét tªn cña file d÷ liÖu ®Ó më ra lµm viÖc trong ch­¬ng
tr×nh. Tr­êng hîp file ®ã kh«ng tån t¹i, ch­¬ng tr×nh sÏ kÕt thóc bëi lçi thùc hiÖn. NÕu ta dïng lÖnh INQUIRE, ch­¬ng tr×nh cã thÓ x¸c ®Þnh file ®ã cã tån t¹i kh«ng vµ
nÕu kh«ng tån t¹i, ch­¬ng tr×nh nh¾c ng­êi dïng gâ mét tªn file kh¸c. C¸c lÖnh sau ®©y thùc hiÖn sù t­¬ng t¸c nµy:

CHARACTER *70 TENFIL, TIT


LOGICAL XONG, OK, CO
XONG = .FALSE.
OK = .FALSE.
PRINT *, 'NHAP TEN FILE'
READ *, TENFIL
5 IF (.NOT. XONG) THEN
INQUIRE (FILE = TENFIL, EXIST = CO)
IF (.NOT. CO) THEN
PRINT *, 'FILE KHONG TON TAI'

269 270
PRINT *, 'NHAP TEN KHAC HOAC GO THOI'
READ *, TENFIL
IF (TENFIL .EQ. 'THOI') XONG = .TRUE.
ELSE
XONG = .TRUE.
OK = .TRUE.
ENDIF
GOTO 5
ENDIF
IF (OK) THEN
OPEN (UNIT = 10, FILE = TENFIL, STATUS = 'OLD')
...
...
...
END IF
END

Bµi tËp

1. ViÕt ch­¬ng tr×nh ®Õm vµ in sè b¶n ghi trong c¸c file DATA1 vµ DATA2. Gi¶ sö c¸c file ®ã lµ file tuÇn tù vµ mçi b¶n ghi chøa hai gi¸ trÞ thùc víi format sau:
FORMAT (F6.2, 1X, F6.2)
NÕu lçi x¶y ra khi më file, h·y in th«ng b¸o lçi thay v× in sè b¶n ghi.

2. File TEM60.JAN l­u tr­êng ba chiÒu nhiÖt ®é n­íc biÓn §«ng th¸ng Giªng ®é ph©n gi¶i 1o kinh vÜ cã quy c¸ch ghi nh­ sau: Dßng ®Çu tiªn gåm 5 sè nguyªn c¸ch
nhau lÇn l­ît chØ kinh ®é mÐp tr¸i, kinh ®é mÐp ph¶i, vÜ ®é mÐp trªn, vÜ ®é mÐp d­íi cña miÒn kh«ng gian vµ sè tÇng s©u. Dßng thø hai ghi ®é s©u (sè nguyªn) cña tÇng
trªn cïng. Sau ®ã lµ b¶ng gi¸ trÞ nhiÖt ®é (sè thùc c¸ch nhau) víi sè cét b»ng sè ®iÓm nót theo kinh tuyÕn, sè dßng b»ng sè ®iÓm nót theo vÜ tuyÕn. C¸c tÇng tiÕp theo ghi
hoµn toµn t­¬ng tù. Gi¸ trÞ nhiÖt ®é khuyÕt hoÆc r¬i vµo vïng ®Êt liÒn ®­îc ghi b»ng sè 99.99. ViÕt ch­¬ng tr×nh tÝnh gi¸ trÞ nhiÖt ®é n­íc trung b×nh toµn biÓn §«ng.

3. Víi file sè liÖu cña bµi tËp 2, viÕt ch­¬ng tr×nh ®äc th«ng tin trong file vµ t¹o cho mçi ®iÓm nót thuéc miÒn tÝnh mét file ®Æt tªn theo quy t¾c sau: b¾t ®Çu b»ng ch÷
K, sau ®ã ®Õn c¸c ch÷ sè chØ kinh ®é ®iÓm, sau ®ã ch÷ V vµ c¸c ch÷ sè chØ vÜ ®é ®iÓm, ®u«i file lµ ‘.BLN’. Trong c¸c file cã quy c¸ch ghi nh­ sau, dßng trªn cïng cã mét
sè nguyªn chØ sè tÇng quan tr¾c thùc tÕ cña ®iÓm, mét dÊu c¸ch vµ ch÷ sè 1. Sau ®ã liÖt kª liªn tiÕp gi¸ trÞ nhiÖt ®é vµ tÇng s©u øng víi nhiÖt ®é ®ã víi dÊu ng­îc l¹i.

271 272
4. Gi¶ sö cã file d÷ liÖu l­u gi¸ trÞ quan tr¾c cña mét sè yÕu tè khÝ t­îng thñy v¨n t¹i tr¹m h¶i v¨n, cã quy c¸ch ghi nh­ sau:
- Dßng thø nhÊt cã hai sè nguyªn 1 vµ 2 c¸ch nhau mét dÊu trèng.
- Dßng thø hai ghi tªn tr¹m (kh«ng qu¸ 100 ký tù).
- Dßng thø ba ghi hai sè nguyªn chØ sè dßng d÷ liÖu (kh«ng qu¸ 5000) vµ sè yÕu tè quan tr¾c (kh«ng qu¸ 12) c¸ch nhau Ýt nhÊt mét dÊu trèng.
- Dßng thø t­ lÇn l­ît ghi tªn c¸c yÕu tè ®­îc quan tr¾c, mçi tªn víi ®Þnh d¹ng A8.
- Dßng thø 5 lÇn l­ît ghi ®¬n vÞ ®o cña tõng yÕu tè quan tr¾c, còng víi ®Þnh d¹ng A8.
- Mçi dßng trong c¸c dßng tiÕp sau lÇn l­ît ghi gi¸ trÞ quan tr¾c cña c¸c yÕu tè, mçi gi¸ trÞ ghi víi ®Þnh d¹ng F8.2.
ViÕt ch­¬ng tr×nh cho phÐp nhËp tªn file tõ bµn phÝm, ®äc d÷ liÖu vµ lËp ph­¬ng tr×nh håi quy gi÷a biÕn thø nhÊt (biÕn phô thuéc) vµ biÕn thø hai (biÕn ®éc lËp). In
kÕt qu¶ ra mµn h×nh theo quy c¸ch sau: gi¶ sö tªn biÕn thø nhÊt lµ Tw, biÕn thø hai lµ Ta, ph­¬ng tr×nh ph¶i viÕt cã d¹ng:
Tw = 0.915 Ta + 1.237
(Ghi chó: xem c«ng thøc trong phô lôc 3).

5. C¶i tiÕn ch­¬ng tr×nh trong bµi tËp 4 ®Ó cho phÐp ng­êi dïng tuú ý chØ ®Þnh biÕn phô thuéc vµ biÕn ®éc lËp tõ bµn phÝm.

6. Víi file d÷ liÖu ®· m« t¶ trong bµi tËp 4, lËp ch­¬ng tr×nh tÝnh ph­¬ng tr×nh håi quy nhiÒu biÕn gi÷a yÕu tè quan tr¾c thø nhÊt (biÕn phô thuéc) vµ c¸c yÕu tè quan
tr¾c 2, 3, 6, 8, 9. In kÕt qu¶ lªn mµn h×nh d­íi d¹ng ph­¬ng tr×nh håi quy víi tªn c¸c yÕu tè ®· ghi trong file.
Gîi ý: Xem ph­¬ng ph¸p thiÕt lËp ph­¬ng tr×nh håi quy tuyÕn tÝnh nhiÒu biÕn trong phô lôc 4.

7. File HESOA.MAT l­u c¸c gi¸ trÞ cña c¸c hÖ sè cña hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh theo quy c¸ch nh­ sau: Dßng thø nhÊt cã mét sè nguyªn chØ sè ph­¬ng tr×nh.
C¸c dßng tiÕp sau ghi c¸c gi¸ trÞ c¸c hÖ sè, kÓ c¶ hÖ sè tù do øng víi tõng ph­¬ng tr×nh, mçi ph­¬ng tr×nh trªn mét dßng, mçi hÖ sè ghi víi ®Þnh d¹ng F8.4, thÝ dô:
4
1.1161 0.1254 0.1397 0.1490 1.5471
0.1582 1.1675 0.1768 0.1871 1.6471
0.1968 0.2071 1.2168 0.2271 1.7471
0.2368 0.2471 0.2568 1.2671 1.8471
ViÕt ch­¬ng tr×nh ®äc file vµ gi¶i hÖ ph­¬ng tr×nh b»ng ph­¬ng ph¸p lo¹i biÕn Gauss. KÕt qu¶ in ra mµn h×nh gåm: viÕt l¹i hÖ ph­¬ng tr×nh, sau ®ã c¸ch ra mét dßng
råi ghi c¸c nghiÖm ë dßng cuèi cïng, thÝ dô, øng víi ma trËn c¸c hÖ sè nh­ trªn ph¶i cã kÕt qu¶ trªn mµn h×nh nh­ sau:
1.1161X1 + 0.1254X2 + 0.1397X3 + 0.1490X4 = 1.5471

273 274
0.1582X1 + 1.1675X2 + 0.1768X3 + 0.1871X4 = 1.6471
0.1968X1 + 0.2071X2 + 1.2168X3 + 0.2271X4 = 1.7471
0.2368X1 + 0.2471X2 + 0.2568X3 + 1.2671X4 = 1.8471

1.04059 0.98697 0.93505 0.88130


Gîi ý: Xem ph­¬ng ph¸p gi¶i hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh theo s¬ ®å lo¹i biÕn Gauss trong phô lôc 2.

8. File HESOAB.MAT l­u c¸c gi¸ trÞ cña c¸c hÖ sè cña hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh theo quy c¸ch nh­ ®· m« t¶ trong bµi tËp 7. Gi¶ sö ma trËn c¸c hÖ sè
A = [ ai j ] lµ ma trËn ®èi xøng, tøc a ij = a ji (i, j = 1, 2, ..., n) .

H·y viÕt ch­¬ng tr×nh ®äc file c¸c hÖ sè vµ gi¶i hÖ ph­¬ng tr×nh. In kÕt qu¶ theo quy c¸ch cña bµi tËp 7.
Gîi ý: Tr­êng hîp ma trËn c¸c hÖ sè A lµ ma trËn ®èi xøng, nªn dïng ph­¬ng ph¸p c¨n bËc hai ®Ó gi¶i hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh (phô lôc 2).

275 276
Tµi liÖu tham kh¶o

1. Etter D. M. Structured Fortran 77 for engineers and scientists. Fourth edition. The Benjamin/Cummings Publishing Co., Inc. California, 1993, 616
p.
2. Koffman Elliot B., Friedman Frank L. Fortran with engineering applications. Fifth Edition. Addison-Wesley Publishing Co. Massachusetts-...,
1993, 664 p.
3. N. V. Kopchenova and I.A. Maron. Computational Mathematics. Worked examples and problems with elements of theory. Mir Publishers,
Moscow, 1975
4. В а с и л ь
О. Б.
е Св ои вч р е м Фе он рн ты
. “Д
рй а
и н
аг-М
л ои ”.
ф Ми о с ,к1998,
в а 397 c.
5. В а с и л ьО. Б.
е Фв ои рч т др ла я
пн р о ф е с с :иМ оа нт ае лм оа вт и
б ч
и е
б с
л к
и а
оIMSL.
я
т е “Д ки аа л
- о н
М и ”,
ф Ми о с ,к2000,
в а 448 c.
6. Т ю р Ю.иН.,
нМ а к а А.рА.оС вт а т и с т и
а ч
н е
а с
лдк
иаи
зн йн
н ы
ак хо м п ь .ю“Ит Не Фр
” -РМ
е Ао с ,к1998,
в а
528 с

277 278
Phô lôc 1: B¶ng c¸c hµm chuÈn cña FORTRAN

279 280
Trong b¶ng c¸c hµm chuÈn d­íi ®©y, tªn cña c¸c ®èi sè sÏ chØ kiÓu d÷ liÖu theo quy ­íc sau:

§èi sè KiÓu d÷ liÖu


X → thùc
CHX → x©u ký tù
DX → ®é chÝnh x¸c ®«i
CX → phøc
LX → l«gic
IX → nguyªn
GX → tù sinh (in ®Ëm, nghiªng)

Tªn hµm KiÓu hµm §Þnh nghÜa

SQRT(X) Thùc X
DSQRT (DX) §é chÝnh x¸c ®«i DX
CSQRT (CX) Phøc CX

ABS (X) Thùc X


IABS (IX) Nguyªn IX
DABS (DX) §é chÝnh x¸c ®«i DX
CABS (CX) Phøc CX
EXP (X) Thùc eX
DEXP (DX) §é chÝnh x¸c ®«i e DX
CEXP (CX) Phøc e CX

Tªn hµm KiÓu hµm §Þnh nghÜa


LOG (GX) KiÓu theo GX log e GX
ALOG (X) Thùc log e X
DOG (GX) §é chÝnh x¸c ®«i log e DX
CLOG (CX) Phøc log e CX

LOG10 (GX) KiÓu theo GX log 10 GX


ALOG10 (X) Thùc log 10 X
DLOG10 (DX) §é chÝnh x¸c ®«i log10 DX

281 282
REA L(GX) Thùc ChuyÓn GX thµnh gi¸ trÞ thùc
FLOAT (IX) Thùc ChuyÓn IX thµnh gi¸ trÞ thùc
SNGL (DX) Thùc ChuyÓn DX thµnh ®é chÝnh x¸c ®¬n
ANINT(X) Thùc Lµm trßn tíi sè thùc gÇn nhÊt
DNINT(DX) §é chÝnh x¸c ®«i Lµm trßn tíi sè thùc gÇn nhÊt
NINT(X) Nguyªn Lµm trßn tíi sè nguyªn gÇn nhÊt
IDNINT (DX) Nguyªn Lµm trßn tíi sè nguyªn gÇn nhÊt
AINT (X) Thùc C¾t phÇn thËp ph©n cña X
DINT (DX) §é chÝnh x¸c ®«i C¾t phÇn thËp ph©n cña DX
INT (GX) Nguyªn C¾t GX thµnh sè nguyªn
IFIX (X) Nguyªn C¾t X thµnh sè nguyªn
IDINT (DX) Nguyªn C¾t DX thµnh sè nguyªn

SIGN (X, Y) Thùc G¸n dÊu cña Y cho X

ISIGN (IX, IY) Nguyªn G¸n dÊu cña IY cho IX

DSIGN (DX, DY) §é chÝnh x¸c ®«i G¸n dÊu cña DY cho DX

MOD (IX,IY) Nguyªn LÊy sè d­ cña phÐp chia IX / IY


AMOD (X,Y) Thùc LÊy sè d­ cña phÐp chia X / Y
DMOD (DX,DY) §é chÝnh x¸c ®«i LÊy sè d­ cña phÐp chia DX / DY
DIM (X,Y) Thùc X − (cùc tiÓu cña X vµ Y)
IDIM (IX,IY) Nguyªn IX − (cùc tiÓu cña IX vµ IY)
DDIM (DX,DY) §é chÝnh x¸c ®«i DX − (cùc tiÓu cña DX vµ DY)

Tªn hµm KiÓu hµm §Þnh nghÜa


MAX (GX,GY,...) KiÓu theo GX, GY, ... Cùc ®¹i cña (GX, GY, ...)
MAX0 (IX,IY,...) Nguyªn Cùc ®¹i cña (IX, IY, ...)
AMAX1 (X,Y,...) Thùc Cùc ®¹i cña (X, Y, ...)
DMAX1 (DX,DY,...) §é chÝnh x¸c ®«i Cùc ®¹i cña (DX, DY, ...)
AMAX0 (IX,IY,...) Thùc Thùc, cùc ®¹i cña (IX, IY, ...)
MAX1 (X,Y,...) Nguyªn Cùc ®¹i cña (X, Y, ...)
MIN (GX,GY,...) KiÓu theo GX,GY,... Cùc tiÓu cña (GX, GY, ...)
MIN0 (IX,IY,...) Nguyªn Cùc tiÓu cña (IX, IY, ...)
AMIN1 (X,Y,...) Thùc Cùc tiÓu cña (X, Y, ...)

283 284
DMIN1 (DX,DY,...) §é chÝnh x¸c ®«i Cùc tiÓu cña (DX, DY, ...)
AMIN0 (IX,IY,...) Thùc Cùc tiÓu cña (IX, IY, ...)
MIN1 (X,Y,...) Nguyªn Cùc tiÓu cña (X, Y, ...)
SIN (X) Thùc sin X (X - ra®ian)
DSIN (DX) §é chÝnh x¸c ®«i sin DX (DX - ra®ian)
CSIN (CX) Phøc sin CX

COS (X) Thùc cos X (X - ra®ian)


DCOS (DX) §é chÝnh x¸c ®«i cos DX (DX - ra®ian)
CCOS (CX) Phøc cos CX
TAN (X) Thùc tgX (X - ra®ian)
DTAN (DX) §é chÝnh x¸c ®«i tgDX (DX - ra®ian)
ASIN (X) Thùc arcsin X
DASIN (X) §é chÝnh x¸c ®«i arcsin DX

ACOS (X) Thùc arccos X


DACOS (DX) §é chÝnh x¸c ®«i arccos DX
ATAN (X) Thùc arctgX
DATAN (DX) §é chÝnh x¸c ®«i arctgDX

Tªn hµm KiÓu hµm §Þnh nghÜa


ATAN2 (X,Y) Thùc arctg ( X / Y )
DATAN2 (DX,DY) §é chÝnh x¸c ®«i arctg ( DX / DY )
SINH (X) Thùc shX
DSINH (DX) §é chÝnh x¸c ®«i shDX

COSH (X) Thùc chX


DCOSH (DX) §é chÝnh x¸c ®«i chDX

TANH (X) Thùc th X


DTANH (DX) §é chÝnh x¸c ®«i thDX

285 286
DPROD (X, Y) §é chÝnh x¸c ®«i TÝch cña X vµ Y
DBLE (X) §é chÝnh x¸c ®«i ChuyÓn X thµnh ®é chÝnh x¸c ®«i
CMPLX (X) Phøc X + 0i
CMPLX (X, Y) Phøc X + Yi
AIMAG (CX) Thùc PhÇn ¶o cña CX
REAL (CX) Thùc PhÇn thùc cña CX
CONJG (CX) Phøc Liªn hîp cña CX, a − bi
LEN (CHX) Nguyªn §é dµi cña x©u ký tù CHX
INDEX (CHX, CHY) Nguyªn VÞ trÝ cña x©u CHY trong x©u CHX
Ký tù øng víi vÞ trÞ thø IX trong
CHAR (IX) Ký tù
chuçi so s¸nh
VÞ trÝ cña ký tù CHX trong chuçi so
ICHAR (CHX) Nguyªn
s¸nh
Gi¸ trÞ cña biÓu thøc (CHX lín h¬n
LGE (CHX, CHY) L«gic
hoÆc b»ng CHY vÒ tõ vùng)
Gi¸ trÞ cña biÓu thøc (CHX lín h¬n
LGT (CHX, CHY) L«gic
CHY vÒ tõ vùng)
Gi¸ trÞ cña biÓu thøc (CHX nhá h¬n
LLE (CHX, CHY) L«gic
hoÆc b»ng CHY vÒ tõ vùng)
Gi¸ trÞ cña biÓu thøc (CHX nhá h¬n
LLT (CHX, CHY) L«gic
CHY vÒ tõ vùng)

Phô lôc 2: Ph­¬ng ph¸p Gauss gi¶i hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh

a11x1 + a12 x2 + ... + a1n xn = b1 


+ + + = 
a21x1 a22 x2 ... a2n xn b2 

... ... ... ... ... 
an1x1 + an2 x2 + ... + ann xn = bn 

287 288
hay Ax=b (*)

 a11 a12 ... a1n   b1   x1 


     
 2   x2 
( ) 
A = aij = 
a21
...
a22
...
... a2 n 
... ...  ; b = 
b

... ;
x =  ...  .
     
 ... ann   b   xn 
 an1 an 2  n  
NÕu ma trËn A kh«ng suy biÕn, tøc
a11 a12 ... a1n
a21 a22 ... a2n
det A = ≠ 0
... ... ... ...
an 1 an 2 ... ann
th× hÖ (*) cã nghiÖm duy nhÊt. Cã thÓ tÝnh nghiÖm theo c«ng thøc Cramer
det Ai
xi = ,
det A
trong ®ã Ai − ma trËn A víi cét i bÞ thay thÕ b»ng cét c¸c sè h¹ng tù do b .

1. Ph­¬ng ph¸p lo¹i biÕn Gauss gi¶i hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh:
ThÝ dô cho hÖ
a11x1 + a12 x2 + a13 x3 + a14 x4 = a15 

a21x1 + a22 x2 + a23 x3 + a24 x4 = a25 
 (1)
a31x1 + a32 x2 + a33 x3 + a34 x4 = a35 
a41x1 + a42 x2 + a43 x3 + a44 x4 = a45 
Gi¶ sö phÇn tö chÝnh a11 ≠ 0 . Chia ph­¬ng tr×nh thø nhÊt cho a11 , ta cã
x1 + b12 x2 + b13 x3 + b14 x4 = b15 , (2)

289 290
a1 j
víi b1 j = ( j = 2, 3, 4, 5) .
a11
Dïng ph­¬ng tr×nh (2) ®Ó lo¹i Èn x1 khái c¸c ph­¬ng tr×nh sè 2, 3, 4 cña hÖ (1): Muèn vËy, nh©n ph­¬ng tr×nh (2) tuÇn tù víi a 21 , a 31 , a 41 vµ tuÇn tù lÊy c¸c ph­¬ng
tr×nh sè 2, 3, 4 trõ ®i c¸c tÝch t­¬ng øng võa nhËn ®­îc, ta cã ba ph­¬ng tr×nh:
(1)
a22 x2 + a23
(1)
x3 + a24
(1)
x4 = a25
(1)


(1)
a32 x2 + a33(1) x3 + a34
(1)
x4 = a35
(1)
 (3)

a42 x2 + a43 x3 + a44 x4 = a45 
(1) (1) (1) (1)

trong ®ã
aij(1) = aij − ai1b1 j (i = 2, 3, 4; j = 2, 3, 4, 5) (4)
(1)
B©y giê chia ph­¬ng tr×nh thø nhÊt cña hÖ (3) cho phÇn tö chÝnh a22 ta cã:

x2 + b23
(1)
x3 + b24
(1)
x4 = b25
(1)
, (5)
trong ®ã

a2(1j)
b2(1j) = (1)
( j = 3, 4 , 5) .
a22
B»ng c¸ch t­¬ng tù nh­ khi lo¹i x1 , b©y giê ta lo¹i x2 khái c¸c ph­¬ng tr×nh thø ba vµ thø t­, ta cã:
( 2) 
( 2)
a33 x3 + a34
( 2)
x4 = a35 
. (6)
( 2)
a43 x3 + a44
( 2)
x4 = a45
( 2)

trong ®ã
aij( 2 ) = aij(1) − ai(12) b2(1j) (i = 3, 4; j = 3, 4, 5) . (7)

Chia ph­¬ng tr×nh thø nhÊt cña hÖ (6) cho phÇn tö chÝnh a33
(2)
, ta cã:

x3 + b34
(2)
x4 = b35
( 2)
, (8)

291 292
trong ®ã
a3(2j )
b3( 2j ) = ( 2)
( j = 4, 5) .
a33
Sau ®ã nhê (8) ta lo¹i x 3 khái ph­¬ng tr×nh thø hai cña hÖ (6), nhËn ®­îc:
( 3)
a44 x4 = a45
( 3)

trong ®ã
a 4(3j) = a 4( 2j) − a 43
( 2) ( 2 )
b3 j ( j = 4, 5) (9)

Nh­ vËy ta ®· ®­a hÖ (1) vÒ hÖ t­¬ng ®­¬ng cã ma trËn c¸c hÖ sè lµ ma trËn tam gi¸c
x1 + b12 x 2 + b13 x 3 + b14 x 4 = b15 

x 2 + b23(1) x3 + b24(1) x 4 = b25(1) 
 (10)
x3 + b34( 2 ) x 4 = b35( 2 ) 
(3 ) 
a 44(3 ) x 4 = a 45 
Tõ (10) x¸c ®Þnh c¸c Èn

x 4 = a 45 (3) (3)
a 44 

x 3 = b35( 2 ) − x 4 b 34
(2)

 (11)
x 2 = b 25 − x 4 b 24 − x 3 b 23 
(1) (1 ) (1 )

x1 = b15 − x 4 b14 − x 3 b13 − x 2 b12 


VËy thñ tôc gi¶i hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh bËc nhÊt quy vÒ hai qu¸ tr×nh:
a) Qu¸ tr×nh thuËn: ®­a hÖ (1) vÒ d¹ng tam gi¸c (10);
b) Qu¸ tr×nh nghÞch: t×m Èn theo c¸c c«ng thøc (11).
NÕu phÇn tö chÝnh cña hÖ b»ng kh«ng th× chØ cÇn thay ®æi chç cña c¸c ph­¬ng tr×nh trong hÖ t­¬ng øng ®Ó lµm cho phÇn tö chÝnh kh¸c kh«ng.
Sè phÐp tÝnh sè häc N cÇn thùc hiÖn trong ph­¬ng ph¸p Gauss b»ng

293 294
2n ( n + 1) ( n + 2)
N= + n ( n − 1) .
3
VËy sè phÐp tÝnh sè häc xÊp xØ tû lÖ víi luü thõa bËc ba cña sè Èn.

2. Ph­¬ng ph¸p c¨n bËc gi¶i hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh trong tr­êng hîp ma trËn A lµ ma trËn ®èi xøng

Ph­¬ng ph¸p nµy thuËn lîi trong tr­êng hîp hÖ ph­¬ng tr×nh
Ax=b (12)
cã ma trËn A lµ ma trËn ®èi xøng, ®iÒu th­êng gÆp trong c¸c bµi to¸n kü thuËt.
Theo ph­¬ng ph¸p nµy ma trËn A ®­îc biÓu diÔn thµnh tÝch cña hai ma trËn tam gi¸c chuyÓn vÞ
A = T′T (13)
trong ®ã
 t11 t12 ... t1n   t11 ... 0 
   
0 t 22 ... t 2n  t t 22 ... 0 
T = , T ′ =  12
... ... ... ...  ... ... ... ... 
   
0 ... t nn  t ... t nn 
 0  1n t 2n

Nh©n hai ma trËn T ′ vµ T vµ cho tÝch b»ng ma trËn A , ta suy ra c¸ c«ng thøc tÝnh c¸c phÇn tö t ij :
a1 j
t 11 = a11 , t1 j = ( j > 1)
t 11
i −1
t ii = a ii − ∑ t ki2 (1 < i ≤ n ) (14)
k =1
i −1
a ij − ∑ t ki t kj
k =1
t ij = (i < j )
t ii
t ij = 0 khi i > j
Nh­ vËy ta ®· thay hÖ (12) b»ng hai hÖ t­¬ng ®­¬ng
T' y = b, Tx=y 15)
hay

295 296
t11 y1 = b1 

t12 y1 + t 22 y2 = b2 
 (16)
.......... .......... ... 
t1n y1 + t 2 n y2 + .... + t nn yn = bn 

t11 x1 + t12 x2 + .... + t1n xn = y1 



t 22 x2 + ... + t 2n xn = y2 
 (17)
......................... 
t nn xn = yn 
Tõ ®ã suy ra c¸c c«ng thøc tÝnh:
i −1 n

b1
bi − ∑ t ki yk
yn
yi − ∑ t ik xk
k =i +1
y1 = , yi = k =1
(i > 1) (18) xn = , xi = (i < n ) (19)
t11 t ii t nn t ii
VËy qu¸ tr×nh thuËn gåm tÝnh c¸c phÇn tö cña ma trËn T theo c¸c c«ng thøc (14). Qu¸ tr×nh nghÞch lµ tÝnh c¸c ma trËn cét y vµ x theo c¸c c«ng thøc (18), (19).

Phô lôc 3: Ph­¬ng ph¸p b×nh ph­¬ng nhá nhÊt trong ph©n tÝch håi quy

1. M« h×nh tuyÕn tÝnh

297 298
M« h×nh håi quy tuyÕn tÝnh cã d¹ng:

y = f ( x) = ax + b .
Theo ph­¬ng ph¸p b×nh ph­¬ng nhá nhÊt, c¸c hÖ sè håi quy a vµ b trong ph­¬ng tr×nh trªn ®­îc t×m sao cho tæng b×nh ph­¬ng sai sè b»ng
n
E = ∑ ( y k − axk − b) 2
k =1

cùc tiÓu. LÇn l­ît lÊy ®¹o hµm biÓu thøc nµy theo a , b vµ cho b»ng kh«ng, ta ®­îc hÖ ph­¬ng tr×nh sau ®©y ®Ó x¸c ®Þnh a vµ b :
n n n
a ∑ xk2 + b∑ xk = ∑ xk yk ,
k =1 k =1 k =1
n n
a∑ x k + b n = ∑ y k .
k =1 k =1

VËy c¸c hÖ sè håi quy ®­îc tÝnh theo c¸c c«ng thøc sau:
n n n

∑x ∑ y k k − n ∑ xk yk
a= k =1
n
k =1 k =1
n
(20)
(∑ x k ) − n ∑ x k2
2

k =1 k =1

n n n n

∑ x k ∑ x k y k − ∑ x k2 ∑ y k
b= k =1 k =1
n
k =1 k =1
n
, (21)
(∑ xk ) 2 − n ∑ x k2
k =1 k =1

hay hÖ sè b cßn cã thÓ tÝnh theo c«ng thøc:


n n

∑y k −a ∑x k
b= k =1 k =1
. (22)
n

2. M« h×nh ®a thøc
Ph­¬ng ph¸p b×nh ph­¬ng nhá nhÊt còng cã thÓ ¸p dông ®Ó tÝnh c¸c hÖ sè håi quy ®a thøc d¹ng

299 300
f ( x) = a0 + a1 x + a 2 x 2 + ... + a n x m .

thÝ dô ®èi víi m« h×nh bËc hai

f ( x) = a 0 + a1 x + a 2 x 2 .
LÊy ®¹o hµm tæng sai sè theo c¸c hÖ sè vµ cho b»ng kh«ng ta cã hÖ sau ®©y ®Ó x¸c ®Þnh c¸c hÖ sè håi quy bËc hai:
 n n n
 a2 ∑ xk2 + a1 ∑ xk + a0 n = ∑ yk
 k =1 k =1 k =1

 n n n n
 a2 ∑ xk3 + a1 ∑ xk2 + a0 ∑ xk = ∑ xk yk (23)
 k =1 k =1 k =1 k =1
 n n n n
 a2 ∑ xk4 + a1 ∑ xk3 + a0 ∑ xk2 = ∑ xk2 yk
 k =1 k =1 k =1 k =1

VÒ nguyªn t¾c ta cã thÓ sö dông ph­¬ng ph¸p nµy ®Ó t×m ph­¬ng tr×nh ®a thøc bËc bÊt kú. Tuy nhiªn trong thùc tÕ ph­¬ng ph¸p trë thµnh kh«ng æn ®Þnh khi bËc ®a
thøc lín h¬n v× c¸c sai sè lµm trßn sè trong m¸y tÝnh.

3. M« h×nh phi tuyÕn


Ph­¬ng ph¸p b×nh ph­¬ng nhá nhÊt cã thÓ ¸p dông cho hµm bÊt kú, nh­ng hÖ c¸c ph­¬ng tr×nh ®Ó t×m c¸c hÖ sè cã thÓ phi tuyÕn, vµ do ®ã kh«ng thÓ gi¶i ®­îc b»ng
c¸ch sö dông c¸c ph­¬ng tr×nh tuyÕn tÝnh. Tuy nhiªn, trong mét sè tr­êng hîp, mét hµm phi tuyÕn cã thÓ chuyÓn thµnh mét hµm tuyÕn tÝnh. ThÝ dô vÒ mét hµm cã thÓ
tuyÕn tÝnh ho¸ lµ
f ( x) = b x a (24)
NÕu lÊy loga hai vÕ cña ph­¬ng tr×nh nµy, ta cã

ln f ( x) = a ln x + ln b . (25)
NÕu ký hiÖu

g ( x) = ln f ( x) (26)

~
b = ln b (27)
~
x = ln x (28)

301 302
~y = ln y (29)
ta cã
~
g ( x ) = a~
x +b (30)
~
Víi ph­¬ng tr×nh (30) c¸c hÖ sè håi quy a vµ b tÝnh theo c¸c c«ng thøc
n n n

∑ xk ∑ ~yk − n ∑ ~
~ xk ~yk
a= k =1 k =1
n
k =1
n (31)
(∑ ~
xk ) 2 − n ∑ ~
xk2
k =1 k =1

n n n n

~ ∑ ~x ∑ ~x ~y − ∑ ~x ∑ ~y
k k k k
2
k
b= k =1 k =1
n
k =1
n
k =1
(32)
(∑ ~
xk ) 2 − n ∑ ~
xk2
k =1 k =1

VËy c«ng viÖc tÝnh to¸n gåm: chuyÓn ®æi c¸c gi¸ trÞ sè liÖu x k vµ y k theo c¸c c«ng thøc (28), (29), tÝnh c¸c tæng, kÕt qu¶ thÕ vµo c¸c ph­¬ng tr×nh (31), (32) ®Ó t×m
~
a vµ b . Gi¶i ph­¬ng tr×nh (27) ®èi víi b vµ ®Æt vµo ph­¬ng tr×nh (24).

303 304
Phô lôc 4: S¬ ®å øng dông ph­¬ng ph¸p håi quy nhiÒu biÕn

Gi¶ sö cã n quan tr¾c ®èi víi biÕn phô thuéc y vµ c¸c biÕn ®éc lËp x1 , x 2 , ..., x m . Ph­¬ng tr×nh håi quy ®­îc thiÕt lËp nh­ sau:

y = a0 + a1 x1 + a2 x2 + ... + am xm .
C¸c hÖ sè håi quy a i (i = 1,..., m) ®­îc chän sao cho tho¶ m·n

δ = ∑ ( y − a0 − a1 x1 − a 2 x 2 − ... − a m x m ) = min
n
2

i =1

LÇn l­ît lÊy ®¹o hµm biÓu thøc trªn theo a 0 , a1 , a 2 ,..., a m vµ cho c¸c ®¹o hµm b»ng kh«ng, ta cã hÖ m + 1 ph­¬ng tr×nh ®Ó x¸c ®Þnh c¸c hÖ sè a

na 0 + [x1 ]a1 + [x2 ]a2 + ... + [xm ]am = [y]


[x1 ]a0 + [x1x1 ]a1 + [x2 x1 ]a2 + ... + [xm x1 ]am = [yx1 ]
[x2 ]a0 + [x1 x2 ]a1 + [x2 x2 ]a2 + ... + [xm x2 ]am = [ yx2 ]
... ... ... ... ... ...
[xm ]a0 + [x1xm ]a1 + [x2 xm ]a2 + ... + [xm xm ]am = [yxm ]
(33)
305 306
HÖ ph­¬ng tr×nh nµy gäi lµ hÖ ph­¬ng tr×nh chÝnh t¾c ®Ó x¸c ®Þnh c¸c hÖ sè håi quy. D­íi d¹ng ma trËn ta viÕt hÖ nµy nh­ sau:
 n [x1 ] [x2 ] ... [xm ]   a0   b0 
     
 [x1 ] [x1 x1 ] [x2 x1 ] ... [xm x1 ]   a1   b1 
 [x ] [x1 x2 ] [x2 x2 ] ... [xm x2 ]  .  a2  =  b2 
 2
 ... ... ... ... ...   ...   ... 

 [xm ] [x1 xm ] [x2 xm ] ... [xm xm ]  am   bm 
  

(34)
n
víi dÊu [ ] ký hiÖu phÐp lÊy tæng ∑ .
1

§Ó t×m c¸c hÖ sè håi quy a0 , a1 , a2 ,..., am ta ph¶i gi¶i hÖ ph­¬ng tr×nh chÝnh t¾c theo ph­¬ng ph¸p lo¹i biÕn Gauss hoÆc ph­¬ng ph¸p c¨n bËc hai ®· m« t¶ trong
phô lôc 2 v× ma trËn hÖ sè cña c¸c ph­¬ng tr×nh chÝnh t¾c lµ ma trËn ®èi xøng. D­íi ®©y dÉn hai thñ tôc hç trî cho viÖc lËp hÖ ph­¬ng tr×nh ®¹i sè tuyÕn tÝnh chuÈn t¾c
(34) − SUBROUTINE LHPTCT vµ gi¶i hÖ ph­¬ng tr×nh ®ã b»ng ph­¬ng ph¸p lo¹i biÕn Gauss − SUBROUTINE GAUSS.
SUBROUTINE LHPTCT (Y, X, A, N, M)
INTEGER N, M, I, J, K
REAL Y(10000), X(10000, 50), A(0 : 50, 0 : 51)
A (0, 0) = N
DO J = 1, M
A (0, J) = 0.0
DO K = 1, N
A (0, J) = A (0, J) + X (K, J)
END DO
END DO
A (0, M + 1) = 0.0
DO K = 1, N
A (0, M + 1) = A (0, M + 1) + Y (K)
END DO
DO I = 1, M
A (I, M + 1) = 0.0
DO K = 1, N
A (I, M + 1) = A (I, M + 1) + Y (K) * X(K, I)
END DO

307 308
END DO
DO I = 1, M
DO J = I, M
A (I, J) = 0.0
DO K = 1, N
A (I, J) = A (I, J) + X (K, I) * X (K, J)
END DO
ENDDO
ENDDO
DO I = 1, M
DO J = 0, I - 1
A (I, J) = A (J, I)
END DO
END DO
RETURN
END

SUBROUTINE GAUSS (M, A, X)


INTEGER M
REAL A (0 : 50, 0 : 51), X (0 : 50)
REAL MAX
DO I = 0, M - 1
K=I
MAX = ABS (A (K, K))
DO J = I + 1, M
IF (MAX .LT. ABS (A (J, I))) THEN
MAX = ABS (A (J, I))
K=J
END IF
END DO
IF (K .NE. I) THEN
DO J = I, M + 1
MAX = A (I, J)
A (I, J) =A (K, J)
A (K, J) = MAX
END DO
END IF

309 310
DO J = I + 1, M + 1
A (I, J) = A (I, J) / A (I, I)
END DO
DO J = I + 1, M
DO K = I + 1, M + 1
A (J, K) = A (J, K) - A (J, I) * A (I, K)
END DO
END DO
END DO
X (M) = A (M, M + 1) / A (M, M)
DO I = M - 1, 0, -1
X (I) = A (I, M + 1)
DO J = I + 1, M
X (I) = X (I) - A (I, J) * X (J)
END DO
END DO
RETURN
END

311 312

You might also like