Ví d ngôn ng l ptrình Pascal có hai IDE ang c dùng ph bi n: Turbo Pascal và Free Pascal.. Tuynhiên Free Pascal s là IDE c dùng lâu dài vì có th ch y trong c môi tr ngWindows và Linux...
Trang 1l c v ngôn ng l p trình Pascal 1
L C V NGÔN NG L P TRÌNH PASCAL
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 ntí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 nkhô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 nchú ý 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 ptrình Pascal có hai IDE ang c dùng ph bi n: Turbo Pascal và Free Pascal Tuynhiên Free Pascal s là IDE c dùng lâu dài vì có th ch y trong c môi tr ngWindows 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ôngqua 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àitoá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áytí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
Trang 2- 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)
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òngthô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:
Pascal có m t s t c bi t g i là khoá (Keyword) g m 52 t sau:
Trang 3l c v ngôn ng l p trình Pascal 3
DESTRUCTOR IMPLEMENTATION PROCEDURE USES
Khi s d ng Pascal gi i các bài toán (theo ngh a nêu trong ch ng tr c), trongphá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èmtheo 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àykhông gây nên khó kh n vì m t s t khoá n gi n th ng c dùng nhi utrong 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ùngcá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 chophé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áchkhai báo v chúng
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 ncá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
Trang 4l 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 nhcá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 ngtrì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
Trang 5l 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
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ó thdù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à
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
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ácfile 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
Trang 6-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
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ìnhkhông còn l i
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
Trang 7l 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 saunà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áchkhai báo sau ây
Khi vi t các bi u th c s h c, các phép tính c ký hi u nh sau:
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ó thdù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
Trang 8l 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 cchu 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áccù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 unhiê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ìnhCRT 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 icá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 baonhiêu, ta gõ t bàn phím sau ó gõ phím Enter
Trang 9l 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ànphí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 pnh
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 dcò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 udò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:
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ànhình t ng, hi u, div và mod c a hai s ó
USES CRT;
Trang 10l 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);
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ùngtrong 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à
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)
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
Trang 11l 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:
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
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 Xpahir 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;
Trang 12l 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á
Trang 13IF C=0 THEN WRITELN('PH NG TRÌNH VÔ NH')
ELSE WRITELN('PH NG TRÌNH VÔ NGHI M')
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 itrà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ó thkhô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ínhluô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 ukhô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+}.
Trang 14Write('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);
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
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á trTRUE ( úng) và FALSE (sai) Các giá tr True, False c xem là các giá tr c a
bi n ki u Boolean
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 atì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
Trang 15ng 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 ptrong toán h c
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 ramà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 ptheo 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)
Trang 16Khi 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
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);
write('Nhap so thuc B = ');readln(b);
write('Nhap so thuc C = ');readln(c);
Trang 17li 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 theoquy nh, ta có th dùng n ch ng trình sau:
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
Trang 18khi ó 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ôngquá 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 ithao tác c ng không xác nh c tr c mà tu thu c giá tr c a sai s SS
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 cchí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, tachia ô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 "sac" 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
Trang 19l 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 umú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 skhô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 ntìm c n s h c b c K c a C
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);
Trang 20Khi 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
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
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 tthúc và sau ó th c hi n l nh ti p theo c a ch ng trình
2.5 Ki u ký t
Trang 21Gi 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
Trang 23writeln(x,' dung truoc ',y,' trong bang ma ASCII');
if x=y then writeln(x,' bang ',y);
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.
Trang 24l 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 End.
'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');
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 ngiá 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ànhì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ô
Trang 25l 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);
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 mnào ó sau ó thông báo ra màn hình s ngày c a tháng ó
Trang 26l 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 cxây d ng d n qua nhi u b c
hi n trong xâu Ví d xâu Khai báo s c ghi nh n nh sau:
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+1byte 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 ibyte 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 khaibá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
Trang 27l 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 ntrong 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 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
Trang 28l 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ó
write('Nhap xau ky tu thu nhat S1= ');readln(s1);
write('Nhap xau ky tu thu hai S2= ');readln(s2);
Trang 29writeln('Xau ',s,' sau khi xoa 5 ky tu lien tiep');
writeln('bat dau tu ky tu thu 3 bang ',s);
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ãycho 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
Trang 30write('Nhap mot ky tu: ');readln(c);
write('Nhap mot xau ky tu: ');readln(s);
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 nxâ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 ukhô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àixâ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
Trang 31Trong 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
- 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
Trang 32th 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:
Ví d 1 Các khai báo sau là h p l :
Trang 33l 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
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 tgiá 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 haivò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ànphí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ùngnh
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ànphí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