Tải bản đầy đủ (.pdf) (66 trang)

Sơ lược về ngôn ngữ lập trình pascal

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (384.45 KB, 66 trang )

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 -2
15

2
15
-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 2
16
-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 -2
31
2
31
-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 (= 2
15
-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 (= 2
31
-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 = α.10
K
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 -2
63
+1 n 2
63
-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 (e
X
).
Hàm Ln(X): Hàm này có giá tr bng lô ga c s e c t bi
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 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 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) = X
K

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

×