Nguy n Xuân My
Tr i hu n luy n IOICamp.net
NGÔN NG
L
CV
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
cg 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
l
c v ngôn ng l p trình Pascal
1
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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:
l
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
c v ngôn ng l p trình Pascal
2
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
l
c v ngôn ng l p trình Pascal
3
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
l
c v ngôn ng l p trình Pascal
4
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
l
Edit
Search
Run
c v ngôn ng l p trình Pascal
Compile
Debug
Tools
Options
Windows
Help
5
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
-----------------------------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
l
c v ngôn ng l p trình Pascal
6
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
l
c v ngôn ng l p trình Pascal
7
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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.
l
c v ngôn ng l p trình Pascal
8
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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;
l
c v ngôn ng l p trình Pascal
9
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
ic as .
Tên
Real
Single
Double
Extended
l
Mi n giá tr T
2.9e-39..1.7e38
1.5e-45..3.4e38
5.0e-324..1.7e308
3.4e-4932..1.1e4932
c v ngôn ng l p trình Pascal
S CSCN
11-12
7-8
15-16
19-20
S Byte
6
4
8
10
10
Nguy n Xuân My
Comp
Tr i hu n luy n IOICamp.net
-9.2e18..9.2e18
19-20
8
63
Chú ý r ng ki u Comp luôn là s nguyên v i giá tr t -2 +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;.
l
c v ngôn ng l p trình Pascal
11
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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:
l
c v ngôn ng l p trình Pascal
12
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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à ).
tv 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+}.
l
c v ngôn ng l p trình Pascal
13
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
úng
úng
Sai
Sai
Q
úng
Sai
úng
Sai
P Và Q
úng
Sai
Sai
Sai
P Ho c Q
úng
úng
úng
Sai
Không P
Sai
Sai
úng
ú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
l
c v ngôn ng l p trình Pascal
14
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
Pascal ta ph i vi t
(3
Các cách vi t sau là sai
3
3
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
x≠0
X ∈ [a,b]
X ∉ [a,b]
X là chính ph
ng
p trình
x<>0
(X>=a) and (X<=b) a<=X<=b
(X<a) or (x>b)
(X>=0) and (Frac(Sqrt(X))=0)
(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)
l
c v ngôn ng l p trình Pascal
15
Nguy n Xuân My
di n
Tr i hu n luy n IOICamp.net
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
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
if (a<=c)and(c<=b) then
writeln(c:0:2, nam giua ,a:0:2, va
if (b<=a)and(a<=c) then
l
c v ngôn ng l p trình Pascal
,c:0:2);
,b:0:2);
16
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
writeln(a:0:2, nam giua
if (b<=c)and(c<=a) then
writeln(c:0:2, nam giua
if (c<=a)and(a<=b) then
writeln(a:0:2, nam giua
if (c<=b)and(b<=a) then
writeln(b:0:2, nam giua
readln;
End.
,b:0:2,
va
,c:0:2);
,b:0:2,
va
,a:0:2);
,c:0:2,
va
,b:0:2);
,c:0:2,
va
,a:0:2);
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
readln(n);
so
nguyen
duong
N
khong
lon
hon
100:
);
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.
l
c v ngôn ng l p trình Pascal
17
Nguy n Xuân My
Ví d 2. S e
Tr i hu n luy n IOICamp.net
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
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"
cs 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
l
c v ngôn ng l p trình Pascal
18
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
cm t
n ch a nghi m mà
dài c a nó nh h n SS. Khi
ó ta có th nh n u trung
mc 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
l
c v ngôn ng l p trình Pascal
19
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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.
While
Repeat
⇔
Nhóm l nh
Do
n u
nhóm Not(DK)
Until DK;
l nh
th c Nhóm l nh
hi n
ít
While DK Do Nhóm nh t
m t Repeat
nh
Nhóm l nh
n
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
l
c v ngôn ng l p trình Pascal
20
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
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
l
c v ngôn ng l p trình Pascal
21
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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.
l
c v ngôn ng l p trình Pascal
22
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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 mã ASCII
ng tr
c trong
uses crt;
var
x,y:char;
Begin
clrscr;
write('Nhap ky tu X = ');readln(x);
write('Nhap ky tu Y = ');readln(y);
if x
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.
l
c v ngôn ng l p trình Pascal
23
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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 BeginEnd.
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;
l
c v ngôn ng l p trình Pascal
24
Nguy n Xuân My
Tr i hu n luy n IOICamp.net
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
l
c v ngôn ng l p trình Pascal
25