intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Lập trình bằng Turbo Pascal part 5

Chia sẻ: Ashfjshd Askfaj | Ngày: | Loại File: PDF | Số trang:28

106
lượt xem
34
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Assign (F, 'Nguyen .Dat'); Sz:= FileSize (F) ; sẽ nhận được Sz = 100. Ví dụ: L−u ý: Có thể dùng hμm nμy kết hợp với thủ tục Seek để viết nối thêm vào cuối một tệp. (Tác dụng giống như lệnh Append vào cuối tệp kiểu văn bản) Seek( biến tệp , FileSize( biến tệp )) ; Write( biến tệp, biểu thức 1, ... , biểu thức n ); - FilePos ( biến tệp ): LongInt; Hàm cho biết vị trí hiện tại của cửa sổ tệp. Phần tử đầu tiên ở vị trí 0. Ví dụ: Assign(F, 'Nguyen.Dat')...

Chủ đề:
Lưu

Nội dung Text: Lập trình bằng Turbo Pascal part 5

  1. LËp tr×nh b»ng Turbo Pascal Assign (F, 'Nguyen .Dat'); VÝ dô: Sz:= FileSize (F) ; sÏ nhËn ®−îc Sz = 100. L−u ý: Cã thÓ dïng hμm nμy kÕt hîp víi thñ tôc Seek ®Ó viÕt nèi thªm vμo cuèi mét tÖp. (T¸c dông gièng nh− lÖnh Append vμo cuèi tÖp kiÓu v¨n b¶n) Seek( biÕn tÖp , FileSize( biÕn tÖp )) ; Write( biÕn tÖp, biÓu thøc 1, ... , biÓu thøc n ); - FilePos ( biÕn tÖp ): LongInt; Hμm cho biÕt vÞ trÝ hiÖn t¹i cña cöa sæ tÖp. PhÇn tö ®Çu tiªn ë vÞ trÝ 0. VÝ dô: Assign(F, 'Nguyen.Dat') Reset(F); {sÏ cho I = 0 } I:= FilePos(F); - Erase ( biÕn tÖp ) ; Thñ tôc xo¸ tÖp. VÝ dô: Assign(F, 'Nguyen .Dat'); Erase(F) - Rename ( biÕn tÖp , tªn míi ) ; Thñ tôc ®æi tªn tÖp thμnh tªn míi. Tªn míi nμy ph¶i kh«ng ®−îc trïng víi tªn c¸c tÖp ®· cã trong cïng th− môc. VÝ dô: Assign(F, 'Nguyen .Dat') Rename( F, ' So1_100. Int' ) ; 3.2 BÉy lçi khi më tÖp. 3.2.1 §Æt vÊn ®Ò Khi thùc hiÖn thao t¸c më tÖp ®Ó ®äc / ghi cã thÓ bÞ lçi nÕu: - më tÖp ch−a tån t¹i trªn ®Üa, tªn sai ... - hÕt chç trªn ®Üa ®Ó ghi thªm vμo tÖp. TurboPascal cung cÊp chØ thÞ ®Ó tr×nh biªn dÞch thªm c¸c m· lÖnh thùc hiÖn kiÓm tra lçi trong qu¸ tr×nh thùc hiÖn ®äc / ghi tÖp mμ d−íi ®©y sÏ gäi ng¾n gän lμ chØ thÞ kiÓm tra I/O. { $ I + }: bËt (më) viÖc kiÓm tra I/O. NÕu gÆp lçi I/O ch−¬ng tr×nh sÏ b¸o lçi vμ dõng l¹i. §©y lμ chÕ ®é mÆc ®Þnh. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 105
  2. LËp tr×nh b»ng Turbo Pascal { $ I - }: t¾t viÖc kiÓm tra I/O. Ch−¬ng tr×nh kh«ng dõng dï cã lçi I/O. Tuy nhiªn nã sÏ bá qua (treo, t¹m dõng) tÊt c¶ c¸c thñ tôc vμo/ra sau ®ã cho ®Õn khi gÆp lêi gäi hμm IOResult. IOResult lμ hμm tr¶ vÒ m· lçi khi thùc hiÖn c¸c thao t¸c ®äc ghi ra ®Üa. NÕu c«ng viÖc thμnh c«ng th× m· lçi lμ 0. Tr¸i l¹i, m· lçi lμ mét sè kh¸c kh«ng. Sö dông c¬ chÕ kiÓm tra I/O cã thÓ thùc hiÖn viÖc bÉy lçi khi më tÖp, nhÊt lμ tiÕn hμnh më tÖp míi an toμn, tr¸nh viÖc v« t×nh xo¸ mÊt tÖp cïng tªn khi më tÖp míi ®Ó viÕt vμo b»ng thñ tôc Rewrite. 3.2.2 C¸c b−íc ®Ó më tÖp an toμn. T¾t chÕ ®é kiÓm tra vμ thö më tÖp ra ®Ó ®äc. Gäi hμm IOResult. NÕu IOResult b»ng 0, nghÜa lμ më tÖp thμnh c«ng tøc lμ ®· cã tÖp cïng tªn. CÇn th«ng b¸o cho ng−êi dïng biÕt ®Ó xö lÝ, nhËp l¹i tªn kh¸c ch¼ng h¹n. NÕu IOResult kh¸c kh«ng nghÜa lμ ch−a cã tÖp nμo cã tªn nh− thÕ. Cã thÓ yªn t©m t¹o tÖp b»ng lÖnh Rewrite. 3.2.3 VÝ dô minh ho¹. Assign( biÕn tÖp , tªn tÖp); {$I-} Reset( biÕn tÖp ); {$I+} If IOResult 0 then {kh«ng cã tÖp nμo trïng tªn} Begin Writeln(' Ban muon tao tep moi ? Enter=Yes '); if ReadKey = #13 then Rewrite( biÕn tÖp ) else exit; end; Else Begin Writeln(' Da co tep trung ten '); .... End; ViÖc t¾t chÕ ®é kiÓm tra I/O b»ng chØ thÞ {$I-} tr−íc c©u lÖnh Reset lμ ®Ó tr¸nh b¸o lçi vμ dõng ch−¬ng tr×nh theo mÆc ®Þnh khi më tÖp ch−a cã trªn ®Üa. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 106
  3. LËp tr×nh b»ng Turbo Pascal 4. TÖp v¨n b¶n. 4.1 §Þnh nghÜa vµ cÊu tróc. TÖp v¨n b¶n lμ mét kiÓu tÖp phæ biÕn, ®· ®−îc ®Þnh nghÜa s½n, ®Ó l−u tr÷ xö lÝ c¸c "v¨n b¶n". Kh¸i niÖm “v¨n b¶n” ë ®©y kh¸c víi kh¸i niÖm v¨n b¶n th«ng th−êng trong c¸c phÇn mÒm xö lÝ v¨n b¶n. “V¨n b¶n” ë ®©y chØ gåm c¸c kÝ tù ASCII vμ ®−îc ph©n thμnh c¸c dßng. Ngoμi ra, kh«ng cã bÊt cø ®Þnh d¹ng nμo kh¸c vÒ tr×nh bμy nh− cì ch÷, kiÓu ch÷, mμu s¾c, v.v. 4.1.1 Có ph¸p. KiÓu tÖp v¨n b¶n ®· ®−îc ®Þnh nghÜa s½n víi tªn chuÈn lμ Text. Ta kh«ng cÇn ph¶i khai b¸o kiÓu. Có ph¸p khai b¸o biÕn tÖp v¨n b¶n: Var biÕn tÖp: Text ; VÝ dô. VAR F1, F2 : Text ; 4.1.2 CÊu tróc . Thμnh phÇn chÝnh cña tÖp v¨n b¶n lμ c¸c kÝ tù ASCII. Tuy nhiªn, tÖp v¨n b¶n ®−îc chia thμnh c¸c dßng. §¸nh dÊu hÕt dßng b»ng dÊu Eoln (end of line). §ã lμ cÆp kÝ tù CR (cariage return) - nh¶y vÒ ®Çu dßng, m· ascii lμ 13 - vμ LF (line feed) - nh¶y xuèng dßng d−íi, m· ascii lμ 10. DÊu hÕt tÖp Eof ®èi víi tÖp v¨n b¶n lμ Ctrl-Z cã m· ascii lμ 26. Trong m«i tr−êng DOS cã thÓ dïng lÖnh Type ®Ó hiÓn thÞ néi dung cña tÖp v¨n b¶n lªn mμn h×nh. TÖp v¨n b¶n kh«ng ph¶i lμ tÖp c¸c kÝ tù File of Char. File of Char kh¸c víi tÖp kiÓu Text ë chç nã kh«ng nhËn biÕt cÆp kÝ tù CR, LF nh− dÊu hÕt dßng mμ coi nh− hai kÝ tù ascii b×nh th−êng. VÝ dô. TÖp TieuDe.txt chøa ba dßng CH XHCN VIETNAM Doc lap - Tu do - Hanh phuc ***** Néi dung cña tÖp lμ d·y kÝ tù liªn tiÕp nh− sau CH XHCN VIETNAM CR LF Doc lap - Tu do - Hanh phuc CR LF ***** EOF NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 107
  4. LËp tr×nh b»ng Turbo Pascal 4.2 ViÕt ra tÖp v¨n b¶n Cã thÓ ghi c¸c gi¸ trÞ kiÓu nguyªn, thùc, logic, x©u kÝ tù ra tÖp v¨n b¶n b»ng c¸c lÖnh Write. C¸c thñ tôc Write viÕt ra tÖp v¨n b¶n sÏ tù ®éng tÝnh c¸c biÓu thøc vμ chuyÓn ®æi c¸c gi¸ trÞ sang d¹ng biÓu diÔn x©u kÝ tù th«ng th−êng ®Ó cã thÓ ghi vμo tÖp v¨n b¶n. Write ( biÕn tÖp , biÓu thøc 1, biÓu thøc 2 , ... , biÓu thøc n ) ; Writeln ( biÕn tÖp , biÓu thøc 1, biÓu thøc 2 , ... , biÓu thøc n ); Writeln ( biÕn tÖp ); Sau c¸c biÓu thøc cã thÓ kÌm phÇn ®Þnh d¹ng (quy c¸ch) in ra. T¸c dông cña c¸c c©u lÖnh trªn hoμn toμn t−¬ng tù nh− trong tr−êng hîp xuÊt ra mμn h×nh ®· tr×nh bμy ë Ch−¬ng 3. ChØ kh¸c lμ ë ®©y kh«ng ph¶i in ra mμn h×nh mμ lμ viÕt ra tÖp v¨n b¶n øng víi biÕn tÖp. VÒ b¶n chÊt, mμn h×nh còng gièng nh− mét tÖp v¨n b¶n. VÝ dô. F: TEXT; i,j: Integer; X: Real; B: Boolean; St: String [8]; Write(F, (i+ j):5, 3*X:0:2, St:10, ' The End '); 4.3 §äc vµo tõ mét tÖp v¨n b¶n. 4.3.1 Có ph¸p. C¸c thñ tôc Read quen biÕt cã thÓ ®äc tõ tÖp v¨n b¶n råi g¸n cho c¸c biÕn kh«ng nh÷ng c¸c kÝ tù mμ c¶ c¸c kiÓu d÷ liÖu kh¸c n÷a: sè nguyªn, thùc, logic .... Thñ tôc Read sÏ tù ®éng chuyÓn ®æi c¸c x©u kÝ tù biÓu diÔn d÷ liÖu thμnh gi¸ trÞ cã kiÓu t−¬ng øng cña biÕn sÏ ®−îc g¸n Read ( biÕn tÖp , biÕn 1 , biÕn 2 , ... , biÕn n ); Readln ( biÕn tÖp , biÕn 1 , biÕn 2 , ... , biÕn n ) ; Readln ( biÕn tÖp ); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 108
  5. LËp tr×nh b»ng Turbo Pascal T¸c dông: hoμn toμn gièng nh− c¸c lÖnh ®äc d÷ liÖu tõ bμn phÝm ®· quen biÕt, chØ kh¸c lμ ë ®©y kh«ng ph¶i nhËp d÷ liÖu tõ bμn phÝm mμ c¸c môc d÷ liÖu ®· viÕt s½n trong tÖp v¨n b¶n øng víi biÕn tÖp. Tuú theo kiÓu cña biÕn i mμ lÖnh Read thùc hiÖn ®äc mét d·y kÝ tù tõ tÖp v¨n b¶n, chuyÓn ®æi nã thμnh mét gi¸ trÞ trùc tiÕp thuéc kiÓu d÷ liÖu cña biÕn i vμ g¸n cho biÕn nμy. Quy ®Þnh vÒ ph©n c¸ch c¸c môc d÷ liÖu kiÓu sè, kiÓu kÝ tù, kiÓu x©u kÝ tù ®· ®−îc tr×nh bμy chi tiÕt trong Ch−¬ng 3. 4.3.2 VÝ dô . D−íi ®©y lμ ®o¹n ch−¬ng tr×nh minh ho¹ quy c¸ch ®äc vμo tõ tÖp v¨n b¶n. KÕt qu¶ thùc hiÖn c¸c thñ tôc Read ®−îc viÕt trong phÇn chó thÝch sau mçi c©u lÖnh. §Çu vμo cña ch−¬ng tr×nh lμ tÖp vanban.txt cã néi dung nh− h×nh sau 1.5 2 -3.2 abcdefg hiklm var f: text; x: real; i: integer; s1,s2,s3: string[5]; S : string; begin assign(f,'vanban.txt'); reset(f); read(f,x); { x:= 1.5 } read(f,i); { i:= 2 } readln(f,x); { x:= -3.2 vμ xuèng dßng} read(f,s1); { s1:= 'abcde' } read(f,S); { S:= 'fg hiklm' , kh«ng xuèng dßng} read(f,s2); { s2:= '' x©u rçng } readln(f); read(f,s3); { s3:= 'nnnnn' } ... end. 4.4 C¸c hµm, thñ tôc chuÈn kh¸c cho tÖp v¨n b¶n C¸c thñ tôc Seek, FileSize, FilePos kh«ng ¸p dông ®−îc cho tÖp v¨n b¶n v× tÖp v¨n b¶n cã cÊu tróc lμ d·y c¸c dßng kÝch th−íc (®é dμi) kh¸c nhau. D−íi ®©y lμ c¸c hμm thñ tôc ¸p dông cho tÖp Text. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 109
  6. LËp tr×nh b»ng Turbo Pascal - Eof( biÕn tÖp ): boolean ; KiÓm tra ®· ë cuèi tÖp ch−a. - Eoln ( biÕn tÖp ): boolean ; KiÓm tra ®· ë cuèi dßng ch−a. - Append ( biÕn tÖp ); Më tÖp v¨n b¶n ®Ó viÕt vμo, cña sæ tÖp ®Æt t¹i cuèi tÖp. - SeekEoln( biÕn tÖp ): boolean ; T−¬ng tù nh− Eoln nh−ng tr−íc khi kiÓm tra nã nh¶y qua c¸c dÊu c¸ch vμ dÊu Tab. SeekEoln cho kÕt qu¶ True nÕu trªn phÇn cßn l¹i cña dßng, kÓ tõ vÞ trÝ hiÖn t¹i, kh«ng cßn môc d÷ liÖu nμo n÷a. - SeekEof( biÕn tÖp ): boolean ; T−¬ng tù nh− Eof nh−ng tr−íc khi kiÓm tra nã nh¶y qua c¸c dÊu c¸ch, dÊu Tab vμ dÊu xuèng dßng. SeekEof cho kÕt qu¶ True nÕu tõ vÞ trÝ hiÖn t¹i ®Õn cuèi tÖp kh«ng cßn môc d÷ liÖu nμo n÷a. - Flush( biÕn tÖp ); X¶ hÕt néi dung bé ®Öm cña mét tÖp kiÓu v¨n b¶n ®ang ®−îc më ®Ó viÕt vμo. F lμ mét biÕn kiÓu tÖp v¨n b¶n Text, ®−îc më b»ng Rewrite hoÆc Append ®Ó viÕt ra. Khi ®ã lêi gäi Flush sÏ x¶ hÕt phÇn néi dung cßn ®äng trong bé ®Öm, viÕt nèt ra tÖp F. Thñ tôc nμy ®−îc dïng ®Ó ®¶m b¶o r»ng mäi lÖnh viÕt ra tÖp F ®Òu ®−îc thùc hiÖn trän vÑn, kh«ng bá sãt d÷ liÖu. Flush kh«ng cã t¸c dông nÕu tÖp F ®ù¬c më ®Ó ®äc. - SetTextBuf( biÕn tÖp, vïng ®Öm, kÝch th−íc ); G¸n mét vïng ®Öm I/O cho tÖp v¨n b¶n. Tham biÕn Vïng ®Öm lμ mét vïng trong bé nhí dïng lμm trung gian, t¹m chøa d÷ liÖu trong c¸c thao t¸c truy cËp ®äc ra hoÆc viÕt vμo tÖp trªn æ ®Üa. Tham trÞ kÝch th−íc lμ tuú chän, cã thÓ kh«ng cã mÆt. Thñ tôc nμy th−êng dïng ®Ó t¨ng kÝch th−íc vïng ®Öm nh»m ®Èy nhanh tèc ®é trao ®æi d÷ liÖu víi æ ®Üa. Ta ®· biÕt tèc ®é truy cËp ®Üa chËm h¬n nhiÒu so víi truy cËp bé nhí trong. NÕu cã mét vïng ®Öm th× c¸c thao t¸c xö lÝ ®äc / viÕt t¹m ra ®©y. Khi ®Çy vïng ®Öm míi tiÕn hμnh thao t¸c ®äc / viÕt thùc sù ra ®Üa, kh«ng lμm l¾t nh¾t nhiÒu lÇn. SetTextBuf kh«ng nªn gäi cho tÖp ®ang më vμ ®· cã thao t¸c trao ®æi d÷ liÖu. Nã cã thÓ ®−îc gäi ngay sau Reset, Rewrite, hay Append. NÕu gäi SetTextBuf cho tÖp ®ang më th× khi cã thao t¸c I/O , cã thÓ bÞ mÊt d÷ liÖu do kÝch th−íc cña vïng ®Öm thay ®æi. VÝ dô. Minh ho¹ c¸ch dïng SetTextBuf NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 110
  7. LËp tr×nh b»ng Turbo Pascal var F: Text; Ch: Char; Buf: array[1..4095] of Char; { 4K buffer } begin {LÊy tªn tÖp tõ tham sè dßng lÖnh} Assign(F, ParamStr(1)); {T¨ng bé ®Öm lín ®Ó ®äc nhanh} SetTextBuf(F, Buf); Reset(F); {§−a toμn bé néi dung tÖp v¨n b¶n ra mμn h×nh} while not Eof(f) do begin Read(F, Ch); Write(Ch); end; end. 4.5 C¸c thiÕt bÞ vµo ra chuÈn Bμn phÝm vμ mμn h×nh lμ c¸c thiÕt bÞ vμo / ra chuÈn nh− ®−îc coi nh− tÖp v¨n b¶n, cã thÓ sö dông mμ kh«ng cÇn khai b¸o. OUTPUT Lμ tÖp xuÊt chuÈn, ®−îc tù ®éng g¾n cho mμn h×nh. NÕu trong c¸c c©u lÖnh Write kh«ng chØ râ biÕn tÖp th× cã nghÜa lμ sö dông tÖp xuÊt chuÈn Output. §ã lμ lÝ do t¹i sao khi in ra mμn h×nh cã thÓ bá qua thμnh phÇn biÕn tÖp. C©u lÖnh cã d¹ng Write ( biÓu thøc 1, biÓu thøc 2 , ... , biÎu thøc n ) ; INPUT Lμ tÖp vμo chuÈn, ®−îc tù ®éng g¾n cho bμn phÝm. T−¬ng tù nh− víi lÖnh xuÊt ra, nÕu trong c¸c c©u lÖnh Read kh«ng chØ râ biÕn tÖp th× cã nghÜa lμ sö dông tÖp vμo chuÈn. LST lμ tÖp xuÊt g¾n víi m¸y in. §Ó in ra m¸y in tõ trong mét ch−¬ng tr×nh Pascal cÇn chØ râ biÕn tÖp b©y giê lμ m¸y in. Write (LST, biÓu thøc 1, biÓu thøc 2 , ... , biÎu thøc n ) ; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 111
  8. LËp tr×nh b»ng Turbo Pascal 5. TÖp kh«ng ®Þnh kiÓu . 5.1 §Þnh nghÜa vµ cÊu tróc. TÖp kh«ng ®Þnh kiÓu - Untyped File - lμ tÖp kh«ng ®Þnh râ kiÓu cña phÇn tö khi khai b¸o, coi d÷ liÖu chÝnh lμ c¸c m· nhÞ ph©n 0,1 kh«ng cÇn biÕt nã biÓu thÞ c¸i g×. §¬n vÞ xö lÝ lμ tõng khèi bÝt, cã kÝch th−íc do ta quy ®Þnh, gäi lμ c¸c Record. L−u ý r»ng record ë ®©y kh«ng ph¶i lμ kiÓu b¶n ghi nh− ®· biÕt. TÖp kh«ng ®Þnh kiÓu chñ yÕu dïng ®Ó t¨ng tèc ®é thao t¸c vμo ra d÷ liÖu. Có ph¸p. Khai b¸o: dïng tõ kho¸ FILE Var biÕn tÖp : File ; Truy cËp: C¸c thñ tôc Reset, Rewrite ®èi víi tÖp kh«ng ®Þnh kiÓu cÇn cã thªm tham trÞ kich th−íc Rec. Tham trÞ kÝch th−íc Rec lμ mét sè nguyªn (kiÓu Word) ®Ó Ên ®Þnh kÝch th−íc cña khèi d÷ liÖu ®¬n vÞ (record) trong c¸c thao t¸c tÖp. KÝch th−íc nμy tÝnh theo byte. Reset ( biÕn tÖp , kÝch th−íc Rec ); Rewrite ( biÕn tÖp , kÝch th−íc Rec ); VÝ dô. ®äc ra tõng khèi 4 byte mét. Reset(F,4); viÕt vμo tõng khèi 2 byte mét. Rewrite(F,2); NÕu tham sè nμy kh«ng cã mÆt th× record cã kÝch th−íc mÆc ®Þnh lμ 128 byte. 5.2 C¸c hµm, thñ tôc kh¸c. Ngoμi ra, ®Ó t¨ng nhanh tèc ®é xuÊt nhËp d÷ liÖu, cßn cã hai thñ tôc dμnh riªng cho tÖp kh«ng ®Þnh kiÓu lμ BlockRead vμ BlockWrite. BlockRead( biÕn tÖp , vïng ®Öm , sè Rec , kÕt qu¶ ); Vïng ®Öm: vïng ®Öm trong bé nhí, lμ mét tham biÕn, n¬i chøa d÷ liÖu ®äc vμo S« Rec : tham trÞ kiÓu Word, lμ sè khèi dù ®Þnh ®äc. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 112
  9. LËp tr×nh b»ng Turbo Pascal KÕt qu¶ : tham biÕn kiÓu Word, lμ sè khèi thùc ®äc ®−îc. T¸c dông. BlockRead ®äc mét l−îng sè Rec khèi bit tõ tÖp øng víi biÕn tÖp råi ghi vμo bé nhí, b¾t ®Çu tõ byte thø nhÊt cña Vïng ®Öm. Sè khèi bit thùc sù ®äc ®−îc ®−îc tr¶ vÒ trong biÕn kÕt qña. L−u ý r»ng sè khèi bÝt thùc sù ®äc ®−îc cã thÓ bÐ h¬n s« Rec dù ®Þnh ®äc nÕu ®· ®Õn cuèi tÖp. NÕu kh«ng cã tham biÕn kÕt qña th× khi sè khèi thùc sù ®äc ®−îc kh«ng b»ng sè Rec sÏ cã lçi I/O x¶y ra. Sè byte ®äc ®−îc nhiÒu nhÊt lμ sè Rec * kÝch th−íc Rec, ë ®©y kÝch th−íc Rec lμ kÝch th−íc cña khèi. KÝch th−íc khèi lμ sè l−îng byte trong mét khèi, ®−îc Ên ®Þnh khi më tÖp nh− ®· tr×nh bμy ë trªn. NÕu sè Rec * kÝch th−íc Rec > 65,535 (64K) th× sÏ cã lçi. BlockWrite( biÕn tÖp , vïng ®Öm , sè Rec , kÕt qu¶ ); Vïng ®Öm: vïng ®Öm trong bé nhí, lμ mét tham biÕn, n¬i chøa d÷ liÖu ®Ó xuÊt ra. S« Rec : tham trÞ kiÓu Word, lμ sè khèi dù ®Þnh xuÊt ra. KÕt qu¶ : tham biÕn kiÓu Word, lμ sè khèi thùc sù xuÊt ra ®−îc. Y nghÜa cña c¸c tham sè vμ c«ng dông cña BlockWrite còng t−¬ng tù nh− BlockRead ë trªn. ChØ cã thao t¸c truy cËp ë ®©y lμ viÕt tõ bé nhí ra tÖp. VÝ dô Ch−¬ng tr×nh d−íi ®©y minh ho¹ c¸ch dïng BlockRead, BlockWrite. Nã thùc hiÖn sao chÐp tÖp nhanh, ®¬n gi¶n kh«ng kiÓm tra lçi. program CopyFile; var FromF, ToF: file; NumRead, NumWritten: Word; Buf: array[1..2048] of Char; begin Assign(FromF, ParamStr(1)); { Mo tep du lieu vao} Reset(FromF, 1); { Record size = 1 } Assign(ToF, ParamStr(2)); { Mo tep du lieu ra} Rewrite(ToF, 1); { Record size = 1 } Writeln('Copying ', FileSize(FromF), ' bytes...'); repeat BlockRead(FromF, Buf, SizeOf(Buf), NumRead); BlockWrite(ToF, Buf, NumRead, NumWritten); until (NumRead = 0) or (NumWritten NumRead); Close(FromF); Close(ToF); end. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 113
  10. LËp tr×nh b»ng Turbo Pascal C©u hái vμ bμi tËp 1. TÖp v¨n b¶n cã thÓ dïng ®Ó ®äc/viÕt c¸c kiÓu d÷ liÖu nμo. TÖp ®inh kiÓu cã thÓ dïng ®Ó ®äc/viÕt c¸c kiÓu d÷ liÖu nμo. Khi chØ cã m«t kiÓu d÷ liÖu th× tÖp kiÓu nμo sÏ ®−îc thao t¸c nhanh h¬n. 2. Nh÷ng hμm, thñ tôc nμo chØ ¸p dông cho tÖp ®Þnh kiÓu mμ kh«ng ¸p dông ®−îc cho tÖp v¨n b¶n vμ ng−îc l¹i. 3. Khi nμo th× trong phÇn khai b¸o biÐn kh«ng cã biÕn tÖp. Khi nμo th× trong phÇn khai b¸o kiÓu kh«ng cã kiÓu tÖp. 4. Khi nμo tÖp cã thÓ lμ mét tham trÞ trong danh s¸ch tham sè cña ch−¬ng tr×nh con. 5. Sè lín nhÊt c¸c b¶n ghi cã thÓ viÕt vμo mét tÖp lμ bao nhiªu. 6. TÖp kh«ng ®Þnh kiÓu ®Æt ra nh»m môc ®Ých g×. Thùc hμnh. 1. ViÕt ch−¬ng tr×nh t¹o tÖp Ran100.int chøa 100 sè nguyªn d−¬ng i ®−îc sinh ngÉu nhiªn (0 < i
  11. LËp tr×nh b»ng Turbo Pascal Ch−¬ng 10 Ch−¬ng tr×nh con 1. Ch−¬ng tr×nh con - Hµm vµ thñ tôc 1.1 T¹i sao cÇn sö dông ch−¬ng tr×nh con. - Trong mét ch−¬ng tr×nh cã thÓ cã nh÷ng phÇn c«ng viÖc ph¶i lÆp ®i lÆp l¹i nhiÒu lÇn, víi c¸c d÷ liÖu ®Çu vμo lμ kh¸c nhau. §Ó tr¸nh viÕt l¹i c¸c ®o¹n ch−¬ng tr×nh dïng nhiÒu lÇn, ta cÇn tæ chøc thμnh c¸c ch−¬ng tr×nh con. - Cã mét sè ch−¬ng tr×nh hay dïng, ®· d−îc x©y dùng hoμn chØnh thμnh c¸c ch−¬ng tr×nh mÉu. CÇn tæ chøc thμnh th− viÖn c¸c ch−¬ng tr×nh con ®Ó sö dông l¹i sau nμy. VÝ dô, Turbo Pascal ®· cã th− viÖn c¸c hμm mÉu: sin, cos, tan, sqrt... Ng−êi lËp tr×nh cã thÓ x©y dùng thªm c¸c ch−¬ng tr×nh con kh¸c, vÝ dô ®Ó tÝnh c¸c biÓu thøc hay gÆp, t¹o b¶ng chän, vÏ ®å thÞ ... - Khi ph¸t triÓn mét phÇn mÒn cì lín vμ phøc t¹p th× tÊt yÕu lμ ph¶i chia lμm nhiÒu m« ®un nhá ®éc lËp nhau, giao cho c¸c nhãm ph¸t triÓn ®éc lËp. Mét ch−¬ng tr×nh lín lμ cÊu tróc phèi hîp nhiÒu ch−¬ng tr×nh con. - Ngay c¶ khi ch−¬ng tr×nh kh«ng ph¶i lμ qu¸ dμi th× viÖc tæ chøc thμnh c¸c ch−¬ng tr×nh con cßn cã t¸c dông hç trî, lμm cho viÖc qu¶n lý, gì rèi, b¶o tr× tiÖn lîi vμ dÔ dμng h¬n. 1.2 Khai b¸o ch−¬ng tr×nh con. Trong Pascal c¸c ch−¬ng tr×nh con cÇn ph¶i ®−îc khai b¸o vμ triÓn khai ®Çy ®ñ tr−íc khi cã thÓ sö dông. Trong khung cÊu tróc mét ch−¬ng tr×nh Pascal, phÇn dμnh cho khai b¸o vμ x©y dùng c¸c ch−¬ng tr×nh con lμ ë sau phÇn khai b¸o nh·n, h»ng, kiÓu, biÕn vμ ë ngay tr−íc phÇn th©n ch−¬ng tr×nh chÝnh. Program Tªn ch−¬ng tr×nh; Uses ... ; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 115
  12. LËp tr×nh b»ng Turbo Pascal Label ... ; Const ... ; Type ... ; Var ...; PhÇn dμnh cho c¸c ch−¬ng tr×nh con; BEGIN C¸c c©u lÖnh ; END. Ch−¬ng tr×nh con gåm cã hai lo¹i, gäi lμ hμm vμ thñ tôc, ®−îc x©y dùng theo khung cÊu tróc nh− sau. function Tªn hμm ( Danh s¸ch c¸c tham sè h×nh thøc): KiÓu d÷ liÖu tr¶ vÒ; C¸c khai b¸o h»ng, kiÓu, biÕn cña riªng hμm nμy; C¸c ch−¬ng tr×nh con dïng trong hμm nμy; Begin C¸c c©u lÖnh cña hμm; .... tªn hμm:= gi¸ trÞ tr¶ vÒ ; End; Procedure Tªn thñ tôc ( Danh s¸ch c¸c tham sè h×nh thøc) ; C¸c khai b¸o h»ng, kiÓu, biÕn cña riªng thñ tôc nμy; C¸c ch−¬ng tr×nh con dïng trong thñ tôc ; Begin C¸c c©u lÖnh cña thñ tôc; End; Ph©n tÝch chi tiÕt tõng thμnh phÇn nh− sau. Dßng ®Çu tiªn gäi lμ nguyªn mÉu cña ch−¬ng tr×nh con gåm: tõ kho¸ chØ râ lo¹i ch−¬ng tr×nh con lμ hμm - Function hay thñ tôc – Procedure, tªn hμm hay thñ tôc, danh s¸ch c¸c tham sè h×nh thøc n»m trong dÊu ngoÆc ®¬n. NÕu ch−¬ng tr×nh con lμ mét hμm th× cßn ph¶i chØ râ kiÓu cña gi¸ trÞ tr¶ vÒ viÕt sau dÊu hai chÊm. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 116
  13. LËp tr×nh b»ng Turbo Pascal Danh s¸ch c¸c tham sè h×nh thøc lμ mét d·y c¸c khai b¸o d¹ng tªn tham sè: kiÓu d÷ liÖu c¸ch nhau dÊu chÊm phÈy “ ; ”. Tr−íc tªn tham sè cã thÓ cã tõ kho¸ VAR ®Ó chØ thÞ c¸ch truyÒn theo tham biÕn (ý nghÜa cña nã sÏ gi¶i thÝch sau). NÕu cã vμi tham sè cïng kiÓu d÷ liÖu th× cã thÓ khai b¸o chung. NÕu danh s¸ch tham sè lμ rçng th× cã thÓ bá c¶ hai dÊu ngoÆc ®¬n. Tãm l¹i, víi mçi ch−¬ng tr×nh con, dßng ®Çu tiªn nh»m môc ®Ých khai b¸o tªn vμ "kiÓu" cña ch−¬ng tr×nh con. KiÓu cña ch−¬ng tr×nh con ë ®©y bao gåm: ch−¬ng tr×nh con lo¹i g×, hμm hay thñ tôc; cã bao nhiªu tham sè d÷ liÖu ®Çu vμo, ®Çu ra vμ kiÓu cña c¸c tham sè Êy. VÝ dô vÒ dßng khai b¸o nguyªn mÉu cña ch−¬ng tr×nh con: Procedure NhapSoLieu; Function MaxDay( SoPhanTu: word; Var A: MangSoNguyªn): integer ; Procedure GiaiPTBacHai(a,b,c: real ; Var Nghiem_1, Nghiem_2: real); .... 1.3 X©y dùng ch−¬ng tr×nh con Sau dßng khai b¸o nguyªn mÉu (tªn vμ kiÓu) lμ phÇn triÓn khai chi tiÕt ch−¬ng tr×nh con. PhÇn nμy cã cÊu tróc hoμn toμn t−¬ng tù nh− cña mét ch−¬ng tr×nh Pascal b×nh th−êng. B¾t ®Çu còng lμ c¸c khai b¸o (units, h»ng, kiÓu, biÕn, ...) cña riªng ch−¬ng tr×nh con. Sau ®ã lμ phÇn th©n ch−¬ng tr×nh con gåm c¸c c©u lÖnh n»m gi÷a hai tõ kho¸ Begin, End. Chó ý r»ng tr−íc khi b¾t ®Çu phÇn th©n ch−¬ng tr×nh con l¹i cã thÓ cã c¸c ch−¬ng tr×nh con cña chÝnh ch−¬ng tr×nh con nμy. Kh¸i niÖm ch−¬ng tr×nh con cã tÝnh ®Ö quy. C¸c ch−¬ng tr×nh con kÕt thóc b»ng End víi dÊu chÊm phÈy chø kh«ng ph¶i dÊu chÊm nh− ch−¬ng tr×nh chÝnh. NÕu ch−¬ng tr×nh con lμ mét hμm th× trong phÇn th©n, tr−íc khi kÕt thóc ph¶i cã c©u lÖnh d¹ng tªn hμm:= gi¸ trÞ tr¶ vÒ ; 1.4 Lêi gäi ch−¬ng tr×nh con. §Ó cho thùc hiÖn mét ch−¬ng tr×nh con, ta cÇn viÕt mét lêi gäi. Lêi gäi hμm, thñ tôc cã d¹ng chung nh− sau Tªn hμm ( Danh s¸ch c¸c tham sè thùc sù ); Tªn thñ tôc ( Danh s¸ch c¸c tham sè thùc sù ); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 117
  14. LËp tr×nh b»ng Turbo Pascal Trong lêi gäi hμm, thñ tôc th× danh s¸ch c¸c tham sè thùc sù ph¶i t−¬ng øng mét - mét víi danh s¸ch tham sè h×nh thøc: ®óng sè l−îng, thø tù vμ kiÓu d÷ liÖu. T¹i mét ®iÓm trong ch−¬ng tr×nh chÝnh, khi gÆp lêi gäi ch−¬ng tr×nh con th× ch−¬ng tr×nh chÝnh t¹m dõng. C¸c tham sè h×nh thøc sÏ ®−îc g¸n c¸c gi¸ trÞ hiÖn t¹i cña tham sè thùc sù vμ c¸c lÖnh xö lÝ trong th©n ch−¬ng tr×nh con ®−îc tiÕn hμnh. Khi kÕt thóc ch−¬ng tr×nh con, ®iÒu khiÓn sÏ ®−îc tr¶ vÒ cho ch−¬ng tr×nh chÝnh vμ c«ng viÖc cña ch−¬ng tr×nh chÝnh tiÕp tôc l¹i tõ chç t¹m dõng ®Ó nh¶y vμo ch−¬ng tr×nh con. D−íi ®©y lμ vÝ dô lêi gäi c¸c ch−¬ng tr×nh con ®−îc khai b¸o nh− nªu trªn. NhapSoLieu; Lêi gäi thñ tôc nμy sÏ cho thùc hiÖn lÇn l−ît c¸c lÖnh trong th©n thñ tôc NhapSoLieu gièng nh− ta chÌn toμn bé c¸c c©u lÖnh ®ã vμo ®óng chç mμ lêi gäi cã mÆt. TuoiCaoNhat:= MaxDay( 50, Tuoi ); Khi thùc hiÖn lêi gäi hμm nh− trªn, tham sè SoPhanTu sÏ ®−îc g¸n trÞ 50, Tuoi ph¶i lμ m¶ng sè nguyªn cã 50 phÇn tö. Ch−¬ng tr×nh con sÏ t×m gi¸ trÞ cùc ®¹i cña m¶ng Tuoi vμ g¸n cho biÕn TuoiCaoNhat. GiaiPTBacHai( 2.3, -0.5, 1.0, x1, x2); Lêi gäi thñ tôc nμy sÏ cã t¸c dông g¸n a:=2.3; b:=-0.5, c:=1.0. Sau ®ã gi¶i ph−¬ng tr×nh bËc hai víi ba hÖ s« a,b,c cã gi¸ trÞ nh− trªn vμ ®Æt kÕt qu¶ vμo x1, x2 lμ c¸c biÕn thùc ®· ®−îc khai b¸o tr−íc ®ã. 1.5 VÝ dô minh ho¹. H·y viÕt mét ch−¬ng tr×nh nhËp vμo hai d·y sè liÖu lμ nhiÖt ®é cao nhÊt vμ nhiÖt ®é thÊp nhÊt cña tõng ngμy trong mét tuÇn. T×m vμ in ra nhiÖt ®é cao nhÊt, thÊp nhÊt trong tuÇn. NÕu kh«ng sö dông ch−¬ng tr×nh con ta sÏ viÕt mét ch−¬ng tr×nh ®¹i lo¹i nh− sau const kt_mang = 7; type MangSoThuc = array [1..kt_mang] of real; var NhietDoCao, NhietDoThap: MangSoThuc; m,max,min: real; i: integer; BEGIN NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 118
  15. LËp tr×nh b»ng Turbo Pascal write('Cho day nhiet do cao:'); for i:=1 to kt_mang do read(NhietDoCao[i]); write('Cho day nhiet do thap:'); for i:=1 to kt_mang do read(NhietDoThap[i]); m:= NhietDoCao[1]; for i:=2 to kt_mang do if NhietDoCao[i]> m then m:= NhietDoCao[i]; max:= m; m:= NhietDoThap[1]; for i:=2 to kt_mang do if NhietDoThap[i] < m then m:= NhietDoThap[i]; min:= m; Writeln('Nhiet do cao nhat trong tuan la', max:3:1); Writeln('Nhiet do thap nhat trong tuan la', min:3:1); END. Ta nhËn thÊy r»ng ch−¬ng tr×nh trªn bao gåm 4 phÇn c«ng viÖc râ rμng, trong ®ã viÖc nhËp d·y sè liÖu ban ®Çu ®−îc lÆp l¹i hai lÇn gièng nhau. Cã thÓ tæ chøc l¹i ch−¬ng tr×nh trªn ph©n thμnh c¸c ch−¬ng tr×nh con. Mçi ch−¬ng tr×nh con ®¶m nhËn mét phÇn c«ng viÖc. §ã lμ: Thñ tôc nhËp m¶ng mét chiÒu. Thñ tôc nμy sÏ ®−îc gäi ®Ó thùc hiÖn viÖc nhËp d·y 2 sè liÖu ®Çu vμo. Hμm tÝnh gi¸ trÞ lín nhÊt cña c¸c phÇn tö m¶ng mét chiÒu. Hμm sÏ ®−îc gäi ®Ó tÝnh nhiÖt ®é cao nhÊt. Hμm tÝnh gi¸ trÞ nhá nhÊt cña c¸c phÇn tö m¶ng mét chiÒu. Hμm sÏ ®−îc gäi ®Ó tÝnh nhiÖt ®é thÊp nhÊt. Ch−¬ng tr×nh chÝnh b©y giê chØ gåm vμi dßng lÖnh lμ c¸c lêi gäi ch−¬ng tr×nh con, gièng nh− b¶n liÖt kª nh÷ng c«ng viÖc chÝnh cÇn lμm. Nã trë nªn ®¬n gi¶n, s¸ng sña vμ dÔ hiÓu h¬n nhiÒu. const kt_mang = 7; type MangSoThuc = array [1..kt_mang] of real; var NhietDoCao, NhietDoThap: MangSoThuc; max,min: real; procedure nhap_mang(var v: MangSoThuc); var i: integer; begin for i:=1 to kt_mang do read(v[i]); end; NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 119
  16. LËp tr×nh b»ng Turbo Pascal function max_mang( v: MangSoThuc): real; var i: integer; m: real; begin m:=v[1]; for i:=2 to kt_mang do if v[i]>m then m:=v[i]; max_mang:= m; end; function min_mang( v: MangSoThuc): real; var i: integer; m: real; begin m:=v[1]; for i:=2 to kt_mang do if v[i]< m then m:=v[i]; min_mang:= m; end; BEGIN Writeln('Cho day nhiet do cao'); nhap_mang(NhietDoCao);writeln(''); Writeln('Cho day nhiet do thap'); nhap_mang(NhietDoThap);writeln(''); Max:= max_mang(NhietDoCao); Min:= min_mang(NhietDoThap); Writeln('Nhiet do cao nhat trong tuan la', max:3:1); Writeln('Nhiet do thap nhat trong tuan la', min:3:1); END. 2. Hµm hay thñ tôc, tham biÕn hay tham trÞ . 2.1 Ph©n biÖt hµm víi thñ tôc. KÕt qu¶ cuèi cïng cña mét hμm lμ tr¶ vÒ mét gi¸ trÞ míi. Trong th©n hμm lu«n ph¶i cã lÖnh g¸n tªn hμm:= gi¸ trÞ tr¶ vÒ . ChÝnh tªn hμm nμy coi nh− mét biÕn, dïng lμm n¬i chøa gi¸ trÞ tr¶ vÒ. Thñ tôc kh«ng cã phÇn gÝa trÞ tr¶ vÒ. Nh− thÕ kh«ng cã nghÜa lμ nã kh«ng t¹o ra kÕt qu¶ g×. KÕt qu¶ cña mét thñ tôc lμ lμm thay ®æi gi¸ trÞ cña mét hay nhiÒu biÕn ®· tån t¹i tr−íc khi gäi thñ tôc. VÝ dô: - NhËp mét d·y sè lμ mét thñ tôc. BiÕn m¶ng chøa d·y sè ph¶i tån t¹i tr−íc khi gäi thñ tôc. Thñ tôc lμm thay ®æi gi¸ trÞ cña biÕn m¶ng. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 120
  17. LËp tr×nh b»ng Turbo Pascal - T×m phÇn tö cùc ®¹i cña mét d·y sè nªn lμ mét hμm v× ch−¬ng tr×nh con nμy sÏ tr¶ vÒ gi¸ trÞ lín nhÊt cña c¸c phÇn tö trong d·y 2.2 Ph©n biÖt tham biÕn vµ tham trÞ. C¸c tham sè trong danh s¸ch tham sè h×nh thøc cña ch−ong tr×nh con chia lμm hai lo¹i, tuú theo c¸ch truyÒn gi¸ trÞ tõ ch−¬ng tr×nh chÝnh gäi nã. Lo¹i thø nhÊt lμ tham sè ®−îc truyÒn theo gi¸ trÞ hay gäi t¾t lμ tham trÞ. TruyÒn theo gi¸ trÞ nghÜa lμ chÐp l¹i gi¸ trÞ cña biÕn tõ ch−¬ng tr×nh chÝnh t¹i thêi ®iÓm gäi ch−¬ng tr×nh con ®Ó sö dông trong ch−¬ng tr×nh con, kh«ng thay ®æi b¶n gèc. Lo¹i thø hai lμ tham biÕn. Tham biÕn nghÜa lμ chuyÓn trùc tiÕp biÕn tõ ch−¬ng tr×nh chÝnh sang cho ch−¬ng tr×nh con sö dông. Ch−¬ng tr×nh con sÏ d−îc trá ®Õn tËn ®Þa chØ gèc cña biÕn, nã thùc hiÖn c¸c tÝnh to¸n trùc tiÕp t¹i ®ã vμ do ®ã lμm thay ®æi ®−îc néi dung cña tham biÕn. Tham biÕn ®−îc khai b¸o kÌm tõ kho¸ VAR trong danh s¸ch tham sè h×nh thøc. Tõ ý nghÜa cña hai c¸ch truyÒn tham sè võa gi¶i thÝch ë trªn, ta thÊy ngay r»ng ®èi v¬Ý c¸c ch−¬ng tr×nh con th× c¸c tham sè lμ d÷ liÖu ®Çu vμo - input- nhËn tõ ch−¬ng tr×nh chÝnh cã thÓ lμ tham trÞ hoÆc tham biÕn, nh−ng c¸c tham sè lμ kÕt qu¶ ®Çu ra - output - cña thñ tôc ph¶i lμ tham biÕn. NÕu quªn ®iÒu nμy th× khi thñ tôc kÕt thóc còng mÊt lu«n c¸c kÕt qu¶ v× c¸c tÝnh to¸n, xö lÝ thùc hiÖn trªn b¶n sao t¹o ra trong ch−¬ng tr×nh con, bÞ huû khi ch−¬ng tr×nh con kÕt thóc. Gi¸ trÞ cña b¶n chÝnh, nghÜa lμ cña biÕn trong ch−¬ng tr×nh chÝnh kh«ng thay ®æi. VÝ dô minh ho¹ . Program Tham_tri; var a,b,c: integer; procedure GapDoi(x,y,z: integer); begin x:= x*2; y:=y*2; z:=z*2; writeln('Trong procedure co 3 so:',x,' ',y,' ',z); end; BEGIN a:= 1; b:= 10; c:= 100; writeln('Truoc procedure co 3 so:',a,' ',b,' ',c); GapDoi(a,b,c); writeln('Sau procedure co 3 so:',a,' ',b,' ',c) END. KÕt qu¶ in ra sÏ lμ: NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 121
  18. LËp tr×nh b»ng Turbo Pascal Tr−íc procedure cã 3 so 1 10 100 Trong procedure cã 3 so 2 20 200 Sau procedure cã 3 so 1 10 100 NÕu söa l¹i danh s¸ch tham sè cña thñ tôc trªn, khai b¸o x,y,z ®−îc truyÒn nh− tham biÕn víi tõ kho¸ VAR th× kÕt qu¶ sÏ lμm biÕn ®æi thùc sù gi¸ trÞ cña a,b,c. Dßng kÕt qu¶ cuèi cïng sÏ lμ Sau procedure cã 3 so 2 20 200 ! Program Tham_bien; var a,b,c: integer; procedure GapDoi_var(VAR x,y,z: integer); .... 2.3 Mét vµi l−u ý khi x©y dùng ch−¬ng tr×nh con 2.3.1 X¸c ®Þnh danh s¸ch tham sè. Tªn, danh s¸ch c¸c tham sè ®Çu vμo, ®Çu ra kÌm víi kiÓu d÷ liÖu cña c¸c tham sè ®ã trong nguyªn mÉu cña mét ch−¬ng tr×nh con lμ toμn bé giao diÖn cña ch−¬ng tr×nh con víi bªn ngoμi. §Ó sö dông mét ch−¬ng tr×nh con chØ cÇn biÕt tªn, chøc n¨ng, c¸c tham sè ®Çu vμo lμ g× vμ kÕt qu¶ ®Çu ra kiÓu g×, ®Ó ë ®©u. Ng−êi sö dông ch−¬ng tr×nh con kh«ng cÇn biÕt ®Õn néi dung c¸c c©u lÖnh bªn trong th©n ch−¬ng tr×nh con. Tuy nhiªn, kh«ng nhÊt thiÕt mäi d÷ liÖu ®Çu vμo cña mét ch−¬ng tr×nh con ®Òu ph¶i xuÊt hiÖn trong danh s¸ch tham sè h×nh thøc. §−a nh÷ng tham sè nμo vμo danh s¸ch tham sè h×nh thøc trong dßng khai b¸o nguyªn mÉu cña ch−¬ng tr×nh con lμ vÊn ®Ò më nh÷ng cæng giao tiÕp nμo ®Ó cho ng−êi sö dông cã thÓ tuú biÕn khi gäi thùc hiÖn ch−¬ng tr×nh con. Nguyªn t¾c chung lμ: nÕu mét tham sè h×nh thøc mμ trong tÊt c¶ c¸c lÇn gäi thùc hiÖn ch−¬ng tr×nh con ®Òu ®−îc g¸n gi¸ trÞ tham sè thùc sù gièng nhau th× cã thÓ lo¹i khái danh s¸ch tham sè h×nh thøc trong nguyªn mÉu cña ch−¬ng tr×nh con. NÕu ch−¬ng tr×nh con ®−îc x©y dùng nh− mét m« ®un ®éc lËp, cã thÓ sö dông l¹i trong nhiÒu hoμn c¶nh kh¸c nhau th× tÊt c¶ c¸c d÷ liÖu ®Çu vμo, ®Çu ra cña nã ph¶i cã mÆt trong danh s¸ch tham sè h×nh thøc ®Ó ng−êi sö dông gäi thùc hiÖn víi c¸c tham sè thùc sù kh¸c nhau tuú tõng tr−êng hîp. NÕu ch−¬ng tr×nh con chØ sö dông trong mét ch−¬ng tr×nh chÝnh, trong mét hoμn c¶nh cô thÓ th× c¸c d÷ liÖu ®Çu vμo, ®Çu ra chung cho c¶ ch−¬ng tr×nh chÝnh, lμ biÕn toμn côc cña ch−¬ng tr×nh chÝnh kh«ng cÇn ph¶i ®−a vμo danh NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 122
  19. LËp tr×nh b»ng Turbo Pascal s¸ch tham sè. ChØ nh÷ng tham sè sÏ nhËn nh÷ng gi¸ trÞ kh¸c nhau trong nh÷ng lÇn sö dông kh¸c nhau míi cÇn ®−a vμo danh s¸ch tham sè h×nh thøc. XÐt tr−êng hîp viÕt ch−¬ng tr×nh con thùc hiÖn in mét ma trËn ra mμn h×nh thμnh b¶ng h×nh ch÷ nhËt dãng th¼ng hμng, cét. 1- NÕu trong ch−¬ng tr×nh chÝnh sÏ cÇn thùc hiÖn in ra mμn h×nh nhiÒu ma trËn víi nhiÒu kÝch th−íc kh¸c nhau th× tÊt c¶ c¸c d÷ liÖu sau ®©y ph¶i ®−a vμo danh s¸ch tham sè h×nh thøc: sè hμng cña ma trËn, sè cét cña ma trËn, m¶ng chøa ma trËn. 2- NÕu trong ch−¬ng tr×nh chÝnh c¸c ma trËn ®Òu cïng mét kÝch th−íc th× c¸c tham sè: sè hμng cña ma trËn, sè cét cña ma trËn kh«ng cÇn ®−a vμo danh s¸ch tham sè h×nh thøc. Trong danh s¸ch tham sè h×nh thøc chØ cÇn cã m¶ng chøa ma trËn cÇn in ra. 3- NÕu ta chØ gäi ch−¬ng tr×nh con nμy mét lÇn ®Ó in ra ma trËn kÕt qu¶ ch¼ng h¹n th× thËm chÝ kh«ng cÇn ®−a m¶ng chøa ma trËn vμo danh s¸ch tham sè. Danh s¸ch tham sè lμ rçng. 2.3.2 Phong c¸ch viÕt danh s¸ch tham sè. §Ó cho râ rμng, dÔ theo dâi, nªn chia danh s¸ch tham sè lμm hai phÇn, thËm chÝ trªn hai dßng kh¸c nhau, chó thÝch râ ®©u lμ c¸c tham sè lμm d÷ liÖu ®Çu vμo {input}, ®©u lμ c¸c tham sè ®Ó chøa kÕt qu¶ ®Çu ra {output}. VÝ dô, Procedure NhapMang ({input} so_pt: integer, {output} Var Dayso: mang) 2.3.3 Lùa chän hμm hay thñ tôc. Hoμn toμn cã thÓ chuyÓn mét hμm thμnh mét thñ tôc b»ng c¸ch coi gi¸ trÞ tr¶ vÒ nh− mét tham sè ®Çu ra, ®−îc khai b¸o lμ tham biÕn. VÝ dô: Procedure MaxDay ({input} so_pt: integer; Dayso: mang ; {output} Var giatrimax: real); Tuy nhiªn, hμm cã thÓ tham gia trùc tiÕp vμo biÓu thøc nh− mét to¸n h¹ng, cßn thñ tôc th× kh«ng ! 2.3.4 Lùa chän tham biÕn hay tham trÞ. §èi víi l−îng d÷ liÖu lín th× viÖc truyÒn theo tham trÞ kh«ng hiÖu qu¶ v× nã sÏ chiÕm mÊt nhiÒu chç trong ng¨n xÕp do viÖc t¹o ra b¶n sao chÐp l¹i d÷ liÖu ®−îc truyÒn. Mét sè kiÓu d÷ liÖu cã cÊu tróc kh«ng cho phÐp truyÒn theo tham trÞ mμ chØ cã thÓ truyÒn theo tham biÕn. Tuy nhiªn, nÕu chän c¸ch truyÒn theo tham biÕn cÇn l−u ý ®Õn c¸c hiÖu øng phô kh«ng mong muèn do ta v« t×nh thay ®æi gi¸ trÞ cña biÕn. NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 123
  20. LËp tr×nh b»ng Turbo Pascal 2.3.5 TÖp lμm tham sè cña ch−¬ng tr×nh con. Khi cÇn truyÒn hoÆc nhËn nhiÒu d÷ liÖu, cã thÓ dïng biÕn tÖp ®Ó truyÒn tham sè cho ch−¬ng tr×nh con. Nã b¾t buéc ph¶i lμ tham biÕn. Ch−¬ng tr×nh con thùc sù truy cËp tÖp chø kh«ng ph¶i t¹o b¶n sao kh¸c. VÝ dô. Thñ tôc TaoTep d−íi ®©y sÏ t¹o mét tÖp c¸c sè nguyªn råi ghi vμo ®ã c¸c sè nguyªn tõ 1 ®Õn 100. Tªn tÖp ®−îc cung cÊp nh− mét tham sè ®Çu vμo cña thñ tôc. Procedure TaoTep( Var F: TepSoNguyen; Ten: String[30]); Var i: integer; Begin Assign (F, Ten); Rewrite (F); For i:=1 to 100 do Write(F,i); Close(F); End; 2.4 Khai b¸o tr−íc - Forward. Quy t¾c chung trong mét ch−¬ng tr×nh Pascal lμ mäi thø ®Òu ph¶i tu©n theo tr×nh tù khai b¸o, x©y ®ùng råi míi ®−îc sö dông. C¸c ch−¬ng tr×nh con còng kh«ng ngoμi th«ng lÖ ®ã. Ta chØ cã thÓ sö dông, tøc lμ viÕt c©u lÖnh cã lêi gäi tíi mét ch−¬ng tr×nh con sau khi ®· triÓn khai nã ®Çy ®ñ. Tuy nhiªn, cã nh÷ng tr−êng hîp mμ hai ch−¬ng tr×nh con sö dông lÉn nhau nh− minh ho¹ d−íi ®©y. Trong th©n thñ tôc Proc1 cã lêi gäi ®Õn thñ tôc Proc2 vμ ng−îc l¹i trong th©n thñ tôc Proc2 l¹i cã lêi gäi ®Õn thñ tôc Proc1. Procedure Proc1(...); ... Begin ... Proc2(...); ... End; Procedure Proc2(...); ... Begin ... Proc1(...); NguyÔn §×nh Ho¸, ViÖn CNTT - §HQG Hμ néi 124
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2