SlideShare a Scribd company logo
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 1
L C V
NGÔN NG L P TRÌNH PASCAL
1.1. Nh ng nét chung c a ngôn ng l p trình
Nh ta ã nói n trong ch ng 1, mu n trao cho máy tính th c hi n m t công vi c
nào ó hay nói cách khác gi i m t bài toán nào ó, thu t toán gi i bài toán ph i c
di n t thành m t ch ng trình vi t b ng m t ngôn ng l p trình.
Có r t nhi u lo i ngôn ng l p trình b c cao (v n n ng). Tuy nhiên chúng u có m t
nét chung nh sau:
Quy nh m t s các ký t dùng vi t ch ng trình, T p các ký t này c g i
là ng ch cái c a ngôn ng .
Quy nh m t s t c bi t v i các hàm ý c th g i là các khoá.
Quy nh cách vi t tên các i l ng mà ch ng trình c p n.
Quy nh u trúc chung c a m t ch ng trình và các quy nh khi vi t t ng ph n
a ch ng trình.
ch c m t th vi n các ch ng trình con chu n h tr ng i vi t ch ng trình.
Khi dùng m t ngôn ng nào ó vi t ch ng trình, ch ng trình ó c g i là
ch ng trình ngu n (SourceProgram). có th th c hi n c, ch ng trình ó c n
c d ch sang ngôn ng máy. Công vi c ó do các IDE m nhi m. IDE là vi t t t
a ba ch ti ng Anh Integrated Development Envirement (Môi tr ng phát tri n
tích h p). V c b n máy tính không th "hi u" và th c hi n các ch ng trình ngu n
không vi t b ng ngôn ng máy (Xem ph n i c ng v Tin h c). IDE cho phép ta
ch ch ng trình vi t b ng ngôn ng l p trình sang ngôn ng máy và t o thêm các
ti n nghi cho vi c vi t và th c hi n ch ng trình trên c s ngôn ng l p trình. C n
chú ý r ng cùng m t ngôn ng l p trình, có nhi u IDE khác nhau. Ví d ngôn ng l p
trình Pascal có hai IDE ang c dùng ph bi n: Turbo Pascal và Free Pascal. Tuy
nhiên Free Pascal s là IDE c dùng lâu dài vì có th ch y trong c môi tr ng
Windows và Linux.
Trong ph n l n các tr ng trên th gi i, khi d y ngôn ng l p trình u tiên, ng i ta
th ng ch n ngôn ng Pascal. M t trong nh ng lý do chính vì Pascal là m t ngôn
ng khá chu n m c th hi n các thu t toán và các ki u d li u liên quan; thông
qua quá trình h c ngôn ng này, h c sinh có th hi u c nh ng ý t ng c b n c a
t ngôn ng l p trình b c cao. Trong ch ng này, chúng ta s gi i thi u nh ng ki n
th c c b n v ngôn ng này v i m c tiêu vi t các ch ng trình gi i các bài
toán thông th ng trên c s IDE Turbo. Trong cu i ch ng này, s có m t ph l c
IDE Free-Pascal.
Ta c n luôn ý th c r ng Pascal là m t ph ng ti n giao ti p gi a ng i và máy
tính. B n thân máy tính là m t thi t b v t lý, "giao vi c" cho máy thông qua m t
ch ng trình, chúng ta c n ph i tuân th úng nh ng quy nh r t nghiêm ng t c a
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 2
ngôn ng vì ch nh v y, ch ng trình m i có th d ch c sang ngôn ng máy và
khi ó máy m i có th "hi u" và th c hi n c.
1.2. B ch cái
vi t các l nh, Pascal ch n m t s ký t trong b ng mã ASCII dùng làm b ch cái
a mình. B ch cái này g m:
- Các ch cái th ng và hoa c a ti ng Anh:
A..Z, a..z
- Các ch s th p phân
0..9
- D u g ch chân (th ng dùng n i ch ) _ (có mã ASCII th p phân b ng 95)
- Ký t tr ng (mã ASCII th p phân b ng 32) gõ b ng phím dài Space
- Các ký t v i mã ASCII th p phân t 0 n 31 (các mã u khi n)
- Các ký t c bi t
+ - * / = < > [ ] . ,
( ) : ; ^ @ { } $ # '
- Các c p ký t vi t li n nhau dùng nh m t ký t
Gán
<= >= <> := .. (* *) (. .)
i v i các ký t khác c a b ng mã ASCII, Pascal không chính th c dùng làm các
ch cái c a mình. Tuy nhiên, nó có th x lý và trong các chú thích ho c các dòng
thông báo, ta có th dùng c các ký t này.
n chú ý r ng, khác v i cách vi t trong Toán h c, các c p d u ngo c (, ), {,
}, [, ] dùng trong Pascal có ý ngh a khác nhau:
(, ) dùng phân bi t các s h ng trong các bi u th c.
{, } dùng ghi các chú thích trong ch ng trình. gi i thích m t ph n
ch ng trình nào ó, ta có th vi t chú thích cho ph n ó và ph n chú thích
ph i t gi a { và }.
[, ] dùng cho các ki u d li u xâu, m ng và t p h p (Xem các ph n sau).
1.3. Khái ni m tên
Pascal có m t s t c bi t g i là khoá (Keyword) g m 52 t sau:
ABSOLUTE EXTERNAL MOD SHR
AND FILE NIL STRING
ARRAY FOR NOT THEN
BEGIN FORWARD OBJECT TO
CASE FUNCTION OF TYPE
CONST GOTO OR UNIT
CONSTRUCTOR IF PACKED UNTIL
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 3
DESTRUCTOR IMPLEMENTATION PROCEDURE USES
DIV IN PROGRAM VAR
DO INLINE RECORD VIRTUAL
DOWNTO INTERFACE REPEAT WHILE
ELSE INTERRUPT SET WITH
END LABEL SHL XOR
Khi s d ng Pascal gi i các bài toán (theo ngh a nêu trong ch ng tr c), trong
phát bi u c a bài toán và trong quá trình gi i bài toán, có các i l ng ho c ã cho
ho c c n tính toán. Khi vi t ch ng trình, ta c n khai báo tên các i l ng này kèm
theo ki u d li u t ng ng.
Tên t ph i tuân theo các quy nh sau:
1. Ch g m các ch cái, ch s ho c d u g ch chân và không b t u b ng ch
, khi ó ch cái hoa hay th ng u c hi u nh nhau
2. Không c trùng v i các t khoá nêu trên. i v i ng i Vi t Nam, u này
không gây nên khó kh n vì m t s t khoá n gi n th ng c dùng nhi u
trong ch ng trìntr, các t khoá r c r i ch c không ai dùng t tên.
3. dài có th tu ý nh ng Pascal ch quan tâm n không quá 63 ký t u.
Nói chung, khi t tên các i l ng c n tính toán trong ch ng trình, ta nên dùng
các tên t t g i nh ý ngh a c a nó.
Trong các m c ti p theo, ta s l n l t gi i thi u v các ki u d li u mà Pascal cho
phép dùng th hi n các i l ng khác nhau th ng g p trong các bài toán và cách
khai báo v chúng.
1.4. C u trúc chung c a m t ch ng trình Pascal
t ch ng trình Pascal t ng quát g m các ph n sau:
1. Ph n các khai báo,
2. Ph n các ch ng trình con,
3. Ph n ch ng trình chính.
Ph n ch ng trình chính nh t thi t ph i có, hai ph n khác tu theo yêu c u c th c a
ng i vi t ch ng trình, không nh t thi t ph i có.
1.4.1. Ph n khai báo
Ph n khai báo g m các m c sau:
a) Tên ch ng trình (m c này có th không c n có nh ng n u vi t, ph i vi t
úng).
Cách vi t
Program tên ch ng trình;
trong ó tên ch ng trình c n t theo úng các quy nh v tên.
b) Các h ng d n biên d ch (s c gi i thi u d n khi c n)
c) Khai báo các n v (unit) ch ng trình c n dùng. File TURBO.TPL và các file
*.TPU bao g m m t s unit nh CRT, DOS, SYSTEM, GRAPH . . ó là th vi n
các th t c và các hàm chu n c a Pascal cho phép ng i vi t trình c s d ng
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 4
ngoài các th t c và các hàm chu n ã có s n. Ngoài ra, ng i vi t ch ng trình c ng
có th t o l p các unit c a riêng mình theo các quy nh c a Pascal.
Cách vi t
USES danh sách các unit;
Trong danh sách này, hai unit liên ti p cách nhau m t d u ph y.
d) M c Label. Li t kê tên các m c c a ch ng trình. Cách t tên m c gi ng nh
cách t tên ngo i tr u ki n b t u b ng ch cái. Nói chung chúng tôi không ng
vi c vi t ch ng trình có khai báo này vì nó che d u tính c u trúc c a ch ng
trình.
Cách vi t
Label danh sách các m c;
Trong danh sách này, hai m c liên ti p cách nhau m t d u ph y.
e) M c Const. Khai báo các h ng (các i l ng không i).
Cách vi t
Const danh sách các tên h ng
Trong danh sách này, hai tên h ng liên ti p cách nhau m t d u ch m ph y.
Cách vi t m i h ng
Tên h ng=giá tr ;
g) M c Type. Khai báo các ki u d li u.
Cách vi t
Type danh sách các ki u
Cách vi t m i ki u
Tên ki u = Mô t ki u;
h) M c Var. Khai báo các i l ng (các bi n) dùng trong ch ng trình.
Cách vi t
Var danh sách các bi n
Cách vi t m i bi n
Tên bi n:tên ki u c a bi n;
u m t s bi n có cùng ki u, ta có th khai báo chung ki u, khi ó hai bi n liên ti p
khi khai báo chung ki u cách nhau m t d u ph y.
1.4.2. Các ch ng trình con
u trúc m i ch ng trình con hoàn toàn t ng t nh m t ch ng trình Pascal
ngo i tr vi c ch ng trình con ph i k t thúc b ng
END;
Ta s có m t m c riêng gi i thi u chi ti t h n v các ch ng trình con.
1.4.3. Ph n ch ng trình chính
Ph n này b t u b ng t khoá Begin ti p theo là các l nh và k t thúc b ng
END.
ây là t khoá end duy nh t trong ch ng trình có d u ch m kèm theo sau ánh u
k t thúc c a ch ng trình.
1.4.4. M t lo i ch ng trình n gi n: vi t thông báo ra màn hình
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 5
minh ho cho khái ni m v m t ch ng trình Pascal ng th i gi i thi u l nh vi t
ra màn hình nh ng thông báo c n thi t gi i thích cho các l nh ph c t p sau này, ta
a ra m t vài ví d v nh ng ch ng trình n gi n nh t.
Ví d 1. Gi s ta mu n vi t ra màn hình thông báo Day la lop 10 Tin hoc, ch ng
trình sau th c hi n công vi c này.
Begin
Writeln('Day la lop 10 Tin hoc');
End.
Ví d 2. Gi s ta mu n vi t ra màn hình thông báo Day la lop 10 Tin hoc và trong
dòng ti p theo thông báo 'M i b n làm quen v i Turbo-Pascal', ch ng trình sau th c
hi n công vi c này.
Begin
Writeln('Day la lop 10 Tin hoc, ');
Writeln('Moi ban lam quen voi Turbo-Pascal');
End.
u ch ng trình này c s a thành
Begin
Write('Day la lop 10 Tin hoc, ');
Writeln('Moi ban lam quen voi Turbo-Pascal');
End.
Hãy th c hi n c hai th y s khác nhau gi a hai l nh Write và Writeln.
Qua hai ví d trên, khi mu n vi t m t dòng thông báo nào ó ra màn hình, ta có th
dùng l nh Write ho c Writeln, dòng thông báo c vi t gi a m t c p d u nháy ' và
t gi a m t c p ngo c tròn.
t nh n xét r t b ích cho chúng ta sau này là các dòng l nh c a Pascal ph n l n
u k t thúc b ng d u ;.
1.5. Môi tr ng Pascal
Nói m t cách t ng quát, trong Tin h c, khi s d ng m t ph n m m nào ó, các ti n
nghi mà ph n m m ó cung c p cho ng i s d ng c g i là môi tr ng c a ph n
m ó. Ví d ng i ta th ng nói n môi tr ng DOS, môi tr ng WINDOWS,
môi tr ng Linux . . .
Khi làm vi c v i Pascal v i t cách nh m t ph n m m, ta có môi tr ng Pascal.
làm vi c v i Pascal, trên máy tính c n có các file ch ng trình c n thi t. N u
mu n cài t y , hi n có hai b ch ng trình TP7.0 dùng cho môi tr ng DOS
và BP dùng cho môi tr ng WINDOWS. Tuy nhiên, có th h c nh ng ph n
p n trong giáo trình này, ta ch c n hai file TURBO.EXE, TURBO.TPL.
b t u làm vi c v i Pascal, n u trong môi tr ng DOS, ta vào th m c ch a các
file trên và gõ TURBO r i gõ phím ENTER, còn trong môi tr ng WINDOWS, ta
m kép chu t vào bi u t ng c a Pascal hay BP. Sau ó s xu t hi n màn hình so n
th o ch ng trình Pascal nh hình v d i ây. Ta c ng g i màn hình nàylà m t c a
.
File Edit Search Run Compile Debug Tools Options Windows Help
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 6
-----------------------------NONAME00.PAS-----------------------------
_
1:1
----------------------------------------------------------------------
F1 Help F2 Save F3 Open Alt+F9 Compile F9 Make Alt+F10 LocalMenu
Hai dòng trên và d i c g i là Menu, m i m c trong Menu t ng ng v i m t
lo i vi c ta có th l a ch n, hai s trên dòng cu i cùng ng n cách nhau b ng d u hai
ch m (:) cho ta bi t v trí c a con tr so n th o ang dòng nào (s tr c) và c t nào
(s sau) c a ch ng trình ang so n. Vi c gi i thi u chi ti t v Menu s c c p
n d n qua t ng m c. Sau ây ta ch gi i thi u m t s m c c n thi t nh t trong giai
n ban u khi so n th o và ch y m t ch ng trình vi t b ng Pascal.
ây ta có th làm các vi c sau:
1. So n m i m t ch ng trình: Các b c l n l t ti n hành là
Gõ ch ng trình. Các thao tác so n th o v c b n gi ng nh trong m t h
so n th o v n b n.
Ghi file ch ng trình vào a: gõ phím ch c n ng F2, gõ ph n tên c b n c a
file r i gõ phím Enter.
Biên d ch ch ng trình: gõ ng th i hai phím Alt+F9. N u ch ng trình có
i, s có m t v t thông báo màu , gõ phím Enter ho c Esc, v t s bi n
t và v trí con tr n m sát ngay ch sai u tiên c a ch ng trình. Sau khi
a sai n u có, c n ghi l i và ti n hành biên d ch l i cho t i khi ch ng trình
không còn l i.
Ch y ch ng trình: gõ ng th i hai phím Ctrl+F9.
Sau khi dùng xong ch ng trình, ta có th óng c a s c a ch ng trình ó
ng cách gõ ng th i hai phím Alt+F3.
2. N u mu n so n m t ch ng trình m i khác, ta có th l n l t gõ các phím F10, F,
N, ta s c m t c a s m i và có th b t u m t vòng làm vi c nh trên.
Khi làm vi c v i Pascal, ta có th m nhi u c a s , m i c a s ng v i m t ch ng
trình ho c m t file d li u. Th ng các c a s này x p ch ng lên nhau, b ng cách gõ
phím F6, ta có th chuy n c a s cu i cùng lên trên cùng.
3. N u mu n m m t file ra m t c a s , ta gõ phím F3 r i gõ tên file c n m sau ó
gõ phím Enter.
5. ra kh i Pascal, ta gõ ng th i hai phím Alt+X.
2. D LI U KI U N GI N
Khi vi t ch ng trình Pascal, i i l ng xu t hi n trong ch ng trình c n ph i
c khai báo tên và ki u c a nó trong m c Var. Tu theo bài toán c th , i l ng
ó có th là i l ng cho tr c, i l ng c n tính và nh ng i l ng phát sinh
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 7
trong quá trình tính toán. Tu theo ý ngh a th c t c a chúng, ta c n ch n ki u d
li u khai báo.
i dung c a m c này nh m gi i thi u các ki u d li u n gi n. Lý do c a vi c
ch n thu t ng n gi n không ch vì nói chung chúng n gi n mà ti n dùng sau
này trong ph n các ch ng trình con.
2.1. D li u ki u s nguyên
2.1.1. Cách khai báo bi n ki u s nguyên
Khi có m t bi n ki u s nguyên, trong m c Var, ta có th ch n m t trong n m cách
khai báo sau ây.
Tên bi n:Shortint;
i khai báo này, bi n s nh n giá tr trong mi n -128..127 và m i bi n c n 1 byte b
nh .
Tên bi n:Byte;
i khai báo này, bi n s nh n giá tr trong mi n 0..255 và m i bi n c n 1 byte b
nh .
Tên bi n:Integer;
i khai báo này, bi n s nh n giá tr trong mi n -215..215-1 và m i bi n c n 2 byte
nh .
Tên bi n:Word;
i khai báo này, bi n s nh n giá tr trong mi n 0..216-1 và m i bi n c n 2 byte b
nh .
Tên bi n:Longint;
i khai báo này, bi n s nh n giá tr trong mi n -231..231-1 và m i bi n c n 4 byte
nh .
Pascal cho phép ta dùng hai h ng chu n: m t h ng ký hi u là MaxInt có giá tr b ng
giá tr l n nh t c a bi n ki u Integer (= 215-1), m t h ng ký hi u là MaxLongInt
có giá tr b ng giá tr l n nh t c a bi n ki u LongInt (= 231-1).
Khi mu n vi t các u ki n so sánh gi a các bi n ki u s <, >, ≤, ≥, ≠, =, trong
ch ng trình ta vi t t ng ng nh sau:
<, >, <=, >=, <>, =
2.1.2. Các hàm và th t c chu n
Khi vi t các bi u th c s h c, các phép tính c ký hi u nh sau:
C ng + Tr - Nhân *
X Mod Y: Ph n d c a phép chia X cho Y
X Div Y: Th ng c a phép chia X cho Y
Chú ý r ng các hàm X Mod Y và X Div Y ch xác nh v i Y ≠ 0.
ng nh trong toán h c, phân bi t các s h ng trong m t bi u th c, ta có th
dùng các d u ngo c. Tuy nhiên, c n chú ý r ng m c dù trong Toán h c, ta c phép
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 8
dùng các lo i d u ngo c khác nhau, nh ng trong Pascal, khi vi t các bi u th c, ta ch
c dùng m t lo i d u ngo c duy nh t là các d u m óng ngo c tròn (, ).
u không dùng d u ngo c, th t u tiên th c hi n các phép toán s là:
Div và Mod, nhân, c ng và tr
Ví d , a*(b+c) là bi u th c c vi t úng nh ng n u vi t a*[b+c] là sai, không c
hi u là a nhân v i t ng c a b và c. N u vi t a*b+c thì bi u th c s có giá tr b ng
(a*b)+c.
i v i các bi n ki u s nguyên, Pascal có s n m t s hàm chu n và m t s th t c
chu n ph c v các tính toán ph bi n nh t.
Hàm (Function) chu n là hàm có s n c a Pascal. Hàm có th có ho c không có bi n.
Giá tr c a hàm ch có th dùng tính toán, so sánh ho c gán cho m t bi n khác
cùng ki u. Khi dùng hàm, c n bi t rõ các bi n (n u có) c a nó ph i có ki u gì và ki u
li u c a hàm là ki u gì. Sau ây là m t s hàm chu n.
Hàm Sqr(X): Hàm có bi n X ki u s nguyên và giá tr b ng bình ph ng c a X.
Hàm Pred(X): Hàm có bi n X ki u s nguyên và có giá tr b ng X-1.
Hàm Succ(X): Hàm có bi n X ki u s nguyên và có giá tr b ng X+1.
Hàm Random(X): Hàm có bi n X ki u Word và có giá tr là m t s nguyên ng u
nhiên trong ph m vi 0..X-1. Khi dùng hàm này ta ph i khai báo n v ch ng trình
CRT trong m c Uses và tr c ó ph i g i th t c Randomize;
Bi u th c nguyên là bi u th c nh n c t các bi n và các s nguyên liên k t b i
các hàm chu n nêu trên.
Th t c (Procedure) chu n là các l nh có s n c a Pascal. L nh này cho phép ta th c
hi n m t vi c nào ó. Th t c có th có ho c không có bi n và n u có bi n, ta c n
bi t rõ bi n ó có ki u gì. Mu n dùng th t c, ta vi t nó nh vi t m t l nh.
Th t c Inc(X); t ng giá tr c a bi n X ki u s nguyên m t n v .
Th t c Dec(X); gi m giá tr c a bi n X ki u s nguyên m t n v .
Th t c Inc(X,Y); thay giá tr A ang có c a bi n X ki u s nguyên b ng A c ng
i giá tr c a bi n ki u s nguyên Y ho c giá tr nguyên Y.
Th t c Dec(X,Y); thay giá tr A ang có c a bi n X ki u s nguyên b ng A tr
i giá tr c a bi n ki u s nguyên Y ho c giá tr nguyên Y.
2.1.3. Các cách nh n giá tr cho các bi n ki u s nguyên
nh n giá tr c a m t bi n ki u s nguyên, ta có th dùng m t trong hai cách sau:
- Dùng l nh gán
Tên bi n:=bi u th c có giá tr ki u s nguyên;
- Nh n t bàn phím b ng l nh
Read(tên bi n); ho c Readln(tên bi n);
Khi nh n giá tr t bàn phím, ta có th nh n giá tr cho m t s bi n b ng l nh
Read/Readln(tênbi n1, tênbi n2, . . ., tênbi nk);
Khi th c hi n l nh này, trên màn hình s xu t hi n con tr , mu n cho bi n giá tr bao
nhiêu, ta gõ t bàn phím sau ó gõ phím Enter.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 9
Tuy nhiên có th dùng ch ng trình m t cách ti n l i, khi nh n giá tr bi n t bàn
phím, ta nên vi t kèm thêm dòng thông báo gi i thích c n nh p giá tr nh th nào.
Do ó, ta nên dùng l nh nh n giá tr t ng bi n t bàn phím d i d ng m t c p l nh:
Write('Dòng thông báo');Readln(tên bi n);
Dòng thông báo này s c vi t ra màn hình gi i thích cho ng i ch y ch ng trình
n nh p gì t bàn phím.
Ví d , n u ta c n nh p m t s nguyên d ng N≤100 t bàn phím, ta có th dùng c p
nh
Write('Nhap so nguyen duong N <= 100: ');Readln(N);
2.1.4. Cách vi t giá tr bi n nguyên ra màn hình
vi t giá tr c a bi n ki u nguyên ra màn hình, ta dùng l nh
Write(Tên bi n); ho c writeln(Tên bi n);
Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau ch ch sau khi
vi t ra màn hình b ng l nh Write, n u vi t ti p s vi t trên cùng dòng ang vi t d
còn sau khi vi t ra màn hình b ng l nh WriteLn, n u vi t ti p s chuy n xu ng u
dòng d i vi t.
Khi vi t nhi u s liên ti p trên m t dòng, ta nên dùng cách vi t có quy cách b ng
cách dùng l nh.
Write/writeln(Tên bi n:K);
trong ó K là h ng s nguyên d ng. L nh này có ngh a là dành K v trí liên ti p
vi t giá tr c a bi n, giá tr này vi t ph i nh t i v i K v trí này. N u s l ng s
ng i nhi u, vi c ch n K c n c vào hai u ki n:
1. K ph i l n h n s ch s nhi u nh t có th c a các s này
2. K nên là c c a 80 (s v trí trên m t dòng màn hình)
u ki n th nh t b o m hai s liên ti p cách nhau ít nh t m t d u tr ng; u ki n
th hai cho ta vi t c các s thành các c t th ng hàng.
Ví d , n u ta c n vi t m t lo t s liên ti p, m i s có không quá 6 ch s thì v i m i
X, ta nên vi t ra màn hình b ng l nh
Write(X:8);
Sau ây là m t s ch ng trình ví d n gi n.
Ví d 1. Ch ng trình ngh ng i s d ng nh p t bàn phím tu i và vi t l i ra
màn hình.
USES CRT;
VAR TUOI:BYTE;
BEGIN
CLRSCR;
WRITE('MOI BAN CHO BIET TUOI CUA BAN: ');READLN(TUOI);
WRITELN('CAM ON, TOI DA BIET BAN ',TUOI,' TUOI');
READLN;
END.
Ví d 2. Ch ng trình ngh nh p t bàn phím hai s nguyên A, B và vi t ra màn
hình t ng, hi u, div và mod c a hai s ó.
USES CRT;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 10
VAR A,B:INTEGER;
BEGIN
CLRSCR;
WRITE('BAN HAY NHAP SO NGUYEN A = ');READLN(A);
WRITE('BAN HAY NHAP SO NGUYEN B = ');READLN(B);
WRITELN('TONG CUA ',A,' VA ',B,' BANG ',A+B);
WRITELN('HIEU CUA ',A,' VA ',B,' BANG ',A-B);
WRITELN('TICH CUA ',A,' VA ',B,' BANG ',A*B);
IF B<>0 THEN
BEGIN
WRITELN('THUONG CUA PHEP CHIA ',A,' CHO ',B,' BANG ',A DIV B);
WRITELN('PHAN DU CUA PHEP CHIA ',A,' CHO ',B,' BANG ',A MOD B);
END;
READLN;
END.
2.2. D li u ki u s th c
2.2.1. Cách khai báo
Trong Pascal, s th c có hai cách vi t:
1. Cách vi t thông th ng theo ki u Anh-M : cách vi t này t ng t nh ta v n dùng
trong Toán h c, ch khác bi t là d u ng n cách gi a ph n nguyên và ph n phân là
u . thay vì d u , nh ta quen dùng.
2. Cách vi t d u ph y ng: N u M là s th c, ta luôn có m t cách duy nh t bi u
di n M d i d ng M = α.10K
trong ó -1<α<1 và K là s nguyên. α c g i là
ph n nh tr còn K c g i là ph n b c. Khi ó, cách vi t d u ph y ng c a M
là αEK (*)
Ví d v i cách vi t thông th ng, ta có s 12.25, trong cách vi t d u ph y ng, s
này c vi t d i d ng 0.1225e2.
Cách vi t này dùng l u gi s th c trong b nh nh ng khi vi t không quy cách
th c ra màn hình, Pascal vi t d ng (*) v i α có ph n nguyên trong ph m vi 1..9 (ta
gi i thích khái ni m vi t có quy cách và không có quy cách trong m c 2.2.4).
Ví d
12.25 khi vi t không quy cách ra màn hình s là 1.225e001.
0.0825 s là 8.25e-002.
Khi dùng máy tính tính toán các s th c, ta nên nh r ng máy tính ch có th bi u
di n s th c v i m t s nh t nh ch s có ngh a (CSCN).
Pascal có 5 ki u dùng khai báo các i l ng là s th c c cho trong b ng d i
ây trong ó i v i b n ki u u, c t mi n giá tr ch mi n bi n thiên c a tr tuy t
i c a s .
Tên Mi n giá tr T S CSCN S Byte
Real 2.9e-39..1.7e38 11-12 6
Single 1.5e-45..3.4e38 7-8 4
Double 5.0e-324..1.7e308 15-16 8
Extended 3.4e-4932..1.1e4932 19-20 10
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 11
Comp -9.2e18..9.2e18 19-20 8
Chú ý r ng ki u Comp luôn là s nguyên v i giá tr t -263
+1 n 263
-1 v i 19-20 ch
có ngh a.
Khi ó mu n khai báo m t bi n ki u s th c, tu tình hu ng c th , ta có th ch n
t trong n m cách khai báo sau:
Tên bi n:Real;
Tên bi n:Single;
Tên bi n:Double;
Tên bi n:Extended;
Tên bi n:Comp;
Trong nh ng tính toán thông th ng, khi m t i l ng là s th c, ta nên ch n cách
khai báo u tiên.
2.2.2. Các hàm và th t c liên quan
Các phép tính s h c i v i các s th c c ký hi u nh sau:
C ng + Tr - Nhân * Chia /
Các quy nh khi vi t các bi u th c s th c c ng gi ng nh i v i bi u th c s
nguyên trong m c 2.1.2.
Sau ây là các hàm chu n tr giúp các tính toán v i s th c.
Hàm Abs(X): Hàm này có giá tr b ng tr tuy t i ki u s th c c a giá tr bi n ki u
th c X ho c s th c X.
Hàm ArcTan(X): Hàm này có giá tr là cung trong kho ng (-π/2, π/2) có tang ki u
th c b ng giá tr c a bi n ki u s th c X hay s th c X.
Hàm Exp(X): Hàm này có giá tr b ng lu th a c s e c a giá tr bi n ki u s th c
X ho c s th c X (eX
).
Hàm Ln(X): Hàm này có giá tr b ng lô ga c s e c a giá tr bi n ki u s th c X
ho c s th c X.
Hàm Sin(X): Hàm này có giá tr b ng sin(X), X tính theo Radian.
Hàm Cos(X): Hàm này có giá tr b ng cosin(X), X tính theo Radian.
Hàm Pi: Hàm này cho ta giá tr c a s π (3.1415....).
Hàm Int(X): Hàm này có giá tr b ng ph n nguyên nh ng có ki u s th c c a giá tr
bi n ki u s th c X ho c s th c X (Ph n nguyên c a s th c X b ng s nguyên l n
nh t trong các s nguyên không l n h n X).
Hàm Frac(X) = X - Int(X): hàm này c ng có ki u s th c.
Hàm Sqr(X): Hàm này có giá tr b ng bình ph ng c a giá tr bi n ki u s th c X
ho c s th c X.
Hàm Sqrt(X): Hàm này nh n giá tr b ng c n b c hai c a giá tr không âm c a bi n
ki u s th c X ho c s th c không âm X. Chú ý r ng khi dùng hàm này, giá tr c a X
pahir không âm.
Hàm Random: Hàm này cho ta m t s th c ng u nhiên trong kho ng (0,1). Khi
dùng hàm này ta ph i khai báo n v ch ng trình CRT trong m c Uses và tr c ó
ph i có lênh Randomize;.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 12
Hàm Round(X): Hàm này nh n giá tr b ng s nguyên g n s th c X nh t nh ng có
ki u là ki u s nguyên. Trong tr ng h p ph n phân c a X là 0.5, hàm này nhân giá
tr làm tròn lên.
Hàm Trunc(X): Hàm này có giá tr b ng ph n nguyên c a giá tr bi n ki u s th c X
ho c s th c X nh ng có ki u là ki u s nguyên.
t bi u th c có giá tr th c là bi u th c ch a các bi n s th c, các s th c liên k t
i các hàm chu n.
t bi u th c s là bi u th c ch a các bi n s , các s liên k t b i các hàm chu n c a
các ki u s . Ki u c a m t bi u th c s là ki u c a bi n s ho c s có mi n giá tr
ng nh t.
2.2.3. Các cách nh n giá tr
nh n giá tr c a m t bi n ki u s th c, ta có th dùng m t trong hai cách sau:
Dùng l nh gán
Tên bi n:=bi u th c có giá tr ki u s ;
Nh n t bàn phím b ng l nh
Read/ReadLn(tên bi n);
Các u c n chú ý khi dùng các l nh này c ng t ng t nh ã vi t trong cu i m c
2.1.3.
Chú ý quan tr ng
Khi dùng các l nh gán, bi n ki u s th c có th c gán giá tr c a bi u th c s
nguyên ho c s th c nh ng n u bi n ki u s nguyên, ta không th gán cho nó giá tr
a bi u th c ki u s th c dù giá tr ó là s nguyên.
Ví d , v i các khai báo bi n
X:Integer;
Y:Real;,
nh gán th hai sau ây không h p l ngay c khi giá tr c a Y là s nguyên theo
ngh a Toán h c:
Y:=5;
X:=Y;
ây c ng là m t u khác v i thói quen trong Toán h c. M t cách t ng quát, nh
gán các bi n s X:=Y ch có th i v i các bi n Y có ki u v i mi n giá tr không l n
n mi n giá tr c a ki u bi n X.
2.2.4. Cách vi t giá tr bi n ra màn hình
Có hai cách vi t s th c ra màn hình:
Cách vi t không quy cách: dùng l nh
Write/writeln(Tên bi n);
Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau c ng t ng t nh
ã nói m c 2.1.4.
Các l nh vi t trên s vi t s th c d i d ng d u ph y ng. Mu n vi t s th c d ng
thông th ng, ta ph i dùng cách vi t có quy cách:
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 13
Write/writeln(Tên bi n:K:L);
có ngh a là ta dùng K v trí vi t giá tr c a bi n trong ó dùng L v trí cho các ch
c a ph n phân c a s . Vi c l a ch n các giá tr c a K và L do ng i l p trình c
ng s ch s c a s c n vi t ra, tuy nhiên rõ ràng L không th l n h n K-2.
Tr ng h p K=0, l nh có ngh a là dùng ch vi t giá tr .
Ví d . Ch ng trình nh p t bàn phím hai s th c b, c sau ó gi i ph ng trình b c
nh t bX + c = 0.
USES CRT;
VAR
B,C:REAL;
BEGIN
CLRSCR;
WRITE('NH P S TH C B: ');READLN(B);
WRITE('NH P S TH C C: ');READLN(C);
WRITELN('C N GI I PH NG TRÌNH BX + C = 0');
IF B=0 THEN
BEGIN
IF C=0 THEN WRITELN('PH NG TRÌNH VÔ NH')
ELSE WRITELN('PH NG TRÌNH VÔ NGHI M')
END
ELSE WRITELN('PH NG TRÌNH CÓ M T NGHI M DUY NH T = ',-C/B:0:2);
END.
2.3. Bi u th c s h c
Trong l p trình, bi u th c s h c c hi u là bi u th c nh n c t các bi n ki u
, các h ng s nh m t s h u h n phép toán c ng, tr , nhân, chia, Div, Mod và các
hàm chu n ki u s c a Pascal. Khi vi t bi u th c s h c, phân bi t các s h ng, ta
ch c phép dùng các d u óng/m ngo c tròn ( và ).
t v n t ra là khi trong m t bi u th c s h c có nhi u bi n ki u s khác nhau
thì ki u c a giá tr bi u th c s là ki u nào? Câu tr l i là ki u c a m t bi u th c s
c xác nh là ki u c a bi n tham gia bi u th c có mi n giá tr l n nh t, ch ng h n
tích m t bi n ki u s th c và m t bi n ki u s nguyên có ki u s th c, t ng m t bi n
ki u Longint v i m t bi n ki u Integer có ki u Longint, tích m t bi n ki u Integer
i m t bi n ki u Integer có ki u Integer. Do ó khi tính toán các s , ta c n d li u
tr c k t qu tính toán tránh nh n c giá tr không chính xác ho c b báo l i
tràn s h c (Arithmetic Overflow) n u tr c ó ta t d n biên d ch
{$Q+}
Ví d khi tính di n tích S c a m t hình ch nh t có hai c nh D và R, n u ta khai báo
D và R ki u Integer, m c dù ta khai báo S ki u Longint nh ng giá tr c a S có th
không nh n c úng n u ta tính S b ng công th c S = DR. Nguyên nhân vì hai s
ki u Integer khi nhân v i nhau có th v t ra kh i ph m vi Integer. k t qu tính
luôn úng, ta có th dùng hai l nh thay vì m t: S:=1; S:=S*D*R.
Trong ch ng trình sau n u nh p giá tr D = R =1000, ta s th y di n tích âm n u
không t d n biên d ch {$Q+}và b báo l i tràn s h c (Arithmetic Overflow) n u
tr c ó ta t d n biên d ch ki m soát các tính toán ra ngoài ph m vi c a ki u s
c khai báo: {$Q+}.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 14
Uses CRT;
Var
d,r:integer;
Begin
ClrScr;
Write('Nhap chieu dai hinh chu nhat = ');ReadLn(d);
Write('Nhap chieu rong hinh chu nhat = ');ReadLn(r);
Writeln('Dien tich hinh chu nhat = '),d*r);
ReadLn;
End.
2.4. D li u ki u lô gic (boolean)
2.4.1. Khái ni m u ki n lôgic
t nh lô gic c ng còn g i là u ki n lô gic là m t u kh ng nh mà ch có
úng m t trong hai kh n ng x y ra là úng hay sai. úng/sai c g i là các giá tr
chân lý hay g i t t là giá tr và trong Pascal ta dùng các tên True, False.
Ví d 5 là s nguyên t là m t m nh lô gic có giá tr úng nh ng à i ti ng m ru
nhè nh không là m t m nh lô gic.
i hai u ki n lô gic P và Q, ta có th l p các u ki n lô gic sau:
P và Q
P ho c Q
Không P
Các phép và, ho c, Không c g i là các phép toán lô gic.
Giá tr c a các u ki n này c cho trong b ng sau.
P Q P Và Q P Ho c Q Không P
úng úng úng úng Sai
úng Sai Sai úng Sai
Sai úng Sai úng úng
Sai Sai Sai Sai úng
Trong l p trình, i l ng ki u lôgic là các i l ng ch nh n m t trong hai giá tr
TRUE ( úng) và FALSE (sai). Các giá tr True, False c xem là các giá tr c a
bi n ki u Boolean.
Các i l ng ki u lô gic th ng th hi n d i d ng các u ki n lô gic nh u
ki n so sánh giá tr c a các bi n, có hay không có m t s ki n nào ó, tìm th y/ch a
tìm th y l i gi i . . .
Các u ki n lô gic th ng do các u ki n lô gic n gi n ghép l i nh các liên t
và, ho c, không . . . Khi vi t các u ki n lô gic ph c h p, Pascal dùng các t khoá
sau th hi n các liên t ó:
AND - và
OR - hay là/ho c
NOT - không
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 15
Khi ó, n u các u ki n thành ph n là các u ki n so sánh, u ki n này ph i
c t trong m t c p ngo c n. Ví d v m t toán h c, ta vi t 3<X 5 thì trong
Pascal ta ph i vi t
(3<X) AND (X<=5)
Các cách vi t sau là sai
3<X AND X<=5
3<x<=5
ng nh khi vi t các bi u th c s h c, phân bi t các thành ph n trong u ki n
lô gic, ta ch c dùng các d u ngo c tròn. N u không dùng d u ngo c tròn, th t
u tiên s là Not, And, Or.
Sau ây là m t s u ki n lô gic vi t trong so sánh v i m t s u ki n th ng g p
trong toán h c.
Toán h c p trình
x ≠ 0 x<>0
X ∈ [a,b] (X>=a) and (X<=b) a<=X<=b
X ∉ [a,b] (X<a) or (x>b)
(X>=0) and (Frac(Sqrt(X))=0)
X là chính ph ng (X>=0) and
(Int(Sqrt(X))=Sqrt(x))
i v i ki u d li u này có m t hàm chu n
Odd(X): i bi n s nguyên X, hàm nh n giá tr True, n u X l , hàm nh n giá tr
False n u X ch n.
2.4.2. Vi c nh n giá tr và vi t giá tr ra màn hình.
Khác v i các ki u d li u s , bi n ki u Boolean ch có th nh n giá tr b ng l nh gán:
Tên bi n := u ki n lô gic;
Ta c ng có th vi t giá tr c a u ki n lô gic và nói riêng là bi n ki u boolean ra
màn hình b ng m t trong hai l nh
Write( KLG) ho c WriteLn( KLG)
2.4.3. Câu l nh If < KLG> Then <Nhóml nh1> Else <Nhóml nh2>
Khi gi i m t s bài toán, ta th ng có các câu bi n lu n nh :
ng 1
u m t K nào ó tho mãn thì . . .
di n t câu này, ta có th dùng câu l nh sau:
IF < KLG> THEN <Nhóml nh>; (*)
Trong câu l nh (*), n u u ki n lô gic úng, nhóm l nh c th c hi n sau ó s
th c hi n l nh ti p theo c a ch ng trình, n u u ki n lô gic không úng, l nh ti p
theo c a ch ng trình c th c hi n.
ng 2
u m t K nào ó tho mãn thì . . . n u không thì . . . . (2)
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 16
di n t câu này, ta có th dùng câu l nh sau:
IF < KLG> THEN <Nhóml nh1> ELSE <Nhóml nh2>; (**)
Trong câu l nh (**), n u u ki n lô gic úng, nhóm l nh 1 c th c hi n, n u
không, nhóm l nh 2 c th c hi n; sau ó s th c hi n l nh ti p theo c a ch ng
trình.
Khi dùng các l nh này, ta ph i tuân theo các quy nh sau:
1. u nhóm l nh có h n m t l nh, ta ph i t trong m t c p Begin-End.
2. Sát tr c Else không có d u ;.
3. Các nhóm l nh trong câu l nh If . . . Then <Nhóm L nh 1> Else <Nhóm l nh
2> c ng có th l i có câu l nh d ng If . . . Then . . . Else . . . khi ó c n quy c
vi c hi u Else nào g n v i If nào. Quy c ó là nh sau: Else g n v i If
ngay tr c nó không n m gi a m t c p Begin-End và ch a có Else.
Ch ng trình gi i ph ng trình b c hai cho trong ph n Bài t p và th c hành c a M c
1 có th dùng minh ho cho quy c này.
Ví d 1
uses crt;
var
m,n:longint;
Begin
clrscr;
write('Nhap so nguyen M = ');readln(m);
write('Nhap so nguyen N = ');readln(n);
if n<>0 then
begin
if m mod n = 0 then
writeln(m,' chia het cho ',n)
else writeln(m,' khong chia het cho ',n);
end
else writeln('Khong chia duoc cho so khong');
readln;
End.
Ví d 2
uses crt;
var
a,b,c:Real;
Begin
clrscr;
write('Nhap so th c A = ');readln(a);
write('Nhap so thuc B = ');readln(b);
write('Nhap so thuc C = ');readln(c);
if (a<=b)and(b<=c) then
writeln(b:0:2, nam giua ,a:0:2, va ,c:0:2);
if (a<=c)and(c<=b) then
writeln(c:0:2, nam giua ,a:0:2, va ,b:0:2);
if (b<=a)and(a<=c) then
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 17
writeln(a:0:2, nam giua ,b:0:2, va ,c:0:2);
if (b<=c)and(c<=a) then
writeln(c:0:2, nam giua ,b:0:2, va ,a:0:2);
if (c<=a)and(a<=b) then
writeln(a:0:2, nam giua ,c:0:2, va ,b:0:2);
if (c<=b)and(b<=a) then
writeln(b:0:2, nam giua ,c:0:2, va ,a:0:2);
readln;
End.
2.4.4. Câu l nh REPEAT <Nhóml nh> UNTIL < KLG>;
2.4.4.1. Gi i thi u l nh
Câu l nh này có tên là l nh l p v i s b c l p không xác nh. M c ích c a nó là
th c hi n m t cách l p i l p l i m t s l n m t nhóm l nh, s l n l p ph thu c vào
t u ki n lô gic.
Khi th c hi n l nh này, các l nh trong nhóm l nh c th c hi n, sau ó, n u KLG
úng thì s th c hi n l nh ti p theo c a ch ng trình còn n u KLG sai, s quay l i
th c hi n nhóm l nh c nh th cho t i khi KLG úng.
2.4.4.2. L nh Break
Trong câu l nh Repeat ... Until ...; khi th c hi n các l nh trong nhóm l nh, n u l nh
Break c th c hi n thì vòng l p k t thúc và sau ó th c hi n l nh ti p theo c a
ch ng trình. Ta có th hi u cách dùng l nh này qua các ch ng trình ví d d i ây.
2.4.4.3. Các ví d
Ví d 1. Nh p d li u úng quy nh
nh Repeat . . . có th dùng b t bu c ng i s d ng ch ng trình nh p d
li u theo úng m t s quy nh nào ó. Nh ng quy nh ó s c th hi n b i m t
u ki n lô gic ( KLG). Mu n ng i s d ng ch ng trình nh p d li u úng theo
quy nh, ta có th dùng n ch ng trình sau:
Repeat
. . . . . . .
{Các l nh nh p d li u}
. . . . . . .
Until DKLG;
Ch ng h n mu n nh p m t s nguyên d ng N không l n h n 100, ta có th dùng
các l nh:
Repeat
clrscr;
write( Nhap so nguyen duong N khong lon hon 100: );
readln(n);
until (n>0)and(n<=100)and(Frac(n)=0);
Khi th c hi n n l nh này, n u nh p không úng m t s nguyên d ng không l n
n 100, ng i nh p s ph i nh p l i cho t i khi úng các l nh ti p theo m i c
th c hi n.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 18
Ví d 2. S e c nh ngh a nh gi i h n
lim (1 + 1/n)n
nà∞
ó là m t s vô t siêu vi t v i giá tr x p x 2,7132... S e có th tính g n úng b ng
công th c
e ≈ 1 + 1/1! + 1/2! + . . + 1/n!
khi ó sai s s không quá 1/n!.
Bài toán t ra là cho tr c m t sai s SS nào ó, ta c n tính s e v i sai s không
quá SS. Thu t toán tính s e d a vào công th c tính g n úng nói trên. Ta s tính e
ng cách c ng liên ti p vào s 1 các s có d ng 1/1!, 1/2!, . ., 1/k!. Sau m i l n
ng, ta só sánh 1/k! v i SS, n u nó nh h n, quá trình tính k t thúc. S b c l p l i
thao tác c ng không xác nh c tr c mà tu thu c giá tr c a sai s SS.
Sau ây là ch ng trình
Uses Crt;
Var
E, SS, THEM:Real;
N:integer;
Begin
Clrscr;
Write('B n c n tính s e v i sai s : '); Readln(SS);
E:=1;N:=0;THEM:=1;
Repeat
THEM:=THEM/(N+1);
E:=E+THEM;
N:=N+1;
Until THEM<SS;
Writeln('e v i sai s không quá ',SS:0:6,' b ng: ',E);
Readln
End.
Ví d 3. Ta bi t r ng n u f(x) là hàm s liên t c có giá tr t i A và B trái d u nhau thì
có giá tr C v i A < C < B sao cho f(C) = 0. Nói chung giá tr c a C không tính c
chính xác mà ch g n úng v i m t sai s SS nào ó cho tr c.
Bài toán t ra là cho tr c m t hàm s liên t c f(X), m t sai s SS và hai s th c A,
B. Hãy ki m tra xem f(A) và f(B) có trái d u nhau hay không. N u chúng trái d u,
hãy tìm nghi m c a ph ng trình f(X) = 0 v i sai s không quá SS.
Thu t toán mà ta gi i thi u ây thu c lo i thu t toán "S n s t trên sa m c". Ý
ng c a lo i thu t toán này là s n m t con s t trên m t sa m c mênh mông, ta
chia ôi sa m c, b ng m t cách nào ó (Ví d nh v tinh!) ta nh n bi t c n a sa
c có s t , ta l i chia ôi n a ó r i l i chia ôi n a có s t . . . m t lúc nào ó
ph n sa m c có s t khá bé thì ta có th d dàng "b t" c s t .
Trong tr ng h p ang xét, trong n [A,B] f(X) có nghi m. Xem n ó nh "sa
c" và nghi m là s t . Chia ôi n ó thành hai n (hai n a sa m c)
[A,(A+B)/2] và [(A+B)/2,B]. N u f((A+B)/2) = 0, ta thu c nghi m c n tìm, n u
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 19
không, n ch a nghi m s là m t trong hai n con mà giá tr c a f t i hai u
mút trái d u nhau. Thay n [A,B] b i n con ch a nghi m và l i ti p t c quá
trình chia ôi nh trên. Có hai kh n ng x y ra:
1. Ho c ta thu c nghi m t i trung m c a m t n con nào ó
2. Ho c ta nh n c m t n ch a nghi m mà dài c a nó nh h n SS. Khi
ó ta có th nh n u trung m c a n ó làm giá tr c a nghi m v i sai s
không quá SS.
l n chia ôi n có nghi m không xác nh tr c c mà ph thu c t ng hàm f
th và sai s SS, nh ng ta k t thúc quá trình ó khi m t trong hai kh n ng 1 ho c
2 x y ra.
Ta xét m t ví d . Gi s C là m t s th c d ng và K là m t s nguyên d ng, ta c n
tìm c n s h c b c K c a C.
Gi s X là c n b c K c a C thì f(X) = XK
– C = 0
u C = 1 rõ ràng X = 1;
u C < 1, ch n a = 0; b = 1. N u C > 1, ch n a = 1; b = C. Nh v y trong tr ng
p C ≠ 1, hàm f trái d u t i hai u mút n [a,b]. B ng cách dùng thu t toán trên,
ta có th tìm X v i sai s nh h n SS cho tr c.
Sau ây là ch ng trình v i K = 2.
uses crt;
var
x,a,b,c,ss,fa,fb,td,ftd:real;
BEGIN
repeat
clrscr;
writeln;
writeln('Tinh can bac hai cua mot so thuc duong C');
write('Nhap so thuc duong C = ');readln(c);
until c>0;
repeat
clrscr;
writeln('Voi sai so ss cho truoc');
write('Nhap sai so SS duong va nho hon 0.001: '); readln(ss);
until (ss>0)and(ss<0.001);
if c=1 then writeln('Can bac 2 cua ',c:0:0,' bang ',1)
else
begin
if c<1 then begin a:=0;b:=1;end else begin a:=1;b:=c;end;
repeat
td:=(a+b)/2;
ftd:=td*td-c;
if ftd=0 then break;
fa:=a*a-c;
fb:=b*b-c;
if fa*ftd<0 then b:=td else a:=td;
until b-a<ss;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 20
writeln('Can bac 2 cua ',c:0:3,' bang ',td:0:3);
end;
readln;
END.
tính c n b c K, khó kh n là vi c tính giá tr hàm f(X) = XK
- C t i các m a và b.
Ta có th thay l nh fa:=a*a-c b ng n ch ng trình trong ó bi n I dùng
m s l n nhân v i a.
fa:=1;i:=0;
Repeat
Inc(i);fa:=fa*a;
Until i=k;
fa:=fa-c;
ng t i v i l nh fb:=b*b-c và ftd:=td*td-c.
2.4.5. Câu l nh While < KLG> Do <Nhóm l nh>;
2.4.5.1. Gi i thi u l nh
Câu l nh này c ng có tên là l nh l p v i s b c l p không xác nh. M c ích c a
nó là th c hi n m t cách l p i l p l i m t s l n m t nhóm l nh, s l n l p ph thu c
vào m t u ki n lô gic.
Khi th c hi n l nh này, n u KLG úng, các l nh trong nhóm l nh c th c hi n,
sau ó, n u KLG v n úng thì s quay l i th c hi n nhóm l nh, n u không, l nh l p
t thúc và th c hi n l nh ti p theo c a ch ng trình.
Khi vi t l nh này, Pascal quy nh n u nhóm l nh có h n m t l nh, nhóm l nh ph i
t gi a m t c p Begin-End.
i l nh Repeat... có th chuy n i thành m t l nh While... và ng c l i theo s
cho trong b ng sau ây trong ó DK là u ki n lô gic.
Repeat
Nhóm l nh
Until DK;
While
Not(DK) Do
Nhóm l nh
While DK Do Nhóm
nh
⇔
n u nhóm
l nh th c
hi n ít
nh t m t
n
Repeat
Nhóm l nh
Until
Not(DK);
Ta có th chuy n vi c dùng l nh Repeat-Until thành l nh While-Do trong các ví d 2
và 3 trên.
2.4.5.2. L nh Break
ng t nh i v i câu l nh Repeat ... Until ...; khi th c hi n các l nh
trong nhóm l nh c a l nh While . . ., n u l nh Break c th c hi n thì vòng l p k t
thúc và sau ó th c hi n l nh ti p theo c a ch ng trình.
2.5. Ki u ký t
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 21
Ta hi u ký t là các ký t thu c b ng mã ASCII. Có t t c 256 ký t v i các s hi u
0 n 255. S hi u c a ký t c g i là mã ASCII (th p phân) c a ký t . Ví d
ký t A có mã ASCII b ng 65, ký t a có mã ASCII b ng 97. Chú ý r ng có m t ký
c bi t g i là ký t tr ng th hi n trong các v n b n là ph n tr ng ng n cách gi a
hai t vi t liên ti p. Ký t này c gõ b ng phím Space - phím dài nh t trên bàn
phím và có mã ASCII b ng 32.
Gi a các ký t có quan h so sánh <. N u C1 và C2 là hai ký t , C1<C2 hay t ng
ng C2>C1 n u C1 ng tr c C2 trong b ng mã ASCII.
Khi mu n vi t các u ki n so sánh gi a các bi n ki u ký t <, >, ≤, ≥, ≠, =, trong
ch ng trình ta vi t t ng ng nh sau:
<, >, <=, >=, <>, =
2.5.1. Cách khai báo
khai báo bi n ki u ký t , ta vi t:
Tên bi n:Char;
Bi n ki u ký t dùng m t byte b nh ghi nh n giá tr .
2.5.2. Các hàm và th t c liên quan
Hàm Chr(X): Có giá tr là ký t có mã ASCII th p phân b ng giá tr c a bi n X
ki u Byte ho c s nguyên X trong ph m vi 0..255.
Hàm Ord(C): Có giá tr là mã ASCII th p phân c a ký t là giá tr c a C.
Hàm Pred(C): Có giá tr b ng ký t ng ngay tr c ký t là giá tr c a C trong
ng mã ASCII.
Hàm Succ(C): Có giá tr b ng ký t ng ngay sau ký t là giá tr c a C trong
ng mã ASCII.
Hàm UpCase(C): Có giá tr b ng ch cái hoa ng v i ký t là giá tr c a C n u ký
là giá tr c a C là ch cái và b ng C n u C không là ch cái.
Hàm ReadKey: có giá tr b ng ký t gõ t bàn phím.
Bi u th c ký t g m các bi n và các ký t liên k t b i các hàm chu n.
2.4.3. Các cách nh n giá tr
ng t nh i v i các bi n ki u s , nh n giá tr cho m t bi n ki u ký t , ta có
th dùng m t trong hai cách:
Dùng l nh gán
Tên bi n:=bi u th c có giá tr là ký t ;
Nh n t bàn phím b ng l nh
Readln/Read(tên bi n);
2.4.4. Cách vi t giá tr bi n ra màn hình
vi t giá tr c a bi n ki u ký t ra màn hình, ta dùng l nh
Write/writeln(Tên bi n ki u ký t );
Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau Write/writeln
ng t ng t nh ã nói cu i m c 2.1.4.
Ta c ng có th dùng cách vi t có quy cách nh khi vi t các s
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 22
Write/writeln(bi u th c ki u ký t :K);
khi ó ta s có K v trí vi t giá tr và giá tr luôn c vi t ph i nh t trong ph m vi
ó.
Chú ý quan tr ng
Trong ch ng trình, khi vi t m t ký t c th , ta ph i vi t ký t ó gi a hai d u '
nh ng khi nh p t bàn phím m t ký t c th , ta ch gõ úng ký t ó.
2.4.5. Các ví d
Ví d 1. Vi t ch ng trình nh p t bàn phím m t ký t C và cho bi t kh n ng nào
trong các kh n ng sau x y ra:
C là ch cái th ng
C là ch cái hoa
C là ch s
C không là ch cái hay ch s
Sau ây là ch ng trình.
uses crt;
var
c:char;
Begin
clrscr;
write('Nhap ky tu C = ');readln(c);
if (c>='a')and(c<='z') then
writeln(c,' la chu cai thuong')
else
if (c>='A')and(c<='Z') then writeln(c,' la chu cai hoa')
else
if (c>='0')and(c<='9') then writeln(c,' la chu so')
else
writeln(c,' khong la chu so, chu cai');
readln;
End.
Ví d 2. Khi th c hi n m t ch ng trình làm m t vi c nào ó ví d gi i ph ng trình
c hai t ng quát, ta muôn th c hi n ch ng trình ó liên ti p v i các d li u vào
khác nhau. Ta có th s a các ch ng trình ã có nh sau.
{Ph n các khai báo thêm bi n YK ki u Char}
. . . . .
Begin
Repeat
<Các l nh th c hi n m t vi c nào ó>
. . . . .
Write( Ban co muon tiep tuc khong (C/K)? );
Yk:=readkey;
Until Upcase(yk)= ;
End.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 23
Ví d 3. Nh p t bàn phím hai ký t X và Y. Hãy cho bi t X hay Y ng tr c trong
ng mã ASCII
uses crt;
var
x,y:char;
Begin
clrscr;
write('Nhap ky tu X = ');readln(x);
write('Nhap ky tu Y = ');readln(y);
if x<y then
writeln(x,' dung truoc ',y,' trong bang ma ASCII');
if x=y then writeln(x,' bang ',y);
if x>y then
writeln(x,' dung sau ',y,' trong bang ma ASCII');
readln;
end.
2.5. Câu l nh CASE <bi uth c> OF <Cáctìnhhu ng> END;
2.5.1. Gi i thi u l nh
Trong khi gi i nhi u bài toán, có th l i gi i ph thu c vào nhi u tình hu ng (vi t t t
là TH), m i tình hu ng c quy nh b i m t s giá tr c a m t bi u th c có giá tr
là nguyên hay ký t . Khi ó ta có th dùng câu l nh này di n t quá trình bi n
lu n.
nh có m t trong hai d ng sau:
ng th nh t
Case Bi uth c Of
TH1:Nhóml nh1;
TH2:Nhóml nh2;
. . .
THK:Nhóml nhK;
End;
i l nh d ng th nh t, khi th c hi n, n u giá tr c a bi u th c thu c tình hu ng I,
1≤I≤K nhóm l nh I c th c hi n, sau ó th c hi n ti p l nh ngay sau l nh Case.
ng th hai
Case Bi uth c Of
TH1:Nhóml nh1;
TH2:Nhóml nh2;
. . .
THK:Nhóml nhK;
Else Nhóml nhK+1;
End;
i l nh d ng th hai, khi th c hi n, n u giá tr c a bi u th c thu c tình hu ng I,
1≤I≤K nhóm l nh I c th c hi n n u không, nhóm l nh K+1 c th c hi n, sau
ó th c hi n ti p l nh ngay sau l nh Case.
Khi dùng l nh này, Pascal có các quy nh sau:
1. Bi u th c ch có th có giá tr ho c ki u ký t ho c ki u s nguyên.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 24
2. Các tình hu ng có th là m t giá tr c th c a bi u th c ho c m t n giá tr
liên ti p mà bi u th c có th nh n. Khi ó, n giá tr c vi t nh sau: Giá
tr u. .Giá tr cu i.
3. u nhóm l nh có h n m t l nh thì nhóm l nh ph i t gi a m t c p Begin-
End.
2.5.2. Các ví d
Ví d 1. Nh p t bàn phím m t ký t và c n thông báo ký t ó là ch cái/ch s /d u
phép toán/tr ng h p khác.
uses crt;
var
ch:char;
Begin
clrscr;
write('Moi ban nhap mot ky tu ');readln(ch);
case Ch of
'A'..'Z','a'..'z':WriteLn('Ky tu la chu cai');
'0'..'9':WriteLn('Ky tu la chu so');
'+','-','*','/':WriteLn('Ky tu la dau phep toan');
else
WriteLn('Ky tu khong la chu cai hay chu so hay dau phep toan');
end;
readln;
End.
Ví d 2. Trên m t b ng ô vuông kích th c MxN, M và N nguyên d ng có giá tr
không l n h n 100000. Các dòng ô vuông ánh s t 1 n M t trên xu ng d i,
các c t ô vuông ánh s t 1 n N t trái sang ph i. M t rô b t ng ô thu c dòng
X, c t Y.
t l nh u khi n chuy n ng c a rô b t g m hai s nguyên H, K, H thu c mi n
giá tr 1..4 ch h ng chuy n ng c a rô b t c n th c hi n: 1 (B c), 2 (Nam), 3
ông) và 4 (Tây), K là m t s nguyên d ng th hi n s b c di chuy n. Sau khi
nh n l nh, rô b t s di chuy n theo h ng H K ô tính t ô [X,Y].
Sau khi th c hi n m t l nh, có hai kh n ng x y ra:
1. Rô b t i ra ngoài b ng.
2. Rô b t v n trong b ng.
Vi t ch ng trình nh p các giá tr M, N, X, Y, H, K t bàn phím và thông báo ra màn
hình các thông tin sau:
Dòng th nh t ghi s 1 ho c 2 tu theo kh n ng 1 ho c 2 x y ra.
u dòng th nh t ghi s 2, dòng th hai ghi ch s dòng và ch s c t c a ô mà rô
t ng sau khi th c hi n l nh.
uses crt;
var
m,n,h,x,y,k,kn:longint;
Begin
clrscr;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 25
write('So dong cua bang M = ');readln(m);
write('So cot cua bang N = ');readln(n);
write('Vi tri dong cua ro bot X = ');readln(x);
write('Vi tri cot cua ro bot Y = ');readln(y);
write('Huong chuyen dong cua ro bot (so nguyen 1..4): ');
readln(h);
write('So buoc chuyen dong cua ro bot: ');readln(k);
case h of
1:
begin
dec(x,k);
if x<1 then kn:=1 else kn:=2;
end;
2:
begin
inc(x,k);
if x>m then kn:=1 else kn:=2;
end;
3:
begin
inc(y,k);
if y>n then kn:=1 else kn:=2;
end;
4:
begin
dec(y,k);
if y<1 then kn:=1 else kn:=2;
end;
else kn:=0;
end;
if kn=0 then writeln('Gia tri huong nhap khong dung');
if kn=1 then writeln('Ro bot ra ngoai bang');
if kn=2 then
begin
writeln('Ro bot o trong bang');
writeln('Vi tri moi cua Ro bot: dong ',x,', cot ',y);
end;
readln;
End.
Ví d 3. Ch ng trình sau nh p t bàn phím tháng trong ph m vi 1..12 và m t n m
nào ó sau ó thông báo ra màn hình s ngày c a tháng ó.
USES CRT;
VAR
T,N,SN:INTEGER;
BEGIN
WRITE('B n c n tính s ngày c a tháng ');READLN(T);
WRITE('N m ');READLN(N);
CASE T OF
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 26
1,3,5,7,8,10,12:SN:=31;
4,6,9,11:SN:=30;
2: IF (N MOD 4 = 0)and(n mod 100<>0) THEN SN:=29 ELSE SN:=28;
END;
WRITELN('S ngày c a tháng ',T,' n m ',N,' b ng ',SN);
READLN;
END.
2.6. Ki u xâu ký t
Xâu ký t là m t dãy các ký t vi t liên ti p nhau, m i ký t có th xu t hi n nhi u
n t i các v trí khác nhau và c ng có th không xu t hi n. S l ng m i ký t k c
l n xu t hi n trong xâu c g i là dài c a xâu. Ta th a nh n m t xâu c bi t
i là xâu r ng. Xâu r ng là xâu không có ký t nào (do ó có dài b ng 0) c
ký hi u là '', xâu này th ng c dùng kh i t o giá tr c a m t xâu ký t c
xây d ng d n qua nhi u b c.
2.6.1. Cách khai báo
Có hai cách khai báo bi n ki u xâu ký t :
Cách th nh t
Tên bi n:String;
i cách khai báo này, xâu có dài không quá 255 ký t . Giá tr c a bi n s c
ghi nh n trong n 256 byte liên ti p trong ó byte u tiên ( ánh s 0) ghi dài
xâu còn các byte ti p theo l n l t m i byte ghi m t ký t thu c xâu theo th t xu t
hi n trong xâu. Ví d xâu Khai báo s c ghi nh n nh sau:
8 K h a i b á o . . .
Cách th hai
Tên bi n:String[N];
i cách khai báo này, xâu có dài không quá N v i N là s có giá tr nguyên
ng c th không l n h n 255. Giá tr c a bi n s c ghi nh n trong n N+1
byte liên ti p trong ó byte u tiên ghi dài xâu còn các byte ti p theo l n l t m i
byte ghi m t ký t thu c xâu theo th t xu t hi n trong xâu.
Ví d theo th ng kê, tên m i ng i Vi t Nam u không quá 30 ký t , ta có th khai
báo nh sau:
Var
Ten:String[30];
u S là m t bi n ki u xâu ký t , v i i là m t s nguyên d ng t 1 n dài c a
S, S[i] ký hi u ký t th i c a xâu S tính t ký t trái nh t c a xâu. Khi ó S[0] ghi
nh n dài c a xâu.
2.6.2. Các hàm chu n và th t c chu n
Phép ghép xâu: N u S1 và S2 là hai xâu, ghép c a S1 và S2, ký hi u S1 + S2, là xâu
nh n c b ng cách ghép liên ti p S1 v i S2.
Ví d n u S1 = 'abbc', S2 = 'cbbd' thì S1+S2 = 'abbccbbd'.
Hàm Length(S): Có giá tr b ng dài c a xâu S.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 27
Hàm Copy(S, M, N): Có giá tr b ng xâu con g m N ký t liên ti p c a xâu S
t u t ký t th M.
Ví d n u S = 'abcdefghijk' thì Copy(S,3,4) = 'cdef'.
u t ký t th M không có N ký t liên ti p thì Copy(S,M,N) cho ta n uôi
a xâu S b t u t ký t th M.
Hàm Pos(S1, S2): Có giá tr b ng s nguyên d ng M là v trí xu t hi n u tiên
a xâu S1 trong xâu S2 n u S1 xu t hi n trong S2 và b ng 0 n u S1 không xu t hi n
trong S2.
Ví d n u S1 = 'ab' và S2 = 'cabddab' thì Pos(S1,S2) = 2 nh ng n u S3 = 'db' thì
Pos(S3,S2) = 0.
Th t c Delete(S, M, N); Th t c này xoá N ký t liên ti p b t u t ký
th M c a xâu S. N u t ký t th M không có N ký t liên ti p thì sau khi th c
hi n l nh Delete(S,M,N), xâu S s b xoá i n cu i b t u t ký t th M.
Ví d . N u S = 'abcdefghijk' thì sau khi th c hi n l nh Delete(S,4,4);, S s là xâu
'abchijk'.
Th t c Insert(S1, S2, N); Th t c này chèn xâu ký t S1 vào tr c ký
th N c a xâu S2.
Ví d . N u S2 = 'abchijk' và S1 = ‘defg’ thì sau khi th c hi n l nh Insert(S1,S2,4), S2
là xâu 'abcdefghijk'.
Th t c Str(X, S); Th t c này bi n s X (ki u s ) thành d ng vi t S c a nó (ki u
xâu).
Trong tr ng h p X là s th c, nh n c úng d ng vi t S c a X, ta c n vi t X
có quy cách.
Ví d n u X = 1.35 thì sau khi dùng l nh Str(X,S), ta nh n c xâu
S = 1.35000...0E000
Mu n nh n c S = '1.35', ta ph i dùng l nh
Str(X:0:2,S);
Th t c Val(S, X, Code); V i th t c này, n u xâu S là d ng vi t c a m t s , k t
qu cho ta s X là d ng s c a S và giá tr c a Code (ki u Integer) s b ng 0 ( úng).
u xâu S không là d ng vi t c a m t s , k t qu cho ta giá tr c a Code khác 0 (sai).
Ví d n u S = '1.35' thì sau khi th c hi n l nh Val(S,X,Code), ta có X = 1.35 và Code
= 0. Nh ng n u S = '1,35' thì sau khi th c hi n l nh Val(S,X,Code), ta có Code ≠ 0
và d nhiên không có giá tr c a X.
2.6.3. Các cách nh n giá tr
ng t nh i v i các bi n ki u s , nh n giá tr cho m t bi n ki u xâu ký t , ta
có th dùng m t trong hai cách:
Dùng l nh gán
Tên bi n:=bi u th c có giá tr là xâu ký t ;
Nh n t bàn phím b ng l nh
Readln/Read(tên bi n);
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 28
Chú ý
ng nh khi s d ng l nh gán cho các bi n s , ta có th gán tr là m t ký t cho m t
bi n xâu ký t nh ng vi c gán tr là m t xâu ký t cho m t bi n ki u ký t là không
p l dù xâu ó có dài b ng 1.
Trong ch ng trình, khi vi t m t xâu ký t c th , ta ph i vi t xâu ký t ó gi a hai
u ' nh ng khi nh p t bàn phím m t xâu ký t c th , ta ch gõ úng xâu ký t ó.
Chú ý quan tr ng
Trong ch ng trình, ghi vi t m t xâu ký t c th , ta ph i vi t ký t ó gi a hai d u '
nh ng khi nh p t bàn phím m t xâu ký t c th , ta ch gõ úng các ký t thu c xâu
ó.
2.6.4. Cách vi t giá tr bi n ra màn hình
vi t giá tr c a bi n ki u xâu ký t ra màn hình, ta dùng l nh
Write/writeln(Tên bi n ki u xâu ký t );
Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau gi a
Write/writeln c ng t ng t nh ã nói cu i m c 2.1.4.
Ta c ng có th dùng cách vi t có quy cách nh khi vi t các s
Write/writeln(bi u th c ki u ký t :K);
khi ó ta s có K v trí vi t giá tr và giá tr luôn c vi t ph i nh t trong ph m vi
ó.
2.6.5. Các ví d
Ví d 1.1. Nh p t bàn phím hai xâu ký t S1 và S2 và so sánh dài hai xâu này.
uses crt;
var
s1,s2:string;
n1,n2:byte;
Begin
clrscr;
write('Nhap xau ky tu thu nhat S1= ');readln(s1);
write('Nhap xau ky tu thu hai S2= ');readln(s2);
if n1<n2 then
writeln('Xau ',s1,' ngan hon xau ',s2);
if n1=n2 then
writeln('Xau ',s1,' dai bang xau ',s2);
if n1>n2 then
writeln('Xau ',s1,' dai hon xau ',s2);
readln;
End.
Ví d 1.2. Nh p xâu ký t S có dài ít nh t b ng 20 và vi t ra màn hình xâu S sau
khi xoá i 5 ký t liên ti p t ký t th 3.
uses crt;
var
s:string;
Begin
clrscr;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 29
repeat
write('Nhap xau ky tu S khong ngan hon 20: ');
readln(s1);
until length(s)>=20;
writeln('Xau nhap vao S = ',s);
delete(s,3,5);
writeln('Xau ',s,' sau khi xoa 5 ky tu lien tiep');
writeln('bat dau tu ky tu thu 3 bang ',s);
readln;
End.
Ví d 1.3. Nh p xâu ký t S có dài ít nh t b ng 20 và vi t ra màn hình n g m
5 ký t liên ti p c a xâu S t ký t th 3.
uses crt;
var
s:string;
Begin
clrscr;
repeat
write('Nhap xau ky tu S khong ngan hon 20: ');
readln(s1);
until length(s)>=20;
writeln('Xau nhap vao S = ',s);
writeln('Doan gom 5 ky tu lien tiep cua xau ',s);
writeln('bat dau tu ky tu thu 3 bang ',copy(s,3,5));
readln;
End.
Ví d 2. Vi t ch ng trình nh p t bàn phím m t ký t C và m t xâu ký t S. Hãy
cho bi t s l n xu t hi n c a C trong S. K t qu thông báo ra màn hình.
gi i bài toán này, ta l n l t xét các ký t c a xâu S b t u t ký t th nh t n
ký t cu i cùng, v i m i ký t ó, ta so sánh v i C, n u hai ký t b ng nhau, ta t ng
l n xu t hi n c a C thêm 1. th hi n vi c xét l n l t t ký t th nh t n ký
cu i, ta dùng câu l nh While trong ó ch s ch y i bi n thiên t 1 n dài
a xâu S.
Sau ây là ch ng trình.
uses crt;
var
c:char;s:string;
n,i,m:byte;
Begin
clrscr;
write('Nhap ky tu C = ');readln(c):
write('Nhap xau ky tu S = ');readln(S):
n:=length(s);
m:=0;i:=1;
while i<=n do
begin
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 30
if s[i]=c then inc(m);
inc(i);
end;
writeln('So lan ',c,' xuat hien trong ',s,' bang ',m);
readln;
end;
Ví d 2'. T ng t nh ví d tr c nh ng ta ch c n bi t ký t c có xu t hi n trong
xâu S không.
uses crt;
var
c:char;
found:boolean;
s:string;
i,n:byte;
Begin
clrscr;
write('Nhap mot ky tu: ');readln(c);
write('Nhap mot xau ky tu: ');readln(s);
n:=length(s);
writeln('Do dai cua xau ',s,' bang ',n);
found:=false;
while i<=n do
begin
if s[i]=c then begin found:=true;break;end;
inc(i);
end;
if not(found) then
writeln('Ky tu ',c,' khong xuat hien trong xau ',s)
else writeln('Ky tu ',c,' xuat hien trong xau ',s)
readln;
End.
Ví d 3. Vi t ch ng trình nh p t bàn phím xâu ký t S. Hãy cho bi t có hay không
t xâu ký t X≠S sao cho S là ghép m t s l n xâu X. N u có xâu X nh v y, ch n
xâu X có dài l n nh t có th c. K t qu thông báo ra màn hình nh sau: N u
không có xâu X nh v y, vi t s 0, n u có, vi t s K là dài xâu X.
Ta có nh n xét sau: n u có xâu X, dài c a xâu X b ng K ph i là c c a N, dài
xâu S và X ph i là n u g m K ký t c a S. Do ó, v i m i giá tr K là c c a
N, ký hi u L = N div K, ta xét xâu S1 là ghép c a L n u g m K ký t c a S.
u S1 = S, ta có n u ó là m t xâu X c n tìm. Vì yêu câu ch n X có dài l n
nh t, ta xét các giá tr K gi m d n, giá tr u tiên tho mãn co X có dài l n nh t.
ghi nh n vi c có/không có xâu X, ta dùng m t bi n ki u Boolean Found mà
Found = True n u có X và b ng False n u không có X.
Sau ây là ch ng trình
uses crt;
var
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 31
s,s1,x:string;
n,i,m,l:byte;
found:boolean;
Begin
clrscr;
write('Nhap xau ky tu S = ');readln(S):
n:=length(s);
found:=false;
for k:=n-1 downto 1 do if n mod k = 0 then
begin
x:=copy(s,1,k);l:=n div k;
s1:='';
for i:=1 to l do s1:=s1+x;
if s1=s then begin found:=true;break;end;
end;
if found then writeln(k) else writeln(0);
readln;
end;
3. CÁC KI U D LI U PH C T P
3.1. D li u ki u m ng
Trong các bài toán, ta th ng g p các dãy s , dãy xâu ký t , b ng s , . . D li u ki u
ng cho phép ta th hi n các i l ng thu c lo i này. th hi n các dãy, ta dùng
ng m t chi u, các b ng g m các dòng và các c t, ta dùng m ng hai chi u.
3.1.1. Cách khai báo
i v i bi n là m ng m t chi u, ta khai báo nh sau:
Tên bi n:Array[CSD..CSC] Of ki u;
u A là m ng m t chi u, ta hình dung nó là m t dãy các ph n t có ch s t CSD
n CSC. Khi ó ph n t có ch s I c ký hi u là A[I].
CSD (ch s u) và CSC (ch s cu i) ch có th là
- Hai s nguyên mà CSD≤CSC, ho c
- Hai ký t thu c b ng mã ASCII mà CSD≤CSC.
Ki u có th là m i ki u mà Pascal ch p nh n tr ki u File (ta s nói n trong cu i
ch ng này).
Ví d 1. Các khai báo sau là h p l :
A:Array[-10..100] Of Real;
B:Array['A'..'Z'] Of Integer;
Ví d 2. V i bài toán cho dãy s nguyên A g m không quá 100 s h ng, các s h ng
có tr tuy t i không quá 1000. . . . th hi n dãy A, ta có th khai báo
A:Array[1..100] Of Integer;
ng nhi u chi u dùng th hi n các b ng s có nhi u ch s .
Ch ng h n khi gi i m t h ph ng trình tuy n tính M ph ng trình v i N n s
a11X1 + a12X2 + . . . +a1NXN = b1
a21X1 + a22X2 + . . . +a2NXN = b2
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 32
. . . . .
aM1X1 + aM2X2 + . . . +aMNXN = bM
ta quan tâm n b ng h s
a11 a12 . . . a1N
a21 a22 . . . a2N
. . . . .
aM1 aM22 . . . aMN
th hi n b ng s này, ta có th dùng m ng hai chi u.
Bi n m ng hai chi u c khai báo nh sau:
Tên bi n:Array[CSD1..CSC1,CSD2..CSC2] Of ki u;
trong ó các CSD (ch s u) và các CSC (ch s cu i) ch có th là
- Hai s nguyên mà CSD≤CSC, ho c
- Hai ký t thu c b ng mã ASCII mà CSD≤CSC.
Ki u có th là m i ki u mà Pascal ch p nh n tr ki u File.
u A là m t m ng hai chi u, ta hình dung A là m t b ng g m các dòng ánh s t
CSD1 n CSC1 và các c t ánh s t CSD2 n CSC2, ch s th nh t là ch s
dòng, ch s th hai là ch s c t. Ph n t dòng I c t J c ký hi u là A[I,J].
Ví d 1. Các khai báo sau là h p l :
A:Array[-10..100,'a'..'z'] Of Real;
B:Array['A'..'Z',-100..100] Of Integer;
Ví d 2. i h ph ng trình tuy n tính nói trên, ta có th th hi n m ng các h s
(gi s M, N ≤ 100) b ng m ng hai chi u
A:Array[1..100,1..100] Of Real;
Chú ý. Trong các bài toán ta th ng g p các gi thi t sau:
- Nh p m t dãy N s , N ≤ 1000, ho c
- Nh p m t b ng s g m M dòng và N c t, M, N ≤ 100
Vi c gi i h n các giá tr c a M và N cho ta bi t mi n bi n thiên c a các ch s c a
các ph n t c a m ng.
Khi khai báo m ng trong các m c Type ho c Var, các giá tr CSD và CSC n lúc ó
u ph i là các h ng s xác nh ch không th là là m t bi n ho c m t bi u th c mà
ta ch a xác nh c giá tr c th . Ví d các khai báo sau s là sai n u tr c ó, giá
tr c a N không c bi t.
B:Array[1..N] Of Integer;
C:Array[1..N] Of Real;
3.1.2. Câu l nh For . . .
3.1.2.1. Gi i thi u l nh
nh này c g i là l nh l p v i s b c l p xác nh. L nh có m t trong hai d ng
sau:
For tênbi n:=CS1 to CS2 Do nhóml nh; (1)
For tênbi n:=CS2 Downto CS1 Do nhóml nh; (2)
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 33
Trong các l nh này, bi n còn th ng c g i là ch s ch y.
Khi vi t l nh này, Pascal quy nh nh sau:
1. Bi n, CS1 và CS2 ph i cùng ki u ch thu c m t trong hai lo i s nguyên
ho c ký t .
2. CS1 và CS2 ph i có giá tr ã bi t tr c khi th c hi n l nh này; CS1≤CS2.
3. u nhóm l nh có h n m t l nh, nhóm l nh ph i t gi a m t c p Begin-
End.
Khi th c hi n l nh (1), v i m i giá tr c a bi n t ng d n t CS1 n CS2, nhóm l nh
c th c hi n. N u t i giá tr nào c a bi n mà khi th c hi n nhóm l nh, l nh Break
c th c hi n thì vòng l p k t thúc và l nh ngay ti p theo vòng l p c th c hi n
ti p.
Khi th c hi n l nh (2), v i m i giá tr c a bi n gi m d n t CS2 n CS1, nhóm l nh
c th c hi n. N u t i giá tr nào c a bi n mà khi th c hi n nhóm l nh, l nh Break
c th c hi n thì vòng l p k t thúc và l nh ngay ti p theo vòng l p c th c hi n
ti p.
3.1.2.2. L nh Break
ng t nh i v i câu l nh Repeat ... Until ...; n u khi th c hi n các l nh trong
nhóm l nh c a l nh For . . ., n u l nh Break c th c hi n thì vòng l p k t thúc và
sau ó th c hi n l nh ti p theo c a ch ng trình.
3.1.3. Cách nh n giá tr cho bi n ki u m ng
u có hai m ng A, B cùng kích th c và ki u ph n t nh nhau ng th i ta ã bi t
giá tr c a B thì ta có th nh n giá tr cho A b ng l nh gán
A:=B;
Th ng ta nh n giá tr c a m ng b ng cách dùng câu l nh l p v i s b c l p xác
nh nh n giá tr cho t ng ph n t . ây là cách nh n giá tr ph bi n nh t. N u
ng là m t chi u, ta dùng m t vòng l p For, n u m ng là hai chi u, ta dùng hai
vòng l p For.
Gi s m ng m t chi u A có N ph n t v i ch s t 1 n N, nh n giá tr cho
ng A, ta dùng l nh
For I:=1 to N do <Nh n giá tr cho ph n t A[I]>
Khi nh n giá tr cho A[I], tu theo ki u d li u c a ph n t , ta có th nh n t bàn
phím ho c b ng l nh gán.
Gi s m ng hai chi u B có M dòng và N c t, nh n giá tr cho m ng B, ta dùng
nh
For I:=1 to M do
For J:=1 to N do <Nh n giá tr cho ph n t B[I,J]>
Khi nh n giá tr cho B[I,J], tu theo ki u d li u c a ph n t , ta có th nh n t bàn
phím ho c b ng l nh gán.
Chú ý. i v i bi n ki u m ng, vi c dùng l nh
Read(tên bi n); ho c ReadLn(tên bi n);
không h p l .
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 34
Ví d . n ch ng trình sau cho phép ta nh p m t dãy A g m N s nguyên v i
N≤100 các s h ng có tr tuy t i không l n h n 1000.
Var
N,I:Integer;
A:Array[1..100] Of Integer;
. . . . . . . . . . . . . . .
Write('Nh p s l ng s h ng c a dãy, N = ');Readln(N);
For i:=1 to N Do
Begin
Write('S h ng th ',i,' b ng ');Readln(A[i]);
End;
. . . . . . . . . . . . . . .
3.1.4. Cách vi t giá tr m ng ra màn hình
Mu n vi t giá tr m ng ra màn hình, ta ph i vi t giá tr t ng ph n t c a m ng b ng
cách dùng câu l nh For.
Gi s m ng m t chi u A có N ph n t v i ch s t 1 n N, vi t giá tr m ng A,
ta dùng l nh
For I:=1 to N do <Vi t giá tr ph n t A[I]>
Gi s m ng hai chi u B có M dòng và N c t, vi t giá tr m ng B, ta dùng l nh
For I:=1 to M do
For J:=1 to N do <Vi t giá tr ph n t B[I,j]>
Chú ý. i v i bi n ki u m ng, vi c dùng l nh
Write(tên bi n); ho c WriteLn(tên bi n);
không h p l .
3.1.5. Các ví d
Ví d 1. Vi t ch ng trình nh p t bàn phím m t ký t C và m t xâu ký t S. Hãy
cho bi t s l n xu t hi n c a C trong S. K t qu thông báo ra màn hình.
gi i bài toán này, ta l n l t xét các ký t c a xâu S b t u t ký t th nh t n
ký t cu i cùng, v i m i ký t ó, ta so sánh v i C, n u hai ký t b ng nhau, ta t ng
l n xu t hi n c a C thêm 1. th hi n vi c xét l n l t t ký t th nh t n ký
cu i, ta dùng câu l nh For trong ó ch s ch y bi n thiên t 1 n dài c a xâu
S.
Sau ây là ch ng trình.
uses crt;
var
c:char;s:string;
n,i,m:byte;
Begin
clrscr;
write('Nhap ky tu C = ');readln(c):
write('Nhap xau ky tu S = ');readln(S):
n:=length(s);
m:=0;
for i:=1 to n do if s[i]=c then inc(m);
writeln('So lan ',c,' xuat hien trong ',s,' bang ',m);
readln;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 35
end;
Ví d 2. Nh p t bàn phím xâu ký t S và cho bi t m i ch cái th ng xu t hi n
trong S bao nhiêu l n, m i ch cái hoa xu t hi n trong S bao nhiêu l n.
ghi nh n s l n xu t hi n các ch cái th ng, ta dùng m ng
CT:Array['a'..'z'] of Byte;
ghi nh n s l n xu t hi n các ch cái hoa, ta dùng m ng
CH:Array['A'..'Z'] of Byte;
i m i ký t S[I] c a xâu S, 1 ≤ I ≤ N = Length(s), n u S[I] là ch cái th ng, t ng
CT[S[I]] m t n v , n u S[I] là ch cái hoa, t ng CH[S[I]] m t n v .
Sau ây là ch ng trình
uses crt;
var
ct:array['a'..'z'] of Byte;
ch:array['A'..'Z'] of Byte;
n,i:byte;c:char;
s:string;
Begin
clrscr;
write('Nhap xau ky tu S = ');readln(s);
n:=length(s);
for c:='a' to 'z' do ct[c]:=0;
for c:='A' to 'Z' do ch[c]:=0;
for i:=1 to n do
begin
if (s[i]>='a')and(s[i]<='z') then inc(ct[s[i]);
if (s[i]>='A')and(s[i]<='Z') then inc(ch[s[i]);
end;
for c:='a' to 'z' do if ct[c]>0 then
writeln('Chu cai thuong ',c,' xuat hien ',ct[c],' lan');
writeln('Cac chu cai thuong khac khong xuat hien');
for c:='A' to 'Z' do if ch[c]>0 then
writeln('Chu cai hoa ',c,' xuat hien ',ch[c],' lan');
writeln('Cac chu cai hoa khac khong xuat hien');
readln;
End.
Ví d 3. Vi t ch ng trình nh p s nguyên d ng N<=1000 và dãy N s nguyên
ng A[1], . ., A[N], các A[i] ≤ 1000. Hãy cho bi t dãy s ó có bao nhiêu giá tr
khác nhau và m i giá tr ó là giá tr c a bao nhiêu s h ng c a dãy.
Ngoài m ng A dùng th hi n dãy A, ta dùng m ng
B :array[1..1000] of Word;
trong ó B[I] là s l ng các s h ng có giá tr b ng I. Bi n S ghi nh n s giá tr khác
nhau c a dãy.
Ví d 21
uses crt;
var
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 36
a,b:array[1..1000] of word;
n,i,s:word;
BEGIN
REPEAT
CLRSCR;
write('Moi ban nhap so nguyen duong N <= 1000 '); readln(n);
until (n>0)and(n<=1000);
writeln('Moi ban nhap ',N,' so nguyen duong <= 1000');
for i:=1 to n do
repeat
write('A[',I,'] = ');readln(a[i]);
until (a[i]>0)and(a[i]<=1000);
s:=0;
for i:=1 to 1000 do b[i]:=0;
for i:=1 to n do
begin
if b[a[i]]=0 then inc(s);
inc(b[a[i]]);
end;
writeln('Day co ',s,' gia tri khac nhau');
writeln('Cac gia tri do la:');
for i:=1 to 1000 do if b[i]>0 then
writeln('Co ',b[i],' so hang co gia tri bang ',i);
readln;
END.
3.2. D li u ki u t p h p
li u ki u t p h p dùng th hi n các i l ng là t p h p. Nh ng khác v i khái
ni m t p h p trong toán h c truy n th ng bao g m c các t p h p vô h n và h u h n
i s ph n t b t k , trong Pascal ch ch p nh n các t p h p thoã mãn các u ki n
sau:
1. i ph n t ph i cùng ki u d li u
2. Mi n giá tr c a ki u không quá 256 giá tr
3. ph n t c a t p h p không quá 256.
3.2.1. Cách khai báo
Ta có th khai báo trong m c Var
Tên bi n:SET OF ki u;
Nh ã nói trên, ki u trong khai báo ch mi n mà ph n t thu c t p h p bi n thiên
không th có quá 256 ph n t . Nh v y ta có th dùng các ki u Byte, Char ho c m t
ki u li t kê do ta khai báo trong m c Type.
Các khai báo nh sau là không h p l :
SO:SET OF Integer;
ST: SET OF Real;
STR: SET OF String;
Các khai báo sau là h p l :
SO:SET OF Byte;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 37
KT:SET OF Char;
CS:SET OF 0..9;
p tr ng c ký hi u là [].
u ta bi t các ph n t c a m t t p h p, ta có th li t kê m i ph n t ó trong c p
u ngo c vuông, khi ó n u các giá tr là m t n liên ti p các s nguyên ho c ký
, ta ch c n vi t
<Giátr u>..<Giátr cu i>
Ví d
chuthuong:=['a'..'z'];
chuhoa:=['A'..'Z'];
chuso:=['0'..'9'];
pheptoan:=['+','-','*','/'];
Ta c ng có th khai báo các bi n sau:
p ch g m các ch cái th ng:
ct:set of 'a'..'z';
p ch g m các ch cái hoa:
ch:set of 'A'..'Z';
p ch g m các ch s :
chs:set of '0'..'9';
6.2. Các phép toán t p h p và các hàm liên quan
i v i các bi n ki u t p h p có cùng ki u các ph n t , ta có th th c hi n các phép
toán: Phép h p ký hi u +, Phép giao ký hi u *, Phép tr ký hi u -.
Hàm thu c x IN A: Hàm nh n giá tr True n u x là ph n t thu c t p A và False
trong tr ng h p ng c l i.
ng sau ây cho ta th y s khác nhau gi a cách vi t trong Toán h c và trong Pascal
Toán h c Pascal
A∪B A+B
A∩B A*B
A-B A-B
x∈A x In A
y∉A Not(y in A)
6.3. Cách nh n giá tr cho bi n ki u t p h p
i v i các bi n ki u t p h p, ta ch có th nh n giá tr b ng l nh gán
Tên bi n t p h p:=T p h p cùng ki u ph n t ;
Ví d : C:=A+B; ho c D:=[ ];.
Chú ý. i v i bi n ki u t p h p, vi c dùng l nh
Read(tên bi n); ho c ReadLn(tên bi n);
không h p l .
6.4. Cách vi t giá tr c a t p h p ra màn hình
vi t t p h p ra màn hình ta không c phép dùng l nh
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 38
Write/Writeln(tên bi n t p h p);
Tu theo ki u ph n t c a t p h p, ta ph i vi t t ng ph n t c a t p h p
ng cách cho m t ch s ch y qua mi n giá tr c a ki u ph n t và dùng
hàm thu c ki m tra xem giá tr nào c a ch s ch y thu c t p h p thì
vi t giá tr ó ra.
Ví d 1. N u ta khai báo
ct:set of 'a'..'z';
thì vi t t p CT ra màn hình, ta có th dùng n ch ng trình sau:
Writeln('Tap CT gom cac ky tu:');
For c:= to do if c in ct then write(c:2);
Ví d 2. Vi t ch ng trình nh p t bàn phím m t ký t C và cho bi t kh n ng nào
trong các kh n ng sau x y ra:
C là ch cái th ng
C là ch cái hoa
C là ch s
C là d u phép toán s h c +, -, *, /
Sau ây là ch ng trình.
uses crt;
const
chuthuong:set of char=['a'..'z'];
chuhoa:set of char=['A'..'Z'];
chuso:set of char=['0'..'9'];
pheptoan:set of char=['+','-','*','/'];
var
c:char;
Begin
clrscr;
write('Nhap ky tu C = ');readln(c);
if c in chuthuong then writeln(c,' la chu cai thuong')
else
if c in chuhoa then writeln(c,' la chu cai hoa')
else
if c in chuso then writeln(c,' la chu so')
else
if c in pheptoan then writeln(c,' la dau phep toan')
else
writeln(c,' khong la dau phep toan, chu so, chu cai');
readln;
End.
Ví d 3. Vi t ch ng trình nh p s nguyên d ng N<=1000 và dãy N s nguyên
ng A[1], . ., A[N], các A[i] ≤ 200. Hãy cho bi t dãy s ó có bao nhiêu giá tr
khác nhau và m i giá tr là giá tr c a các s h ng nào c a dãy.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 39
Ch ng trình sau ây s gi i bài toán này. Tuy nhiên ta c n chú ý r ng các khai báo
mà ta ti n hành c trong ch ng trình này c bi t vi c dùng d li u ki u t p h p
là ch p nh n c do gi thi t v d li u. N u không có các u ki n ó, cách t
ch c d li u ph i khác.
Uses Crt;
Var
n,i,j,k,dem,skn:Integer;
A:Array[1..1000] of Byte;
kn:Set of Byte;
Begin
ClrScr;
Write('Nh p s l ng s h ng c a dãy, N = ');Readln(N);
For i:=1 to N Do
Begin
Write('S h ng th ',i,' b ng ');Readln(A[i]);
End;
kn:=[];skn:=0;
For i:=1 to n Do
If Not(A[i] in kn) Then Begin kn:=kn+[a[i]];skn:=skn+1;End;
KN ∪ {A[I]}
dem:=0;
Writeln('Có t t c ',skn,' giá tr khác nhau');
For i:=1 to N Do
If A[i] In kn Then
Begin
dem:=dem+1;
Write('Giá tr khác nhau th ',dem,' là ',A[i],' và b ng các s
ng th : ');
For J:=I To N Do If A[j]=A[i] Then Write(J:4);Writeln;
kn:=kn-[A[i]];
End;
Readln
End.
3.3. D li u ki u b n ghi
li u ki u b n ghi dùng th hi n m t lo t các i t ng, các i t ng này u
có cùng m t s thu c tính mà m i thu c tính nói chung có ki u d li u khác nhau.
Ví d khi xem xét m thi h c k c a các h c sinh trong m t l p, i v i m i h c
sinh, ta s quan tâm n các thu c tính nh h và tên, ngày sinh, nam hay n , các
m c a các môn thi, . . .
t ví d khác, khi xem xét doanh s c a m t c a hàng, ta quan tâm n t p các hoá
n bán hàng, m i hoá n u có các thu c tính nh tên hàng, n giá, ch ng lo i,
l ng bán, giá thành, ng i bán, ng i mua, ngày bán, . . .
th hi n hàng lo t i t ng nh v y, ta có th dùng d li u ki u b n ghi
(Record). M i i t ng c n qu n lý s c th hi n b ng m t b n ghi. M i b n ghi
m m t s tr ng (Field). M i thu c tính c th hi n b i m t tr ng (Field) c a
n ghi, m i tr ng c khai báo d i d ng
Tên tr ng:Ki u;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 40
3.3.1. Cách khai báo
i bi n ki u b n ghi ta có th khai báo
Tên bi n: RECORD
Tên tr ng 1:ki u;
. . . . . . . . .
Tên tr ng k:ki u;
END;
Do d li u ki u b n ghi th ng dùng mô t m t lo t i t ng nên ta th ng khai
báo m t ki u b n ghi trong m c Type và sau ó trong m c Var ta khai báo các bi n
liên quan.
Type
Tênki ub nghi = RECORD
Tên tr ng 1:ki u tr ng 1;
. . . . . . . . .
Tên tr ng k:ki u tr ng k;
END;
Var
tên bi n: tênki ub nghi;
tênm ng:array[1..maxN] of tênki ub nghi;
Ví d 1. th hi n lo i i t ng sinh viên v i các thu c tính c n qu n lý là h và
tên, ngày sinh, nam hay n , các m thi gi i tích, i s , tri t h c, v t lý, ta có th
khai báo nh sau:
Type
SV = Record
HT:String[30];
NS:String[8];
NN:Boolean;
GT,DS,TH,VL:Real;
End;
{quy c N - True, Nam - False}
Var
A,B:SV;
Lop:Array[1..60] of SV;
Ví d 2. th hi n các m trên m t ph ng to , ta có th khai báo nh sau:
Type
Diem = Record
x,y:real;
End;
Var
M:diem;
DG:array[1..100] of diem;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 41
{ a giác có s nh không quá 100}
u A là bi n ki u b n ghi và X là tên m t tr ng c a A, khi vi n n tr ng X, ta
vi t A.X.
3.3.2. Cách nh n giá tr
nh n giá tr cho bi n ki u b n ghi, có hai cách:
Dùng l nh gán: n u A và B là hai bi n ki u b n ghi nh nhau và ta ã bi t giá tr c a
B thì ta có th gán giá tr c a B cho A b ng l nh
A:=B;
Nh n giá tr c a t ng tr ng. Khi ó, cách nh n giá tr c a tr ng s theo quy nh
a ki u d li u t ng ng.
Ví d 1. n qu n lý m t l p có N h c sinh, N<=60. V i m i h c sinh c n qu n lý
các y u t H và Tên, Tu i, a Ch , m Toán, m V n, Phân Lo i. Phân lo i
c tính nh sau:
u Toán+V n<10 Thì Phân lo i='KEM'
u (Toán+V n<14)và(Toán+V n>=10) Thì Phân lo i='TRUNG BINH'
u (Toán+V n>=14)và(Toán+V n<18) Thì Phân lo i='KHA'
u Toán+V n>18 Thì Phân lo i='GIOI'
Chú ý r ng trong các y u t c n qu n lý thì ch có 5 y u t u là c l p còn y u t
phân lo i có th tính c theo các m Toán và V n. th hi n m t h c sinh, ta
dùng ki u d li u b n ghi v i 6 tr ng t ng ng th hi n sáu y u t c n qu n lý c a
t h c sinh.
Ch ng trình qu n lý l p h c
Uses CRT;
Type
HS= Record
HT:String[30];
TUOI:Byte;
DC:String[50];
T,V:Real;
PL:String[10];
End;
Var
LOP:Array[1..60] Of HS;
N,I,J:Byte;
X:HS;
Begin
Clrscr;
Repeat
Write('So luong hoc sinh trong lop N = ');Readln(N);
Until (N>0)And(N<=60);
For I:=1 to N Do
Begin
Writeln('Cac so lieu ve hoc sinh thu ',I,': ');
Write('Ho va ten: ');Readln(lop[i].HT);
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 42
Write('Tuoi: ');Readln(lop[i].TUOI);
Write('Dia chi: ');Readln(lop[i].DC);
Write('Diem Toan: ');Readln(lop[i].T);
Write('Diem Van: ');Readln(lop[i].V);
If lop[i].T+lop[i].V<10
Then lop[i].pl:='KEM';
If (lop[i].T+lop[i].V>=10)And(lop[i].T+lop[i].V<14)
Then lop[i].pl:='TRUNG BINH';
If (lop[i].T+lop[i].V>=14)And(lop[i].T+lop[i].V<18)
Then lop[i].pl:='KHA';
If lop[i].T+lop[i].V>=18 Then lop[i].pl:='GIOI';
End;
ClrScr;
Writeln('Danh sach phan loai hoc sinh trong lop:');
For I:=1 To N Do
Writeln(lop[i].HT:30,' - Phan loai: ',lop[i].pl);
Readln;
End.
3.3.3. Câu l nh WITH
Trong ch ng trình c a ví d 1, ta th y sau câu l nh For . . . m i khi c p n m t
tr ng c a bi n ki u b n ghi Lop[i], ta u ph i vi t Lop[i].têntr ng
Có bao nhiêu tr ng c n xem xét, ta ph i vi t kèm b y nhiêu l n lop[i].
Câu l nh sau ây có th xem nh m t cách Pascal giúp ta t tên bi n ki u b n ghi
“làm th a s chung” khi c n nh c n nhi u tr ng c a cùng m t bi n ki u b n ghi.
WITH <tênbi nki ub nghi> DO <Nhóm l nh>;
i câu l nh này, trong nhóm l nh, khi vi t m t tr ng c a bi n b n ghi, ta ch c n
vi t tên tr ng ó.
u nhóm l nh có h n m t l nh, các l nh này ph i t trong m t c p Begin-End;
Ví d 2. Ta có th vi t l i ch ng trình trong Ví d 1 nh sau:
Uses CRT;
Type
HS= Record
HT:String[30];
TUOI:Byte;
DC:String[50];
T,V:Real;
PL:String[10];
End;
Var
LOP:Array[1..60] Of HS;
N,I,J:Byte;
X:HS;
Begin
Clrscr;
Repeat
Write('So luong hoc sinh trong lop N = ');Readln(N);
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 43
Until (N>0)And(N<=60);
For I:=1 to N Do With lop[i] Do
Begin
Writeln('Cac so lieu ve hoc sinh thu ',I,': ');
Write('Ho va ten: ');Readln(HT);
Write('Tuoi: ');Readln(TUOI);
Write('Dia chi: ');Readln(DC);
Write('Diem Toan: ');Readln(T);
Write('Diem Van: ');Readln(V);
If T+V<10 Then pl:='KEM';
If (T+V>=10)And(T+V<14) Then pl:='TRUNG BINH';
If (T+V>=14)And(T+V<18) Then pl:='KHA';
If T+V>=18 Then pl:='GIOI';
End;
ClrScr;
Writeln('Danh sach phan loai hoc sinh trong lop:');
For I:=1 To N Do
Writeln(lop[i].HT:30,' - Phan loai: ',lop[i].pl);
Readln;
End.
3.4. File v n b n
3.4.1. Công d ng c a d li u ki u file
Trong các ch ng trình tr c, nhi u khi ta m t r t nhi u th i gian nh p d li u t
bàn phím. Các d li u ó c ng nh các k t qu thu c u m t sau khi th c hi n
xong ch ng trình. ó là u b t h p lý. D li u ki u file cho phép ta l u l i các
thông tin d i d ng file trên các a có th dùng lâu dài.
3.4.2. C u trúc c a file v n b n
File v n b n (File Text) là file c c u t o t các ký t thu c b ng mã ASCII, các
ký t này c s p x p thành các dòng (Line), m i dòng có dài nói chung khác
nhau th m chí có th có dòng tr ng.
Các file này c g i là các file truy nh p tu n t có ngh a là ta ch có th c nó t
u cho n lúc không mu n c ti p ho c h t file. Tuy nhiên lo i file này r t thu n
ti n cho vi c t ch c d li u cho các ch ng trình.
3.4.3. Cách khai báo
Mu n có m t bi n ki u file v n b n, ta có th khai báo trong m c Var
Tên bi n file:TEXT;
khi ó ta có m t bi n mà giá tr c a nó là m t file v n b n.
3.4.4. Cách t o l p file v n b n
t o l p m t file v n b n, có hai cách chính.
Cách th nh t. Ta có th dùng m t h so n th o v n b n b t k , ch ng h n so n th o
a chính Pascal t o l p file v n b n theo c u trúc c mô t c a file ó.
Ví d , C n t o l p m t file v n b n v i tên DAYSN.DAT ghi các thông tin v m t
dãy s nguyên có N s h ng, N≤100 và các s h ng có tr tuy t i không l n h n
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 44
1000. Dòng th nh t c a file ghi s N. Trong N dòng ti p theo, m i dòng ghi m t s
ng c a dãy l n l t t s h ng th nh t n s h ng th N.
Ta có th làm nh sau: m m t màn hình so n th o m i, ch n m t s N≤100, ví d
ch n N=10 và gõ dòng th nh t s 10, sau ó trong 10 dòng ti p theo, m i dòng gõ
t s nguyên có tr tuy t i không l n h n 1000. Gõ phím F2 và gõ tên file
DAYSN.DAT r i gõ Enter.
Cách t o l p file này th ng dùng t o các d li u nh th ch ng trình khi
ch ng trình c n a d li u vào t file v n b n.
Cách th hai. Dùng nhóm b n l nh sau c a Pascal:
ASSIGN(Tên bi n File,’Tên file’);
REWRITE(Tên bi n File);
. . . . . . . . . .
WRITE/WRITELN(Tên bi n File,bi n ho c giá tr ki u n gi n);
{WRITE/WRITELN(Tên bi n File,bi n ho c giá tr ki u n gi n:K);}
. . . . . . . . . .
CLOSE(Tên bi n File);
Chú ý
Khi dùng ch ng trình t o l p m t file v n b n, th ng ta ã có ý nh tr c v
u trúc c a file này, c n c vào c u trúc ó, ta s dùng các l nh thích h p. i v i
file v n b n, có hai cách vi t vào file: Write có ngh a là n u vi t ti p thì vi t trên
cùng m t dòng c a file, còn Writeln có ngh a là n u vi t ti p thì vi t vào u dòng
ti p theo c a file.
nh WRITELN(Tên bi n File); có ngh a là xu ng dòng n u l nh vi t vào file tr c
ó là Write; có ngh a là vi t vào file m t dòng tr ng n u l nh vi t vào file tr c ó là
Writeln.
u tên file là xâu ký t r ng, vi c vi t này chính là vi t ra màn hình.
Th c ra H u hành MSDOS quan ni m màn hình là m t file v n b n c bi t. Do
ó, th c ch t vi c vi t ra màn hình là tr ng h p riêng c a vi c vi t ra file v n b n.
Tuy nhiên do ta h c cách vi t ra màn hình tr c, nên t nay ch c n chú ý m i cách
vi t vào file (k c cách vi t có quy cách) t ng t nh vi t ra màn hình.
Cách t o l p file này th ng dùng ghi nh n các thông tin thu c trong quá trình
ch y ch ng trình ho c t o l p các file d li u l n.
Ví d 1. Hãy t o l p m t file v n b n có tên DAYSN.DAT ghi các thông tin v m t
dãy s nguyên có N s h ng, N≤3000 và các s h ng có tr tuy t i không l n h n
1000. Dòng th nh t ghi s nguyên d ng N. Trong các dòng ti p theo, ghi N s
nguyên mà m i dòng g m 10 s tr ra có th dòng cu i cùng, hai s liên ti p trên m t
dòng cách nhau ít nh t m t ký t r ng.
Sau ây là ch ng trình làm vi c này.
Uses Crt;
Var
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 45
N,I,X:Integer;
F:Text;
Begin
ClrScr;
Write('B n c n nh p bao nhiêu s , N = ');Readln(N);
Assign(F,'DAYSN.DAT');
Rewrite(F);
Writeln(F,N);
For I:=1 To N Do
Begin
Write('Nh p s th ',I,': ');Readln(X);
Write(F,X,' ');
If I Mod 10 = 0 Then Writeln(F);
End;
Close(F);
End.
Sau khi th c hi n ch ng trình này, ta nh n c file có tên DAYSN.DAT trong th
c ta ang làm vi c v i Pascal. ki m tra k t qu , ta có th a con tr n sau
dòng END. c a ch ng trình và gõ t h p phím Ctrl+K+R, gõ tên file DAYSN.DAT
i gõ Enter. File này s c a ra màn hình t i v trí c a con tr . Ta c ng có th
a con tr n ph n ghi tên file và gõ t h p phím Ctrl+Enter.
Ví d 2. Hãy t o l p m t file v n b n có tên MANG.DAT trong ó dòng th nh t ghi
hai s nguyên d ng M, N<=100. Trong M dòng ti p theo, dòng th I ghi N s
nguyên l n l t là các ph n t A[I,1], . ., A[I,N] c a dòng th I c a m t m ng A, hai
liên ti p trên m t dòng cách nhau ít nh t m t ký t r ng.
Sau ây là ch ng trình làm vi c này.
Uses Crt;
Var
M,N,I,J,X:Integer;
F:Text;
Begin
ClrScr;
Write('B n c n nh p m ng có s dòng M = ');Readln(M);
Write('B n c n nh p m ng có s c t N = ');Readln(N);
Assign(F,'MANG.DAT');
Rewrite(F);
Writeln(F,M,' ',N);
For I:=1 To M Do
Begin
For J:=1 To N Do
Begin
Write('A[ ',I,',',J,'] = ');Readln(X);
Wrtie(F,X,' ');
End;
Writeln(F);
End;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 46
Close(F);
End.
Chú ý. Các ch ng trình trên có th s a t o m t m ng ng u nhiên g m các s
nguyên. Ví d n u ta mu n m ng có s dòng và s c t là m t s nguyên d ng ng u
nhiên không quá 100 còn các ph n t c a m ng là các s nguyên ng u nhiên trong
ph m vi t -1000 n 1000, ta có th dùng ch ng trình sau:
Uses Crt;
Var
M,N,I,J,X:Integer;
F:Text;
Begin
ClrScr;
Randomize;
{l nh này cho phép kh i t o quá trình sinh ng u nhiên}
M:=Random(100)+1;N:=Random(100)+1;
Assign(F,'MANG.DAT');
Rewrite(F);
Writeln(F,M,' ',N);
For I:=1 To M Do
Begin
For J:=1 To N Do
Begin
X:=random(2001)-1000;
Wrtie(F,X,' ');
End;
Writeln(F);
End;
Close(F);
End.
3.4.5. c thông tin t file v n b n
Tr ng h p 1: Không bi t h n v c u trúc c a file
u không bi t c u trúc c a file, ta ch có th c l n l t t dòng u tiên n dòng
cu i cùng c a file và trên m i dòng, t ng ký t t trái sang ph i.
Nhóm b n l nh sau c a Pascal cho phép ta c t ng ký t t file.
ASSIGN(Tên bi n File,'Tên file');
RESET(Tên bi n File);
. . . . . . . . . .
READ(Tên bi n File,Bi n ki u Char);
. . . . . . . . . .
CLOSE(Tên bi n File);
Ngoài ra, do file v n b n c c u t o t các ký t c s p x p thành các dòng
không nh nhau, vi c c file khi ti n hành tu n t t ng ký t v n có m t con tr file
th hi n v trí ký t ang c c.
Pascal có các hàm chu n sau ph c v cho quá trình c này.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 47
Hàm SEEKEOF(tên bi n file): Có giá tr ki u Boolean b ng True n u con
tr file v trí cu i file và False n u con tr file ch a v trí cu i file.
Hàm EOLN(tên bi n file): Có giá tr ki u Boolean b ng True n u con tr
file v trí cu i dòng và False n u con tr file ch a v trí cu i dòng.
Hàm SEEKEOLN(tên bi n file): Có giá tr ki u Boolean b ng True n u con
tr file v trí cu i dòng và False n u con tr file ch a v trí cu i dòng.
Ví d 3. Gi s có m t file v n b n có tên VB.TXT. Ta c n bi t m i ch cái ti ng
Anh xu t hi n trong file này bao nhiêu l n. K t qu ghi ra file XH.TXT nh sau: v i
i ch cái vi t ra m t dòng tên ch cái, ti p theo là s l n xu t hi n c a nó.
Ch ng trình sau s gi i bài toán này.
Uses Crt;
Var
F:Text;
A:Array['A'..'Z'] Of LongInt;
C:Char;
Begin
FillChar(A,SizeOf(A),0);
{L nh này t ng ng v i For c:= to do A[c]:=0}
Assign(F,'VB.TXT');
Reset(F);
While Not(SeekEof(F)) Do
begin
While not(Eoln(F)) do
begin
Read(F,C);
If (Upcase(C)>='A')AND(Upcase(C)<='Z')
then Inc(A[Upcase(C)]);
End;
Readln(F);
End;
Close(F);
assign(f, xh.txt );rewrite(f);
Writeln(f,'S l n xu t hi n các ch cái là');
For C:='A' To 'Z' Do Writeln(f,C,' ',A[C]);
close(f);
End.
Tr ng h p 2: Bi t thêm c u trúc c a file
Tr ng h p này x y ra khi ta dùng file v n b n a d li u vào ch ng trình. Khi
ó, ng i ta th ng nói r t chính xác v c u trúc file.
Các c u trúc ph bi n th ng là
1. File ch ghi các s . Khi ó, các s liên ti p bao gi c ng cách nhau ít nh t m t ký
r ng. C n c vào cách mô t file ta s c các s ra các bi n có ki u phù h p v i
mô t .
ng d n khi c các s
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 48
1. N u m i dòng ch ghi m t s , dùng l nh
Readln(Tên bi n file,bi n ki u s );
2. N u bi t tr c s l ng s ghi trong file, có bao nhiêu s dùng b y nhiêu l n
nh
Read(tenbienfile,bienkieuso);
ta s c c các s .
3. N u m i dòng ghi nhi u s , v i m i dòng, dùng nhóm l nh
While not(seekeoln(tenbienfile))
Do read(tenbienfile,bienkieuso);
Readln(tenbienfile);
Ví d 4. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng có tr tuy t
i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s h ng d ng và bao nhiêu
h ng âm. D li u vào c cho b i file v n b n DAYSN.DAT trong ó dòng th
nh t ghi s N, trong N dòng ti p theo, dòng th I ghi s h ng th I c a dãy. K t qu
ghi ra file v n b n KQ.TXT nh sau: dòng th nh t ghi s l ng s h ng d ng,
dòng th hai ghi s l ng s h ng âm.
Sau ây là ch ng trình
const
fi='daysn.dat';
fo='kq.txt';
var
f:text;
n,i:byte;
a:array[1..100] of integer;
sd,sa:byte;
Begin
Assign(f,fi);reset(f);
readln(f,n);
for i:=1 to n do readln(f,a[i]);
close(f);
sd:=0;sa:=0;
for i:=1 to n do
begin
if a[i]>0 then inc(sd);
if a[i]<0 then inc(sa);
end;
assign(f,fo);rewrite(f);
writeln(f, So so hang duong bang ,sd);
writeln(f, So so hang am bang ,sa);
close(f);
End.
Ví d 4’. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng
có tr tuy t i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s
ng d ng và bao nhiêu s h ng âm. D li u vào c cho b i file v n
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 49
n DAYSN.DAT trong ó dòng th nh t ghi s N, trong m t s dòng ti p
theo ghi N s , s th I là s h ng th I c a dãy. K t qu ghi ra file v n b n
KQ.TXT nh sau: dòng th nh t ghi s l ng s h ng d ng, dòng th hai
ghi s l ng s h ng âm.
const
fi='daysn.dat';
fo='kq.txt';
var
f:text;
n,i:byte;
a:array[1..100] of integer;
sd,sa:byte;
Begin
Assign(f,fi);reset(f);
readln(f,n);
for i:=1 to n do read(f,a[i]);
close(f);
sd:=0;sa:=0;
for i:=1 to n do
begin
if a[i]>0 then inc(sd);
if a[i]<0 then inc(sa);
end;
assign(f,fo);rewrite(f);
writeln(f, So so hang duong bang ,sd);
writeln(f, So so hang am bang ,sa);
close(f);
End.
Ví d 4’'. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng
có tr tuy t i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s
ng d ng và bao nhiêu s h ng âm. D li u vào c cho b i file v n
n DAYSN.DAT trong ó dòng th nh t ghi N s , s th I là s h ng th
I c a dãy. K t qu ghi ra file v n b n KQ.TXT nh sau: dòng th nh t ghi
l ng s h ng d ng, dòng th hai ghi s l ng s h ng âm.
const
fi='daysn.dat';
fo='kq.txt';
var
f:text;
n,i:byte;
a:array[1..100] of integer;
sd,sa:byte;
Begin
Assign(f,fi);reset(f);
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 50
n:=0;
While not(seekeoln(f)) do
begin
inc(n);read(f,a[n]);
end;
close(f);
sd:=0;sa:=0;
for i:=1 to n do
begin
if a[i]>0 then inc(sd);
if a[i]<0 then inc(sa);
end;
assign(f,fo);rewrite(f);
writeln(f, So so hang duong bang ,sd);
writeln(f, So so hang am bang ,sa);
close(f);
End.
Ví d 4’''. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng
có tr tuy t i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s
ng d ng và bao nhiêu s h ng âm. D li u vào c cho b i file v n
n DAYSN.DAT g m m t s dòng ghi N s h ng c a dãy, s th I là s
ng th I c a dãy. K t qu ghi ra file v n b n KQ.TXT nh sau: dòng th
nh t ghi s l ng s h ng d ng, dòng th hai ghi s l ng s h ng âm.
const
fi='daysn.dat';
fo='kq.txt';
var
f:text;
n,i:byte;
a:array[1..100] of integer;
sd,sa:byte;
Begin
Assign(f,fi);reset(f);
n:=0;
While not(seekeof(f)) do
begin
While not(seekeoln(f)) do
begin
inc(n);read(f,a[n]);
end;
readln(f);
end;
close(f);
sd:=0;sa:=0;
for i:=1 to n do
begin
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 51
if a[i]>0 then inc(sd);
if a[i]<0 then inc(sa);
end;
assign(f,fo);rewrite(f);
writeln(f, So so hang duong bang ,sd);
writeln(f, So so hang am bang ,sa);
close(f);
End.
Ví d 5. Cho m t m ng hai chi u g m các s nguyên A[1..M,1..N] v i M,N<= 100,
các s h ng có tr tuy t i không quá 1000. Hãy tìm dòng có t ng các s h ng nh
th nhì. N u có, hãy thông báo các ch s c a các dòng này, n u không có, hãy thông
báo không có. D li u vào c cho b i file v n b n có tên MANG.TXT trong ó
dòng th nh t ghi hai s M, N. Trong M dòng ti p theo, dòng th I ghi N s c a dòng
th I c a m ng A[I,1], . ., A[I,N]. Các s liên ti p trên m t dòng cách nhau ít nh t
t ký t r ng. Ghi ra file MANG.OUT nh sau: n u không có dòng nh nhì, ghi ra
thông báo "Khong co dong nho nhì". N u có, ghi ra dòng th nh t các ch s dòng có
ng nh th nhì.
Ch ng trình sau gi i bài toán này.
Uses Crt;
Const
fi='mang.txt';
fo='mang.out';
Var
F:Text;
A:Array[1..100,1..100] Of Integer;
M,N,I,J,MAX1,MAX2:Integer;
TD:Array[1..100] Of Longint;
Begin
Clrscr;
Assign(F,fi);
Reset(F);
Readln(F,M,N);
FillChar(TD,SizeOf(TD),0);
MAX1:=-maxlongint;MAX2:= -maxlongint;
For I:=1 To M Do
Begin
For J:=1 To N Do
Begin
Read(F,A[I,J]);TD[I]:=TD[I]+A[I,J];
End;
If MAX1<TD[I] Then
Begin
MAX2:=MAX1;
MAX1:=TD[I];
End;
If MAX1>TD[I] Then If MAX2<TD[I] then MAX2:=TD[i];
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 52
Readln(F);{có th có ho c không u không nh h ng}
End;
Close(F);
Assign(f,fo);rewrite(f);
If MAX2=-maxlongint
Then Writeln(f,'Khong co dong co tong nho thu nhi')
Else
Begin
Writeln(f,'Cac dong co tong nho thu nhi:')
For I:=1 To M Do If TD[I]=MAX2 Then Write(f,I,' ');
End;
Close(f);
End.
Ví d 5'. Nh ph n u Ví d 5. D li u vào c cho b i file v n b n có tên
MANG.TXT g m M dòng ti p theo, dòng th I ghi N s c a dòng th I c a m ng
A[I,1], . ., A[I,N], các s h ng có tr tuy t i không quá 1000. Các s liên ti p trên
t dòng cách nhau ít nh t m t ký t r ng. Nh ph n cu i Ví d 5.
Ch ng trình sau gi i bài toán này.
Uses Crt;
Const
fi='mang.txt';
fo='mang.out';
Var
F:Text;
A:Array[1..100,1..100] Of Integer;
M,N,I,J,MAX1,MAX2:Integer;
TD:Array[1..100] Of Longint;
Begin
Clrscr;
Assign(F,fi);
Reset(F);
FillChar(TD,SizeOf(TD),0);
MAX1:=-maxlongint;MAX2:= -maxlongint;
m:=1;n:=0;
While not(seekeoln(f)) do
begin
Inc(n);read(f,a[1,n]);td[1]:=td[1]+a[1,n];
end;
If MAX1<TD[1] Then
Begin
MAX2:=MAX1;
MAX1:=TD[1];
End;
If MAX1>TD[1] Then If MAX2<TD[1] then MAX2:=TD[1];
While not(seekrof(f)) Do
Begin
Inc(m);
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 53
For J:=1 To N Do
Begin
Read(F,A[m,J]);TD[m]:=TD[m]+A[m,J];
End;
If MAX1<TD[m] Then
Begin
MAX2:=MAX1;
MAX1:=TD[m];
End;
If MAX1>TD[I] Then If MAX2<TD[I] then MAX2:=TD[m];
Readln(F);
End;
End;
Close(F);
Assign(f,fo);rewrite(f);
If MAX2=-maxlongint
Then Writeln(f,'Khong co dong co tong nho thu nhi')
Else
Begin
Writeln(f,'Cac dong co tong nho thu nhi:')
For I:=1 To M Do If TD[I]=MAX2 Then Write(f,I:3);
Close(f);
End;
End.
2. File ghi m i dòng m t xâu ký t .
Chú ý r ng do m i dòng c a file v n b n có th có s ký t r t l n nên ta không luôn
có th c m i dòng ra m t bi n ki u xâu ký t vì dài ki u xâu do Pascal quy nh
không quá 255 ký t . Tuy nhiên, n u ta bi t tr c gi i h n dài m i dòng c a file
không quá 255 ký t , ta có th c m i dòng ra m t bi n ki u xâu ký t và ti p t c
lý các thông tin c n thi t.
u xâu có dài quá 255, ta dùng m t m ng m t chi u v i các ph n t ki u ký t
th hi n và c t ng ký t nh n c xâu.
Ví d 6. Cho N xâu ký t S1, S2, . . ., SN, các xâu có dài không quá 255. Hãy cho
bi t dài l n nh t c a các dài c a N xâu và các ch s c a các xâu có dài l n
nh t. D li u vào c cho b i file XAU.INP trong ó dòng th nh t ghi s N không
n h n 100, trong N dòng ti p theo, dòng th I ghi xâu SI. K t qu ghi ra file
XAU.OUT nh sau: dòng th nh t ghi dài l n nh t, dòng th hai ghi các ch s
a các xâu có dài l n nh t, hai s liên ti p cách nhau m t ký t tr ng.
Sau ây là ch ng trình
Const
fi='xau.inp';
fo='xau.out';
Var
f:Text;
s:Array[1..100] of string;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 54
d:Array[1..100] of byte;
n,max,i:byte;
Begin
assign(f,fi);reset(f);
readln(f,n);
max:=0;
for i:=1 to n do
begin
readln(f,s[i]);d[i]:=length(s[i]);
if max<d[i] then max:=d[i];
end;
close(f);
assign(f,fo);rewrite(f);
writeln(f,max);
for i:=1 to n do if d[i]=max then writeln(f,i,' ');
close(f);
End.
Ví d 6'. Cho N xâu ký t S1, S2, . . ., SN, các xâu có dài không quá 255. Hãy cho
bi t dài l n nh t c a các dài c a N xâu và các ch s c a các xâu có dài l n
nh t. D li u vào c cho b i file XAU.INP g m N dòng, dòng th I ghi xâu th I.
t qu ghi ra file XAU.OUT nh sau: dòng th nh t ghi dài l n nh t, dòng th
hai ghi các ch s c a các xâu có dài l n nh t, hai s liên ti p cách nhau m t ký t
tr ng.
Sau ây là ch ng trình
Const
fi='xau.inp';
fo='xau.out';
Var
f:Text;
s:Array[1..100] of string;
c,d:Array[1..100] of byte;
n,max,s:byte;
Begin
assign(f,fi);reset(f);
max:=0;n:=0;
While not(seekeof(f)) do
begin
inc(n);readln(f,s[n]);d[n]:=length(s[n]);
if max<d[n] then max:=d[n];
end;
close(f);
assign(f,fo);rewrite(f);
writeln(f,max);
for i:=1 to n do if d[i]=max then writeln(f,i,' ');
close(f);
End.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 55
Ví d 7. Cho xâu ký t S có dài không quá 10000. Hãy cho bi t s ch cái ti ng
Anh, s ch s th p phân xu t hi n trong S k c s b i và vi t xâu S theo th t
ng c l i. D li u vào c cho b i file XAU.INP g m hai dòng, dòng th nh t ghi
N là dài xâu S, dòng th hai ghi xâu S. K t qu ghi ra file XAU.OUT nh sau:
dòng th nh t ghi s SC là s ch cái xu t hi n trong S, dòng th hai ghi s SS là s
ch s xu t hi n trong S, dòng th ba ghi xâu S vi t theo th t ng c l i c a các ký
.
Chú ý r ng n u dài xâu l n h n 255, ta ph i dùng m ng m t chi u v i các ph n t
ki u Char th hi n xâu.
Sau ây là ch ng trình
Const
fi='xau.inp';
fo='xau.out';
Var
f:Text;
s:Array[1..10000] of char;
sc,ss,n,i:integer;
Begin
assign(f,fi);reset(f);
readln(f,n);
sc:=0;ss:=0;
For i:=1 to n do
begin
read(f,s[i]);
if (upcase(s[i])<='A')and(upcase(s[i])>='Z') then Inc(sc);
if (s[i]<='0')and(s[i]>='9') then Inc(ss);
end;
close(f);
assign(f,fo);rewrite(f);
writeln(f,sc);
writeln(f,ss);
for i:=n downto 1 do write(f,s[i]);
close(f);
End.
Ví d 7'. Cho xâu ký t S có dài không quá 10000. Hãy cho bi t s ch cái ti ng
Anh, s ch s th p phân xu t hi n trong S k c s b i và vi t xâu S theo th t
ng c l i. D li u vào c cho b i file XAU.INP g m m t dòng ghi xâu S. K t qu
ghi ra file XAU.OUT nh sau: dòng th nh t ghi s SC là s ch cái xu t hi n trong
S, dòng th hai ghi s SS là s ch s xu t hi n trong S, dòng th ba ghi xâu S vi t
theo th t ng c l i c a các ký t .
Sau ây là ch ng trình
Const
fi='xau.inp';
fo='xau.out';
Var
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 56
f:Text;
s:Array[1..10000] of char;
sc,ss,n,i:integer;
Begin
assign(f,fi);reset(f);
sc:=0;ss:=0;n:=0;
While not(eoln(f)) do
begin
Inc(n);read(f,s[n]);
if (upcase(s[n])<='A')and(upcase(s[n])>='Z') then Inc(sc);
if (s[n]<='0')and(s[n]>='9') then Inc(ss);
end;
close(f);
assign(f,fo);rewrite(f);
writeln(f,sc);
writeln(f,ss);
for i:=n downto 1 do write(f,s[i]);
close(f);
End.
Ví d 7''. Cho xâu ký t S có dài không quá 10000. Hãy cho bi t s ch cái ti ng
Anh, s ch s th p phân xu t hi n trong S k c s b i và vi t xâu S theo th t
ng c l i. D li u vào c cho b i file XAU.INP g m m t s dòng ghi xâu S theo
th t t trên xu ng và t trái sang ph i. K t qu ghi ra file XAU.OUT nh sau: dòng
th nh t ghi s SC là s ch cái xu t hi n trong S, dòng th hai ghi s SS là s ch s
xu t hi n trong S, dòng th ba ghi xâu S vi t theo th t ng c l i c a các ký t .
Sau ây là ch ng trình
Const
fi='xau.inp';
fo='xau.out';
Var
f:Text;
s:Array[1..10000] of char;
sc,ss,n,i:integer;
Begin
assign(f,fi);reset(f);
readln(f,n);
sc:=0;ss:=0;n:=0;
While not(seekeof(f)) do
begin
While not(eoln(f)) do
begin
Inc(n);read(f,s[n]);
if (upcase(s[n])<='A')and(upcase(s[n])>='Z') then Inc(sc);
if (s[n]<='0')and(s[n]>='9') then Inc(ss);
end;
readln(f);
end;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 57
close(f);
assign(f,fo);rewrite(f);
writeln(f,sc);
writeln(f,ss);
for i:=n downto 1 do write(f,s[i]);
close(f);
End.
3. File ghi m i dòng m t xâu có c ký t l n s
ng d n: C n c k mô t d li u c cho úng.
Ví d 8. M t rô b t di chuy n trong m t sân hình ch nh t g m M dòng và N c t ô
vuông, M, N ≤ 100000. Các dòng ô vuông ánh s t 1 n M t trên xu ng, các c t
ô vuông ánh s t 1 n N t trái sang ph i. Ban u rô b t ô [X,Y]. Rô b t di
chuy n theo m t dãy g m S l nh. M i l nh có d ng
HK
trong ó H là m t ký t ch h ng di chuy n, H = U/D/L/R t ng ng v i h ng di
chuy n là Trên/D i/Trái/Ph i, K là m t s nguyên d ng ch s ô vuông rô b t di
chuy n theo h ng t ng ng.
Khi th c hi n dãy l nh, có hai kh n ng x y ra:
1. Sau b c di chuy n th B, rô b t ra ngoài sân;
2. Sau S b c di chuy n, rô b t v n trong sân;
li u vào c cho b i file RB.INP trong ó dòng th nh t ghi b n s M, N, X, Y.
Dòng th hai ghi s S, ti p theo là S dòng, dòng th I trong S dòng này ghi l nh th
I.
t qu ghi ra file RB.OUT nh sau:
u kh n ng 1 x y ra, dòng th nh t ghi hai s 1, B;
u kh n ng 2 x y ra, dòng th nh t ghi ba s 2, XC, YC, trong ó, [XC,YC]
là v trí cu i cùng c a rô b t;
Sau ây là ch ng trình
VD42
Const
fi='rb.inp';
fo='rb.out';
Var
f:text;
m,n,k,x,y,i,s,kn,b:longint;
h:char;
BEGIN
assign(f,fi);rest(f);
readln(f,m,n,x,y);
readln(f,s);
kn:=0;
for i:=1 to s do if kn=0 then
begin
readln(f,h,k);
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 58
case h of
'U':
Begin
dec(x);
if x<1 then
begin
kn:=1;b:=i;
end;
End;
'D':
Begin
Inc(x);
if x>m then
begin
kn:=1;b:=i;
end;
End;
'L':
Begin
dec(y);
if y<1 then
begin
kn:=1;b:=i;
end;
End;
'R':
Begin
Inc(y);
if y>n then
begin
kn:=1;b:=i;
end;
End;
end;
{Co the thay If kn=0 then bang cach dung o day lenh
If kn<>0 then break;}
end;
close(f);
if kn=0 then kn:=2;
assign(f,fo);rewrite(f);
if kn=1 then writeln(f,1,' ',b)
else writeln(f,2,' ',x,' ',y);
close(f);
END.
3.5.4. Ghi ti p vào m t file v n b n ã có
Gi s ta ã ghi m t s thông tin vào m t file v n b n là giá tr c a bi n file F và ta
ã óng l i, n u ta mu n ghi ti p vào thì ta có th dùng l nh
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 59
APPEND(F);
Assign(<Tenbienfile>,'Tenfil');Append(<Tenbienfile>);
. . . .
{Ghi thong tin vào file}
. . .
Close(<Tenbienfile>);
Ví d 9. Gi s ta ã có file NT.TXT ghi các s nguyên t không l n h n 50000, m i
dòng ghi m t s . Hãy t o l p file NT.TXT ghi các s nguyên t không l n h n
100000, m i dòng ghi m t s .
Có hai cách gi i:
1. Sinh các s nguyên t không l n h n 100000 và ghi m i s vào m t dòng c a
file output.
2. Ghi thêm vào file NT.TXT ã có các s nguyên t l n h n 50000.
Sau ây là ch ng trình vi t theo cách th hai.
Const
fo='nt.txt';
Var
f:text;
x, . . .:LongInt;
Begin
Assign(f,fo);Append(f);
For x:=50001 to 100000 do
Begin
. . . .
{Phan chuong trinh kiem tra tinh nguyen to cua X}
. . . .
If <X la so nguyen to> Then WriteLn(f,x);
close(f);
End;
End.
4. CH NG TRÌNH CON
Ch ng trình con (CTC) là m t ph n c a ch ng trình Pascal nh m th c hi n m t
công vi c nào ó: tính m t giá tr hay x lý m t s d li u.
Có hai lo i CTC: các CTC chu n c a Pascal và các CTC do ng i vi t ch ng trình
ch c.
4.1. Các ch ng trình con chu n c a Pascal
vi c vi t ch ng trình c ti n l i, Pascal có m t s CTC chu n tr giúp m t s
thao tác d li u. Các CTC này t trong file TURBO.TPL (TPL là vi t t t c a Turbo
Pascal Library). File này ch a các CTC chu n c t ch c thành các Unit (hay c ng
còn c g i là các mô un) SYSTEM, CRT, DOS, PRINTER. . . . Ngoài ra còn có
t s mô un t ch c riêng thành các file có ph n tên m r ng TPU ví d
GRAPH.TPU.
Unit System bao g m h u h t các hàm và các th t c chính dùng cho các ki u
li u ã mô t trong các m c tr c và khi biên d ch ch ng trình, Pascal t
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 60
ng tìm Unit này trong file Turbo.Tpl ch không ph i khai báo trong m c
Uses.
Unit Crt g m các hàm và các th t c làm vi c v i màn hình Output ch
n b n.
Unit Dos g m các hàm và các th t c làm vi c v i m t s ch c n ng c a h
u hành.
Unit Graph g m các hàm và các th t c làm vi c v i màn hình Output ch
ho .
4.2. Ch ng trình con c a ng i s d ng Pascal
Ng i vi t ch ng trình có th t ch c các CTC c a mình trong các ch ng trình.
Sau ây ta s h ng d n v vi c vi t các CTC.
Nh ta ã bi t, c u trúc t ng quát c a m t ch ng trình Pascal g m ba ph n chính:
ph n khai báo, ph n các CTC, ph n ch ng trình chính.
Ch ng trình chính là m t dãy các l nh ho c là các l nh c a Pascal ho c là các l nh
i các CTC mà sau khi th c hi n các l nh ó theo trình t c a chúng, ta s thu c
các thông tin c n thi t. Các l nh này c t trong m t c p t khoá BEGIN - END.
cho ti n, ta s g i ch ng trình có có CTC là ch ng trình m (CTM). Ta s dùng
thu t ng gia h khi làm vi c v i các CTC: CTM có th có các CTC, khi ó, CTC
a CTC c goi là ch ng trình cháu, . . .
Các CTC có th có ho c không. Tuy nhiên vi c t ch c các CTC có hai thu n l i
chính:
- Làm cho b c c c a ch ng trình rõ ràng d theo dõi, ti n hành vi t, ch nh s a
và nhi u khi ti t ki m vi c l p l i m t s n ch ng trình gi ng nhau.
- Th ng m i ch ng trình c n ti n hành m t s công vi c nào ó. M t cách b
c ch ng trình là ta cho m i CTC m nhi m vi c ti n hành m t công vi c.
Thông th ng m i ch ng trình Pascal th ng có dàn ý sau:
1. Nh p d li u;
2. Gi i bài toán;
3. Vi t k t qu ;
Vi c gi i bài toán có th g m m t s khâu. Khi ó ch ng trình có th c t ch c
nh sau:
1. Ph n khai báo;
2. CTC nh p d li u;
3. Các CTC ph c v vi c gi i bài toán;
4. CTC vi t k t qu ;
5. Ch ng trình chính (c a CTM);
i CTC c ng có c u trúc nh g m ba ph n:
1. Ph n các khai báo khác
2. Ph n các CTC (cháu)
3. Ph n ch ng trình chính (c a CTC)
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 61
Các ph n 2 và 3 t ng t nh ã gi i thi u trong c u trúc c a m t ch ng trình
Pascal. u khác nhau duy nh t c n chú ý là các l nh c a ph n 3 ph i c vi t gi a
t c p
BEGIN - END;
Trong toàn b m t ch ng trình Pascal, ch có ch ng trình chính (c a CTM) k t
thúc v i
END.
4.3. Khái ni m Th t c và Hàm
ng nh các ch ng trình con chu n, các CTC c a Pascal có hai lo i:
Th t c (Procedure). Th t c là m t CTC dùng th c hi n m t s thao tác x
lý nào ó.
Hàm (Function). Hàm là m t CTC dùng tính m t i l ng nào ó có ki u
li u n gi n (s , ký t , xâu ký t , lô gic).
Vi c phân bi t này ch là t ng i theo ngh a trong nhi u tr ng h p, th c hi n
t vi c nào ó, ta có th dùng m t CTC là hàm hay th t c u có th c nh ng
t h ng d n chung v s l a ch n này là ta ch nên dùng CTC d ng hàm khi c n
tính toán m t i l ng ki u n gi n (s , ký t , Booolean, xâu).
Chú ý quan tr ng. N u CTC là hàm, trong các l nh c a ch ng trình chính c a nó
ph i có ít nh t m t l nh gán giá tr cho tên c a hàm.
4.4. Cách khai báo ph n tên c a ch ng trình con
Trong ph n khai báo c a CTM có th khai báo tên nh ng không nh t thi t ph i có.
Nh ng khác v i CTM, CTC nh t thi t ph i có ph n khai báo tên. Tu theo CTC là
th t c hay hàm, tên s c khai báo theo các quy nh sau.
Cách khai báo ph n tên c a th t c
PROCEDURE Tên(<Danh sách bi n>);
Cách khai báo ph n tên c a hàm
FUNCTION Tên(<Danh sách bi n>):Ki u;
Tên ph i c t theo quy nh t tên c a Pascal nh ng không nên quá dài mà ch
nên g i c m nh n. Tên không c trùng v i các tên ã c dùng.
Ví d
Procedure Nhap;
. . .
Function NT(x:LongInt):Boolean;
. . .
Procedure Viet;
. . .
4.5. Danh sách bi n trong ph n khai báo tên c a CTC
Danh sách bi n là m t danh sách li t kê các bi n mà CTC ph thu c, m i bi n d u
ph i kèm theo ki u. Có nh ng u c n chú ý sau ây:
Không nh t thi t ph i có danh sách bi n n u không c n;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 62
u ki u c a bi n là ki u ph c t p (m ng, b n ghi, t p h p), ki u ó ph i
c khai báo qua M c Type c a ch ng trình chính ch không c khai báo
tr c ti p.
Hai Danh sách bi n liên ti p ng n cách b ng m t d u ch m ph y (;)
Bi n có th khai báo kèm theo Var ho c không
Ví d
Các khai báo sau không h p l i v i Pascal:
Procedure XULY(A:Array[1..100] Of Integer);
ho c
Function MAX(A:Array[1..100] Of Integer):Integer;
Ta ph i dùng cách khai báo sau:
Type
MANG=Array[1..100] Of Integer;
. . . . . . . . . . . .
Procedure XULY(A:MANG);
. . . . . . . . . . . .
ho c
Type
MANG=Array[1..100] Of Integer;
. . . . . . . . . . . .
Function MAX(A:MANG):Integer;
. . . . . . . . . . . .
Các h ng d n v vi c dùng có Var hay không nh sau:
u bi n khai báo không có Var, sau khi CTC k t thúc, nó s nh n l i giá tr
tr c khi b t u CTC.
u bi n khai báo kèm theo Var, sau khi CTC k t thúc, nó s nh n l i giá tr
i do quá trình x lý c a CTC quy nh.
u bi n khai báo có Var, trong M c Var c a CTM c a CTC ó ph i khai báo
t bi n dùng ng v i bi n ó,
Trên c s h ng d n này, ng i vi t ch ng trình s ph i xem xét l a ch n: n u giá
tr c a bi n sau khi th c hi n CTC còn dùng cho các ph n khác c a ch ng trình,
bi n ph i khai báo có Var.
Ví d
Ch ng trình sau ây minh ho cho các ý trên.
Uses Crt;
Var
X,Y:Integer;
Procedure S1(X,Y:Integer);
Var
TG:Integer;
Begin
TG:=X;X:=Y;Y:=TG;
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 63
Writeln('X = ',X,' Y = ',Y);{L nh 2}
End;
Procedure S2(Var X,Y:Integer);
Var
TG:Integer;
Begin
TG:=X;X:=Y;Y:=TG;
End;
Procedure S3(X:Integer;Var Y:Integer);
Var
TG:Integer;
Begin
TG:=X;X:=Y;Y:=TG;
Writeln('X = ',X,' Y = ',Y);{L nh 5}
End;
Begin {Main}
X:=5;Y:=10;
Writeln('X = ',X,' Y = ',Y);{L nh 1}
S1(X,Y);
Writeln('X = ',X,' Y = ',Y);{L nh 3}
S2(X,Y);
Writeln('X = ',X,' Y = ',Y);{L nh 4}
S3(X,Y);
Writeln('X = ',X,' Y = ',Y);{L nh 6}
Readln
End.
Sau khi ch y ch ng trình này, trên màn hình s có nh ng dòng thông báo l n l t
nh sau:
Dòng th nh t (do L nh 1): X = 5 và Y:= 10
Dòng th hai (do L nh 2 trong th t c S1): X = 10 và Y:= 5
Dòng th ba (do L nh 3): X = 5 và Y:= 10 do sau khi ra kh i CTC S1, X và Y
(không có khai báo Var kèm theo) l i nh n l i giá tr c c a chúng tr c khi vào S1.
Dòng th t (do L nh 4): X = 10 và Y:= 5 do sau khi ra kh i CTC S1, X và Y (có
khai báo Var kèm theo) v n gi giá tr m i c a chúng do S2 bi n i.
Dòng th n m (do L nh 5 trong th t c S3): X = 5 và Y:= 10
Dòng th sáu (do L nh 6): X = 10 và Y:= 10 do sau khi ra kh i CTC S3, X (không có
khai báo Var kèm theo) l i nh n l i giá tr c c a chúng tr c khi vào S3 trong khi ó
Y (có khai báo Var kèm theo) v n gi giá tr m i c a chúng do S3 bi n i.
4.6. Cách dùng các ch ng trình con
t CTC có th c dùng (g i) trong m t CTC khác ho c trong ch ng trình chính.
Theo th t vi t các CTC, CTC vi t sau có th g i các CTC vi t tr c. Trong tình
hu ng có hai CTC V1 và V2 mà V1 c n g i V2 và V2 c n g i V1 thì Pascal v n có
cách thu x p b ng cách dùng khai báo Forward nh sau. Ví d n u V1 vi t tr c V2
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 64
nh ng trong V1 có g i V2 và trong V2 có g i V1, tr c khi vi t V1, c n vi t dòng
khai báo Forward nh sau:
Procedure V2(Danh sách bi n);FORWARD;
Procedure V1(Danh sách bi n);
. . . . . .
Procedure V2(Danh sách bi n);
. . . . . .
ho c
Function V2(Danh sách bi n):Ki u;FORWARD;
Function V1(Danh sách bi n):Ki u;
. . . . . .
Function V2(Danh sách bi n):Ki u;
. . . . . .
ho c
Procedure V2(Danh sách bi n);FORWARD;
Function V1(Danh sách bi n):Ki u;
. . . . . .
Procedure V2(Danh sách bi n):Ki u;
. . . . . .
ho c
Function V2(Danh sách bi n):Ki u;FORWARD;
Procedure V1(Danh sách bi n):Ki u;
. . . . . .
Function V2(Danh sách bi n):Ki u;
. . . . . .
Vi c g i m t CTC khác nhau tu theo lo i CTC:
u CTC là th t c ta vi t nó nh m t l nh. V i các bi n trong danh sách bi n, n u
bi n không có Var, có th thay b ng m t bi n hay m t giá tr c th , n u bi n có Var,
ph i thay b ng m t tên bi n. Không c n vi t thêm ki u c a bi n.
u CTC là hàm ta ch có th dùng giá tr c a hàm ph thu c các giá tr t ng ng
a các bi n nh m t i l ng gán ho c so sánh ho c vi t ra. Vi c vi t các bi n
ng c quy nh nh i v i th t c.
Ví d
u trong ch ng trình có CTC lo i hàm
Function NT(x:LongInt):boolean;
{Kiem tra tinh nguyen to cua so x}
vi c vi t
. . .
nt(x);
. . .
là sai.
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 65
nh ng vi c vi t
. . .
If nt(x) Then WriteLn(x,' la so nguyen to')
Else WriteLn(x,' khong la so nguyen to');
. . .
là úng.
4.7. Bi n a ph ng và bi n toàn th
Nh ta ã bi t, v c b n c u trúc c a m t CTC t ng t nh c a CTM. u ó có
ngh a CTC c ng có th có M c khai báo Var và không nên nh m l n v i Danh sách
bi n trong khai báo tên c a CTC.
Các bi n khai báo trong m c Var c a CTM c goi là bi n toàn th (Global), các
bi n khai báo trong m c Var c a CTC c goi là các bi n a ph ng (Local). M i
CTC u c dùng các bi n toàn th mà không c n khai báo. Trong khi ó, bi n a
ph ng c a CTC nào thì ch CTC ó c dùng.
Tuy nhiên, bi n a ph ng c ng có th cùng tên v i bi n toàn th . Ví d CTC A có
th có bi n a ph ng N trong khi CTM c ng có bi n N. Khi ó trong CTC A N s
c hi u là bi n a ph ng c a A ch không ph i là bi n toàn th .
t sai l m ph bi n c a nh ng ng i m i t ch c CTC là khi th y trong CTC dùng
bi n nào thì khai báo h t trong m c Var c a CTC. u ó d n n vi c trong CTC
có nhi u bi n trùng v i bi n toàn th và khi ó vi c x lý d li u nói chung không
úng n a.
Ví d
Trong Ví d M c 9.2.3, các bi n X, Y là các bi n toàn th , bi n TG là bi n a
ph ng.
4.8. L nh Exit
Trong CTC, khi l nh Exit c th c hi n, CTC k t thúc và l nh sau l nh g i CTC
c th c hi n.
Khi CTC th c hi n xong vi c c n làm, vi c dùng l nh Exit s ti t ki m th i gian ch y
ch ng trình.
Ví d
Function NT(x:LongInt):boolean;
Var
i:LongInt;
Begin
If x=1 then Begin nt:=false;exit;End;
For i:=2 to Trunc(Sqrt(x)) Do
If x mod i = 0 Then Begin nt:=false;exit;End;
nt:=true;
End;
4.9. Ch ng trình con quy
Nguy n Xuân My Tr i hu n luy n IOICamp.net
l c v ngôn ng l p trình Pascal 66
t CTC c g i là quy n u ch ng trình ó có l nh g i chính nó. Các CTC
th ng dùng th hi n các thu t toán quy ho c các tính toán quy.
Ví d . CTC d i d ng hàm sau ây dùng tính hàm giai th a (N! = 1.2.3. . . N).
. . . . . . . . . . . .
Function GT(n:integer):longint;
begin
If n=0 then begin gt:=1;exit;end else gt:=n*gt(n-1);
end;
. . . . . . . . . . . .
Vi c vi t m t CTC quy th ng r t d và ch ng trình r t ng n. Tuy nhiên c n chú
ý r ng Pascal dành m t ph n h n ch (không quá 64 KB) c a b nh ghi nh n các
giá tr c a các bi n a ph ng c a CTC, vùng b nh này c g i là stack. N u s
ng các các giá tr quá nhi u, có th d n n hi n t ng g i là tràn stack, trên màn
hình Pascal s có thông báo trên n n
Stack Overfow
m r ng kh n ng t i a c a stack, ta có th dùng d n biên d ch
{$M 65000,0,655360}
Tuy nhiên ngay c khi dùng d n biên d ch nh v y, ta v n có th b tràn stack.
kh c ph c h n ch trên, khi dùng CTC quy, ta nên h n ch n m c t i a các
bi n a ph ng ho c n u có th , ta thay th CTC quy b i m t CTC không quy.
Ví d
Ch ng trình con sau tính N! nh ng không quy.
Function GT(n:integer):longint;
Var
Tam,i:longint;
begin
If n=0 then begin gt:=1;exit;end;
tam:=1;
for i:=1 to n do tam:=tam*i;
gt:=tam;
end;

More Related Content

PDF
Ngôn ngữ lập trình turbo pascal full
PPT
Chuong1234pascal 2493
PPTX
Kịch bản giảng dạy
DOC
Book
PDF
1 -nhapmon
PPT
Lớp 8: Bai thuc hanh 1
DOC
Giao an tin 11
Ngôn ngữ lập trình turbo pascal full
Chuong1234pascal 2493
Kịch bản giảng dạy
Book
1 -nhapmon
Lớp 8: Bai thuc hanh 1
Giao an tin 11

What's hot (19)

DOC
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
PPT
Hsbd taint
PDF
9 ngon ngu_lap_trinh
PDF
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
PDF
Reverse Engineering .NET - Advanced Patching, Playing with IL
PDF
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
PDF
Tùy biến Confuser
PDF
Os php-5.3new1
PDF
Hướng dẫn tạo Loader trong .NET - bản dịch
PPT
PDF
Những thuật ngữ thường gặp trong Reverse Engineering .NET
PPTX
tin học lớp 8
PPT
Hsbd taint
PDF
Hacking de4dot for fun - Bài dịch
PDF
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
DOC
Bồi dưỡng HSG Tin chuyên đề thuật toán
PPTX
Giao an tin hoc 11
DOC
Inline asm in c gọi hàm ngat
PDF
Python
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Hsbd taint
9 ngon ngu_lap_trinh
Các công cụ cần thiết cho quá trình Reverse Engineering .NET (bản đầy đủ)
Reverse Engineering .NET - Advanced Patching, Playing with IL
Phân tích Confuser 1.9.0.0 - Constant Protection - Bản dịch
Tùy biến Confuser
Os php-5.3new1
Hướng dẫn tạo Loader trong .NET - bản dịch
Những thuật ngữ thường gặp trong Reverse Engineering .NET
tin học lớp 8
Hsbd taint
Hacking de4dot for fun - Bài dịch
Phân tích Confuser 1.9.0.0 - Anti-tamper protection - Bản dịch
Bồi dưỡng HSG Tin chuyên đề thuật toán
Giao an tin hoc 11
Inline asm in c gọi hàm ngat
Python
Ad

Similar to Pascal 2 (20)

DOC
phuong trinh vo ti File10779
DOC
Lap trinh pascal
DOC
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
DOC
Book
PDF
Lap trinh huong_doi_tuong
PDF
C++ can ban
DOC
Giao trinh pascal toan tap
PDF
Quan ly bo nho
PPT
Giáo trình lập trình C
PPTX
introduction to java script, history, functionalities
PDF
Ebook drupal 7 vn
PDF
tao file exe cho chuong trinh viet bang ngon ngu java
PDF
Ch assembly
PDF
0 mo dau
PDF
Chuong 09 vb
PDF
Ngôn ngữ lập trình pascal (bổ trợ tin 11)
PDF
Luận văn: Nghiên cứu các biện pháp biểu diễn tri thức trong lập trình Logic
PDF
Day hoc lt (aml)
PDF
C++ can ban(dung thu vien iostream)
phuong trinh vo ti File10779
Lap trinh pascal
Giao an trinh_pascal_bai_tap_co_dap_an_huong_dan
Book
Lap trinh huong_doi_tuong
C++ can ban
Giao trinh pascal toan tap
Quan ly bo nho
Giáo trình lập trình C
introduction to java script, history, functionalities
Ebook drupal 7 vn
tao file exe cho chuong trinh viet bang ngon ngu java
Ch assembly
0 mo dau
Chuong 09 vb
Ngôn ngữ lập trình pascal (bổ trợ tin 11)
Luận văn: Nghiên cứu các biện pháp biểu diễn tri thức trong lập trình Logic
Day hoc lt (aml)
C++ can ban(dung thu vien iostream)
Ad

More from Võ Tâm Long (20)

PDF
Chuanhk2
PDF
Chuanhk1
PDF
PDF
Ly p han 2
PDF
Phuongphap
PDF
HÓa 11
DOCX
Bai tap hoa hoc lop 11 ca nam
PDF
669160 esw0whit00hoa0o0viet0nam00tv0
PDF
200211 gubryaltphcmhanoidansodichuyennoithi
PDF
7 chuyenkhao dicu-dothihoa
PPTX
Đô thị hóa TP.HCM 1986-2015
DOCX
Hoàn cảnh lịch sử và đường lối của đảng từ năm 1930 đến năm 1939
DOCX
Hoàn cảnh lịch sử và đường lối của đảng từ năm 1930 đến năm 1939
PPTX
Dioxin office
PPTX
Dioxin office
DOC
Vu kien chat doc mau da cam
PDF
Nvt phanquyet jw
DOC
Vu kien chat doc mau da cam
PPTX
PPTX
Thuyết trình cmts
Chuanhk2
Chuanhk1
Ly p han 2
Phuongphap
HÓa 11
Bai tap hoa hoc lop 11 ca nam
669160 esw0whit00hoa0o0viet0nam00tv0
200211 gubryaltphcmhanoidansodichuyennoithi
7 chuyenkhao dicu-dothihoa
Đô thị hóa TP.HCM 1986-2015
Hoàn cảnh lịch sử và đường lối của đảng từ năm 1930 đến năm 1939
Hoàn cảnh lịch sử và đường lối của đảng từ năm 1930 đến năm 1939
Dioxin office
Dioxin office
Vu kien chat doc mau da cam
Nvt phanquyet jw
Vu kien chat doc mau da cam
Thuyết trình cmts

Recently uploaded (20)

PDF
bai thao luan triet hoc mac lennin hayyy
DOCX
Ôn tập văn học phương đông thi giữa kì ..
PDF
Dao tao va Phat trien NỘI DUNG ÔN THI CHO SINH VIÊN
PPTX
2. tràn khí màng phổi bệnh học nộii.pptx
PPTX
CHƯƠNG I excel,,,,,,,,,,,,,,,,,,,,,,,,,,
DOCX
Ôn tập Văn học phương đông tài liệu tham khảo
PDF
BÁO CÁO THỰC TẬP KỸ SƯ 2 ĐỀ TÀI TÌM HIỂU QUY TRÌNH CÔNG NGHỆ SẢN XUẤT BÁNH SN...
PDF
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
PDF
12894-44864-1-CE-1037-1038_Văn bản của bài báo.pdf
PPTX
Bài 6 Du an bua an ket noi yeu thuong.pptx
PPTX
Chương 5 của Tâm lí học - Tâm Lí Học Giáo Dục Đạo Đức
PPTX
Flashcard giải pháp đơn giản – trực quan – hiệu quả, giúp học từ vựng theo t...
PPTX
Giáo án Lý Luận Chung về Hành chính Nhà nước cập nhật mới....
PDF
Bản phân loại thực vật môn thực vật dược
PPTX
Direct Marketing- chieu thi truyen thong
PPTX
Triet hoc con nguoi va triet hoc thac si
PPTX
TIẾT 11. BÀI 32 DINH DƯỠNG VÀ TIÊU HÓA Ở NGƯỜI.pptx
PPTX
14. thoát vị bẹn nghẹt bệnh học ngoại khoa.pptx
PDF
12894-44864-1-CE-1037-1038_Văn bản của bài báo.pdf
PDF
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 6 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...
bai thao luan triet hoc mac lennin hayyy
Ôn tập văn học phương đông thi giữa kì ..
Dao tao va Phat trien NỘI DUNG ÔN THI CHO SINH VIÊN
2. tràn khí màng phổi bệnh học nộii.pptx
CHƯƠNG I excel,,,,,,,,,,,,,,,,,,,,,,,,,,
Ôn tập Văn học phương đông tài liệu tham khảo
BÁO CÁO THỰC TẬP KỸ SƯ 2 ĐỀ TÀI TÌM HIỂU QUY TRÌNH CÔNG NGHỆ SẢN XUẤT BÁNH SN...
CHUYÊN ĐỀ DẠY THÊM HÓA HỌC LỚP 11 CẢ NĂM THEO FORM THI MỚI BGD - CÓ ÔN TẬP + ...
12894-44864-1-CE-1037-1038_Văn bản của bài báo.pdf
Bài 6 Du an bua an ket noi yeu thuong.pptx
Chương 5 của Tâm lí học - Tâm Lí Học Giáo Dục Đạo Đức
Flashcard giải pháp đơn giản – trực quan – hiệu quả, giúp học từ vựng theo t...
Giáo án Lý Luận Chung về Hành chính Nhà nước cập nhật mới....
Bản phân loại thực vật môn thực vật dược
Direct Marketing- chieu thi truyen thong
Triet hoc con nguoi va triet hoc thac si
TIẾT 11. BÀI 32 DINH DƯỠNG VÀ TIÊU HÓA Ở NGƯỜI.pptx
14. thoát vị bẹn nghẹt bệnh học ngoại khoa.pptx
12894-44864-1-CE-1037-1038_Văn bản của bài báo.pdf
BÀI TẬP TEST FOR UNIT TIẾNG ANH LỚP 6 GLOBAL SUCCESS CẢ NĂM THEO TỪNG ĐƠN VỊ ...

Pascal 2

  • 1. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 1 L C V NGÔN NG L P TRÌNH PASCAL 1.1. Nh ng nét chung c a ngôn ng l p trình Nh ta ã nói n trong ch ng 1, mu n trao cho máy tính th c hi n m t công vi c nào ó hay nói cách khác gi i m t bài toán nào ó, thu t toán gi i bài toán ph i c di n t thành m t ch ng trình vi t b ng m t ngôn ng l p trình. Có r t nhi u lo i ngôn ng l p trình b c cao (v n n ng). Tuy nhiên chúng u có m t nét chung nh sau: Quy nh m t s các ký t dùng vi t ch ng trình, T p các ký t này c g i là ng ch cái c a ngôn ng . Quy nh m t s t c bi t v i các hàm ý c th g i là các khoá. Quy nh cách vi t tên các i l ng mà ch ng trình c p n. Quy nh u trúc chung c a m t ch ng trình và các quy nh khi vi t t ng ph n a ch ng trình. ch c m t th vi n các ch ng trình con chu n h tr ng i vi t ch ng trình. Khi dùng m t ngôn ng nào ó vi t ch ng trình, ch ng trình ó c g i là ch ng trình ngu n (SourceProgram). có th th c hi n c, ch ng trình ó c n c d ch sang ngôn ng máy. Công vi c ó do các IDE m nhi m. IDE là vi t t t a ba ch ti ng Anh Integrated Development Envirement (Môi tr ng phát tri n tích h p). V c b n máy tính không th "hi u" và th c hi n các ch ng trình ngu n không vi t b ng ngôn ng máy (Xem ph n i c ng v Tin h c). IDE cho phép ta ch ch ng trình vi t b ng ngôn ng l p trình sang ngôn ng máy và t o thêm các ti n nghi cho vi c vi t và th c hi n ch ng trình trên c s ngôn ng l p trình. C n chú ý r ng cùng m t ngôn ng l p trình, có nhi u IDE khác nhau. Ví d ngôn ng l p trình Pascal có hai IDE ang c dùng ph bi n: Turbo Pascal và Free Pascal. Tuy nhiên Free Pascal s là IDE c dùng lâu dài vì có th ch y trong c môi tr ng Windows và Linux. Trong ph n l n các tr ng trên th gi i, khi d y ngôn ng l p trình u tiên, ng i ta th ng ch n ngôn ng Pascal. M t trong nh ng lý do chính vì Pascal là m t ngôn ng khá chu n m c th hi n các thu t toán và các ki u d li u liên quan; thông qua quá trình h c ngôn ng này, h c sinh có th hi u c nh ng ý t ng c b n c a t ngôn ng l p trình b c cao. Trong ch ng này, chúng ta s gi i thi u nh ng ki n th c c b n v ngôn ng này v i m c tiêu vi t các ch ng trình gi i các bài toán thông th ng trên c s IDE Turbo. Trong cu i ch ng này, s có m t ph l c IDE Free-Pascal. Ta c n luôn ý th c r ng Pascal là m t ph ng ti n giao ti p gi a ng i và máy tính. B n thân máy tính là m t thi t b v t lý, "giao vi c" cho máy thông qua m t ch ng trình, chúng ta c n ph i tuân th úng nh ng quy nh r t nghiêm ng t c a
  • 2. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 2 ngôn ng vì ch nh v y, ch ng trình m i có th d ch c sang ngôn ng máy và khi ó máy m i có th "hi u" và th c hi n c. 1.2. B ch cái vi t các l nh, Pascal ch n m t s ký t trong b ng mã ASCII dùng làm b ch cái a mình. B ch cái này g m: - Các ch cái th ng và hoa c a ti ng Anh: A..Z, a..z - Các ch s th p phân 0..9 - D u g ch chân (th ng dùng n i ch ) _ (có mã ASCII th p phân b ng 95) - Ký t tr ng (mã ASCII th p phân b ng 32) gõ b ng phím dài Space - Các ký t v i mã ASCII th p phân t 0 n 31 (các mã u khi n) - Các ký t c bi t + - * / = < > [ ] . , ( ) : ; ^ @ { } $ # ' - Các c p ký t vi t li n nhau dùng nh m t ký t Gán <= >= <> := .. (* *) (. .) i v i các ký t khác c a b ng mã ASCII, Pascal không chính th c dùng làm các ch cái c a mình. Tuy nhiên, nó có th x lý và trong các chú thích ho c các dòng thông báo, ta có th dùng c các ký t này. n chú ý r ng, khác v i cách vi t trong Toán h c, các c p d u ngo c (, ), {, }, [, ] dùng trong Pascal có ý ngh a khác nhau: (, ) dùng phân bi t các s h ng trong các bi u th c. {, } dùng ghi các chú thích trong ch ng trình. gi i thích m t ph n ch ng trình nào ó, ta có th vi t chú thích cho ph n ó và ph n chú thích ph i t gi a { và }. [, ] dùng cho các ki u d li u xâu, m ng và t p h p (Xem các ph n sau). 1.3. Khái ni m tên Pascal có m t s t c bi t g i là khoá (Keyword) g m 52 t sau: ABSOLUTE EXTERNAL MOD SHR AND FILE NIL STRING ARRAY FOR NOT THEN BEGIN FORWARD OBJECT TO CASE FUNCTION OF TYPE CONST GOTO OR UNIT CONSTRUCTOR IF PACKED UNTIL
  • 3. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 3 DESTRUCTOR IMPLEMENTATION PROCEDURE USES DIV IN PROGRAM VAR DO INLINE RECORD VIRTUAL DOWNTO INTERFACE REPEAT WHILE ELSE INTERRUPT SET WITH END LABEL SHL XOR Khi s d ng Pascal gi i các bài toán (theo ngh a nêu trong ch ng tr c), trong phát bi u c a bài toán và trong quá trình gi i bài toán, có các i l ng ho c ã cho ho c c n tính toán. Khi vi t ch ng trình, ta c n khai báo tên các i l ng này kèm theo ki u d li u t ng ng. Tên t ph i tuân theo các quy nh sau: 1. Ch g m các ch cái, ch s ho c d u g ch chân và không b t u b ng ch , khi ó ch cái hoa hay th ng u c hi u nh nhau 2. Không c trùng v i các t khoá nêu trên. i v i ng i Vi t Nam, u này không gây nên khó kh n vì m t s t khoá n gi n th ng c dùng nhi u trong ch ng trìntr, các t khoá r c r i ch c không ai dùng t tên. 3. dài có th tu ý nh ng Pascal ch quan tâm n không quá 63 ký t u. Nói chung, khi t tên các i l ng c n tính toán trong ch ng trình, ta nên dùng các tên t t g i nh ý ngh a c a nó. Trong các m c ti p theo, ta s l n l t gi i thi u v các ki u d li u mà Pascal cho phép dùng th hi n các i l ng khác nhau th ng g p trong các bài toán và cách khai báo v chúng. 1.4. C u trúc chung c a m t ch ng trình Pascal t ch ng trình Pascal t ng quát g m các ph n sau: 1. Ph n các khai báo, 2. Ph n các ch ng trình con, 3. Ph n ch ng trình chính. Ph n ch ng trình chính nh t thi t ph i có, hai ph n khác tu theo yêu c u c th c a ng i vi t ch ng trình, không nh t thi t ph i có. 1.4.1. Ph n khai báo Ph n khai báo g m các m c sau: a) Tên ch ng trình (m c này có th không c n có nh ng n u vi t, ph i vi t úng). Cách vi t Program tên ch ng trình; trong ó tên ch ng trình c n t theo úng các quy nh v tên. b) Các h ng d n biên d ch (s c gi i thi u d n khi c n) c) Khai báo các n v (unit) ch ng trình c n dùng. File TURBO.TPL và các file *.TPU bao g m m t s unit nh CRT, DOS, SYSTEM, GRAPH . . ó là th vi n các th t c và các hàm chu n c a Pascal cho phép ng i vi t trình c s d ng
  • 4. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 4 ngoài các th t c và các hàm chu n ã có s n. Ngoài ra, ng i vi t ch ng trình c ng có th t o l p các unit c a riêng mình theo các quy nh c a Pascal. Cách vi t USES danh sách các unit; Trong danh sách này, hai unit liên ti p cách nhau m t d u ph y. d) M c Label. Li t kê tên các m c c a ch ng trình. Cách t tên m c gi ng nh cách t tên ngo i tr u ki n b t u b ng ch cái. Nói chung chúng tôi không ng vi c vi t ch ng trình có khai báo này vì nó che d u tính c u trúc c a ch ng trình. Cách vi t Label danh sách các m c; Trong danh sách này, hai m c liên ti p cách nhau m t d u ph y. e) M c Const. Khai báo các h ng (các i l ng không i). Cách vi t Const danh sách các tên h ng Trong danh sách này, hai tên h ng liên ti p cách nhau m t d u ch m ph y. Cách vi t m i h ng Tên h ng=giá tr ; g) M c Type. Khai báo các ki u d li u. Cách vi t Type danh sách các ki u Cách vi t m i ki u Tên ki u = Mô t ki u; h) M c Var. Khai báo các i l ng (các bi n) dùng trong ch ng trình. Cách vi t Var danh sách các bi n Cách vi t m i bi n Tên bi n:tên ki u c a bi n; u m t s bi n có cùng ki u, ta có th khai báo chung ki u, khi ó hai bi n liên ti p khi khai báo chung ki u cách nhau m t d u ph y. 1.4.2. Các ch ng trình con u trúc m i ch ng trình con hoàn toàn t ng t nh m t ch ng trình Pascal ngo i tr vi c ch ng trình con ph i k t thúc b ng END; Ta s có m t m c riêng gi i thi u chi ti t h n v các ch ng trình con. 1.4.3. Ph n ch ng trình chính Ph n này b t u b ng t khoá Begin ti p theo là các l nh và k t thúc b ng END. ây là t khoá end duy nh t trong ch ng trình có d u ch m kèm theo sau ánh u k t thúc c a ch ng trình. 1.4.4. M t lo i ch ng trình n gi n: vi t thông báo ra màn hình
  • 5. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 5 minh ho cho khái ni m v m t ch ng trình Pascal ng th i gi i thi u l nh vi t ra màn hình nh ng thông báo c n thi t gi i thích cho các l nh ph c t p sau này, ta a ra m t vài ví d v nh ng ch ng trình n gi n nh t. Ví d 1. Gi s ta mu n vi t ra màn hình thông báo Day la lop 10 Tin hoc, ch ng trình sau th c hi n công vi c này. Begin Writeln('Day la lop 10 Tin hoc'); End. Ví d 2. Gi s ta mu n vi t ra màn hình thông báo Day la lop 10 Tin hoc và trong dòng ti p theo thông báo 'M i b n làm quen v i Turbo-Pascal', ch ng trình sau th c hi n công vi c này. Begin Writeln('Day la lop 10 Tin hoc, '); Writeln('Moi ban lam quen voi Turbo-Pascal'); End. u ch ng trình này c s a thành Begin Write('Day la lop 10 Tin hoc, '); Writeln('Moi ban lam quen voi Turbo-Pascal'); End. Hãy th c hi n c hai th y s khác nhau gi a hai l nh Write và Writeln. Qua hai ví d trên, khi mu n vi t m t dòng thông báo nào ó ra màn hình, ta có th dùng l nh Write ho c Writeln, dòng thông báo c vi t gi a m t c p d u nháy ' và t gi a m t c p ngo c tròn. t nh n xét r t b ích cho chúng ta sau này là các dòng l nh c a Pascal ph n l n u k t thúc b ng d u ;. 1.5. Môi tr ng Pascal Nói m t cách t ng quát, trong Tin h c, khi s d ng m t ph n m m nào ó, các ti n nghi mà ph n m m ó cung c p cho ng i s d ng c g i là môi tr ng c a ph n m ó. Ví d ng i ta th ng nói n môi tr ng DOS, môi tr ng WINDOWS, môi tr ng Linux . . . Khi làm vi c v i Pascal v i t cách nh m t ph n m m, ta có môi tr ng Pascal. làm vi c v i Pascal, trên máy tính c n có các file ch ng trình c n thi t. N u mu n cài t y , hi n có hai b ch ng trình TP7.0 dùng cho môi tr ng DOS và BP dùng cho môi tr ng WINDOWS. Tuy nhiên, có th h c nh ng ph n p n trong giáo trình này, ta ch c n hai file TURBO.EXE, TURBO.TPL. b t u làm vi c v i Pascal, n u trong môi tr ng DOS, ta vào th m c ch a các file trên và gõ TURBO r i gõ phím ENTER, còn trong môi tr ng WINDOWS, ta m kép chu t vào bi u t ng c a Pascal hay BP. Sau ó s xu t hi n màn hình so n th o ch ng trình Pascal nh hình v d i ây. Ta c ng g i màn hình nàylà m t c a . File Edit Search Run Compile Debug Tools Options Windows Help
  • 6. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 6 -----------------------------NONAME00.PAS----------------------------- _ 1:1 ---------------------------------------------------------------------- F1 Help F2 Save F3 Open Alt+F9 Compile F9 Make Alt+F10 LocalMenu Hai dòng trên và d i c g i là Menu, m i m c trong Menu t ng ng v i m t lo i vi c ta có th l a ch n, hai s trên dòng cu i cùng ng n cách nhau b ng d u hai ch m (:) cho ta bi t v trí c a con tr so n th o ang dòng nào (s tr c) và c t nào (s sau) c a ch ng trình ang so n. Vi c gi i thi u chi ti t v Menu s c c p n d n qua t ng m c. Sau ây ta ch gi i thi u m t s m c c n thi t nh t trong giai n ban u khi so n th o và ch y m t ch ng trình vi t b ng Pascal. ây ta có th làm các vi c sau: 1. So n m i m t ch ng trình: Các b c l n l t ti n hành là Gõ ch ng trình. Các thao tác so n th o v c b n gi ng nh trong m t h so n th o v n b n. Ghi file ch ng trình vào a: gõ phím ch c n ng F2, gõ ph n tên c b n c a file r i gõ phím Enter. Biên d ch ch ng trình: gõ ng th i hai phím Alt+F9. N u ch ng trình có i, s có m t v t thông báo màu , gõ phím Enter ho c Esc, v t s bi n t và v trí con tr n m sát ngay ch sai u tiên c a ch ng trình. Sau khi a sai n u có, c n ghi l i và ti n hành biên d ch l i cho t i khi ch ng trình không còn l i. Ch y ch ng trình: gõ ng th i hai phím Ctrl+F9. Sau khi dùng xong ch ng trình, ta có th óng c a s c a ch ng trình ó ng cách gõ ng th i hai phím Alt+F3. 2. N u mu n so n m t ch ng trình m i khác, ta có th l n l t gõ các phím F10, F, N, ta s c m t c a s m i và có th b t u m t vòng làm vi c nh trên. Khi làm vi c v i Pascal, ta có th m nhi u c a s , m i c a s ng v i m t ch ng trình ho c m t file d li u. Th ng các c a s này x p ch ng lên nhau, b ng cách gõ phím F6, ta có th chuy n c a s cu i cùng lên trên cùng. 3. N u mu n m m t file ra m t c a s , ta gõ phím F3 r i gõ tên file c n m sau ó gõ phím Enter. 5. ra kh i Pascal, ta gõ ng th i hai phím Alt+X. 2. D LI U KI U N GI N Khi vi t ch ng trình Pascal, i i l ng xu t hi n trong ch ng trình c n ph i c khai báo tên và ki u c a nó trong m c Var. Tu theo bài toán c th , i l ng ó có th là i l ng cho tr c, i l ng c n tính và nh ng i l ng phát sinh
  • 7. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 7 trong quá trình tính toán. Tu theo ý ngh a th c t c a chúng, ta c n ch n ki u d li u khai báo. i dung c a m c này nh m gi i thi u các ki u d li u n gi n. Lý do c a vi c ch n thu t ng n gi n không ch vì nói chung chúng n gi n mà ti n dùng sau này trong ph n các ch ng trình con. 2.1. D li u ki u s nguyên 2.1.1. Cách khai báo bi n ki u s nguyên Khi có m t bi n ki u s nguyên, trong m c Var, ta có th ch n m t trong n m cách khai báo sau ây. Tên bi n:Shortint; i khai báo này, bi n s nh n giá tr trong mi n -128..127 và m i bi n c n 1 byte b nh . Tên bi n:Byte; i khai báo này, bi n s nh n giá tr trong mi n 0..255 và m i bi n c n 1 byte b nh . Tên bi n:Integer; i khai báo này, bi n s nh n giá tr trong mi n -215..215-1 và m i bi n c n 2 byte nh . Tên bi n:Word; i khai báo này, bi n s nh n giá tr trong mi n 0..216-1 và m i bi n c n 2 byte b nh . Tên bi n:Longint; i khai báo này, bi n s nh n giá tr trong mi n -231..231-1 và m i bi n c n 4 byte nh . Pascal cho phép ta dùng hai h ng chu n: m t h ng ký hi u là MaxInt có giá tr b ng giá tr l n nh t c a bi n ki u Integer (= 215-1), m t h ng ký hi u là MaxLongInt có giá tr b ng giá tr l n nh t c a bi n ki u LongInt (= 231-1). Khi mu n vi t các u ki n so sánh gi a các bi n ki u s <, >, ≤, ≥, ≠, =, trong ch ng trình ta vi t t ng ng nh sau: <, >, <=, >=, <>, = 2.1.2. Các hàm và th t c chu n Khi vi t các bi u th c s h c, các phép tính c ký hi u nh sau: C ng + Tr - Nhân * X Mod Y: Ph n d c a phép chia X cho Y X Div Y: Th ng c a phép chia X cho Y Chú ý r ng các hàm X Mod Y và X Div Y ch xác nh v i Y ≠ 0. ng nh trong toán h c, phân bi t các s h ng trong m t bi u th c, ta có th dùng các d u ngo c. Tuy nhiên, c n chú ý r ng m c dù trong Toán h c, ta c phép
  • 8. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 8 dùng các lo i d u ngo c khác nhau, nh ng trong Pascal, khi vi t các bi u th c, ta ch c dùng m t lo i d u ngo c duy nh t là các d u m óng ngo c tròn (, ). u không dùng d u ngo c, th t u tiên th c hi n các phép toán s là: Div và Mod, nhân, c ng và tr Ví d , a*(b+c) là bi u th c c vi t úng nh ng n u vi t a*[b+c] là sai, không c hi u là a nhân v i t ng c a b và c. N u vi t a*b+c thì bi u th c s có giá tr b ng (a*b)+c. i v i các bi n ki u s nguyên, Pascal có s n m t s hàm chu n và m t s th t c chu n ph c v các tính toán ph bi n nh t. Hàm (Function) chu n là hàm có s n c a Pascal. Hàm có th có ho c không có bi n. Giá tr c a hàm ch có th dùng tính toán, so sánh ho c gán cho m t bi n khác cùng ki u. Khi dùng hàm, c n bi t rõ các bi n (n u có) c a nó ph i có ki u gì và ki u li u c a hàm là ki u gì. Sau ây là m t s hàm chu n. Hàm Sqr(X): Hàm có bi n X ki u s nguyên và giá tr b ng bình ph ng c a X. Hàm Pred(X): Hàm có bi n X ki u s nguyên và có giá tr b ng X-1. Hàm Succ(X): Hàm có bi n X ki u s nguyên và có giá tr b ng X+1. Hàm Random(X): Hàm có bi n X ki u Word và có giá tr là m t s nguyên ng u nhiên trong ph m vi 0..X-1. Khi dùng hàm này ta ph i khai báo n v ch ng trình CRT trong m c Uses và tr c ó ph i g i th t c Randomize; Bi u th c nguyên là bi u th c nh n c t các bi n và các s nguyên liên k t b i các hàm chu n nêu trên. Th t c (Procedure) chu n là các l nh có s n c a Pascal. L nh này cho phép ta th c hi n m t vi c nào ó. Th t c có th có ho c không có bi n và n u có bi n, ta c n bi t rõ bi n ó có ki u gì. Mu n dùng th t c, ta vi t nó nh vi t m t l nh. Th t c Inc(X); t ng giá tr c a bi n X ki u s nguyên m t n v . Th t c Dec(X); gi m giá tr c a bi n X ki u s nguyên m t n v . Th t c Inc(X,Y); thay giá tr A ang có c a bi n X ki u s nguyên b ng A c ng i giá tr c a bi n ki u s nguyên Y ho c giá tr nguyên Y. Th t c Dec(X,Y); thay giá tr A ang có c a bi n X ki u s nguyên b ng A tr i giá tr c a bi n ki u s nguyên Y ho c giá tr nguyên Y. 2.1.3. Các cách nh n giá tr cho các bi n ki u s nguyên nh n giá tr c a m t bi n ki u s nguyên, ta có th dùng m t trong hai cách sau: - Dùng l nh gán Tên bi n:=bi u th c có giá tr ki u s nguyên; - Nh n t bàn phím b ng l nh Read(tên bi n); ho c Readln(tên bi n); Khi nh n giá tr t bàn phím, ta có th nh n giá tr cho m t s bi n b ng l nh Read/Readln(tênbi n1, tênbi n2, . . ., tênbi nk); Khi th c hi n l nh này, trên màn hình s xu t hi n con tr , mu n cho bi n giá tr bao nhiêu, ta gõ t bàn phím sau ó gõ phím Enter.
  • 9. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 9 Tuy nhiên có th dùng ch ng trình m t cách ti n l i, khi nh n giá tr bi n t bàn phím, ta nên vi t kèm thêm dòng thông báo gi i thích c n nh p giá tr nh th nào. Do ó, ta nên dùng l nh nh n giá tr t ng bi n t bàn phím d i d ng m t c p l nh: Write('Dòng thông báo');Readln(tên bi n); Dòng thông báo này s c vi t ra màn hình gi i thích cho ng i ch y ch ng trình n nh p gì t bàn phím. Ví d , n u ta c n nh p m t s nguyên d ng N≤100 t bàn phím, ta có th dùng c p nh Write('Nhap so nguyen duong N <= 100: ');Readln(N); 2.1.4. Cách vi t giá tr bi n nguyên ra màn hình vi t giá tr c a bi n ki u nguyên ra màn hình, ta dùng l nh Write(Tên bi n); ho c writeln(Tên bi n); Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau ch ch sau khi vi t ra màn hình b ng l nh Write, n u vi t ti p s vi t trên cùng dòng ang vi t d còn sau khi vi t ra màn hình b ng l nh WriteLn, n u vi t ti p s chuy n xu ng u dòng d i vi t. Khi vi t nhi u s liên ti p trên m t dòng, ta nên dùng cách vi t có quy cách b ng cách dùng l nh. Write/writeln(Tên bi n:K); trong ó K là h ng s nguyên d ng. L nh này có ngh a là dành K v trí liên ti p vi t giá tr c a bi n, giá tr này vi t ph i nh t i v i K v trí này. N u s l ng s ng i nhi u, vi c ch n K c n c vào hai u ki n: 1. K ph i l n h n s ch s nhi u nh t có th c a các s này 2. K nên là c c a 80 (s v trí trên m t dòng màn hình) u ki n th nh t b o m hai s liên ti p cách nhau ít nh t m t d u tr ng; u ki n th hai cho ta vi t c các s thành các c t th ng hàng. Ví d , n u ta c n vi t m t lo t s liên ti p, m i s có không quá 6 ch s thì v i m i X, ta nên vi t ra màn hình b ng l nh Write(X:8); Sau ây là m t s ch ng trình ví d n gi n. Ví d 1. Ch ng trình ngh ng i s d ng nh p t bàn phím tu i và vi t l i ra màn hình. USES CRT; VAR TUOI:BYTE; BEGIN CLRSCR; WRITE('MOI BAN CHO BIET TUOI CUA BAN: ');READLN(TUOI); WRITELN('CAM ON, TOI DA BIET BAN ',TUOI,' TUOI'); READLN; END. Ví d 2. Ch ng trình ngh nh p t bàn phím hai s nguyên A, B và vi t ra màn hình t ng, hi u, div và mod c a hai s ó. USES CRT;
  • 10. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 10 VAR A,B:INTEGER; BEGIN CLRSCR; WRITE('BAN HAY NHAP SO NGUYEN A = ');READLN(A); WRITE('BAN HAY NHAP SO NGUYEN B = ');READLN(B); WRITELN('TONG CUA ',A,' VA ',B,' BANG ',A+B); WRITELN('HIEU CUA ',A,' VA ',B,' BANG ',A-B); WRITELN('TICH CUA ',A,' VA ',B,' BANG ',A*B); IF B<>0 THEN BEGIN WRITELN('THUONG CUA PHEP CHIA ',A,' CHO ',B,' BANG ',A DIV B); WRITELN('PHAN DU CUA PHEP CHIA ',A,' CHO ',B,' BANG ',A MOD B); END; READLN; END. 2.2. D li u ki u s th c 2.2.1. Cách khai báo Trong Pascal, s th c có hai cách vi t: 1. Cách vi t thông th ng theo ki u Anh-M : cách vi t này t ng t nh ta v n dùng trong Toán h c, ch khác bi t là d u ng n cách gi a ph n nguyên và ph n phân là u . thay vì d u , nh ta quen dùng. 2. Cách vi t d u ph y ng: N u M là s th c, ta luôn có m t cách duy nh t bi u di n M d i d ng M = α.10K trong ó -1<α<1 và K là s nguyên. α c g i là ph n nh tr còn K c g i là ph n b c. Khi ó, cách vi t d u ph y ng c a M là αEK (*) Ví d v i cách vi t thông th ng, ta có s 12.25, trong cách vi t d u ph y ng, s này c vi t d i d ng 0.1225e2. Cách vi t này dùng l u gi s th c trong b nh nh ng khi vi t không quy cách th c ra màn hình, Pascal vi t d ng (*) v i α có ph n nguyên trong ph m vi 1..9 (ta gi i thích khái ni m vi t có quy cách và không có quy cách trong m c 2.2.4). Ví d 12.25 khi vi t không quy cách ra màn hình s là 1.225e001. 0.0825 s là 8.25e-002. Khi dùng máy tính tính toán các s th c, ta nên nh r ng máy tính ch có th bi u di n s th c v i m t s nh t nh ch s có ngh a (CSCN). Pascal có 5 ki u dùng khai báo các i l ng là s th c c cho trong b ng d i ây trong ó i v i b n ki u u, c t mi n giá tr ch mi n bi n thiên c a tr tuy t i c a s . Tên Mi n giá tr T S CSCN S Byte Real 2.9e-39..1.7e38 11-12 6 Single 1.5e-45..3.4e38 7-8 4 Double 5.0e-324..1.7e308 15-16 8 Extended 3.4e-4932..1.1e4932 19-20 10
  • 11. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 11 Comp -9.2e18..9.2e18 19-20 8 Chú ý r ng ki u Comp luôn là s nguyên v i giá tr t -263 +1 n 263 -1 v i 19-20 ch có ngh a. Khi ó mu n khai báo m t bi n ki u s th c, tu tình hu ng c th , ta có th ch n t trong n m cách khai báo sau: Tên bi n:Real; Tên bi n:Single; Tên bi n:Double; Tên bi n:Extended; Tên bi n:Comp; Trong nh ng tính toán thông th ng, khi m t i l ng là s th c, ta nên ch n cách khai báo u tiên. 2.2.2. Các hàm và th t c liên quan Các phép tính s h c i v i các s th c c ký hi u nh sau: C ng + Tr - Nhân * Chia / Các quy nh khi vi t các bi u th c s th c c ng gi ng nh i v i bi u th c s nguyên trong m c 2.1.2. Sau ây là các hàm chu n tr giúp các tính toán v i s th c. Hàm Abs(X): Hàm này có giá tr b ng tr tuy t i ki u s th c c a giá tr bi n ki u th c X ho c s th c X. Hàm ArcTan(X): Hàm này có giá tr là cung trong kho ng (-π/2, π/2) có tang ki u th c b ng giá tr c a bi n ki u s th c X hay s th c X. Hàm Exp(X): Hàm này có giá tr b ng lu th a c s e c a giá tr bi n ki u s th c X ho c s th c X (eX ). Hàm Ln(X): Hàm này có giá tr b ng lô ga c s e c a giá tr bi n ki u s th c X ho c s th c X. Hàm Sin(X): Hàm này có giá tr b ng sin(X), X tính theo Radian. Hàm Cos(X): Hàm này có giá tr b ng cosin(X), X tính theo Radian. Hàm Pi: Hàm này cho ta giá tr c a s π (3.1415....). Hàm Int(X): Hàm này có giá tr b ng ph n nguyên nh ng có ki u s th c c a giá tr bi n ki u s th c X ho c s th c X (Ph n nguyên c a s th c X b ng s nguyên l n nh t trong các s nguyên không l n h n X). Hàm Frac(X) = X - Int(X): hàm này c ng có ki u s th c. Hàm Sqr(X): Hàm này có giá tr b ng bình ph ng c a giá tr bi n ki u s th c X ho c s th c X. Hàm Sqrt(X): Hàm này nh n giá tr b ng c n b c hai c a giá tr không âm c a bi n ki u s th c X ho c s th c không âm X. Chú ý r ng khi dùng hàm này, giá tr c a X pahir không âm. Hàm Random: Hàm này cho ta m t s th c ng u nhiên trong kho ng (0,1). Khi dùng hàm này ta ph i khai báo n v ch ng trình CRT trong m c Uses và tr c ó ph i có lênh Randomize;.
  • 12. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 12 Hàm Round(X): Hàm này nh n giá tr b ng s nguyên g n s th c X nh t nh ng có ki u là ki u s nguyên. Trong tr ng h p ph n phân c a X là 0.5, hàm này nhân giá tr làm tròn lên. Hàm Trunc(X): Hàm này có giá tr b ng ph n nguyên c a giá tr bi n ki u s th c X ho c s th c X nh ng có ki u là ki u s nguyên. t bi u th c có giá tr th c là bi u th c ch a các bi n s th c, các s th c liên k t i các hàm chu n. t bi u th c s là bi u th c ch a các bi n s , các s liên k t b i các hàm chu n c a các ki u s . Ki u c a m t bi u th c s là ki u c a bi n s ho c s có mi n giá tr ng nh t. 2.2.3. Các cách nh n giá tr nh n giá tr c a m t bi n ki u s th c, ta có th dùng m t trong hai cách sau: Dùng l nh gán Tên bi n:=bi u th c có giá tr ki u s ; Nh n t bàn phím b ng l nh Read/ReadLn(tên bi n); Các u c n chú ý khi dùng các l nh này c ng t ng t nh ã vi t trong cu i m c 2.1.3. Chú ý quan tr ng Khi dùng các l nh gán, bi n ki u s th c có th c gán giá tr c a bi u th c s nguyên ho c s th c nh ng n u bi n ki u s nguyên, ta không th gán cho nó giá tr a bi u th c ki u s th c dù giá tr ó là s nguyên. Ví d , v i các khai báo bi n X:Integer; Y:Real;, nh gán th hai sau ây không h p l ngay c khi giá tr c a Y là s nguyên theo ngh a Toán h c: Y:=5; X:=Y; ây c ng là m t u khác v i thói quen trong Toán h c. M t cách t ng quát, nh gán các bi n s X:=Y ch có th i v i các bi n Y có ki u v i mi n giá tr không l n n mi n giá tr c a ki u bi n X. 2.2.4. Cách vi t giá tr bi n ra màn hình Có hai cách vi t s th c ra màn hình: Cách vi t không quy cách: dùng l nh Write/writeln(Tên bi n); Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau c ng t ng t nh ã nói m c 2.1.4. Các l nh vi t trên s vi t s th c d i d ng d u ph y ng. Mu n vi t s th c d ng thông th ng, ta ph i dùng cách vi t có quy cách:
  • 13. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 13 Write/writeln(Tên bi n:K:L); có ngh a là ta dùng K v trí vi t giá tr c a bi n trong ó dùng L v trí cho các ch c a ph n phân c a s . Vi c l a ch n các giá tr c a K và L do ng i l p trình c ng s ch s c a s c n vi t ra, tuy nhiên rõ ràng L không th l n h n K-2. Tr ng h p K=0, l nh có ngh a là dùng ch vi t giá tr . Ví d . Ch ng trình nh p t bàn phím hai s th c b, c sau ó gi i ph ng trình b c nh t bX + c = 0. USES CRT; VAR B,C:REAL; BEGIN CLRSCR; WRITE('NH P S TH C B: ');READLN(B); WRITE('NH P S TH C C: ');READLN(C); WRITELN('C N GI I PH NG TRÌNH BX + C = 0'); IF B=0 THEN BEGIN IF C=0 THEN WRITELN('PH NG TRÌNH VÔ NH') ELSE WRITELN('PH NG TRÌNH VÔ NGHI M') END ELSE WRITELN('PH NG TRÌNH CÓ M T NGHI M DUY NH T = ',-C/B:0:2); END. 2.3. Bi u th c s h c Trong l p trình, bi u th c s h c c hi u là bi u th c nh n c t các bi n ki u , các h ng s nh m t s h u h n phép toán c ng, tr , nhân, chia, Div, Mod và các hàm chu n ki u s c a Pascal. Khi vi t bi u th c s h c, phân bi t các s h ng, ta ch c phép dùng các d u óng/m ngo c tròn ( và ). t v n t ra là khi trong m t bi u th c s h c có nhi u bi n ki u s khác nhau thì ki u c a giá tr bi u th c s là ki u nào? Câu tr l i là ki u c a m t bi u th c s c xác nh là ki u c a bi n tham gia bi u th c có mi n giá tr l n nh t, ch ng h n tích m t bi n ki u s th c và m t bi n ki u s nguyên có ki u s th c, t ng m t bi n ki u Longint v i m t bi n ki u Integer có ki u Longint, tích m t bi n ki u Integer i m t bi n ki u Integer có ki u Integer. Do ó khi tính toán các s , ta c n d li u tr c k t qu tính toán tránh nh n c giá tr không chính xác ho c b báo l i tràn s h c (Arithmetic Overflow) n u tr c ó ta t d n biên d ch {$Q+} Ví d khi tính di n tích S c a m t hình ch nh t có hai c nh D và R, n u ta khai báo D và R ki u Integer, m c dù ta khai báo S ki u Longint nh ng giá tr c a S có th không nh n c úng n u ta tính S b ng công th c S = DR. Nguyên nhân vì hai s ki u Integer khi nhân v i nhau có th v t ra kh i ph m vi Integer. k t qu tính luôn úng, ta có th dùng hai l nh thay vì m t: S:=1; S:=S*D*R. Trong ch ng trình sau n u nh p giá tr D = R =1000, ta s th y di n tích âm n u không t d n biên d ch {$Q+}và b báo l i tràn s h c (Arithmetic Overflow) n u tr c ó ta t d n biên d ch ki m soát các tính toán ra ngoài ph m vi c a ki u s c khai báo: {$Q+}.
  • 14. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 14 Uses CRT; Var d,r:integer; Begin ClrScr; Write('Nhap chieu dai hinh chu nhat = ');ReadLn(d); Write('Nhap chieu rong hinh chu nhat = ');ReadLn(r); Writeln('Dien tich hinh chu nhat = '),d*r); ReadLn; End. 2.4. D li u ki u lô gic (boolean) 2.4.1. Khái ni m u ki n lôgic t nh lô gic c ng còn g i là u ki n lô gic là m t u kh ng nh mà ch có úng m t trong hai kh n ng x y ra là úng hay sai. úng/sai c g i là các giá tr chân lý hay g i t t là giá tr và trong Pascal ta dùng các tên True, False. Ví d 5 là s nguyên t là m t m nh lô gic có giá tr úng nh ng à i ti ng m ru nhè nh không là m t m nh lô gic. i hai u ki n lô gic P và Q, ta có th l p các u ki n lô gic sau: P và Q P ho c Q Không P Các phép và, ho c, Không c g i là các phép toán lô gic. Giá tr c a các u ki n này c cho trong b ng sau. P Q P Và Q P Ho c Q Không P úng úng úng úng Sai úng Sai Sai úng Sai Sai úng Sai úng úng Sai Sai Sai Sai úng Trong l p trình, i l ng ki u lôgic là các i l ng ch nh n m t trong hai giá tr TRUE ( úng) và FALSE (sai). Các giá tr True, False c xem là các giá tr c a bi n ki u Boolean. Các i l ng ki u lô gic th ng th hi n d i d ng các u ki n lô gic nh u ki n so sánh giá tr c a các bi n, có hay không có m t s ki n nào ó, tìm th y/ch a tìm th y l i gi i . . . Các u ki n lô gic th ng do các u ki n lô gic n gi n ghép l i nh các liên t và, ho c, không . . . Khi vi t các u ki n lô gic ph c h p, Pascal dùng các t khoá sau th hi n các liên t ó: AND - và OR - hay là/ho c NOT - không
  • 15. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 15 Khi ó, n u các u ki n thành ph n là các u ki n so sánh, u ki n này ph i c t trong m t c p ngo c n. Ví d v m t toán h c, ta vi t 3<X 5 thì trong Pascal ta ph i vi t (3<X) AND (X<=5) Các cách vi t sau là sai 3<X AND X<=5 3<x<=5 ng nh khi vi t các bi u th c s h c, phân bi t các thành ph n trong u ki n lô gic, ta ch c dùng các d u ngo c tròn. N u không dùng d u ngo c tròn, th t u tiên s là Not, And, Or. Sau ây là m t s u ki n lô gic vi t trong so sánh v i m t s u ki n th ng g p trong toán h c. Toán h c p trình x ≠ 0 x<>0 X ∈ [a,b] (X>=a) and (X<=b) a<=X<=b X ∉ [a,b] (X<a) or (x>b) (X>=0) and (Frac(Sqrt(X))=0) X là chính ph ng (X>=0) and (Int(Sqrt(X))=Sqrt(x)) i v i ki u d li u này có m t hàm chu n Odd(X): i bi n s nguyên X, hàm nh n giá tr True, n u X l , hàm nh n giá tr False n u X ch n. 2.4.2. Vi c nh n giá tr và vi t giá tr ra màn hình. Khác v i các ki u d li u s , bi n ki u Boolean ch có th nh n giá tr b ng l nh gán: Tên bi n := u ki n lô gic; Ta c ng có th vi t giá tr c a u ki n lô gic và nói riêng là bi n ki u boolean ra màn hình b ng m t trong hai l nh Write( KLG) ho c WriteLn( KLG) 2.4.3. Câu l nh If < KLG> Then <Nhóml nh1> Else <Nhóml nh2> Khi gi i m t s bài toán, ta th ng có các câu bi n lu n nh : ng 1 u m t K nào ó tho mãn thì . . . di n t câu này, ta có th dùng câu l nh sau: IF < KLG> THEN <Nhóml nh>; (*) Trong câu l nh (*), n u u ki n lô gic úng, nhóm l nh c th c hi n sau ó s th c hi n l nh ti p theo c a ch ng trình, n u u ki n lô gic không úng, l nh ti p theo c a ch ng trình c th c hi n. ng 2 u m t K nào ó tho mãn thì . . . n u không thì . . . . (2)
  • 16. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 16 di n t câu này, ta có th dùng câu l nh sau: IF < KLG> THEN <Nhóml nh1> ELSE <Nhóml nh2>; (**) Trong câu l nh (**), n u u ki n lô gic úng, nhóm l nh 1 c th c hi n, n u không, nhóm l nh 2 c th c hi n; sau ó s th c hi n l nh ti p theo c a ch ng trình. Khi dùng các l nh này, ta ph i tuân theo các quy nh sau: 1. u nhóm l nh có h n m t l nh, ta ph i t trong m t c p Begin-End. 2. Sát tr c Else không có d u ;. 3. Các nhóm l nh trong câu l nh If . . . Then <Nhóm L nh 1> Else <Nhóm l nh 2> c ng có th l i có câu l nh d ng If . . . Then . . . Else . . . khi ó c n quy c vi c hi u Else nào g n v i If nào. Quy c ó là nh sau: Else g n v i If ngay tr c nó không n m gi a m t c p Begin-End và ch a có Else. Ch ng trình gi i ph ng trình b c hai cho trong ph n Bài t p và th c hành c a M c 1 có th dùng minh ho cho quy c này. Ví d 1 uses crt; var m,n:longint; Begin clrscr; write('Nhap so nguyen M = ');readln(m); write('Nhap so nguyen N = ');readln(n); if n<>0 then begin if m mod n = 0 then writeln(m,' chia het cho ',n) else writeln(m,' khong chia het cho ',n); end else writeln('Khong chia duoc cho so khong'); readln; End. Ví d 2 uses crt; var a,b,c:Real; Begin clrscr; write('Nhap so th c A = ');readln(a); write('Nhap so thuc B = ');readln(b); write('Nhap so thuc C = ');readln(c); if (a<=b)and(b<=c) then writeln(b:0:2, nam giua ,a:0:2, va ,c:0:2); if (a<=c)and(c<=b) then writeln(c:0:2, nam giua ,a:0:2, va ,b:0:2); if (b<=a)and(a<=c) then
  • 17. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 17 writeln(a:0:2, nam giua ,b:0:2, va ,c:0:2); if (b<=c)and(c<=a) then writeln(c:0:2, nam giua ,b:0:2, va ,a:0:2); if (c<=a)and(a<=b) then writeln(a:0:2, nam giua ,c:0:2, va ,b:0:2); if (c<=b)and(b<=a) then writeln(b:0:2, nam giua ,c:0:2, va ,a:0:2); readln; End. 2.4.4. Câu l nh REPEAT <Nhóml nh> UNTIL < KLG>; 2.4.4.1. Gi i thi u l nh Câu l nh này có tên là l nh l p v i s b c l p không xác nh. M c ích c a nó là th c hi n m t cách l p i l p l i m t s l n m t nhóm l nh, s l n l p ph thu c vào t u ki n lô gic. Khi th c hi n l nh này, các l nh trong nhóm l nh c th c hi n, sau ó, n u KLG úng thì s th c hi n l nh ti p theo c a ch ng trình còn n u KLG sai, s quay l i th c hi n nhóm l nh c nh th cho t i khi KLG úng. 2.4.4.2. L nh Break Trong câu l nh Repeat ... Until ...; khi th c hi n các l nh trong nhóm l nh, n u l nh Break c th c hi n thì vòng l p k t thúc và sau ó th c hi n l nh ti p theo c a ch ng trình. Ta có th hi u cách dùng l nh này qua các ch ng trình ví d d i ây. 2.4.4.3. Các ví d Ví d 1. Nh p d li u úng quy nh nh Repeat . . . có th dùng b t bu c ng i s d ng ch ng trình nh p d li u theo úng m t s quy nh nào ó. Nh ng quy nh ó s c th hi n b i m t u ki n lô gic ( KLG). Mu n ng i s d ng ch ng trình nh p d li u úng theo quy nh, ta có th dùng n ch ng trình sau: Repeat . . . . . . . {Các l nh nh p d li u} . . . . . . . Until DKLG; Ch ng h n mu n nh p m t s nguyên d ng N không l n h n 100, ta có th dùng các l nh: Repeat clrscr; write( Nhap so nguyen duong N khong lon hon 100: ); readln(n); until (n>0)and(n<=100)and(Frac(n)=0); Khi th c hi n n l nh này, n u nh p không úng m t s nguyên d ng không l n n 100, ng i nh p s ph i nh p l i cho t i khi úng các l nh ti p theo m i c th c hi n.
  • 18. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 18 Ví d 2. S e c nh ngh a nh gi i h n lim (1 + 1/n)n nà∞ ó là m t s vô t siêu vi t v i giá tr x p x 2,7132... S e có th tính g n úng b ng công th c e ≈ 1 + 1/1! + 1/2! + . . + 1/n! khi ó sai s s không quá 1/n!. Bài toán t ra là cho tr c m t sai s SS nào ó, ta c n tính s e v i sai s không quá SS. Thu t toán tính s e d a vào công th c tính g n úng nói trên. Ta s tính e ng cách c ng liên ti p vào s 1 các s có d ng 1/1!, 1/2!, . ., 1/k!. Sau m i l n ng, ta só sánh 1/k! v i SS, n u nó nh h n, quá trình tính k t thúc. S b c l p l i thao tác c ng không xác nh c tr c mà tu thu c giá tr c a sai s SS. Sau ây là ch ng trình Uses Crt; Var E, SS, THEM:Real; N:integer; Begin Clrscr; Write('B n c n tính s e v i sai s : '); Readln(SS); E:=1;N:=0;THEM:=1; Repeat THEM:=THEM/(N+1); E:=E+THEM; N:=N+1; Until THEM<SS; Writeln('e v i sai s không quá ',SS:0:6,' b ng: ',E); Readln End. Ví d 3. Ta bi t r ng n u f(x) là hàm s liên t c có giá tr t i A và B trái d u nhau thì có giá tr C v i A < C < B sao cho f(C) = 0. Nói chung giá tr c a C không tính c chính xác mà ch g n úng v i m t sai s SS nào ó cho tr c. Bài toán t ra là cho tr c m t hàm s liên t c f(X), m t sai s SS và hai s th c A, B. Hãy ki m tra xem f(A) và f(B) có trái d u nhau hay không. N u chúng trái d u, hãy tìm nghi m c a ph ng trình f(X) = 0 v i sai s không quá SS. Thu t toán mà ta gi i thi u ây thu c lo i thu t toán "S n s t trên sa m c". Ý ng c a lo i thu t toán này là s n m t con s t trên m t sa m c mênh mông, ta chia ôi sa m c, b ng m t cách nào ó (Ví d nh v tinh!) ta nh n bi t c n a sa c có s t , ta l i chia ôi n a ó r i l i chia ôi n a có s t . . . m t lúc nào ó ph n sa m c có s t khá bé thì ta có th d dàng "b t" c s t . Trong tr ng h p ang xét, trong n [A,B] f(X) có nghi m. Xem n ó nh "sa c" và nghi m là s t . Chia ôi n ó thành hai n (hai n a sa m c) [A,(A+B)/2] và [(A+B)/2,B]. N u f((A+B)/2) = 0, ta thu c nghi m c n tìm, n u
  • 19. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 19 không, n ch a nghi m s là m t trong hai n con mà giá tr c a f t i hai u mút trái d u nhau. Thay n [A,B] b i n con ch a nghi m và l i ti p t c quá trình chia ôi nh trên. Có hai kh n ng x y ra: 1. Ho c ta thu c nghi m t i trung m c a m t n con nào ó 2. Ho c ta nh n c m t n ch a nghi m mà dài c a nó nh h n SS. Khi ó ta có th nh n u trung m c a n ó làm giá tr c a nghi m v i sai s không quá SS. l n chia ôi n có nghi m không xác nh tr c c mà ph thu c t ng hàm f th và sai s SS, nh ng ta k t thúc quá trình ó khi m t trong hai kh n ng 1 ho c 2 x y ra. Ta xét m t ví d . Gi s C là m t s th c d ng và K là m t s nguyên d ng, ta c n tìm c n s h c b c K c a C. Gi s X là c n b c K c a C thì f(X) = XK – C = 0 u C = 1 rõ ràng X = 1; u C < 1, ch n a = 0; b = 1. N u C > 1, ch n a = 1; b = C. Nh v y trong tr ng p C ≠ 1, hàm f trái d u t i hai u mút n [a,b]. B ng cách dùng thu t toán trên, ta có th tìm X v i sai s nh h n SS cho tr c. Sau ây là ch ng trình v i K = 2. uses crt; var x,a,b,c,ss,fa,fb,td,ftd:real; BEGIN repeat clrscr; writeln; writeln('Tinh can bac hai cua mot so thuc duong C'); write('Nhap so thuc duong C = ');readln(c); until c>0; repeat clrscr; writeln('Voi sai so ss cho truoc'); write('Nhap sai so SS duong va nho hon 0.001: '); readln(ss); until (ss>0)and(ss<0.001); if c=1 then writeln('Can bac 2 cua ',c:0:0,' bang ',1) else begin if c<1 then begin a:=0;b:=1;end else begin a:=1;b:=c;end; repeat td:=(a+b)/2; ftd:=td*td-c; if ftd=0 then break; fa:=a*a-c; fb:=b*b-c; if fa*ftd<0 then b:=td else a:=td; until b-a<ss;
  • 20. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 20 writeln('Can bac 2 cua ',c:0:3,' bang ',td:0:3); end; readln; END. tính c n b c K, khó kh n là vi c tính giá tr hàm f(X) = XK - C t i các m a và b. Ta có th thay l nh fa:=a*a-c b ng n ch ng trình trong ó bi n I dùng m s l n nhân v i a. fa:=1;i:=0; Repeat Inc(i);fa:=fa*a; Until i=k; fa:=fa-c; ng t i v i l nh fb:=b*b-c và ftd:=td*td-c. 2.4.5. Câu l nh While < KLG> Do <Nhóm l nh>; 2.4.5.1. Gi i thi u l nh Câu l nh này c ng có tên là l nh l p v i s b c l p không xác nh. M c ích c a nó là th c hi n m t cách l p i l p l i m t s l n m t nhóm l nh, s l n l p ph thu c vào m t u ki n lô gic. Khi th c hi n l nh này, n u KLG úng, các l nh trong nhóm l nh c th c hi n, sau ó, n u KLG v n úng thì s quay l i th c hi n nhóm l nh, n u không, l nh l p t thúc và th c hi n l nh ti p theo c a ch ng trình. Khi vi t l nh này, Pascal quy nh n u nhóm l nh có h n m t l nh, nhóm l nh ph i t gi a m t c p Begin-End. i l nh Repeat... có th chuy n i thành m t l nh While... và ng c l i theo s cho trong b ng sau ây trong ó DK là u ki n lô gic. Repeat Nhóm l nh Until DK; While Not(DK) Do Nhóm l nh While DK Do Nhóm nh ⇔ n u nhóm l nh th c hi n ít nh t m t n Repeat Nhóm l nh Until Not(DK); Ta có th chuy n vi c dùng l nh Repeat-Until thành l nh While-Do trong các ví d 2 và 3 trên. 2.4.5.2. L nh Break ng t nh i v i câu l nh Repeat ... Until ...; khi th c hi n các l nh trong nhóm l nh c a l nh While . . ., n u l nh Break c th c hi n thì vòng l p k t thúc và sau ó th c hi n l nh ti p theo c a ch ng trình. 2.5. Ki u ký t
  • 21. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 21 Ta hi u ký t là các ký t thu c b ng mã ASCII. Có t t c 256 ký t v i các s hi u 0 n 255. S hi u c a ký t c g i là mã ASCII (th p phân) c a ký t . Ví d ký t A có mã ASCII b ng 65, ký t a có mã ASCII b ng 97. Chú ý r ng có m t ký c bi t g i là ký t tr ng th hi n trong các v n b n là ph n tr ng ng n cách gi a hai t vi t liên ti p. Ký t này c gõ b ng phím Space - phím dài nh t trên bàn phím và có mã ASCII b ng 32. Gi a các ký t có quan h so sánh <. N u C1 và C2 là hai ký t , C1<C2 hay t ng ng C2>C1 n u C1 ng tr c C2 trong b ng mã ASCII. Khi mu n vi t các u ki n so sánh gi a các bi n ki u ký t <, >, ≤, ≥, ≠, =, trong ch ng trình ta vi t t ng ng nh sau: <, >, <=, >=, <>, = 2.5.1. Cách khai báo khai báo bi n ki u ký t , ta vi t: Tên bi n:Char; Bi n ki u ký t dùng m t byte b nh ghi nh n giá tr . 2.5.2. Các hàm và th t c liên quan Hàm Chr(X): Có giá tr là ký t có mã ASCII th p phân b ng giá tr c a bi n X ki u Byte ho c s nguyên X trong ph m vi 0..255. Hàm Ord(C): Có giá tr là mã ASCII th p phân c a ký t là giá tr c a C. Hàm Pred(C): Có giá tr b ng ký t ng ngay tr c ký t là giá tr c a C trong ng mã ASCII. Hàm Succ(C): Có giá tr b ng ký t ng ngay sau ký t là giá tr c a C trong ng mã ASCII. Hàm UpCase(C): Có giá tr b ng ch cái hoa ng v i ký t là giá tr c a C n u ký là giá tr c a C là ch cái và b ng C n u C không là ch cái. Hàm ReadKey: có giá tr b ng ký t gõ t bàn phím. Bi u th c ký t g m các bi n và các ký t liên k t b i các hàm chu n. 2.4.3. Các cách nh n giá tr ng t nh i v i các bi n ki u s , nh n giá tr cho m t bi n ki u ký t , ta có th dùng m t trong hai cách: Dùng l nh gán Tên bi n:=bi u th c có giá tr là ký t ; Nh n t bàn phím b ng l nh Readln/Read(tên bi n); 2.4.4. Cách vi t giá tr bi n ra màn hình vi t giá tr c a bi n ki u ký t ra màn hình, ta dùng l nh Write/writeln(Tên bi n ki u ký t ); Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau Write/writeln ng t ng t nh ã nói cu i m c 2.1.4. Ta c ng có th dùng cách vi t có quy cách nh khi vi t các s
  • 22. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 22 Write/writeln(bi u th c ki u ký t :K); khi ó ta s có K v trí vi t giá tr và giá tr luôn c vi t ph i nh t trong ph m vi ó. Chú ý quan tr ng Trong ch ng trình, khi vi t m t ký t c th , ta ph i vi t ký t ó gi a hai d u ' nh ng khi nh p t bàn phím m t ký t c th , ta ch gõ úng ký t ó. 2.4.5. Các ví d Ví d 1. Vi t ch ng trình nh p t bàn phím m t ký t C và cho bi t kh n ng nào trong các kh n ng sau x y ra: C là ch cái th ng C là ch cái hoa C là ch s C không là ch cái hay ch s Sau ây là ch ng trình. uses crt; var c:char; Begin clrscr; write('Nhap ky tu C = ');readln(c); if (c>='a')and(c<='z') then writeln(c,' la chu cai thuong') else if (c>='A')and(c<='Z') then writeln(c,' la chu cai hoa') else if (c>='0')and(c<='9') then writeln(c,' la chu so') else writeln(c,' khong la chu so, chu cai'); readln; End. Ví d 2. Khi th c hi n m t ch ng trình làm m t vi c nào ó ví d gi i ph ng trình c hai t ng quát, ta muôn th c hi n ch ng trình ó liên ti p v i các d li u vào khác nhau. Ta có th s a các ch ng trình ã có nh sau. {Ph n các khai báo thêm bi n YK ki u Char} . . . . . Begin Repeat <Các l nh th c hi n m t vi c nào ó> . . . . . Write( Ban co muon tiep tuc khong (C/K)? ); Yk:=readkey; Until Upcase(yk)= ; End.
  • 23. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 23 Ví d 3. Nh p t bàn phím hai ký t X và Y. Hãy cho bi t X hay Y ng tr c trong ng mã ASCII uses crt; var x,y:char; Begin clrscr; write('Nhap ky tu X = ');readln(x); write('Nhap ky tu Y = ');readln(y); if x<y then writeln(x,' dung truoc ',y,' trong bang ma ASCII'); if x=y then writeln(x,' bang ',y); if x>y then writeln(x,' dung sau ',y,' trong bang ma ASCII'); readln; end. 2.5. Câu l nh CASE <bi uth c> OF <Cáctìnhhu ng> END; 2.5.1. Gi i thi u l nh Trong khi gi i nhi u bài toán, có th l i gi i ph thu c vào nhi u tình hu ng (vi t t t là TH), m i tình hu ng c quy nh b i m t s giá tr c a m t bi u th c có giá tr là nguyên hay ký t . Khi ó ta có th dùng câu l nh này di n t quá trình bi n lu n. nh có m t trong hai d ng sau: ng th nh t Case Bi uth c Of TH1:Nhóml nh1; TH2:Nhóml nh2; . . . THK:Nhóml nhK; End; i l nh d ng th nh t, khi th c hi n, n u giá tr c a bi u th c thu c tình hu ng I, 1≤I≤K nhóm l nh I c th c hi n, sau ó th c hi n ti p l nh ngay sau l nh Case. ng th hai Case Bi uth c Of TH1:Nhóml nh1; TH2:Nhóml nh2; . . . THK:Nhóml nhK; Else Nhóml nhK+1; End; i l nh d ng th hai, khi th c hi n, n u giá tr c a bi u th c thu c tình hu ng I, 1≤I≤K nhóm l nh I c th c hi n n u không, nhóm l nh K+1 c th c hi n, sau ó th c hi n ti p l nh ngay sau l nh Case. Khi dùng l nh này, Pascal có các quy nh sau: 1. Bi u th c ch có th có giá tr ho c ki u ký t ho c ki u s nguyên.
  • 24. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 24 2. Các tình hu ng có th là m t giá tr c th c a bi u th c ho c m t n giá tr liên ti p mà bi u th c có th nh n. Khi ó, n giá tr c vi t nh sau: Giá tr u. .Giá tr cu i. 3. u nhóm l nh có h n m t l nh thì nhóm l nh ph i t gi a m t c p Begin- End. 2.5.2. Các ví d Ví d 1. Nh p t bàn phím m t ký t và c n thông báo ký t ó là ch cái/ch s /d u phép toán/tr ng h p khác. uses crt; var ch:char; Begin clrscr; write('Moi ban nhap mot ky tu ');readln(ch); case Ch of 'A'..'Z','a'..'z':WriteLn('Ky tu la chu cai'); '0'..'9':WriteLn('Ky tu la chu so'); '+','-','*','/':WriteLn('Ky tu la dau phep toan'); else WriteLn('Ky tu khong la chu cai hay chu so hay dau phep toan'); end; readln; End. Ví d 2. Trên m t b ng ô vuông kích th c MxN, M và N nguyên d ng có giá tr không l n h n 100000. Các dòng ô vuông ánh s t 1 n M t trên xu ng d i, các c t ô vuông ánh s t 1 n N t trái sang ph i. M t rô b t ng ô thu c dòng X, c t Y. t l nh u khi n chuy n ng c a rô b t g m hai s nguyên H, K, H thu c mi n giá tr 1..4 ch h ng chuy n ng c a rô b t c n th c hi n: 1 (B c), 2 (Nam), 3 ông) và 4 (Tây), K là m t s nguyên d ng th hi n s b c di chuy n. Sau khi nh n l nh, rô b t s di chuy n theo h ng H K ô tính t ô [X,Y]. Sau khi th c hi n m t l nh, có hai kh n ng x y ra: 1. Rô b t i ra ngoài b ng. 2. Rô b t v n trong b ng. Vi t ch ng trình nh p các giá tr M, N, X, Y, H, K t bàn phím và thông báo ra màn hình các thông tin sau: Dòng th nh t ghi s 1 ho c 2 tu theo kh n ng 1 ho c 2 x y ra. u dòng th nh t ghi s 2, dòng th hai ghi ch s dòng và ch s c t c a ô mà rô t ng sau khi th c hi n l nh. uses crt; var m,n,h,x,y,k,kn:longint; Begin clrscr;
  • 25. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 25 write('So dong cua bang M = ');readln(m); write('So cot cua bang N = ');readln(n); write('Vi tri dong cua ro bot X = ');readln(x); write('Vi tri cot cua ro bot Y = ');readln(y); write('Huong chuyen dong cua ro bot (so nguyen 1..4): '); readln(h); write('So buoc chuyen dong cua ro bot: ');readln(k); case h of 1: begin dec(x,k); if x<1 then kn:=1 else kn:=2; end; 2: begin inc(x,k); if x>m then kn:=1 else kn:=2; end; 3: begin inc(y,k); if y>n then kn:=1 else kn:=2; end; 4: begin dec(y,k); if y<1 then kn:=1 else kn:=2; end; else kn:=0; end; if kn=0 then writeln('Gia tri huong nhap khong dung'); if kn=1 then writeln('Ro bot ra ngoai bang'); if kn=2 then begin writeln('Ro bot o trong bang'); writeln('Vi tri moi cua Ro bot: dong ',x,', cot ',y); end; readln; End. Ví d 3. Ch ng trình sau nh p t bàn phím tháng trong ph m vi 1..12 và m t n m nào ó sau ó thông báo ra màn hình s ngày c a tháng ó. USES CRT; VAR T,N,SN:INTEGER; BEGIN WRITE('B n c n tính s ngày c a tháng ');READLN(T); WRITE('N m ');READLN(N); CASE T OF
  • 26. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 26 1,3,5,7,8,10,12:SN:=31; 4,6,9,11:SN:=30; 2: IF (N MOD 4 = 0)and(n mod 100<>0) THEN SN:=29 ELSE SN:=28; END; WRITELN('S ngày c a tháng ',T,' n m ',N,' b ng ',SN); READLN; END. 2.6. Ki u xâu ký t Xâu ký t là m t dãy các ký t vi t liên ti p nhau, m i ký t có th xu t hi n nhi u n t i các v trí khác nhau và c ng có th không xu t hi n. S l ng m i ký t k c l n xu t hi n trong xâu c g i là dài c a xâu. Ta th a nh n m t xâu c bi t i là xâu r ng. Xâu r ng là xâu không có ký t nào (do ó có dài b ng 0) c ký hi u là '', xâu này th ng c dùng kh i t o giá tr c a m t xâu ký t c xây d ng d n qua nhi u b c. 2.6.1. Cách khai báo Có hai cách khai báo bi n ki u xâu ký t : Cách th nh t Tên bi n:String; i cách khai báo này, xâu có dài không quá 255 ký t . Giá tr c a bi n s c ghi nh n trong n 256 byte liên ti p trong ó byte u tiên ( ánh s 0) ghi dài xâu còn các byte ti p theo l n l t m i byte ghi m t ký t thu c xâu theo th t xu t hi n trong xâu. Ví d xâu Khai báo s c ghi nh n nh sau: 8 K h a i b á o . . . Cách th hai Tên bi n:String[N]; i cách khai báo này, xâu có dài không quá N v i N là s có giá tr nguyên ng c th không l n h n 255. Giá tr c a bi n s c ghi nh n trong n N+1 byte liên ti p trong ó byte u tiên ghi dài xâu còn các byte ti p theo l n l t m i byte ghi m t ký t thu c xâu theo th t xu t hi n trong xâu. Ví d theo th ng kê, tên m i ng i Vi t Nam u không quá 30 ký t , ta có th khai báo nh sau: Var Ten:String[30]; u S là m t bi n ki u xâu ký t , v i i là m t s nguyên d ng t 1 n dài c a S, S[i] ký hi u ký t th i c a xâu S tính t ký t trái nh t c a xâu. Khi ó S[0] ghi nh n dài c a xâu. 2.6.2. Các hàm chu n và th t c chu n Phép ghép xâu: N u S1 và S2 là hai xâu, ghép c a S1 và S2, ký hi u S1 + S2, là xâu nh n c b ng cách ghép liên ti p S1 v i S2. Ví d n u S1 = 'abbc', S2 = 'cbbd' thì S1+S2 = 'abbccbbd'. Hàm Length(S): Có giá tr b ng dài c a xâu S.
  • 27. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 27 Hàm Copy(S, M, N): Có giá tr b ng xâu con g m N ký t liên ti p c a xâu S t u t ký t th M. Ví d n u S = 'abcdefghijk' thì Copy(S,3,4) = 'cdef'. u t ký t th M không có N ký t liên ti p thì Copy(S,M,N) cho ta n uôi a xâu S b t u t ký t th M. Hàm Pos(S1, S2): Có giá tr b ng s nguyên d ng M là v trí xu t hi n u tiên a xâu S1 trong xâu S2 n u S1 xu t hi n trong S2 và b ng 0 n u S1 không xu t hi n trong S2. Ví d n u S1 = 'ab' và S2 = 'cabddab' thì Pos(S1,S2) = 2 nh ng n u S3 = 'db' thì Pos(S3,S2) = 0. Th t c Delete(S, M, N); Th t c này xoá N ký t liên ti p b t u t ký th M c a xâu S. N u t ký t th M không có N ký t liên ti p thì sau khi th c hi n l nh Delete(S,M,N), xâu S s b xoá i n cu i b t u t ký t th M. Ví d . N u S = 'abcdefghijk' thì sau khi th c hi n l nh Delete(S,4,4);, S s là xâu 'abchijk'. Th t c Insert(S1, S2, N); Th t c này chèn xâu ký t S1 vào tr c ký th N c a xâu S2. Ví d . N u S2 = 'abchijk' và S1 = ‘defg’ thì sau khi th c hi n l nh Insert(S1,S2,4), S2 là xâu 'abcdefghijk'. Th t c Str(X, S); Th t c này bi n s X (ki u s ) thành d ng vi t S c a nó (ki u xâu). Trong tr ng h p X là s th c, nh n c úng d ng vi t S c a X, ta c n vi t X có quy cách. Ví d n u X = 1.35 thì sau khi dùng l nh Str(X,S), ta nh n c xâu S = 1.35000...0E000 Mu n nh n c S = '1.35', ta ph i dùng l nh Str(X:0:2,S); Th t c Val(S, X, Code); V i th t c này, n u xâu S là d ng vi t c a m t s , k t qu cho ta s X là d ng s c a S và giá tr c a Code (ki u Integer) s b ng 0 ( úng). u xâu S không là d ng vi t c a m t s , k t qu cho ta giá tr c a Code khác 0 (sai). Ví d n u S = '1.35' thì sau khi th c hi n l nh Val(S,X,Code), ta có X = 1.35 và Code = 0. Nh ng n u S = '1,35' thì sau khi th c hi n l nh Val(S,X,Code), ta có Code ≠ 0 và d nhiên không có giá tr c a X. 2.6.3. Các cách nh n giá tr ng t nh i v i các bi n ki u s , nh n giá tr cho m t bi n ki u xâu ký t , ta có th dùng m t trong hai cách: Dùng l nh gán Tên bi n:=bi u th c có giá tr là xâu ký t ; Nh n t bàn phím b ng l nh Readln/Read(tên bi n);
  • 28. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 28 Chú ý ng nh khi s d ng l nh gán cho các bi n s , ta có th gán tr là m t ký t cho m t bi n xâu ký t nh ng vi c gán tr là m t xâu ký t cho m t bi n ki u ký t là không p l dù xâu ó có dài b ng 1. Trong ch ng trình, khi vi t m t xâu ký t c th , ta ph i vi t xâu ký t ó gi a hai u ' nh ng khi nh p t bàn phím m t xâu ký t c th , ta ch gõ úng xâu ký t ó. Chú ý quan tr ng Trong ch ng trình, ghi vi t m t xâu ký t c th , ta ph i vi t ký t ó gi a hai d u ' nh ng khi nh p t bàn phím m t xâu ký t c th , ta ch gõ úng các ký t thu c xâu ó. 2.6.4. Cách vi t giá tr bi n ra màn hình vi t giá tr c a bi n ki u xâu ký t ra màn hình, ta dùng l nh Write/writeln(Tên bi n ki u xâu ký t ); Hai l nh này u vi t ra màn hình giá tr c a bi n. S khác nhau gi a Write/writeln c ng t ng t nh ã nói cu i m c 2.1.4. Ta c ng có th dùng cách vi t có quy cách nh khi vi t các s Write/writeln(bi u th c ki u ký t :K); khi ó ta s có K v trí vi t giá tr và giá tr luôn c vi t ph i nh t trong ph m vi ó. 2.6.5. Các ví d Ví d 1.1. Nh p t bàn phím hai xâu ký t S1 và S2 và so sánh dài hai xâu này. uses crt; var s1,s2:string; n1,n2:byte; Begin clrscr; write('Nhap xau ky tu thu nhat S1= ');readln(s1); write('Nhap xau ky tu thu hai S2= ');readln(s2); if n1<n2 then writeln('Xau ',s1,' ngan hon xau ',s2); if n1=n2 then writeln('Xau ',s1,' dai bang xau ',s2); if n1>n2 then writeln('Xau ',s1,' dai hon xau ',s2); readln; End. Ví d 1.2. Nh p xâu ký t S có dài ít nh t b ng 20 và vi t ra màn hình xâu S sau khi xoá i 5 ký t liên ti p t ký t th 3. uses crt; var s:string; Begin clrscr;
  • 29. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 29 repeat write('Nhap xau ky tu S khong ngan hon 20: '); readln(s1); until length(s)>=20; writeln('Xau nhap vao S = ',s); delete(s,3,5); writeln('Xau ',s,' sau khi xoa 5 ky tu lien tiep'); writeln('bat dau tu ky tu thu 3 bang ',s); readln; End. Ví d 1.3. Nh p xâu ký t S có dài ít nh t b ng 20 và vi t ra màn hình n g m 5 ký t liên ti p c a xâu S t ký t th 3. uses crt; var s:string; Begin clrscr; repeat write('Nhap xau ky tu S khong ngan hon 20: '); readln(s1); until length(s)>=20; writeln('Xau nhap vao S = ',s); writeln('Doan gom 5 ky tu lien tiep cua xau ',s); writeln('bat dau tu ky tu thu 3 bang ',copy(s,3,5)); readln; End. Ví d 2. Vi t ch ng trình nh p t bàn phím m t ký t C và m t xâu ký t S. Hãy cho bi t s l n xu t hi n c a C trong S. K t qu thông báo ra màn hình. gi i bài toán này, ta l n l t xét các ký t c a xâu S b t u t ký t th nh t n ký t cu i cùng, v i m i ký t ó, ta so sánh v i C, n u hai ký t b ng nhau, ta t ng l n xu t hi n c a C thêm 1. th hi n vi c xét l n l t t ký t th nh t n ký cu i, ta dùng câu l nh While trong ó ch s ch y i bi n thiên t 1 n dài a xâu S. Sau ây là ch ng trình. uses crt; var c:char;s:string; n,i,m:byte; Begin clrscr; write('Nhap ky tu C = ');readln(c): write('Nhap xau ky tu S = ');readln(S): n:=length(s); m:=0;i:=1; while i<=n do begin
  • 30. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 30 if s[i]=c then inc(m); inc(i); end; writeln('So lan ',c,' xuat hien trong ',s,' bang ',m); readln; end; Ví d 2'. T ng t nh ví d tr c nh ng ta ch c n bi t ký t c có xu t hi n trong xâu S không. uses crt; var c:char; found:boolean; s:string; i,n:byte; Begin clrscr; write('Nhap mot ky tu: ');readln(c); write('Nhap mot xau ky tu: ');readln(s); n:=length(s); writeln('Do dai cua xau ',s,' bang ',n); found:=false; while i<=n do begin if s[i]=c then begin found:=true;break;end; inc(i); end; if not(found) then writeln('Ky tu ',c,' khong xuat hien trong xau ',s) else writeln('Ky tu ',c,' xuat hien trong xau ',s) readln; End. Ví d 3. Vi t ch ng trình nh p t bàn phím xâu ký t S. Hãy cho bi t có hay không t xâu ký t X≠S sao cho S là ghép m t s l n xâu X. N u có xâu X nh v y, ch n xâu X có dài l n nh t có th c. K t qu thông báo ra màn hình nh sau: N u không có xâu X nh v y, vi t s 0, n u có, vi t s K là dài xâu X. Ta có nh n xét sau: n u có xâu X, dài c a xâu X b ng K ph i là c c a N, dài xâu S và X ph i là n u g m K ký t c a S. Do ó, v i m i giá tr K là c c a N, ký hi u L = N div K, ta xét xâu S1 là ghép c a L n u g m K ký t c a S. u S1 = S, ta có n u ó là m t xâu X c n tìm. Vì yêu câu ch n X có dài l n nh t, ta xét các giá tr K gi m d n, giá tr u tiên tho mãn co X có dài l n nh t. ghi nh n vi c có/không có xâu X, ta dùng m t bi n ki u Boolean Found mà Found = True n u có X và b ng False n u không có X. Sau ây là ch ng trình uses crt; var
  • 31. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 31 s,s1,x:string; n,i,m,l:byte; found:boolean; Begin clrscr; write('Nhap xau ky tu S = ');readln(S): n:=length(s); found:=false; for k:=n-1 downto 1 do if n mod k = 0 then begin x:=copy(s,1,k);l:=n div k; s1:=''; for i:=1 to l do s1:=s1+x; if s1=s then begin found:=true;break;end; end; if found then writeln(k) else writeln(0); readln; end; 3. CÁC KI U D LI U PH C T P 3.1. D li u ki u m ng Trong các bài toán, ta th ng g p các dãy s , dãy xâu ký t , b ng s , . . D li u ki u ng cho phép ta th hi n các i l ng thu c lo i này. th hi n các dãy, ta dùng ng m t chi u, các b ng g m các dòng và các c t, ta dùng m ng hai chi u. 3.1.1. Cách khai báo i v i bi n là m ng m t chi u, ta khai báo nh sau: Tên bi n:Array[CSD..CSC] Of ki u; u A là m ng m t chi u, ta hình dung nó là m t dãy các ph n t có ch s t CSD n CSC. Khi ó ph n t có ch s I c ký hi u là A[I]. CSD (ch s u) và CSC (ch s cu i) ch có th là - Hai s nguyên mà CSD≤CSC, ho c - Hai ký t thu c b ng mã ASCII mà CSD≤CSC. Ki u có th là m i ki u mà Pascal ch p nh n tr ki u File (ta s nói n trong cu i ch ng này). Ví d 1. Các khai báo sau là h p l : A:Array[-10..100] Of Real; B:Array['A'..'Z'] Of Integer; Ví d 2. V i bài toán cho dãy s nguyên A g m không quá 100 s h ng, các s h ng có tr tuy t i không quá 1000. . . . th hi n dãy A, ta có th khai báo A:Array[1..100] Of Integer; ng nhi u chi u dùng th hi n các b ng s có nhi u ch s . Ch ng h n khi gi i m t h ph ng trình tuy n tính M ph ng trình v i N n s a11X1 + a12X2 + . . . +a1NXN = b1 a21X1 + a22X2 + . . . +a2NXN = b2
  • 32. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 32 . . . . . aM1X1 + aM2X2 + . . . +aMNXN = bM ta quan tâm n b ng h s a11 a12 . . . a1N a21 a22 . . . a2N . . . . . aM1 aM22 . . . aMN th hi n b ng s này, ta có th dùng m ng hai chi u. Bi n m ng hai chi u c khai báo nh sau: Tên bi n:Array[CSD1..CSC1,CSD2..CSC2] Of ki u; trong ó các CSD (ch s u) và các CSC (ch s cu i) ch có th là - Hai s nguyên mà CSD≤CSC, ho c - Hai ký t thu c b ng mã ASCII mà CSD≤CSC. Ki u có th là m i ki u mà Pascal ch p nh n tr ki u File. u A là m t m ng hai chi u, ta hình dung A là m t b ng g m các dòng ánh s t CSD1 n CSC1 và các c t ánh s t CSD2 n CSC2, ch s th nh t là ch s dòng, ch s th hai là ch s c t. Ph n t dòng I c t J c ký hi u là A[I,J]. Ví d 1. Các khai báo sau là h p l : A:Array[-10..100,'a'..'z'] Of Real; B:Array['A'..'Z',-100..100] Of Integer; Ví d 2. i h ph ng trình tuy n tính nói trên, ta có th th hi n m ng các h s (gi s M, N ≤ 100) b ng m ng hai chi u A:Array[1..100,1..100] Of Real; Chú ý. Trong các bài toán ta th ng g p các gi thi t sau: - Nh p m t dãy N s , N ≤ 1000, ho c - Nh p m t b ng s g m M dòng và N c t, M, N ≤ 100 Vi c gi i h n các giá tr c a M và N cho ta bi t mi n bi n thiên c a các ch s c a các ph n t c a m ng. Khi khai báo m ng trong các m c Type ho c Var, các giá tr CSD và CSC n lúc ó u ph i là các h ng s xác nh ch không th là là m t bi n ho c m t bi u th c mà ta ch a xác nh c giá tr c th . Ví d các khai báo sau s là sai n u tr c ó, giá tr c a N không c bi t. B:Array[1..N] Of Integer; C:Array[1..N] Of Real; 3.1.2. Câu l nh For . . . 3.1.2.1. Gi i thi u l nh nh này c g i là l nh l p v i s b c l p xác nh. L nh có m t trong hai d ng sau: For tênbi n:=CS1 to CS2 Do nhóml nh; (1) For tênbi n:=CS2 Downto CS1 Do nhóml nh; (2)
  • 33. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 33 Trong các l nh này, bi n còn th ng c g i là ch s ch y. Khi vi t l nh này, Pascal quy nh nh sau: 1. Bi n, CS1 và CS2 ph i cùng ki u ch thu c m t trong hai lo i s nguyên ho c ký t . 2. CS1 và CS2 ph i có giá tr ã bi t tr c khi th c hi n l nh này; CS1≤CS2. 3. u nhóm l nh có h n m t l nh, nhóm l nh ph i t gi a m t c p Begin- End. Khi th c hi n l nh (1), v i m i giá tr c a bi n t ng d n t CS1 n CS2, nhóm l nh c th c hi n. N u t i giá tr nào c a bi n mà khi th c hi n nhóm l nh, l nh Break c th c hi n thì vòng l p k t thúc và l nh ngay ti p theo vòng l p c th c hi n ti p. Khi th c hi n l nh (2), v i m i giá tr c a bi n gi m d n t CS2 n CS1, nhóm l nh c th c hi n. N u t i giá tr nào c a bi n mà khi th c hi n nhóm l nh, l nh Break c th c hi n thì vòng l p k t thúc và l nh ngay ti p theo vòng l p c th c hi n ti p. 3.1.2.2. L nh Break ng t nh i v i câu l nh Repeat ... Until ...; n u khi th c hi n các l nh trong nhóm l nh c a l nh For . . ., n u l nh Break c th c hi n thì vòng l p k t thúc và sau ó th c hi n l nh ti p theo c a ch ng trình. 3.1.3. Cách nh n giá tr cho bi n ki u m ng u có hai m ng A, B cùng kích th c và ki u ph n t nh nhau ng th i ta ã bi t giá tr c a B thì ta có th nh n giá tr cho A b ng l nh gán A:=B; Th ng ta nh n giá tr c a m ng b ng cách dùng câu l nh l p v i s b c l p xác nh nh n giá tr cho t ng ph n t . ây là cách nh n giá tr ph bi n nh t. N u ng là m t chi u, ta dùng m t vòng l p For, n u m ng là hai chi u, ta dùng hai vòng l p For. Gi s m ng m t chi u A có N ph n t v i ch s t 1 n N, nh n giá tr cho ng A, ta dùng l nh For I:=1 to N do <Nh n giá tr cho ph n t A[I]> Khi nh n giá tr cho A[I], tu theo ki u d li u c a ph n t , ta có th nh n t bàn phím ho c b ng l nh gán. Gi s m ng hai chi u B có M dòng và N c t, nh n giá tr cho m ng B, ta dùng nh For I:=1 to M do For J:=1 to N do <Nh n giá tr cho ph n t B[I,J]> Khi nh n giá tr cho B[I,J], tu theo ki u d li u c a ph n t , ta có th nh n t bàn phím ho c b ng l nh gán. Chú ý. i v i bi n ki u m ng, vi c dùng l nh Read(tên bi n); ho c ReadLn(tên bi n); không h p l .
  • 34. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 34 Ví d . n ch ng trình sau cho phép ta nh p m t dãy A g m N s nguyên v i N≤100 các s h ng có tr tuy t i không l n h n 1000. Var N,I:Integer; A:Array[1..100] Of Integer; . . . . . . . . . . . . . . . Write('Nh p s l ng s h ng c a dãy, N = ');Readln(N); For i:=1 to N Do Begin Write('S h ng th ',i,' b ng ');Readln(A[i]); End; . . . . . . . . . . . . . . . 3.1.4. Cách vi t giá tr m ng ra màn hình Mu n vi t giá tr m ng ra màn hình, ta ph i vi t giá tr t ng ph n t c a m ng b ng cách dùng câu l nh For. Gi s m ng m t chi u A có N ph n t v i ch s t 1 n N, vi t giá tr m ng A, ta dùng l nh For I:=1 to N do <Vi t giá tr ph n t A[I]> Gi s m ng hai chi u B có M dòng và N c t, vi t giá tr m ng B, ta dùng l nh For I:=1 to M do For J:=1 to N do <Vi t giá tr ph n t B[I,j]> Chú ý. i v i bi n ki u m ng, vi c dùng l nh Write(tên bi n); ho c WriteLn(tên bi n); không h p l . 3.1.5. Các ví d Ví d 1. Vi t ch ng trình nh p t bàn phím m t ký t C và m t xâu ký t S. Hãy cho bi t s l n xu t hi n c a C trong S. K t qu thông báo ra màn hình. gi i bài toán này, ta l n l t xét các ký t c a xâu S b t u t ký t th nh t n ký t cu i cùng, v i m i ký t ó, ta so sánh v i C, n u hai ký t b ng nhau, ta t ng l n xu t hi n c a C thêm 1. th hi n vi c xét l n l t t ký t th nh t n ký cu i, ta dùng câu l nh For trong ó ch s ch y bi n thiên t 1 n dài c a xâu S. Sau ây là ch ng trình. uses crt; var c:char;s:string; n,i,m:byte; Begin clrscr; write('Nhap ky tu C = ');readln(c): write('Nhap xau ky tu S = ');readln(S): n:=length(s); m:=0; for i:=1 to n do if s[i]=c then inc(m); writeln('So lan ',c,' xuat hien trong ',s,' bang ',m); readln;
  • 35. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 35 end; Ví d 2. Nh p t bàn phím xâu ký t S và cho bi t m i ch cái th ng xu t hi n trong S bao nhiêu l n, m i ch cái hoa xu t hi n trong S bao nhiêu l n. ghi nh n s l n xu t hi n các ch cái th ng, ta dùng m ng CT:Array['a'..'z'] of Byte; ghi nh n s l n xu t hi n các ch cái hoa, ta dùng m ng CH:Array['A'..'Z'] of Byte; i m i ký t S[I] c a xâu S, 1 ≤ I ≤ N = Length(s), n u S[I] là ch cái th ng, t ng CT[S[I]] m t n v , n u S[I] là ch cái hoa, t ng CH[S[I]] m t n v . Sau ây là ch ng trình uses crt; var ct:array['a'..'z'] of Byte; ch:array['A'..'Z'] of Byte; n,i:byte;c:char; s:string; Begin clrscr; write('Nhap xau ky tu S = ');readln(s); n:=length(s); for c:='a' to 'z' do ct[c]:=0; for c:='A' to 'Z' do ch[c]:=0; for i:=1 to n do begin if (s[i]>='a')and(s[i]<='z') then inc(ct[s[i]); if (s[i]>='A')and(s[i]<='Z') then inc(ch[s[i]); end; for c:='a' to 'z' do if ct[c]>0 then writeln('Chu cai thuong ',c,' xuat hien ',ct[c],' lan'); writeln('Cac chu cai thuong khac khong xuat hien'); for c:='A' to 'Z' do if ch[c]>0 then writeln('Chu cai hoa ',c,' xuat hien ',ch[c],' lan'); writeln('Cac chu cai hoa khac khong xuat hien'); readln; End. Ví d 3. Vi t ch ng trình nh p s nguyên d ng N<=1000 và dãy N s nguyên ng A[1], . ., A[N], các A[i] ≤ 1000. Hãy cho bi t dãy s ó có bao nhiêu giá tr khác nhau và m i giá tr ó là giá tr c a bao nhiêu s h ng c a dãy. Ngoài m ng A dùng th hi n dãy A, ta dùng m ng B :array[1..1000] of Word; trong ó B[I] là s l ng các s h ng có giá tr b ng I. Bi n S ghi nh n s giá tr khác nhau c a dãy. Ví d 21 uses crt; var
  • 36. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 36 a,b:array[1..1000] of word; n,i,s:word; BEGIN REPEAT CLRSCR; write('Moi ban nhap so nguyen duong N <= 1000 '); readln(n); until (n>0)and(n<=1000); writeln('Moi ban nhap ',N,' so nguyen duong <= 1000'); for i:=1 to n do repeat write('A[',I,'] = ');readln(a[i]); until (a[i]>0)and(a[i]<=1000); s:=0; for i:=1 to 1000 do b[i]:=0; for i:=1 to n do begin if b[a[i]]=0 then inc(s); inc(b[a[i]]); end; writeln('Day co ',s,' gia tri khac nhau'); writeln('Cac gia tri do la:'); for i:=1 to 1000 do if b[i]>0 then writeln('Co ',b[i],' so hang co gia tri bang ',i); readln; END. 3.2. D li u ki u t p h p li u ki u t p h p dùng th hi n các i l ng là t p h p. Nh ng khác v i khái ni m t p h p trong toán h c truy n th ng bao g m c các t p h p vô h n và h u h n i s ph n t b t k , trong Pascal ch ch p nh n các t p h p thoã mãn các u ki n sau: 1. i ph n t ph i cùng ki u d li u 2. Mi n giá tr c a ki u không quá 256 giá tr 3. ph n t c a t p h p không quá 256. 3.2.1. Cách khai báo Ta có th khai báo trong m c Var Tên bi n:SET OF ki u; Nh ã nói trên, ki u trong khai báo ch mi n mà ph n t thu c t p h p bi n thiên không th có quá 256 ph n t . Nh v y ta có th dùng các ki u Byte, Char ho c m t ki u li t kê do ta khai báo trong m c Type. Các khai báo nh sau là không h p l : SO:SET OF Integer; ST: SET OF Real; STR: SET OF String; Các khai báo sau là h p l : SO:SET OF Byte;
  • 37. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 37 KT:SET OF Char; CS:SET OF 0..9; p tr ng c ký hi u là []. u ta bi t các ph n t c a m t t p h p, ta có th li t kê m i ph n t ó trong c p u ngo c vuông, khi ó n u các giá tr là m t n liên ti p các s nguyên ho c ký , ta ch c n vi t <Giátr u>..<Giátr cu i> Ví d chuthuong:=['a'..'z']; chuhoa:=['A'..'Z']; chuso:=['0'..'9']; pheptoan:=['+','-','*','/']; Ta c ng có th khai báo các bi n sau: p ch g m các ch cái th ng: ct:set of 'a'..'z'; p ch g m các ch cái hoa: ch:set of 'A'..'Z'; p ch g m các ch s : chs:set of '0'..'9'; 6.2. Các phép toán t p h p và các hàm liên quan i v i các bi n ki u t p h p có cùng ki u các ph n t , ta có th th c hi n các phép toán: Phép h p ký hi u +, Phép giao ký hi u *, Phép tr ký hi u -. Hàm thu c x IN A: Hàm nh n giá tr True n u x là ph n t thu c t p A và False trong tr ng h p ng c l i. ng sau ây cho ta th y s khác nhau gi a cách vi t trong Toán h c và trong Pascal Toán h c Pascal A∪B A+B A∩B A*B A-B A-B x∈A x In A y∉A Not(y in A) 6.3. Cách nh n giá tr cho bi n ki u t p h p i v i các bi n ki u t p h p, ta ch có th nh n giá tr b ng l nh gán Tên bi n t p h p:=T p h p cùng ki u ph n t ; Ví d : C:=A+B; ho c D:=[ ];. Chú ý. i v i bi n ki u t p h p, vi c dùng l nh Read(tên bi n); ho c ReadLn(tên bi n); không h p l . 6.4. Cách vi t giá tr c a t p h p ra màn hình vi t t p h p ra màn hình ta không c phép dùng l nh
  • 38. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 38 Write/Writeln(tên bi n t p h p); Tu theo ki u ph n t c a t p h p, ta ph i vi t t ng ph n t c a t p h p ng cách cho m t ch s ch y qua mi n giá tr c a ki u ph n t và dùng hàm thu c ki m tra xem giá tr nào c a ch s ch y thu c t p h p thì vi t giá tr ó ra. Ví d 1. N u ta khai báo ct:set of 'a'..'z'; thì vi t t p CT ra màn hình, ta có th dùng n ch ng trình sau: Writeln('Tap CT gom cac ky tu:'); For c:= to do if c in ct then write(c:2); Ví d 2. Vi t ch ng trình nh p t bàn phím m t ký t C và cho bi t kh n ng nào trong các kh n ng sau x y ra: C là ch cái th ng C là ch cái hoa C là ch s C là d u phép toán s h c +, -, *, / Sau ây là ch ng trình. uses crt; const chuthuong:set of char=['a'..'z']; chuhoa:set of char=['A'..'Z']; chuso:set of char=['0'..'9']; pheptoan:set of char=['+','-','*','/']; var c:char; Begin clrscr; write('Nhap ky tu C = ');readln(c); if c in chuthuong then writeln(c,' la chu cai thuong') else if c in chuhoa then writeln(c,' la chu cai hoa') else if c in chuso then writeln(c,' la chu so') else if c in pheptoan then writeln(c,' la dau phep toan') else writeln(c,' khong la dau phep toan, chu so, chu cai'); readln; End. Ví d 3. Vi t ch ng trình nh p s nguyên d ng N<=1000 và dãy N s nguyên ng A[1], . ., A[N], các A[i] ≤ 200. Hãy cho bi t dãy s ó có bao nhiêu giá tr khác nhau và m i giá tr là giá tr c a các s h ng nào c a dãy.
  • 39. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 39 Ch ng trình sau ây s gi i bài toán này. Tuy nhiên ta c n chú ý r ng các khai báo mà ta ti n hành c trong ch ng trình này c bi t vi c dùng d li u ki u t p h p là ch p nh n c do gi thi t v d li u. N u không có các u ki n ó, cách t ch c d li u ph i khác. Uses Crt; Var n,i,j,k,dem,skn:Integer; A:Array[1..1000] of Byte; kn:Set of Byte; Begin ClrScr; Write('Nh p s l ng s h ng c a dãy, N = ');Readln(N); For i:=1 to N Do Begin Write('S h ng th ',i,' b ng ');Readln(A[i]); End; kn:=[];skn:=0; For i:=1 to n Do If Not(A[i] in kn) Then Begin kn:=kn+[a[i]];skn:=skn+1;End; KN ∪ {A[I]} dem:=0; Writeln('Có t t c ',skn,' giá tr khác nhau'); For i:=1 to N Do If A[i] In kn Then Begin dem:=dem+1; Write('Giá tr khác nhau th ',dem,' là ',A[i],' và b ng các s ng th : '); For J:=I To N Do If A[j]=A[i] Then Write(J:4);Writeln; kn:=kn-[A[i]]; End; Readln End. 3.3. D li u ki u b n ghi li u ki u b n ghi dùng th hi n m t lo t các i t ng, các i t ng này u có cùng m t s thu c tính mà m i thu c tính nói chung có ki u d li u khác nhau. Ví d khi xem xét m thi h c k c a các h c sinh trong m t l p, i v i m i h c sinh, ta s quan tâm n các thu c tính nh h và tên, ngày sinh, nam hay n , các m c a các môn thi, . . . t ví d khác, khi xem xét doanh s c a m t c a hàng, ta quan tâm n t p các hoá n bán hàng, m i hoá n u có các thu c tính nh tên hàng, n giá, ch ng lo i, l ng bán, giá thành, ng i bán, ng i mua, ngày bán, . . . th hi n hàng lo t i t ng nh v y, ta có th dùng d li u ki u b n ghi (Record). M i i t ng c n qu n lý s c th hi n b ng m t b n ghi. M i b n ghi m m t s tr ng (Field). M i thu c tính c th hi n b i m t tr ng (Field) c a n ghi, m i tr ng c khai báo d i d ng Tên tr ng:Ki u;
  • 40. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 40 3.3.1. Cách khai báo i bi n ki u b n ghi ta có th khai báo Tên bi n: RECORD Tên tr ng 1:ki u; . . . . . . . . . Tên tr ng k:ki u; END; Do d li u ki u b n ghi th ng dùng mô t m t lo t i t ng nên ta th ng khai báo m t ki u b n ghi trong m c Type và sau ó trong m c Var ta khai báo các bi n liên quan. Type Tênki ub nghi = RECORD Tên tr ng 1:ki u tr ng 1; . . . . . . . . . Tên tr ng k:ki u tr ng k; END; Var tên bi n: tênki ub nghi; tênm ng:array[1..maxN] of tênki ub nghi; Ví d 1. th hi n lo i i t ng sinh viên v i các thu c tính c n qu n lý là h và tên, ngày sinh, nam hay n , các m thi gi i tích, i s , tri t h c, v t lý, ta có th khai báo nh sau: Type SV = Record HT:String[30]; NS:String[8]; NN:Boolean; GT,DS,TH,VL:Real; End; {quy c N - True, Nam - False} Var A,B:SV; Lop:Array[1..60] of SV; Ví d 2. th hi n các m trên m t ph ng to , ta có th khai báo nh sau: Type Diem = Record x,y:real; End; Var M:diem; DG:array[1..100] of diem;
  • 41. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 41 { a giác có s nh không quá 100} u A là bi n ki u b n ghi và X là tên m t tr ng c a A, khi vi n n tr ng X, ta vi t A.X. 3.3.2. Cách nh n giá tr nh n giá tr cho bi n ki u b n ghi, có hai cách: Dùng l nh gán: n u A và B là hai bi n ki u b n ghi nh nhau và ta ã bi t giá tr c a B thì ta có th gán giá tr c a B cho A b ng l nh A:=B; Nh n giá tr c a t ng tr ng. Khi ó, cách nh n giá tr c a tr ng s theo quy nh a ki u d li u t ng ng. Ví d 1. n qu n lý m t l p có N h c sinh, N<=60. V i m i h c sinh c n qu n lý các y u t H và Tên, Tu i, a Ch , m Toán, m V n, Phân Lo i. Phân lo i c tính nh sau: u Toán+V n<10 Thì Phân lo i='KEM' u (Toán+V n<14)và(Toán+V n>=10) Thì Phân lo i='TRUNG BINH' u (Toán+V n>=14)và(Toán+V n<18) Thì Phân lo i='KHA' u Toán+V n>18 Thì Phân lo i='GIOI' Chú ý r ng trong các y u t c n qu n lý thì ch có 5 y u t u là c l p còn y u t phân lo i có th tính c theo các m Toán và V n. th hi n m t h c sinh, ta dùng ki u d li u b n ghi v i 6 tr ng t ng ng th hi n sáu y u t c n qu n lý c a t h c sinh. Ch ng trình qu n lý l p h c Uses CRT; Type HS= Record HT:String[30]; TUOI:Byte; DC:String[50]; T,V:Real; PL:String[10]; End; Var LOP:Array[1..60] Of HS; N,I,J:Byte; X:HS; Begin Clrscr; Repeat Write('So luong hoc sinh trong lop N = ');Readln(N); Until (N>0)And(N<=60); For I:=1 to N Do Begin Writeln('Cac so lieu ve hoc sinh thu ',I,': '); Write('Ho va ten: ');Readln(lop[i].HT);
  • 42. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 42 Write('Tuoi: ');Readln(lop[i].TUOI); Write('Dia chi: ');Readln(lop[i].DC); Write('Diem Toan: ');Readln(lop[i].T); Write('Diem Van: ');Readln(lop[i].V); If lop[i].T+lop[i].V<10 Then lop[i].pl:='KEM'; If (lop[i].T+lop[i].V>=10)And(lop[i].T+lop[i].V<14) Then lop[i].pl:='TRUNG BINH'; If (lop[i].T+lop[i].V>=14)And(lop[i].T+lop[i].V<18) Then lop[i].pl:='KHA'; If lop[i].T+lop[i].V>=18 Then lop[i].pl:='GIOI'; End; ClrScr; Writeln('Danh sach phan loai hoc sinh trong lop:'); For I:=1 To N Do Writeln(lop[i].HT:30,' - Phan loai: ',lop[i].pl); Readln; End. 3.3.3. Câu l nh WITH Trong ch ng trình c a ví d 1, ta th y sau câu l nh For . . . m i khi c p n m t tr ng c a bi n ki u b n ghi Lop[i], ta u ph i vi t Lop[i].têntr ng Có bao nhiêu tr ng c n xem xét, ta ph i vi t kèm b y nhiêu l n lop[i]. Câu l nh sau ây có th xem nh m t cách Pascal giúp ta t tên bi n ki u b n ghi “làm th a s chung” khi c n nh c n nhi u tr ng c a cùng m t bi n ki u b n ghi. WITH <tênbi nki ub nghi> DO <Nhóm l nh>; i câu l nh này, trong nhóm l nh, khi vi t m t tr ng c a bi n b n ghi, ta ch c n vi t tên tr ng ó. u nhóm l nh có h n m t l nh, các l nh này ph i t trong m t c p Begin-End; Ví d 2. Ta có th vi t l i ch ng trình trong Ví d 1 nh sau: Uses CRT; Type HS= Record HT:String[30]; TUOI:Byte; DC:String[50]; T,V:Real; PL:String[10]; End; Var LOP:Array[1..60] Of HS; N,I,J:Byte; X:HS; Begin Clrscr; Repeat Write('So luong hoc sinh trong lop N = ');Readln(N);
  • 43. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 43 Until (N>0)And(N<=60); For I:=1 to N Do With lop[i] Do Begin Writeln('Cac so lieu ve hoc sinh thu ',I,': '); Write('Ho va ten: ');Readln(HT); Write('Tuoi: ');Readln(TUOI); Write('Dia chi: ');Readln(DC); Write('Diem Toan: ');Readln(T); Write('Diem Van: ');Readln(V); If T+V<10 Then pl:='KEM'; If (T+V>=10)And(T+V<14) Then pl:='TRUNG BINH'; If (T+V>=14)And(T+V<18) Then pl:='KHA'; If T+V>=18 Then pl:='GIOI'; End; ClrScr; Writeln('Danh sach phan loai hoc sinh trong lop:'); For I:=1 To N Do Writeln(lop[i].HT:30,' - Phan loai: ',lop[i].pl); Readln; End. 3.4. File v n b n 3.4.1. Công d ng c a d li u ki u file Trong các ch ng trình tr c, nhi u khi ta m t r t nhi u th i gian nh p d li u t bàn phím. Các d li u ó c ng nh các k t qu thu c u m t sau khi th c hi n xong ch ng trình. ó là u b t h p lý. D li u ki u file cho phép ta l u l i các thông tin d i d ng file trên các a có th dùng lâu dài. 3.4.2. C u trúc c a file v n b n File v n b n (File Text) là file c c u t o t các ký t thu c b ng mã ASCII, các ký t này c s p x p thành các dòng (Line), m i dòng có dài nói chung khác nhau th m chí có th có dòng tr ng. Các file này c g i là các file truy nh p tu n t có ngh a là ta ch có th c nó t u cho n lúc không mu n c ti p ho c h t file. Tuy nhiên lo i file này r t thu n ti n cho vi c t ch c d li u cho các ch ng trình. 3.4.3. Cách khai báo Mu n có m t bi n ki u file v n b n, ta có th khai báo trong m c Var Tên bi n file:TEXT; khi ó ta có m t bi n mà giá tr c a nó là m t file v n b n. 3.4.4. Cách t o l p file v n b n t o l p m t file v n b n, có hai cách chính. Cách th nh t. Ta có th dùng m t h so n th o v n b n b t k , ch ng h n so n th o a chính Pascal t o l p file v n b n theo c u trúc c mô t c a file ó. Ví d , C n t o l p m t file v n b n v i tên DAYSN.DAT ghi các thông tin v m t dãy s nguyên có N s h ng, N≤100 và các s h ng có tr tuy t i không l n h n
  • 44. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 44 1000. Dòng th nh t c a file ghi s N. Trong N dòng ti p theo, m i dòng ghi m t s ng c a dãy l n l t t s h ng th nh t n s h ng th N. Ta có th làm nh sau: m m t màn hình so n th o m i, ch n m t s N≤100, ví d ch n N=10 và gõ dòng th nh t s 10, sau ó trong 10 dòng ti p theo, m i dòng gõ t s nguyên có tr tuy t i không l n h n 1000. Gõ phím F2 và gõ tên file DAYSN.DAT r i gõ Enter. Cách t o l p file này th ng dùng t o các d li u nh th ch ng trình khi ch ng trình c n a d li u vào t file v n b n. Cách th hai. Dùng nhóm b n l nh sau c a Pascal: ASSIGN(Tên bi n File,’Tên file’); REWRITE(Tên bi n File); . . . . . . . . . . WRITE/WRITELN(Tên bi n File,bi n ho c giá tr ki u n gi n); {WRITE/WRITELN(Tên bi n File,bi n ho c giá tr ki u n gi n:K);} . . . . . . . . . . CLOSE(Tên bi n File); Chú ý Khi dùng ch ng trình t o l p m t file v n b n, th ng ta ã có ý nh tr c v u trúc c a file này, c n c vào c u trúc ó, ta s dùng các l nh thích h p. i v i file v n b n, có hai cách vi t vào file: Write có ngh a là n u vi t ti p thì vi t trên cùng m t dòng c a file, còn Writeln có ngh a là n u vi t ti p thì vi t vào u dòng ti p theo c a file. nh WRITELN(Tên bi n File); có ngh a là xu ng dòng n u l nh vi t vào file tr c ó là Write; có ngh a là vi t vào file m t dòng tr ng n u l nh vi t vào file tr c ó là Writeln. u tên file là xâu ký t r ng, vi c vi t này chính là vi t ra màn hình. Th c ra H u hành MSDOS quan ni m màn hình là m t file v n b n c bi t. Do ó, th c ch t vi c vi t ra màn hình là tr ng h p riêng c a vi c vi t ra file v n b n. Tuy nhiên do ta h c cách vi t ra màn hình tr c, nên t nay ch c n chú ý m i cách vi t vào file (k c cách vi t có quy cách) t ng t nh vi t ra màn hình. Cách t o l p file này th ng dùng ghi nh n các thông tin thu c trong quá trình ch y ch ng trình ho c t o l p các file d li u l n. Ví d 1. Hãy t o l p m t file v n b n có tên DAYSN.DAT ghi các thông tin v m t dãy s nguyên có N s h ng, N≤3000 và các s h ng có tr tuy t i không l n h n 1000. Dòng th nh t ghi s nguyên d ng N. Trong các dòng ti p theo, ghi N s nguyên mà m i dòng g m 10 s tr ra có th dòng cu i cùng, hai s liên ti p trên m t dòng cách nhau ít nh t m t ký t r ng. Sau ây là ch ng trình làm vi c này. Uses Crt; Var
  • 45. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 45 N,I,X:Integer; F:Text; Begin ClrScr; Write('B n c n nh p bao nhiêu s , N = ');Readln(N); Assign(F,'DAYSN.DAT'); Rewrite(F); Writeln(F,N); For I:=1 To N Do Begin Write('Nh p s th ',I,': ');Readln(X); Write(F,X,' '); If I Mod 10 = 0 Then Writeln(F); End; Close(F); End. Sau khi th c hi n ch ng trình này, ta nh n c file có tên DAYSN.DAT trong th c ta ang làm vi c v i Pascal. ki m tra k t qu , ta có th a con tr n sau dòng END. c a ch ng trình và gõ t h p phím Ctrl+K+R, gõ tên file DAYSN.DAT i gõ Enter. File này s c a ra màn hình t i v trí c a con tr . Ta c ng có th a con tr n ph n ghi tên file và gõ t h p phím Ctrl+Enter. Ví d 2. Hãy t o l p m t file v n b n có tên MANG.DAT trong ó dòng th nh t ghi hai s nguyên d ng M, N<=100. Trong M dòng ti p theo, dòng th I ghi N s nguyên l n l t là các ph n t A[I,1], . ., A[I,N] c a dòng th I c a m t m ng A, hai liên ti p trên m t dòng cách nhau ít nh t m t ký t r ng. Sau ây là ch ng trình làm vi c này. Uses Crt; Var M,N,I,J,X:Integer; F:Text; Begin ClrScr; Write('B n c n nh p m ng có s dòng M = ');Readln(M); Write('B n c n nh p m ng có s c t N = ');Readln(N); Assign(F,'MANG.DAT'); Rewrite(F); Writeln(F,M,' ',N); For I:=1 To M Do Begin For J:=1 To N Do Begin Write('A[ ',I,',',J,'] = ');Readln(X); Wrtie(F,X,' '); End; Writeln(F); End;
  • 46. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 46 Close(F); End. Chú ý. Các ch ng trình trên có th s a t o m t m ng ng u nhiên g m các s nguyên. Ví d n u ta mu n m ng có s dòng và s c t là m t s nguyên d ng ng u nhiên không quá 100 còn các ph n t c a m ng là các s nguyên ng u nhiên trong ph m vi t -1000 n 1000, ta có th dùng ch ng trình sau: Uses Crt; Var M,N,I,J,X:Integer; F:Text; Begin ClrScr; Randomize; {l nh này cho phép kh i t o quá trình sinh ng u nhiên} M:=Random(100)+1;N:=Random(100)+1; Assign(F,'MANG.DAT'); Rewrite(F); Writeln(F,M,' ',N); For I:=1 To M Do Begin For J:=1 To N Do Begin X:=random(2001)-1000; Wrtie(F,X,' '); End; Writeln(F); End; Close(F); End. 3.4.5. c thông tin t file v n b n Tr ng h p 1: Không bi t h n v c u trúc c a file u không bi t c u trúc c a file, ta ch có th c l n l t t dòng u tiên n dòng cu i cùng c a file và trên m i dòng, t ng ký t t trái sang ph i. Nhóm b n l nh sau c a Pascal cho phép ta c t ng ký t t file. ASSIGN(Tên bi n File,'Tên file'); RESET(Tên bi n File); . . . . . . . . . . READ(Tên bi n File,Bi n ki u Char); . . . . . . . . . . CLOSE(Tên bi n File); Ngoài ra, do file v n b n c c u t o t các ký t c s p x p thành các dòng không nh nhau, vi c c file khi ti n hành tu n t t ng ký t v n có m t con tr file th hi n v trí ký t ang c c. Pascal có các hàm chu n sau ph c v cho quá trình c này.
  • 47. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 47 Hàm SEEKEOF(tên bi n file): Có giá tr ki u Boolean b ng True n u con tr file v trí cu i file và False n u con tr file ch a v trí cu i file. Hàm EOLN(tên bi n file): Có giá tr ki u Boolean b ng True n u con tr file v trí cu i dòng và False n u con tr file ch a v trí cu i dòng. Hàm SEEKEOLN(tên bi n file): Có giá tr ki u Boolean b ng True n u con tr file v trí cu i dòng và False n u con tr file ch a v trí cu i dòng. Ví d 3. Gi s có m t file v n b n có tên VB.TXT. Ta c n bi t m i ch cái ti ng Anh xu t hi n trong file này bao nhiêu l n. K t qu ghi ra file XH.TXT nh sau: v i i ch cái vi t ra m t dòng tên ch cái, ti p theo là s l n xu t hi n c a nó. Ch ng trình sau s gi i bài toán này. Uses Crt; Var F:Text; A:Array['A'..'Z'] Of LongInt; C:Char; Begin FillChar(A,SizeOf(A),0); {L nh này t ng ng v i For c:= to do A[c]:=0} Assign(F,'VB.TXT'); Reset(F); While Not(SeekEof(F)) Do begin While not(Eoln(F)) do begin Read(F,C); If (Upcase(C)>='A')AND(Upcase(C)<='Z') then Inc(A[Upcase(C)]); End; Readln(F); End; Close(F); assign(f, xh.txt );rewrite(f); Writeln(f,'S l n xu t hi n các ch cái là'); For C:='A' To 'Z' Do Writeln(f,C,' ',A[C]); close(f); End. Tr ng h p 2: Bi t thêm c u trúc c a file Tr ng h p này x y ra khi ta dùng file v n b n a d li u vào ch ng trình. Khi ó, ng i ta th ng nói r t chính xác v c u trúc file. Các c u trúc ph bi n th ng là 1. File ch ghi các s . Khi ó, các s liên ti p bao gi c ng cách nhau ít nh t m t ký r ng. C n c vào cách mô t file ta s c các s ra các bi n có ki u phù h p v i mô t . ng d n khi c các s
  • 48. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 48 1. N u m i dòng ch ghi m t s , dùng l nh Readln(Tên bi n file,bi n ki u s ); 2. N u bi t tr c s l ng s ghi trong file, có bao nhiêu s dùng b y nhiêu l n nh Read(tenbienfile,bienkieuso); ta s c c các s . 3. N u m i dòng ghi nhi u s , v i m i dòng, dùng nhóm l nh While not(seekeoln(tenbienfile)) Do read(tenbienfile,bienkieuso); Readln(tenbienfile); Ví d 4. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng có tr tuy t i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s h ng d ng và bao nhiêu h ng âm. D li u vào c cho b i file v n b n DAYSN.DAT trong ó dòng th nh t ghi s N, trong N dòng ti p theo, dòng th I ghi s h ng th I c a dãy. K t qu ghi ra file v n b n KQ.TXT nh sau: dòng th nh t ghi s l ng s h ng d ng, dòng th hai ghi s l ng s h ng âm. Sau ây là ch ng trình const fi='daysn.dat'; fo='kq.txt'; var f:text; n,i:byte; a:array[1..100] of integer; sd,sa:byte; Begin Assign(f,fi);reset(f); readln(f,n); for i:=1 to n do readln(f,a[i]); close(f); sd:=0;sa:=0; for i:=1 to n do begin if a[i]>0 then inc(sd); if a[i]<0 then inc(sa); end; assign(f,fo);rewrite(f); writeln(f, So so hang duong bang ,sd); writeln(f, So so hang am bang ,sa); close(f); End. Ví d 4’. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng có tr tuy t i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s ng d ng và bao nhiêu s h ng âm. D li u vào c cho b i file v n
  • 49. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 49 n DAYSN.DAT trong ó dòng th nh t ghi s N, trong m t s dòng ti p theo ghi N s , s th I là s h ng th I c a dãy. K t qu ghi ra file v n b n KQ.TXT nh sau: dòng th nh t ghi s l ng s h ng d ng, dòng th hai ghi s l ng s h ng âm. const fi='daysn.dat'; fo='kq.txt'; var f:text; n,i:byte; a:array[1..100] of integer; sd,sa:byte; Begin Assign(f,fi);reset(f); readln(f,n); for i:=1 to n do read(f,a[i]); close(f); sd:=0;sa:=0; for i:=1 to n do begin if a[i]>0 then inc(sd); if a[i]<0 then inc(sa); end; assign(f,fo);rewrite(f); writeln(f, So so hang duong bang ,sd); writeln(f, So so hang am bang ,sa); close(f); End. Ví d 4’'. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng có tr tuy t i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s ng d ng và bao nhiêu s h ng âm. D li u vào c cho b i file v n n DAYSN.DAT trong ó dòng th nh t ghi N s , s th I là s h ng th I c a dãy. K t qu ghi ra file v n b n KQ.TXT nh sau: dòng th nh t ghi l ng s h ng d ng, dòng th hai ghi s l ng s h ng âm. const fi='daysn.dat'; fo='kq.txt'; var f:text; n,i:byte; a:array[1..100] of integer; sd,sa:byte; Begin Assign(f,fi);reset(f);
  • 50. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 50 n:=0; While not(seekeoln(f)) do begin inc(n);read(f,a[n]); end; close(f); sd:=0;sa:=0; for i:=1 to n do begin if a[i]>0 then inc(sd); if a[i]<0 then inc(sa); end; assign(f,fo);rewrite(f); writeln(f, So so hang duong bang ,sd); writeln(f, So so hang am bang ,sa); close(f); End. Ví d 4’''. Cho m t dãy s nguyên g m N s h ng, N≤100 và các s h ng có tr tuy t i không l n h n 1000. Hãy cho bi t dãy có bao nhiêu s ng d ng và bao nhiêu s h ng âm. D li u vào c cho b i file v n n DAYSN.DAT g m m t s dòng ghi N s h ng c a dãy, s th I là s ng th I c a dãy. K t qu ghi ra file v n b n KQ.TXT nh sau: dòng th nh t ghi s l ng s h ng d ng, dòng th hai ghi s l ng s h ng âm. const fi='daysn.dat'; fo='kq.txt'; var f:text; n,i:byte; a:array[1..100] of integer; sd,sa:byte; Begin Assign(f,fi);reset(f); n:=0; While not(seekeof(f)) do begin While not(seekeoln(f)) do begin inc(n);read(f,a[n]); end; readln(f); end; close(f); sd:=0;sa:=0; for i:=1 to n do begin
  • 51. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 51 if a[i]>0 then inc(sd); if a[i]<0 then inc(sa); end; assign(f,fo);rewrite(f); writeln(f, So so hang duong bang ,sd); writeln(f, So so hang am bang ,sa); close(f); End. Ví d 5. Cho m t m ng hai chi u g m các s nguyên A[1..M,1..N] v i M,N<= 100, các s h ng có tr tuy t i không quá 1000. Hãy tìm dòng có t ng các s h ng nh th nhì. N u có, hãy thông báo các ch s c a các dòng này, n u không có, hãy thông báo không có. D li u vào c cho b i file v n b n có tên MANG.TXT trong ó dòng th nh t ghi hai s M, N. Trong M dòng ti p theo, dòng th I ghi N s c a dòng th I c a m ng A[I,1], . ., A[I,N]. Các s liên ti p trên m t dòng cách nhau ít nh t t ký t r ng. Ghi ra file MANG.OUT nh sau: n u không có dòng nh nhì, ghi ra thông báo "Khong co dong nho nhì". N u có, ghi ra dòng th nh t các ch s dòng có ng nh th nhì. Ch ng trình sau gi i bài toán này. Uses Crt; Const fi='mang.txt'; fo='mang.out'; Var F:Text; A:Array[1..100,1..100] Of Integer; M,N,I,J,MAX1,MAX2:Integer; TD:Array[1..100] Of Longint; Begin Clrscr; Assign(F,fi); Reset(F); Readln(F,M,N); FillChar(TD,SizeOf(TD),0); MAX1:=-maxlongint;MAX2:= -maxlongint; For I:=1 To M Do Begin For J:=1 To N Do Begin Read(F,A[I,J]);TD[I]:=TD[I]+A[I,J]; End; If MAX1<TD[I] Then Begin MAX2:=MAX1; MAX1:=TD[I]; End; If MAX1>TD[I] Then If MAX2<TD[I] then MAX2:=TD[i];
  • 52. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 52 Readln(F);{có th có ho c không u không nh h ng} End; Close(F); Assign(f,fo);rewrite(f); If MAX2=-maxlongint Then Writeln(f,'Khong co dong co tong nho thu nhi') Else Begin Writeln(f,'Cac dong co tong nho thu nhi:') For I:=1 To M Do If TD[I]=MAX2 Then Write(f,I,' '); End; Close(f); End. Ví d 5'. Nh ph n u Ví d 5. D li u vào c cho b i file v n b n có tên MANG.TXT g m M dòng ti p theo, dòng th I ghi N s c a dòng th I c a m ng A[I,1], . ., A[I,N], các s h ng có tr tuy t i không quá 1000. Các s liên ti p trên t dòng cách nhau ít nh t m t ký t r ng. Nh ph n cu i Ví d 5. Ch ng trình sau gi i bài toán này. Uses Crt; Const fi='mang.txt'; fo='mang.out'; Var F:Text; A:Array[1..100,1..100] Of Integer; M,N,I,J,MAX1,MAX2:Integer; TD:Array[1..100] Of Longint; Begin Clrscr; Assign(F,fi); Reset(F); FillChar(TD,SizeOf(TD),0); MAX1:=-maxlongint;MAX2:= -maxlongint; m:=1;n:=0; While not(seekeoln(f)) do begin Inc(n);read(f,a[1,n]);td[1]:=td[1]+a[1,n]; end; If MAX1<TD[1] Then Begin MAX2:=MAX1; MAX1:=TD[1]; End; If MAX1>TD[1] Then If MAX2<TD[1] then MAX2:=TD[1]; While not(seekrof(f)) Do Begin Inc(m);
  • 53. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 53 For J:=1 To N Do Begin Read(F,A[m,J]);TD[m]:=TD[m]+A[m,J]; End; If MAX1<TD[m] Then Begin MAX2:=MAX1; MAX1:=TD[m]; End; If MAX1>TD[I] Then If MAX2<TD[I] then MAX2:=TD[m]; Readln(F); End; End; Close(F); Assign(f,fo);rewrite(f); If MAX2=-maxlongint Then Writeln(f,'Khong co dong co tong nho thu nhi') Else Begin Writeln(f,'Cac dong co tong nho thu nhi:') For I:=1 To M Do If TD[I]=MAX2 Then Write(f,I:3); Close(f); End; End. 2. File ghi m i dòng m t xâu ký t . Chú ý r ng do m i dòng c a file v n b n có th có s ký t r t l n nên ta không luôn có th c m i dòng ra m t bi n ki u xâu ký t vì dài ki u xâu do Pascal quy nh không quá 255 ký t . Tuy nhiên, n u ta bi t tr c gi i h n dài m i dòng c a file không quá 255 ký t , ta có th c m i dòng ra m t bi n ki u xâu ký t và ti p t c lý các thông tin c n thi t. u xâu có dài quá 255, ta dùng m t m ng m t chi u v i các ph n t ki u ký t th hi n và c t ng ký t nh n c xâu. Ví d 6. Cho N xâu ký t S1, S2, . . ., SN, các xâu có dài không quá 255. Hãy cho bi t dài l n nh t c a các dài c a N xâu và các ch s c a các xâu có dài l n nh t. D li u vào c cho b i file XAU.INP trong ó dòng th nh t ghi s N không n h n 100, trong N dòng ti p theo, dòng th I ghi xâu SI. K t qu ghi ra file XAU.OUT nh sau: dòng th nh t ghi dài l n nh t, dòng th hai ghi các ch s a các xâu có dài l n nh t, hai s liên ti p cách nhau m t ký t tr ng. Sau ây là ch ng trình Const fi='xau.inp'; fo='xau.out'; Var f:Text; s:Array[1..100] of string;
  • 54. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 54 d:Array[1..100] of byte; n,max,i:byte; Begin assign(f,fi);reset(f); readln(f,n); max:=0; for i:=1 to n do begin readln(f,s[i]);d[i]:=length(s[i]); if max<d[i] then max:=d[i]; end; close(f); assign(f,fo);rewrite(f); writeln(f,max); for i:=1 to n do if d[i]=max then writeln(f,i,' '); close(f); End. Ví d 6'. Cho N xâu ký t S1, S2, . . ., SN, các xâu có dài không quá 255. Hãy cho bi t dài l n nh t c a các dài c a N xâu và các ch s c a các xâu có dài l n nh t. D li u vào c cho b i file XAU.INP g m N dòng, dòng th I ghi xâu th I. t qu ghi ra file XAU.OUT nh sau: dòng th nh t ghi dài l n nh t, dòng th hai ghi các ch s c a các xâu có dài l n nh t, hai s liên ti p cách nhau m t ký t tr ng. Sau ây là ch ng trình Const fi='xau.inp'; fo='xau.out'; Var f:Text; s:Array[1..100] of string; c,d:Array[1..100] of byte; n,max,s:byte; Begin assign(f,fi);reset(f); max:=0;n:=0; While not(seekeof(f)) do begin inc(n);readln(f,s[n]);d[n]:=length(s[n]); if max<d[n] then max:=d[n]; end; close(f); assign(f,fo);rewrite(f); writeln(f,max); for i:=1 to n do if d[i]=max then writeln(f,i,' '); close(f); End.
  • 55. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 55 Ví d 7. Cho xâu ký t S có dài không quá 10000. Hãy cho bi t s ch cái ti ng Anh, s ch s th p phân xu t hi n trong S k c s b i và vi t xâu S theo th t ng c l i. D li u vào c cho b i file XAU.INP g m hai dòng, dòng th nh t ghi N là dài xâu S, dòng th hai ghi xâu S. K t qu ghi ra file XAU.OUT nh sau: dòng th nh t ghi s SC là s ch cái xu t hi n trong S, dòng th hai ghi s SS là s ch s xu t hi n trong S, dòng th ba ghi xâu S vi t theo th t ng c l i c a các ký . Chú ý r ng n u dài xâu l n h n 255, ta ph i dùng m ng m t chi u v i các ph n t ki u Char th hi n xâu. Sau ây là ch ng trình Const fi='xau.inp'; fo='xau.out'; Var f:Text; s:Array[1..10000] of char; sc,ss,n,i:integer; Begin assign(f,fi);reset(f); readln(f,n); sc:=0;ss:=0; For i:=1 to n do begin read(f,s[i]); if (upcase(s[i])<='A')and(upcase(s[i])>='Z') then Inc(sc); if (s[i]<='0')and(s[i]>='9') then Inc(ss); end; close(f); assign(f,fo);rewrite(f); writeln(f,sc); writeln(f,ss); for i:=n downto 1 do write(f,s[i]); close(f); End. Ví d 7'. Cho xâu ký t S có dài không quá 10000. Hãy cho bi t s ch cái ti ng Anh, s ch s th p phân xu t hi n trong S k c s b i và vi t xâu S theo th t ng c l i. D li u vào c cho b i file XAU.INP g m m t dòng ghi xâu S. K t qu ghi ra file XAU.OUT nh sau: dòng th nh t ghi s SC là s ch cái xu t hi n trong S, dòng th hai ghi s SS là s ch s xu t hi n trong S, dòng th ba ghi xâu S vi t theo th t ng c l i c a các ký t . Sau ây là ch ng trình Const fi='xau.inp'; fo='xau.out'; Var
  • 56. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 56 f:Text; s:Array[1..10000] of char; sc,ss,n,i:integer; Begin assign(f,fi);reset(f); sc:=0;ss:=0;n:=0; While not(eoln(f)) do begin Inc(n);read(f,s[n]); if (upcase(s[n])<='A')and(upcase(s[n])>='Z') then Inc(sc); if (s[n]<='0')and(s[n]>='9') then Inc(ss); end; close(f); assign(f,fo);rewrite(f); writeln(f,sc); writeln(f,ss); for i:=n downto 1 do write(f,s[i]); close(f); End. Ví d 7''. Cho xâu ký t S có dài không quá 10000. Hãy cho bi t s ch cái ti ng Anh, s ch s th p phân xu t hi n trong S k c s b i và vi t xâu S theo th t ng c l i. D li u vào c cho b i file XAU.INP g m m t s dòng ghi xâu S theo th t t trên xu ng và t trái sang ph i. K t qu ghi ra file XAU.OUT nh sau: dòng th nh t ghi s SC là s ch cái xu t hi n trong S, dòng th hai ghi s SS là s ch s xu t hi n trong S, dòng th ba ghi xâu S vi t theo th t ng c l i c a các ký t . Sau ây là ch ng trình Const fi='xau.inp'; fo='xau.out'; Var f:Text; s:Array[1..10000] of char; sc,ss,n,i:integer; Begin assign(f,fi);reset(f); readln(f,n); sc:=0;ss:=0;n:=0; While not(seekeof(f)) do begin While not(eoln(f)) do begin Inc(n);read(f,s[n]); if (upcase(s[n])<='A')and(upcase(s[n])>='Z') then Inc(sc); if (s[n]<='0')and(s[n]>='9') then Inc(ss); end; readln(f); end;
  • 57. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 57 close(f); assign(f,fo);rewrite(f); writeln(f,sc); writeln(f,ss); for i:=n downto 1 do write(f,s[i]); close(f); End. 3. File ghi m i dòng m t xâu có c ký t l n s ng d n: C n c k mô t d li u c cho úng. Ví d 8. M t rô b t di chuy n trong m t sân hình ch nh t g m M dòng và N c t ô vuông, M, N ≤ 100000. Các dòng ô vuông ánh s t 1 n M t trên xu ng, các c t ô vuông ánh s t 1 n N t trái sang ph i. Ban u rô b t ô [X,Y]. Rô b t di chuy n theo m t dãy g m S l nh. M i l nh có d ng HK trong ó H là m t ký t ch h ng di chuy n, H = U/D/L/R t ng ng v i h ng di chuy n là Trên/D i/Trái/Ph i, K là m t s nguyên d ng ch s ô vuông rô b t di chuy n theo h ng t ng ng. Khi th c hi n dãy l nh, có hai kh n ng x y ra: 1. Sau b c di chuy n th B, rô b t ra ngoài sân; 2. Sau S b c di chuy n, rô b t v n trong sân; li u vào c cho b i file RB.INP trong ó dòng th nh t ghi b n s M, N, X, Y. Dòng th hai ghi s S, ti p theo là S dòng, dòng th I trong S dòng này ghi l nh th I. t qu ghi ra file RB.OUT nh sau: u kh n ng 1 x y ra, dòng th nh t ghi hai s 1, B; u kh n ng 2 x y ra, dòng th nh t ghi ba s 2, XC, YC, trong ó, [XC,YC] là v trí cu i cùng c a rô b t; Sau ây là ch ng trình VD42 Const fi='rb.inp'; fo='rb.out'; Var f:text; m,n,k,x,y,i,s,kn,b:longint; h:char; BEGIN assign(f,fi);rest(f); readln(f,m,n,x,y); readln(f,s); kn:=0; for i:=1 to s do if kn=0 then begin readln(f,h,k);
  • 58. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 58 case h of 'U': Begin dec(x); if x<1 then begin kn:=1;b:=i; end; End; 'D': Begin Inc(x); if x>m then begin kn:=1;b:=i; end; End; 'L': Begin dec(y); if y<1 then begin kn:=1;b:=i; end; End; 'R': Begin Inc(y); if y>n then begin kn:=1;b:=i; end; End; end; {Co the thay If kn=0 then bang cach dung o day lenh If kn<>0 then break;} end; close(f); if kn=0 then kn:=2; assign(f,fo);rewrite(f); if kn=1 then writeln(f,1,' ',b) else writeln(f,2,' ',x,' ',y); close(f); END. 3.5.4. Ghi ti p vào m t file v n b n ã có Gi s ta ã ghi m t s thông tin vào m t file v n b n là giá tr c a bi n file F và ta ã óng l i, n u ta mu n ghi ti p vào thì ta có th dùng l nh
  • 59. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 59 APPEND(F); Assign(<Tenbienfile>,'Tenfil');Append(<Tenbienfile>); . . . . {Ghi thong tin vào file} . . . Close(<Tenbienfile>); Ví d 9. Gi s ta ã có file NT.TXT ghi các s nguyên t không l n h n 50000, m i dòng ghi m t s . Hãy t o l p file NT.TXT ghi các s nguyên t không l n h n 100000, m i dòng ghi m t s . Có hai cách gi i: 1. Sinh các s nguyên t không l n h n 100000 và ghi m i s vào m t dòng c a file output. 2. Ghi thêm vào file NT.TXT ã có các s nguyên t l n h n 50000. Sau ây là ch ng trình vi t theo cách th hai. Const fo='nt.txt'; Var f:text; x, . . .:LongInt; Begin Assign(f,fo);Append(f); For x:=50001 to 100000 do Begin . . . . {Phan chuong trinh kiem tra tinh nguyen to cua X} . . . . If <X la so nguyen to> Then WriteLn(f,x); close(f); End; End. 4. CH NG TRÌNH CON Ch ng trình con (CTC) là m t ph n c a ch ng trình Pascal nh m th c hi n m t công vi c nào ó: tính m t giá tr hay x lý m t s d li u. Có hai lo i CTC: các CTC chu n c a Pascal và các CTC do ng i vi t ch ng trình ch c. 4.1. Các ch ng trình con chu n c a Pascal vi c vi t ch ng trình c ti n l i, Pascal có m t s CTC chu n tr giúp m t s thao tác d li u. Các CTC này t trong file TURBO.TPL (TPL là vi t t t c a Turbo Pascal Library). File này ch a các CTC chu n c t ch c thành các Unit (hay c ng còn c g i là các mô un) SYSTEM, CRT, DOS, PRINTER. . . . Ngoài ra còn có t s mô un t ch c riêng thành các file có ph n tên m r ng TPU ví d GRAPH.TPU. Unit System bao g m h u h t các hàm và các th t c chính dùng cho các ki u li u ã mô t trong các m c tr c và khi biên d ch ch ng trình, Pascal t
  • 60. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 60 ng tìm Unit này trong file Turbo.Tpl ch không ph i khai báo trong m c Uses. Unit Crt g m các hàm và các th t c làm vi c v i màn hình Output ch n b n. Unit Dos g m các hàm và các th t c làm vi c v i m t s ch c n ng c a h u hành. Unit Graph g m các hàm và các th t c làm vi c v i màn hình Output ch ho . 4.2. Ch ng trình con c a ng i s d ng Pascal Ng i vi t ch ng trình có th t ch c các CTC c a mình trong các ch ng trình. Sau ây ta s h ng d n v vi c vi t các CTC. Nh ta ã bi t, c u trúc t ng quát c a m t ch ng trình Pascal g m ba ph n chính: ph n khai báo, ph n các CTC, ph n ch ng trình chính. Ch ng trình chính là m t dãy các l nh ho c là các l nh c a Pascal ho c là các l nh i các CTC mà sau khi th c hi n các l nh ó theo trình t c a chúng, ta s thu c các thông tin c n thi t. Các l nh này c t trong m t c p t khoá BEGIN - END. cho ti n, ta s g i ch ng trình có có CTC là ch ng trình m (CTM). Ta s dùng thu t ng gia h khi làm vi c v i các CTC: CTM có th có các CTC, khi ó, CTC a CTC c goi là ch ng trình cháu, . . . Các CTC có th có ho c không. Tuy nhiên vi c t ch c các CTC có hai thu n l i chính: - Làm cho b c c c a ch ng trình rõ ràng d theo dõi, ti n hành vi t, ch nh s a và nhi u khi ti t ki m vi c l p l i m t s n ch ng trình gi ng nhau. - Th ng m i ch ng trình c n ti n hành m t s công vi c nào ó. M t cách b c ch ng trình là ta cho m i CTC m nhi m vi c ti n hành m t công vi c. Thông th ng m i ch ng trình Pascal th ng có dàn ý sau: 1. Nh p d li u; 2. Gi i bài toán; 3. Vi t k t qu ; Vi c gi i bài toán có th g m m t s khâu. Khi ó ch ng trình có th c t ch c nh sau: 1. Ph n khai báo; 2. CTC nh p d li u; 3. Các CTC ph c v vi c gi i bài toán; 4. CTC vi t k t qu ; 5. Ch ng trình chính (c a CTM); i CTC c ng có c u trúc nh g m ba ph n: 1. Ph n các khai báo khác 2. Ph n các CTC (cháu) 3. Ph n ch ng trình chính (c a CTC)
  • 61. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 61 Các ph n 2 và 3 t ng t nh ã gi i thi u trong c u trúc c a m t ch ng trình Pascal. u khác nhau duy nh t c n chú ý là các l nh c a ph n 3 ph i c vi t gi a t c p BEGIN - END; Trong toàn b m t ch ng trình Pascal, ch có ch ng trình chính (c a CTM) k t thúc v i END. 4.3. Khái ni m Th t c và Hàm ng nh các ch ng trình con chu n, các CTC c a Pascal có hai lo i: Th t c (Procedure). Th t c là m t CTC dùng th c hi n m t s thao tác x lý nào ó. Hàm (Function). Hàm là m t CTC dùng tính m t i l ng nào ó có ki u li u n gi n (s , ký t , xâu ký t , lô gic). Vi c phân bi t này ch là t ng i theo ngh a trong nhi u tr ng h p, th c hi n t vi c nào ó, ta có th dùng m t CTC là hàm hay th t c u có th c nh ng t h ng d n chung v s l a ch n này là ta ch nên dùng CTC d ng hàm khi c n tính toán m t i l ng ki u n gi n (s , ký t , Booolean, xâu). Chú ý quan tr ng. N u CTC là hàm, trong các l nh c a ch ng trình chính c a nó ph i có ít nh t m t l nh gán giá tr cho tên c a hàm. 4.4. Cách khai báo ph n tên c a ch ng trình con Trong ph n khai báo c a CTM có th khai báo tên nh ng không nh t thi t ph i có. Nh ng khác v i CTM, CTC nh t thi t ph i có ph n khai báo tên. Tu theo CTC là th t c hay hàm, tên s c khai báo theo các quy nh sau. Cách khai báo ph n tên c a th t c PROCEDURE Tên(<Danh sách bi n>); Cách khai báo ph n tên c a hàm FUNCTION Tên(<Danh sách bi n>):Ki u; Tên ph i c t theo quy nh t tên c a Pascal nh ng không nên quá dài mà ch nên g i c m nh n. Tên không c trùng v i các tên ã c dùng. Ví d Procedure Nhap; . . . Function NT(x:LongInt):Boolean; . . . Procedure Viet; . . . 4.5. Danh sách bi n trong ph n khai báo tên c a CTC Danh sách bi n là m t danh sách li t kê các bi n mà CTC ph thu c, m i bi n d u ph i kèm theo ki u. Có nh ng u c n chú ý sau ây: Không nh t thi t ph i có danh sách bi n n u không c n;
  • 62. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 62 u ki u c a bi n là ki u ph c t p (m ng, b n ghi, t p h p), ki u ó ph i c khai báo qua M c Type c a ch ng trình chính ch không c khai báo tr c ti p. Hai Danh sách bi n liên ti p ng n cách b ng m t d u ch m ph y (;) Bi n có th khai báo kèm theo Var ho c không Ví d Các khai báo sau không h p l i v i Pascal: Procedure XULY(A:Array[1..100] Of Integer); ho c Function MAX(A:Array[1..100] Of Integer):Integer; Ta ph i dùng cách khai báo sau: Type MANG=Array[1..100] Of Integer; . . . . . . . . . . . . Procedure XULY(A:MANG); . . . . . . . . . . . . ho c Type MANG=Array[1..100] Of Integer; . . . . . . . . . . . . Function MAX(A:MANG):Integer; . . . . . . . . . . . . Các h ng d n v vi c dùng có Var hay không nh sau: u bi n khai báo không có Var, sau khi CTC k t thúc, nó s nh n l i giá tr tr c khi b t u CTC. u bi n khai báo kèm theo Var, sau khi CTC k t thúc, nó s nh n l i giá tr i do quá trình x lý c a CTC quy nh. u bi n khai báo có Var, trong M c Var c a CTM c a CTC ó ph i khai báo t bi n dùng ng v i bi n ó, Trên c s h ng d n này, ng i vi t ch ng trình s ph i xem xét l a ch n: n u giá tr c a bi n sau khi th c hi n CTC còn dùng cho các ph n khác c a ch ng trình, bi n ph i khai báo có Var. Ví d Ch ng trình sau ây minh ho cho các ý trên. Uses Crt; Var X,Y:Integer; Procedure S1(X,Y:Integer); Var TG:Integer; Begin TG:=X;X:=Y;Y:=TG;
  • 63. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 63 Writeln('X = ',X,' Y = ',Y);{L nh 2} End; Procedure S2(Var X,Y:Integer); Var TG:Integer; Begin TG:=X;X:=Y;Y:=TG; End; Procedure S3(X:Integer;Var Y:Integer); Var TG:Integer; Begin TG:=X;X:=Y;Y:=TG; Writeln('X = ',X,' Y = ',Y);{L nh 5} End; Begin {Main} X:=5;Y:=10; Writeln('X = ',X,' Y = ',Y);{L nh 1} S1(X,Y); Writeln('X = ',X,' Y = ',Y);{L nh 3} S2(X,Y); Writeln('X = ',X,' Y = ',Y);{L nh 4} S3(X,Y); Writeln('X = ',X,' Y = ',Y);{L nh 6} Readln End. Sau khi ch y ch ng trình này, trên màn hình s có nh ng dòng thông báo l n l t nh sau: Dòng th nh t (do L nh 1): X = 5 và Y:= 10 Dòng th hai (do L nh 2 trong th t c S1): X = 10 và Y:= 5 Dòng th ba (do L nh 3): X = 5 và Y:= 10 do sau khi ra kh i CTC S1, X và Y (không có khai báo Var kèm theo) l i nh n l i giá tr c c a chúng tr c khi vào S1. Dòng th t (do L nh 4): X = 10 và Y:= 5 do sau khi ra kh i CTC S1, X và Y (có khai báo Var kèm theo) v n gi giá tr m i c a chúng do S2 bi n i. Dòng th n m (do L nh 5 trong th t c S3): X = 5 và Y:= 10 Dòng th sáu (do L nh 6): X = 10 và Y:= 10 do sau khi ra kh i CTC S3, X (không có khai báo Var kèm theo) l i nh n l i giá tr c c a chúng tr c khi vào S3 trong khi ó Y (có khai báo Var kèm theo) v n gi giá tr m i c a chúng do S3 bi n i. 4.6. Cách dùng các ch ng trình con t CTC có th c dùng (g i) trong m t CTC khác ho c trong ch ng trình chính. Theo th t vi t các CTC, CTC vi t sau có th g i các CTC vi t tr c. Trong tình hu ng có hai CTC V1 và V2 mà V1 c n g i V2 và V2 c n g i V1 thì Pascal v n có cách thu x p b ng cách dùng khai báo Forward nh sau. Ví d n u V1 vi t tr c V2
  • 64. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 64 nh ng trong V1 có g i V2 và trong V2 có g i V1, tr c khi vi t V1, c n vi t dòng khai báo Forward nh sau: Procedure V2(Danh sách bi n);FORWARD; Procedure V1(Danh sách bi n); . . . . . . Procedure V2(Danh sách bi n); . . . . . . ho c Function V2(Danh sách bi n):Ki u;FORWARD; Function V1(Danh sách bi n):Ki u; . . . . . . Function V2(Danh sách bi n):Ki u; . . . . . . ho c Procedure V2(Danh sách bi n);FORWARD; Function V1(Danh sách bi n):Ki u; . . . . . . Procedure V2(Danh sách bi n):Ki u; . . . . . . ho c Function V2(Danh sách bi n):Ki u;FORWARD; Procedure V1(Danh sách bi n):Ki u; . . . . . . Function V2(Danh sách bi n):Ki u; . . . . . . Vi c g i m t CTC khác nhau tu theo lo i CTC: u CTC là th t c ta vi t nó nh m t l nh. V i các bi n trong danh sách bi n, n u bi n không có Var, có th thay b ng m t bi n hay m t giá tr c th , n u bi n có Var, ph i thay b ng m t tên bi n. Không c n vi t thêm ki u c a bi n. u CTC là hàm ta ch có th dùng giá tr c a hàm ph thu c các giá tr t ng ng a các bi n nh m t i l ng gán ho c so sánh ho c vi t ra. Vi c vi t các bi n ng c quy nh nh i v i th t c. Ví d u trong ch ng trình có CTC lo i hàm Function NT(x:LongInt):boolean; {Kiem tra tinh nguyen to cua so x} vi c vi t . . . nt(x); . . . là sai.
  • 65. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 65 nh ng vi c vi t . . . If nt(x) Then WriteLn(x,' la so nguyen to') Else WriteLn(x,' khong la so nguyen to'); . . . là úng. 4.7. Bi n a ph ng và bi n toàn th Nh ta ã bi t, v c b n c u trúc c a m t CTC t ng t nh c a CTM. u ó có ngh a CTC c ng có th có M c khai báo Var và không nên nh m l n v i Danh sách bi n trong khai báo tên c a CTC. Các bi n khai báo trong m c Var c a CTM c goi là bi n toàn th (Global), các bi n khai báo trong m c Var c a CTC c goi là các bi n a ph ng (Local). M i CTC u c dùng các bi n toàn th mà không c n khai báo. Trong khi ó, bi n a ph ng c a CTC nào thì ch CTC ó c dùng. Tuy nhiên, bi n a ph ng c ng có th cùng tên v i bi n toàn th . Ví d CTC A có th có bi n a ph ng N trong khi CTM c ng có bi n N. Khi ó trong CTC A N s c hi u là bi n a ph ng c a A ch không ph i là bi n toàn th . t sai l m ph bi n c a nh ng ng i m i t ch c CTC là khi th y trong CTC dùng bi n nào thì khai báo h t trong m c Var c a CTC. u ó d n n vi c trong CTC có nhi u bi n trùng v i bi n toàn th và khi ó vi c x lý d li u nói chung không úng n a. Ví d Trong Ví d M c 9.2.3, các bi n X, Y là các bi n toàn th , bi n TG là bi n a ph ng. 4.8. L nh Exit Trong CTC, khi l nh Exit c th c hi n, CTC k t thúc và l nh sau l nh g i CTC c th c hi n. Khi CTC th c hi n xong vi c c n làm, vi c dùng l nh Exit s ti t ki m th i gian ch y ch ng trình. Ví d Function NT(x:LongInt):boolean; Var i:LongInt; Begin If x=1 then Begin nt:=false;exit;End; For i:=2 to Trunc(Sqrt(x)) Do If x mod i = 0 Then Begin nt:=false;exit;End; nt:=true; End; 4.9. Ch ng trình con quy
  • 66. Nguy n Xuân My Tr i hu n luy n IOICamp.net l c v ngôn ng l p trình Pascal 66 t CTC c g i là quy n u ch ng trình ó có l nh g i chính nó. Các CTC th ng dùng th hi n các thu t toán quy ho c các tính toán quy. Ví d . CTC d i d ng hàm sau ây dùng tính hàm giai th a (N! = 1.2.3. . . N). . . . . . . . . . . . . Function GT(n:integer):longint; begin If n=0 then begin gt:=1;exit;end else gt:=n*gt(n-1); end; . . . . . . . . . . . . Vi c vi t m t CTC quy th ng r t d và ch ng trình r t ng n. Tuy nhiên c n chú ý r ng Pascal dành m t ph n h n ch (không quá 64 KB) c a b nh ghi nh n các giá tr c a các bi n a ph ng c a CTC, vùng b nh này c g i là stack. N u s ng các các giá tr quá nhi u, có th d n n hi n t ng g i là tràn stack, trên màn hình Pascal s có thông báo trên n n Stack Overfow m r ng kh n ng t i a c a stack, ta có th dùng d n biên d ch {$M 65000,0,655360} Tuy nhiên ngay c khi dùng d n biên d ch nh v y, ta v n có th b tràn stack. kh c ph c h n ch trên, khi dùng CTC quy, ta nên h n ch n m c t i a các bi n a ph ng ho c n u có th , ta thay th CTC quy b i m t CTC không quy. Ví d Ch ng trình con sau tính N! nh ng không quy. Function GT(n:integer):longint; Var Tam,i:longint; begin If n=0 then begin gt:=1;exit;end; tam:=1; for i:=1 to n do tam:=tam*i; gt:=tam; end;