You are on page 1of 42

1

PASCAL Ví duï X = 3B16 = 0011’10112= 11’10112


Chuyeån ñoåi giöõa caùc heä ñeám III.1.Bieåu dieãn caùc kyù töï
Qui taéc 1 Hieän nay baûng maõ ASCII (American Standard Code for
Ñeå chuyeån ñoåi moät soá töø heä thaäp phaân sang heä coù cô Information Interchage – lµ bé maõ chuaånï dïng 7bit biÓu diÔn
mét kÝ tù, do ViÖn Chuaån Hoùa Hoa Kyø (American National
soá b (b  10) ta aùp duïng caùch laøm sau :
Standards Institute) ñöa ra) vaãn laø baûng maõ ñöôïc söû duïng
Laáy soá thaäp phaân chia cho cô soá b cho ñeán khi phaàn thöông
nhieàu nhaát. Moät baûng maõ khaùc cuõng khoâng keùm phaàn
cuûa pheùp chia baèng 0, soá ñoåi ñöôïc chính laø caùc phaàn dö
ñöôïc öa chuoäng laø EBCDIC (Extended Binary Code Decimal
cuûa pheùp chia theo thöù töï ngöôïc laïi.
Interchange Code) laø boä maõ ôû ñoù moãi kyù töï ñöôïc bieåu
Ví duï cho X = 6 ù10 nghóa laø X = 6 trong heä thaäp phaân thì X
dieãn vôùi 8 bit, boä maõ naøy cuûa coâng ty IBM.
seõ ñöôïc ñoåi thaønh 1102 trong heä nhò phaân.
III.2. Coäng nhò phaân
Caùch ñoåi nhö hình sau
Trong heä nhò phaân thao taùc coäng cuõng gioáng
nhö thao taùc coäng trong heä thaäp phaân vôùi moät
soá qui taéc sau
0+0=0 0+1=1
1+0=1 1 + 1 = 10
Khi coäng vaãn thöïc hieän coäng caùc coät töø phaûi sang traùi,
öùng vôùi moãi coät ta coäng 2 soá theo qui taéc treân, neáu coù
nhôù thì coäng nhôù sang coät keá beân
thuËt to¸n
Ñeå tính toång caùc soá nguyeân döông leû trong khoaûng töø 1
ñeán n ta coù thuaät toaùn sau :
B1. Hoûi giaù trò cuûa n.
B2. S = 0
B3. i = 1
Qui taéc 2
B4. Neáu i = n+1 thì sang böôùc B8, ngöôïc laïi sang böôùc
Ñeå chuyeån ñoåi moät soá töø heä cô soá b veà heä thaäp phaân
B5
ta söû suïng coâng thöùc (*)
B5. Coäng theâm i vaøo S
Ví duï vôùi X = 1102 thì X= 1 * 22 + 1 * 21 + 0 = 6.
B6. Coäng theâm 2 vaøo i
Baûng chuyeån ñoåi giöõa heä nhò phaân, thaäp luïc phaân vaø
B7. Quay laïi böôùc B4.
thaäp phaân nhö sau
B8. Toång caàn tìm chính laø S.
Thaäp Nhò phaân Thaäp luïc phaân Thuaät toaùn giaûi phöông trình baäc hai ax2+bx+c=0 (a¹0)
phaân 1. Yeâu caàu cho bieát giaù trò cuûa 3 heä soá a, b, c
0 0 0 2. Neáu a=0 thì
1 1 1 2.1. Yeâu caàu ñaàu vaøo khoâng ñaûm baûo.
2.2. Keát thuùc thuaät toaùn.
2 10 2
3. Tröôøng hôïp a ¹ 0 thì
3 11 3 3.1. Tính giaù trò D = b2-4ac
4 100 4 3.2. Neáu D > 0 thì
5 101 5 3.2.1. Phöông trình coù hai nghieäm phaân bieät x1 vaø x2
3.2.2. Giaù trò cuûa hai nghieäm ñöôïc tính theo coâng thöùc sau
6 110 6
7 111 7
8 1000 8            
3.2.3. Keát thuùc thuaät toaùn.
9 1001 9 3.3. Neáu D = 0 thì
10 1010 A 3.3.1. Phöông trình coù nghieäm keùp x0
11 1011 B 3.3.2. Giaù trò cuûa nghieäm keùp laø
12 1100 C
13 1101 D                    
3.3.3. Keát thuùc thuaät toaùn
14 1110 E 3.4. Neáu D < 0 thì
15 1111 F 3.4.1. Phöông trình voâ nghieäm.
Qui taéc 3 3.4.2. Keát thuùc thuaät toaùn.
Ñeå chuyeån soá töø heä nhò phaân veà heä thaäp luïc phaân ta Thuaät toaùn tìm hoäp coù troïng löôïng naëng nhaát
thöïc hieän nhö sau :        Vaán ñeà : Coù n hoäp coù khoái löôïng khaùc nhau vaø
Nhoùm laàn löôït 4 bit töø phaûi sang traùi, sau ñoù thay theá caùc moät caùi caân dóa. Haõy chæ ra caùch caân ñeå tìm ñöôïc hoäp
nhoùm 4 bit baèng giaù trò töông öùng vôùi heä thaäp luïc phaân coù troïng löôïng naëng nhaát. Vaán ñeà naøy laø theå hieän
(tra theo baûng chuyeån ñoåi treân). cuûa moät baøi toaùn toång quaùt : Cho moät taäp hôïp A höõu
Ví duï haïn vaø moät thöù töï toaøn phaàn treân A. Haõy xaây döïng
X = 11’10112 = 3B16 thuaät toaùn tìm phaàn töû lôùn nhaát cuûa A. Baøi toaùn trong
Qui taéc 4 toaùn hoïc coù veû raát phöùc taïp nhöng moät theå hieän treân
Ñeå chuyeån soá töø heä thaäp luïc phaân sang heä nhò phaân ta thöïc teá laïi raát deã hieåu, vaø caùch giaûi quyeát cuõng ñôn
thöïc hieän nhö sau: öùng vôùi moãi chöõ soá seõ ñöôïc bieåu giaûn. Töø ñoù ta coù theå deã daøng suy ra caùch giaûi baøi
dieãn döôùi daïng 4 bit. toaùn toång quaùt.
2
1. Neáu chæ coù 1 hoäp (n=1) thì Label ... {khai baùo nhaõn}
1.1. Hoäp ñoù chính laø hoäp naëng nhaát. Const ... {khai baùo haèng}
1.2. Keát thuùc thuaät toaùn. Type ... {khai baùo kieåu döõ lieäu}
2. Ngöôïc laïi neáu coù töø hai hoäp trôû leân (n>1) Var ... { khai baùo bieán}
2.1. Choïn hai hoäp baát kyø vaø ñaët leân baøn caân. Function …(khai baùo caùc chöông trình con:
2.2. Giöõ laïi hoäp naëng hôn, caát hoäp nheï hôn sang choã Procedure ... haøm vaø thuû tuïc }
khaùc. { Phaàn thaân chöông trình ¯}
3. Neáu coøn hoäp chöa ñöôïc caân thöïc hieän caùc böôùc sau, Begin
neáu khoâng coøn hoäp naøo nöõa, sang böôùc 5. { Caùc leänh }
3.1. Choïn moät hoäp baát kyø vaø ñeå leân dóa caân coøn troáng. End.
3.2. Giöõ laïi hoäp naëng hôn, caát hoäp nheï hôn sang choã Hình 5.1: Caáu truùc cuûa chöông trình Pascal
khaùc. 6.2.5. Caùc pheùp dòch chuyeån soá hoïc SHR vaø SHL :
4. Trôû laïi böôùc 3.        N SHR k : dòch caùc bít cuûa soá nguyeân N sang phaûi ñi
5. Hoäp coøn laïi treân caân chính laø hoäp naëng nhaát. Keát k bít.
thuùc.         N SHL k : dòch caùc bít cuûa soá nguyeân N sang traùi ñi k
Thuaät toaùn Euclid tìm öôùc soá chung lôùn nhaát bít.
        Baøi toaùn : Cho hai soá nguyeân döông a vaø b. Tìm Coù theå chöùng minh ñöôïc :
öôùc soá chung lôùn nhaát cuûa a vaø b.         N SHR k = N div 2k
1. Yeâu caàu cho bieát giaù trò cuûa a, b.         N SHL k = N * 2k
2. a0 = a Ví duï:
3. b0 = b         120 shr 4 = 7, vì :
4. i = 0         120 shr 4 = 120 div 24 = 120 div 16 = 7.
5. Neáu ai khaùc bi thì thöïc hieän caùc thao taùc sau, ngöôïc laïi         120 shl 3 = 960, vì :
qua böôùc 7.         120 shl 3 = 120 * 23 = 120 * 8 = 960.
5.1 Taêng i leân 1. Hai pheùp toaùn SHR vaø SHL ñöôïc duøng khi muoán taêng
5.2. Neáu ai-1 > bi-1 thì toác ñoä tính toaùn treân caùc soá nguyeân.
ai = ai-1 - bi-1 Ngoaøi kieåu Real ra, caùc soá thöïc coøn coù 4 kieåu môû
bi = bi-1 roäng nöõa laø Single, Double, Extended vaø Comp. Baûng
5.3. Ngöôïc laïi 6.4 neâu chi tieát veà phaïm vi gía trò vaø soá byte
bi = bi-1 - ai-1 duøng ñeå löu tröõ trong boä nhôù cuûa töøng kieåu
ai = ai-1
6. Trôû laïi böôùc 5. soá thöïc.
7. Öôùc soá chung lôùn nhaát cuûa a, b laø ai . Teân kieåu Phaïm vi gía trò Soá byte
5.2.2. Töø khoùa ( key word ):
        Coù moät soá töø ñöôïc Pascal daønh rieâng cho vieäc xaây
Real 2.9*10-39 .. 1.7*1038 6
döïng caùc caâu leänh, caùc khai baùo, caùc pheùp tính,... goïi laø
töø khoùa. Vieäc söû duïng caùc töø khoùa ñoøi hoûi phaûi tuaân
thuû ñuùng quy taéc ñeà ra, vaø ñaëc bieät laø ngöôøi laäp trình Single 1.5*10-45 .. 3.4*1038 4
khoâng ñöôïc ñaët moät teân môùi (teân bieán, teân haèng, teân
haøm, teân thuû tuïc,...) truøng vôùi moät trong caùc töø khoùa. Double 5.0*10-324 .. 1.7*10308 8
Döôùi ñaây laø danh saùch caùc töø khoùa cuûa Pascal :
    absolute, and, array, begin, case, const, div, do, downto, else, Extended 3.4*10-4932 .. 1.1*104932 10
end, file, for, forward, function, goto, if, implementation, in,
inline, interface, interrupt, label, mod, nil, not, of, or, packed, Comp -9.2*1018 .. 9.2*1018 8
procedure, program, record, repeat, set, shl, shr, string, then,
to, type, unit, until, uses, var, while, with, xor 6.4. KIEÅU KYÙ TÖÏ (CHAR) :
5.2.3. Teân (identifier)      6.4.1. Kyù töï vaø bieán kieåu kyù töï:
Trong Pascal coù moät soá teân ñaõ ñöôïc ñaët saün roài, goïi laø
teân chuaån, chaúng haïn : Kyù Maõ   Kyù Maõ Kyù Maõ
Abs, Arctan, Boolean, Byte, Char, Cos, Copy, Delete, Eof, töï ASCII töï ASCII töï ASCII
False, Longint, Ord, Integer, Real, Readln, Writeln, True,
Text, ...   32   A 65 a 97
            Maëc duø ngöôøi thaûo chöông coù theå ñaët moät teân
môùi truøng vôùi moät trong caùc teân chuaån, song, ñeå ñôõ 0 48   B 66 b 98
nhaàm laãn, chuùng ta neân traùnh ñieàu naøy.
5.3.2. Caáu truùc chung cuûa chöông trình Pascal : 1 49   C 67 c 99
Chöông trình laø moät daõy caùc caâu leänh chæ thò cho maùy
caùc coâng vieäc phaûi thöïc hieän. Moät chöông trình Pasccal 2 50   D 68 d 100
ñaày ñuû goàm ba phaàn chính :
-Phaàn tieâu ñeà
-Phaàn khai baùo 3 51   E 69 f 101
-Phaàn thaân chöông chình
Program Teântöïñaët ; { Phaàn tieâu ñeà} 4 52   F 70 e 102
{ Phaàn khai baùo ¯}
Uses ... {khai baùo söû duïng thö 5 53   G 71 g 103
vieän chuaån}
3
        Ta bieát, ñieàu kieän ñeå a,b,c laø ba caïnh cuûa moät tam
6 54   H 72 h 104 giaùc laø moãi caïnh phaûi döông vaø toång hai caïnh thì lôùn
hôn caïnh coøn laïi.        Döôùi ñaây laø chöông trình cuï theå :
7 55   I 73 i 105 PROGRAM VIDU66;
{Tính dieän tích vaø chu vi tam giaùc theo 3 caïnh}
8 56   J 74 j 106 Var
a, b, c, P, S : Real;
9 57   K 75 k 107 Tgiac: Boolean;
Begin
      L 76 l 108 Write(‘ Nhap 3 canh cua tam giac : ‘);
Readln(a, b, c);
Tgiac:= (a>0) and (b>0) and (c>0) and
      M 77 m 109
(a+b>c) and (a+c>b) and (b+c>a);
If Tgiac= FALSE then
      N 78 n 110 Writeln(‘ Khong phai ba canh cua tam giac !’)
else
      O 79 o 111 begin
P:=(a+b+c)/2;
      P 80 p 112 S:= Sqrt( P*(P-a)*(P-b)*(P-c) );
Writeln(‘ chu vi = ‘ , 2*P:10:2);
      Q 81 q 113 Writeln(‘ dien tich S= ‘ , S:10:2);
end;
      R 82 r 114 Readln;
End.
6.6. CHUOÃI KYÙ TÖÏ (STRING)
      S 83 s 115 Caùc chuoãi coù theå ñöôïc gheùp noái vôùi nhau nhôø pheùp
coäng chuoãi. Khi coäng (+) hai chuoãi ta ñöôïc moät chuoãi
      T 84 t 116 duy nhaát baèng caùch gheùp chuoãi sau vaøo cuoái cuûa chuoãi
ñaàu. Ví duï pheùp coäng :
      U 85 u 117        ‘Ngon ngu’ + ‘ Pascal’ cho keát quûa laø ‘Ngon ngu
Pascal’.
      V 86 v 118         Caùc chuoãi cuõng so saùnh ñöôïc vôùi nhau. Vieäc so
saùnh hai chuoãi ñöôïc thöïc hieän baèng caùch so saùnh töøng
      W 87 w 119 caëp kyù töï töông öùng töø traùi qua phaûi. Khi phaùt hieän coù
moät caëp kyù töï khaùc nhau thì chuoãi naøo chöùa kyù töï
      X 88 x 120 nhoû hôn seõ nhoû hôn, ví duï:
           Bieåu thöùc ‘Anh’ < ‘an’ laø ñuùng vì ‘A’ < ‘a’
           Bieåu thöùc ‘Thong’ > ‘Tha’ laø ñuùng vì ‘o’ > ‘a’
      Y 89 y 121 Neáu noäi dungï cuûa hai chuoãi gioáng nhau töø ñaàu ñeán heát
chieàu daøi cuûa chuoãi ngaén hôn thì chuoãi ngaén hôn laø
      Z 90 z 122 nhoû hôn, ví duï: Bieåu thöùc ‘Tha’ < ‘Thang’ laø ñuùng vì
‘Tha’ ngaén hôn ‘Thang’.
Baûng 6.5
        Hai chuoãi baèng nhau neáu chuùng daøi baèng nhau vaø
Giöõa caùc kyù töï, coù moät thöù töï maëc nhieân theo nguyeân
moïi caëp kyù töï ôû caùc vò trí töông öùng ñeàu gioáng nhau.
taéc : kyù töï coù maõ nhoû hôn thì nhoû hôn. Töùc laø:
Ví duï:
Kyù töï traéng < ‘0’< ‘1’< ...< ‘9’< ‘A’< ‘B’< ...’Z’< ‘a’< ‘b’< ...<
            Bieåu thöùc ‘Pascal’ = ‘Pascal’ cho keát quûa laø ñuùng
‘z’
            Bieåu thöùc ‘Pascal’ = ‘PAscal’ cho keát quûa laø sai.
Giöõa caùc kyù töï, coù moät thöù töï maëc nhieân theo nguyeân
taéc : kyù töï coù maõ nhoû hôn thì nhoû hôn. Töùc laø:        Bieán nhaän giaù trò laø caùc haèng chuoãi goïi laø
Kyù töï traéng < ‘0’< ‘1’< ...< ‘9’< ‘A’< ‘B’< ...’Z’< ‘a’< ‘b’< ...< bieán kieåu chuoãi. Coù theå khai baùo hai bieán chuoãi nhö
‘z’ sau:
Giöõa caùc kyù töï, coù moät thöù töï maëc nhieân theo nguyeân             Var
taéc : kyù töï coù maõ nhoû hôn thì nhoû hôn. Töùc laø:                   Ho_ten : String[20];
Kyù töï traéng < ‘0’< ‘1’< ...< ‘9’< ‘A’< ‘B’< ...’Z’< ‘a’< ‘b’< ...<                   St : String;
‘z’ khi ñoù Ho_ten laø bieán chuoãi coù theå chöùa toái ña 20 kyù
Nhaäp vaøo ñoä daøi ba caïnh a,b,c cuûa moät tam giaùc, neáu a, töï, coøn bieán chuoãi St coù theå chöùa toái ña 255 kyù töï, vaø
b, c khoâng phaûi laø ba caïnh cuûa tam giaùc thì   in leân maøn ta coù theå gaùn :
hình caâu " khoâng phaûi ba caïnh cuûa tam gíac", ngöôïc laïi,             Ho_ten := ‘Nguyen Van An’;
neáu ñuùng laø ba caïnh cuûa moät tam giaùc thì tính chu vi vaø             St :=‘Thao chuong bang ngon ngu Pascal’;
dieän tích tam giaùc ñoù theo coâng thöùc Heâroâng:         Chuoãi ‘Nguyen Van An’ goïi laø gía trò cuûa bieán
Ho_ten. Töông töï, chuoãi ‘Thao chuong bang ngon ngu P ascal’
               , vôùi p laø nöûa chu laø gía trò cuûa bieán St.
vi: 7.1.2. Khai baùo bieán vaø khai baùo haèng
Turbo Pascal coù saün moät soá haèøng chuaån cho pheùp söû
duïng maø khoâng phaûi khai baùo, nhö : Pi, MaxInt . Haèng Pi
                coù gía trò baèng soá  , coøn MaxInt = 32767, laø soá Integer
lôùn nhaát. Chaúng haïn, coù theå duøng caùc leänh sau:
4
        Writeln(‘Dien tich hinh tron ban kinh r=5 la: ‘ , Pi*5*5:8:3);      * Hoaëc laø Max >= b, töùc gía trò cuûa Max laø lôùn nhaát
        Writeln(‘So Integer lon nhat = ‘ , MaxInt); roài neân khoâng phaûi laøm gì nöõa.
    Chöông trình cuï theå nhö sau:
Caáp öu Pheùp toaùn     PROGRAM VIDU81;
tieân     { Tim Max cuûa hai so }
    Var
1 bieåu thöùc trong ngoaëc ñôn       a, b, max : Real;
(...)     Begin
     Write(‘ Nhap a va b :’);
2 Caùc haøm      Readln(a,b);
     Max :=a ;
     If Max < b then Max:=b ;
3 NOT, - (pheùp laáy daáu aâm)
     Writeln(‘ So lon nhat la: ‘ , Max:6:2);
     Readln;
4 * , /, DIV, MOD, AND     End.
    Chaïy<VD81.EXE>
5 Shl, Shr     Cheùp file nguoàn <VD81.PAS>
    Nhaän xeùt:
6 +, - (tröø), OR, XOR      Vieäc tìm soá nhoû nhaát cuûa hai soá a, b cuõng töông töï,
ta duøng bieán phuï Min chöùa gía trò nhoû nhaát, vaø thöïc
7 =, <>, <, <=, >, >=, IN hieän caùc leänh sau:
            Min:=a;
Baûng 7.1             If Min > b then Min:=b;
    Coù theå môû roäng thuaäït toaùn treân ñeå tìm soá lôùn
Ví duï : tính bieåu thöùc loâgic : nhaát trong ba soá hoaëc nhieàu hôn. Ñaàu tieân ta tìm soá lôùn
    ( 2 > 4 div 2) or Not ( 49.25 + 2 < 50) nhaát cuûa hai soá a vaø b, kyù hieäu laø Max, sau ñoù tìm soá
            = (2 > 2) or Not ( 51.25 < 50) lôùn nhaát cuûa hai soá Max vaø c, cuõng vaãn kyù hieäu laø
            = FALSE or Not FALSE Max. Döôùi ñaây laø caùc leänh chính ñeå tìm soá lôùn nhaát
            = FALSE or TRUE trong ba soá a, b, c :
            = TRUE  Max:=a;
     If Max < b then Max:=b; { Max laø soá lôùn nhaát cuûa a vaø
7.4. KIEÅU LIEÄT KEÂ vaø KIEÅU ÑOAÏN CON b}
    7.4.1. Kieåu lieät keâ (enumerated type) :  If Max < c then Max:=c; { Max laø soá lôùn nhaát cuûa a, b
       7.4.1.1. Caùch khai baùo : vaø c }
    Ví duï 8.2: Nhaäp vaøo hoï teân vaø ñieåm trung bình
8.1. CAÂU LEÄNH IF : (DTB) cuûa moät sinh vieân. Haõy phaân loaïi sinh vieân theo
   8.1.1. Caâu leänh IF daïng 1: DTB nhö sau:
       8.1.1.1. Cuù phaùp, löu ñoà vaø yù nghóa:     Loaïi laø Keùm neáu DTB<5,
             Cuù phaùp :          laø Tbình neáu 5  DTB<7,
                  IF   Ñieàukieän  THEN    LeänhP ;          laø Khaù neáu 7  DTB<9,
    Ñieàukieän laø moät bieåu thöùc loâgic cho keát quûa TRUE          laø Gioûi neáu DTB  9.
(ñuùng) hay FALSE (sai). LeänhP coù theå laø moät leänh ñôn     In hoï teân, ñieåm trung bình vaø phaân loaïi sinh vieân.
giaûn hoaëc moät leänh coù caáu truùc. Neáu LeänhP laø moät     Trong chöông trình, ta duøng moät bieán phuï ñaët teân laø
leänh gheùp, töùc laø goàm nhieàu leänh, thì nhôù laø caùc leänh Loai ñeå löu tröõ phaân loaïi cuûa sinh vieân. Vì coù naêm loaïi
naøy phaûi ñöôïc ñaët trong khoái: begin vaø end . caàøn löu tröõ laø caùc chuoãi ‘Kem’, ‘Tbinh’, ‘Kha’, ‘Gioi’,
YÙ nghóa: Tuøy theo Ñieàukieän laø ñuùng hay sai maø quyeát neân bieán Loai phaûi coù kieåu döõ lieäu laø kieåu chuoãi.
ñònh coù laøm LeänhP hay khoâng. Neáu Ñieàukieän laø ñuùng     PROGRAM VIDU82;
thì laøm LeänhP roài chuyeån sang leänh keá tieáp ôû phía döôùi.     { Phaân loaïi sinh vieân }
Neáu Ñieàukieän laø sai thì khoâng laøm LeänhP maø chuyeån     Var
ngay sang leänh keá tieáp. Sô ñoàø cuù phaùp cuûa leänh IF ñöôïc       Ho_ten: String[18];
veõ trong hình 8.1.       DTB: Real;
       8.1.1.2. Caùc ví duï :       Loai: String[6];
       Ví duï 8.1: Nhaäp vaøo hai soá a vaø b, tìm vaø in leân     Begin
maøn hình soá lôùn nhaát cuûa hai soá ñoù.       Write(‘ Nhap ho va ten :’);
    Ta duøng moät bieán phuï ñaët teân laø Max ñeå chöùa gía trò       Readln(Ho_ten);
lôùn nhaát phaûi tìm. Thuaät toaùn goàm hai böôùc:       Write(‘ Nhap ñiem trung binh :’);
            Böôùc 1: Gaùn soá thöù nhaát vaøo Max, töùc laø:       Readln(DTB);
                Max:=a;       { phaân loaïi theo DTB }
            Böôùc 2: Kieåm tra neáu Max nhoû hôn soá thöù hai thì       If DTB< 5 then Loai:=‘Kem’;
gaùn soá thöù hai vaøo Max:       If (DTB>= 5) and (DTB<7) then Loai:=‘Tbinh’;
                If Max < b then Max:=b;       If (DTB >= 7) and (DTB< 9) then Loai:=‘Kha’;
            Böôùc 3: In gía trò Max leân maøn hình.       If DTB >= 9 then Loai:=‘Gioi’;
   Giaûi thích: Sau böôùc 1, bieán Max coù gía trò baèng a. Sang       Writeln(Ho_ten, #32 , DTB:4:1 , #32 , Loai); { #32 laø kyù
böôùc 2, coù theå xaûy ra hai tình huoáng : töï traéng }
      * Hoaëc laø Max < b , töùc b laø soá lôùn nhaát, khi ñoù gía       Readln;
trò lôùn nhaát b ñöôïc gôûi vaøo bieán Max     End.
5
    Chaïy<VD82.EXE>        YÙ nghóa cuûa leänh:    Tuøy theo Ñieàukieän laø
    Cheùp file nguoàn <VD82.PAS> ñuùng hay sai maø quyeát ñònh laøm moät trong hai leänh:
    Ví duï 8.3: Nhaäp vaøo ba heä soá A, B, C, (A  0) roài LeänhP hoaëc LeänhQ .
giaûi vaø bieän luaän phöông trình baäc hai:            Neáu Ñieàukieän laø ñuùng thì laøm LeänhP, khoâng
        Ax2 + Bx + C = 0 laøm LeänhQ, maø chuyeån ngay sang thöïc hieän leänh keá
    Vieäc ñaàu tieân laø phaûi tính Delta : tieáp ôû sau LeänhQ.
            Delta = B2 - 4AC                Ngöôïc laïi, neáu Ñieàukieän laø sai thì khoâng laøm
    Sau ñoù bieän luaän theo Delta: LeänhP maø laøm LeänhQ roài chuyeån sang leänh keá tieáp ôû
            Neáu Delta<0 : phöông trình voâ nghieäm sau LeänhQ.
            Neáu Delta=0 : phöông trình coù nghieäm keùp        Ví duï 8.4: Ñeå tìm soá lôùn nhaát cuûa hai soá a vaø b,
Neáu Delta > 0: phöông trình coù hai nghieäm              duøng leänh:
    Chöông trình cuï theå nhö sau:             If a<b then Max:=b  else   Max:=a;
    PROGRAM VIDU83;     Chöông trình döôùi ñaây seõ nhaäp vaøo hai soá a vaø b, tìm
    { Giaûi phöông trình baäc 2 } vaø in soá nhoû nhaát vaø soá lôùn nhaát cuûa chuùng:
    Var     PROGRAM VIDU84;
      A, B, C, Delta, X1, X2 : Real;     { Tim so lon nhat va so nho nhat cuûa hai so }
    Begin     Var
      Repeat        a, b, Max, Min : Real;
        Write( ‘ Nhap he so A khac khong :’);     Begin
        Readln(A);        Write(‘ Nhap a va b :’);
      Until A<>0;        Readln(a,b);
      Write( ‘ Nhap cac he so B, C: ‘);        If a < b then
      Readln(B, C);          begin
      Delta:=B*B - 4*A* C;            Max:= b;
      If Delta < 0 then Writeln( ‘ Ptrinh voâ nghieäm! ‘);            Min:= a;
      If Delta = 0 then          end
        begin        else { tröôùc else khoâng coù daáu ; }
          X1:=-B/(2*A);          begin
          Writeln(‘ Coù ng. keùp X1=X2= ‘ , X1:8:2);            Max:= a;
        end;            Min:= b;
      If Delta > 0 then          end;
        begin        Writeln(‘ So lon nhat la: ‘ , Max:6:2);
          X1 := (-B+ Sqrt(Delta) ) / (2*A);        Writeln(‘ So nho nhat la: ‘ , Min:6:2);
          X2 := (-B - Sqrt(Delta) ) / (2*A);        Readln;
          Writeln(‘ Coù hai nghieäm : ’);      End.
          Writeln(‘X1= ‘ , X1:8:2);     Chaïy<VD84.EXE>
          Writeln(‘X2= ‘ , X2:8:2);     Cheùp file nguoàn <VD83.PAS>
        end;   8.1.3. Caâu leänh IF loàng nhau :
      Readln;     Trong caâu leänh IF, neáu LeänhP hoaëc LeänhQ, hoaëc caû
    End. hai, laïi laø caâu leänh IF thì ta coù caáu truùc IF loàng nhau.
    Chaïy<VD83.EXE> Chaúng haïn döôùi ñaây laø hai caâu leänh IF... ELSE loàng
    Cheùp file nguoàn <VD83.PAS> nhau :
    Trong chöông trình coù ba leänh IF xeùt rieâng töøng tröôøng     IF  Ñieàukieän1  THEN
hôïp Delta aâm, baèng khoâng hoaëc döông. Chuù yù raèng khi         If  Ñieàukieän2  then LeänhP
Delta=0 thì phaûi laøm hai leänh:         else
            X1:=-B/(2*A);             LeänhQ
            Writeln(‘ Coù ng. keùp X1=X2= ‘ , X1:8:2);      ELSE
neân hai leänh naøy phaûi ñöôïc ñaët giöõa hai töø khoùa begin         LeänhR ;
vaø end ñeå taïo thaønh moät caâu leänh gheùp.     Ví duï 8.5: Nhaäp vaøo hoï teân moät chuû hoä, chæ soá
    Töông töï, khi Delta>0 thì phaûi laøm naêm leänh, vaø do ñoù ñieän keá thaùng tröôùc (chiso1) vaø chæ soá ñieän keá thaùng
caû naêm leänh cuõng phaûi ñeå trong khoái begin vaø end. naøy (chiso2), tính tieàn ñieän thaùng naøy cho hoä, bieát
    Chöông trình coù söû duïng leänh Repeat ... Until (seõ trình raèng :
baøy ôû phaàn sau) ñeå buoäc ngöôøi duøng phaûi nhaäp heä soá     Moãi kw trong 60 kw ñaàu tieân coù ñôn gía laø 5ñ,
A 0, neáu nhaäp A=0 thì phaûi nhaäp laïi cho ñeán khi A 0     Töø kw thöù 61 ñeán kw thöù 160 coù ñôn giaù 8ñ,
môùi cho laøm tieáp caùc leänh ôû phía döôùi.     Töø kw thöù 161 trôû leân coù ñôn gía 10ñ.
    8.1.2. Caâu leänh IF daïng 2:     Ví duï, oâng A coù chæ soá ñieän thaùng tröôùc laø
       Cuù phaùp : chiso1=1020 vaø chæ soá ñieän thaùng naøy laø chiso2=1070,
        IF  Ñieàukieän  THEN  LeänhP löôïng ñieän tieâu thuï tính ra laø Ldtt= 1070-1020=50, do
        ELSE löôïng ñieän tieâu thuï < 60 neân soá tieàn seõ laø:
             LeänhQ ;             Tien = 50*5= 250ñ.
     Chuù yù : + Tröôùc töø khoùa ELSE khoâng coù daáu     Neáu chiso2=1150 thì Ldtt = 1150-1020=130, do löôïng ñieän
chaám phaåy. tieâu thuï vöôït quùa 60 kw nhöng chöa vöôït quùa 160 kw neân
                        +   LeänhP vaø LeänhQ coù theå laø moät leänh tieàn ñieän ñöôïc tính laø:
gheùp, töùc laø goàm nhieàu leänh ñöôïc ñaët trong khoái begin             Tien=60*5 + (130-60) *8 = 860 ñ.
vaø end.     Neáu chiso2=1234, thì Ldtt = 1234-1020= 214, do löôïng
ñieän tieâu thuï vöôït quùa 160 kw neân tieàn ñieän seõ laø:
6
            Tien=60*5 + 100*8 + (214-160)*10= 300+800+54*10=       Readln(T3);
1640 ñ.       Writeln(‘ Caùc teân ñöôïc saép thöù töï laø:’);
    Chöông trình ñöôïc vieát nhö sau:       IF T1<T2 THEN
    PROGRAM VIDU85;         If T2<T3 then writeln(T1, #32 , T2, #32 , T3)
    { Tính tieàn ñieän }         Else { töùc T3 <= T2 }
    Var           if T1<T3 then writeln(T1, #32 , T3, #32, T2)
       Ho_ten: String[18];           else { töùc T3 <= T1 }
       chiso1, chiso2, Ldtt, Tien : Real;             writeln(T3, #32, T1, #32, T2)
    Begin       ELSE { töùc laø T2<= T1}
       Write(‘ Nhap ho va ten :’);         If T1<T3 then writeln(T2, #32, T1, #32, T3)
       Readln(Ho_ten);         Else { töùc laø T3<= T1}
       Write(‘ Nhap chæ soá thaùng tröôùc, chæ soá thaùng           if T2<T3 then writeln(T2, #32, T3, #32, T1)
naøy: ‘);           else { töùc laø T3<= T2 }
       Readln( chiso1, chiso2);             writeln(T3, #32, T2, #32, T1);
       Ldtt:=chiso2- chiso1;       Readln;
       If Ldtt<= 60 then Tien:=Ldtt*5     End.
       else     Chaïy<VD87.EXE>
         if Ldtt <=160 then Tien:=60*5+(Ldtt - 60)*8     Cheùp file nguoàn <VD87.PAS>
         else     Leänh IF trong chöông trình treân loàng nhau nhieàu caáp
           Tien:=60*5 + 100*8 + (Ldtt - 160) * 10; neân raát phöùc taïp. Khi hoïc caáu truùc maûng ta seõ giaûi
       Writeln(‘ Hoï vaø teân laø ‘, Ho_ten); baøi toaùn naøy goïn hôn.
       Writeln(‘ Tieàn phaûi traû laø ‘ , Tien:10:2);     Chuù yù: Trong caâu leänh IF loàng nhau, caùch xaùc
       Readln; ñònh töø khoùa ELSE naøo ñi vôùi töø khoùa IF naøo laø nhö
    End. sau: xeùt ngöôïc töø döôùi leân, ELSE luoân ñi vôùi IF gaàn
    Chaïy<VD85.EXE> nhaát ôû phía treân noù maø chöa coù ELSE ñeå baét caëp.
    Cheùp file nguoàn <VD85.PAS>
8.2. CAÂU LEÄNH CASE :
    Ví duï 8.6: Nhaäp soá thöïc x baát kyø, tính :         8.2.1. Cuù phaùp, löu ñoà vaø yù nghóa :
    Trong Turbo Pascal khoâng coù haøm tính caên baäc ba cuûa x.     Trong moät soá tröôøng hôïp, khi phaûi löïa choïn moät vieäc
Ñeå tính ta phaûi duøng hai haøm Exp(x) vaø Ln(x). trong nhieàøu vieäc thì caùc caáu truùc IF loàng nhau toû ra raéc
    AÙp duïng coâng thöùc toaùn hoïc: x = elnx vôùi x>0, ta coù: roái, khoù vieát, khoù kieåm tra tính ñuùng ñaén cuûa noù.
    Vaäy : Vieäc duøng caáu truùc CASE coù theå khaéc phuïc ñöôïc
                nhöôïc ñieåm naøy.
    Chöông trình nhö sau:     Leänh CASE coù hai daïng, chuùng chæ khaùc
    PROGRAM VIDU86; nhau ôû moät ñieåm laø trong daïng 2 coù ELSE
    { Tinh can bac ba cua x }
    Var
LeänhQ, coøn trong daïng 1 thì khoâng ( hình 8.3).
      x, y : Real; CASE bieåuthöùc
    Begin OF
      Write(‘ Nhap x :’); CASE bieåuthöùc OF
     haèng1 :
      Readln(x);      haèng1 : LeänhP1;
LeänhP1;
      { tinh y }      haèng2 : LeänhP2;
     haèng2 :
      If x= 0 then y:=0      . . . .
LeänhP2;
      else      haèngk :
     . . . .
        If x> 0 then y:=Exp( 1/3*ln(x) ) LeänhPk;
     haèngk :
        else      ELSE   LeänhQ;
LeänhPk;
          y:= - Exp( 1/3*ln(-x) ); END;
END;
      Writeln(‘ gia tri y= ‘ , y:8:4);           Daïng 2
 
      Readln;            Daïng 1
    End.
    Chaïy<VD86.EXE>                  Hình 8.3 : Cuù phaùp cuûa leänh Case
    Cheùp file nguoàn <VD86.PAS>          Chuù yù laø leänh CASE phaûi keát thuùc baèng END;
    Ví duï 8.7: Nhaäp teân cuûa ba sinh vieân, in caùc teân ñoù    Caùc yeâu caàu:
leân maøn hình theo thöù töï ñaõ saép xeáp theo vaàn A, B, C,        Kieåu döõ lieäu cuûa bieåuthöùc chæ coù theå laø
...Ví duï, nhaäp ba teân laø MAI, TUAN, BINH, thì in ra laø nguyeân, kyù töï, Loâgic, hoaëc kieåu lieät keâ hay kieåu ñoaïn
BINH, MAI, TUAN. con ïXin nhaán maïnh raèng: bieåuthöùc khoâng ñöôïc laø kieåu
    PROGRAM VIDU87; thöïc hay kieåu chuoãi, vaø ñaây chính laø haïn cheá cuûa leänh
    { Saép xeáp ba teân} CASE so vôùi leänh IF.
    Var         Caùc haèøng1, haèng2, ..., haèngk phaûi coù kieåu döõ
      T1, T2, T3 : String[8]; lieäu phuø hôïp vôùi kieåu döõ lieäu cuûa bieåuthöùc.
    Begin     YÙ nghóa: Tuøy theo gía trò cuûa bieåuthöùc baèng
      Write( ‘Nhaäp teân thöù nhaát: ‘); haèng naøo trong caùc haèøng1, haèng2, ..., haèngk maø quyeát
      Readln(T1); ñònh thöïc hieän leänh naøo trong caùc leänhP1, leänhP2, ...,
      Write( ‘Nhaäp teân thöù hai: ‘); LeänhPk.
      Readln(T2);
    Caùch thöùc thöïc hieän cuûa leänh CASE nhö sau:
      Write( ‘Nhaäp teân thöù ba: ‘);
        Böôùc 1: Tính toaùn gía trò cuûa bieåuthöùc
7
        Böôùc 2: So saùnh vaø löïa choïn:              Phanloai:=‘So sinh’ ;
            Neáu gía trò cuûa bieåuthöùc = haèøng1 thì thöïc hieän     Ñoùng vai troø haèng2 laø taát caû caùc soá nguyeân trong
LeänhP1, roài chuyeån sang leänh keá tieáp sau End, ngöôïc laïi: phaïm vi töø 2 ñeán 9, vaø doøng :
            Neáu gía trò cuûa bieåuthöùc = haèøng2 thì thöïc hieän             2 ..9 : Phanloai:= ‘nhi ñong’;
LeänhP2, roài chuyeån sang leänh keá tieáp sau End, ngöôïc laïi: coù nghóa laø khi Tuoåi baèng moät trong caùc soá nguyeân töø
                .v.v. 2 ñeán 9 thì thöïc hieän leänh gaùn: Phanloai:= ‘nhi ñong’;
             Neáu gía trò cuûa bieåuthöùc = haèøngk thì thöïc hieän     Ví duï 8.9:
LeänhPk, roài chuyeån sang leänh keá tieáp sau End, ngöôïc laïi :     Xaây döïng thöïc ñôn cho pheùp löïa choïn moät trong boán
    a) chuyeån ngay sang leänh keá tieáp sau End ( neáu laø daïng vieäc : tính toång , tính hieäu, tính tích hoaëc tính thöông cuûa
1) hai soá x, y nhaäp töø baøn phím.
    b) thöïc hieän LeänhQ, roài chuyeån sang leänh keá tieáp sau     Maøn hình caàn hieän ra boán muïc sau cho moïi ngöôøi löïa
End (neáu laø daïng 2) . choïn :
    Hình 8.4 vaø hình 8.5 laø caùc sô ñoà cuûa leänh CASE veõ             A. TÍNH TOÅNG HAI SOÁ
cho tröôøng hôïp k=3.             B. TÍNH HIEÄU HAI SOÁ
    Trong hình veõ , ta kyù hieäu:             C. TÍNH TÍCH HAI SOÁ
            G laø gía trò cuûa bieåuthöùc             D. TÍNH THÖÔNG HAI SOÁ
            H1, H2, H3 laø haèng1, haèng2, haèng3     Muoán choïn muïc naøo ta goõ chöõ caùi ñaàu cuûa muïc ñoù.
            P1, P2, P3, Q laø LeänhP1, LeänhP2 , LeänhP3 vaø Ví duï goõ A thì maøn hình hieän keát quûa cuûa x+y, goõ B
LeänhQ. thì hieän keát quûa cuûa x-y, ... Ñoái vôùi muïc D, neáu y khaùc
                .2. Caùc ví duï : khoâng thì in keát quûa cuûa x/y, coøn y=0 thì in caâu " Khoâng
       Ví duï 8.8: Nhaäp vaøo hoï teân vaø naêm sinh cuûa moät xaùc ñònh".
ngöôøi, cho bieát ngöôøi naøy thuoäc löùa tuoåi naøo: sô sinh, nhi     Neáu ngöôøi duøng nhaäp moät kyù töï khaùc A, B, C, D, a,
ñoàng, thieáu nieân, thanh nieân, trung nieân hay ngöôøi lôùn b, c, d thì maùy hieän lôøi nhaéc : " Khoâng coù muïc naøy ".
tuoåi, bieát raèng:     Bieán Ch kieåu kyù töï ñöôïc duøng ñeå löu chöõ caùi (muïc)
    Sô sinh coù tuoåi töø 0 ñeán 1 maø ngöôøi duøng ñaõ choïn. Tuøy theo giaù trò cuûa Ch maø
    Nhi ñoàng : coù tuoåi töø 2 ñeán 9 leänh CASE seõ quyeát ñònh phaûi laøm gì.
    Thieáu nieân coù tuoåi töø 10 ñeán 15     Chöông trình ñöôïc vieát nhö sau :
    Thanh nieân coù tuoåi töø 16 ñeán 32     PROGRAM VIDU89;
    Trung nieân coù tuoåi töø 33 ñeán 50     { Thöïc ñôn }
    Ngöôøi lôùn tuoåi coù tuoåi treân 50.     Uses Crt;
Chöông trình ñöôïc vieát nhö sau:     Var
    PROGRAM VIDU88;       x, y : Real;
    Var       Ch : Char;
      Ho_ten: String[20];     Begin
      Namsinh, Namnay, Tuoi : Integer ;       Clrscr;
      Phanloai : String[14];       Write('Nhap x va y:');
    Begin       Readln(x, y);
      Write(‘ Nhaäp hoï vaø teân: ‘);       Gotoxy(10, 3); Write('A. TINH TONG HAI SO');
      Readln(Ho_ten);       Gotoxy(10, 5); Write('B. TINH HIEU HAI SO');
      Write(‘ Nhaäp naêm sinh vaø naêm nay : ‘);       Gotoxy(10, 7); Write('C. TINH TICH HAI SO');
      Readln(Namsinh, Namnay);       Gotoxy(10, 9); Write('D. TINH THUONG HAI SO');
      Tuoi:=Namnay - Namsinh;       Gotoxy(2,11); Write('-Ban chon muc nao (A, B, C,
      If Tuoi< 0 then writeln( ‘Nhaäp sai ‘) D) ?:');
      else       Readln(Ch);
        begin       CASE Ch  of
          Case Tuoi OF         'A', 'a': Writeln('Tong =', x+y :6:2);
            0 ,1 : Phanloai:= ‘sô sinh’;         'B', 'b': Writeln(' Hieu =', x-y :6:2);
            2 ..9 : Phanloai:= ‘nhi ñong’;         'C', 'c': Writeln(' Tich =', x*y :6:2);
            10 ..15 : Phanloai:= ‘thieu nieân’;         'D', 'd': If y<>0 then Writeln(' Thuong =', x/y:6:2 )
            16 ..32 : Phanloai:= ‘thanh nien’;                else   Writeln(' Khong xac dinh !');
            33 ..50 : Phanloai:= ‘trung nien’;         ELSE
            else   Phanloai:= ‘nguoi lon tuoi’;            Writeln(' Khong co muc ', Ch);
          End; { heát Case }       END;
          Writeln(Ho_ten, #32 , Tuoi, #32 , Phanloai);       Readln;
        end;     End.
      Readln;     Chaïy<VD89.EXE>
    End.     Cheùp file nguoàn <VD89.PAS>
    Chaïy<VD88.EXE>     Trong chöông trình coù söû duïng thuû tuïc : GOTOXY ( m,
    Cheùp file nguoàn <VD88.PAS> n) thuoäc thö vieän CRT, coù chöùc naêng ñaët con troû maøn
    Trong ví duï naøy, leänh CASE döïa vaøo Tuoåi ñeå xaùc ñònh hình vaøo toïa ñoä coät thöù m, doøng thöù n treân maøn hình.
löùa tuoåi, keát quûa löu vaøo bieán Phanloai. Ñoùng vai troø Ví duï leänh Gotoxy (10, 3); ñaët con troû maøn hình vaøo toïa
haèng1 laø hai soá 0 vaø 1 vieát caùch nhau bôûi daáu phaåy, vaø ñoä coät 10, doøng 3.
doøng :     Ví duï 8.10:
            0,1: Phanloai:=‘So sinh’ ;     Nhaäp vaøo thaùng vaø naêm, cho bieát thaùng ñoù trong
coù nghóa laø khi Tuoåi baèng 0 hoaëc baèng 1 thì thöïc hieän naêm ñoù coù bao nhieâu ngaøy.
leänh gaùn:     Theo döông lòch :
8
            Caùc thaùng 4, 6, 9, vaø 11: coù 30 ngaøy,     Ví duï neáu oâng X ñöôïc xeáp loaïi A vaø laøm vieäc ôû cô
            Caùc thaùng 1, 3, 5, 7, 8, 10 vaø 12: coù 31 ngaøy, sôû 1 thì coù heä soá thöôûng laø 2.0, neân tieàn thöôûng laø
     Rieâng thaùng 2 thì bình thöôøng coù 28 ngaøy, nhöng neáu =2.0*200=400.
laø naêm nhuaän thì coù 29 ngaøy.     Vieát chöông trình nhaäp hoï teân, phaân loaïi lao ñoäng vaø
    Caùch xaùc ñònh moät naêm laø nhuaän nhö sau: nôi laøm vieäc cuûa moät coâng nhaân, tính tieàn thöôûng cho
            * hoaëc laø naêm chia heát cho 400 (ví duï naêm 1600, ngöôøi ñoù.
naêm 2000).     PROGRAM VIDU811;
            * hoaëc laø naêm khoâng chia heát cho 100 vaø chia heát     { Tính tieàn thöôûng cho coâng nhaân }
cho 4 ( ví duï caùc naêm 1988, 1992, 1996 ñeàu laø naêm     Var
nhuaän).       Ho_ten: String[20];
    Trong chöông trình ta duøng moät bieán loâgic coù teân laø       Loai : Char;
Nhuan ñeå xaùc ñònh coù phaûi laø naêm nhuaän hay khoâng.       Coso : Byte;
    PROGRAM VIDU810;       Heso, Thuong : Real;
    { Xaùc ñònh soá ngaøy cuûa thaùng }     Begin
    Var       Write(‘ Nhaäp hoï vaø teân: ‘);
      Thang, Nam, Songay : Integer ;       Readln(Ho_ten);
      Nhuan : Boolean;       Write(‘ Nhaäp cô sôû laøm vieäc (1,2): ‘);
    Begin       Readln(Coso);
      Write(‘Nhaäp Thang, Nam : ‘);       Write(‘ Nhaäp phaân loaïi lao ñoäng (A,B,C) : ‘);
      Readln(Thang, Nam);       Readln(Loai);
      If (Thang<1) or ( Thang>12) then writeln(‘ Nhaäp sai ’)       CASE  Loai  OF
      else         ‘A’, ‘a’: Case Coso of
        begin                   1: Heso:=2.0;
          Case Thang OF                   2: Heso:=2.5;
            4, 6, 9, 11 : Songay:=30;                 end;
            1, 3, 5, 7, 8, 10, 12 : Songay:=31;         ‘B’, ‘b’: Case Coso of
            2 : begin                   1: Heso:=1.5;
                Nhuan:= (Nam mod 400=0) or                   2: Heso:=1.8;
                       ( (Nam mod 100<>0) and (Nam mod 4=0) );                 end;
                If Nhuan= TRUE then Songay:=29 else Songay:=28;         ‘C’, ‘c’: Heso:=1.0;
              end;       END; { Heát CASE }
          End; { Heát Case }       Thuong:=Heso*200;
          Writeln(‘ Soá ngaøy laø : ‘ , Songay);       Writeln(‘Hoï vaø teân Tieàn thöôûng ‘);
        end;       Writeln(Ho_ten , Thuong:8:2 );
      Readln;       Readln;
    End.     End.
    Chaïy<VD810.EXE>     Chaïy<VD811.EXE>
    Cheùp file nguoàn <VD810.PAS>      Cheùp file nguoàn <VD811.PAS>
    Trong ví duï naøy, khi Thaùng=2 thì phaûi laøm hai leänh ñöôïc   8.2.4. So saùnh leänh Case vôùi leänh If :
ñaët trong khoái begin vaø end, ñoù chính laø moät leänh gheùp:       Leänh If vaø leänh Case ñeàu laø caùc caâu leänh reõ
    begin nhaùnh, cho pheùp löïa choïn moät coâng vieäc trong nhieàu
      Nhuan:= (Nam mod 400=0) or ( (Nam mod 100<>0) and coâng vieäc ñöôïc löïa choïn. Nhöng caáu truùc If toång quaùt
(Nam mod 4=0) ); vaø maïnh hôn caáu truùc Case vì leänh If khoâng haïn cheá gì
     If Nhuan= TRUE then Songay:=29 else Songay:=28; caû, coøn leänh Case thì yeâu caàu bieåu thöùc vaø caùc haèng
    end; phaûi thuoäc kieåu döõ lieäu ñeám ñöôïc: nguyeân, kyù töï, loâ
  8.2.3. Caâu leänh CASE loàng nhau : gic, lieät keâ hay ñoaïn con, khoâng ñöôïc laø kieåu thöïc hay
    Trong caáu truùc CASE, khi moät trong caùc LeänhP1, chuoãi.
LeänhP2, ..., LeänhPk hay LeänhQ laïi laø moät leänh CASE thì ta     Leänh Case naøo cuõng coù theå thay theá töông ñöông
coù caáu truùc CASE loàng nhau. baèng caùc leänh IF. Ví duï leänh Case trong chöông trình noùi
    Ví duï 8.11: Moät xí nghieäp tính tieàn thöôûng haøng thaùng treân ( Ví duï 8.11 ) coù theå thay baèng ba leänh If sau:
cho coâng nhaân theo coâng thöùc : Tieàn thöôûng= Heä soá *     If (Loai=‘A’) or (Loai=‘a’) then
200.        if Coso=1 then Heso:=2.0 else Heso:=2.5;
    Trong ñoù Heä soá ñöôïc tính döïa vaøo keát quûa bình choïn     If (Loai=‘B’) or (Loai=‘b’) then
phaân loaïi lao ñoäng (loaïi A, B hay C) vaø nôi laøm vieäc (cô       if Coso=1 then Heso:=1.5 else Heso:=1.8;
sôû 1 hay cô sôû 2) cuûa moãi ngöôøi trong thaùng, cuï theå nhö     If (Loai=‘C’) or (Loai=‘c’) then Heso:=1.0;
sau :     Tuy nhieân khoâng phaûi leänh If naøo cuõng thay baèng
leänh Case ñöôïc.
Loaïi Cô sôû 1 Cô sôû 2     Vieäc söû duïng leänh Case trong nhieàu tröôøng hôïp coù
taùc duïng laøm roõ raøng vaø noåi baät boá cuïc cuûa moät
A 2.0 2.5 ñoaïn chöông trình, töø ñoù deã ñoïc, deã hieåu hôn.
    Thoâng thöôøng, ngöôøi ta duøng leänh Case ñeå thay theá
B 1.5 1.8 caùc caáu truùc If loàng nhau khi coù nhieàu ( ba, boán, ... ) tình
huoáng reõ nhaùnh vaø khi ñieàu kieän cho pheùp .
C 1.0 1.0     Caùc baïn haõy vieát laïi caùc chöông trình trong caùc ví duï
8.8, 8.9, 8.10, 8.11 nhöng thay leänh Case baèng caùc leänh IF
9.1. CAÂU LEÄNH LAËP FOR
9
    9.1.1. Caâu leänh FOR daïng 1:     Cheùp file nguoàn <VD91.PAS>
     9.1.1.1. Cuù phaùp , löu ñoà, caùch thöùc hoaït ñoäng :   Môû roäng baøi toaùn tính toång: Tính toång ñan daáu :
           Cuù phaùp:     S = 12 - 22 + 32 - 42 +...+(-1)N-1 N2
                FOR bieán := m1 TO m2 DO LeänhP;     Ta vieát:
             Yeâu caàøu:             S = 12 + (- 22 ) + 32 + (- 42 ) + ... +(-1)N-1 N2
    bieán phaûi thuoäc kieåu döõ lieäu ñôn giaûn ñeám ñöôïc,     Nhaän thaáy, soá haïng thöù i cuûa veá phaûi coù gía trò
thöôøng laø kieåu nguyeân, kyù töï hay loâ gic, khoâng theå laø tuyeät ñoái baèng i2 , mang daáu coäng neáu i leû, mang daáu
kieåu thöïc hay chuoãi. tröø neáu i chaün. Noùi caùch khaùc, ta seõ coäng doàn i2 vaøo S
    m1, m2 laø caùc bieåu thöùc coù cuøng kieåu döõ lieäu vôùi neáu i leû, vaø coäng doàn (- i2 ) vaøo S neáu i chaün. Vieäc
bieán, xaùc ñònh i leû hay chaün döïa vaøo haøm Odd(i) hay keát quûa
    LeänhP coù theå laø moät leänh ñôn giaûn, leänh coù caáu cuûa pheùp toaùn i Mod 2. Vaäy, caùc leänh seõ duøng laø :
truùc, hoaëc laø moät leänh gheùp goàm nhieàu leänh ñaët trong     S:=0;
khoái begin vaø end.     For i:=1 To N DO
    Hình 9.1 laø sô ñoà khoái cuûa leänh For vôùi b laø vieát taét       if i mod 2 <> 0 then S:=S+ i*i else S:= S- i*i ;
cuûa bieán.     Caùc baïn haõy vieát chöông trình ñeå tính toång ñan daáu
            Caùch thöùc hoaït ñoäng cuûa FOR: naøy.
    Böôùc 1: Gaùn giaù trò bieán := m1;  
    Böôùc 2: Neáu bieán  m2 thì laøm LeänhP, roài sang böôùc 3;        Ví duï 9.2: Baøi toaùn tính tích:
           Neáu bieán >m2 thì khoâng laøm LeänhP maø chuyeån     Tính S= 10! .
sang leänh keá tieáp ôû phía döôùi.     Ta vieát S=1*2*3*...*10.
    Böôùc 3 : Taêng gía trò cuûa bieán : bieán:=Succ(bieán);     Thuaät toaùn:
                    Quay laïi böôùc 2.     Böôùc 0: gaùn S:=1; { gaùn gía trò ban ñaàøu cho S}
    Toùm laïi, LeänhP seõ ñöôïc laøm ñi laøm laïi, baét ñaàøu khi     Böôùc 1: gaùn S:=S*1; { ñöôïc S=1 }
bieán=m1, vaø keát thuùc khi bieán =m2+1, caû thaûy laø m2-     Böôùc 2: gaùn S:=S*2; { ñöôïc S=1*2}
m1+1 laàn. Vì theá, ngöôøi ta goïi FOR laø voøng laëp coù soá     Böôùc 3: gaùn S:=S*3; { ñöôïc S=1*2*3}
laàøn laëp ñaõ bieát tröôùc.       .v.v.
     9.1.1.2. Caùc ví duï cô baûn :     Böôùc 10: gaùn S:=S*10; { ñöôïc S=1*2*3*...*10 =10!}
        Ví duï 9.1: Baøi toaùn tính toång :     Neáu trong ví duï 1, ta phaûi coäng doàn vaøo bieán S thì
    Haõy tính toång : S= 12 + 22+ 32+...+ 102 trong ví duï naøy ta phaûi nhaân doàn vaøo bieán S. Taïi böôùc
    Thuaät toaùn: thöù i, laáy gía trò cuûa bieán S nhaân vôùi i, roài laïi gaùn keát
    Böôùc 0: gaùn S:=0; { gaùn gía trò ban ñaàøu cho S} quûa cho bieán S. Khi i thay ñoåi töø 1 ñeán 10 thì S seõ tích
    Böôùc 1: gaùn S:=S+1*1; { ñöôïc S=12 } luõy ñuû caùc thöøa soá 1, 2, 3,...,10, vaø gía trò cuûa S sau
    Böôùc 2: gaùn S:=S+2*2; { ñöôïc S=12+22} böôùc thöù 10 ñuùng baèng 1*2*3*...*10 =10!.
    Böôùc 3: gaùn S:=S+3*3; { S=12+22+32}     Quùa trình thöïc hieän töø böôùc 1 ñeán böôùc thöù 10 ñöôïc
    .v.v. moâ taû baèng caâu leänh For :
    Böôùc 10: gaùn S:=S+10*10; { ñöôïc S=12+22+32+...+102}             For i:=1 to 10 DO S:=S * i ;
    Quùa trình töø böôùc 1 ñeán böôùc 10 ñöôïc goïi laø pheùp     Moät caùch toång quaùt, ñeå tính tích: S= 1*2*...*N , trong
coäng doàn vaøo bieán S. Taïi böôùc thöù i, laáy gía trò cuûa ñoù N laø moät soá nguyeân döông baát kyø, ta duøng hai leänh:
bieán S coäng vôùi i2, keát quûa laïi ñöôïc gaùn cho bieán S, do             S:=1;
ñoù gía trò cuûa bieán S ñöôïc taêng theâm moät löôïng baèøng i2.             For i:=1 To N DO S:=S* i ;
Khi i thay ñoåi töø 1 ñeán 10 thì caùc soá 12, 22, 32, ..., 102 ñeàu     Döôùi ñaây laø chöông trình cuï theå :
ñöôïc coäng vaøo S, keát quûa laø sau böôùc thöù 10 gía trò cuûa     PROGRAM VIDU92;
S ñuùng baèng toång 12 + 22 + 32 + ... + 102.     { Tính S=N! }
    Toùm laïi, leänh: S:=S + i*i; ñöôïc laøm caû thaûy 10 laàøn,     Var
öùng vôùi i=1, 2, ..., 10. Quùa trình naøy ñöôïc dieãn ñaït baèøng       N, i : Integer;
leäõnh FOR, nhö sau:       S : LongInt;
    For i:=1 To 10 DO S:=S+ i*i ;     Begin
    Moät caùch toång quaùt, ñeå tính toång :S= 12 + 22+ 32+...+ N2 ,       Write(‘Nhaäp soá döông N : ‘); Readln(N);
trong ñoù N laø moät soá nguyeân döông baát kyø, ta duøng hai       S:=1;
leänh:       For i:=1 to N do S:=S * i ;
          S:=0;       Writeln(‘Giai thua = ‘, S);
            For i:=1 To N DO S:=S+ i*i ;       Readln;
    Döôùi ñaây laø chöông trình cuï theå :     End.
    PROGRAM VIDU91;     Chaïy<VD92.EXE>
    { Tính toång caùc bình phöông caùc soá töï nhieân <=N}     Cheùp file nguoàn <VD92.PAS>
    Var       Ví duï 9.3: Baøi toaùn tính luõy thöøa:
      N, i : Integer;     Nhaäp soá töï nhieân N vaø moät soá thöïc x baát kyø, tính S=
      S : LongInt; xN .
    Begin                             
      Write(‘ Nhaäp N :’); Readln(N);
      S:=0;
      For i:=1 to N do S:=S+i*i ;
      Writeln(‘S= ‘, S);
      Readln;     Töông töï nhö tính N!: ñaàu tieân ta gaùn S:=1, sau ñoù taïi
    End. moãi böôùc laëp, ta nhaân doàn x vaøo S baèng leänh S:=S*x.
    Chaïy<VD91.EXE>
10
Sau N böôùc nhö vaäy, S seõ ñöôïc nhaân vôùi x ñuùng N laàn.     Caùch thöùc hoaït ñoäng cuûa FOR daïng 2:
Vaäy hai leänh caàn duøng laø:     Böôùc 1: gaùn gía trò bieán := m2;
            S:=1;     Böôùc 2: Neáu bieán  m1 thì laøm LeänhP, roài sang
            For i:=1 TO N DO S:=S*x; böôùc 3.
    Döôùi ñaây laø chöông trình cuï theå :                    Neáu bieán<m1 thì khoâng laøm LeänhP maø
    PROGRAM VIDU93; chuyeån sang leänh keá tieáp ôû phía döôùi.
    { Tính S=luõy thöøa N cuûa x }     Böôùc 3 : Giaûm gía trò cuûa bieán : bieán:=Pred(bieán);
    Var                     Quay laïi böôùc 2.
      N, i : Byte ;     Toùm laïi, LeänhP seõ ñöôïc laøm ñi laøm laïi, baét ñaàøu khi
      S, x : Real ; bieán=m2, vaø keát thuùc khi bieán = m1-1, caû thaûy laø
    Begin m2-m1+l lÇn
      Write(‘Nhaäp hai soá x vaø N : ‘);     Ví duï 9.5: Ñeå tính S= N!, ta coù theå vieát :
      Readln( x, N);                 S=N*(N-1)*(N-2)*...*2*1
      S:=1;         Caùch vieát cho thaáy ngay caùch tính: ñaàu tieân gaùn
      For i:= 1 to N do S := S * x ; S:=1, sau ñoù thöïc hieän vieäc nhaân doàn S:=S* i vôùi i= N,
      Writeln(‘Luy thua= ‘, S : 6:2); N-1,..., 2, 1. Töùc laø:
      Readln;             S:=1;
    End.              For i:=N downto 1 do S:=S* i;
    Chaïy <VD93.EXE>     Töông töï , ñeå tính S=xN , ta cuõng coù theå duøng FOR
    Cheùp file nguoàn <VD93.PAS> daïng 2 :
    Ví duï 9.4: In baûng caùc chöõ caùi töø A ñeán Z thaønh             S:=1;
boán coät nhö sau:             For i:=N downto 1 do S:=S* x;
    KYÙ TÖÏ    MAÕ     KYÙ TÖÏ    MAÕ     Nhö vaäy, leänh FOR daïng 2 veà baûn chaát chæ laø moät
       A       65        a         97 caùch vieát khaùc cuûa daïng 1. Thoâng thöôøng ngöôøi ta hay
       B      66        b         98 duøng leänh FOR daïng 1, tuy nhieân coù khaù nhieàu tình
    Yeâu caàu in thaønh töøng trang maøn hình, moãi trang 15 huoáng maø vieäc duøng leänh FOR daïng 2 toû ra raát hieäu
doøng. quûa, nhö ví duï sau ñaây:
    Trong chöông trình ta duøng bieán Dem ñeå ñeám soá doøng     Ví duï 9.6 : In caùc chöõ caùi theo thöù töï ngöôïc töø Z
ñaõ in, moãi khi in xong moät doøng thì bieán Dem ñöôïc coäng ñeán A thaønh hai doøng :
theâm 1. Khi Dem = 15, 30, 45, ... (töùc Dem mod 15=0) thì phaûi             Z, Y, X, ..., C, B, A
laøm leänh Readln; leänh naøy seõ döøng maøn hình cho ñeán khi             z, y, x, ... , c, b, a
ta goõ Enter môùi in tieáp.     Chöông trình ñöôïc vieát nhö sau:
    PROGRAM VIDU94;     PROGRAM VIDU96;
    { In baûng caùc chöõ caùi}   { In caùc chöõ caùi theo thöù töï ñaûo ngöôïc töø z ñeán a}
    Uses Crt;     Var
    Var       Ch: Char;
      ch, ch1 : Char;     Begin
      Dem: Integer;       For ch:=‘Z’ downto ‘A’ do write(ch:3 );
    Begin       Writeln;
      CLRSCR;       For ch:=‘z’ downto ‘a’ do write(ch :3 );
      Writeln(‘ KY TU MA KY TU MA’);       Writeln;
      Dem:=0;       Readln;
      For ch:=‘a’ to ‘z’ do     End.
        begin     Chaïy<VD96.EXE>
          ch1:=Upcase(ch);     Cheùp file nguoàn <VD96.PAS>
          Writeln( ch1 :3 , Ord(ch1) :6 , ch :6 , Ord(ch) :6 );   9.1.3. Caâu leänh FOR loàng nhau :
          Inc(Dem);         Trong caáu truùc FOR, khi LeänhP cuõng laø moät leänh
          If Dem mod 15 = 0 then FOR thì ta coù caáu truùc FOR loàng nhau:
            begin             FOR bieán1:= m1 TO m2 DO            {1}
              Write(‘ Enter ñeå xem tieáp ‘);             FOR bieán2:=n1 TO n2 DO LeänhP;           {2}
              Readln;     Caùch thöùc hoaït ñoäng cuûa leänh naøy nhö sau:
            end;             Ñaàu tieân cho bieán1:=m1 vaø laøm leänh ôû doøng
        end; {2}. Vì doøng {2} laø leänh FOR neân vôùi moãi gía trò cuûa
      Writeln(‘ HET ‘); bieán2=n1, ..., n2, ñeàu phaûi laøm LeänhP, keát quûa laø
      Readln; LeänhP ñöôïc laøm n2-n1+1 laàn.
    End.              Baây giôø taêng: bieán1:=Succ(bieán1), roài laïi laøm
    Chaïy<VD94.EXE> leänh FOR ôû doøng {2}, keát quûa leänhP ñöôïc laøm theâm
    Cheùp file nguoàn <VD94.PAS> n2-n1+1 laàn nöõa.
    Chöông trình treân laø moät ví duï veà caùch duøng bieán chaïy                  .v.v.
kieåu kyù töï (ch) trong leänh FOR, ngoaøi ra, ñoùng vai troø             Quùa trình treân cöù tieáp tuïc cho ñeán khi
LeänhP laø moät leänh gheùp, goàm nhieàu leänh ñaët trong khoái bieán1=m2+1 thì döøng.
begin vaø end.     Leänh FOR {1} laøm m2-m1+1 laàn leänh FOR {2}, coøn
  chính leänh FOR {2} laïi laøm n2-n1+1 laàn LeänhP. Vì theá
  9.1.2. Caâu leänh FOR daïng 2: leänhP ñöôïc laøm caû thaûy laø (m2-m1+1)*(n2-n1+1) laàn.
    Cuù phaùp:     Ví duï 9.7: In hình chöõ nhaät ñaëc nhö döôùi
       FOR bieán := m2 DOWNTO m1 DO LeänhP; ñaây:                                           
11
    Ta thaáy moãi doøng goàm m chöõ A, töùc laø chöõ A ñöôïc in       Write(Uo:3 , U1:3);
lieân tieáp caû thaûy m laàn, vieäc naøy ñöôïc laøm baèng leänh :       For i :=2 to N do
            For j:=1 to m do write(‘A’);         begin
    Leänh Write in m chöõ A treân moät doøng. In xong, con troû           U:=Uo+U1;
vaãn naèm ôû cuoái doøng ñoù, vì theá tröôùc khi in doøng tieáp           Write(U:3);
theo, caàn phaûi ñöa con troû xuoáng doøng döôùi baèng leänh:           Uo:=U1;
            Writeln;           U1:=U;
    Toùm laïi, muoán in doøng thöù i, caàn phaûi laøm hai leänh:         end;
            For j:=1 to m do write(‘A’);       Readln;
            Writeln;     End.
    Caû thaûy ta phaûi in n doøng nhö theá, töùc laø:     Chaïy<VD98.EXE>
            For i:=1 to n do In doøng i ;     Cheùp file nguoàn <VD98.PAS>
    Thay In doøng i baèng hai leänh noùi treân (ñaët trong khoái     Ví duï 9.9: Baøi toaùn tính tieàn laõi göûi ngaân haøng:
begin ... end) , ta coù thuaät toaùn ñeå in hình chöõ nhaät ñaëc     Nhaäp tieàn voán ban ñaàu, soá thaùng göûi N vaø laõi suaát
laø : haøng thaùng. Tính soá tieàn nhaän ñöôïc sau moãi thaùng göûi
            For i:=1 to n do bieát raèng tieàn laõi haøng thaùng ñöôïc goäp vaøo tieàn voán.
            begin     Ví duï, tieàn voán laø100, laõi suaát thaùng laø 2%. Sau 1
              for j:=1 to m do write(‘A’); thaùng göûi seõ coù soá tieàn laø:
              Writeln;             Soá tieàn=100 + 100*0.02 = 102
           end;        Sau 2 thaùng göûi seõ coù soá tieàn laø:
    Caùc baïn haõy vieát chöông trình cuï theå cho ví duï naøy, ôû             Soá tieàn=102 + 102*0.02 = 104.04
ñaây m vaø n laø hai soá nguyeân döông nhaäp töø baøn phím.     Coâng thöùc tính tieàn thu ñöôïc sau moãi thaùng göûi laø:
  9.1.4. Caùc öùng duïng khaùc cuûa leänh FOR :             Soá tieàn := Tieàn voán + Tieàn voán * Laõi suaát
    Leänh For raát thoâng duïng, deã duøng vaø giaûi quyeát ñöôïc       Soá tieàn naøy laïi trôû thaønh tieàn voán cuûa thaùng sau,
nhieàu baøi toaùn trong khoa hoïc kyõ thuaät vaø trong thöïc töùc laø:
tieãn. Döôùi ñaây chæ xin neâu hai öùng duïng .             Tieàn voán := Soá tieàn;
    Ví duï 9.8: Tìm caùc soá Fibonaci.     Quùa trình cöù laëp ñi laëp laïi töø thaùng 1 ñeán thaùng N.
    Daõy soá Fibonaci { 1, 1, 2, 3, 5, 8, 13, 21,... } ñöôïc nhaéc     Chöông trình cuï theå nhö sau:
nhieàu trong giôùi khoa hoïc kyõ thuaät, noù ñöôïc xaây döïng     PROGRAM VIDU99;
nhö sau:     { Tính tieàn göûi ngaân haøng sau N thaùng}
         U0=1, U1=1 , Uk=Uk-1 + Uk-2 vôùi moïi k= 2, 3, 4, ...     Var
         Goïi U laø soá haïng thöù k, Uo vaø U1 laàn löôït laø hai soá       Tienvon, Laisuat, Sotien : Real;
haïng ñöùng ngay tröôùc U. Ñaàu tieân ta gaùn:       N, i : Byte;
                   Uo:=1;     Begin
                   U1:=1;       Write(‘ Nhaäp tieàn voán, laõi suaát vaø soá thaùng
        Böôùc 1: tính U:=Uo+U1 vaø in U. Luùc naøy U=2 chính laø göûi : ‘);
U2 .       Readln(Tienvon, Laisuat, N);
                 Ñeå chuaån bò tính U3, ta cho Uo ñoùng vai troø cuûa       For i:=1 to N do
U1 vaø U1 ñoùng vai troø cuûa U, töùc laø gaùn:         begin
                         Uo:=U1;           Sotien:= Tienvon + Tienvon*Laisuat;
                         U1:=U;           Writeln(‘Soá tieàn sau ‘, i , ‘ thaùng =‘ , Sotien:8:2);
                 Keát quûa laø Uo=1 vaø U1=2.           Tienvon:=Sotien;
    Böôùc 2: tính U:=Uo+U1 vaø in U. Luùc naøy U=3 chính laø         end;
U3 .       Readln;
             Ñeå chuaån bò tính U4, ta laïi cho Uo ñoùng vai troø cuûa     End.
U1 vaø U1 ñoùng vai troø cuûa U, töùc laø gaùn:    Chaïy<VD99.EXE>
                     Uo:=U1;    Cheùp file nguoàn <VD99.PAS>
                     U1:=U; 9.2. CAÂU LEÄNH WHILE
             Keát quûa laø Uo=2 vaø U1=3.
   9.2.1. Cuù phaùp, löu ñoà, caùch thöùc hoaït ñoäng :
               .v.v.
    Cuù phaùp:
    Toùm laïi caùc leänh phaûi laëp ñi laëp laïi laø:
         WHILE Ñieàukieän DO LeänhP ;
            U:=Uo+U1;
    YÙ nghóa : Chöøng naøo Ñieàukieän coøn ñuùng thì cöù
            Uo:=U1;
laøm LeänhP , cho ñeán khi Ñieàukieän sai thì khoâng laøm
            U1:=U;
LeänhP nöõa maø chuyeån sang leänh keá tieáp ôû phía döôùi.
    Vì sang böôùc sau thì gía trò cuûa U seõ bò thay ñoåi neân taïi
    Caùch thöùc hoaït ñoäng cuûa WHILE:
moãi böôùc ta ñeàu phaûi in U. chöông trình ñöôïc vieát nhö sau:
    Böôùc 1: Neáu Ñieàukieän sai thì chuyeån ngay sang leänh
    PROGRAM VIDU98;
keá tieáp sau LeänhP, ngöôïc laïi, neáu Ñieàukieän ñuùng thì
    { In N+1 soá Fibonaci ñaàu tieân }
laøm LeänhP, roài quay laïi böôùc 1.
    Var
    Leänh P ñöôïc goïi laø thaân cuûa voøng laëp WHILE.
      N, i, U, Uo, U1 : Integer;
    Neáu Ñieàukieän khoâng bao giôø sai thì LeänhP seõ phaûi
    Begin
laøm hoaøi, luùc ñoù ta coù voøng laëp voâ haïn. Trong tröôøng
      Write(‘ Nhaäp N :’);
hôïp naøy, ñeå döøng chöông trình, haõy goõ ñoàng thôøi hai
      Readln(N);
phím Ctrl vaø Pause ( vieát taét laø ^Pause).
      Uo:=1;
    Ñeå traùnh caùc voøng laëp voâ haïn, trong thaân cuûa voøng
      U1:=1;
WHILE caàn coù ít nhaát moät leänh coù taùc duïng laøm bieán
      Writeln( N+1 , ‘ soá Fibonaci ñaàu tieân laø :’ );
ñoåi caùc ñaïi löôïng tham gia trong Ñieàukieän ñeå ñeán moät
12
luùc naøo ñoù thì Ñieàukieän seõ sai vaø do ñoù voøng laëp seõ     Var
keát thuùc.       Tienvon, Laisuat, Sotien, S : Real;
  9.2.2. Caùc ví duï veà leänh While :       N : Byte;
     Ví duï 9.10 : Nhaäp soá töï nhieân N, duøng leänh WHILE     Begin
tính S=N!:       Write(‘ Nhaäp tieàn voán, laõi suaát vaø soá tieàn S caàn
    PROGRAM VIDU910; coù: ‘);
    { Tinh S=N! baèng leänh WHILE..}       Readln(Tienvon, Laisuat, S);
    Var       Sotien:=Tienvon;
      N, i : Integer;       N:=0; { N laø soá thaùng göûi }
      S : LongInt;       While Sotien< S do
    Begin         begin
      Write(‘ Nhaäp N > 0 : ‘ );           N:=N+1;
      Readln(N);           Sotien:= Tienvon + Tienvon*Laisuat ;
      S:=1;           Tienvon:=Sotien;
      i :=1;            {9}         end;
      While i<= N do       Writeln(‘ Caàn göûi ‘, N , ‘ thaùng ‘);
        begin       Writeln(‘ Soá tieàn seõ coù = ‘ , Sotien:6:2);
          S:=S*i;       Readln;
          i:=i+1;     {13}     End.
        end;     Chaïy<VD911.EXE>
      Writeln(‘ Giai thua = ‘, S);     Cheùp file nguoàn <VD911.PAS>
      Readln;     Soá laàn laëp cuûa leänh: While Sotien < S do . . . khoâng
    End. phaûi do ta aán ñònh töø tröôùc maø tuøy thuoäc vaøo bieåu
    Chaïy<VD910.EXE> thöùc Sotien < S laø mau bò sai hay chaäm bò sai. Soá laàn laëp
    Cheùp file nguoàn <VD910.PAS> ít hay nhieàu phuï thuoäc vaøo gía trò S nhoû hay lôùn vaø vaøo
    Khôûi ñaàu bieán i ñöôïc gaùn gía trò 1 (doøng {9}). Trong toác ñoä taêng nhanh hay chaäm cuûa soá tieàn.
voøng laëp WHILE, sau moãi leänh S:=S*i; bieán i ñöôïc taêng 9.3. CAÂU LEÄNH REPEAT
leân 1 ñôn vò baèng leänh i:=i+1; (doøng {13}). Khi i=N+1 thì
   9.3.1. Cuù phaùp, löu ñoà, caùch thöùc hoaït ñoäng :
ñieàu kieän i<=N bò sai vaø luùc ñoù voøng laëp keát thuùc, keát
    Cuù phaùp:
quûa laø leänh S:=S*i; ñöôïc thöïc hieän ñuùng N laàøn öùng vôùi
        REPEAT
i=1, 2, 3, ..., N.
           LeänhP;
    Trong chöông trình treân, neáu khoâng coù doøng leänh {13}:
        UNTIL Ñieàukieän ;
            i:=i+1;
    YÙ nghóa: Chöøng naøo Ñieàukieän coøn sai thì cöù laøm
thì i luoân luoân baèng 1 neân ñieàu kieän i<=N luoân luoân
LeänhP, cho ñeán khi Ñieàukieän ñuùng thì khoâng laøm
ñuùng (vì N  1), vaø do ñoù voøng laëp seõ voâ haïn . LeänhP nöõa maø chuyeån sang leänh keá tieáp ôû phía döôùi.   
    Söï khaùc nhau cuûa leänh WHILE so vôùi FOR laø ôû choã:     Caùch thöùc hoaït ñoäng cuûa REPEAT:
trong leänh FOR, bieán i ñöôïc töï ñoäng gaùn gía trò ban ñaàu     Böôùc 1: Laøm LeänhP, roài kieåm tra Ñieàukieän, neáu
vaø sau moãi böôùc laëp ñöôïc töï ñoäng taêng leân, coøn trong Ñieàukieän ñuùng thì chuyeån sang leänh tieáp theo ôû phía
WHILE thì khoâng, ta phaûi vieát caùc leänh ñoù. döôùi, ngöôïc laïi, neáu Ñieàu kieän sai thì quay laïi böôùc 1.
    Taát caû caùc baøi toaùn giaûi quyeát ñöôïc baèng leänh FOR         LeänhP cuõng ñöôïc goïi laø thaân cuûa voøng laëp
thì ñeàu giaûi quyeát ñöôïc baèng leänh WHILE. Ñaëc ñieåm REPEAT, neáu noù goàm nhieàu leänh thì caùc leänh ñoù
chung cuûa caùc baøi toaùn daïng naøy laø soá laàn laëp cuûa khoâng caàn phaûi ñaët trong khoái begin vaø end.
caùc voøng laëp ñaõ ñöôïc bieát tröôùc.         Neáu Ñieàukieän khoâng bao giôø ñuùng thì LeänhP seõ
    Leänh WHILE ñaëc bieät thích hôïp vôùi caùc voøng laëp coù phaûi laøm hoaøi, luùc ñoù ta coù voøng laëp voâ haïn. Trong
soá laàn laëp chöa bieát tröôùc, trong khi leänh FOR khoâng tröôøng hôïp naøy, muoán döøng chöông trình, haõy goõ ñoàng
giaûi quyeát ñöôïc. Ñaây chính laø ñieåm maïnh cuûa leänh thôøi hai phím Ctrl vaø Pause (^Pause).
WHILE. Haõy xem ví duï sau.         Ñeå traùnh caùc voøng laëp voâ haïn, trong thaân cuûa
    Ví duï 9.11: Trôû laïi baøi toaùn tính tieàn göûi ngaân haøng leänh REPEAT caàn coù ít nhaát moät leänh coù taùc duïng
coù tieàn laõi haøng thaùng goäp vaøo voán (ví duï 9.9). Caâu laøm bieán ñoåi caùc ñaïi löôïng tham gia trong Ñieàukieän ñeå
hoûi baây giôø laø: caàn göûi toái thieåu laø bao nhieâu thaùng ñeán moät luùc naøo ñoù thì Ñieàukieän seõ ñuùng vaø do ñoù
ñeå coù ñöôïc soá tieàn  S cho tröôùc. voøng laëp seõ keát thuùc.
    Giaû söû tieàn voán laø 100, laõi suaát haøng thaùng laø 2%,         Caùc voøng laëp coù soá laàn laëp bieát tröôùc ñeàu coù
soá tieàn caàn coù laø S=108. Ta tính soá tieàn coù ñöôïc sau moãi theå giaûi ñöôïc baèng leänh REPEAT. Ñaëc bieät, cuõng nhö
thaùng göûi: leänh WHILE, leänh REPEAT raát thích hôïp vôùi caùc voøng
    Sau 1 thaùng göûi: Soá tieàn=100 + 100*0.02 = 102 laëp coù soá laàn laëp khoâng bieát tröôùc
    Sau 2 thaùng göûi: Soá tieàn=102 + 102*0.02 = 104.04   9.3.2. Caùc ví duï veà leänh Repeat :
    Sau 3 thaùng göûi: Soá tieàn=104.04 + 104.04*0.02 = 106.1208
    Ví duï 9.12: Ñaûm baûo tính hôïp lyù cuûa döõ lieäu
    Sau 4 thaùng göûi: Soá tieàn=106.1208 + 106.1208*0.02 =
nhaäp töø baøn phím.
108.2432
    Khi giaûi phöông trình baäc hai Ax2+Bx+C=0, ta thöôøng
    Vaäy chæ caàn göûi N=4 thaùng, soá tieàn seõ coù laø
giaû thieát A 0, khi tính S=N!, ta thöôøng yeâu caàu N 0. Söï
108.2431.
haïn cheá phaïm vi ñoái vôùi caùc döõ lieäu nhaäp seõ ñaûm
    Quùa trình laëp keát thuùc khi tôùi thaùng ñaàu tieân coù Soá
baûo tính hôïp lyù cuûa chuùng vaø laøm giaûm bôùt caùc
tieàn  S.
phöùc taïp khi bieän luaän.
    Chöông trình nhö sau:
    PROGRAM VIDU911;
    { Tính soá thaùng göûi ngaân haøng ñeå coù soá tieàn S }
13
    Ñeå buoäc ngöôøi söû duïng phaûi nhaäp A 0, neáu nhaäp     Chuù yù : leänh Readln(Traloi); ôû doøng thöù {5} coù theå
A=0 thì baét nhaäp laïi cho tôùi khi nhaäp A 0 môùi thoâi, ta thay baèng:
duøng caáu truùc :     Traloi:=Readkey;
    Repeat     Haøm Readkey thuoäc thö vieän CRT cho keát quûa laø moät
      Write(‘Nhaäp A khaùc khoâng : ‘); kyù töï goõ töø baøn phím, noù khaùc leänh Readln(Traloi) ôû
      Readln(A); choã laø khi nhaäp kyù töï ta khoâng caàn phaûi Enter.
    Until A<> 0;     Chöông trình döôùi ñaây cho pheùp thöïc hieän moät soá laàn
    Ñeå ñaûm baûo chaéc chaén nhaäp N thoûa ñieàu kieän vieäc : in tam giaùc caân ñaëc coù chieàu cao m (0<m<20) :
0<N<20, ta duøng caáu truùc :     PROGRAM VIDU914;
    Repeat     { In tam giaùc caân ñaëc }
      Write(‘ Nhaäp N (0<N<20) : ‘);     Uses CRT;
      Readln(N);     Const
      If (N<=0) or (N>=20) then write(#7);       sao =‘*’;
    Until (0<N) and (N<20) ;     Var
    Leänh write( chr(7) ) hay write(#7) coù coâng duïng phaùt ra       k, j, m: integer;
tieáng keâu bip ñeå caûnh baùo ngöôøi duøng ñaõ nhaäp döõ lieäu       Traloi : Char ;
sai yeâu caàu.     Begin
    Ví duï 9.13: Tìm boäi soá chung nhoû nhaát cuûa hai soá       REPEAT      {9}
nguyeân döông M vaø N.         Clrscr;
    Baøi toaùn naøy coù nhöõng caùch giaûi khaùc nhau, döôùi         Repeat     {11}
ñaây laø moät caùch ñôn giaûn. Tröôùc heát, haõy xem caùch tìm           Write(‘ Nhaäp m (0<m<20) : ‘);
BSCNN cuûa hai soá M=5 vaø N=9.           Readln(m);
    Vì N>M neân ta seõ tìm trong taäp caùc boäi soá cuûa N :{ 9,           If (m <= 0) or ( m>=20) then write(#7);
18, 27, 36, 45, ...} soá nhoû nhaát chia heát cho M, ñoù laø soá 45.         Until (m>0) and ( m<20) ;       {15}
    Moät caùch toång quaùt, goïi Max laø soá lôùn nhaát cuûa M         Writeln(sao :m); { in ñænh }
vaø N. Ñaàu tieân ta gaùn :         { In hai caïnh beân cuûa tam gíac }
    BSCNN:=0;         For k:=1 to m-2 do
    Sau ñoù cöù laøm leänh BSCNN:=BSCNN+Max ; hoaøi cho           begin
ñeán khi BSCNN chia heát cho caû M vaø N thì döøng.             Write(chr(32): m-k-1); { in m-k-1 kyù töï traéng}
    Trong chöông trình ta duøng leänh repeat ñeå nhaäp hai soá M,             For j:=1 to 2*k+1 do Write(sao); { in 2k+1 daáu *}
N ñaûm baûo döông.             Writeln;
    PROGRAM VIDU913;           end;
    { Tìm BSCNN cuûa M vaø N }         For k:=1 to 2*m-1 do Write(sao); {in caïnh ñaùy}
    Var         Writeln;
      M, N, Max, BSCNN : Integer;         Write(‘ Tieáp tuïc nöõa khoâng (Y/N) ?: ‘);
    Begin         Readln( Traloi);
      Repeat       UNTIL (Traloi=‘N’) or ( Traloi=‘n’);     {28}
        Write(‘ Nhaäp M vaø N döông :’);     End.
        Readln(M, N);     Chaïy<VD914.EXE>
      Until (M>0) and (N>0);     Cheùp file nguoàn <VD914.PAS>
      If N>M then Max:=N else Max:=M;     Chöông trình 9.14 laø moät ví duï veà hai caâu leänh Repeat
      BSCNN:=0; loàng nhau, ñieàu naøy xaûy ra khi thaân cuûa moät leänh Repat
      Repeat laïi chöùa moät leänh Repeat khaùc: leänh Repeat thöù nhaát,
        BSCNN:=BSCNN + Max; töø doøng {9} ñeán doøng {28}, chöùa leänh Repeat thöù hai
      Until (BSCNN mod N=0) and (BSCNN mod M=0) ; töø doøng {11} ñeán doøng {15}.
      Writeln(‘ Boäi soá chung nhoû nhaát= ‘, BSCNN) ;   9.3.3. So saùnh caùc leänh For, While vaø Repeat:
      Readln;     Leänh For duøng cho caùc voøng laëp coù soá laàn laëp ñaõ
    End. bieát tröôùc
    Chaïy <VD913.EXE>     Leänh While hay Repeat toång quaùt hôn leänh For, duøng
    Cheùp file nguoàn <VD913.PAS> ñöôïc cho taát caû caùc loaïi voøng laëp, nhöng thöôøng duøng
    Ví duï 9.14: Thieát keá ñeå chaïy nhieàu laàn moät chöông cho caùc voøng laëp coù soá laàn laëp chöa bieát tröôùc.
trình.     Leänh While vaø Repeat khaùc nhau ôû ñieåm sau: leänh
    Trong Turbo Pascal, moãi laàn muoán chaïy chöông trình ta While kieåm tra ñieàu kieän tröôùc, neáu ñuùng môùi thöïc
phaûi goõ caëp phím Ctrl vaø F9 (vieát taét laø ^F9), ñieàu naøy hieän caùc leänh ghi trong thaân cuûa noù ( leänhP ), coøn leänh
seõ baát tieän neáu caàn chaïy chöông trình nhieàu laàn öùng vôùi Repeat thöïc hieän leänhP roài môùi kieåm tra ñieàu kieän. Vì
caùc boä döõ lieäu thöû khaùc nhau. Caáu truùc sau ñaây cho theá, leänh Repeat seõ thöïc hieän caùc leänh ghi trong thaân
pheùp ta chaïy chöông trình moät soá laàn theo yù muoán: cuûa noù ít nhaát ñöôïc moät laàn.
    REPEAT     Ngoaøi ra, leänh While keát thuùc khi ñieàu kieän sai, leänh
      { Caùc leänh cuûa chöông trình} Repeat keát thuùc khi ñieàu kieän ñuùng.
      Write(‘ Tieáp tuïc nöõa khoâng (Y/N) ? :’); 10.1. MAÛNG MOÄT CHIEÀU
      Readln(Traloi); {5}
  10.1.1. Maûng vaø caùch khai baùo maûng :
    UNTIL (Traloi =‘N’) or ( Traloi=‘n’);
   Khaùi nieäm :    Maûng laø moät taäp goàm nhieàu phaàn töû
    ÔÛ ñaây, Traloi laø moät bieán kieåu kyù töï (Char);
coù cuøng chung moät kieåu döõ lieäu. Moãi phaàn töû cuûa
    Sau khi thöïc hieän xong {caùc leänh cuûa chöông trình }, neáu
maûng coù moät ñaïi löôïng xaùc ñònh vò trí töông ñoái cuûa
muoán chaïy tieáp thì ta goõ phím Y  , neáu muoán döøng thì
goõ N .
14
phaàn töû ñoù so vôùi caùc phaàn töû khaùc trong maûng, goïi laø          Khai baùo maûng coù gaùn trò ban ñaàu:
chæ soá. Caùc yeáu toá ñeå xaùc ñònh moät maûng goàm coù:     Pascal cho pheùp vöøa khai baùo maûng vöøa gaùn gía trò
            Teân maûng ban ñaàu cho caùc phaàn töû maûng, chaúng haïn nhö döôùi
            Kieåu döõ lieäu chung cuûa caùc phaàn töû trong maûng ñaây:
            Kieåu döõ lieäu cuûa chæ soá vaø phaïm vi cuûa chæ          Const
soá.               X : array[1..5] of Integer = (12, 14, 16, 18, 20) ;
    Kieåu döõ lieäu cuûa caùc phaàn töû maûng laø moïi kieåu döõ     Khi ñoù X laø moät maûng goàm 5 phaàn töû cuøng kieåu
lieäu maø moät bieán coù theå coù. Tuy nhieân, kieåu döõ lieäu nguyeân vaø coù giaù trò X[1]=12, X[2]=14, X[3]=16,
cuûa chæ soá thì khoâng ñöôïc laø kieåu thöïc hay kieåu chuoãi, Xõ[4]=18, X[5]=20.
noù chæ coù theå laø kieåu ñeám ñöôïc : nguyeân, kyù töï, loâgic,     Maëc duø töø khoùa ôû ñaây laø Const song X laïi ñöôïc
lieät keâ hay ñoaïn con. duøng nhö laø moät bieán maûng, töùc laø caùc phaàn töû cuûa
       Khai baùo maûng moät chieàu : X coù theå thay ñoåi gía trò ñöôïc. Ví duï, trong chöông trình ta
   Maûng moät chieàu, coøn goïi laø daõy, hay ñôn giaûn laø coù theå gaùn:
maûng, coù theå khai baùo theo moät trong hai caùch :                 X[1]:= 2;
          Caùch 1: Khai baùo tröïc tieáp theo caùch sau :              X[2]:=5+20;
             VAR   10.1.2. Truy xuaát caùc phaàn töû maûng:
                   Teânmaûng : Array[m1 . . m2] of     Caùc xöû lyù treân maûng ñöôïc quy veà xöû lyù töøng phaàn
Teânkieåudöõlieäu ; töû maûng. Ñeå xaùc ñònh moät phaàn töû cuûa maûng, ta
    ÔÛ ñaây m1, m2 laø hai haèøng xaùc ñònh phaïm vi cuûa chæ duøng caùch vieát :
soá, chuùng coù chung moät kieåu döõ lieäu,ï vaø m1 m2.     Teânmaûng[ chæ soá cuûa phaàøn töû ]
    Ví duï: Cho khai baùo döôùi ñaây:     Ví du : coù theå gaùn :
            Var     A[0]:= 15.8;
                   A : Array[0..10] of Real;     A[1]:= 2*A[0];
                   Hten: Array[1..5] of String[18];     Hten[3]:= ‘Nguyen Thi Loan’;
                   B: Array[‘a’..’d’] of Integer;     B[‘a’]:=100;
      Theo khai baùo treân, ta coù ba maûng:     Chæ soá cuûa moät phaàn töû coù theå laø moät bieán, moät
              Maûng thöù nhaát teân laø A, goàm 11 phaàn töû cuøng haèng, hay moät bieåu thöùc. Ví duï, cho i laø bieán kieåu
kieåu Real, öùng vôùi caùc chæ soá 0, 1, 2, ..., 10, ñoù laø: nguyeân, khi ñoù ta coù theå duøng caùc leänh:
        A[0], A[1], A[2], ..., A[10]     i:=6;
            Maûng thöù hai teân laø HTen goàm 5 phaàn töû cuøng     A[i]:=100.25;
kieåu döõ lieäu laø String[18] öùng vôùi caùc chæ soá töø 1 ñeán     Hai leänh treân töông ñöông vôùi moät leänh:
5:     A[6]:=100.25;
Hten[1], Hten[2], Hten[3], Hten[4], Hten[5]     Neáu bieán i coù giaù trò laø 6 thì leänh :
     Maûng thöù ba teân laø B, goàm 4 phaàn töû cuøng kieåu     A[ i div 2 +1] := 4.5; töông ñöông vôùi leänh:
Integer öùng vôùi caùc chæ soá ‘a’, ‘b’, ‘c’, ‘d’:     A[4]:=4.5; vì bieåu thöùc i div 2 +1 coù gía trò laø 4.
    B[‘a’], B[‘b’], B[‘c’], B[‘d’]     Khi nhaäp döõ lieäu cho caùc phaàn töû cuûa moät maûng , ta
    Ñeå coù moät hình aûnh veà maûng, ñoái vôùi maûng A, ta coù theå duøng caâu leänh For, While hay Repeat.
hình dung coù moät daõy nhaø moät taàng, teân goïi laø daõy A,     Ví duï, nhaäp döõ lieäu cho caùc phaàn töû cuûa maûng A:
goàm 11 phoøng lieân tieáp gioáng heät nhau ñöôïc ñaùnh soá     For i:=0 to 10 do
thöù töï töø 0,1, 2, ..., ñeán 10 :             begin
AAAAAAAAAA A         Write(‘Nhaäp phaàn töû thöù ‘ , i , ‘: ‘);
0 1 2 3 4 5 6 7 8 9 10         Readln(A[i]);
      end;
    Töông töï, maûng B cuõng gioáng nhö daõy nhaø B moät taàng     hoaëc (duøng While) :
coù 4 phoøng ñöôïc ñaùnh soá thöù töï laø caùc chöõ   a, b, c, d :     i:=0;
Ba Bb Bc Bd     While i<= 10 do
Caùch 2 : Khai baùo qua moät kieåu döõ lieäu môùi, goàm hai       begin
böôùc:         Write(‘Nhap phaàn töû thöù ‘, i, ‘: ‘);
    Böôùc 1: Ñònh nghóa kieåu döõ lieäu maûng :         Readln(A[i]);
    TYPE         i:=i+1;
      Teânkieåumaûng = Array[m1 . . m2] of       end;
Teânkieåudöõlieäu;     Töông töï ñeå nhaäp döõ lieäu cho caùc phaàn töû cuûa
    Böôùc 2: Khai baùo bieán coù kieåu döõ lieäu laø kieåu maûng B, ta vieát:
maûng:     For ch:=‘a’ to ‘d’ do
    VAR       begin
      Teânmaûng : Teânkieåumaûng ;         Write(‘Nhap phaàn töû thöù ‘, ch, ‘: ‘);
    Ví duï, ñoái vôùi caùc maûng A, B vaø Hten ôû treân ta coù         Readln(B[ch]);
theå khai baùo theo caùch 2, nhö sau:       end;
    Type     Ñeå in caùc gía trò cuûa maûng A leân maøn hình, ta vieát :
          Mang1 = array[0..10] of Real;             For i:=0 to 10 do Write(A[i]:6:2);
          Mang2 = array[1..5] of String[18];     Caùc gía trò cuûa maûng A seõ ñöôïc in lieân tieáp nhau treân
          Mang3 = array[‘a’..’d’] of Integer; cuøng moät doøng. Coøn neáu muoán in moãi phaàn töû treân
    Var moät doøng, ta thay leänh Write baèøng Writeln.
          A : Mang1;     Töông töï, maûng B ñöôïc in leân maøn hình baèng leänh :
          Hten: Mang2;             For ch:=‘a’ to ‘d’ do Write(B[ch]);
          B: Mang3;
15
    Chuù yù : Turbo Pascal cho pheùp gaùn moät maûng naøy       Writeln(‘ Soá soá döông = ‘ , Dem );
cho moät maûng khaùc.       Readln;
    Neáu X, Y laø hai bieán maûng cuøng moät kieåu maûng thì     End.
leänh:            Chaïy<VD101.EXE>
             X := Y;        Cheùp taäp tin nguoàn <VD101.PAS>
coù nghóa laø laáy gía trò cuûa töøng phaàn töû cuûa maûng Y      Ví duï 10.2: Tìm soá lôùn nhaát cuûa daõy A1, A2, ..., An.
gaùn cho phaàn töû töông öùng trong maûng X. Ví duï, cho khai     Trong baøi 8, ta ñaõ chæ ra caùch tìm soá lôùn nhaát cuûa hai
baùo: soá, cuûa ba soá. Coù theå môû roäng thuaät toaùn ñoù ñeå tìm
    Var soá lôùn nhaát cuûa n soá :
          X, Y : Array[1..10] of Real;     Goïi Max laø bieán chöùa soá lôùn nhaát phaûi tìm, theá thì :
    Khi ñoù, leänh:              X := Y;     Böôùc 1: Gaùn Max:=A[1];
        töông ñöông vôùi leänh :     Böôùc 2: Neáu Max<A[2] thì gaùn Max:=A[2];
             For i:=1 to 10 do X[i] :=Y[i];     Böôùc 3: Neáu Max<A[3] thì gaùn Max:=A[3];
  10.1.3. Caùc baøi toaùn cô baûn veà maûng :     ...
Ví duï 10.1: Ñeám soá laàn xuaát hieän cuûa gía trò x trong     Böôùc n: Neáu Max<A[n] thì gaùn Max:=A[n];
daõy A1, A2, ..., An .     Khôûi ñaàu, Max ñöôïc gaùn giaù trò A[1]. Sang böôùc 2,
    Ví duï gía trò x=6 xuaát hieän 3 laàn trong daõy 6 7 1 2 6 0 6 1. Max ñöôïc so saùnh vôùi A[2] ñeå choïn ra soá lôùn nhaát giöõa
    Ta duøng bieán Dem kieåu nguyeân ñeå ñeám soá laàn xuaát A[1], A[2] vaø löu vaøo bieán Max. Sang böôùc 3, Max ñöôïc
hieän cuûa x. Ñaàu tieân ta gaùn Dem:=0, sau ñoù duyeät töøng tieáp tuïc so saùnh vôùi A[3] ñeå tìm ra soá lôùn nhaát giöõa
phaàn töû A1, A2, ..., An, moãi khi coù moät phaàn töû baèng x A[1], A[2], A[3], .v.v. Keát quûa, sau böôùc n, bieán Max seõ
thì taêng bieán Dem leân moät ñôn vò. Keát quûa laø bieán Dem chöùa soá lôùn nhaát cuûa daõy A[1], A[2], ..., A[n].
coù gía trò ñuùng baèng soá phaàn töû baèng x. Hai leänh chính     Quaù trình treân ñöôïc moâ taû baèng hai leänh:
cuûa thuaät toaùn laø:             Max:=A[1];
    Dem:=0;             For i:=2 to n do if Max<A[i] then Max:=A[i];
    For i:=1 to N do If A[i]=x then Dem:=Dem+1;     Nhaän xeùt:
    Ví duï, ñeám trong daõy soá A coù bao nhieâu soá 0, ta vieát:     Trong leänh For treân, bieán i chaïy baét ñaàu töø 2, nhöng
    Dem:=0; keát quûa vaãn ñuùng neáu cho i chaïy baét ñaàu töø 1.
    For i:=1 to N do if A[i]=0 then Dem:=Dem+1;     Khoâng nhaát thieát phaûi gaùn giaù trò ban ñaàu cho Max
    Writeln(‘ Coù ‘, Dem , ‘ soá khoâng ‘); laø A[1], maø coù theå gaùn cho Max moät phaàn töû tuøy yù
    Nhaän xeùt: Ñaúng thöùc A[i]=x ( hay A[i]=0 ) laø ñieàu trong maûng, ví duï phaàn töû A[n] chaúng haïn, nhöng khi ñoù
kieän ñeå bieán Dem ñöôïc taêng theâm 1, vaäy baøi toaùn treân bieán i trong leänh For phaûi chaïy baét ñaàu töø 1.
coù theå môû roäng laø: haõy ñeám soá phaàn töû cuûa maûng A      Ví duï 10.3: Baøi toaùn saép xeáp maûng taêng daàn (hay
thoûa maõn moät ñieàu kieän cho tröôùc. Trong leänh For ôû giaûm daàn)
treân, khi thay ñaúng thöùc A[i]=x baèng A[i] thoûa ñieàu kieän ,     Cho daõy A[1], A[2],..., A[n], noùi raèng A laø moät daõy
ta ñöôïc thuaät toaùn toång quaùt hôn : taêng neáu A[1]  A[2] ... A[n], töông töï, A laø daõy giaûm
                 Dem:=0; neáu A[1]  A[2]  ...  A[n]. Daõy ñoàng nhaát A[1]=A[2]= ...
                For i:=1 to N do If A[i] thoûa ñieàu kieän then =A[n] laø tröôøng hôïp ñaëc bieät, vöøa laø daõy taêng, vöøa laø
Dem:=Dem+1; daõy giaûm.
    Chöông trình sau nhaäp moät maûng A coù N phaàn töû, in     Ví duï:
maûng A leân maøn hình, vaø ñeám xem maûng A coù bao nhieâu             Daõy 1 3 3 5 5 6 6 6 laø daõy taêng
soá döông :              Daõy 9 9 8 5 5 4 0 0 laø daõy giaûm
    PROGRAM VIDU101;              Daõy 1 3 3 2 5 4 6 6 laø daõy khoâng taêng khoâng
    { Ñeám soá döông trong maûng} giaûm.
    Type     Baøi toaùn ñaët ra laø: cho moät daõy A[1], A[2], ..., A[n]
      Kmang = Array[1..20] of Real; baát kyø, haõy thöïc hieän caùc hoaùn ñoåi caùc gía trò cuûa
    Var caùc phaàn töû trong maûng A ñeå A laäp thaønh moät daõy
      A: Kmang; taêng.
      i, N, Dem : Integer;     Ví duï, cho daõy A coù 5 phaàn töû A[1]=9, A[2]=7, A[3]=5,
    Begin A[4]=8, vaø A[5]= 2, caàn thöïc hieän caùc hoaùn ñoåi nhö theá
      Repeat naøo ñeå coù A[1]=2, A[2]=5, A[3]=7, A[4]=8 vaø A[5]=9.
        Write(‘ Nhaäp soá phaàn töû N : ‘);     Coù nhöõng phöông phaùp saép xeáp maûng khaùc nhau, ôû
        Readln(N); ñaây chæ xin giôùi thieäu moät phöông phaùp, tuy chöa phaûi
      Until (N>0) and ( N<21); laø hay nhöng ñôn giaûn vaø deã hieåu cho nhöõng ngöôøi môùi
      { nhaäp maûng } laäp trình, ñoù laø phöông phaùp löïa choïn tröïc tieáp (Straight
      For i:=1 to N do selection sort).
        begin     YÙ töôûng cuûa phöông phaùp laø nhö sau:
          Write(‘Nhaäp A[‘ , i , ‘ ]: ‘);     Böôùc 1: Tìm soá nhoû nhaát trong caùc phaàn töû A[1],
          Readln( A[i] ); A[2],.., A[n] vaø ñeå vaøo vò trí ñaàøu tieân A[1].
        end;     Böôùc 2: Tìm soá nhoû nhaát trong caùc phaàn töû A[2],
      { In maûng A} A[3],.., A[n] vaø ñeå vaøo vò trí thöù hai A[2].
      Writeln(‘ Maûng A laø : ’);       .v.v.
      For i:=1 to N do Write(A[i]:3:0);     Böôùc n-1: Tìm soá nhoû nhaát trong hai phaàn töû A[n-1],
      Writeln; A[n] vaø ñeå vaøo vò trí n-1. Sau böôùc naøy thì A[n] seõ laø
      { ñeám soá döông } gía trò lôùn nhaát.
      Dem:=0;     Chaúng haïn, xeùt daõy A coù 4 phaàøn töû: {5,3,4,1}:
      For i:=1 to N do If A[i]>0 then Dem:=Dem+1;
16
    Böôùc 1:     Neáu A[1]>A[2] thì ñoåi A[1] vôùi A[2], ñöôïc:       Until (N>0) and ( N<21);
{3,5,4,1}       For i:=1 to N do    { nhaäp maûng }
                         Neáu A[1]>A[3] thì ñoåi A[1] vôùi A[3]: khoâng         begin
ñoåi           Write(‘Nhaäp A[‘, i, ‘]: ‘);
                        Neáu A[1]>A[4] thì ñoåi A[1] vôùi A[4], ñöôïc:           Readln(A[i]);
{1,5,4,3}         end;
    Böôùc 2:    Neáu A[2]>A[3] thì ñoåi A[2] vôùi A[3], ñöôïc:       { Tìm soá lôùn nhaát }
{1,4,5,3}       Max :=A[1];
                      Neáu A[2]>A[4] thì ñoåi A[2] vôùi A[4], ñöôïc:       For i :=1 to N do if Max< A[i] then Max:=A[i];
{1,3,5,4}       Writeln(‘ Soá lôùn nhaát laø: ’ , Max : 4:1);
    Böôùc 3:      Neáu A[3]>A[4] thì ñoåi A[3] vôùi A[4], ñöôïc:       { saép xeáp daõy taêng }
{1,3,4,5}       For i:=1 to N-1 do
    Sau ba böôùc, daõy A ñaõ ñöôïc saép xeáp xong.       For j:=i+1 to N do
    Taïi böôùc thöù i (i chaïy töø 1 ñeán 3 ), ta phaûi so saùnh A[i]         If A[i]>A[j] then                {23}
laàn löôït vôùi A[j] (j chaïy töø i+1 ñeán 4), neáu A[i]>A[j] thì           begin    { ñoåi choã A[i] vaø A[j] }
hoaùn ñoåi caùc gía trò cuûa A[i] vaø A[j], noùi cho goïn laø ñoåi             z:=A[i];
choã A[i] vôùi A[j]. Quùa trình treân ñöôïc theå hieän baèng hai             A[i]:=A[j];
voøng laëp For :             A[j]:=z;
            For i:=1 to 3 do           end;
            For j:=i+1 to 4 do       Writeln(‘ Daõy ñaõõ saép taêng laø : ‘);
           if A[i]>A[j] then Ñoåi choã A[i] vaø A[j] ;       For i:=1 to N do Write(A[i]:3:0);
    Maûng A ôû treân chæ coù 4 phaàn töû, trong tröôøng hôïp       Readln;
toång quaùt khi maûng A coù N phaàn töû thì leänh For thöù     End.
nhaát seõ coù bieán i chaïy töø 1 ñeán N-1, vaø leänh For thöù hai     Chaïy<VD103.EXE>
seõ coù bieán j chaïy töø i+1 ñeán N, töùc laø :     Cheùp taäp tin nguoàn <VD103.PAS>
            For i:=1 to N-1 do      Chuù yù 1: Muoán saép daõy A giaûm daàn thì trong
            For j:=i+1 to N do chöông trình treân chæ caàn thay doøng {23}:
                  if A[i]>A[j] then Ñoåi choã A[i] vaø A[j] ;             If A[i] > A[j] then ...
    Vieäc ñoåi choã caùc gía trò trong A[i] vaø A[j] ñöôïc tieán baèøng doøng :
haønh baèng caùch duøng moät bieán Z trung gian cuøng kieåu             If A[i] < A[j] then ...
döõ lieäu vôùi A[i] vaø A[j]. Ñaàu tieân gôûi taïm gía trò cuûa     Töùc laø thay daáu lôùn hôn > baèng daáu nhoû hôn < .
A[i] vaøo bieán Z, sau ñoù ñöa gía trò cuûa A[j] vaøo A[i], vaø
   Chuù yù 2 : Saép xeáp moät boä phaän cuûa daõy.
cuoái cuøng ñöa gía trò trong Z vaøo A[j], töùc laø phaûi laøm ba
    Goïi m vaø h laø hai soá nguyeân sao cho 1<= m< h<= N, khi
leänh :
ñoù A[m], A[m+1], ..., A[h] laø moät daõy con cuûa daõy A.
            Z:=A[i];
Muoán saép daõy con A[m], A[m+1], ..., A[h] taêng (hay giaûm)
            A[i]:=A[j];
maø khoâng laøm aûnh höôûng ñeán caùc phaàn coøn laïi cuûa
            A[j]:=Z;
daõy A, ta duøng leänh sau:
    Toùm laïi, thuaät toaùn saép xeáp daõy A taêng ñöôïc vieát nhö
    For i:= m to h-1 do
sau:
    For j:=i+1 to h do
    For i:=1 to N-1 do
      if A[i]>A[j] then
    For j:=i+1 to N do
        begin { Ñoåi choã A[i] vaø A[j] }
      if A[i]>A[j] then
          Z:=A[i];
        begin { Ñoåi choã A[i] vaø A[j] }
          A[i]:=A[j];
          Z:=A[i];
          A[j]:=Z;
          A[i]:=A[j];
        end;
          A[j]:=Z;
    Ví duï 10.4: Kieåm tra maûng coù thoûa moät tính chaát
        end;
khoâng.
    Trong ñoù N laø soá phaàn töû cuûa daõy A coøn Z laø moät
    Ta thöôøng gaëp baøi toaùn kieåm tra xem moïi phaàn töû
bieán trung gian coù cuøng kieåu döõ lieäu vôùi caùc phaàn töû
cuûa maûng A coù thoûa maõn moät ñieàu kieän khoâng, ví duï
cuûa maûng A.
maûng A coù phaûi laø daõy taêng khoâng, coù phaûi laø daõy
    Chöông trình döôùi ñaây tìm soá lôùn nhaát cuûa maûng A vaø
ñoái xöùng khoâng, coù phaûi laø moät caáp soá coäng
saép daõy A taêng daàn:
khoâng, ...
    PROGRAM VIDU103;
    Maûng A thoûa tính chaát ñang xeùt neáu moïi phaàn töû
    { Tìm Max vaø saép daõy A taêng daàn }
cuûa noù thoûa moät ñieàu kieän xaùc ñònh naøo ñoù, ngöôïc
    Uses CRT;
laïi, maûng A khoâng thoûa tính chaát ñang xeùt neáu coù moät
    Type
phaàn töû cuûa noù khoâng thoûa ñieàu kieän naøy.
      Kmang = array[1..20] of Real;
    Hai traïng thaùi thoûa hay khoâng thoûa ñöôïc theå hieän
    Var
baèng hai gía trò TRUE hay FALSE cuûa moät bieán Kiemtra
      i, j, N : Integer;
kieåu loâgic. Ñaàu tieân ta gaùn giaû ñònh Kiemtra:= TRUE, sau
      A: Kmang;
ñoù ta xeùt töøng phaàn töû cuûa A, chæ caàn coù moät phaàn
      z, Max : Real;
töû khoâng thoûa ñieàu kieän thì gaùn ngay Kiemtra:=FALSE .
    Begin
Vaäy hai leänh caàn duøng laø:
      Clrscr;
             Kiemtra:=TRUE;
      Repeat
             For i:=1 to N do
        Write(‘ Nhaäp soá phaàn töû N : ‘);
          if A[i] khoâng thoûa ñieàu kieän then Kiemtra:=
        Readln(N);
FALSE;
17
    Vieäc xaùc ñònh ñieàu kieän laø tuøy töøng baøi toaùn cuï theå.       P:=A[0];
    Ví duï: Kieåm tra xem A coù phaûi laø moät daõy ñoái xöùng       For i:=1 to N do
khoâng ?         begin
                 Daõy 1 3 5 4 5 3 1 laø ñoái xöùng.           U:=U*x;
                 Daõy 1 3 5 4 2 3 1 laø khoâng ñoái xöùng vì A[3]           P:=P+A[i]*U;
khaùc A[5].         end;
    Nhö vaäy, daõy N phaàn töû A1, A2, ..., An laø ñoái xöùng neáu       Writeln(‘ P=‘, P:6:2);
A1=An, A2=An-1, ..., An=A1, töùc Ai = An-i+1 vôùi moïi i=1, 2, ..., n.       Readln;
Ñaúng thöùc : Ai = An-i+1 chính laø ñieàu kieän maø moïi phaàn     End.
töû cuûa daõy A phaûi thoûa ñeå A laø moät daõy ñoái xöùng.         Chaïy<VD105.EXE>
    Giaû thieát bieán Kiemtra ñaõ ñöôïc khai baùo kieåu Boolean.      Cheùp taäp tin nguoàn <VD105.PAS>
Trong chöông trình ta duøng caùc leänh sau:
             Kiemtra:=TRUE;       i, N : Integer;
             For i:=1 to N do       A: Array[0..20] of Real;
               if A[i]<>A[N-i+1] then Kiemtra:=FALSE;       x, P, U : Real;
                 If Kiemtra=TRUE then writeln(‘ Daõy A ñoái     Begin
xöùng’)       Repeat
                 else         Write(‘ Nhaäp N vaø x : ‘);
                   Writeln( ‘Daõy A khoâng ñoái xöùng ‘);         Readln(N, x);
        Trong thuaät toaùn treân, leänh For coù theå thay baèng leänh       Until (N>0) and ( N<21);
While, toác ñoä seõ nhanh hôn song cuõng khoù hieåu hôn:       For i:=0 to N do { nhaäp maûng caùc heä soá}
     Kiemtra:=TRUE;         begin
    i:=1;           Write(‘Nhaäp heä soá A[‘, i, ‘]: ‘);
    While ( i <=N ) and ( Kiemtra=TRUE) do           Readln(A[i]);
           if A[i]<>A[N-i+1] then Kiemtra:=FALSE         end;
            else  i:=i+1;       U:=1;
            If Kiemtra=TRUE then writeln(‘ Daõy A ñoái xöùng’)       P:=A[0];
             else   Writeln( ‘Daõy A khoâng ñoái xöùng ‘);       For i:=1 to N do
    Baïn ñoïc haõy vieát chöông trình cho ví duï naøy.         begin
    Chuù yù: Caâu leänh :           U:=U*x;
            If Kiemtra=TRUE then writeln(‘ Daõy A ñoái xöùng’)           P:=P+A[i]*U;
            else Writeln( ‘Daõy A khoâng ñoái xöùng ‘);         end;
hoaøn toaøn töông ñöông vôùi leänh :       Writeln(‘ P=‘, P:6:2);
            If Kiemtra then writeln(‘ Daõy A ñoái xöùng’)       Readln;
           else Writeln( ‘Daõy A khoâng ñoái xöùng ‘);     End.
          Chaïy<VD105.EXE>
  Ví duï 10.5: Tính gía trò cuûa ña thöùc :      Cheùp taäp tin nguoàn <VD105.PAS>
            P = ao + a1x + a2x2 + ... + anxn 10.2. MAÛÛNG HAI CHIEÀU (MA TRAÄN)
trong ñoù soá nguyeân n, soá thöïc x vaø caùc heä soá a0, a1, ..., an   10.2.1. Khai baùo maûng hai chieàu:
ñöôïc nhaäp töø baøn phím.     Maûng hai chieàøu, coøn goïi laø ma traän, laø söï môû roäng
    Ta vieát : tröïc tieáp cuûa maûng moät chieàu. Ta cuõng coù hai caùch
            P= aoU0 + a1U1 + a2U2 + ... + anUn , trong ñoù : khai baùo.
             U0=1; Caùch 1: Khai baùo tröïc tieáp :
             Ui = xi = xi-1 *x = Ui-1*x vôùi i=1,2, ..., N             VAR
    Nhö vaäy, neáu tính ñöôïc gía trò U ôû böôùc i-1 thì seõ tính                    Teânmaûng : Array[n1..n2 , m1..m2] of
ñöôïc gía trò U ôû böôùc i baèng leänh U:= U*x, sau ñoù ta chæ Teânkieåudöõlieäu;
vieäc coäng doàn bieåu thöùc ai*U vaøo P baèng leänh P:= P+ trong ñoù n1, n2 laø caùc haèøng coù cuøng kieåu döõ lieäu vaø
ai*U. n1 n2, chuùng xaùc ñònh phaïm vi cuûa chæ soá thöù nhaát,
    Chöông trình ñöôïc vieát nhö sau : goïi laø chæ soá doøng. Töông töï m1, m2 laø caùc haèng coù
    PROGRAM VIDU105;
cuøng kieåu döõ lieäu vaø m1 m2, chuùng xaùc ñònh phaïm vi
    { Tính gía trò cuûa ña thöùc baäc N }
cuûa chæ soá thöù hai, goïi laø chæ soá coät. Gioáng nhö maûng
    Var
moät chieàu, kieåu döõ lieäu cuûa caùc chæ soá chæ coù theå laø
      i, N : Integer;
kieåu ñeám ñöôïc: nguyeân, kyù töï, loâ gic, lieät keâ hay ñoaïn
      A: Array[0..20] of Real;
con, khoâng ñöôïc laø kieåu thöïc hay chuoãi.
      x, P, U : Real;
    Ví duï, cho khai baùo :
    Begin
       Var
      Repeat
               X : array[1..2, 1..3] of Real;
        Write(‘ Nhaäp N vaø x : ‘);
               Y : array[‘a’..’c’ , 1..3] of String[15];
        Readln(N, x);
     Keát quaû ta nhaän ñöôïc hai maûng hai chieàu:
      Until (N>0) and ( N<21);
     Maûng X goàm 6 phaàn töû cuøng kieåu döõ lieäu thöïc:
      For i:=0 to N do { nhaäp maûng caùc heä soá}
                 X[1,1], X[1,2], X[1,3]
        begin
                 X[2,1], X[2,2], X[2,3]
          Write(‘Nhaäp heä soá A[‘, i, ‘]: ‘);
    Maûng Y goàm 9 phaàn töû cuøng kieåu chuoãi String[15] :
          Readln(A[i]);
                 Y[‘a’,1], Y[‘a’,2], Y[‘a’, 3]
        end;
                 Y[‘b’,1], Y[‘b’,2], Y[‘b’, 3]
      U:=1;
                 Y[‘c’,1], Y[‘c’,2], Y[‘c’, 3]
18
    Coù theå ví X laø moät nhaø hai taàng, moãi taàng coù ba     Ñeå nhaäp döõ lieäu cho moät maûng hai chieàu, ta phaûi
phoøng gioáng nhau. Caùc taàng ñöôïc ñaùnh soá töø 1 ñeán 2, duøng hai voøng laëp duyeät theo hai chæ soá, chaúng haïn
trong moãi taàng, caùc phoøng ñöôïc ñaùnh soá töø 1 ñeán 3. muoán nhaäp döõ lieäu cho maûng X, ta vieát:
Töông töï, Y laø moät nhaø ba taàng, caùc taàng ñöôïc ñaùnh soá     For i:=1 to 2 do
laàn löôït laø ‘a’, ‘b’, ‘c’, moãi taàng coù ba phoøng ñöôïc ñaùnh     For j:=1 to 3 do
soá laàn löôït laø 1, 2, 3.       begin
        Caùch 2: Bieán maûng ñöôïc khai baùo thoâng qua moät         Write(‘nhaäp phaàn töû haøng ‘, i, ‘ coät ‘, j , ‘: ‘);
kieåu maûng ñaõ ñöôïc ñònh nghóa tröôùc ñoù baèøng töø khoùa         Readln(X[i, j]);
TYPE, töùc laø:       end;
    TYPE     Töông töï, leänh nhaäp döõ lieäu cho maûng Y ñöôïc vieát
    Teânkieåumaûng= Array[n1..n2 , m1..m2] of laø:
Teânkieåudlieäu;     For ch:=‘a’ to ‘c’ do
    VAR     For j:=1 to 3 do
      Teânmaûng : Teânkieåumaûng ;       begin
Ví duï: Hai maûng X vaø Y noùi treân coù theå ñöôïc khai baùo         Write(‘nhaäp phaàn töû haøng ‘, ch , ‘ coät ‘, j , ‘: ‘);
theo hai böôùc sau:         Readln(X[ch, j]);
    Type       end;
      Kmang1 = array[1..2, 1..3] of Real; trong ñoù ch laø bieán kieåu kyù töï, coøn i vaø j laø caùc bieán
      Kmang2 = array[‘a’..’c’ , 1..3] of String[15]; nguyeân.
    Var     Ñeå in maûng X leân maøn hình, trình baøy gioáng nhö caùch
      X : Kmang1; vieát ma traän, moãi haøng in treân moät doøng, ta duøng leänh :
      Y : Kmang2;     For i:=1 to 2 do
    Chuù yù: - Coù theå xem maûng hai chieàøu laø maûng moät       begin
chieàu maø moãi phaàn töû cuûa noù laïi laø moät maûng moät        For j:=1 to 3 do write(X[i, j]:3:1); { in haøng thöù i}
chieàu.         Writeln; { xuoáng doøng, chuaån bò in haøng tieáp theo }
    Hai maûng X, Y noùi treân coù theå khai baùo nhö sau:       end; 
    Type   10.2.3. Caùc ví duï veà ma traän :
      Kmang1 = array[1..2] of array[1..3] of Real;     Vì ma traän laø maûng moät chieàu cuûa caùc maûng moät
      Kmang2 = array[‘a’..’c’] of array[1..3] of String[15]; chieàu neân nhieàu baøi toaùn veà maûng ñöôïc môû roäng töï
    Var nhieân cho ma traän.
      X : Kmang1;       Ví duï 10.6: Tính toång cuûa hai ma traän
      Y : Kmang2;     Nhaäp vaøo hai ma traän A, B caáp NxM. Tính ma traän C laø
    Hieåu theo caùch naøy thì X laø moät maûng goàm hai phaàn toång cuûa hai ma traän A vaø B, in ma traän C leân maøn hình.
töû X[1] vaø X[2] maø moãi phaàn töû naøy laïi laø moät maûng     Coâng thöùc tính caùc phaàn töû cuûa ma traän C= A+B :
goàm 3 phaàn töû :     C[i,j ] = A[i, j] + B[i, j] vôùi i=1,..., N, vaø j=1,..., M
        X[1] laø maûng coù 3 phaàn töû kieåu thöïc X[1][1], X[1][2],     Chöông trình nhö sau:
X[1][3]     PROGRAM VIDU106;
        X[2] laø maûng coù 3 phaàn töû kieåu thöïc X[2][1], X[2][2],     { Tính toång hai ma traän }
X[2][3]     Uses CRT;
      Ñieàu töông töï cuõng aùp duïng cho bieán maûng Y.     Var
    Hai caùch vieát X[i][j] vaø X[i,j] cuøng chæ moät phaàn töû.       A, B, C : Array[1..10, 1..10] of Real;
        i, j , N, M : Integer;
    Khai baùo vaø gaùn giaù trò ban ñaàu:     Begin
    Coù theå khai baùo vaø gaùn giaù trò ngay cho moät maûng hai       Clrscr;
chieàu, chaúng haïn:       Repeat
            Type         Write(‘Nhaäp soá haøng N, soá coät M : ‘);
                  Kmang1 = array[1..2, 1..3] of Real;         Readln(N, M);
            Const       Until ( N>0) and ( N<11) and ( M>0) and (M<11);
                  X : Kmang1 = ( (1.5, 2.5, 3.5), (5.0, 6.5, 7.0) );       For i:=1 to N do
    Khi ñoù X laø moät maûng hai chieàu coù 6 phaàn töû cuøng       For j:=1 to M do
kieåu thöïc vaø coù giaù trò laø:         begin
            X[1,1]=1.5, X[1,2]=2.5, X[1,3]=3.5           Write(‘Nhaäp A[‘ , i, ‘,’ , j , ‘]: ‘);
            X[2,1]=5.0, X[2,2]=6.5, X[2,3]=7.0           Readln(A[i,j]);
    Caàn nhaán maïnh raèng maëc duø töø khoùa ôû ñaây laø Const         end;
song X vaø caùc phaàn töû cuûa X coù theå duøng nhö caùc bieán,       { nhaäp B vaø tính C luoân}
töùc laø caùc phaàn töû cuûa X coù theå thay ñoåi giaù trò ñöôïc.       For i:=1 to N do
  10.2.2. Caùc thao taùc treân ma traän :       For j:=1 to M do
    Ñeå xaùc ñònh moät phaàn töû trong maûng hai chieàøu, ta         begin
vieát:           Write(‘Nhaäp B[‘ , i, ‘,’ , j , ‘]: ‘);
    Teânbieánmaûng[chæ soá 1, chæ soá 2]           Readln(B[i,j]);
    Ví duï:           C[i, j]:=A[i, j] + B[i, j];
            X[1,1]:=12.5;         end;
            X[2,1]:=X[1,1]+15;       { In ma traân A leân maøn hình }
            Y[‘a’,1]:=‘Tran Thi Mai’;       Writeln(‘ Ma tran A la :’);
      For i:=1 to N do
        begin
19
          For j:=1 to M do write(A[i, j]:3:0);     Kiemtra := TRUE;
          Writeln;     For i:=1 to N do
        end;     For j:=1 to N do
      { In ma traân B leân maøn hình }       if A[i, j]<>A[j, i] then Kiemtra:=FALSE ;
      Writeln(‘ Ma tran B la :’);     If Kiemtra=TRUE then writeln(‘ Ñoái xöùng ‘)
      For i:=1 to N do     else
        begin       writeln(‘ Khoâng ñoái xöùng ‘);
          For j:=1 to M do write(B[i, j]:3:0);     Trong ñoù Kiemtra laø moät bieán kieåu loâgic.
          Writeln;     Nhaän xeùt raèøng hai leänh For ôû treân queùt qua taát caû
        end; caùc phaàn töû cuûa ma traän neân coù hôn nöûa soá laàn laëp
      { In ma traân C leân maøn hình } laø thöøa. Thaät vaäy, ñöôøng cheùo chính chia ma traän ra
      Writeln(‘ Ma tran C la :’); laøm hai phaàn: nöûa traùi vaø nöûa phaûi. Caùc phaàøn töû
      For i:=1 to N do treân ñöôøng cheùo chính thì ñoái xöùng vôùi chính noù neân
        begin khoâng caàn phaûi kieåm tra. Neáu moãi phaàøn töû ôû nöûa
          For j:=1 to M do write(C[i, j]:3:0); beân traùi ñeàu baèng phaàn töû ñoái xöùng vôùi noù ôû nöûa
          Writeln; beân phaûi thì ma traän roõ raøng laø ñoái xöùng. Vì vaäy chæ
        end; caàn duyeät kieåm tra caùc phaàn töû ôû nöûa beân traùi ñöôøng
      Readln; cheùo chính laø ñuû (vuøng tam giaùc).
    End.       Thuaät toaùn toát hôn ñöôïc ñeà nghò laø :
        Chaïy chöông trình <VD106.EXE>     Kiemtra := TRUE;
        Cheùp taäp tin nguoàn <VD106.PAS>     For i:=2 to N do
      For j:=1 to i-1 do
        Ví duï 10.7: Tìm soá lôùn nhaát (soá nhoû nhaát) trong ma       if A[i, j]<>A[j, i] then Kiemtra:=FALSE ;
traän A:     If Kiemtra=TRUE then writeln(‘ Ñoái xöùng ‘)
    Giaû söû A laø ma traän N haøng, M coät, vaø Max laø bieán     else
chöùa soá lôùn nhaát phaûi tìm. Khôûi ñaàøu ta gaùn A[1,1] cho       writeln(‘ Khoâng ñoái xöùng ‘);
Max, sau ñoù duyeät taát caû caùc phaàn töû cuûa ma traän, neáu     Hai caâu leänh For treân vaãn coøn moät nhöôïc ñieåm laø:
phaàn töû naøo lôùn hôn Max thì löu noù vaøo Max, töùc laø: khi xaûy ra A[i,j]<>A[j, i] roài, leõ ra coù theå döøng laïi vaø
    Max:=A[1,1]; keát luaän khoâng ñoái xöùng ngay thì caùc voøng For vaãn
    For i:=1 to N do tieáp tuïc, i chaïy ñeán N vaø j ñeán i-1.
    For j:=1 to M do     Söû duïng caâu leänh While seõ khaéc phuïc ñöôïc nhöôïc
      if Max< A[i, j] then Max:=A[i, j]; ñieåm naøy. Chæ caàn xaûy ra A[i,j]<>A[j,i] moät laàn laø bieán
    Writeln(‘ Soá lôùn nhaát laø ’, Max); Kiemtra ñöôïc gaùn ngay gía trò FALSE, khi ñoù ñieàu kieän
  Kiemtra=TRUE bò sai vaø caû hai voøng laëp ñeàu keát thuùc .
    Ví duï 10.8 : Tìm soá lôùn nhaát (hay soá nhoû nhaát) trong     Kiemtra:=TRUE;
töøng haøng (hay töøng coät) cuûa ma traän A:     i:=2;
    Haøng i ( 1 i N ) cuûa ma traän A coù daïng :     While (Kiemtra=TRUE) and (i<= N) do
    A[i,1], A[i,2], ..., A[i,M]       begin
    Neáu xem i laø coá ñònh thì ñoù laø maûng moät chieàu coù M         j:=1;
phaàn töû, neân soá lôùn nhaát cuûa haøng i ñöôïc tìm baèng caùc         While ( Kiemtra=TRUE) and ( j<=i-1) do
leänh:           if A[i, j] <> A[j, i] then Kiemtra:=FALSE
    Max:=A[i, 1];           else
    For j:=1 to M do             j:=j+1;
      if Max< A[i, j] then Max:=A[i, j];         i:=i+1;
    Writeln(‘Sln cuûa haøng ‘, i, ‘ laø: ‘, Max) ;       end;
    Vì coù caû thaûy N haøng neân coâng vieäc treân phaûi laøm N     If Kiemtra=TRUE then writeln(‘ Ñoái xöùng ‘)
laàn öùng vôùi i=1, 2, ..., N, töùc laø:     else
    For i:=1 to N do       writeln(‘ Khoâng ñoái xöùng ‘);
      begin { tìm soá lôùn nhaát cuûa haøng i }     Chöông trình döôùi ñaây thöïc hieän caùc coâng vieäc sau:
        Max:=A[i, 1];     -Nhaäp vaøo ma traän vuoâng A caáp N vaø in ma traän A
        For j:=1 to M do leân maøn hình
          if Max< A[i, j] then Max:=A[i, j];     -Ñeám trong ma traän A coù bao nhieâu soá 0
        Writeln(‘Sln cuûa haøng ‘, i, ‘ laø: ‘, Max) ;     -Tìm soá lôùn nhaát trong A
      end;     -Tìm soá nhoû nhaát trong töøng haøng cuûa A
Ví duï 10.9: Kieåm tra ma traän vuoâng A coù ñoái xöùng     -Kieåm tra xem A coù phaûi laø ma traän ñoái xöùng khoâng.
khoâng ?.     PROGRAM VIDU109;
    Ma traän vuoâng A goïi laø ñoái xöùng neáu noù khoâng thay     Uses CRT;
ñoåi khi ta ñoåi coät thaønh haøng vaø ñoåi haøng thaønh coät.     Type
Noùi caùch khaùc, ma traän A laø ñoái xöùng khi vaø chæ khi       Matran = Array[1..10, 1..10] of Real;
A[i,j] =A[j,i] vôùi moïi i=1, ..., N vaø vôùi moïi j=1, .., N. Ví duï,     Var
cho hai ma traän döôùi ñaâyï:       A : Matran;
thì A laø ñoái xöùng, coøn B khoâng ñoái xöùng vì B[1,2]        i, j , N, Dem : Integer;
B[2,1].       Max, Min : Real;
    Chæ caàn coù moät caëp i, j sao cho A[i,j]<>A[j,i] thì A laø ma       Kiemtra: Boolean;
traän khoâng ñoái xöùng.     Begin
    Vaäy caùc leänh kieåm tra tính ñoái xöùng cuûa ma traän A laø:       Clrscr;
20
      Repeat vì sang böôùc sau thì gía trò U seõ thay ñoåi neân taïi moãi
        Write(‘Nhaäp caáp N : ‘); böôùc ta phaûi coäng hoaëc tröø ngay U vaøo toång S.
        Readln(N);     Vieäc coäng hay tröø U vaøo toång S ñöôïc giaûi quyeát nhôø
      Until ( N>0) and ( N<11) ; moät bieán dau goïi laø bieán chöùa daáu cuûa U, bieán naøy
      For i:=1 to N do chæ nhaän gía trò laø +1 hay -1 öùng vôùi pheùp coäng hay tröø
      For j:=1 to N do U vaøo toång S.
        begin     Ñaàu tieân ta gaùn:
          Write(‘Nhaäp A[‘, i, ‘,’ , j , ‘]: ‘);                 dau:= -1;
          Readln(A[i,j]);     Taïi moãi böôùc laëp ta coäng U ñaõ nhaân vôùi dau vaøo S,
        end; roài ñaûo daáu ñi ñeå chuaån bò cho böôùc tieáp theo baèng
      { In ma traân A leân maøn hình } caùc leänh:
      Writeln(‘ Ma tran A la : ’);                 S:= S+ dau * U;
      For i:=1 to N do                 dau:= -dau ;
        begin     Thaønh ra neáu böôùc tröôùc dau=-1 thì ôû böôùc sau dau=+1
          For j:=1 to N do write(A[i, j]: 3 :0); vaø ngöôïc laïi. Keát quûa laø leänh S:= S+ dau * U; seõ coäng
          Writeln; hay tröø U vaøo S theo luaät ñan daáu.
        end;     Caâu leänh laëp ñöôïc duøng ôû ñaây laø leänh FOR vì soá
      { Ñeám soá soá 0 } laàn laëp N ñöôïc nhaäp töø baøn phím töùc laø ñaõ bieát tröôùc.
      Dem:=0; Chöông trình cuï theå nhö sau:
      For i:=1 to N do     PROGRAM VIDU11_1;
      For j:=1 to N do if A[i, j]=0 then Inc(Dem);     { Tính gaàn ñuùng Sinx }
      Writeln(‘ Coù ‘, Dem, ‘ soá khoâng’);     Var
      { Tìm soá lôùn nhaát cuûa ma traän }       N, k, dau : Integer;
      Max:=A[1,1];       x, U, S, C : Real;
      For i:=1 to N do     Begin
      For j:=1 to N do       Write(‘Nhaäp soá döông N : ‘); Readln(N);
        if Max < A[i,j] then Max:=A[i,j];       Write(‘Nhaäp soá thöïc x : ‘); Readln(x);
      Writeln(‘ Soá lôùn nhaát cuûa ma traän= ‘, Max : 4:1);       U:=x;
      { Tìm soá nhoû nhaát trong töøng haøng cuûa ma traän }       S:=x ; { Gaùn gía trò ban ñaàu U0 cho S ngay}
      For i:=1 to N do       dau:= -1;
        begin       For k:=1 to N do
          Min:=A[i,1];         begin
          For j:=1 to N do if Min > A[i,j] then Min:=A[i,j];           C:= x*x/ ( 2*k*(2*k+1) );
          Writeln(‘ Soá nhoû nhaát cuûa haøng ‘, i , ‘ laø: ‘, Min :           U:= U*C;
4:1);           S:=S+ dau*U;
        end;           dau:= - dau;
      { Kieåm tra ma traän coù ñoái xöùng khoâng}         end;
      Kiemtra:=True;       Writeln(‘ Giaù trò Sin = ‘, S:8:4);
      For i:=1 to N do       Readln;
      For j:=1 to i-1 do     End.
        if A[i ,j]<>A[j ,i] then Kiemtra:=False;      Chaïy <VD11_1.EXE >
      If Kiemtra=True then Writeln(‘ Ñoái xöùng’)      Cheùp taäp tin nguoàn <VD11_1.PAS>
      else     Khi chaïy chöông trình, neáu nhaäp N=6 vaø x=1.5708 (= 
        Writeln(‘ Khoâng ñoái xöùng’) ; /2) thì cho keát quûa Sinx= 1.0000 ; Neáu nhaäp N=6 vaø
      Readln; x=3.1416 (=  ) thì cho keát quûa Sinx = 0.0000.
    End.   Ví duï 11.2: Tính gaàn ñuùng soá e vôùi sai soá cho tröôùc.
Chaïy<VD109.EXE>     Cho coâng thöùc
Cheùp taäp tin nguoàn <VD109.PAS>     ( veá phaûi laø moät toång voâ haïn )
      Haõy tính gaàn ñuùng e2 baèng caùch laáy toång ( höõu haïn )
caùc soá haïng ôû ñaàu chuoãi cho ñeán khi gaëp soá haïng ñaàu
  11.1. CAÙC VÍ DUÏ NAÂNG CAO VEÀ CAÂU LEÄNH tieân coù gía trò tuyeät ñoái nhoû hôn moät soá epsilon (EPS)
LAËP : döông khaù beù cho tröôùc, töùc laø :
    Phaàn naøy trình baøy caùch vaän duïng caùc caâu leänh laëp vôùi n laø soá sao cho:             Ta vieát :
ñeå giaûi quyeát moät soá baøi toaùn tieâu bieåu ôû möùc khoù            S = Uo +U1 +...+Un , trong ñoù :
hôn. Thoâng qua caùc ví duï, ngöôøi hoïc seõ tìm thaáy nhöõng tö           Uo=1
lieäu coù ích ñeå giaûi caùc baøi taäp töông töï, naâng cao theâm     Töông töï ví duï 11.1, ta duøng bieán U ñeå löu soá haïng taïi
moät böôùc kyõ naêng laäp trình. moãi böôùc laëp k=0, 1, 2, ... Taïi moãi böôùc, ta kieåm tra
  Ví duï 11.1: Nhaäp x vaø n, tính gaàn ñuùng Sinx theo coâng neáu U  EPS thì coäng U vaøo toång S, roài tính U cho
thöùc:          böôùc tieáp theo baèng caùch nhaân U vôùi thöøa soá 2/k. Quùa
    Ta vieát : trình keát thuùc khi gaëp soá haïng U ñaàu tieân coù  U <
  S= U0 - U1 + U2 - U3 +U4 - ... +(-1)N UN , trong ñoù : EPS. Vì soá voøng laëp laø khoâng bieát tröôùc neân caâu leänh
                U0 =x laëp ñöôïc duøng laø WHILE. Chöông trình ñöôïc vieát nhö
    Nhö vaäy, Uk sai khaùc Uk-1 moät thöøa soá C coù theå tính sau :
tröïc tieáp ñöôïc theo x vaø theo k         PROGRAM VIDU11_2;
    Thaønh ra, neáu löu ñöôïc soá haïng U ôû böôùc tröôùc thì seõ     { Tinh e2 theo sai soá EPS döông khaù beù cho tröôùc}
tính ñöôïc soá haïng U ôû böôùc sau baèng leänh : U:=U*C; , vaø     Var
21
      k : Integer;     PROGRAM VIDU11_4;
      S, U, EPS : Real;     { Kieåm tra soá N coù phaûi soá nguyeân toá khoâng }
    Begin     Var
      Repeat       N, k: integer;
        Write(‘Nhap sai so > 0 : ‘);       Kiemtra: Boolean ;
        Readln(EPS);     Begin
      Until EPS >0;       Repeat
      k :=0;         Write(‘ Nhaäp N : ‘);
      S :=0;         Readln(N);
      U :=1;       Until (N>0);
      While ABS(U) >= EPS DO       If N =1 then Kiemtra:= False
        begin       else { xeùt N > 1}
          S:=S +U;         begin
          k:=k+1;           Kiemtra:= True;
          U:=U* 2/ k;           k:=1;
        end;           Repeat
      Writeln(‘ S= ‘ , S:8:4 , ‘ tính ñeán soá haïng k= ‘, k);             k:= k+1;
      Readln;           Until N mod k=0 ;
    End.           If k<N then Kiemtra:= False;
    Chaïy < VD11_2.EXE>         end;
   Cheùp taäp tin nguoàn <VD11_2.PAS>       If Kiemtra=True then Writeln(N, ‘ laø soá nguyeân toá ‘)
    Khi chaïy chöông trình, neáu nhaäp EPS=0.001 thì cho keát       else
quûa S=7.3887 , tính ñeán soá haïng k=10.         Writeln(N, ‘ khoâng phaûi soá nguyeân toá ‘);
  Ví duï 11.3:       Readln;
    Nhaäp soá nguyeân döông N, in caùc chöõ soá cuûa N theo     End.
thöù töï ñaûo ngöôïc. Ví duï N= 15742 in ra 24751. Caùch laøm     Chaïy <VD11_4.EXE>
nhö sau:     Cheùp taäp tin nguoàn <VD11_4.PAS>
    Taùch vaø in haøng ñôn vò cuûa N ra baèng hai leänh:     Chöông trình coù moät ñoaïn caàn giaûi thích roõ theâm:
            k:= N mod 10; { ñöôïc k=2 }     Repeat
             Write(k: 3);       k:= k+1;
    Boû ñi haøng ñôn vò, giöõ laïi caùc chöõ soá töø haøng chuïc     Until N mod k=0 ;
trôû leân:     If k<N then Kiemtra:= False;
             N:= N div 10; { ñöôïc N=1574 }     Voøng laëp treân keát thuùc khi gaëp soá k ñaàu tieân (nhoû
    Laëp laïi quùa trình treân cho ñeán khi N=0. nhaát) thoûa ñieàu kieän N mod k=0. Luùc ñoù, neáu k<N thì
    Soá laàn laëp laø khoâng bieát tröôùc maø tuøy thuoäc vaøo coù nghóa N chia heát cho moät soá k khaùc N neân N khoâng
vieäc nhaäp soá N coù ít hay coù nhieàu chöõ soá, neân ta phaûi phaûi soá nguyeân toá. Neáu k=N thì chöùng toû N chæ chia
duøng leänh Repeat hay While. heát cho N vaø khoâng chia heát cho caùc soá 2, 3, ..., N-1 neân
    PROGRAM VIDU11_3; N laø soá nguyeân toá.
    { In ñaûo ngöôïc caùc chöõ soá cuûa N }     Nhaän xeùt: Vì soá chaün (tröø soá 2) khoâng phaûi soá
    Var nguyeân toá neân chöông trình coù theå caûi tieán chæ kieåm tra
      N, k: LongInt ; caùc soá leû thoâi.
    Begin 11.2. CAÙC VÍ DUÏ NAÂNG CAO VEÀ MAÛNG :
      Repeat
   Ví duï 11.5:
        Write(‘ Nhaäp N : ‘);
    Nhaäp moät danh saùch N (N<50) hoïc sinh goàm hoï teân
        Readln(N);
vaø ñieåm thi moân toaùn. Haõy phaân loaïi caùc hoïc sinh nhö
      Until (N>0);
sau : loaïi gioûi neáu ñieåm toaùn  9, loaïi khaù neáu 7  ñieåm
      Writeln( N, ‘ ñöôïc in ñaûo ngöôïc thaønh :’);
      Repeat toaùn< 9, loaïi trung bình neáu 5  ñieåm toaùn< 7, vaø loaïi
        k:= N mod 10; keùm neáu ñieåm toaùn< 5.
        Write(k: 3);     In danh saùch leân maøn hình, moãi ngöôøi treân moät doøng,
        N:=N div 10; goàm hoï teân, ñieåm toaùn vaø phaân loaïi. Yeâu caàu danh
      Until N=0; saùch ñöôïc saép thöù töï theo traät töï giaûm cuûa ñieåm toaùn.
      Readln;     Ñeám xem coù bao nhieâu em coù ñieåm toaùn baèng 10 ?.
    End.     PROGRAM VIDU11_5;
    Chaïy <VD11_3.EXE>         Uses CRT;
    Cheùp taäp tin nguoàn <VD11_3.PAS>     Type
      Kmang1 = Array[1..50] of String[18];
  Ví duï 11.4: Kieåm tra soá töï nhieân N coù phaûi soá
      Kmang2 = Array[1..50] of Real;
nguyeân toá khoâng.
    Var
    Soá N 1 laø soá nguyeân toá neáu noù chæ chia heát cho 1 vaø
      i, j, N, Dem10 : Integer;
chính noù. Ví duï caùc soá 2, 3, 5, 7, 11, 13, 17, 19, 21, 23 ñeàu
      Hoten, Loai: Kmang1;
laø soá nguyeân toá.
      Dtoan : Kmang2;
    Xuaát phaùt töø ñòng nghóa, ta kieåm tra neáu N khoâng chia
      St: String[18];
heát cho taát caû caùc soá töø 2, 3, 4, ..., ñeán N-1 thì N laø
      z: Real;
nguyeân toá, ngöôïc laïi, chæ caàn N chia heát cho moät soá k
    Begin
naøo ñoù trong taäp { 2, 3, 4, ..., N-1} thì N khoâng phaûi soá
      Clrscr;
nguyeân toá.
      Repeat
22
        Write(‘ Nhaäp soá löôïng hoïc sinh : ‘);         Write(‘Nhaäp kyù töï thöù ‘ , i , ‘: ‘);
        Readln(N);         Readln(ch);
      Until (N>0) and ( N<51);         { ñoåi ra chöõ thöôøng }
      For i:=1 to N do { nhaäp danh saùch hs }         If ch IN [‘A’..’Z’] then ch:=Chr( Ord(ch) + 32 );
        begin         Kytu[i]:= ch;
          Write(‘Nhaäp hoï vaø teân cuûa hs thöù ‘, i , ‘ : ‘);       Until ( ch= #32) or (i=20);
          Readln(Hoten[i]);       N:=i;
          Write(‘Nhaäp ñieåm toaùn cuûa hs thöù ‘, i , ‘ : ‘);       { Ñeám caùc chöõ a, b, c, d }
          Readln(Dtoan[i]);       For ch:=‘a’ to ‘d’ do Dem[ch]:=0;
        end;       For i:=1 to N do
      { saép xeáp giaûm theo ñieåm toaùn}         begin
      For i:=1 to N-1 do           ch:=Kytu[i];
      For j:=i+1 to N do           If ch IN [‘a’..’d’] then Dem[ch] := Dem[ch]+1; {24}
        If Dtoan[i]<Dtoan[j] then         end;
          begin { hoaùn ñoåi Dtoan vaø hoï teân }       Writeln(‘ Soá kyù töï ñaõ nhaäp laø :’ , N );
            z:=Dtoan[i];       For ch:=‘a’ to ‘d’ do writeln(‘ Soá chöõ ‘, ch, ‘=‘,
            Dtoan[i]:=Dtoan[j]; Dem[ch]);
            Dtoan[j]:=z;       Readln;
            St:=Hoten[i];     End.
            Hoten[i]:=Hoten[j];     <Chaïy VD11_6.EXE>
            Hoten[j]:=St;     Cheùp taäp tin nguoàn <VD11_6.PAS>
          end;     Trong chöông trình, caâu leänh ôû doøng {24}:
      { Phaân loaïi }     If ch IN [‘a’..’d’] then Dem[ch] := Dem[ch]+1;
      For i:=1 to N do töông ñöông vôùi leänh gheùp sau:
        If Dtoan[i] >= 9 then Loai[i]:=‘Gioi’     begin
        else       If ch =‘a’ then Dem[‘a’] := Dem[‘a’]+1;
          If Dtoan[i] >=7 then Loai[i]:=‘Kha’       If ch =‘b’ then Dem[‘b’] := Dem[‘b’]+1;
          else       If ch =‘c’ then Dem[‘c’] := Dem[‘c’]+1;
            If Dtoan[i]>=5 then Loai[i]:=‘Trung binh’       If ch =‘d’ then Dem[‘d’] := Dem[‘d’]+1;
            else     end;
              Loai[i] :=‘Kem’;     Duøng boán leänh naøy thì deã hieåu hôn song baøi toaùn seõ
      Writeln(‘ Danh saùch hs ñaõ saép giaûm theo Ñtoaùn laø: khoâng phaùt trieån ñöôïc khi ta phaûi ñeám nhieàu loaïi kyù töï,
‘); chaúng haïn nhö ñeám chöõ a, ñeám chöõ b, ..., ñeám chöõ z.
      For i:=1 to N do    Ví duï 11.7:    
          Writeln(Hoten[i]: 18, #32, Dtoan[i]:5:1, #32, Loai[i]) ;         Nhaäp ma traän A caáp NxM, ñeám xem moãi haøng coù
      { Ñeám soá em ñöôïc ñieåm 10} bao nhieâu soá 0, nhöõng haøng naøo coù nhieàøu soá 0 nhaát.
      Dem10 := 0;     Ta khai baùo Dem laø moät maûng goàm N phaàøn töû vôùi
      For i:=1 to N do quy öôùc Dem[i] löu soá löôïng soá 0 cuûa haøng i. Tìm Max
        if Dtoan[i]=10 then Dem10 :=Dem10 +1; laø soá lôùn nhaát trong maûng Dem. Nhöõng haøng i naøo coù
      Writeln(‘ Soá em ñöôïc ñieåm 10 laø :’ , Dem10); Dem[i] =Max laø haøng coù nhieàu soá khoâng nhaát.
      Readln;     Döôùi ñaây laø chöông trình cuï theå :
    End.     PROGRAM VIDU11_7 ;
    <Chaïy VD11_5.EXE>     { Tìm trong ma traän caùc haøng coù nhieàu soá 0 nhaát }
    Cheùp taäp tin nguoàn <VD11_5.PAS>     Type
    Trong chöông trình, ta söû duïng ba maûng: Hoten, Loai vaø       Kmang= Array[1..10, 1..10] of Real;
Dtoan vôùi quy öôùc phaàn töû thöù i cuûa caùc maûng naøy     Var
chöùa caùc thoâng tin veà cuøng moät ngöôøi: ñoù laø hoïc sinh       A : Kmang;
thöù i trong danh saùch. Vì theá, khi saép xeáp maûng Dtoan       i, j, N, M : Integer;
giaûm daàn, moãi khi coù söï ñoåi choã Dtoan[i] vôùi Dtoan[j] thì       Dem : Array[1..10] of Integer ;
töông öùng cuõng phaûi ñoåi choã Hoten[i] vôùi Hoten]j].       Max : Integer ;
    Ví duï 11.6:     Begin
        Nhaäp caùc kyù töï töø baøn phím, ñoåi thaønh chöõ thöôøng       Repeat
neáu laø chöõ hoa, vaø löu vaøo moät maûng, quùa trình keát         Write(‘Nhaäp soá haøng N, soá coät M : ‘);
thuùc khi nhaäp kyù töï traéng. Cho bieát coù bao nhieâu kyù töï         Readln(N, M);
ñaõ nhaäp, trong ñoù coù bao nhieâu chöõ a, b, c, d moãi loaïi.       Until ( N>0) and ( N<11) and ( M>0) and (M<11);
    PROGRAM VIDU11_6;       For i:=1 to N do
    { Ñeám kyù töï a, b, c, d }       For j:=1 to M do
    Var         begin
      Kytu : Array[1..20] of Char ;           Write(‘Nhaäp A[‘, i, ‘,’ , j , ‘]: ‘);
      N, i, Max : Integer;           Readln(A[i,j]);
      ch : Char;         end;
      Dem : Array[‘a’..’d’] of Integer;       { In ma traân A }
    Begin       Writeln(‘ Ma tran A la:’);
      i:=0;       For i:=1 to N do
      Repeat         begin
        i:=i+1;           For j:=1 to M do Write(A[i, j]:4:0);
23
          Writeln;       St: String[18];
        end;       z: Real;
      { Ñeám soá 0 trong töøng haøng}     Begin
      For i:=1 to N do       Clrscr;
        begin       Repeat
          Dem[i]:=0;         Write(‘ Nhaäp soá löôïng hoïc sinh : ‘);
          For j:=1 to M do if A[i, j]=0 then Inc(Dem[i]);         Readln(N);
          Writeln(‘Soá soá 0 cuûa haøng ‘, i, ‘ laø: ‘ , Dem[i]);       Until (N>0) and ( N<51);
        end;       For i:=1 to N do { nhaäp danh saùch hs }
      { Tìm soá lôùn nhaát cuûa maûng Dem }         begin
      Max:=Dem[1];           Write(‘Nhaäp hoï vaø teân cuûa hs thöù ‘, i , ‘ : ‘);
      For i:=1 to N do           Readln(Hoten[i]);
        if Max< Dem[i] then Max:=Dem[i];           Write(‘Nhaäp ñieåm toaùn cuûa hs thöù ‘, i , ‘ : ‘);
      Writeln(‘ Soá 0/haøng nhieàu nhaát = ‘, Max);           Readln(Dtoan[i]);
      { Tìm caùc haøng coù nhieàu soá 0 nhaát}         end;
      If Max =0 then writeln(‘ Khoâng haøng naøo coù soá 0 ‘)       { saép xeáp giaûm theo ñieåm toaùn}
      else       For i:=1 to N-1 do
        For i:=1 to N do if Dem[i]=Max then       For j:=i+1 to N do
          writeln(‘ Haøng nhieàu soá 0 nhaát laø ‘, i:3 );         If Dtoan[i]<Dtoan[j] then
      Readln;           begin { hoaùn ñoåi Dtoan vaø hoï teân }
    End.             z:=Dtoan[i];
    <Chaïy VD11_7.EXE>             Dtoan[i]:=Dtoan[j];
     Cheùp taäp tin nguoàn <VD11_7.PAS>             Dtoan[j]:=z;
  Ví duï 11.8: Hoaùn ñoåi hai haøng h vaø k cuûa ma traän A             St:=Hoten[i];
    Haøng h coù daïng : A[h,1], A[h,2], ..., A[h,M]             Hoten[i]:=Hoten[j];
    Haøng k coù daïng : A[k,1], A[k,2], ..., A[k,M]             Hoten[j]:=St;
    Vieäc ñoåi haøng h vaø haøng k ñöôïc quy veà vieäc ñoåi choã           end;
töøng caëp phaàn töû: A[h,1] vôùi A[k,1], A[h,2] vôùi A[k,2],...,       { Phaân loaïi }
A[h,M] vôùi A[k,M], töùc laø ñoåi choã A[h,j] vaø A[k,j] vôùi       For i:=1 to N do
moïi j=1, 2, ..., M:         If Dtoan[i] >= 9 then Loai[i]:=‘Gioi’
    For j:=1 to M do         else
      begin { ñoåi choã A[h,j] vôùi A[k,j] }           If Dtoan[i] >=7 then Loai[i]:=‘Kha’
        z:=A[h,j];           else
        A[h,j]:=A[k,j];             If Dtoan[i]>=5 then Loai[i]:=‘Trung binh’
        A[k,j]:=z;             else
      end;               Loai[i] :=‘Kem’;
    ÔÛ ñaây z laø bieán trung gian cuøng kieåu döõ lieäu vôùi caùc       Writeln(‘ Danh saùch hs ñaõ saép giaûm theo Ñtoaùn
phaàn töû cuûa ma traän A. laø: ‘);
                  For i:=1 to N do
          Writeln(Hoten[i]: 18, #32, Dtoan[i]:5:1, #32, Loai[i]) ;
      { Ñeám soá em ñöôïc ñieåm 10}
      Dem10 := 0;
      For i:=1 to N do
        if Dtoan[i]=10 then Dem10 :=Dem10 +1;
      Writeln(‘ Soá em ñöôïc ñieåm 10 laø :’ , Dem10);
    Caùc baïn haõy vieát chöông trình cho ví duï naøy.
      Readln;
11.2. CAÙC VÍ DUÏ NAÂNG CAO VEÀ MAÛNG :     End.
   Ví duï 11.5:     <Chaïy VD11_5.EXE>
    Nhaäp moät danh saùch N (N<50) hoïc sinh goàm hoï teân vaø     Cheùp taäp tin nguoàn <VD11_5.PAS>
ñieåm thi moân toaùn. Haõy phaân loaïi caùc hoïc sinh nhö sau :     Trong chöông trình, ta söû duïng ba maûng: Hoten, Loai vaø
loaïi gioûi neáu ñieåm toaùn  9, loaïi khaù neáu 7  ñieåm Dtoan vôùi quy öôùc phaàn töû thöù i cuûa caùc maûng naøy
toaùn< 9, loaïi trung bình neáu 5  ñieåm toaùn< 7, vaø loaïi chöùa caùc thoâng tin veà cuøng moät ngöôøi: ñoù laø hoïc sinh
keùm neáu ñieåm toaùn< 5. thöù i trong danh saùch. Vì theá, khi saép xeáp maûng Dtoan
    In danh saùch leân maøn hình, moãi ngöôøi treân moät doøng, giaûm daàn, moãi khi coù söï ñoåi choã Dtoan[i] vôùi Dtoan[j]
goàm hoï teân, ñieåm toaùn vaø phaân loaïi. Yeâu caàu danh thì töông öùng cuõng phaûi ñoåi choã Hoten[i] vôùi Hoten]j].
saùch ñöôïc saép thöù töï theo traät töï giaûm cuûa ñieåm toaùn.     Ví duï 11.6:
    Ñeám xem coù bao nhieâu em coù ñieåm toaùn baèng 10 ?.         Nhaäp caùc kyù töï töø baøn phím, ñoåi thaønh chöõ
    PROGRAM VIDU11_5; thöôøng neáu laø chöõ hoa, vaø löu vaøo moät maûng, quùa
    Uses CRT; trình keát thuùc khi nhaäp kyù töï traéng. Cho bieát coù bao
    Type nhieâu kyù töï ñaõ nhaäp, trong ñoù coù bao nhieâu chöõ a, b, c,
      Kmang1 = Array[1..50] of String[18]; d moãi loaïi.
      Kmang2 = Array[1..50] of Real;     PROGRAM VIDU11_6;
    Var     { Ñeám kyù töï a, b, c, d }
      i, j, N, Dem10 : Integer;     Var
      Hoten, Loai: Kmang1;       Kytu : Array[1..20] of Char ;
      Dtoan : Kmang2;       N, i, Max : Integer;
24
      ch : Char;         end;
      Dem : Array[‘a’..’d’] of Integer;       { In ma traân A }
    Begin       Writeln(‘ Ma tran A la:’);
      i:=0;       For i:=1 to N do
      Repeat         begin
        i:=i+1;           For j:=1 to M do Write(A[i, j]:4:0);
        Write(‘Nhaäp kyù töï thöù ‘ , i , ‘: ‘);           Writeln;
        Readln(ch);         end;
        { ñoåi ra chöõ thöôøng }       { Ñeám soá 0 trong töøng haøng}
        If ch IN [‘A’..’Z’] then ch:=Chr( Ord(ch) + 32 );       For i:=1 to N do
        Kytu[i]:= ch;         begin
      Until ( ch= #32) or (i=20);           Dem[i]:=0;
      N:=i;           For j:=1 to M do if A[i, j]=0 then Inc(Dem[i]);
      { Ñeám caùc chöõ a, b, c, d }           Writeln(‘Soá soá 0 cuûa haøng ‘, i, ‘ laø: ‘ , Dem[i]);
      For ch:=‘a’ to ‘d’ do Dem[ch]:=0;         end;
      For i:=1 to N do       { Tìm soá lôùn nhaát cuûa maûng Dem }
        begin       Max:=Dem[1];
          ch:=Kytu[i];       For i:=1 to N do
          If ch IN [‘a’..’d’] then Dem[ch] := Dem[ch]+1; {24}         if Max< Dem[i] then Max:=Dem[i];
        end;       Writeln(‘ Soá 0/haøng nhieàu nhaát = ‘, Max);
      Writeln(‘ Soá kyù töï ñaõ nhaäp laø :’ , N );       { Tìm caùc haøng coù nhieàu soá 0 nhaát}
      For ch:=‘a’ to ‘d’ do writeln(‘ Soá chöõ ‘, ch, ‘=‘,       If Max =0 then writeln(‘ Khoâng haøng naøo coù soá 0 ‘)
Dem[ch]);       else
      Readln;         For i:=1 to N do if Dem[i]=Max then
    End.           writeln(‘ Haøng nhieàu soá 0 nhaát laø ‘, i:3 );
    <Chaïy VD11_6.EXE>       Readln;
    Cheùp taäp tin nguoàn <VD11_6.PAS>     End.
    Trong chöông trình, caâu leänh ôû doøng {24}:     <Chaïy VD11_7.EXE>
    If ch IN [‘a’..’d’] then Dem[ch] := Dem[ch]+1;      Cheùp taäp tin nguoàn <VD11_7.PAS>
töông ñöông vôùi leänh gheùp sau:   Ví duï 11.8: Hoaùn ñoåi hai haøng h vaø k cuûa ma traän A
    begin     Haøng h coù daïng : A[h,1], A[h,2], ..., A[h,M]
      If ch =‘a’ then Dem[‘a’] := Dem[‘a’]+1;     Haøng k coù daïng : A[k,1], A[k,2], ..., A[k,M]
      If ch =‘b’ then Dem[‘b’] := Dem[‘b’]+1;     Vieäc ñoåi haøng h vaø haøng k ñöôïc quy veà vieäc ñoåi
      If ch =‘c’ then Dem[‘c’] := Dem[‘c’]+1; choã töøng caëp phaàn töû: A[h,1] vôùi A[k,1], A[h,2] vôùi
      If ch =‘d’ then Dem[‘d’] := Dem[‘d’]+1; A[k,2],..., A[h,M] vôùi A[k,M], töùc laø ñoåi choã A[h,j] vaø
    end; A[k,j] vôùi moïi j=1, 2, ..., M:
    Duøng boán leänh naøy thì deã hieåu hôn song baøi toaùn seõ     For j:=1 to M do
khoâng phaùt trieån ñöôïc khi ta phaûi ñeám nhieàu loaïi kyù töï,       begin { ñoåi choã A[h,j] vôùi A[k,j] }
chaúng haïn nhö ñeám chöõ a, ñeám chöõ b, ..., ñeám chöõ z.         z:=A[h,j];
   Ví duï 11.7:             A[h,j]:=A[k,j];
        Nhaäp ma traän A caáp NxM, ñeám xem moãi haøng coù         A[k,j]:=z;
bao nhieâu soá 0, nhöõng haøng naøo coù nhieàøu soá 0 nhaát.       end;
    Ta khai baùo Dem laø moät maûng goàm N phaàøn töû vôùi     ÔÛ ñaây z laø bieán trung gian cuøng kieåu döõ lieäu vôùi
quy öôùc Dem[i] löu soá löôïng soá 0 cuûa haøng i. Tìm Max laø caùc phaàn töû cuûa ma traän A.       
soá lôùn nhaát trong maûng Dem. Nhöõng haøng i naøo coù     Caùc baïn haõy vieát chöông trình cho ví duï naøy.
Dem[i] =Max laø haøng coù nhieàu soá khoâng nhaát.
12.1. KHAÙI NIEÄM VEÀ CHÖÔNG TRÌNH CON :
    Döôùi ñaây laø chöông trình cuï theå :
    Chöông trình con (subprogram) laø moät ñoaïn chöông trình
    PROGRAM VIDU11_7 ;
coù chöùc naêng giaûi quyeát moät vaán ñeà chuyeân bieät maø
    { Tìm trong ma traän caùc haøng coù nhieàu soá 0 nhaát }
chöông trình chính caàn phaûi thöïc hieän moät soá laàn öùng
    Type
vôùi caùc gía trò khaùc nhau cuûa tham soá.
      Kmang= Array[1..10, 1..10] of Real;
    Chaúng haïn, neáu phaûi tính moät loaït caùc gía trò e1, e2,
    Var
e3, ..., e10 thì ta neân vieát moät chöông trình con coù nhieäm vuï
      A : Kmang;
tính ex vôùi x laø ñoái soá baát kyø vaø ñaët teân laø EXP(x).
      i, j, N, M : Integer;
Moãi khi caàn tính moät trong caùc gía trò e1, e2, ..., e10 , ta chæ
      Dem : Array[1..10] of Integer ;
caàn goïi teân chöông trình con ñoù nhöng thay x baèng moät
      Max : Integer ;
giaù trò cuï theå 1, 2, ...,10. Töông töï nhö theá, khi caàn nhaäp
    Begin
döõ lieäu cho hai ma traän A vaø B, thay vì phaûi vieát hai ñoaïn
      Repeat
chöông trình nhaäp rieâng cho A vaø cho B thì ta chæ caàn vieát
        Write(‘Nhaäp soá haøng N, soá coät M : ‘);
moät chöông trình con coù nhieäm vuï nhaäp döõ lieäu cho moät
        Readln(N, M);
ma traän X baát kyø. Sau ñoù trong chöông trình chính, ñeå
      Until ( N>0) and ( N<11) and ( M>0) and (M<11);
nhaäp döõ lieäu cho A, ta goïi chöông trình con ñoù nhöng thay
      For i:=1 to N do
X baèng A, vaø ñeå nhaäp döõ lieäu cho B, ta goïi chöông trình
      For j:=1 to M do
con ñoù nhöng thay X baèng B. Nhö vaäy moãi chöông trình con
        begin
thay theá ñöôïc cho moät hay nhieàu ñoaïn chöông trình coù
          Write(‘Nhaäp A[‘, i, ‘,’ , j , ‘]: ‘);
baûn chaát gioáng nhau.
          Readln(A[i,j]);
25
    Vieäc söû duïng chöông trình con khoâng chæ coù taùc duïng söû duïng, cho neân khi thaûo chöông, ta thöôøng phaûi töï xaây
laøm cho chöông trình chính bôùt röôøm raø, bôùt daøi doøng döïng theâm caùc haøm môùi.
maø coøn ñaëc bieät coù yù nghóa trong vieäc toå chöùc chöông     Caùc haøm töï vieát caàn phaûi ñöôïc khai baùo, theo cuù
trình. phaùp sau:
    Khi phaûi giaûi quyeát moät baøi toaùn lôùn, ngöôøi ta tìm     Function Teânhaøm(teânthamsoá: kieåuthamsoá) :
caùch chia noù ra thaønh nhieàu baøi toaùn nhoû. Moãi baøi toaùn kieåugíatrò ;
nhoû ñöôïc giaûi quyeát rieâng reõ baèng moät chöông trình con     { Caùc khai baùo duøng trong haøm }
seõ deã daøng hôn khi phaûi kieåm tra loãi vaø kieåm tra thuaät     Const ...
toaùn. Vieäc coøn laïi laø gheùp caùc chöông trình con naøy ñeå     Type ...
taïo thaønh moät chöông trình lôùn, ñoù laø chöông trình chính.     Var ...
Soá leänh trong thaân cuûa chöông trình chính seõ khoâng nhieàu,     Begin
chuû yeáu laø caùc lôøi goïi chöông trình con, vì theá ngöôøi        {Caùc leänh cuûa haøm}
thaûo chöông deã coù ñöôïc moät caùi nhìn toång quan toaøn boä     End;
chöông trình tröôùc khi xem xeùt töøng chöông trình con moät     Teân haøm vaø teân tham soá phaûi ñöôïc ñaët theo ñuùng
caùch chi tieát. Ñieàu naøy töông töï nhö trong daây chuyeàn saûn quy taéc cuûa moät teân. Thoâng thöôøng teân haøm neân ñaët
xuaát coâng nhieäp, ngöôøi ta laép raùp caùc saûn phaåm ( nhö xe sao cho gôïi nhôù gía trò maø noù chöùa. Teân tham soá ôû
maùy, oâ toâ, ti vi, ...) töø caùc phuï tuøng vaø caùc baùn saûn möùc khai baùo naøy chæ mang tính töôïng tröng neân môùi
phaåm ñöôïc cheá taïo saün töø nôi khaùc chuyeån ñeán maø goïi laø tham soá hình thöùc.
khoâng caàn phaûi tìm hieåu xem hoï ñaõ cheá taïo nhö theá naøo.     Neáu coù nhieàu tham soá hình thöùc thuoäc cuøng moät
kieåu döõ lieäu thì chuùng ñöôïc vieát phaân caùch nhau baèng
12.2. HAØM (Function)
daáu phaåy, ví duï:
  12.2.1. Caùc ñaëc tröng cuûa haøm:     Function F(x, y : Integer) :Real;
    Caùc yeáu toá ñaëc tröng cho moät haøm goàm coù: ôû ñaây hai tham soá x vaø y cuøng kieåu Integer.
        -Teân haøm     Neáu caùc tham soá coù kieåu döõ lieäu khaùc nhau thì phaûi
        -Kieåu döõ lieäu cuûa caùc tham soá khai baùo rieâng ra vaø duøng daáu chaám phaåy ñeå phaân
        -Kieåu döõ lieäu cuûa gía trò haøm caùch, ví duï:
    Ví duï :     Function F( x: Integer ; y: Real): Real;
    Haøm Sqrt(x): cho caên hai cuûa x. Teân haøm laø Sqrt, ôû ñaây tham soá x coù kieåu Integer, coøn tham soá y coù kieåu
tham soá x laø nguyeân hay thöïc coøn gía trò haøm kieåu thöïc, Real.
ví duï Sqrt(4)=2.0.     Nhö ñaõ noùi, haøm laø moät chöông trình con neân noù
    Haøm Chr(k): cho kyù töï coù maõ laø k. Teân haøm laø cuõng coù ñaàøy ñuû caùc thaønh phaàn nhö moät chöông trình
Chr, tham soá k kieåu nguyeân coøn gía trò haøm kieåu kyù töï, ví bình thöôøng, töùc laø cuõng coù theå coù khai baùo haèng
duï Chr(65)=‘A’. (Const), khai baùo kieåu döõ lieäu môùi (Type) vaø khai baùo
    Haøm Odd(k): cho True hay False tuøy theo k laø leû hay bieán (Var). Thaân cuûa haøm laø caùc leänh ñöôïïc ñaët giöõa
chaün. Teân haøm laø Odd, tham soá k kieåu nguyeân vaø gía trò hai töø khoùa Begin vaø End , keát thuùc baèng daáu chaám
haøm kieåu loâgicï, ví duï Odd(4)=False. phaåy ";" chöù khoâng phaûi laø daáu chaám.
    Haøm Copy( St, k, n): cho chuoãi con goàm n kyù töï cuûa St     Chuù yù: Trong haøm khoâng coù khai baùo söû duïng thö
tính töø vò trí k. Teân haøm laø Copy, coù ba tham soá laø St vieän chuaån (Uses).
kieåu chuoãi, k vaø n kieåu nguyeân, vaø gía trò haøm kieåu
  12.2.3. Caáu truùc chöông trình Pascal coù haøm töï
chuoãiï, ví duï Copy(‘ABCD’, 2, 3) = ‘BCD’.
vieát:
    Haøm Readkey : khoâng coù tham soá, gía trò haøm kieåu
    Moät chöông trình coù chöùa haøm töï vieát goïi laø chöông
kyù töï, haøm nhaän moät kyù töï ñöôïc goõ töø baøn phím.
trình chính, coøn haøm goïi laø chöông trình con. Khai baùo
    Toùm laïi, haøm coù theå khoâng coù tham soá hoaëc coù moät
haøm töï vieát phaûi ñöôïc ñeå sau phaàn khai baùo bieán VAR
ñeán nhieàu tham soá, nhöng haøm luoân traû veà moät gía trò
vaø tröôùc BEGIN cuûa thaân chöông trình chính.
duy nhaát.
    Toùm laïi caáu truùc cuûa moät chöông trình coù chöùa haøm
    Caùc tham soá luoân luoân phaûi ñeå trong caëp nhaùy ñôn ( ),
töï vieát laø nhö sau:
neáu coù nhieàu tham soá thì chuùng phaûi phaân caùch nhau
    PROGRAM TeânCtchính;
baèng daáu phaåy. Moãi khi goïi haøm (call) ta phaûi cho caùc
    Uses ... { khai baùo duøng thö vieän chuaån}
tham soá caùc gía trò cuï theå phuø hôïp vôùi kieåu döõ lieäu cuûa
    Const ... { khai baùo haèng}
tham soá. Ví duï:
    Type .... { khai baùo kieåu döõ lieäu môùi}
    For k:=1 to 10 do S := S+ Sqrt(k);
    Var .... { khai baùo bieán cuûa ctrình chính}
    y:= 3* Sqr(2) - Sin(pi/4) ;
Function Teânhaøm(teânthamsoá: kieåuthamsoá) : kieåugt;
    Write( Chr(65) );
    { Caùc khai baùo Const, Type, Var duøng trong haøm }
    Caàn phaân bieät hai traïng thaùi cuûa caùc tham soá: traïng
    Begin
thaùi duøng ñeå moâ taû haøm vaø traïng thaùi ñeå goïi haøm. Khi
      {Caùc leänh cuûa haøm}
khai baùo haøm, caùc tham soá chæ mang tính töôïng tröng, neân
    End;
goïi laø tham soá hình thöùc, coøn khi goïi haøm, caùc tham soá
    BEGIN
phaûi laø caùc bieán hay caùc gía trò cuï theå neân goïi laø caùc
      { Caùc leänh cuûa chöông trình chính}
tham soá thöïc söï.
    END.
    Ví duï, khi vieát Sqrt(x) thì x laø tham soá hình thöùc, noù ñaïi
dieän cho moät gía trò naøo ñoù. Coøn khi goïi haøm y:=Sqrt(4);   12.2.4. Kieåu döõ lieäu cuûa tham soá vaø gía trò haøm:
thì 4 laø tham soá thöïc söï.     Kieåu döõ lieäu cuûa keát quûa cuûa haøm khoâng theå laø
  12.2.2. Khai baùo haøm töï vieát: maûng (array), baûn ghi (record), taäp hôïp (set) hay taäp tin
    Taát caû caùc haøm coù saün trong Turbo Pascal goïi laø caùc (file).
haøm chuaån, chuùng coù theå ñöôïc söû duïng maø khoâng caàn     Khai baùo haøm nhö döôùi ñaây laø sai:
phaûi khai baùo. Tuy nhieân soá löôïng caùc haøm chuaån     Function F( x: Integer) : array[1..10] of Real;
thöôøng khoâng ñaùp öùng ñöôïc yeâu caàu ña daïng cuûa ngöôøi
26
    Kieåu döõ lieäu cuûa keát quûa cuûa haøm coù theå laø caùc       N, i : integer;
kieåu ñôn giaûn, chuoãi, hay con troû. Neáu laø kieåu lieät keâ,     FUNCTION Canba( z: Real) :Real;
ñoaïn con hay chuoãi (tröø kieåu String) thìø phaûi ñònh nghóa     { Haøm tính caên baäc ba cuûa z}
tröôùc thoâng qua töø khoùa Type.     Var
    Ví duï, caùc khai baùo nhö sau laø sai:       F: Real;
    Function F( x: Real) : String[20];     Begin
    Function F( x: Real) : 1..31;       If z=0 then F:= 0;
    Maø phaûi ñònh nghóa kieåu tröôùc :       If z>0 then F:= exp( 1/3*Ln(z) );
    Type       If z<0 then F:= - exp( 1/3*Ln(-z) );
      Str20= String[20];       Canba:=F ;
      Ngay = 1..31;     End;
roài môùi khai baùo:     BEGIN { vaøo chöông trình chính}
    Function F( x: Real) : Str20;       Repeat
    Function F( x: Real) : Ngay;         Write(‘ nhap N: ‘);
    Tuy nhieân, vôùi kieåu String thì khai baùo sau laø ñuùng:         Readln(N);
    Function F( x: Real) : String;       Until ( N>0) and ( N<21);
    Kieåu döõ lieäu cuûa tham soá trong haøm vaø thuû tuïc thì       S:=0;
khoâng haïn cheá. Nhöng neáu laø kieåu chuoãi (tröø kieåu String)       For i:=1 to N do
hay kieåu töï xaây döïng thìø phaûi ñöôïc ñònh nghóa tröôùc         begin
baèng töø khoùa Type.           Write(‘nhap x[‘, i, ‘]:’);
    Ví duï, khai baùo sau laø sai:           Readln(x[i]);
            Function F( x : array[1..10] of Real) : Integer ;           S:=S + Canba( x[i] );
            Function F( St : String[20]) : Char ;         end;
    Maø phaûi ñònh nghóa kieåu tröôùc :       Writeln(‘ S= ‘, S:8:2);
    Type       Readln;
      Kmang =Array[1..10] of Real;     END.
      Kstr20= String[20];     Chaïy <VD12_1.EXE>
roài môùi khai baùo:     Cheùp taäp tin nguoàn <VD12_1.PAS>
    Function F( x : Kmang) : Integer ;     Ví duï 12.2: Nhaäp chuoãi St, ñoåi taát caû caùc kyù töï
    Function F( St : Kstr20) : Char ; cuûa chuoãi thaønh chöõ thöôøng, chaúng haïn St=‘ABcdE2’ thì
    Tuy nhieân, vôùi kieåu String thì khai baùo sau laø ñuùng: ñoåi thaønh ‘abcde2’.
    Function F( St : String) : Boolean ;     Giaû söû ñaõ coù haøm Chuthuong(ch) ñoåi kyù töï ch töø
  12.2.5. Caùc ví duï : chöõ hoa ra chöõ thöôøng, ví duï Chuthuong(‘A’)=‘a’, khi ñoù
     Ví duï 12.1: Nhaäp daõy caùc soá thöïc x1, x2, ..., xn, tính ñeå ñoåi taát caû caùc kyù töï cuûa chuoãi St ra chöõ thöôøng ta
toång : duøng leänh:
    For i:=1 to Length(St) do St[i]:= Chuthuong(St[i]);
                         Nhö vaäy, ta phaûi vieát haøm Chuthuong(ch) coù tham soá
    Phaân tích: Giaû söû ñaõ coù haøm Canba(z) tính caên baäc ba ch kieåu kyù töï vaø gía trò haøm cuõng kieåu kyù töï, vaø ñaët
cuûa z, töùc laø : khai baùo haøm naøy vaøo ngay tröôùc phaàn thaân cuûa
chöông trình chính, nhö sau:
                           PROGRAM VIDU12_2;
khi ñoù, toång S ñöôïc tính nhö sau:     Var
    S:=0;       St : String;
    For i:=1 to N do S:=S + Canba( x[i] );       N, i : integer;
    ÔÛ ñaây haøm Canba ñöôïc tính N laàn öùng vôùi caùc tham     FUNCTION Chuthuong( ch: Char):Char;
soá thöïc söï laø caùc gía trò x[i], i=1,..., N.     { Haøm ñoåi chöõ hoa ra chöõ thöôøng}
    Vaán ñeà coøn laïi laø phaûi vieát haøm tính caên ba cuûa z.     Var
Haøm naøy coù teân laø Canba, tham soá z kieåu thöïc, vaø gía trò       C: Char;
haøm cuõng kieåu thöïc, noù ñöôïc xaây döïng nhö sau:     Begin
    FUNCTION Canba( z: Real) :Real;       If ( ch>=‘A’ ) and ( ch<=‘Z’) then C:=Chr( ord(ch)+32 )
    { Haøm tính caên baäc ba cuûa z}       else
    Var         C:=ch;
      F: Real;       Chuthuong:=C;
    Begin     End;
      If z=0 then F:= 0;     BEGIN { vaøo chöông trình chính}
      If z>0 then F:= exp( 1/3*Ln(z) );       Write(‘ Nhaäp chuoãi chöõ hoa St : ‘);
      If z<0 then F:= - exp( 1/3*Ln(-z) );       Readln(St);
      Canba:=F ;       N:=Length(St);
    End;       For i:=1 to N do St[i]:=Chuthuong( St[i] );
    Ñaët ñoaïn khai baùo haøm treân ñaây vaøo ngay tröôùc phaàn       Writeln(‘ St = ‘, St);
thaân cuûa chöông trình chính, ta ñöôïc chöông trình ñaày ñuû sau       Readln;
ñaây:     END.
    PROGRAM VID12_1;     Chaïy<VD12_2.EXE>
    Var     Cheùp taäp tin nguoàn <VD12_2.PAS>
      x : Array[1..20] of Real;     Ví duï 12.3: Nhaäp soá N nguyeân döông vaø soá thöïc x
      S : Real; baát kyø, tính:
27
    Ta vieát : tröôùc khi keát thuùc haøm. ÔÛ ví duï 12.1, trong haøm Canba
    Vaäy vieäc tính S ñöôïc quy veà vieäc tính caùc soá haïng Ui ta duøng bieán F ñeå tính gía trò haøm, sau cuøng môùi gaùn
roài thöïc hieän pheùp coäng doàn Ui vaøo S. Canba:=F; tröôùc khi keát thuùc haøm.
    Ñeå tính Ui ta nhaän thaáy töû soá (x+i)i coù daïng toång quaùt     Veà phong caùch laäp trình, trong haøm neân traùnh duøng
laø zk coøn maãu soá (2i-1)! coù daïng toång quaùt laø k! . Thaønh caùc leänh nhaäp hay in döõ lieäu (Readln, Write). Caùc tham
ra, neáu ñaõ coù hai haøm : soá hình thöùc chính laø caùc döõ lieäu phuïc vuï cho caùc tính
      *  Haøm Lt(z, k) tính zk, töùc laø Lt(z, k)=zk toaùn trong haøm, chuùng seõ coù gía trò cuï theå khi goïi haøm.
      * Haøm Gt(k) tính k!, töùc laø Gt(k)=k! Vieäc nhaäp döõ lieäu hay in keát quûa thöôøng ñeå trong thaân
thì vieäc tính S ñöôïc thöïc hieän baèng caùc leänh: chöông trình chính.
    S:= Lt(Pi, 2)/4;     Coù hai loaïi chöông trình con laø haøm vaø thuû tuïc. Söï
    For i:=1 to N do S :=S + Lt(x+i, i)/Gt(2*i -1); khaùc nhau cô baûn cuûa haøm vaø thuû tuïc laø ôû choã: haøm
    Trong leänh gaùn ñaàu tieân, haøm Lt(z, k) ñöôïc tính öùng luoân luoân traû veà moät gía trò duy nhaát thoâng qua teân
vôùi caùc tham soá thaät laø z=Pi vaø k=2. haøm vaø do ñoù coù theå söû duïng haøm nhö söû duïng moät
    Trong leänh For, taïi moãi böôùc laëp ta coù i laø moät soá xaùc bieåu thöùc, coøn thuû tuïc thì khoâng traû veà giaù trò naøo qua
ñònh, vaø haøm Lt(z, k) ñöôïc tính öùng vôùi caùc tham soá thaät teân thuû tuïc vaø noù ñöôïc söû duïng nhö moät leänh ñôn
laø z=x+i vaø k=i. Töông töï, haøm Gt(k) ñöôïc tính öùng vôùi giaûn.
k=2*i-1.
    Döôùi ñaây laø chöông trình cuï theå : 12.3. THUÛ TUÏC (Procedure)
    PROGRAM VIDU12_3;   12.3.1. Thuûû tuïc vaø caùch khai baùo:
    Var     Gioáng nhö haøm, thuû tuïc cuõng laø moät chöông trình con,
      S, x : Real; song thuû tuïc khaùc haøm ôû choã: neáu nhö haøm luoân traû
      N, i : Integer ; veà moät gía trò duy nhaát thoâng qua teân haøm thì thuû tuïc
    Function Lt(z : Real ; k: Byte) : Real ; laïi khoâng traû veàø moät gía trò naøo thoâng qua teân goïi
    { haøm tính Lt=zk } cuûa noù.
    Var     Moät thuû tuïc thöïc chaát laø moät nhoùm caùc leänh ñöôïc
      j : Byte; saép xeáp theo moät trình töï nhaát ñònh coù taùc duïng giaûi
      Q: Real; quyeát moät nhieäm vuï cuï theå, vaø ñöôïc ñaët moät caùi teân
    Begin ñeå goïi. Trong ñôøi soáng haøng ngaøy, ta thöôøng nghe noùi
      Q:=1; ñeán thuû tuïc nhaäp hoïc cuûa sinh vieân, thuû tuïc mua baùn
      For j:=1 to k do Q:=Q*z; nhaø ñaát, thuû tuïc xuaát caûnh, thuû tuïc nhaäp caûnh,.v.v.
      Lt:=Q; moãi thuû tuïc ñoù laø moät daõy coù trình töï caùc coâng vieäc
    End; phaûi laøm.
    Function Gt( k: Byte) : Real;     Thuû tuïc Readln(x, y, z) coù nhieäm vuï nhaäp caùc gía trò
    { haøm tính Gt= k!} töø baøn phím cho caùc bieán x, y, z. Thuû tuïc Write(x, y, z) in
    Var gía trò cuûa x, y, z . Thuû tuïc Gotoxy(x, y) ñònh vò con troû
      i : Byte; vaøo toaï ñoä coät x, doøng y treân maøn hình. Thuû tuïc Clrscr
      Q: Real; thì chæ ñôn giaûn laø xoùa maøn hình .v.v. . Nhö vaäy thuû tuïc
    Begin coù theå khoâng coù tham soá hoaëc coù töø moät ñeán nhieàøu
      Q:=1; tham soá.
      For i:=1 to k do Q:=Q* i;     Khi goïi thöïc hieän moät thuû tuïc, ta vieát teân thuû tuïc ñoù
      Gt:=Q; vaø thay caùc tham soá hình thöùc baèng caùc tham soá thöïc
    End; söï, keát thuùc baèng daáu chaám phaåy ";" .
    BEGIN { Chöông trình chính }     Ví duï, neáu a, b laø hai bieán ñaõ ñöôïc khai baùo trong
      Repeat chöông trình thì ñeå nhaäp döõ lieäu cho hai bieán a, b ta vieát :
        Write(‘ Nhaäp N vaø x :’);             Readln(a, b);
        Readln(N, x);     Ñeå in bieåu thöùc 4+5*6 leân maøn hình, ta vieát :
      Until ( N>0);             Write(4+5*6);
      S:= Lt(Pi, 2)/4;     Ñeå ñaët con troû vaøo vò trí coät 8, doøng 2 treân maøn hình
      For i:=1 to N do S:= S + Lt(x+i, i)/Gt(2*i -1); ta vieát:
      Writeln(‘S= ‘, S:10:4);             Gotoxy(8, 2);
      Readln;     Nhö vaäy, lôøi goïi thuû tuïc laø moät leänh ñôn giaûn.
    END.     Do thuû tuïc khoâng traû veà gía trò naøo thoâng qua teân goïi
    Chaïy<VD12_3.EXE> cuûa noù neân teân thuû tuïc khoâng theå ñöùng trong caùc
    Cheùp taäp tin nguoàn <VD12_3.PAS> bieåu thöùc. Ví duï caùc leänh sau laø sai cuù phaùp:
  12.2.6. Caùc chuù yù khi vieát haøm:             St1 := Delete( St, 1, 1);
            Write( Val(‘123’, x, k) );
    Ta choïn chöông trình con laø haøm khi caàn nhaän laïi moät
vì Delete vaø Val laø hai thuû tuïc chöù khoâng phaûi laø hai
gía trò duy nhaát thoâng qua teân haøm, nhôø ñoù coù theå duøng
haøm.
teân haøm trong caùc bieåu thöùc. Ví duï, vì Gt(4) laø moät gía trò
    Ngoaøi caùc thuû tuïc chuaån ñaõ coù saün trong Turbo
neân ta coù theå vieát :
Pascal, ngöôøi thaûo chöông coù theå töï xaây döïng caùc thuû
    k:= Gt(4) - 1 ;
tuïc môùi nhöng phaûi khai baùo theo cuù phaùp sau:
    Write( ‘ Giai thöøa cuûa 4 laø ‘, Gt(4) );
Procedure Teânthuûtuïc( teânthamsoá : kieåuthamsoá ) ;
    Vì teân haøm chöùa gía trò haøm neân trong thaân cuûa      { Caùc khai baùo Const, Type, Var duøng trong thuû
haøm phaûi coù ít nhaát moät leänh gaùn : tuïc }
            TeânHaøm:= Bieåuthöùc ;     Begin
    Thoâng thöôøng ta duøng moät bieán trung gian ñeå tính gía trò      {Caùc leänh cuûa thuû tuïc }
haøm , xong xuoâi môùi gaùn bieán trung gian ñoù cho teân haøm     End;
28
    Ñoaïn khai baùo treân phaûi ñöôïc ñaët sau phaàøn khai baùo     PROGRAM VIDU12_5;
VAR vaø tröôùc BEGIN cuûa thaân chöông trình chính.     { Saép xeáp daõy A taêng daàn baèng thuû tuïc }
  12.3.2. Caùc ví duï veà thuûû tuïc :     Uses CRT;
      Ví duï 12.4: Giaûi vaø bieän luaän phöông trình ax+b= 0     Type
vôùi a=4.5, b=13.5, vaø vôùi caùc caëp a, b taïo bôûi a=-1, a=0,       Kmang = Array[1..20] of Real;
a=1, b=0, b=1, b=2.     Var
    Ta vieát moät thuû tuïc coù nhieäm vuï giaûi vaø bieän luaän       N : Integer;
phöông trình ax+b=0 vôùi hai tham soá a, b tuøy yù, vaø goïi thöïc       A: Kmang;
hieän thuû tuïc naøy 10 laàn öùng vôùi caùc gía trò cuï theå cuûa     Procedure Nhap(Var X: Kmang ; N: Integer ; ten: Char );
a, b cho trong gæa thieát.       Var
    PROGRAM VIDU12_4;         i : Integer;
    { Giaûi phöông trình AX+B=0 baèng thuû tuïc}       Begin
    Uses Crt;         For i:=1 to N do { nhaäp maûng X }
    Var           begin
      i, j: integer;             Write(‘Nhaäp ‘, ten , ‘[‘ , i , ‘]: ‘);
    Procedure Giaipt (a, b: Real);             Readln(X[i]);
    Begin           end;
      Writeln(' -Giaûi phöông trình : ' , a:4:1, 'x+' , b:4:1, '=0');       End;
      If a<>0 then Writeln(' Nghiem x=', -b/a:4:2)     Procedure SapTang( Var X : Kmang ; N: Integer);
      else       { Saép daõy X taêng}
        if b<>0 then Writeln(' Vo nghiem')       Var
        else         i, j : Integer;
          Writeln(' Vo so nghiem');       Procedure Doicho(Var u, v : Real) ;
    End;         { hoaùn vò caùc gía trò cuûa u vaø v}
    BEGIN { Thaân chöông trình chính }         Var
      Clrscr;           Tam: Real;
      Writeln(' KEÁT QUÛA GIAÛI CAÙC P.TRÌNH:' ) ;         Begin
      Giaipt (4.5, 13.5);           Tam:=u; u:=v; v:=Tam;
      For i:=-1 to 1 do         End; { Heát Doicho }
      For j:=0 to 2 do Giaipt (i, j);     Begin { Vaøo Saptang }
      Readln;       For i:=1 to N-1 do
    END.       For j:=i+1 to N do
    Chaïy<VD12_4.EXE>         If X[i]>X[j] then Doicho(X[i], X[j]) ;
    Cheùp taäp tin nguoàn <VD12_4.PAS>     End; { Het Saptang }
    Khi goïi Giaipt (4.5, 13.5); laø ta yeâu caàu maùy thöïc hieän     Procedure Inday( Chugiai: String ; X: Kmang ; N:
thuû tuïc Giaipt vôùi tham soá a=4.5 vaø b=13.5. Hai voøng laëp Integer);
For xaùc ñònh 9 caëp gía trò i, j cuï theå, vaø cöù moãi laàn nhö       { In daõy X leân maøn hình }
vaäy laïi goïi thöïc hieän thuû tuïc Giaipt vôùi tham soá a=i, b=j       Var
töông öùng :         i : Integer;
    For i:=-1 to 1 do       Begin
    For j:=0 to 2 do Giaipt (i, j);         Writeln(Chugiai);
    Do taùch rieâng vieäc giaûi phöông trình ax+b=0 thaønh moät         For i:=1 to N do write(X[i]:5:1);
thuû tuïc neân soá leänh trong thaân chöông trình chính giaûm ñi,         writeln;
noåi baät ñöôïc thuaät toaùn chính cuûa chöông trình.       End;
    ÔÛ ñaây, ta choïn chöông trình con Giaipt laø thuû tuïc chöù     BEGIN { chöông trình chính }
khoâng phaûi laø haøm vì phöông trình ax+b=0 coù theå voâ       Clrscr;
nghieäm hoaëc voâ soá nghieäm (khi a=0). Thaønh ra ta khoâng       Repeat
tìm ñöôïc moät gía trò thích hôïp ñeå gaùn cho teân haøm. Vaäy         Write(‘ Nhaäp soá phaàn töû N : ‘);
keát quûa giaûi phöông trình phaûi xuaát ra ngay trong chöông         Readln(N);
trình con, ñoù laø coâng vieäc cuûa thuû tuïc.       Until (N>0) and ( N<21);
     Ví duï 12.5: Nhaäp vaøo moät maûng A1, A2,...,An, saép xeáp       Nhap( A, N, ‘A’ );
daõy taêng roài in daõy leân maøn hình.       Inday( ‘ Daõy chöa saép laø: ‘, A, N);
    Coù theå chia baøi toaùn ra thaønh ba coâng vieäc lôùn sau:       SapTang( A, N);
    a-Nhaäp daõy A1, A2,...,An,       Inday( ‘ Daõy ñaõ saép taêng laø: ‘ , A, N);
    b-Saép xeáp daõy A1, A2,...,An, taêng       Readln;
    c-In daõy A1, A2,...,An, leân maøn hình     END.
    Moãi coâng vieäc a, b, c thuoäc veà moät laõnh vöïc rieâng       Chaïy<VD12_5.EXE>
neân coù theå xaây döïng thaønh caùc thuû tuïc ñoäc laäp vôùi      Cheùp taäp tin nguoàn <VD12_5.PAS>
nhau. Ñeå lieân keát chuùng laïi, trong chöông trình chính, ta chæ     Thuû tuïc Nhap coù ba tham soá hình thöùc laø X, N vaø ten,
caàn goïi teân caùc thuû tuïc naøy theo thöù töï a, b, c vôùi caùc nhieäm vuï cuûa noù laø nhaäp döõ lieäu cho maûng X goàm N
tham soá thích hôïp. phaàn töû. Töông töï, thuû tuïc Saptang coù nhieäm vuï saép
    Khi thieát keá thuû tuïc saép xeáp daõy taêng, coù moät vieäc xeáp N phaàn töû cuûa daõy X thaønh daõy taêng. Thuû tuïc
phaûi laøm nhieàu laàn laø ñoåi choã hai phaàn töû A[i] vaø A[j] Inday seõ in N phaàn töû cuûa daõy X sau khi ñaõ in lôøi giaûi
neân cuõng coù theå xaây döïng thaønh moät thuû tuïc goïi teân thích chöùa trong tham soá chugiai .
laø Ñoåi choã, noù laïi laø chöông trình con cuûa thuû tuïc saép
xeáp. Chöông trình cuï theå nhö sau:
29
    Thuû tuïc Saptang chöùa moät thuû tuïc con laø Doicho, coù ñoåi cuûa chính bieán a, töông töï, moïi thay ñoåi cuûa tham soá
nhieäm vuï hoaùn vò caùc gía trò cuûa hai bieán u, v baát kyø. v ñeàu laø thay ñoåi cuûa chính bieán b. Keát quûa laø tröôùc
Doicho laø chöông trình con cuûa thuû tuïc Saptang. khi goïi thuû tuïc Doicho(a,b) thì a=3, b=4, sau khi thöïc hieän
    Khi moät tham soá ñöôïïc khai baùo trong chöông trình con, thuû tuïc xong thì a=4, b=3.
noù coù theå coù hoaëc khoâng coù töø khoùa Var ôû ñaèng     Vaäy, caùc bieán ñöôïc truyeàn vaøo chöông trình con döôùi
tröôùc. Ví duï trong thuû tuïc Saptang, tham soá X ñi sau töø daïng tham soá bieán thì seõ thay ñoåi theo tham soá bieán hình
khoùa Var, coøn tham soá N thì khoâng. X goïi laø tham soá thöùc töông öùng trong chöông trình con.
bieán coøn N goïi laø tham soá trò. Söï khaùc nhau giöõa hai loaïi     Thoâng thöôøng, ta duøng tham soá bieán khi muoán nhaän
tham soá naøy seõ ñöôïc trình baøy kyõ ôû phaàn sau. laïi moät gía trò môùi sau khi thöïc hieän chöông trình con.
    Baây giôø ta hieåu taïi sao trong thuû tuïc Saptang thì N laø
13.1. THAM SOÁ TRÒ VAØ THAM SOÁ BIEÁN:
tham soá trò coøn X laø tham soá bieán:
    Trong khai baùo ôû ñaàu cuûa chöông trình con, caùc tham soá
            Procedure SapTang( Var X : Kmang ; N: Integer);
hình thöùc coù töø khoùa Var ñöùng tröôùc goïi laø tham soá
    N laø soá phaàn töû cuûa maûng X thì khoâng caàn thay ñoåi,
bieán, ngöôïc laïi, neáu khoâng coù töø khoùa Var ñi tröôùc thì
coøn maûng X thì laïi caàn thay ñoåi ñeå trôû thaønh moät daõy
goïi laø tham soá trò.
taêng. Neáu ta boû töø khoùa Var tröôùc X ñi, töùc laø:
    Ví duï, trong khai baùo haøm tính luõy thöøa zk, ta vieát :
            Procedure SapTang( X : Kmang ; N: Integer);
            Function Lt(z : Real ; k: Byte) : Real;
thì leänh :
thì z vaø k ñeàu laø caùc tham soá trò hình thöùc .
            Saptang(A, N);
    Coøn theo khai baùo cuûa thuû tuïc Doicho :
seõ khoâng laøm thay ñoåi daõy A.
            Procedure Doicho(Var u, v : Real) ;
    Thöïc chaát cuûa söï truyeàn tham soá ñoái vôùi caùc tham
thì u vaø v ñeàu laø caùc tham soá bieán hình thöùc.
soá bieán laø söï truyeàn ñòa chæ. Chöông trình con seõ duøng
  13.1.1. Tham soá trò : caùc oâ nhôù cuûa chính caùc bieán ñöôïïc truyeàn vaøo döôùi
    Tham soá trò hình thöùc ñöôïc caáp moät oâ nhôù rieâng khi daïng tham soá bieán.
chöông trình con ñöôïc goïi vaø bò xoùa boû khi chöông trình con      Ví duï 13.1: Trong chöông trình döôùi ñaây, thuû tuïc TT
chaïy xong. Noù ñöôïc coi nhö moät bieán ñòa phöông, nhaän gía coù hai tham soá a vaø b : a laø tham soá trò coøn b laø tham soá
trò ban ñaàu laø tham soá thöïc söï ñöôïc chuyeån ñeán töø bieán. Haõy xem söï thay ñoåi gía trò cuûa hai bieán x, y cuûa
chöông trình chính qua lôøi goïi chöông trình con. Sau ñoù chöông trình chính tröôùc vaø sau khi goïi thuû tuïc TT:
chöông trình con coù theå thay ñoåi giaù trò cuûa tham soá trò     PROGRAM VIDU13_1;
hình thöùc ôû beân trong chöông trình con, song ñieàu ñoù khoâng     Var
laøm thay ñoåi gía trò cuûa tham soá thöïc söï.       x, y: Integer;
    Trong lôøi goïi chöông trình con caùc tham soá trò thöïc söï     PROCEDURE TT( a : integer ; Var b : integer);
coù theå laø bieán, haèøng hay bieåu thöùc.       Begin
    Ví duï, muoán tính S= 43, ta vieát :         a:=a+6;
            S:= Lt(4, 3);         b:=b+8;
hoaëc :         Writeln(‘a= ’, a);
            x:=4;         Writeln(‘b= ’, b);
            S:= Lt(x, 2+1);       End;
trong ñoù x laø bieán kieåu thöïc .     BEGIN
    Caùch thöùc hoaït ñoäng cuûa leänh S:= Lt(x, 2+1); laø nhö       x:=4;
sau:       y:=7;
    Ñaàu tieân caùc tham soá hình thöùc z vaø k seõ ñöôïc khôûi       TT(x,y);         {14}
taïo giaù trò ban ñaàu z:=x; vaø k:=2+1; keát quûa laø z=4 vaø       Writeln(‘x= ’, x); {15}
k=3.       Writeln(‘y= ’, y); {16}
    Keá ñoù caùc leänh trong haøm Lt seõ tính toaùn zk vaø gaùn       Readln;
keát quûa cho teân haøm, neân Lt=43. Gía trò naøy ñöôïc gaùn     END.
tieáp cho S.     Chaïy<VD13_1.EXE>   
    Tröôùc vaø sau khi thöïc hieän chöông trình con, gía trò cuûa      Cheùp taäp tin nguoàn <VD13_1.PAS>
tham soá thöïc söï x khoâng heà bò thay ñoåi, x vaãn coù gía trò     Tröôùc khi goïi thuû tuïc TT thì x=4, y=7.
laø 4.     Khi goïi thuû tuïc TT(x, y); thì caùc tham soá hình thöùc a, b
    Vaäy, caùc bieán ñöôïc truyeàn vaøo chöông trình con döôùi ñöôïc gaùn a:=x; b:=y; neân a=4, vaø b=7. Caùc leänh trong thuû
daïng tham soá trò thì khoâng bò thay ñoåi. Noùi caùch khaùc, tuïc a:=a+6; vaø b:=b+8; seõ laøm thay ñoåi caùc tham soá a vaø
moïi söï thay ñoåi cuûa tham soá trò hình thöùc trong chöông b : a=10, b=15, vaø do ñoù hai leänh:
trình con khoâng laøm thay ñoåi gía trò cuûa tham soá thöïc söï     Writeln(‘a= ’, a); seõ in ra a = 10
töông öùng ñöôïc truyeàn vaøo töø chöông trình chính.     Writeln(‘b= ’, b); seõ in ra b = 15
  13.1.2. Tham soá bieán :     Thöïc hieän xong thuû thuïc TT, maùy trôû laïi chöông trình
    Trong lôøi goïi chöông trình con caùc tham soá bieán thöïc söï chính laøm tieáp caùc leänh {15} vaø {16} :
chæ coù theå laø bieán, khoâng theå laø haèøng hay bieåu thöùc.     Writeln(‘x= ’, x); seõ in ra x = 4
    Ví duï, caùc leänh sau ñaây laø sai :     Writeln(‘y= ’, y); seõ in ra y =15
            Doicho(3, 4); { Sai vì 3 vaø 4 laø caùc haèng}     Nhö vaäy, x ñöôïc truyeàn vaøo chöông trình con thoâng qua
            Doicho(a+1, b); { Sai vì a+1 laø moät bieåu thöùc} tham soá trò a neân moïi söï thay ñoåi cuûa a trong chöông trình
    Giaû söû trong chöông trình chính coù hai bieán thöïc a, b coù con ñeàu khoâng aûnh höôûng gì ñeán x. Ngöôïc laïi, bieán y
gía trò a=4 vaø b=3. Ñeå hoaùn ñoåi gía trò cuûa a vaø b ta duøng ñöôïc truyeàn vaøo chöông trình con thoâng qua tham soá bieán
leänh: b neân moïi söï thay ñoåi cuûa b trong thuû tuïc TT ñeàu keùo
            Doicho(a, b); bieán y thay ñoåi theo.
    Vì u vaø v laø caùc tham soá bieán hình thöùc neân chöông     Tính chaát treân ñaây cuûa tham soá bieán cho pheùp khai
trình con seõ ñoàng nhaát u vôùi a vaø ñoàng nhaát v vôùi b. Moïi thaùc theâm caùc khaû naêng cuûa thuû tuïc vaø haøm. Ta bieát
thay ñoåi cuûa tham soá u trong chöông trình con ñeàu laø thay
30
thuû tuïc khoâng traû veà gía trò naøo thoâng qua teân noù, coøn hieän leänh {12} gaùn x:=10; doøng {13} goïi TTUC1 vaø ñieàu
haøm thì traû veà moät gía trò duy nhaát qua teân haøm. Song khieån chuyeån ñeán doøng {4}. Caùc doøng {5} {6} caáp oâ
moät chöông trình con hoaøn toaøn coù theå traû veà hai hay nhôù cho bieán y ñòa phöông, doøng {8} gaùn y:=x+5; neân
nhieàu gía trò thoâng qua caùc tham soá bieán, nhö ví duï 13.2. y=15 vaø doøng {9} in gía trò 15 cuûa y. Ñeán ñaây, TTUC1
    Ví duï 13.2: Chöông trình sau nhaäp vaøo hai caïnh a, b cuûa keát thuùc vaø bieán y bò xoùa khoûi boä nhôù, ñieàu khieån
hình chöõ nhaät vaø söû duïng moät thuû tuïc ñeå tính caû dieän ñöôïc traû veà cho leänh {14} trong chöông trình chính, nhöng
tích vaø chu vi. vì y ñaõ bò xoùa neân khoâng theå in ñöôïc, vaø maùy seõ baùo
    PROGRAM  VIDU13_2; loãi.
    { Tính dieän tích S vaø chu vi L cuûa HCN theo 2 caïnh a,   13.2.2. Phaïm vi taùc duïng cuûa caùc khai baùo :
b}    
    Var                         Hình 13.1
      a,b, S, L: Real;     Phaïm vi taùc duïng hay taàm taùc duïng cuûa bieán (hay
      Procedure TINH( c1, c2 : Real ; Var DT, CV : Real); haèng, kieåu döõ lieäu, chöông trình con) laø khu vöïc maø
      { Tính dieän tích DT vaø chu vi CV theo hai caïnh c1 vaø trong ñoù noù coù theå söû duïng ñöôïc, ngoaøi khu vöïc ñoù
c2} noù bò xem laø chöa khai baùo.
        Begin     Ñeå dieãn taû phaïm vi taùc duïng cuûa bieán noùi rieâng,
          DT:=c1*c2; cuûa caùc khai baùo noùi chung, keå caû khai baùo chöông trình
          CV:=2*(c1+ c2); con, ta ñöa ra khaùi nieäm goïi laø möùc: möùc 0 laø chöông
        End; trình chính, möùc 1 laø caùc chöông trình con cuûa chöông trình
    BEGIN chính, möùc 2 laø caùc chöông trình con cuûa caùc chöông trình
      Write(‘ Nhaäp hai caïnh a, b: ‘); con möùc 1, .v.v.
      Readln(a,b);     Hình veõ 13.1 moâ taû moät chöông trình coù hai chöông
      TINH(a, b, S, L);       {12} trình con A vaø B ôû möùc 1, trong chöông trình con A laïi coù
      Writeln(‘Dien tích= ’, S:4:1); hai chöông trình con A1 vaø A2 ôû möùc 2.
      Writeln(‘Chu vi = ’, L:4:1);     Vieäc xaùc ñònh phaïm vi taùc duïng cuûa caùc bieán (hay
      Readln; haèng, kieåu döõ lieäu, chöông trình con) döïa treân caùc
    END. nguyeân taéc sau:
    Chaïy <VD13_2.EXE>     -Caùc bieán ñöôïc khai baùo ôû möùc 0 (chöông trình chính)
     Cheùp taäp tin nguoàn <VD13_2.PAS> coù phaïm vi taùc duïng laø toaøn boä chöông trình .
    Vì thuû tuïc TINH caàn phaûi traû veà hai gía trò dieän tích vaø     -Caùc bieán ñöôïc khai baùo ôû möùc naøo seõ coù phaïm vi
chu vi neân ta khai baùo hai tham soá bieán laø DT vaø CV. Trong laø vuøng giôùi haïn möùc ñoù, keå caû caùc möùc cao hôn
chöông trình chính, ta khai baùo hai bieán töông öùng laø S vaø L. naèm trong möùc naøy.
Sau khi nhaäp hai caïnh a, b vaø goïi thuû tuïc :     Ví duï: caùc bieán ñöôïc khai baùo trong thuû tuïc A seõ
    TINH(a, b, S, L);   {12} duøng ñöôïc trong thuû tuïc A, A1 vaø A2, nhöng khoâng duøng
thì c1:=a; c2:=b; bieán S ñoàng nhaát vôùi DT, bieán L ñoàng ñöôïc trong chöông trình chính vaø trong thuû tuïc B. Caùc bieán
nhaát vôùi CV. Thaønh ra, khi tính dieän tích DT vaø chu vi CV ñöôïc khai baùo trong thuû tuïc B seõ duøng ñöôïc trong thuû
thì S vaø L cuõng ñöôïc tính ( S=DT, L=CV ). Khi thöïc hieän tuïc B nhöng khoâng duøng ñöôïc trong chöông trình chính vaø
xong thuû tuïc TINH, caùc tham soá c1, c2, DT, CV khoâng toàn trong caùc thuû tuïc A, A1 vaø A2.
taïi trong boä nhôù nöõa, song hai bieán S vaø L vaãn coøn toàn     -Coù theå khai baùo hai (hay nhieàu) bieán truøng teân ôû
taïi cho ñeán khi keát thuùc chöông trình. Vì theá, trong chöông caùc möùc khaùc nhau nhöng chuùng vaãn laø hai bieán khaùc
trình chính, ta in S vaø L, chöù khoâng in DT vaø CV.laø ba oâ nhau coù phaïm vi taùc duïng khaùc nhau.
nhôù khaùc nhau, coù phaïm vi taùc duïng khaùc nhau.     Neáu hai bieán truøng teân laïi naèm trong hai möùc coù
     Ví duïï 13.3 : Xeùt chöông trình döôùi ñaây : phaïm vi bao truøm nhau thì bieán ôû möùc thaáp hôn seõ taïm
    Program VIDU13_3;   {1} bò che khuaát khi laøm vieäc ôû möùc cao hôn.
    Var                  {2}     Ví duï : Neáu chöông trình chính vaø thuû tuïc B coù khai
      x: Integer;          {3} baùo hai bieán truøng teân laø x, thì trong thuû tuïc B chæ coù
      Procedure TTUC1;  {4} bieán x ñòa phöông cuûa B laø coù taùc duïng, coøn bieán x
        Var              {5} cuûa chöông trình chính taïm thôøi bò che ñi. Ra khoûi thuû tuïc
          y: Integer;      {6} B, bieán x ñòa phöông cuûa B bò xoùa vaø bieán x toaøn cuïc
        Begin             {7} hoaït ñoäng laïi bình thöôøng.
          y:=x+5;         {8}      Ví duï 13.4: Xeùt chöông trình sau:
          Writeln(y);     {9}     Program VIDU13_4; {1}
        End;             {10} { heát TTUC1 }     Var                {2}
    BEGIN               {11}       x: Integer;        {3}
      x:=10;              {12}       Procedure B;      {4}
      TTUC1;             {13}         Var            {5}
      Writeln(y);         {14} { leänh naøy bò loãi}           x: Integer;    {6}
      Readln;             {15}         Begin          {7}
    END.                 {16}           x:=5;         {8}
    Chöông trình goàm 16 doøng ñöôïc ñaùnh soá töø {1} ñeán           Writeln(x);   {9}
{16}.         End;           {10}
    Bieán x laø toaøn cuïc neân coù phaïm vi taùc duïng töø doøng     BEGIN            {11}
{3} ñeán doøng {16}. Bieán y laø bieán ñòa phöông cuûa TTUC1       x:=10;            {12}
neân coù phaïm vi taùc duïng töø doøng {6} ñeán doøng {10}.       B;                {13}
    Leänh Writeln(y); ôû doøng {9} in ra soá 15, coøn leänh       Writeln(x);        {14}
Writeln(y); ôû doøng {14} laïi bò loãi. Thaät vaäy, sau khi thöïc       Readln;           {15}
31
    END.               {16}             Readln(X[i,j]);
    Chaïy<VD13_4.EXE>           end;
     Cheùp taäp tin nguoàn <VD13_4.PAS>     End; { Heát Nhaäp}
Khi chaïy chöông trình keát quûa in ra laø :     Procedure InMatran( Chugiai: String ; X: Kmatran);
        5     { In ma traân X leân maøn hình }
        10     Var
    Ñaàu tieân leänh {12} gaùn cho bieán x cuûa chöông trình       i, j : Integer;
chính gía trò x=10. Leänh {13} goïi thuû tuïc B. Vì thuû tuïc B     Begin
cuõng coù bieán ñòa phöông teân x neân bieán x toaøn cuïc taïm       Writeln(Chugiai);
thôøi ngöng hoaït ñoäng vaø leänh {8} gaùn cho bieán x ñòa       For i:=1 to M do
phöông gía trò x:=5 . Leänh {9} in gía trò cuûa bieán x ñòa         begin
phöông laø soá 5.           For j:=1 to N do write(X[i,j]:4 );
    Khi trôû laïi chöông trình chính thì bieán x ñòa phöông bò xoùa           Writeln;
khoûi boä nhôù vaø bieán x toaøn cuïc hoaït ñoäng trôû laïi, leänh         end;
{14} seõ in gía trò cuûa bieán x toaøn cuïc laø soá 10.       End; { Heát In Ma traän}
    Phaïm vi cuûa caùc chöông trình con cuõng ñöôïc xaùc ñònh     Procedure Tinh( Var X: Kmatran; A , B : Kmatran);
töông töï.     { Tính ma traän X=A-B}
    Caâu hoûi laø thuû tuïc A2 coù theå goïi ñöôïc ôû nhöõng     Var
ñaâu ?       i ,j : Integer;
    Vì thuû tuïc A2 ñöôïc khai baùo trong thuû tuïc A neân noù chæ     Begin
ñöôïc bieát ñeán beân trong thuû tuïc A, nghóa laø:       For i:=1 to M do
    Coù theå goïi thuû tuïc A2 töø moät vò trí trong thaân cuûa thuû       For j:=1 to N do X[i,j]:=A[i,j]-B[i,j];
tuïc A, trong thaân cuûa thuû tuïc A1,vaø caû trong thaân cuûa A2     End; { Heát Tính }
(goïi ñeä quy).     Function Bang0( X : Kmatran) : Boolean ;
    Toùm laïi phaïm vi cuûa thuû tuïc A2 laø toaøn boä thuû tuïc A.     { Kieåm tra ma tran X goàm toaøn soá 0 ? }
    Töông töï, phaïm vi cuûa thuû tuïc A1 laø toaøn boä thuû tuïc     Var
A.       i, j : Integer;
    Phaïm vi cuûa thuû tuïc A hay B laø toaøn boä chöông trình,       Ktra: Boolean;
keå caû trong thuû tuïc A, A1, A2 vaø B.     Begin
    Ñeå hieåu roõ theâm veà phaïm vi cuûa caùc bieán, caùch thöùc       Ktra:=TRUE;
xaây döïng vaø söû duïng caùc thuû tuïc vaø haøm, ta xeùt ví duï       For i:=1 to M do
sau :       For j:=1 to N do
     Ví duï 13.5:     Nhaäp hai ma traän A, B caáp MxN, tính ma         if X[i,j] <> 0 then Ktra:=FALSE;
traän hieäu C=A-B, in ba ma traän leân maøn hình. Cho bieát ma       Bang0:=Ktra;
traän naøo goàm toaøn soá 0.     End; { Heát haøm Baèng 0}
    Phaân tích: Coù boán vieäc chính phaûi laøm:     BEGIN { chöông trình chính }
    -Nhaäp hai ma traän A vaø B. Veà baûn chaát, ñaây chæ laø       Clrscr;
moät loaïi coâng vieäc neân coù theå vieát thaønh moät thuû tuïc       Repeat
ñeå goïi hai laàn.         Write(‘ Nhaäp soá haøng, soá coät M, N : ‘);
    -Tính ma traän C=A-B. Ñaây laø moät vieäc nhöng chuyeân         Readln(M, N);
bieät coù theå vieát thaønh moät thuû tuïc ñeå chöông trình saùng       Until (N>0) and ( N<11) and ( M>0) and ( M<11) ;
suûa.       Nhap( A, ‘A’ );
    -In ba ma traän A, B vaø C. Veà baûn chaát ñaây chæ laø moät       Nhap( B, ‘B’ );
loaïi coâng vieäc neân coù theå vieát thaønh moät thuû tuïc vaø       Tinh(C, A, B);
goïi ba laàn.       InMatran( ‘ Ma traän A laø: ‘ , A);
    -Kieåm tra xem ma traän naøo toaøn soá 0 ? : Caâu traû lôøi laø       InMatran( ‘ Ma traän B laø: ‘ , B);
moät gía trò loâgic ñuùng hay sai (True hay False), vaäy phaûi       InMatran( ‘ Ma traän C laø: ‘ , C);
vieát daïng haøm vaø goïi ba laàn öùng vôùi caùc ñoái soá laø A,       If Bang0(A) =TRUE then writeln(‘ A toaøn soá 0 ‘);
B vaø C.       If Bang0(B) =TRUE then writeln(‘ B toaøn soá 0 ‘);
    Chöông trình nhö sau:  If Bang0(C) =TRUE then writeln(‘ C toaøn soá 0 ‘);
    PROGRAM VIDU13_5;       Readln;
    { Tính hieäu hai ma traän }     END.
    Uses CRT;     Chaïy<VD13_5.EXE>   
    Type     Cheùp taäp tin nguoàn <VD13_5.PAS>
      Kmatran = Array[1..10, 1..10] of Integer ;     Trong caùc chöông trình con ôû ví duï treân, hai bieán M vaø
    Var N ñöôïc söû duïng töï nhieân maø khoâng caàn phaûi khai baùo
      N, M : Integer; döôùi daïng tham soá vì chuùng laø caùc bieán toaøn cuïc,
      A, B, C: Kmatran; phaïm vi cuûa chuùng laø toaøn boä chöông trình.
  Procedure Nhap(Var X: Kmatran ; ten: Char );     Roõ raøng neáu khoâng söû duïng thuû tuïc vaø haøm thì
      Var chöông trình treân seõ vieát raát daøi doøng.
        i, j : Integer;
13.3. SÖÏ THAM KHAÛO TRÖÔÙC VAØ SÖÏ ÑEÄ
      Begin
QUI
        For i:=1 to M do { nhaäp maûng X }
        For j:=1 to N do   13.3.1. Tham khaûo tröôùc (Forward reference):
          begin     Bình thöôøng khi trong chöông trình chính coù hai chöông
            Write(‘Nhaäp ‘, ten , ‘[‘ , i, ‘,’ , j , ‘]: ‘); trình con A, B ñöôïc khai baùo keá tieáp nhau A tröôùc, B sau,
thì B goïi ñöôïc A nhöng A khoâng goïi ñöôïc B. Khi ñoù ñeå A
32
goïi ñöôïc B ta phaûi tieán haønh khai baùo phaàn ñaàu cuûa B          =4*3*2*1* 1
vôùi töø khoùa Forward tröôùc khi khai baùo B ñaày ñuû.          =24.
    Ví duï 13.6:         Ví duï 13.8:
    PROGRAM VIDU13_6;     Tính soá haïng U(k) cuûa daõy Fibonaci baèng ñeä qui:
    Procedure B; Forward ; { khai baùo tham khaûo B tröôùc}     U(0)=1, U(1)=1, U(k)=U(k-1) + U(k-2) vôùi k>1.
    Procedure A;     Ta vieát:
    Begin     U(k) = 1 neáu k=0 hoaëc k=1
      Writeln(‘ Chaøo chò ‘);         = U(k-1) + U(k-2) neáu k>1.
      B;     Coâng thöùc truy chöùng treân laø cô sôû ñeå xaây döïng
    End; haøm ñeä qui tính U(k): ñeå tính ñöôïc moät soá haïng ta phaûi
    Procedure B; tính ñöôïc hai soá haïng ñöùng tröôùc noù.
    Begin     Chöông trình sau in ra soá Fibonaci thöù N baèng caùch goïi
      Writeln(‘ Chaøo anh ‘); haøm ñeä qui Fibo.
    End;     PROGRAM VIDU13_8;
    BEGIN     { Tính soá Fibonaci thöù N }
      A;     Var
      Readln;       N : Integer;
    END.     Function Fibo( k : Integer) : Integer;
    Chaïy<VD13_6.EXE>        { Haøm tính soá Fibonaci thöù k baèng ñeä qui}
    Cheùp taäp tin nguoàn <VD13_6.PAS>     Begin
    Khi chöông trình chaïy seõ in leân maøn hình:       If k=0 then Fibo:= 1
    Chaøo chò       else
    Chaøo anh         if k=1 then Fibo:=1
    Taát nhieân, neáu ta ñöa khai baùo ñaày ñuû B leân tröôùc A thì         else
khoâng caàn phaûi tham khaûo tröôùc. Song ñaët giaû thieát A           Fibo:=Fibo(k-1) + Fibo( k-2);
goïi B roài B laïi goïi A thì nhaát ñònh phaûi tham khaûo tröôùc     End;
thoâi.     BEGIN
  13.3.2. Söï ñeä qui (Recursion):       Write(‘ Nhaäp N: ‘);
    Moät thuû tuïc hay haøm coù theå goïi chính noù, khi ñoù ta       Readln(N);
noùi coù söï ñeä qui.       Writeln( ‘ Soá Fibo thöù ‘, N, ‘ = ‘, Fibo(N) );
       Ví duï 13.7: Tính S= k! baèng ñeä qui. Ta vieát :       Readln;
    END.
    Chaïy<VD13_8.EXE>   
    Cheùp taäp tin nguoàn <VD13_8.PAS>
                
    Ghi chuù: Vieäc söû duïng ñeä qui ñoøi hoûi nhieàu veà boä
    Muoán tính k! ta phaûi tính ñöôïc (k-1)!, muoán tính (k-1)! laïi
nhôù. Lôøi khuyeân laø neân traùnh duøng ñeä qui neáu coù theå
phaûi tính (k-2)!, ..., suy ra cuoái cuøng phaûi tính ñöôïc 0!, nhöng
ñöôïc.
vì 0!=1 neân quùa trình keát thuùc.
    Chöông trình sau nhaäp N, tính vaø in gía trò N!. Trong chöông 14.1 KIEÅU BAÛN GHI:
trình coù xaây döïng vaø söû duïng moät haøm ñeä quy tính k! :   14.1.1. Khaùi nieäm
    PROGRAM VIDU13_7;     Caùc phaàn trình baøy tröôùc cho thaáy ngoân ngöõ Pascal
    { Tính N! baèng ñeä qui} raát maïnh trong vieäc giaûi quyeát caùc baøi toaùn thieân veà
    Var tính toaùn. Trong phaàn naøy chuùng ta seõ thaáy theâm moät
      N : Byte; khaû naêng maïnh meõ nöõa cuûa ngoân ngöõ Pascal trong lónh
    Function Gt( k : Byte) : Real; vöïc quaûn lyù: quaûn lyù nhaân söï, quaûn lyù vaät tö, quaûn
    { Haøm tính k! baèng ñeä qui} lyù taøi chaùnh,.v.v.
    Begin     Haøng ngaøy chuùng ta raát quen thuoäc vôùi moät danh
      If k=0 then Gt:= 1 saùch sinh vieân nhö döôùi ñaây:
      else     Moãi doøng lieät keâ caùc döõ lieäu veà moät ngöôøi, moãi
        Gt:= k* Gt(k-1); coät laø moät döõ lieäu thaønh phaàn cung caáp thoâng tin veà
    End; moät thuoäc tính cuï theå cuûa nhöõng ngöôøi ñoù.
    BEGIN     Trong ngoân ngöõ Pascal, moãi doøng ñöôïc goïi laø moät
      Repeat RECORD (dòch laø baûn ghi hay theû ghi), moãi coät laø moät
        Write(‘ Nhaäp N: ‘); FIELD (dòch laø tröôøng hay thaønh phaàn, hay thuoäc tính
        Readln(N); cho saùt vôùi thöïc teá).
      Until N>0;     Noùi toång quaùt, moãi baûn ghi laø moät taäp goàm nhieàu
      Writeln( N, ‘ != ‘, Gt(N):0:0 ); tröôøng (field), caùc tröôøng coù theå coù kieåu döõ lieäu khaùc
      Readln; nhau.
    END.   14.1.2. Moâ taû baûn ghi :
    Chaïy<VD13_7.EXE>        Kieåu baûn ghi ñöôïc moâ taû baèng caùch duøng töø khoùa
    Cheùp taäp tin nguoàn <VD13_7.PAS> RECORD keøm theo moät danh saùch khai baùo caùc teân
    Khi nhaäp N=4, quùa trình goïi caùc haøm ñöôïc dieãn giaûi tröôøng vaø kieåu döõ lieäu töông öùng, keát thuùc baèng töø
nhö sau: khoùa END; , töùc laø:
    Gt(4) =4*Gt(3)     TYPE
         =4*3*Gt(2)        Teânkieåu = RECORD
         =4*3*2*Gt(1)          Teântröôøng1 : Kieåudlieäu1;
         =4*3*2*1*Gt(0) { vì k=0 neân Gt=1}          Teântröôøng2 : Kieåudlieäu2;
33
         ...             X.DTB :=(X.Toan+X.Ly)/2;
         Teântröôøngk : Kieåudlieäuk;     Ñeå nhaäp döõ lieäu cho tröôøng Hoten cuûa bieán Y, ta
      End; vieát:
    Ví duï 1: Ta ñònh nghóa moät kieåu KSVIEN nhö sau:              Write(‘Nhap ho ten sinh vien Y : ‘);
       TYPE              Readln(Y.Hoten);
       KSVIEN = RECORD     Sôû dó phaûi vieát teân bieán baûn ghi ôû tröôùc teân tröôøng
         Hoten:String[20]; laø ñeå xaùc ñònh tröôøng ñoù laø cuûa bieán baûn ghi naøo.
         Maso : String[8]; Moãi bieán X, Y, Z ñeàu coù tröôøng Hoten, neân neáu chæ
         Toan, Ly, DTB: Real; vieát Hoten thoâi thì khoâng bieát ñoù laø Hoten cuûa ai: X, Y
       End; hay Z ?. Coøn vieát X.Hoten laø chæ roõ ñaây laø Hoten cuûa
    Theo moâ taû treân, ta coù moät kieåu döõ lieäu môùi ñaët teân bieán X.
laø KSVIEN coù caáu truùc baûn ghi goàm 5 tröôøng (thuoäc     Nhö vaäy, moãi tröôøng cuûa bieán baûn ghi coù theå thaâm
tính) laø nhaäp vaø söû duïng nhö moät bieán bình thöôøng. X.Hoten laø
    Ví duï 2: bieán kieåu String[20], X.Maso laø bieán kieåu String[8], ...,
    Ta moâ taû thôøi gian laø kieåu KDATE coù ba tröôøng ngaøy , X.DTB laø bieán kieåu Real.
thaùng, naêm nhö sau:     Ñoái vôùi caùc baûn ghi loàng nhau, caùch truy xuaát ñeán
    TYPE töøng tröôøng cuõng töông töï.
       KDATE = RECORD     Ví duï: Cho khai baùo bieán S kieåu KSACH:
         Ngay : 1..31;     Var
         Thang : 1..12;       S : KSACH ;
         Nam : Integer;     Ñeå truy nhaäp ñeán caùc tröôøng Ngay, Thang, Nam cuûa
      End; Ngay_muon ta vieát :
    Ví duï 3:     S.Ngay_muon.Teântröôøng
    Ñeå quaûn lyù caùc saùch trong moät thö vieän, ta xaây döïng     Chaúng haïn gaùn :
moät kieåu baûn ghi KSACH nhö sau:             S.Ngay_muon.Ngay := 2;
    TYPE             S.Ngay_muon.Thang := 9;
       KSACH = RECORD             S.Ngay_muon.Nam := 1999;
         Ma_so_sach: String[6];       Hai bieán baûn ghi cuøng kieåu coù theå gaùn cho nhau.
         Ten_doc_gia: String[20]; Leänh :
         Nam_xban :Integer;     Y:=X;
         Gia_tien: Real; gaùn gía trò cuûa töøng tröôøng cuûa bieán X cho tröôøng töông
         Ngay_muon : KDATE; öùng cuûa bieán Y. Vaäy leänh treân töông ñöông vôùi khoái 5
      End; leänh sau :
    Kieåu KSACH laø moät baûn ghi coù 5 tröôøng moâ taû 5     begin
thuoäc tính cuûa saùch laø: maõ soá saùch, teân ñoäc giaû, naêm       Y.Hoten :=X.Hoten;
xuaát baûn, gía tieàn vaø ngaøy möôïn.       Y.Maso :=X.Maso;
    Ví duï naøy cho thaáy caùc baûn ghi coù theå ñöôïc moâ taû       Y.Toan :=X.Toan;
loàng nhau: kieåu döõ lieäu cuûa moät tröôøng cuûa baûn ghi       Y.Ly :=X.Ly;
naøy laïi coù theå laø moät kieåu baûn ghi khaùc ñaõ ñöôïc ñònh       Y.DTB :=X.DTB;
nghóa tröôùc ñoù. Trong baûn ghi KSACH, Ngay_muon laø moät     end;
tröôøng coù kieåu döõ lieäu laø moät baûn ghi kieåu KDATE.       Caùc baûn ghi coù theå so saùnh baèng nhau hoaëc khaùc
    Moãi ñoái töôïng caàn quaûn lyù coù theå coù nhieàu tröôøng, nhau:
song tuøy yeâu caàu quaûn lyù maø ta chæ löïa choïn vaø khai     Ví duï:
baùo nhöõng tröôøng thaät söï caàn thieát. Khai baùo thöøa thì             If X=Y then writeln(‘ X vaø Y laø moät ngöôøi ‘);
hao phí boä nhôù, nhöng neáu thieáu thì coâng taùc quaûn lyù seõ             If X<>Y then writeln(‘ X khaùc Y ‘);
khoù khaên do thieáu thoâng tin. Vì vaäy, neân khai baùo caùc     Tuy nhieân khoâng coù pheùp so saùnh <, <=, >, >= cho caùc
tröôøng vôùi soá löôïng ít nhaát nhöng ñuû duøng. baûn ghi.
  14.1.3. Söû duïng baûn ghi :     Hai baûn ghi coù theå hoaùn ñoåi gía trò cho nhau theo
    Kieåu baûn ghi sau khi ñaõ ñöôïc ñònh nghóa coù theå duøng nghóa hoaùn ñoåi töøng caëp gía trò cuûa caùc tröôøng töông
khai baùo cho caùc bieán. Ví duï : öùng.
    Var     Gioáng nhö caùc bieán ñôn giaûn, ñeå hoaùn ñoåi hai baûn
      X, Y, Z : KSVIEN; ghi X vaø Y ta duøng ba leänh:
    Trong ñoù KSVIEN laø baûn ghi ñaõ moâ taû ôû phaàn treân.     Z:=X; X:=Y; Y:=Z;
    Theo khai baùo naøy, X ,Y vaø Z laø ba bieán kieåu baûn ghi trong ñoù Z laø bieán trung gian cuøng kieåu baûn ghi vôùi X
KSVIEN, moãi bieán ñeàu coù 5 tröôøng Hoten, Maso, Toan, Ly vaø Y.
vaø DTB.     Ví duï: Neáu bieán X vaø Y coù caùc tröôøng töông öùng
    Ñeå thaâm nhaäp vaøo moät tröôøng cuûa baûn ghi ta vieát teân laø :
bieán kieåu baûn ghi, sau ñoù laø daáu chaám ‘.’ vaø teân tröôøng,
  X.Hoten =‘Nguyen   Y.Hoten =‘Tran Thi
töùc laø :
Van An’ Nga’
    Teânbieán .Teântröôøng
  X.Maso =‘1973208’   Y.Maso =‘1974564’
    Caùc leänh döôùi ñaây gaùn gía trò cho töøng tröôøng cuûa
  X.Toan =8.0   Y.Toan =5.0
bieán X :
  X.Ly =7.0   Y.Ly =8.0
            X.Hoten :=‘Nguyen Van An’;
  X.DTB =7.5   Y.DTB =6.5
            X.Maso :=‘1973208’;
            X.Toan :=8.0; thì sau khi hoaùn ñoåi, ta ñöôïc :
            X.Ly :=7.0;   X.Hoten =‘Tran Thi   Y.Hoten =‘Nguyen Van
34
Nga’ An’     Ñeå nhaäp döõ lieäu ( Hoten, Maso, Toan, Ly ) roài tính
  X.Maso =‘1974564’   Y.Maso =‘1973208’ Ñieåm trung bình cho 50 sinh vieân naøy, ta duøng voøng laëp
  X.Toan =5.0   Y.Toan =8.0 For phoái hôïp vôùi caâu leänh WITH :
  X.Ly =8.0   Y.Ly =7.0     For i:=1 to 50 do
  X.DTB =6.5   Y.DTB =7.5       WITH DS[i] DO
        begin
            Write(‘Nhap ho ten sinh vien thu ‘,i,’ : ‘); Readln(Hoten);
  14.1.4. Caâu leänh WITH :           Write(‘Nhap ma so sinh vien thu ‘,i,’ : ‘); Readln(Maso);
    Khi laøm vieäc vôùi nhieàu tröôøng cuûa moät bieán baûn ghi           Write(‘Nhap ñieåm Toan, Ly sinh vien thu ‘,i,’ : ‘);
thì caùch thaâm nhaäp ôû treân toû ra röôøm raø vì phaûi vieát           Readln(Toan, Ly);
nhieàu laàn teân bieán tröôùc teân tröôøng.           DTB:=(Toan + Ly)/2;
    Ñeå ñôn giaûn caùch vieát, Pascal ñöa ra caâu leänh :         end;
    WITH Teânbieán DO LeänhP;     Ñeå saép xeáp danh saùch sinh vieân theo traät töï giaûm cuûa
    Teân bieán thuoäc kieåu baûn ghi. DTB sao cho ngöôøi coù DTB cao thì ñöùng tröôùc, ngöôøi coù
    Neáu LeänhP coù truy xuaát ñeán caùc tröôøng cuûa Teân bieán DTB thaáp thì ñöùng sau, ta coù theå aùp duïng phöông phaùp
thì khoâng caàn phaûi vieát Teân bieán vaø daáu chaám tröôùc saép xeáp maûng, song chæ laáy tröôøng DTB laøm tieâu
caùc teân tröôøng. chuaån so saùnh:
    Ví duï, thay vì vieát:     For i:=1 to 49 do
            X.Hoten:= ‘Nguyen Van An’;     For j:=i+1 to 50 do
ta coù theå vieát :       If DS[i].DTB < DS[j].DTB then
            WITH X DO Hoten:= ‘Nguyen Van An’;         begin { Ñoåi choã DS[i] vaø DS[j] }
    Ñeå in caùc tröôøng cuûa bieán X leân maøn hình, ta vieát:           Z:=DS[i];
    WITH X DO           DS[i]:=DS[j];
      Begin           DS[j]:=Z;
        Writeln(‘ Hoï vaø teân :’ , Hoten);         end;
        Writeln(‘ Maõ soá sinh vieân :’ , Maso);     ÔÛ ñaây Z laø bieán baûn ghi cuøng kieåu vôùi caùc phaàn
        Writeln(‘ Ñieåm Toaùn :’ , Toan: 4:1); töû DS[i].
        Writeln(‘ Ñieåm Lyù :’ , Ly: 4:1);     Khi saép xeáp theo DTB taêng hoaëc giaûm thì tröôøng DTB
        Writeln(‘ Ñieåm trung bình : ‘ , DTB :4:1); ñöôïc goïi laø "khoùa" ( key) saép xeáp.
    End;     Moät caùch töông töï, coù theå saép xeáp danh saùch sinh
    Taát caû caùc teân tröôøng naèm trong khoái begin vaø end vieân theo khoùa laø ñieåm Toan, hoaëc ñieåm Ly, hoaëc Maso,
ñöôïc hieåu laø caùc tröôøng cuûa bieán X (neáu khoâng ghi roõ hoaëc theo Hoten.
teân bieán naøo khaùc).     Ñeå in danh saùch ñaõ saép xeáp leân maøn hình, ta duøng
    Caùc leänh sau gaùn caùc gía trò cho caùc tröôøng cuûa bieán S leänh :
kieåu KSACH laø moät baûn ghi loàng nhau:     For i:=1 to 50 do  WITH DS[i] DO
    WITH S DO         Writeln( i:2, Hoten:25, Maso:9 , Toan:5:1, Ly:5:1,
      begin DTB:5:1);
        Ma_so_sach:=‘TH-435’;
        Ten_doc_gia:=‘Nguyen van Mai’; 14.2. CAÙC VÍ DUÏ VEÀ BAÛN GHI:
        Nam_xban :=1999;       Ví duï 14.1:
        Gia_tien:= 15000;             - Nhaäp moät danh saùch N ( 1 N 50) sinh vieân
        WITH Ngay_muon DO goàøm caùc tröôøng: Hoï teân, Maõ soá, caùc ñieåm Toaùn,
          begin Lyù.
            Ngay:=2;             - Ñoái vôùi moãi sinh vieân, haõy tính ñieåm trung bình :
            Thang:=9;                  DTB=(Toan + Ly)/2 , vaø phaân loaïi nhö sau:
            Nam:=1999;                  Loaïi= Gioûi neáu DTB  9,
          end;                    Khaù neáu 7 DTB < 9,
        end;                    Bình neáu 5 DTB < 7,
  14.1.5. Maûng caùc baûn ghi :                    Keùm neáu DTB < 5.
    Trong thöïc teá, ta thöôøng phaûi quaûn lyù moät danh saùch           - Saép xeáp danh saùch theo traät töï giaûm cuûa DTB, in
sinh vieân cuûa moät lôùp, moät danh saùch caùc quyeån saùch danh saùch leân maøn hình, moãi ngöôøi treân moät doøng
trong thö vieän. Ví theá maûng caùc baûn ghi ñöôïc duøng raát goàm caùc muïc: Soá thöù töï, Hoï teân, Maõ soá, ñieåm Toaùn,
phoå bieán. Lyù, DTB vaø phaân loaïi.
    Khi khai baùo :         - Cho bieát ñieåm Toùan cao nhaát laø maáy ?. Coù bao
    VAR nhieâu ngöôøi ñöôïc ñieåm cao nhaát ñoù ?.
      DS : Array[1..50] of KSVIEN;         -Ñieåm trung bình moân Toaùn cho caû danh saùch laø bao
hoaëc : nhieâu ?.
    TYPE     Baøi giaûi :
      KMang = Array[1..50] of KSVIEN;     Trong chöông trình döôùi ñaây, choã naøo coù kyù hieäu  thì
    VAR haõy thay baèøng moät kyù töï traéng .
      DS: KMang;     PROGRAM VIDU14_1;
thì ta coù moät maûng DS goàm 50 phaàn töû DS[1],..., DS[50]     Uses CRT;
cuøng kieåu baûn ghi KSVIEN. Moãi DS[i], i=1,..., 50 laø moät     Type
baûn ghi coù 5 tröôøng Hoten, Maso, Toan, Ly, DTB löu tröõ       KSVIEN = RECORD
caùc thoâng tin veà sinh vieân thöù i trong danh saùch.         Hoten:String[18];
        Maso, Loai : String[8];
35
        Toan, Ly, DTB : Real;     -Vôùi moãi ñaàu saùch, tính Gía tieàn nhö sau:
      End;     GT = SL * DG neáu SL<10
    Var         = SL*DG - 5%*SL*DG neáu 10  SL<30
      DS : Array[1..50] of KSVIEN;         = SL*DG - 8%* SL*DG neáu 30  SL <50
      Z : KSVIEN;         = SL*DG - 10%* SL*DG neáu SL  50
      N, i, j, Dem : Integer;     (Töùc laø neáu mua töø 10 ñeán 29 cuoán thì ñöôïc giaûm 5%
      Max, TBToan: Real; ñôn gía, mua töø 30 ñeán 49 cuoán thì ñöôïc giaûm 8% ñôn gía,
    BEGIN mua töø 50 cuoán trôû leân thì ñöôïc giaûm 10% ñôn gía).
      CLRSCR;     - Tính Toång soá tieàn phaûi chi cho vieäc mua saùch, keå caû
      Repeat 10% thueá gía trò gia taêng ñaùnh vaøo toång gía tieàn.
        Write(‘ Nhaäp soá sinh vieân N= ‘) ;     -Tìm xem trong danh saùch ñoù coù cuoán "TIN HOC DAI
        Readln(N); CUONG" khoâng. Neáu coù thì cho bieát coù bao nhieâu cuoán
      Until ( N>0) and ( N < 51); vaø ñôn gía cuûa noù.
      { Nhaäp danh sach, tính DTB va phaân loaïi }     Baøi giaûi:
      For i:=1 to N do WITH DS[i] DO     PROGRAM VIDU14_2;
        begin     Uses CRT;
          Write(‘Nhap ho ten sinh vien thu ‘,i,’ : ‘);     Type
          Readln(Hoten);       KSACH = RECORD
          Write(‘Nhap ma so sinh vien thu ‘,i,’ : ‘);          Tensach : String[20];
          Readln(Maso);          SL : Integer;
          Write(‘Nhap ñieåm Toan, Ly sinh vien thu ‘,i,’ : ‘);          DG, GT: Real;
          Readln(Toan, Ly);       End;
          DTB:=( Toan + Ly)/2;       Mang = Array[1..50] of KSACH;
          If DTB >=9 then Loai:=‘Gioi’     Var
          else       S : Mang;
            if DTB >=7 then Loai:=‘Kha’       Z : KSACH;
            else       N, i : Integer;
              if DTB >=5 then Loai:=‘Binh’       Tongtien : Real;
              else     BEGIN
                Loai:=‘Kem’;       Repeat
        end;         Write(‘ Nhaäp N: ‘);
      { Saép xeáp giaûm theo DTB }         Readln( N );
      For i:=1 to N-1 do       Until (N>0) and ( N<51);
      For j:=i+1 to N do       { Nhaäp N saùch vaø tính tieàn}
        if DS[i].DTB < DS[j].DTB then       For i:=1 to N do With S[i] do
          begin         begin
            Z:=DS[i]; DS[i]:=DS[j]; DS[j]:=Z;           Write(‘Nhaäp teân saùch thöù ‘, i ,’: ‘);
          end;           Readln(Tensach);
      Writeln(‘ In danh sach len man hinh ‘ );           Repeat
      Writeln(‘STT HO VA TEN MASO',             Write(‘Nhaäp Soá löôïng : ‘);
                                  ' TOAN  LY DTBLOAI’);             Readln(SL);
      For i:=1 to N do WITH DS[i] DO           Until SL>0;
          Writeln(i:2, #32 , Hoten, #32 :19-Length(Hoten),           Write(‘Nhaäp ñôn giaù : ‘);
Maso:8,           Readln(DG);
                                  Toan:4:1,Ly:4:1, DTB:4:1, Loai:5);           Case SL of
      { Tìm ñieåm Toaùn cao nhaát }             1..9   : GT:=SL*DG;
      Max:=DS[1].Toan;             10..29 : GT:=SL*DG*(1-0.05);
      For i:=1 to N do             30..49 : GT:=SL*DG*(1-0.08);
        if Max< DS[i].Toan then Max:=DS[i].Toan;             else    GT:=SL*DG*(1-0.1);
      Writeln(‘Diem Toan cao nhat = ‘, Max:4:1);           end; { Heát Case}
      { Ñeám soá em coù ñieåm Toaùn =Max}         end; { Heát For}
      Dem:=0;       { Tính toång gía thaønh caùc ñaàu saùch}
      For i:=1 to N do if DS[i].Toan =Max then Dem:=Dem+1;       Tongtien:=0;
      Writeln(‘ Coù ‘, Dem, ‘ em coù ñieåm Toaùn= ‘, Max:4:1);       For i:=1 to N do Tongtien:=Tongtien+S[i].GT;
      { Tính ñieåm trung bình moân Toaùn cho caû danh sach }       { Coäng theâm thueá 10% gía tri gia taêng}
      TBToan:=0; { Laáy toång ñieåm moân Toaùn}       Tongtien:=Tongtien + 0.1*Tongtien ;
      For i:=1 to N do TBToan := TBToan + DS[i].Toan;       Writeln(‘Toång tieàn phaûi chi laø: ‘, Tongtien :6:2);
      TBToan:=TBToan/N ;       { Tìm cuoán ‘TIN HOC DAI CUONG’}
      Writeln(‘Diem trung binh mon Toan= ‘ , TBToan:6:2);       i:=1;
      Readln;       While (i<=N) and  ( S[i].Tensach<> ‘ TIN HOC DAI
    END. CUONG’) do i:=i+1;
    Chaïy<VD14_1.EXE>       If i> N then writeln (‘ Khoâng coù cuoán THDCù ‘)
    Cheùp taäp tin nguoàn <VD14_.PAS>       else
  Ví duï 14.2:         WITH S[i] DO
    -Nhaäp moät danh saùch N (1 N 50) ñaàu saùch goàøm caùc           writeln(‘ Saùch THDC coù  ‘, SL:4, ‘  cuoán, ñôn gía=
thoâng tin veà Teân saùch, Soá löôïng (SL) vaø Ñôn gía (DG). ‘, DG:6:2);
36
      Readln; tính toång gía thaønh caùc cuoán saùch vaøo moät thuû tuïc
    END. rieâng goïi laø TINH, vaø phaàn tìm cuoán TIN HOC DAI
    Chaïy<VD14_2.EXE> CUONG vaøo moät thuû tuïc goïi laø TIM. Trong chöông trình
    Cheùp taäp tin nguoàn <VD14_2.PAS> chính ta chæ phaûi goïi teân caùc thuû tuïc ñoù ra maø thoâi.
  Ví duï 14.3:     PROGRAM VIDU14_3;
    Söû duïng döõ lieäu cuûa ví duï 2 vieát thuû tuïc in danh saùch     Uses CRT;
caùc ñaàu saùch leân maø hình, trình baøy thaønh bieåu sau :     Type
    TOÅNG KEÁT TIEÀN MUA SAÙCH NAÊM 1999                  KSACH = RECORD
    Giaûi:         Tensach : String[20];
    Thuû tuïc INBIEU sau ñaây chöùa moät thuû tuïc con         SL : Integer;
INCHITIET coù nhieäm vuï in chi tieát töøng doøng cho töøng         DG, GT: Real;
cuoán saùch .       End;
    Thaân cuûa thuû tuïc INBIEU laø caùc leänh in tieâu ñeà, sau       Mang = Array[1..50] of KSACH;
ñoù laø lôøi goïi thuû tuïc INCHITIET.     Var
    Caùc döõ lieäu phuïc vuï cho thuû tuïc naøy laø caùc bieán       S : Mang;
toaøn cuïc ñöôïc khai baùo ôû chöông trình chính trong ví duï       Z : KSACH;
14.2, ñoù laø N vaø S.       N, i : Integer;
    Choã naøo coù kyù hieäu  thì haõy thay baèng moät kyù töï       Tongtien : Real;
traéng. Nhaéc laïi raèng #32 cuõng laø moät kyù töï traéng. Thuû     {--- Thuû tuïc Nhaäp -----}
tuïc in bieåu ñöôïc vieát nhö sau:     PROCEDURE NHAP ( Var N : Integer);
    PROCEDURE  INBIEU;     { Nhaäp N ñaàu saùch vaø tính gía thaønh }
    Var     Var i : Integer;
      i: Integer ;     Begin
    Procedure INCHITIET;       Repeat
    { Thuû tuïc in chi tieát töøng cuoán saùch}         Write(‘ Nhaäp soá löôïng saùch N: ‘);
    Var         Readln( N );
      i : Integer;       Until (N>0) and ( N<51);
    Begin       For i:=1 to N do With S[i] do
      For i:=1 to N do WITH S[i] DO         begin
        begin           Write(‘Nhaäp teân saùch thöù ‘, i ,’: ‘);
          Write(‘| ‘ , i:3, #32);           Readln(Tensach);
          Write(‘| ‘ , Tensach);           Repeat
          Write(#32: 21-Length(Tensach) );             Write(‘Nhaäp Soá löôïng : ‘);
          Write(‘| ‘, SL:8, #32);             Readln(SL);
          Write(‘| ‘, DG:8:2, #32);           Until SL>0;
          Write(‘| ‘, GT:8:2, ‘ |’);           Write(‘Nhaäp ñôn giaù : ‘);
          Writeln;           Readln(DG);
        end;           Case SL of
        For i:=1 to 63 do write(‘-’);             1..9 : GT:=SL*DG;
        Writeln;             10..29 : GT:=SL*DG*(1-0.05);
      End; { heát in chi tieát}             30..49 : GT:=SL*DG*(1-0.08);
    Begin { Vaøo thuû tuïc Inbieåu }             else    GT:=SL*DG*(1-0.1);
      { In tieâu ñeà }           End; { Heát Case}
      Writeln(‘ TONG KET TIEN MUA SACH NAM         end; { Heát For}
1999’);       End;
      Writeln( #32 :6 ,       {--- Thuû tuïc Tinh -----}
‘------------------------------------------------------------’);     PROCEDURE  TINH ;
      For i:=1 to 63 do write(‘-’);     { Tính toång gía thaønh caùc ñaàu saùch}
      Writeln;     Var
      Write(‘| STT ‘);       i: Integer;
      Write(‘|’ , #32:7 , ‘TEN SACH’, #32:7 );     Begin
      Write(‘| SO LUONG ‘);       Tongtien:=0;
      Write(‘| DON GIA ‘);       For i:=1 to N do Tongtien:=Tongtien+S[i].GT;
      Write(‘| GIA TIEN |’);       { Coäng theâm thueá 10% gía tri gia taêng}
      Writeln;       Tongtien:=Tongtien + 0.1*Tongtien ;
      For i:=1 to 63 do write(‘-’);       Writeln(‘Toång tieàn phaûi chi laø: ‘, Tongtien :6:2);
      Writeln;     End;
      INCHITIET;     {--- Thuû tuïc Tìm -----}
    End ;     PROCEDURE   TIM ;
    Raùp toaøn boä thuû tuïc INBIEU vaøo phaàn khai baùo cuûa     { Tìm cuoán ‘TIN HOC DAI CUONG’}
chöông trình trong ví duï 14.2, vaø theâm leänh goïi INBIEU;     Var
vaøo cuoái cuûa thaân cuûa chöông trình ñoù, ta ñöôïc moät       i : Integer;
chöông trình ñaày ñuû maø khi chaïy seõ in bieåu theo ñuùng yeâu     Begin
caàu.       i:=1;
    Ngoaøi ra, ñeå chöông trình chính bôùt röôøm raø, ta ñöa phaàn       While (i<=N) and  ( S[i].Tensach<> ‘ TIN HOC DAI
nhaäp döõ lieäu vaøo moät thuû tuïc rieâng goïi laø NHAP, phaàn CUONG’) do i:=i+1;
37
      If i> N then writeln (‘ Khoâng coù cuoán THDC ‘)         TYPE
      else             Kky_tu = SET OF Char;
        WITH S[i] DO             Kchu_hoa = SET OF ‘A’.. ‘Z’;
            writeln(‘ Saùch THDC coù ‘, SL:4, ‘ cuoán vôùi ñôn             Kso = SET OF Byte;
gía= ‘, DG:6:2);         Var
    End;             TapA, TapB : Kky_tu;
    {---------- Thuû tuïc In bieåu ----------------}             TapH: Kchu_hoa;
    PROCEDURE  INBIEU;             TapS : Kso;
    Var         Caùc taäp hôïp TapA, TapB, TapH, TapS noùi treân cuõng
      i: Integer ; coù theå khai baùo tröïc tieáp nhö sau:
    Procedure INCHITIET;         Var
    { Thuû tuïc in chi tieát töøng cuoán saùch}             TapA, TapB : SET OF Char;
    Var             TapH : SET OF ‘A’.. ‘Z’;
      i : Integer;             TapS : SET OF Byte;
    Begin             Chuù yù raèng caùc khai baùo döôùi ñaây laø sai, vì
      For i:=1 to N do WITH S[i] DO kieåu cô baûn khoâng theå laø Integer, vaø neáu laø ñoaïn con
        begin thì phaïm vi cuûa ñoaïn con khoâng ñöôïc vöôït quùa phaïm vi
          Write(‘| ‘ , i:3, #32); cuûa kieåu Byte:
          Write(‘| ‘ , Tensach);         Var
          Write(#32: 21-Length(Tensach) ); T1: SET OF Integer;
          Write(‘| ‘, SL:8, #32); T2: SET OF 1..256 ;
          Write(‘| ‘, DG:8:2, #32);
15.1.2. Xaùc ñònh moät taäp hôïp :
          Write(‘| ‘, GT:8:2, ‘ |’);
            Moät taäp hôïp ñöôïc xaùc ñònh baèng caùch lieät keâ
          Writeln;
caùc phaàn töû cuûa noù, caùc phaàn töû ñöôïc phaân caùch
        end;
nhau bôûi daáu phaåy, vaø ñaët giöõa hai daáu ngoaëc vuoâng.
        For i:=1 to 63 do write(‘-’);
            [ ] : taäp roãng
        Writeln;
            [3..6] : taäp caùc soá nguyeân 4, 3, 5, 6
      End; { heát in chi tieát}
            [3..6, 9, 12] : taäp caùc soá nguyeân 3, 4, 5, 6, 9, 12
    Begin { Vaøo thuû tuïc Inbieåu }
            [‘A’..’C’, ‘X’, ‘Z’] : taäp caùc chöõ ‘A’, ‘B’, ‘C’, ‘X’,
      { In tieâu ñeà }
‘Z’
      Writeln(‘~~~~~~ONG KET TIEN MUA SACH NAM
            Caùc phaàn töû cuûa taäp hôïp coù theå laø bieán hay
1999’);
bieåu thöùc, ví duï:
      Writeln( #32 :6,  
                [3, 5, i+j, 2*j] : taäp hôïp naøy coù 4 phaàn töû laø 3,
‘-------------------------------------------------------------’);
5, hai phaàn töû kia coù gía trò baèng i+j vaø 2*j, trong ñoù i, j
      For i:=1 to 63 do write(‘-’);
laø caùc soá nguyeân sao cho i+j vaø 2*j naèm trong phaïm vi
      Writeln;
töø 0 ñeán 255.
      Write(‘| STT ‘);
      Write(‘|’ , #32:7 , ‘TEN SACH’, #32:7 ); 15.1.3. Caùc pheùp toaùn :
      Write(‘| SO LUONG ‘);          +Pheùp gaùn:
      Write(‘| DON GIA ‘);         Coù theå gaùn moät taäp hôïp cho moät bieán taäp hôïp
      Write(‘| GIA TIEN |’); cuøng kieåu. Ví duï, vôùi caùc bieán khai baùo ôû treân, coù
      Writeln; theå gaùn:
      For i:=1 to 63 do write(‘-’); TapA:=[‘1’..’5’, ‘9’, ‘A’];
      Writeln; TapH:=[‘C’..’F’];
      INCHITIET; TapS:=[15..20, 30, 40];
    End ;         Taäp roãng [ ] gaùn cho bieán taäp hôïp kieåu naøo cuõng
    {---------- Heát thuû tuïc In bieåu --------------} ñöôïc :
    BEGIN TapA:=[ ];
      NHAP ( N); TapH:= [ ];
      TINH;         Leänh gaùn döôùi ñaây laø sai vì hai veá khoâng cuøng
      TIM; kieåu döõ lieäu:
      INBIEU; TapA:=[1..8];
      Readln; TapS:=[‘1’..’9’];
    END.         +Pheùp hôïp:
    Chaïy<VD14_3.EXE>         Hôïp cuûa hai taäp hôïp A vaø B, kyù hieäu laø A+B, laø
    Cheùp taäp tin nguoàn <VD14_3.PAS> moät taäp hôïp goàm caùc phaàn töû hoaëc thuoäc taäp A hoaëc
15.1. KIEÅU TAÄP HÔÏP thuoäc taäp B. Ví duï:
                [3..5]+[4..6,10, 15]=[ 3..6, 10, 15]
15.1.1. Khai baùo :
         + Pheùp giao:
    Moät taäp hôïp thì goàm nhieàøu gía trò coù chung moät kieåu
        Giao cuûa hai taäp hôïp A vaø B, kyù hieäu laø A*B, laø
döõ lieäu, goïi laø kieåu cô baûn. Kieåu cô baûn phaûi laø kieåu
moät taäp hôïp goàm caùc phaàn töû ñoàng thôøi thuoäc A vaø
voâ höôùng ñeám ñöôïc, töùc chæ coù theå laø kieåu byte, kyù
B.
töï , loâgic hay lieät keâ. Soá phaàn töû cuûa taäp hôïp toái ña laø
        Ví duï:
256 phaàn töû.
                [1..10]*[5..15] =[5..10]
        Kieåu taäp hôïp ñöôïc moâ taû baèng töø khoùa SET OF ,
        + Pheùp hieäu:
keá ñeán laø kieåu cô baûn cuûa caùc phaàn töû.
       Ví duï:
38
        Hieäu cuûa hai taäp hôïp A vaø B, kyù hieäu laø A-B, laø PROGRAM VIDU15_2;
moät taäp hôïp goàm caùc phaàn töû thuoäc taäp A nhöng khoâng     Const
thuoäc taäp B. Ví duï:             N=10;
                [1..10] - [5..15] =[1..4]     Var
Nhaän xeùt: Caùc pheùp toaùn treân chæ thöïc hieän ñöôïc khi A         Tapchan, Taple : Set of byte;
vaø B cuøng kieåu, vaø keát quûa laø moät taäp hôïp C cuøng         N1, N2, i, k: byte;
kieåu vôùi A vaø B.     Begin
         + Pheùp thöû IN (thuoäc veàø) :         Tapchan:=[];
        Duøng ñeå kieåm tra xem moät bieán hay moät gía trò coù         Taple:=[];
phaûi laø phaàn töû cuûa moät taäp hôïp naøo ñoù khoâng.         For i:=1 to N do
Bieåu thöùc x IN TapA cho keát quûa laø True neáu gía trò x             begin
thuoäc TapA, cho gía trò False trong tröôøng hôïp ngöôïc laïi.                 Write(‘Nhap so thu ‘, i, ‘: ‘);
Ví duï :                 Readln(k);
                ‘N’ IN [‘N’, ‘n’] cho keát quûa laø TRUE                 If odd(k)=False then Tapchan:=Tapchan+[k]
                ‘y’ IN [‘N’, ‘n’] cho keát quûa laø FALSE                 else          Taple:=Taple+[k];
        + Caùc pheùp so saùnh (=, <>, <=, >=) :              end;
Cho A vaø B laø hai taäp hôïp cuøng kieåu, keát quûa cuûa caùc             writeln(‘ Caùc soá chaün laø: ‘);
pheùp so saùnh A vôùi B seõ laø TRUE hoaëc FALSE.             N1:=0;
            Pheùp baèng: A=B khi vaø chæ khi moãi phaàn töû             For i:=0 to (255 div 2) do
cuûa A ñeàu thuoäc B vaø moãi phaàn töû cuûa B ñeàu thuoäc A,                     if 2*i IN Tapchan then
trong tröôøng hôïp ngöôïc laïi, ta noùi A khaùc B vaø vieát A<>B.                         begin
           Ví duï:                                 Write(2*i : 3);
                [3,2,4,5]= [2, 3..5]                                  N1:=N1+1;
                [‘A’, ‘B’]<>[‘a’,’B’]                         end;
           Pheùp nhoû hôn hoaëc baèng : A<=B khi vaø chæ khi             Writeln( ‘ Co ‘, N1, ‘ soá chaün’);
moïi phaàn töû cuûa A ñeàu thuoäc B, ví duï:             Writeln(‘ Caùc soá leû laø: ‘);
                [3..5]<=[3..5]             N2:=0;
                [3..5]<=[1..6]             For i:=0 to (255 div 2) do
            Pheùp lôùn hôn hoaëc baèng : A>=B khi vaø chæ khi                 if (2*i +1) IN Taple then
moïi phaàn töû cuûa B ñeàu thuoäc A, noùi caùch khaùc A>=B                     begin
khi vaø chæ khi B<=A.                             Write(2*i+1 : 3);
                [3..5]>=[3..5]                              N2:=N2+1;
                [‘A’..’Z’]>=[‘A’..’D’]                     end;
Chuù yù raèng trong caùc taäp hôïp khoâng coù pheùp so saùnh          writeln( ‘ Co ‘, N2, ‘ soá leû’);
nhoû hôn (<) vaø lôùn hôn (>). Khi caàn so saùnh lôùn hôn hay         Readln;
nhoû hôn ta coù theå vieát:         End.
        If (A<=B) and ( A<>B) then writeln(‘A < B’);     Ví duï 15.3:
        If (A>=B) and ( A<>B) then writeln(‘A > B’);         Tìm caùc soá nguyeân toá  soá nguyeân döông N cho
15.1.4. Caùc ví duï : tröôùc.
    Ví duï 15.1:         Coù nhieàu caùch giaûi khaùc nhau, döôùi ñaây giôùi
        Nhaäp vaøo moät chuoãi St , cho bieát trong St coù nhöõng thieäu phöông phaùp cuûa Eratosthene, söû duïng döõ lieäu
chöõ hoa naøo. Ví duï St=‘ABc3BAFdzA’ thì coù caùc chöõ hoa kieåu taäp hôïp vaø khoâng caàn ñeán caùc pheùp toaùn nhaân.
laø A, B, F.         Xuaát phaùt töø taäp soá nguyeân S=[2..N] ta loaïi ra soá
PROGRAM VIDU15_1; nguyeân toá ñaàu tieân vaø taát caû caùc boäi soá cuûa noù ra
    Var khoûi S, laëp laïi quaù trình treân cho ñeán khi S thaønh taäp
        Taphoa : Set of ‘A’..’Z’; roãng.
        N, i: byte;         Ví duï: S=[2..15];
        ch : char;         Böôùc 1:-ñöa 2 vaøo taäp soá nguyeân toá, Tapsnt:=[2]
        St : String;                     -loaïi 2 vaø caùc boäi cuûa 2 ra khoûi S, ta ñöôïc
    Begin                     S=[3,5,7,9,11,13,15 ]
        Write(‘ Nhaäp chuoãi St: ‘);         Böôùc 2:-ñöa 3 vaøo taäp soá nguyeân toá, Tapsnt:=[2,3]
        Readln(St);                   -loaïi 3 vaø caùc boäi cuûa 3 ra khoûi S, ñöôïc
        Taphoa:=[]; S=[5,7,11,13 ]
        N:=length(St);         Böôùc 3:-ñöa 5 vaøo taäp soá nguyeân toá, Tapsnt:=[2,3,5]
        For i:=1 to N do                     -loaïi 5 vaø caùc boäi cuûa 5 ra khoûi S, ñöôïc
                if St[i] IN [‘A’..’Z’] then Taphoa := Taphoa+[ St[i] ]; S=[7,11,13 ]
        Writeln(‘ Cac chu hoa co trong St la :’);         Böôùc 4:-ñöa 7 vaøo taäp soá nguyeân toá,
        For ch:=‘A’ to ‘Z’ do if ch IN Taphoa then write(ch:3); Tapsnt:=[2,3,5,7]
        Readln;                     -loaïi 7 vaø caùc boäi cuûa 7 ra khoûi S, ñöôïc
    End. S=[11,13 ]
    Ví duï 15.2:         Böôùc 5:-ñöa 11 vaøo taäp soá nguyeân toá,
        Nhaäp N soá nguyeân trong phaïm vi töø 0 ñeán 255. In ra Tapsnt:=[2,3,5,7,11]
caùc taäp soá chaün, leû vaø cho bieát coù bao nhieâu soá chaün,                     -loaïi 11 vaø caùc boäi cuûa 11 ra khoûi S, ñöôïc
bao nhieâu soá leû (caùc soá truøng nhau chæ keå 1 laàn). Ví duï, S=[13 ]
nhaäp 9 soá : 1, 2, 3, 4, 1, 2, 3, 4, 5 thì coù hai soá chaün laø 2 vaø         Böôùc 6:-ñöa 13 vaøo taäp soá nguyeân toá,
4 vaø coù 3 soá leû laø 1, 3, 5. Tapsnt:=[2,3,5,7,11,13]
39
                    -loaïi 13 vaø caùc boäi cuûa 13 ra khoûi S, ñöôïc ( nguyeân, thöïc, kyù töï , loâ gic, chuoãi kyù töï...) hoaëc kieåu
S=[ ] coù caáu truùc ( maûng, baûn ghi).
        Keát quûa ñöôïc Tapsnt = [2,3,5,7,11,13].         Caùch khai baùo kieåu taäp tin nhö sau:
        Taäp S gioáng nhö moät caùi saøng ñeå loïc vaø loaïi ra caùc         Type
soá khoâng phaûi soá nguyeân toá. Chöông trình cuï theå nhö sau:                 TeânkieåuTtin = File of Kieåuphaàntöû ;
PROGRAM VIDU15_3;         Ví duï:
    Const             Type
        N=20;                 Ksvien = Record
    Var                     Ten: String[20];
        Tapsnt, S: Set of 1..N;                     Namsinh : Integer;
        snt, i: Integer;                     DTB : Real;
    Begin                 end;
        S:=[2..N];             KieuT1 = File of Integer;
        Tapsnt:=[];             KieuT2 = File of String[20];
        snt:=2; { so nguyen to nho nhat }             KieuT3 = File of Ksvien ;
        Writeln(‘ Cac so nguyen to la :’ );          Theo khai baùo treân thì KieuT1 laø taäp tin coù caùc
        Repeat phaàn töû kieåu nguyeân ( Integer ), KieuT2 laø taäp tin coù
        { tim snt la so nho nhat trong S} caùc phaàn töû laø caùc chuoãi kyù töï ( String[20] ), coøn
                While Not (snt IN S) do snt:=snt+1; KieuT3 laø taäp tin coù caùc phaàn töû laø caùc baûn ghi kieåu
                Tapsnt:= Tapsnt+[snt]; { dua vao Tapsnt } Ksvien.
                Write(snt:4);         Khi ñaõ coù kieåu taäp tin, ta coù theå khai baùo caùc bieán
                { Loaïi caùc boäi cuûa snt ra khoûi S } taäp tin :
                i:=snt;             Var
                While i<=N do                 F1 : KieuT1;
                begin                 F2 : KieuT2;
                    S:=S - [i];                 F3 : KieuT3;
                    i:=i+snt;         F1, F2, F3 laø caùc bieán kieåu taäp tin, moät loaïi bieán
                end; ñaëc bieät, khoâng duøng ñeå gaùn gía trò nhö caùc bieán
            Until S=[]; nguyeân, thöïc hay chuoãi. Moãi bieán naøy ñaïi dieän cho moät
        Readln; taäp tin maø thoâng qua caùc bieán ñoù ta coù theå thöïc hieän
        End. caùc thao taùc treân taäp tin nhö : taïo taäp tin, môû, ñoùng,
15.2. DÖÕ LIEÄU KIEÅU TAÄP TIN xoùa taäp tin, ghi döõ lieäu vaøo taäp tin vaø ñoïc döõ lieäu töø
taäp tin, ...
15.2.1. Khaùi nieäm :
        Ngoaøi caùch khai baùo caùc bieán F1, F2, F3 thoâng qua
        Nhaäp vaø xuaát döõ lieäu laø hai coâng vieäc raát phoå
vieäc ñòng nghóa caùc kieåu döõ lieäu môùi nhö treân, Pascal
bieán khi thöïc hieän moät chöông trình. Cho ñeán nay, ta môùi
coøn cho pheùp khai baùo tröïc tieáp caùc bieán taäp tin nhö sau:
chæ nhaäp döõ lieäu töø baøn phím vaø xuaát döõ lieäu ra maøn
        Var
hình. Caùc döõ lieäu naøy ñöôïc toå chöùc trong boä nhôù cuûa
            TeânbieánTtin : File of Kieåuphaàntöû ;
maùy, chuùng toàn taïi khi chöông trình ñang chaïy vaø bò xoùa
       Ví duï: coù theå khai baùo ba bieán F1, F2, F3 noùi treân
khi chöông trình keát thuùc. Muoán löu tröõ caùc döõ lieäu laâu
theo caùch sau :
daøi ñeå söû duïng nhieàu laàn thì phaûi ghi chuùng leân ñóa
        Type
thaønh caùc taäp tin.
            Ksvien = Record
        Taäp tin (file) trong Pascal laø moät kieåu döõ lieäu coù caáu
                    Ten: String[20];
truùc. Moãi taäp tin laø moät taäp hôïp caùc phaàn töû coù cuøng
                    Namsinh : Integer;
chung moät kieåu döõ lieäu ñöôïc nhoùm laïi thaønh moät daõy
                    DTB : Real;
vaø ñöôïc ghi treân ñóa döôùi moät caùi teân chung. Khaùi nieäm
            end;
taäp tin vaø maûng coù nhöõng ñieåm raát gaàn nhau. Song taäp
        Var
tin khaùc maûng ôû nhöõng ñieåm sau ñaây:
            F1 : File of Integer;
        -Maûng ñöôïc toå chöùc trong boä nhôù coøn taäp tin chuû
            F2 : File of String[20];
yeáu ñöôïc toå chöùc treân ñóa.
            F3 : File of Ksvien ;
        -Soá phaàn töû cuûa maûng ñöôïc xaùc ñònh ngay khi khai
baùo, coøn soá phaàn töû cuûa taäp tin thì khoâng. Caùc taäp tin       15.2.2.1. Caùc thuû tuïc chuaån:
ñöôïc keát thuùc baèng moät daáu hieäu ñaëc bieät goïi laø EOF             1) Thuû tuïc ASSIGN( bieántaäptin, teântaäptin) :
( End Of File). gaùn teân taäp tin cho bieán taäp tin. ÔÛ ñaây teân taäp tin laø
        -Caùc phaàn töû cuûa maûng ñöôïc truy xuaát thoâng qua moät     bieåu thöùc kieåu chuoãi laø teân thöïc söï cuûa taäp tin.
chæ soá. Caùc phaàn töû cuûa taäp tin ñöôïc truy xuaát nhôø moät Ví duï :
bieán trung gian chæ ñieåm vaøo vò trí cuûa chuùng treân ñóa,                     Assign(F1, ‘DLIEU.DAT’);
goïi laø con troû teäp. Taïi moãi thôøi ñieåm, con troû seõ chæ                     Assign(F3, ‘QLSV.DAT’);
vaøo moät vò trí naøo ñoù trong taäp tin, goïi laø vò trí hieän         Sau hai leänh naøy, bieán F1 ñoàng nhaát vôùi taäp tin
thôøi. DLIEU.DAT, moïi thao taùc treân bieán F1 chính laø thao taùc
        Döôùi ñaây seõ trình baøy hai loaïi taäp tin thöôøng gaëp laø treân taäp tin DLIEU.DAT. Töông töï, bieán F3 ñoàng nhaát
taäp tin coù ñònh kieåu vaø taäp tin vaên baûn. vôùi taäp tin QLSV.DAT
            2) Thuû tuïc REWRITE( bieántaäptin) : Khôûi taïo
15.2.2. Taäp tin coù ñònh kieåu: taäp tin môùi, neáu taäp tin ñaõ coù treân ñóa thì noù xoùa ñi
        Taäp tin maø caùc phaàn töû cuûa noù coù cuøng moät kieåu vaø taïo môùi. Ví duï :
döõ lieäu goïi laø taäp tin coù ñònh kieåu. Kieåu döõ lieäu cuûa                     Rewrite(F1) ; khôûi taïo taäp tin DLIEU.DAT
caùc phaàn töû cuûa taäp tin coù theå laø kieåu ñôn giaûn                     Rewrite(F3) ; khôûi taïo taäp tin QLSV.DAT
40
             3) Thuû tuïc RESET(bieántaäptin): Môû taäp tin ñaõ Ví duï 15.4:
coù ñeå söû duïng. Con troû taäp tin troû vaøo phaàn töû ñaàu         Nhaäp moät danh saùch sinh vieân goàm Hoï teân, ñieåm
tieân (coù soá thöù töï laø 0) cuûa taäp tin . Toaùn, Lyù, tính ñieåm trung bình roài löu vaøo taäp tin
        Ví duï : Reset ( F3); môû taäp tin QLSV.DAT HOSO.DAT. Sau ñoù ñoïc döõ lieäu taäp tin naøy vaø in ra
             4) Thuû tuïc WRITE( bieántaäptin, b1, b2, ..., bN): maøn hình. Trong chöông trình , choã naøo coù daáu ~ thì thay
Tuaàn töï ghi vaøo taäp tin caùc gía trò cuûa caùc bieán b1, b2, ..., baèng moät kyù töï traéng.
bN. Caùc bieán b1, ..., bN phaûi cuøng kieåu döõ lieäu vôùi caùc PROGRAM VIDU15_4;
phaàn töû cuûa taäp tin. Uses CRT;
        Ví duï :- Cho i, j, k laø caùc bieán kieåu Integer vaø i=10, Const Tenttin = ‘HOSO.DAT’;
j=20, k=100, khi ñoù leänh : Type
                    Write(F1, i, j, k ) ;         Ksvien= Record
seõ ghi laàn löôït caùc gía trò 10, 20, 100 vaøo taäp tin             Hoten: String[20];
DLIEU.DAT             Toan, Ly, Dtb : Real;
                -Cho khai baùo:          end;
                  Var         KieuTtin = File of Ksvien ;
                     X : Ksvien; Var
        Caùc leänh sau gaùn gía trò cho X vaø ghi X vaøo taäp tin         F : KieuTtin ;
QLSV.DAT:         X : Ksvien ;
                    X.Ten:=’Ng Van An’;         i: Integer;
                    X.Namsinh :=1980 ; Procedure Hienthi ( Var F : KieuTtin);
                    X.DTB :=6.5; begin
                    Write(F3, X);     Clrscr;
            Sau khi ghi X vaøo taäp tin QLSV.DAT, con troû taäp tin     Writeln(#32 :5, ‘HOÏ VAØ TEÂN’, #32:6 ,
töï ñoäng dôøi ñeán vò trí cuûa phaàn töû tieáp theo.     ‘ÑTOAÙN~~~ÑLYÙ~~~~DTB’);
             5) Thuû tuïc READ( bieántaäptin, b1, b2, ..., bN) :     Reset(F);
Ñoïc tuaàn töï caùc phaàn töû cuûa taäp tin töø vò trí hieän thôøi     While Not Eof(F) do
cuûa con troû taäp tin vaø gaùn cho caùc bieán b1, b2, ..., bN.         begin
Kieåu döõ lieäu cuûa caùc bieán b1, b2, ..., bN phaûi cuøng kieåu             Read(F, X);
vôùi caùc phaàn töû cuûa taäp tin. Moãi khi ñoïc xong moät phaàn             Writeln(X.Hoten, #32:20-Length(X.Hoten),
töû, con troû taäp tin töï ñoäng dôøi ñeán phaàn töû tieáp theo.             X.Toan:4:1,#32:3, X.Ly:4:1, #32:3, X.DTb:4:1);
        Ví duï: leänh Read(F1, i, j); ñoïc hai soá nguyeân trong taäp         end;
tin DLIEU.DAT ( keå töø vò trí hieän thôøi) vaø gaùn cho caùc end; {Heát hieån thò}
bieán nguyeân i, j . BEGIN
            Leänh Read(F3, X); ñoïc baûn ghi hieän thôøi cuûa taäp tin     Clrscr;
QLSV.DAT vaø gaùn cho bieán baûn ghi X.     Assign(F, TenTtin);
             6) Thuû tuïc CLOSE( bieántaäptin) : Ñoùng taäp tin .     Rewrite(F);
             7) Thuû tuïc SEEK( bieántaäptin, k ) : Ñaët con troû     i:=0;
taäp tin vaøo phaàn töû thöù k trong taäp tin. Thuû tuïc naøy cho     Repeat
pheùp truy xuaát tröïc tieáp moät phaàn töû cuûa taäp tin maø         Clrscr;
khoâng phaûi thöïc hieän tuaàn töï töø ñaàu taäp tin.         Gotoxy(10,4);
            Ví duï: ñoïc phaàn töû thöù 10 cuûa taäp tin DLIEU.DAT         Write( ‘NHAÄP SINH VIEÂN THÖÙù ‘, i , ‘: ( Enter
vaø gaùn cho bieán nguyeân i roài in gía trò cuûa i : ñeå keát thuùc) ‘ );
                Seek(F1, 10);         With X do
                Read(F1, i);             begin
                Write(i);                     Gotoxy(10,6); Write(‘Ho va ten:’);
             8) Thuû tuïc ERASE( bieántaäptin) : Xoùa taäp tin                     Gotoxy(10,8); Write(‘Ñiem Toan:’);
treân ñóa                     Gotoxy(10,10); Write(‘Ñiem Ly :’);
             9) Thuû tuïc RENAME( bieántaäptin, teânmôùi ) :                     Gotoxy(20,6); Readln(Hoten);
Ñoåi teân taäp tin .                     If Hoten<>’’ then
Yeâu caàu laø taäp tin phaûi ñang ñoùng thì môùi xoùa hay ñoåi                     begin
teân ñöôïc.                                 Gotoxy(20,8); Readln(Toan);
      15.2.2.2. Caùc haøm chuaån:                                 Gotoxy(20,10); Readln(Ly);
             1) Haøm EOF(bieántaäptin): Cho keát quûa True khi                                 DTB:=(Toan+Ly)/2;
con troû taäp tin ñang ôû cuoái teäp, trong caùc tröôøng hôïp                         end;
khaùc haøm cho gía trò False.                 end;
             2) Haøm FILESIZE(bieántaäptin) :Cho soá phaàn töû                 If X.Hoten<>’’ then Write(F,X);
cuûa taäp tin. Neáu taäp tin roãng thì soá phaàn töû baèng 0.                  i:=i+1;
             3) Haøm FILEPOS(bieántaäptin) : Cho vò trí hieän         Until X.Hoten=’’;
thôøi cuûa con troû taäp tin. Phaàn töû ñaàu tieân coù soá thöù töï         Close(F);
laø 0. Phaàn töû cuoái cuøng coù soá thöù töï baèng FileSize -1.         Hienthi(F);
        Ví duï : Ghi soá 100 vaøo cuoái taäp tin DLIEU.DAT, duøng         Close(F);
caùc leänh:         Readln;
                    i:=100;     END.
                    Seek( F1, FileSize(F1) ) ; {Ñaët troû vaøo cuoái taäp Chuù yù : Neáu tham soá trong chöông trình con laø taäp tin
tin} thì noù phaûi laø tham soá bieán, khoâng theå laø tham soá trò.
                    Write(F1, i); { Ghi gía trò cuûa i vaøo cuoái teäp} 15.2.3. Taäp tin vaên baûn:
41
        Trong Pascal coù moät kieåu taäp tin ñaõ ñöôïc ñònh nghóa xuoáng doøng döôùi. Ñaëc bieät, leänh Writeln(F); khoâng ghi
saün, ñoù laø kieåu TEXT hay taäp tin vaên baûn. gì caû, chæ ñöa con troû taäp tin xuoáng doøng.
        Ñeå khai baùo F laø bieán taäp tin vaên baûn ta vieát :         Noäi dung cuûa caùc taäp tin vaên baûn taïo baèng Pascal
        Var hoaøn toaøn coù theå xem ñöôïc baèng leänh Type cuûa
            F: Text; MSDOS, baèng Norton hay baèng chính Turbo Pascal, ...
        Caùc phaàn töû cuûa taäp tin vaên baûn laø caùc kyù töï       Ñoïc döõ lieäu cuûa taäp tin vaên baûn :
ñöôïc ghi thaønh töøng doøng coù ñoä daøi khaùc nhau. Caùc          Thuû tuïc READ( bieántaäptin, bieán1, bieán2, ...,
doøng ñöôïc phaân caùch nhôø caùc daáu keát thuùc doøng ( End bieánN) ñoïc tuaàn töï caùc gía trò töø taäp tin vaø gaùn cho
of line). Ñoù laø hai kyù töï ñieàu khieån CR ( Carriage return : caùc bieán. Caùc bieán1, bieán2, ..., bieánN phaûi coù kieåu döõ
nhaûy veà ñaàu doøng) vaø LF ( Line feed: xuoáng doøng döôùi). lieäu phuø hôïp vôí döõ lieäu caàn ñoïc taïi vò trí töông öùng
Ví duï , ñoaïn vaên baûn sau : trong taäp tin.
            Tap tin van ban Text         Ví duï: Neáu taäp tin T1.TXT coù noäi dung nhö sau:
            12345             ~~Ket qua=~~100~123.45
            Het thì ñeå ñoïc laïi caùc döõ lieäu naøy, ta phaûi khai baùo:
ñöôïc chöùa trong taäp tin vaên baûn thaønh moät daõy :         Var
            St :String[10];
Tap tin van ban Text CR LF 12345 CR LF Het             i: Integer ; Z : Real;
        Caùc thuû tuïc Assign, Rewrite, Resetù, Write, Read, Vaø duøng caùc leänh:
Close, Erase, Rename ñeàu duøng ñöôïc cho taäp tin vaên baûn.             Reset(F);
Ngoaøi ra coøn coù theâm thuû tuïc Append(bieántaäptin) duøng             Read(F, St, i, Z);
ñeå môû taäp tin vaên baûn vaø cho pheùp ghi theâm döõ lieäu Gía trò cuûa St, i, Z seõ laø: St=’~~Ket qua=’, i=100, Z=123.45.
vaøo cuoái taäp tin.         Neáu khai baùo St coù kieåu String[9] thì seõ bò loãi vì sau
        Ñoái vôùi taäp tin vaên baûn, khoâng theå ñoàng thôøi vöøa khi ñoïc xong 9 kyù töï ñaàu, maùy seõ ñoïc tieáp gía trò
ghi vöøa ñoïc döõ lieäu nhö taäp tin coù ñònh kieåu. =~~100 cho bieán nguyeân i, nhöng vì gía trò naøy baét ñaàu laø
        Ñeå ghi döõ lieäu, tröôùc tieân phaûi khôûi taïo taäp tin daáu = neân khoâng ñoåi ra soá nguyeân ñöôïc.
baèng leänh Rewrite hay môû taäp tin vaø ñöa troû veà cuoái teäp          Thuû tuïc READLN(bieántaäptin, bieán1, bieán2, ...,
baèng leänh Append. Sau ñoù ghi döõ lieäu vaøo taäp tin baèng bieánN ) ñoïc döõ lieäu cho caùc bieáân xong seõ ñöa troû taäp
thuû tuïc Write hay Writeln. tin xuoáng ñaàu doøng döôùi.
        Ñeå ñoïc döõ lieäu moät taäp tin ñaõ coù, tröôùc tieân ta         Ñaëc bieät, leänh READLN( bieántaäptin); khoâng ñoïc
phaûi môû taäp tin baèng leänh Reset. Sau ñoù ñoïc döõ lieäu gì caû, chæ ñöa con troû taäp tin xuoáng doøng.
baèng thuû tuïc Read hay Readln. Chuù yù: -Haøm Eof(F) cuõng duøng ñöôïc cho taäp tin vaên
        Neáu môû taäp tin baèng Rewrite hoaëc Append thì khoâng baûn, ngoaøi ra coøn coù haøm EOLN(F) cho keát quûa laø
theå ñoïc ñöôïc baèng Read vaø Readln. Neáu môû taäp tin baèng True hoaëc False tuøy theo con troû taäp tin coù ñang ôû cuoái
Reset thì khoâng theå ghi ñöôïc baèng Write hay Writeln. doøng hay khoâng. Khi Eof(F)=True thì Eoln(F) cuõng coù gía
      Ghi döõ lieäu vaøo taäp tin vaên baûn : trò laø True.
         Thuû tuïc WRITE( bieántaäptin, bt1, bt2, ..., btN) : cho       -Thuû tuïc Seek vaø caùc haøm FileSize, FilePos khoâng
pheùp tuaàn töï ghi caùc gía trò cuûa caùc bieåu thöùc bt1, bt2, .. duøng cho taäp tin vaên baûn.
btN vaøo taäp tin vaên baûn. Caùc bieåu thöùc bt1, bt2, .. btN       Caùc taäp tin vaên baûn ngaàm ñònh:
phaûi thuoäc kieåu ñôn giaûn chuaån ( nguyeân, thöïc, kyù töï,         Trong Pascal coù hai bieán taäp tin vaên baûn ñaõ ñöôïc
loâgic) hay kieåu chuoãi, vaø chuùng khoâng caàn phaûi coù kieåu khai baùo saün laø Input vaø Output , töùc laø maùy ñaõ ngaàm
gioáng nhau. Ví duï : khai baùo :
        Write(F, 3, 10:4, ‘a’:2, ‘Text’, 4.5:6:2);         Var
seõ ghi vaøo taäp tin thaønh daõy nhö sau ( Daáu ~ hieåu laø moät             Input , Output : Text ;
kyù töï traéng):         Input thöôøng laø baøn phím coøn Output thöôøng laø
        3~~10~aText~~4.50 maøn hình.
        Chöông trình döôùi ñaây seõ taïo taäp tin vaên baûn         Leänh Readln(Input, x); ñöôïc vieát taét thaønh Readln( x) ;
T1.TXT :         Leänh Writeln(Output, x); ñöôïc vieát taét thaønh
Program VIDU; Writeln(x);
Var         Maùy in cuõng laø moät taäp tin vaên baûn, ñöôïc ngaàm
        F: Text; khai baùo vôùi teân laø LST. Ñeå in caùc bieåu thöùc bt1,
        A : Integer; bt2, ..., btN ra maùy in, ta phaûi khai baùo söû duïng thö vieän
        B : Real; chuaån PRINTER, vaø duøng leänh :
Begin             Write(LST, bt1, bt2, ... , btN);
        A:=100;       So saùnh taäp tin vaên baûn vôùi taäp tin ñònh kieåu:
        B:=1234.5;         Caùc taäp tin coù ñònh kieåu cho pheùp vöøa ñoïc vöøa ghi
        Assign(F, ’T1.TXT’); vaø truy nhaäp tröïc tieáp vaøo töøng phaàn töû gaàn gioáng nhö
        Rewrite(F); thao taùc vôùi maûng.
        Write(F, ‘Ket qua=’ :10, A:5, B:7:2);         Caùc taäp tin vaên baûn khoâng cho pheùp ñoàng thôøi
        Close(F); ñoïc, ghi vaø chæ coù theå ñoïc hoaëc ghi tuaàn töï, nhöng cho
End. pheùp ta coù theå xem, söûa tröïc tieáp moät caùch deã daøng
        Noäi dung cuûa taäp tin T1.TXT laø : baèng caùc heä soaïn thaûo vaên baûn ñôn giaûn, nhö NC hay
            ~~Ket qua=~~100~123.45 chính Turbo Pascal.
        Nhö vaäy, caùch ghi döõ lieäu vaøo taäp tin vaên baûn hoaøn Ví duï 15.5:
toaøn gioáng nhö khi in döõ lieäu leân maøn hình.         Cho taäp tin vaên baûn teân laø T2.TXT vaø coù noäi dung
         Thuû tuïc WRITELN cuõng coù coâng duïng nhö laø:
WRITE, nhöng ghi xong döõ lieäu thì ñöa con troû taäp tin             dong=6
42
            cot =7
            0 8 8 -2 6 11 1
           8 0 2 0 7 0 2
           8 2 0 11 12 9 3
           -2 0 11 0 -7 9 4
           6 7 12 -7 0 6 5
           11 0 9 9 6 0 6
        Haõy ñoïc taäp tin naøy ñöa vaøo moät ma traän A vaø in ma
traän A leân maøn hình. Soá doøng vaø soá coät cuûa ma traän A
ñöôïc ghi ôû hai doøng ñaàu tieân trong taäp tin T2.TXT.
Program VIDU15_5;
{ vi du ve File Van ban }
uses crt;
Type
        MANG = array[1..20,1..20] of integer ;
Var
        A : MANG;
        N, M : integer;
        F : Text;
Procedure Nhap;
    Var
            i,j : Byte;
            st: string[5];
    Begin
            Assign(F, 'T2.TXT');
            Reset(F);
            Readln(F, St, N);
            Readln(F, St, M);
            For i:=1 to N do
                begin
                    For j:=1 to M do Read(F, A[i,j]);
                    Readln(F);
                end;
            Close(F);
        End;
Procedure InMatran;
    Var
            i, j : Integer;
    Begin
            For i:=1 to N do
                begin
                        for j:=1 to M do write( A[i,j]:4);
                       writeln;
                end;
      End;
      BEGIN
        Clrscr;
        Nhap;
        InMatran;
        Readln;
    END.
 

You might also like