Top Banner
7 8 Giáo trình Fortran Ebook made by: Nguyn Trung Hiếu – Email: [email protected] - 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.
153

Giao trinh Fortran

Mar 27, 2023

Download

Documents

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Giao trinh Fortran

7 8

Giáo trình Fortran

Ebook made by: Nguyễn Trung Hiếu – Email: [email protected] - 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.

Page 2: Giao trinh Fortran

9 10

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

Processor

ALU

CPU

Input Output

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.

Page 3: Giao trinh Fortran

11 12

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

BAX /=

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)

Page 4: Giao trinh Fortran

13 14

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

Page 5: Giao trinh Fortran

15 16

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:

TRUNG BINH BANG 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 02 =++ cbxxa 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×.

Page 6: Giao trinh Fortran

17 18

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)

Page 7: Giao trinh Fortran

19 20

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

Page 8: Giao trinh Fortran

21 22

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.

LÖnh Fortran

Ký tù nèi dßng

Nh·n lÖnh

C¸c cét 1-5

Cét 6

C¸c cét 7-72

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.

Page 9: Giao trinh Fortran

23 24

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 7910− ®Õn 7510 .

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 i 501,2 + 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.

Page 10: Giao trinh Fortran

25 26

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 9102 ⋅ , 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:

Page 11: Giao trinh Fortran

27 28

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

Page 12: Giao trinh Fortran

29 30

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è 141593,3=π 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Þ 0,5=b (cm) cho biÕn DAY. LÖnh (3) g¸n gi¸ trÞ 5,3=h (cm) cho biÕn CAO. LÖnh (4) tÝnh gi¸ trÞ cña biÓu thøc hb ××5,0 , 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

Page 13: Giao trinh Fortran

31 32

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

Page 14: Giao trinh Fortran

33 34

®¬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 321 , , aaa 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è

232221

131211

aaaaaa

®­î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 ) ..., , ,( MAT ), ..., , ,(A 2121 kmmmnnn l

trong ®ã -MAT A, tªn c¸c m¶ng; −kmmmnnn ,...,, ,,...,, 2121 l 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¶).

Page 15: Giao trinh Fortran

35 36

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è jia , (kÓ c¶ c¸c hÖ sè tù do) vµ

c¸c nghiÖm ix . 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µ ®èi sè Gi¸ trÞ hµm

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

Page 16: Giao trinh Fortran

37 38

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) xe 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è JI /

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.

Page 17: Giao trinh Fortran

39 40

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 2)BKINH(PI × 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

Page 18: Giao trinh Fortran

41 42

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

Céng BA + A + B

Trõ BA − A − B

Nh©n BA × A * B

Chia BA

A / B

Luü thõa 3A 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 92 hay 512 chø kh«ng ph¶i lµ

6482**)3**2( 2 == .

Page 19: Giao trinh Fortran

43 44

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

Page 20: Giao trinh Fortran

45 46

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:

a) 3,14 b) 3,141593 c) 0,0026 d) 3105,2 ×

e) −14,0 f) 28,34 g) 2310023,6 ×

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

3 34 RV π= ( −R b¸n kÝnh).

b) Hai nghiÖm 1x vµ 2x cña ph­¬ng tr×nh bËc hai

aacbbx

242

2 ,1−±−

= ( −cb,a , c¸c hÖ sè cña ph­¬ng tr×nh)

c) Gi¸ trÞ hµm

)2cos(sin21

212 −= xxy (khi x cho b»ng ®é).

d) Gi¸ trÞ hµm mËt ®é ph©n bè Gauss

2

2

21)(

x

exF−

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µ ) ,( ), ,( bbaa yxyx .

Page 21: Giao trinh Fortran

47 48

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 3 ,2 ,1 321 === iii 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ã ®ã.

Page 22: Giao trinh Fortran

49 50

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

Page 23: Giao trinh Fortran

51 52

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:

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

Khi X = 30.00000 1/2 SinX = 0.2500000

Page 24: Giao trinh Fortran

53 54

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.

Page 25: Giao trinh Fortran

55 56

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:

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

1 1982 25.36 SL quan trac

Page 26: Giao trinh Fortran

57 58

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:

KET QUA Q UAN TRAC

G io Toc 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.

Page 27: Giao trinh Fortran

59 60

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

Page 28: Giao trinh Fortran

61 62

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µ

Page 29: Giao trinh Fortran

63 64

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 NTONGTB /←

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

§

↓ S

A > B ? →

Page 30: Giao trinh Fortran

65 66

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

B¾t ®Çu

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

Page 31: Giao trinh Fortran

67 68

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è

Page 32: Giao trinh Fortran

69 70

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µ

Page 33: Giao trinh Fortran

71 72

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

Page 34: Giao trinh Fortran

73 74

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õ 1+n ®Õn m ®­îc thùc hiÖn:

Page 35: Giao trinh Fortran

75 76

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õ 1+m ®Õ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õ 1+n 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õ 1+p 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

Page 36: Giao trinh Fortran

77 78

02 =++ cbxax (c¸c hÖ sè cba ,, nhËp tõ bµn phÝm, 0≠a ).

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 ‘Nhap HS’ § äc a, b, c

TÝnh ∆

∆ < 0

↓ §

S

← ↓

S ↓

∆ = 0

I n -b / (2a) ∆=∆ a = 2a

→ KÕt thóc

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

↓ In ‘V« nghiÖm’

§

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

Page 37: Giao trinh Fortran

79 80

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) 321 , , nnn

trong ®ã −321 , , nnn 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µ 1n , b»ng kh«ng − nh·n 2n , vµ d­¬ng

− nh·n 3n .

ThÝ dô, theo lÖnh

IF (I − 10) 4, 8, 7

nÕu 10<I ®iÒu khiÓn chuyÓn ®Õn lÖnh cã nh·n lµ 4, nÕu −= 10I chuyÓn ®Õn nh·n 8 vµ nÕu −> 10I chuyÓn ®Õn nh·n 7.

Trong lÖnh

IF (X − 3.5) 3, 6, 6

khi 5,3≥X ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 6, khi 5,3<X ®iÒu khiÓn chuyÓn tíi lÖnh cã nh·n lµ 3.

Page 38: Giao trinh Fortran

81 82

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

)1 ( cos)(3

+= − xtexf x ,

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

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

B¾t ®Çu

TÝnh F

S ←

X > 3

T = 0.1 X = 1.0

X = X + 0.1

KÕt thóc

I n X, F

↓ §

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

Page 39: Giao trinh Fortran

83 84

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

Page 40: Giao trinh Fortran

85 86

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 ( mnnn ..., , , 21 ) , i

trong ®ã −mnnn ..., , , 21 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 mnnn ..., , , 21

tuú thuéc vµo gi¸ trÞ cña i , cô thÓ khi 1=i ®iÒu khiÓn sÏ chuyÓn tíi lÖnh cã nh·n 1n , khi −= 2i nh·n 2n , ..., khi −= mi nh·n mn . NÕu gi¸ trÞ cña i n»m ngoµi

kho¶ng mi ≤≤1 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.

Page 41: Giao trinh Fortran

87 88

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 4,0=x theo c«ng thøc

=−

=−

==

=

3 khi )35(21

2 khi )13(21

1 khi 0 khi 1

)(

3

2

l

l

l

l

l

xx

xx

xP

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 0.6< , kh¸ 9,86 ÷ , giái 0,9> . Danh s¸ch xÕp theo

thø tù tõ cao xuèng thÊp dùa theo ®iÓm trung b×nh.

Page 42: Giao trinh Fortran

89 90

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)

Page 43: Giao trinh Fortran

91 92

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

Page 44: Giao trinh Fortran

93 94

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

a

xxI sin2

theo c«ng thøc h×nh thang víi sai sè −= ba , ;0001,0ε cho tr­íc.

Gîi ý: ë b­íc xÊp xØ ®Çu, xem sè h×nh thang con 1=n , tÝch ph©n b»ng

)( )( 5,01 abyyS ba −+= .

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

iiiii xxyyS )( )( 5,0 112

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

ax =1 bxn =2x

1y2y

)(xfy =

H×nh 4.3. Minh häa s¬ ®å tÝnh

gÇn ®óng tÝch ph©n x¸c ®Þnh theo

ph­¬ng ph¸p h×nh thang

Page 45: Giao trinh Fortran

95 96

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

Page 46: Giao trinh Fortran

97 98

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:

∑∞

=

−+−=−+−=

1

2121654322

!)2(2)1(...

!62

!42sin

n

nnn

nxxxxx

.

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 x2sin theo c«ng thøc nµy víi nh÷ng sè sè h¹ng chuçi n lÎ

tõ 1 ®Õn 15. ThÊy r»ng sè h¹ng ®Çu khi 1=n lµ 2x , mçi sè h¹ng tiÕp sau b»ng sè h¹ng tr­íc nh©n víi )12

2 2

−−

n(n x

.

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Þ x2sin 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:

18090 ≤< x ta thay b»ng gãc x−180 ,

nÕu x n»m trong kho¶ng:

270180 ≤< x ta thay b»ng gãc 180−x ,

nÕu x n»m trong kho¶ng:

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

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

Page 47: Giao trinh Fortran

99 100

Read X

X > 270 F

X = X − 360 X >180

X =X − 180

T

T

F

X = 180 − X

X > 90

T

F

X = X*3.1415 / 180 K

hèi 1

↓ ←

↓ ↓

↓ ↓

↓ ↓ ↓ ← ↓

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

Print tiªu ®Ò b¶ng

Print tiªu ®Ò cét

Khè

i 2

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

Page 48: Giao trinh Fortran

101 102

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

S = 0 N = 1

THEM = X2

S = S + THEM

N lÎ

Print N, S, sin2 X

T

F

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

N>15

T

F

← ↓

Khèi 3

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 x2sin cÇn tÝnh).

• G¸n 1 cho N (b¾t ®Çu xÐt sè h¹ng thø nhÊt).

• G¸n 2x cho biÕn THEM (gi¸ trÞ cña sè h¹ng thø nhÊt).

• Chõng nµo 15≤N thùc hiÖn tuÇn tù 4 b­íc sau:

♦ Céng sè h¹ng (THEM) vµo biÕn S.

Page 49: Giao trinh Fortran

103 104

♦ NÕu N lÎ in gi¸ trÞ xSN 2sin , , (tÝnh theo hµm chuÈn).

♦ T¨ng thªm 1 ®¬n vÞ cho N .

♦ TÝnh l¹i biÕn THEM b»ng c¸ch nh©n chÝnh nã víi )12

2 2

−−

N(N X

.

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.

Page 50: Giao trinh Fortran

105 106

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

Page 51: Giao trinh Fortran

107 108

§é 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

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

N = 32 K = 1

K = K + 1

K > N

T

Khè

i 2 §äc H (K)

§äc T (K)

→ F

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µ 0h . Gi¶ sö ®é s©u nµy n»m gi÷a c¸c ®é s©u nót ih vµ 1+ih , tøc tháa m·n bÊt ®¼ng thøc kÐp:

10 +≤≤ ii hhh ,

trong ®ã i cã thÓ biÕn thiªn tõ 1 ®Õn 31. Nh­ vËy, ®Ó t×m i , ta ph¶i gi¶ sö 1=i 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.

Page 52: Giao trinh Fortran

109 110

I = 1

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

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

↓ →

Khè

i 3

I = I + 1 ↓

↓ In H0, T0

F

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Þ 0t cÇn néi suy cã thÓ tÝnh theo c«ng thøc néi suy tuyÕn tÝnh nh­ sau:

ii

iiii hh

hhtttt−

−−+=

+

+

1

010

)()( .

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

Page 53: Giao trinh Fortran

111 112

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Þ:

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

Page 54: Giao trinh Fortran

113 114

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

>≤

=,0 khi ;0 khi

3

2

xxxxy

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:

KR

CF

RF

59

F3259

R67,459

TT

TT

TT

=

+=

−=

o

o

5. ViÕt ch­¬ng tr×nh tÝnh tÝch ph©n ∫=15

1

)( dxxyI víi hµm )(xy cho d­íi d¹ng b¶ng c¸c gi¸ trÞ thùc nghiÖm nh­ trong b¶ng 4.4.

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

Page 55: Giao trinh Fortran

115 116

7. HÖ sè nhít ph©n tö ( 11 −− ⋅⋅ scmg ) 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 ot 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:

....91

71

51

311

4+−+−=

π

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 )(xfx = b»ng ph­¬ng ph¸p lÆp Siedel. XÊp xØ ban ®Çu 0x 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Þ 0x tuú chän vµo biÓu thøc )(xf ë vÕ ph¶i cña ph­¬ng tr×nh )(xfx = ®Ó

tÝnh ra gi¸ trÞ −1x gäi lµ xÊp xØ bËc 1, sau ®ã kiÓm tra nÕu kh¸c nhau gi÷a 1x vµ 0x lín h¬n sai sè cho phÐp ε th× gi¸ trÞ 1x l¹i ®­îc thÕ vµo vÕ ph¶i vµ tiÕp tôc tÝnh 2x

(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 )(xfx = .

Page 56: Giao trinh Fortran

117 118

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 inc , lim , iniindn =

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Þ

Page 57: Giao trinh Fortran

119 120

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 incliminiindn , , =

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

15049 . . . 21

ii

®Ó 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

Page 58: Giao trinh Fortran

121 122

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 inciniind , , lim=

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

Page 59: Giao trinh Fortran

123 124

vµo bªn trong vßng DO.

11) Sè lÇn lÆp cã thÓ tÝnh b»ng c«ng thøc

1 inc

inilim +

-

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 5,4 3 2 +t trªn ®o¹n t tõ 1 ®Õn 10 víi b­íc 1 =∆t .

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è 1021 ..., , , bbb . 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 ib

2) 1max bb ←

3) víi i tõ 2 ®Õn 10 nÕu maxbbi > th× ibb ←max

4) in maxb

Tõ gi¶ tr×nh nµy dÔ dµng chuyÓn thµnh ch­¬ng tr×nh Fortran d­íi ®©y:

Page 60: Giao trinh Fortran

125 126

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 )(sin xy = t¹i .1 ...; ;2,0 ;1,0 ;0=x 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 .1 ...; ;2,0 ;1,0 ;0=x Khi ®ã )1( 1,0 −= ix .

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

Page 61: Giao trinh Fortran

127 128

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.

Page 62: Giao trinh Fortran

129 130

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

Page 63: Giao trinh Fortran

131 132

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:

. . .6321! 3

221! 21! 11! 0

=××==×=

==

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

eNNN

= 2 ! π

trong ®ã 718282,2=e . 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ø

Page 64: Giao trinh Fortran

133 134

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:

Page 65: Giao trinh Fortran

135 136

, 21sin

,cos

2tgtvh

tvd

−=

=

θ

θ

trong ®ã −g gia tèc träng lùc ( 2m/s 8,9 ). 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 yx mm , ,

ph­¬ng sai yx DD , , ®é lÖch b×nh ph­¬ng trung b×nh yx σσ , , hÖ sè t­¬ng quan r gi÷a hai ®¹i l­îng vµ lËp ph­¬ng tr×nh håi quy d¹ng:

bxay += ,

trong ®ã:

rax

y

σ

σ= , xy mamb −= ,

n

xm

n

ii

x

∑== 1 , 21

2

1 x

n

ii

x mn

xD −

−=

∑= , xx D=σ

n

ym

n

ii

y

∑== 1 , 21

2

1 y

n

ii

y mn

yD −

−=

∑= , xx D=σ

yx

yx

n

iii

mmn

yx

rσσ

−−=

∑=

11

.

6. ViÕt ch­¬ng tr×nh tÝnh trÞ gÇn ®óng cña tÝch ph©n

∫=b

a

xdxxI sin2

Page 66: Giao trinh Fortran

137 138

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 5,0=a vµ 5,1=b ):

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 acos víi ®é chÝnh x¸c tíi 0,0001 theo c«ng thøc khai triÓn sau ®©y:

...!6!4!2

1cos642

+−+−=

aaaa

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

Page 67: Giao trinh Fortran

139 140

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è cba ,, . 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,

Page 68: Giao trinh Fortran

141 142

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

Page 69: Giao trinh Fortran

143 144

§Ó 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

Page 70: Giao trinh Fortran

145 146

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.

Page 71: Giao trinh Fortran

147 148

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)

Page 72: Giao trinh Fortran

149 150

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 1<N 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

Page 73: Giao trinh Fortran

151 152

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

Page 74: Giao trinh Fortran

153 154

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

Page 75: Giao trinh Fortran

155 156

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.

Page 76: Giao trinh Fortran

157 158

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:

Page 77: Giao trinh Fortran

159 160

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

Page 78: Giao trinh Fortran

161 162

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.

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 07,331

=−+−− xee xx trong kho¶ng [0, 2] theo ph­¬ng ph¸p lÆp vµ

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:

nxxxnxxx

xxxxxx

xxxx

xx

cos...2coscossin...2sinsin ...

3cos2coscos3sin2sinsin

2coscos2sinsin

cossin

++++++

++++++

+++

+

Ch­¬ng 7

Sö dông biÕn cã chØ sè trong Fortran

Page 79: Giao trinh Fortran

163 164

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 mxxx ..., , , 21

mm xaxaxaay ++++= ...22110

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è 0a . 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

Page 80: Giao trinh Fortran

165 166

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

Page 81: Giao trinh Fortran

167 168

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.

Page 82: Giao trinh Fortran

169 170

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 )10..1,10..1( , == jia ji 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:

)24 ,1( SLEV ... )2 ,1( SLV)1 ,1( SLEV +++

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 3=n ,

tøc cã 3 dßng vµ 3 cét, sÏ lµ

100010001

.

§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

Page 83: Giao trinh Fortran

171 172

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)

Page 84: Giao trinh Fortran

173 174

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 mn × 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 mn × 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

Page 85: Giao trinh Fortran

175 176

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:

Page 86: Giao trinh Fortran

177 178

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

Page 87: Giao trinh Fortran

179 180

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

Page 88: Giao trinh Fortran

181 182

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

Page 89: Giao trinh Fortran

183 184

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

Page 90: Giao trinh Fortran

185 186

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:

)19..2( 3

YY ; 1ii1202011 =

++=== +− iYZYZ;YZ i

i

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,

Page 91: Giao trinh Fortran

187 188

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

Page 92: Giao trinh Fortran

189 190

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 '

Page 93: Giao trinh Fortran

191 192

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:

)(sin 0,5 gãc×××= 2 c¹nh1 c¹nhtÝch DiÖn .

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ö

Page 94: Giao trinh Fortran

193 194

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

Page 95: Giao trinh Fortran

195 196

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

22vk VVV += ,

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 nÕu nÕu nÕu

0,03600,01800,01800,0

kv

kv

kv

kv

VVVVVVVV

d

α

α

α

α

Page 96: Giao trinh Fortran

197 198

trong ®ã arctg k

v

VV

πα

180= .

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

Page 97: Giao trinh Fortran

199 200

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è

Page 98: Giao trinh Fortran

201 202

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

44

33

2210)( xaxaxaxaaxf ++++=

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

Page 99: Giao trinh Fortran

203 204

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

Page 100: Giao trinh Fortran

205 206

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.

Page 101: Giao trinh Fortran

207 208

* (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.

Page 102: Giao trinh Fortran

209 210

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:

424

22

321

sin321

9,6

yyy

yyyy

y

+++=

+++

+=

β

α

yyy

zzzzz

22

22

4

sin3sin21sin

1321

3,2

+++=

+++

+=

δ

γ

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

22 321 xxx +++ .

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

Page 103: Giao trinh Fortran

211 212

...!6!4!2

1cos642

+−+−=

xxxx

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 )(nx theo ®Þnh nghÜa:

- nÕu n lÎ trung vÞ b»ng

+1

2nx ,

- nÕu n ch½n trung vÞ b»ng 2

)12/()2/( ++ nxnx .

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

Page 104: Giao trinh Fortran

213 214

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

Page 105: Giao trinh Fortran

215 216

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:

xxx

n

ii

x

n

ii

x Dmn

xD

n

xm =−

−==

∑∑== σ , , 21

2

1

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)

Page 106: Giao trinh Fortran

217 218

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

Page 107: Giao trinh Fortran

219 220

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

Page 108: Giao trinh Fortran

221 222

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ñ

Page 109: Giao trinh Fortran

223 224

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)

Page 110: Giao trinh Fortran

225 226

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

Page 111: Giao trinh Fortran

227 228

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

) ..., ,1 ; ..., ,1( 1

,,, ljnibacm

kjkkiji === ∑

=

.

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

Page 112: Giao trinh Fortran

229 230

=+++

=+++=+++

..................

...

...

2211

22222121

11212111

nnnnnn

nn

nn

bxaxaxa

bxaxaxabxaxaxa

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

A x = b

trong ®ã

( )

==

...............

...

...

21

22221

11211

nnnn

n

n

ij

aaa

aaaaaa

aA ;

= ...

2

1

nb

bb

b ;

= ...

2

1

nx

xx

x .

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

Page 113: Giao trinh Fortran

231 232

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:

Page 114: Giao trinh Fortran

233 234

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:

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

HAY NHAP MOT NGAY TRONG TUAN 'CHU NHAT' ↵ NGAY VUA NHAP LA CHU NHAT

Page 115: Giao trinh Fortran

235 236

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:

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

HAY NHAP MOT NGAY TRONG TUAN 'CHU NHAT' CHU NHAT LA NGAY VUA NHAP

Page 116: Giao trinh Fortran

237 238

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'

Page 117: Giao trinh Fortran

239 240

'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Ï

Page 118: Giao trinh Fortran

241 242

®Õ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

Page 119: Giao trinh Fortran

243 244

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:) , ' ')

Page 120: Giao trinh Fortran

245 246

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

Page 121: Giao trinh Fortran

247 248

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

Page 122: Giao trinh Fortran

249 250

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.

Page 123: Giao trinh Fortran

251 252

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:

Page 124: Giao trinh Fortran

253 254

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

Page 125: Giao trinh Fortran

255 256

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.

Page 126: Giao trinh Fortran

257 258

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

. . .

. . .

Page 127: Giao trinh Fortran

259 260

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)

Page 128: Giao trinh Fortran

261 262

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)

Page 129: Giao trinh Fortran

263 264

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)

Page 130: Giao trinh Fortran

265 266

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

Page 131: Giao trinh Fortran

267 268

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

ChØ ®Þnh truy vÊn KiÓu biÕn Gi¸ trÞ truy vÊn file FILE

Gi¸ trÞ truy vÊn ®¬n vÞ file UNIT

ACCESS = CHARACTER 'SEQUENTIAL' 'DIRECT'

'SEQUENTIAL' 'DIRECT'

BLANK = CHARACTER 'NULL' 'ZERO'

'NULL' 'ZERO'

DIRECT = CHARACTER 'YES' 'NO'

_

ERR = INTEGER Sè hiÖu lÖnh xö lý lçi Sè hiÖu lÖnh xö lý lçi

EXIST = LOGICAL .TRUE. .FALSE.

.TRUE. .FALSE.

FORM = CHARACTER 'FORMATTED'

'UNFORMATTED'

'FORMATTED'

'UNFORMATTED'

Page 132: Giao trinh Fortran

269 270

FORMATTED = CHARACTER 'YES' '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

NAMED + = LOGICAL _ .TRUE. .FALSE.

NEXTREC = INTEGER Sè hiÖu b¶n ghi tiÕp theo trong file truy

cËp trùc tiÕp

Sè hiÖu b¶n ghi tiÕp theo trong file truy cËp trùc tiÕp

NUMBER + = INTEGER §¬n vÞ file −

OPEND = LOGICAL .TRUE. .FALSE.

.TRUE. .FALSE.

RECL = INTEGER §é dµi b¶n ghi §é dµi b¶n ghi

SEQUENTIAL = CHARACTER 'YES' 'NO'

'UNKNOWN' −

UNFORMATTED = CHARACTER

'YES'

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

Page 133: Giao trinh Fortran

271 272

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.

Page 134: Giao trinh Fortran

273 274

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

Page 135: Giao trinh Fortran

275 276

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è ][ jiaA = lµ ma trËn ®èi xøng, tøc ) ..., ,2 ,1,( njiaa jiij == .

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

Page 136: Giao trinh Fortran

277 278

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 с

Page 137: Giao trinh Fortran

279 280

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

Page 138: Giao trinh Fortran

281 282

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 Xe DEXP (DX) §é chÝnh x¸c ®«i DXe

CEXP (CX) Phøc CXe

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

LOG (GX) KiÓu theo GX GXelog

ALOG (X) Thùc Xelog

DOG (GX) §é chÝnh x¸c ®«i DXelog

CLOG (CX) Phøc CXelog

LOG10 (GX) KiÓu theo GX GX10log

ALOG10 (X) Thùc X10log

DLOG10 (DX) §é chÝnh x¸c ®«i DX10log

Page 139: Giao trinh Fortran

283 284

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, ...)

Page 140: Giao trinh Fortran

285 286

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 Xsin (X - ra®ian)

DSIN (DX) §é chÝnh x¸c ®«i DXsin (DX - ra®ian)

CSIN (CX) Phøc CXsin

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

DCOS (DX) §é chÝnh x¸c ®«i DXcos (DX - ra®ian)

CCOS (CX) Phøc CXcos

TAN (X) Thùc Xtg (X - ra®ian)

DTAN (DX) §é chÝnh x¸c ®«i DXtg (DX - ra®ian)

ASIN (X) Thùc Xarcsin

DASIN (X) §é chÝnh x¸c ®«i DXarcsin

ACOS (X) Thùc Xarccos

DACOS (DX) §é chÝnh x¸c ®«i DXarccos

ATAN (X) Thùc Xarctg

DATAN (DX) §é chÝnh x¸c ®«i DXarctg

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

ATAN2 (X,Y) Thùc )/( arctg YX

DATAN2 (DX,DY) §é chÝnh x¸c ®«i )/( arctg DYDX

SINH (X) Thùc Xsh

DSINH (DX) §é chÝnh x¸c ®«i DXsh

COSH (X) Thùc Xch

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

TANH (X) Thùc X th

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

Page 141: Giao trinh Fortran

287 288

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 iX 0+

CMPLX (X, Y) Phøc YiX +

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, bia −

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

CHAR (IX) Ký tù Ký tù øng víi vÞ trÞ thø IX trong chuçi so s¸nh

ICHAR (CHX) Nguyªn VÞ trÝ cña ký tù CHX trong chuçi so s¸nh

LGE (CHX, CHY) L«gic Gi¸ trÞ cña biÓu thøc (CHX lín h¬n hoÆc b»ng CHY vÒ tõ vùng)

LGT (CHX, CHY) L«gic Gi¸ trÞ cña biÓu thøc (CHX lín h¬n CHY vÒ tõ vùng)

LLE (CHX, CHY) L«gic Gi¸ trÞ cña biÓu thøc (CHX nhá h¬n hoÆc b»ng CHY vÒ tõ vùng)

LLT (CHX, CHY) L«gic Gi¸ trÞ cña biÓu thøc (CHX nhá h¬n 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

=+++

=+++=+++

nnnnnn

nn

nn

bxaxaxa

bxaxaxabxaxaxa

..................

...

...

2211

22222121

11212111

Page 142: Giao trinh Fortran

289 290

hay A x = b (*)

( )

==

nnnn

n

n

ij

aaa

aaaaaa

aA

...............

...

...

21

22221

11211

;

=

nb

bb

b...

2

1

;

=

nx

xx

x...

2

1

.

NÕu ma trËn A kh«ng suy biÕn, tøc

0 ≠=

nnnn

n

n

aaa

aaaaaa

A

...............

...

...

det

21

22221

11211

th× hÖ (*) cã nghiÖm duy nhÊt. Cã thÓ tÝnh nghiÖm theo c«ng thøc Cramer

AAx i

i

detdet

= ,

trong ®ã −iA 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Ö

=+++=+++=+++

=+++

45444343242141

35434333232131

25424323222121

15414313212111

axaxaxaxaaxaxaxaxaaxaxaxaxa

axaxaxaxa

(1)

Gi¶ sö phÇn tö chÝnh 011 ≠a . Chia ph­¬ng tr×nh thø nhÊt cho 11a , ta cã

154143132121 bxbxbxbx =+++ , (2)

Page 143: Giao trinh Fortran

291 292

víi )5,4,3,2(11

11 == j

aa

b jj .

Dïng ph­¬ng tr×nh (2) ®Ó lo¹i Èn 1x 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 413121 , , aaa 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(454

)1(443

)1(432

)1(42

)1(354

)1(343

)1(332

)1(32

)1(254

)1(243

)1(232

)1(22

axaxaxaaxaxaxaaxaxaxa

(3)

trong ®ã

)5,4,3,2;4,3,2(11)1( ==−= jibaaa jiijij (4)

B©y giê chia ph­¬ng tr×nh thø nhÊt cña hÖ (3) cho phÇn tö chÝnh )1(

22a ta cã:

)1(254

)1(243

)1(232 bxbxbx =++ , (5)

trong ®ã

)543()1(22

)1(2)1(

2 , , jaa

b jj == .

B»ng c¸ch t­¬ng tù nh­ khi lo¹i 1x , b©y giê ta lo¹i 2x khái c¸c ph­¬ng tr×nh thø ba vµ thø t­, ta cã:

=+

=+)2(

454)2(

443)2(

43

)2(354

)2(343

)2(33

axaxa

axaxa . (6)

trong ®ã

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

)1(2

)1()2( ==−= jibaaa jiijij . (7)

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

)2(354

)2(343 bxbx =+ , (8)

Page 144: Giao trinh Fortran

293 294

trong ®ã

)5,4()2(33

)2(3)2(

3 == jaa

b jj .

Sau ®ã nhê (8) ta lo¹i 3x khái ph­¬ng tr×nh thø hai cña hÖ (6), nhËn ®­îc:

)3(454

)3(44 axa =

trong ®ã

)5 ,4( )2(3

)2(43

)2(4

)3(4 =−= jbaaa jjj (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

=

=+

=++

=+++

)3(454

)3(44

)2(354

)2(343

)1(254

)1(243

)1(232

154143132121

axabxbxbxbxbxbxbxbxbx

(10)

Tõ (10) x¸c ®Þnh c¸c Èn

−−−=

−−=

−=

=

bxbxbxbx bxbxbx bxbx aax

)()()(

)()(

)()(

122133144151

1233

1244

1252

2344

2353

344

3454

(11)

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

Page 145: Giao trinh Fortran

295 296

)1(3

)2()1(2−+

++= nnnnnN

.

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

A x = 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Þ

TTA ′= (13)

trong ®ã

=′

=

nnnnnn

n

n

ttt

ttt

T,

t

ttttt

T

...............0...0...

...00............

...0

...

21

2212

11

222

11211

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ö ijt :

jikhit

jit

ttat

nitat

jta

tat

ij

ii

i

kkjkiij

ij

i

kkiiiii

jj

>=

<−

=

≤<−=

>==

∑−

=

=

0

)(

)1(

)1(,

1

1

1

1

2

11

111111

(14)

Nh­ vËy ta ®· thay hÖ (12) b»ng hai hÖ t­¬ng ®­¬ng

T' y = b, T x = y 15)

hay

Page 146: Giao trinh Fortran

297 298

=+++

=+=

nnnnnn bytytyt

bytytbyt

...........................

2211

2222112

1111

(16)

=

=++

=+++

nnnn

nn

nn

yxt

yxtxtyxtxtxt

................................

22222

11212111

(17)

Tõ ®ã suy ra c¸c c«ng thøc tÝnh:

)1(,

1

1

11

11 >

−==

∑−

= it

ytby

tby

ii

i

kkkii

i (18) )(, 1 nit

xtyx

tyx

ii

n

ikkiki

inn

nn <

−==

∑+= (19)

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

Page 147: Giao trinh Fortran

299 300

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

baxxfy +== )( .

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

kkk baxyE

1

2)(

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

kkk

n

kk

n

kk yxxbxa

111

2,

∑∑==

=+n

kk

n

kk ynbxa

11 .

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

∑∑

∑∑∑

==

===

−= n

kk

n

kk

n

kkk

n

kk

n

kk

xnx

yxnyxa

1

22

1

111

)(

(20)

∑∑

∑∑∑∑

==

====

−= n

kk

n

kk

n

kk

n

kk

n

kkk

n

kk

xnx

yxyxxb

1

22

1

11

2

11

)(

, (21)

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

n

xayb

n

kk

n

kk ∑∑

==

−= 11

. (22)

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

Page 148: Giao trinh Fortran

301 302

mn xaxaxaaxf ++++= ...)( 2

210 .

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

2210)( xaxaaxf ++= .

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

kkk

n

k

n

kkk

n

kk

n

kkk

n

k

n

kkk

n

kk

n

kk

n

kk

n

kk

yxxaxaxa

yxxaxaxa

ynaxaxa

1

2

1 1

20

31

1

42

11 10

21

1

32

1101

1

22

(23)

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µ

axbxf )( = (24)

NÕu lÊy loga hai vÕ cña ph­¬ng tr×nh nµy, ta cã

bxaxf lnln)(ln += . (25)

NÕu ký hiÖu

)(ln)( xfxg = (26)

bb ln~= (27)

xx ln~ = (28)

Page 149: Giao trinh Fortran

303 304

yy ln~ = (29)

ta cã

bxaxg ~~)( += (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

kk

n

kk

n

kkk

n

kk

n

kk

xnx

yxnyxa

1

22

1

111

~ )~(

~~ ~ ~

(31)

∑∑

∑∑∑∑

==

====

−= n

kk

n

kk

n

kk

n

kk

n

kkk

n

kk

xnx

yxyxxb

1

22

1

11

2

11

~ )~(

~ ~ ~~ ~~

(32)

VËy c«ng viÖc tÝnh to¸n gåm: chuyÓn ®æi c¸c gi¸ trÞ sè liÖu kx vµ ky 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).

Page 150: Giao trinh Fortran

305 306

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 mxxx ..., , , 21 . Ph­¬ng tr×nh håi quy ®­îc thiÕt lËp nh­ sau:

mm xaxaxaay ++++= ...22110 .

C¸c hÖ sè håi quy ),...,1( miai = ®­îc chän sao cho tho¶ m·n

( )∑=

=−−−−−=n

imm xaxaxaay

1

222110 min...δ

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

[ ] [ ] [ ] [ ][ ] [ ] [ ] [ ] [ ][ ] [ ] [ ] [ ] [ ]

[ ] [ ] [ ] [ ] [ ]mmmmmmm

mm

mm

mm

yxaxxaxxaxxax

yxaxxaxxaxxaxyxaxxaxxaxxaxyaxaxaxna

=++++

=++++=++++=++++

.....................

...

...

...

22110

2222212102

1121211101

22110

(33)

Page 151: Giao trinh Fortran

307 308

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:

[ ] [ ] [ ][ ] [ ] [ ] [ ][ ] [ ] [ ] [ ]

[ ] [ ] [ ] [ ]

=

mmmmmmm

m

m

m

b

bbb

a

aaa

xxxxxxx

xxxxxxxxxxxxxx

xxxn

.......

..................

...

...

...

2

1

0

2

1

0

21

222212

112111

21

(34)

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

1.

§Ó t×m c¸c hÖ sè håi quy maaaa ,...,,, 210 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

Page 152: Giao trinh Fortran

309 310

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

Page 153: Giao trinh Fortran

311 312

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