TRÖÔØNG ÑAÏI HOÏC ÑAØ LAÏT
F
7 G
GIAÙO TRÌNH
KYÕ THUAÄT LAÄP TRÌNH
PASCAL
NGUYEÃN DANH HÖNG
2001
Kyõ thuaät laäp trình Pascal
- 1 -
MUÏC LUÏC
LAØM QUEN VÔÙI LAÄP TRÌNH ..................................... - 5 -
I-1 CAÙC KHAÙI NIEÄM MÔÛ ÑAÀU: ................................................. - 5 -
I-2 BIEÁN VAØ NHAÄP DÖÕ LIEÄU ..................................................... - 7 -
I-3 XUAÁT DÖÕ LIEÄU ..................................................................... - 9 -
I.4 LEÄNH GAÙN VAØ BIEÅU THÖÙC .............................................. - 10 -
I-5 CAÙC HAØM CHUAÅN.............................................................. - 12 -
I-6 CHOÁNG LOÃI VAØ SÖÛA LOÃI................................................... - 13 -
Veû ñeïp cuûa giaûi thuaät ....................................... - 14 -
BAØI TAÄP CHÖÔNG I ..................................................................... - 16 -
THUÛ TUÏC vaø HAØM ................................................. - 18 -
II-1 LAÄP TRÌNH VÔÙI THUÛ TUÏC................................................ - 18 -
II.2 BIEÁN TOAØN CUÏC VAØ BIEÁN ÑÒA PHÖÔNG ..................... - 19 -
II.3 THUÛ TUÏC COÙ THAM SOÁ .................................................... - 21 -
II.5 PHÖÔNG PHAÙP LAÄP TRÌNH TÖØ TREÂN XUOÁNG ............. - 23 -
II.6 CHOÁNG LOÃI VAØ SÖÛA LOÃI.................................................. - 24 -
BAØI TAÄP CHÖÔNG II.................................................................... - 26 -
CASE VAØ FOR ..................................................... - 29 -
III-1 LAÄP TRÌNH VÔÙI CAÁU TRUÙC CASE................................. - 29 -
Khaùi nieäm haønh ñoäng cuûa chöông trình Pascal........................ - 30 -
III-2 LAÄP TRÌNH VÔÙI CAÁU TRUÙC FOR................................... - 31 -
III-3 CHOÁNG LOÃI VAØ SÖÛA LOÃI:............................................... - 35 -
BAØI TAÄP CHÖÔNG III................................................................... - 39 -
IF WHILE REPEAT…UNTIL ............................ - 42 -
IV-1 BIEÅU THÖÙC BOOLEAN.................................................... - 42 -
IV-2 LAÄP TRÌNH VÔÙI CAÁU TRUÙC IF....................................... - 42 -
IV-3 CAÁU TRUÙC VOØNG LAËP KHOÂNG XAÙC ÑÒNH ................ - 46 -
IV-4 ÑEÄ QUY ............................................................................. - 53 -
IV-5 SÖÛA LOÃI VAØ CHOÁNG LOÃI................................................ - 55 -
BAØI TAÄP CHÖÔNG IV .................................................................. - 58 -
Chöông V PHÖÔNG PHAÙP LAÄP TRÌNH....................................... - 64 -
V-1 PHAÂN TÍCH VAØ ÑAËC TAÛ VAÁN ÑEÀ: .................................. - 64 -
V-3.MAÕ HOAÙ CHÖÔNG TRÌNH: .............................................. - 66 -
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 2 -
V-4 THÖÏC HIEÄN VAØ THÖÛ CHÖÔNG TRÌNH .......................... - 68 -
V-5 BAÛO TRÌ CHÖÔNG TRÌNH: .............................................. - 68 -
BAØI TAÄP CHÖÔNG V.................................................................... - 69 -
Chöông VI MÔÛ ROÄNG KIEÅU DÖÕ LIEÄU THÖÙ TÖÏï ......................... - 70 -
VI –1 KIEÅU THÖÙ TÖÏ DO NGÖÔØI DUØNG ÑÒNH NGHÓA ......... - 70 -
VI-2 KIEÅU MIEÀN CON .............................................................. - 72 -
BAØI TAÄP CHÖÔNG VI .................................................................. - 74 -
MAÛNG vaø CHUOÃI .................................................. - 75 -
VII-1 MAÛNG:.............................................................................. - 75 -
Ñònh nghóa vaø khai baùo maûng................................................. - 75 -
Truy xuaát maûng ....................................................................... - 75 -
Maûng vaø voøng laëp for.............................................................. - 76 -
VII-2 SAÉP XEÁP ........................................................................... - 78 -
VII-3 TÌM KIEÁM ........................................................................ - 82 -
Tìm tuaàn töï.............................................................................. - 82 -
Tìm kieám nhò phaân .................................................................. - 83 -
KHI NAØO NEÂN DUØNG MAÛNG? ............................................ - 85 -
VII-4 CHUOÃI .............................................................................. - 86 -
VII-5 SÖÛA LOÃI VAØ CHOÁNG LOÃI: ............................................. - 91 -
Töø khoaù Pascal môùi ................................................................. - 93 -
Khaùi nieäm môùi......................................................................... - 93 -
BAØI TAÄP CHÖÔNG VII ................................................................. - 94 -
Chöông VIII KIEÅU RECORD......................................................... - 97 -
VIII-1 RECORD COÙ CAÁU TRUÙC COÁ ÑÒNH:............................. - 97 -
VIII-2 RECORD COÙ CAÁU TRUÙC THAY ÑOÅI: .......................... - 99 -
Töø khoaù Pascal môùi ............................................................... - 100 -
Khaùi nieäm môùi....................................................................... - 100 -
BAØI TAÄP CHÖÔNG VIII.............................................................. - 101 -
KIEÅU FILE............................................................ - 102 -
IX-1. FILE VAÊN BAÛN .............................................................. - 102 -
IX-2 FILE ÑÒNH KIEÅU:............................................................ - 105 -
IX-3 TRUY CAÄP NGAÃU NHIEÂN TREÂN FILE ÑÒNH KIEÅU .... - 107 -
IX-4 TROÄN FILE ...................................................................... - 110 -
IX-5 CHOÁNG LOÃI VAØ SÖÛA LOÃI:............................................. - 112 -
Töø khoaù Pascal môùi ............................................................... - 112 -
Khaùi nieäm môùi....................................................................... - 113 -
BAØI TAÄP CHÖÔNG IX ................................................................ - 114 -
KIEÅU TAÄP HÔÏP (SET) ......................................... - 115 -
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 3 -
X-1 KIEÅU TAÄP HÔÏP:................................................................ - 115 -
X-2 LAÄP TRÌNH VÔÙI KIEÅU TAÄP HÔÏP:................................... - 116 -
Töø khoaùù Pascal môùi ............................................................... - 119 -
Khaùi nieäm môùi ....................................................................... - 119 -
BAØI TAÄP CHÖÔNG X.................................................................. - 120 -
CAÙC THOÂNG BAÙO LOÃI CUÛA TURBO PASCAL KHI BIEÂN DÒCH. -
121 -
CAÙC THOÂNG BAÙO LOÃI KHI CHAÏY CHÖÔNG TRÌNH ......... - 131 -
TAØI LIEÄU THAM KHAÛO ............................................................. - 133 -
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 4 -
LÔØI NOÙI ÑAÀU
Ngaøy nay cuøng vôùi söï phaùt trieån maïnh meõ cuûa Tin hoïc, laäp trình trôû neân
moät kyõ naêng caàn thieát cho moïi caùn boä khoa hoïc kyõ thuaät. Giaùo trình naøy
nhaèm giuùp cho sinh vieân Vaät lyù tìm hieåu veà kyõ thuaät laäp trình.
Ngoân ngöõ ñöôïc choïn laø Pascal chuaån, coù boå sung moät vaøi phaàn môû roäng
cuûa TurboPascal. Maëc duø ngaøy nay coù nhieàu ngoân ngöõ hieän ñaïi hôn,
Pascal vaãn laø ngoân ngöõõ thích hôïp nhaát cho moät giaùo trình caên baûn veà
laäp trình. Caùc kyõ thuaät laäp trình chuû yeáu ñöôïc trình baøy töông ñoái ñaày
ñuû, ngoaïi tröø caùc kyõ thuaät duøng con troû. Caùc ví duï ñöôïc choïn loïc ôû
nhieàu möùc ñoä khaùc nhau, khoâng chæ döøng ôû möùc ñoä minh hoaï ngoân ngöõ,
maø coøn ñeå cho sinh vieân laøm quen vôùi nhöõng thuaät toaùn thoâng duïng coù
ñoä phöùc taïp vöøa phaûi.
Ngoaøi ra qua thöïc teá giaûng daïy, chuùng toâi nhaän thaáy khi laäp trình sinh
vieân phaïm raát nhieàu loãi cô baûn. Do ñoù trong giaùo trình naøy moät phaàn
thích ñaùng ñöôïc daønh cho caùc kyõ thuaät söûa loãi vaø choáng loãi. Hy voïng laø
phaàn naøy seõ giuùp ích nhieàu cho caùc baïn sinh vieân.
Giaùo trình nay ñöôïc in laàn ñaàu vaøo naêm 2001. Trong laàn taùi baûn naøy,
chuùng toâi söûa chöõa nhöõng ñieåm sai soùt vaø boå sung moât vaøi ñieåm môùi.
Ñaëc bieät laø chuùng toâi ñöa vaøo moät soá löôïng khaù lôùn caùc baøi taäp. Nhöõng
baøi taäp naøy ñöôïc choïn loïc ñeå sinh vieân aùp duïng kyõ thuaät laäp trình trong
vieäc giaûi quyeát caùc baøi toaùn khoa hoïc kyõ thuaät.
Chuùng toâi chaân thaønh caûm ôn söï goùp yù cuûa caùc ñoàng nghieäp cuõng nhö
caùc baïn sinh vieân ñeå laøm cho giaùo trình ngaøy caøng hoaøn thieän.
Ñaø laït thaùng 5-2004
Nguyeãn Danh Höng
Huyønh Thò Thu Thuyû
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 5 -
CHÖÔNG I
LAØM QUEN VÔÙI LAÄP TRÌNH
I-1 CAÙC KHAÙI NIEÄM MÔÛ ÑAÀU:
Chuùng ta seõ duøng moät vaøi chöông trình raát ñôn giaûn ñeå minh hoaï caùc
khaùi nieäm cuûa Pascal.
program Dautien; { Ñaây laø chöông trình ñaàu tieân}
begin
writeln(‘Hello
‘)
end.
Töø khoaù ñaàu tieân cuûa moïi chöông trình Pascal (duø khoâng baét buoäc) laø
program. Trong giaùo trình naøy caùc töø khoaù seõ ñöôïc in ñaäm. Sau töø
khoaù program laø teân cuûa chöông trình. Teân cuûa chöông trình phaûi ñaët
theo qui taéc ñaët teân.
Teân phaûi baét ñaàøu baèng moät chöõ caùi vaø coù theå chöùa moät daõy baát kyø caùc
chöõ caùi vaø chöõ soá.
Chuù yù laø trong teân khoâng ñöôïc pheùùp coù khoaûng troáng. Neáu caàn taùch caùc
töø coù theå duøng daáu noái _. Kyù töï chuaån cuûa Pascal laø baûng maõ ASCII do
ñoù caùc teân tieáng Vieät coù daáu cuõng laø khoâng hôïp leä. Teân cuõng khoâng
ñöôïc truøng vôùi caùc töø khoaù cuûa Pascal, do ñoù caùc töø naøy coøn ñöôïc goïi laø
töø daønh rieâng.
Ví duï: R2D2
So_tien
laø caùc teân hôïp leä
2XY
So tien Soá tieàn laø
caùc
teân khoâng hôïp leä
Caùc chuù thích ñöôïc ñaëït trong caëp daáu {} hoaëc (* *)
Ví duï: { Ñaây laø chuù thích }
(* Ñaây cuõng laø chuù thích *)
Doøng ñaàu tieân cuûa moät chöông trình goïi laø ñaàu chöông trình. Moät daáu
chaám phaåy( ; )ñöôïc duøng ñeå ngaên caùch noù vôùi doøng keá tieáp.
Ví duï : program Dautien;
Chuùng ta coù sô ñoà cuù phaùp cho ñaàu chöông trình nhö sau:
ñaàu chöông trình
program Æ teân Æ;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 6 -
Trong chöông trình Dautien, vì khoâng coù tính toaùn gì caû neân chuùng ta
khoâng duøng tôùi bieán. Do ñoù ngay sau phaàn ñaàu chöông trình, chuùng ta
ñi ngay ñeán phaàn leänh. Phaàn naøy baét ñaàu baèng töø daønh rieâng begin .
Phaàn leänh bao goàm daõy caùc leänh. Vieäc in ra moät haøng trong Pascal
ñöôïc thöïc hieän bôûi moät thuû tuïc chuaån laø writeln (ñoïc laø write line).
Ví duï:
writeln (‘Moïi thöù naèm trong daáu nhaùy seõ ñöôïc in ra ‘)
(Vaên baûn trong daáu nhaùy coù theå laø tieáng Vieät, phuï thuoäc vaøo heä caøi ñaët)
Chöông trình Pascal ñöôïc keát thuùc baèng töø daønh rieâng end. Chuù yù töø
end keát thuùc chöông trình luoân coù daáu chaám ñi theo.
program Thu_hai;
{ Minh hoaï caùch duøng ;}
begin
writeln(‘Xin chaøo ‘);
writeln( ‘ Baïn aên côm chöa? ‘)
end.
Keàt quaû chaïy chöông trình naøy laø:
Xin chaøo
Baïn aên côm chöa?
Chuù yù laø sau leänh writeln ñaàu tieân coù daáu ; . Daáu ; trong Pascal duøng ñeå
ngaên caùch giöõa hai caâu leänh, khoâng phaûi laø phaàn baét buoäc cuûa caâu leänh.
(Ñaây laø ñieåm khaùc bieät vôùi ngoân ngöõ C. )
Ñeå in ra khoâng xuoáng haøng, ta duøng thuû tuïc chuaån write .
program Mot_hang;
{Minh hoaï caùch duøng write}
begin
write (‘ Nhöõng töø naøy’);
write ( ‘seõ ñöôïc in ra’);
writeln(‘treân cuøng moät haøng’)
end.
Keát quaû chaïy chöông trình treân laø
Nhöõng töø naøy seõ ñöôïc in ra treân cuøng moät haøng.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 7 -
I-2 BIEÁN VAØ NHAÄP DÖÕ LIEÄU
Program Nhapso;
{ Nhaäp vaø vaø in ra moät soá }
var So : integer; { Khai baùo moät bieán}
begin
writeln(‘ Nhaäp vaøo moät soá nguyeân ‘);
readln(So);
writeln(‘Soá baïn nhaäp vaøo laø:’ , So);
end .
Nhaäp vaøo moät soá nguyeân
15
Soá baïn nhaäp vaøo laø: 15
Kieåu döõ lieäu
Bieán phaûi ñöôïc khai baùo thuoäc moät kieåu döõ lieäu naøo ñoù.
Boán kieåu döõ lieäu nguyeân thuyû cuûa Pascal laø integer, char, boolean vaø
real.
Caùc kieåu integer, char vaø boolean ñöôïc goïi laø caùc kieåu thöù töï( hay coøn
goïi laø kieåu voâ höôùng ñeám ñöôïc)
Qui taéc: Bieán naøo trò naáy, töùc laø kieåu döõ lieäu cuûa bieán vaø trò cuûa noù phaûi
phuø hôïp vôùi nhau.
Vieäc khai baùo bieán ñöôùc baét daàu baèng töø daønh rieâng var (vieát taét cuûa töø
variable), tieáp ñoù laø danh saùch caùc bieán cuøng vôùi kieåu döõ lieäu töông öùng
(teân bieán ñöôïc phaân caùch vôùi kieåu döõ lieäu bôûi daáu :) , caùc bieán khai baùo
ñöôïc phaân caùch bôûi daáu ; .
var sothutu: integer;
diem:
real;
xeploai:
char;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 8 -
Chuùng ta coù theå khai baùo nhieàu teân bieán vôùi cuøng moät kieåu döõ lieäu, luùc
naøy caùc teân bieán caùch nhau bôûi daáu , .
var sothutu, vithu , siso : integer;
dtoan, dly, dhoa : real;
xeploai:
char;
tongso,
diemtb:
real;
Chuù yù laø ngoân ngöõ Pascal khoâng phaân bieät chöõ hoa vaø chöõ thöôøng, do
ñoù caùc teân bieán nhö sau laø gioáng nhau.
Diemtb
diemtb
DIEMTB diemTB
Vôùi khai baùo treân, chuùng ta coù theå vieát laïi nhö sau:
var sothutu, vithu , siso : integer; dtoan, dly, dhoa : real;xeploai:
char;
hoaëc
var sothutu, vithu, siso : integer;
dtoan, dly, dhoa :
real;xeploai: char;
nhöng vôùi caùch vieát naøy, chöông trình cuûa chuùng ta seõ troâng raát loän xoän,
khoù ñoïc vaø raát khoù söûa loãi.
Caùc caùch nhaäp döõ lieäu
readln coù theå chöùa danh saùch nhieàu bieán, ngaên caùch baèng daáu phaåy.
readln(so, tuoi, luong)
Khi nhaäp döõ lieäu integer hoaëc real caùc khoaûng troáng ñöôïc boû qua. Keát
thuùc nhaäp baèng phím Enter
Ví duï:
readln(a,b,c)
Neáu nhaäp 5 6 7
thì a =5, b=6,c= 7
Khi nhaäp döõ lieäu char, khoaûng troáng seõ ñöôïc tính.
readln(Chu1,Chu2)
Neáu nhaäp AB thì Chu1 = ‘A’, Chu2= ‘B’ nhöng neáu nhaäp A B thì
Chu1 = ‘A’, Chu2= ‘ ’.
readln khoâng keøm theo bieán töùc laø coù daïng readln; ñoøi hoûi ngöôøi nhaäp
goõ phím Enter.
Moät daïng khaùc cuûa leänh nhaäp döõ lieäu laø read . Leänh naøy khoâng ñoøi hoûi
keát thuùc nhaäp baèng phím Enter (thöôøng duøng khi ñoïc döõ lieäu töø taäp tin).
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 9 -
Qui taéc: Phaûi ñaûm baûo nhaäp ñuû döõ lieäu
I-3 XUAÁT DÖÕ LIEÄU
program Tinhtoandongian;
{Minh hoaï vieäc bieåu thöùc ñöôïc tính tröôùc khi xuaát}
var So1,So2 :real;
begin
readln
(So1,So2);
writeln(So1,So2);
writeln(So1+So2,
So1-So2);
writeln(So1*So2,
So1/So2);
end.
Ñònh daïng döõ lieäu xuaát
Döõ lieäu xuaát neáu khoâng coù chæ ra ñònh daïng seõ thuaän theo ñònh daïng
maëc nhieân cuûa Pascal.
program Dinhdangmn;
{Trình baøy ñònh daïng maëc nhieân cuûa Pascal}
var Chu : char;
Sothuc : real;
Songuyen :integer;
begin
writeln(‘ Nhaäp vaøo moät chöõ caùi, moät soá thöïc vaø moät soá nguyeân’);
readln(Chu,Sothuc,Songuyen);
writeln(Chu);
writeln(Sothuc);
writeln(Songuyen)
end.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 10 -
Nhaäp vaøo moät chöõ caùi, moät soá thöïc vaø moät soá
nguyeân
B 281.5 66
Å
|
B
2.8150000000000000E+02
66
Khi xuaát döõ lieäu, soá nguyeân vaø soá thöïc ñöôïc canh bieân phaûi vôùi moät soá
khoaûng coá ñònh goïi laø ñoä roäng tröôøng. Thöôøng ñoä roäng tröôøng in cho soá
thöïc laø 16.
Chuùng ta coù theå ñònh daïng laïi baèng caùch duøng daïng leänh coù ñaëït ñoä roäng
tröôøng in.
Vôùi soá nguyeân ta vieát theo daïng writeln(I:n), trong ñoù n laø ñoä roäng
tröôøng in. Neáu n nhoû hôn soá chöõ soá ñöôïc in ra, Pascal seõ in ñuû trò I(töùc
laø khoâng coù khoaûng troáng naøo).Neáu n lôùn hôn soá chöõ soá, soá seõ ñöôïc in
ra canh bieân phaûi. Ví duï , neáu I = 123 ta coù
writeln(‘Soá nguyeân = ’,I:1)
Æ
Soá nguyeân=123
writeln(‘Soá nguyeân= ’,I:6)
Æ
Soá nguyeân= 123
Vôùi soá thöïc ta vieát writeln(R:n:m) trong ñoù n laø ñoä roäng, m laø soá chöõ soá
naèm sau daáu chaám thaäp phaân. Ví duï neáu R = 123.456 thì
writeln(‘Soá thöïc = ’,R:10:4)
Æ
Soá thöïc = 123.4560
writeln(‘Soá thöïc = ’,R:10:2)
Æ
Soá thöïc = 123.46
Chuù yù trong ví duï cuoái cuøng ta thaáy soá thöïc ñöôïc laøm troøn.
Leänh writeln khoâng coù ñoái soá töùc laø daïng writeln; seõ xuoáâng doøng môùi.
I.4 LEÄNH GAÙN VAØ BIEÅU THÖÙC
Xeùt chöông trình sau:
program Tinhdientich;
{ Minh hoïa caùch duøng leänh gaùn }
var dai, rong, dientich : real;
begin
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 11 -
write (‘Nhaäp vaøo chieàu daøi : ‘);
readln(dai);
write (‘Nhaäp vaøo chieàu roäng : ‘);
readln(rong);
dientich := dai * rong;
writeln (‘ Dieän tích hình chöõ nhaät : ‘, dientich:8:2);
end.
Leänh gaùn coù cuù phaùp :
bieán
:= bieåu thöùc ;
Bieåu thöùùc trong Pascal coù theå laø moät haèng, moät bieán, moät lôøi goïi haøm
hoaëc laø moât daõy bao goàm caùc toaùn töû vaø toaùn haïng.
Caùc toaùn töû nguyeân vaø toaùn töû thöïc
Toaùn töû thöïc
Toaùn töû
Kyù hieäu
Ví duï
Pheùp coäng
+
gia + thue
Pheùp tröø
-
hoïcphi - hocbong
Pheùp nhaân
*
dai * rong
Pheùp chia
/
x / 2.0
Toaùn töû nguyeân
Toaùn töû
Kyù hieäu
Ví duï
Pheùp coäng
+
socon + 2
Pheùp
tröø
- songay
-
1
Pheùp nhaân
*
5 * 3
Pheùp chia nguyeân
div
10 div 3 (=3)
Pheùp laáy phaàn dö
mod
10 mod 3 ( = 1)
Neáu bieåu thöùc chöùa soá nguyeân vaø soá thöïc thì keát quaû seõ laø soá thöïc. Keát
quaû cuûa pheùp chia thöïc (/) laø soá thöïc.
Ñoä öu tieân toaùn töû
*
/
div mod :Caùc toaùn töû naøy coù ñoä öu tieân cao hôn
+ -
Coù theå thay ñoåi ñoä öu tieân toaùn töû baèng caùch duøng daáu ngoaëc.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 12 -
I-5 CAÙC HAØM CHUAÅN
Caùc haøm soá hoïc
sqr sqrt
Haøm bình phöông vaø haøm caên baäc
hai
sin cos arctan
Caùc haøm löôïng giaùc
exp ln
Haøm muõ vaø haøm logarít töï nhieân
abs
Haøm
laáy
giaù
trò
tuyeät
ñoái
round
Haøm laøm troøn : round(3.5) = 4
trunc
Haøm
laáy
phaàn
nguyeân:
trunc(3.5)=3
Caùc haøm thöù töï
succ
Haøm laáy giaù trò keá tieáp: succ(‘A’)=’B’
pred
Haøm laáy giaù trò ñöùng tröôùc:
pred(‘B’)=’A’
ord
Haøm laáy soá thöù töï : ord(‘A’) = 65
chr
Haøm laáy kyù töï öùng vôùi soá thöù töï :
chr(65)=’A’
Caùc haøm boolean
odd
Traû veà true neáu soá nguyeân laø leû
eoln
Traû veà true neáu heát doøng.
eof
Traû veà true neáu heát taäp tin
Ñeå söû duïng caùc haøm , chuùng ta phaûi duøng lôøi goïi haøm goàm teân haøm vaø
ñoái ñaët trong daáu ngoaëc.
Caùc haøm nhö round vaø trunc ñöôïc goïi laø caùc haøm chuyeån kieåu vì chuùng
chuyeån döõ lieäu töø kieåu naøy sang kieåu khaùc.
Khai baùo haèng
Ñeå thuaän tieän trong tính toaùn, trong chöông trình ñoâi khi caàn khai baùo
haèng. Xeùt chöông trình sau:
program Tinh chuvi_hinhtron;
const pi = 3.1416
var chuvi, duongkinh : real;
begin
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 13 -
write(‘Nhaäp vaøo ñöôøng kính: ‘);
readln(duongkinh);
chuvi := pi * duongkinh;
writeln(‘Chu vi cuûa hình troøn laø:’,chuvi)
end.
Cuù phaùp khai baùo haèng
const teân haèøng = trò;
I-6 CHOÁNG LOÃI VAØ SÖÛA LOÃI
Söûa loãi (debug) laø tìm ra loãi sai trong chöông trình.
Choáng loãi (antibug)laø vieát chöông trình sao cho ít gaëp loãi.
Choáng loãi vaø söûa loãi laø hai vieäc cöïc kyø quan troïng trong kyõ thuaät laäp
trình. Trong giaùo trình naøy, chuùng ta seõ daønh moät phaàn thích ñaùng cho
caùc kyõ thuaät naøy.
Caùc loãi noùi chung chia laøm hai loaïi: loãi cuù phaùp vaø loãi ngöõ nghóa. Caùc
loãi cuù phaùp(syntax error) thöôøng ñöôïc phaùt hieän ngay luùc bieân dòch. Ví
duï loãi thöôøng gaëp laø thieáu daáu ; ñeå ngaên caùch hai leänh. Luùc bieân dòch ,
seõ coù thoâng baùo loãi:
; expected
Caùc loãi naøy thöôøng deã söûa. Ngay töø ñaàu baïn neân reøn luyeän thoùi quen
vieát ñuùng cuù phaùp.
Caùc loãi traàm troïng hôn laø loãi luùc chaïy chöông trình(run-time error). Ví
duï thöôøng gaëp laø loãi chia cho soá 0:
Divided by zero.
Caùc loãi naøy cuõng coù theå söûa ñöôïc vì maùy tiùnh coù baùo loãi. Nguy hieåm
nhaát laø caùc loãi ngöõ nghóa(logic). Nhöõng loãi naøy khoù söûa hôn vì chöông
trình khoâng sai veà maët cuù phaùp maø chæ sai veà yù nghóa. Loãi caøng khoù
phaùt hieän vì coù theå chæ gaëp khi duøng vôùi moät soá döõ lieäu naøo ñoù. Do ñoù
thöû chöông trình vôùi nhieàu döõ lieäu khaùc nhau laø raát quan troïng.
Quy taéc vaøng veà söûa loãi
Ñöøng söûa caùi khoâng hö. Ñöøng laøm nhöõng thay ñoåi ngaãu nhieân.
Moät vaøi loãi thöôøng gaëp trong chöông naøy:
-
Khôûi taïo khi khai baùo bieán (nhö kieåu ngoân ngöõ C)
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 14 -
Ví duï var Trial :=: integer;
Test: char; Test := ‘A’;
- Duøng leänh gaùn khoâng hôïp leä
A:=B := C:=D :E := 0;
-
Duøng sai ñoái cuûa haøm, ví duï duøng ñoái soá aâm vôùi haøm sqrt
Toùm taét:
Trong chöông naøy chuùng ta ñaõ bieát caùc khaùi nieäm sau:
•
Caáu truùc cuûa moät chöông trình Pascal goàm coù
phaàn ñaàu chöông trình
phaàn khai baùo haèng
phaàn khai baùo bieán
phaàn
leänh.
-
caùch ñaët teân chöông trình, teân haèng, bieán
-
leänh gaùn vaø bieåu thöùc
-
caùc haøm chuaån
Töø khoaù Pascal môùi
program begin
var end write writeln
read readln
integer
char boolean
real
:= div mod const
sqr sqrt
sin cos arctan
ln exp
abs round
trunc
pred succ ord chr
Khaùi nieäm môùi
chöông trình
haèng bieán
bieåu thöùc toaùn töû
nhaäp
xuaát
giaûi thuaät
Baøi ñoïc theâm
Veû ñeïp cuûa giaûi thuaät
Moät chöông trình ñeïp laø ñieàu chuùng ta luoân mô öôùc. Moät chöông trình
laø ñeïp neáu thuaät toaùn cuûa noù ñôn giaûn vaø goïn gaøng, nhöng giaûi quyeát
vaán ñeà moät caùch trong saùng vaø toaøn veïn. Tuy nhieân, moät giaûi thuaät ñeïp
khoâng chæ giôùi haïn trong phaïm vi laäp trình. Chuùng ta xeùt moät vaøi ví duï
trong ñoù coù giaûi thuaät ñeïp.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 15 -
Xeùt baøi toaùn sau: Moät ngöôøi ñaïp xe ñaïp ñang ôû caùch nhaø 2km. Ngöôøi
ñoù ñaïp xe veà nhaø vôùi vaän toác khoâng ñoåi 20km/h. Taïi thôøi ñieåm naøy moät
con ruoài ñaäu treân muõi ngöôøi ñi xe ñaïp, bay veà nhaø roài quay ngay laïi
choã ngöôøi ñi xe ñaïp roài laïi quay veà nhaø vaø cöù tieáp tuïc nhö theá cho ñeán
khi ngöôøi ñi xe ñaïp veà ñeán nhaø vaø keïp cheát con ruoài. Giaû söû con ruoài
bay vôùi vaän toác khoâng ñoåi laø 40km/h. Haõy tìm quaõng ñöôøng con ruoài
ñaõ bay?
Tröôùc khi ñoïc tieáp baïn haõy töï giaûi baøi toaùn naøy.
Lôøi giaûi laø nhö sau. Vì con ruoài bay vôùi vaän toác khoâng ñoåi neân ta coù
Quaõng ñöôøng = Vaän toác * Thôøi gian
Maët khaùc töø chuyeån ñoäng ñeàu cuûa ngöôøi ñi xe ñaïp ta coù:
Thôì gian = 2/ 20 = 0,1h
Vaäy quaõng ñöôøng con ruoài ñaõ bay laø:
0,1*40 = 4 km
Roõ raøng ñaây laø moät lôøi giaûi raát ñeïp.
Xeùt ví duï khaùc. Naêm 1686, khi Gauss 9 tuoåi, thaày giaùo cuûa Gauss
muoán cho caû lôùp laøm vieäc troïn buoåi saùng, ñaõ ra baøi taäp sau ñaây.
Coäng taát caû caùc soá töø 1 ñeán 100.
Khoâng ngôø chæ moät chuùt sau khi ra baøi taäp, Gauss ñaõ giaûi xong baøi
toaùn. Baïn thöû nghó xem Gauss ñaõ laøm nhö theá naøo?
Caùch giaûi cuûa Gauss laø chia caùc soá töø 1 ñeán 100 thaønh 50 caëp,moãi caëp
goàm 2 soá caùch ñeàu nhau töø 2 bieân.Toång cuûa moãi caëp laø 101 vaø coù taát
caû 50 caëp nhö vaäy. Do ñoù toång caàn tìm laø
50 * 101 = 5050
Baïn coù theå noùi laø: Lôøi giaûi ñoù deã hieåu, nhöng nghó ra môùi khoù. Duø sao,
coá gaéng thöû böôùc ñaàu tieân baèng caùch töï ñaët caâu hoûi ‘Coù coâng thöùc ñeå
giaûi baøi toaùn naøy, vaø nhöõng coâng thöùc khaùc töông töï khoâng?” cuõng
khoâng phaûi laø quaù khoù. Daàn daàn baïn seõ quen suy nghó vaø töï tìm ra ñöôïc
nhöõng lôøi giaûi ñeïp.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 16 -
BAØI TAÄP CHÖÔNG I
1.Vieát chöông trình tính naêng löôïng theo coâng thöùc E= mc
2
khi bieát
khoái löôïng.
2. Ñoä roïi cuûa moät nguoàn saùng tôùi moät ñieåm giaûm tæ leä nghòch vôùi
bình phöông khoaûng caùch. Vieát chöông trình nhaäp vaøo khoaûng
caùch x,y vaø ñoä roïi ôû khoaûng caùch x, chöông trình tính ra ñoä roïi ôû
khoaûng caùch y.
3.Vieát chöông trình tính quaõng ñöôøng ra km khi bieát soá naêm aùnh
saùng.
4.Thay moãi caëp leänh gaùn döôùi ñaây baèng moät leänh gaùn
a) l:=a+5;
l:=b-2;
b) m := a+5;
m:=m*2;
c) n:=2*n-2;
n:= n div 2 –3;
5.Vieát chöông trình nhaäp vaøo khoaûng thôøi gian tính baèng giaây roài ñoåi
ra giôø, phuùt, giaây.
6.Cho tam giaùc vuoâng ABC vuoâng ôû A. Caùc caïnh goùc vuoâng laø a vaø
b ñöôïc tính theo caïnh huyeàn c theo caùc coâng thöùc sau.
a = c cosθ
b= c sinθ
Chöông trình sau tính caùc caïnh a vaø b theo caïnh huyeàn c vaø goùc θ
nhaäp vaøo. Chöông trình coù chaïy khoâng? Coù cho keát quaû ñuùng
khoâng? Taïi sao?
program tamgiac;
var a,b,c, theta:real;
begin
write (‘Nhaäp vaøo chieàu daøi caïnh huyeàn’);
readln(c);
write (‘Nhaäp vaøo goc theta ño baèng ñoä’);
readln(theta);
a = c * cos(theta);
b = c * sin(theta);
writeln(‘Chieàu daøi caïnh a laø:’,a);
writeln(‘Chieàu daøi caïnh b laø:’,b);
end.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 17 -
7.Chu kyø cuûa con laéc ñôn ñöôïc cho bôûi coâng thöùc
g
L
T
π
2
=
trong ñoù L laø chieàu daøi vaø g laø gia toác troïng tröôøng. Vieát chöông trình
tính chu kyø T vôùi chieàu daøi con laéc do ngöôøi duøng nhaäp vaøo.
8.Khoaûng caùch giöõa hai ñieåm (x1,y1) vaø (x2,y2ø) trong maët phaúng
ñöôïc tính theo coâng thöùc:
2
2
)
2
1
(
)
2
1
(
y
y
x
x
d
−
+
−
=
Vieát chöông trình tính khoaûng caùch vôùi toaï ñoä hai dieåm ñöôïc nhaäp
vaøo.
9.Caùc kyõ sö thöôøng ño tæ soá giöõa hai coâng suaát baèng decibel. Tæ soá
giöõa hai coâng suaát tính theo decibel laø
1
2
10
log
10
P
P
dB
=
trong ñoù P
2
laø möùc coâng suaát ñang xeùt vaø P
1
laø möùc coâng suaát quy
chieáu. Giaû söû P
1
laø 1 milliWatt; vieát chöông trình nhaän vaøo giaù trò P
2
vaø
tính ra giaù trò dB.
10.Taàn soá coäng höôûng cuûa moät maïch thu tín hieäu cho bôûi
LC
f
π
2
1
0
=
Vieát chöông trình tính f
0
theo L vaø
C nhaäp vaøo.
11.Löïc haáp daãn giöõa hai vaät coù khoái löôïng m
1
vaø m
2
ñöôïc cho bôûi
2
2
1
r
m
Gm
F
=
trong ñoù G laø haèng soá haáp daãn (6,672x10
-11
Nm
2
/kg
2
), vaø r laø khoaûng
caùch giöõa hai vaät. Vieát chöông trình tính löïc haáp daãn giöõa hai vaät khi
bieát khoái löôïng vaø khoaûng caùch giöõa chuùng. Kieåm tra chöông trình
baèng caùch tính löïc taùc duïng leân moät veä tinh 800kg ôû quyõ ñaïo caùch
traùi ñaát 38000km. (Khoái löôïng traùi ñaát laø 5,98x10
24
kg).
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 18 -
CHÖÔNG II THUÛ TUÏC VAØ HAØM
II-1 LAÄP TRÌNH VÔÙI THUÛ TUÏC
Caùc chöông trình trong chöông ñaàu tieân ñeàu ñôn giaûn. Khi vieát nhöõng
chöông trình phöùc taïp hôn, chuùng ta thöôøng phaûi chia chöông trình
thaønh caùc phaàn nhoû. Moät phaàn nhoû ñoù laø moät thuû tuïc.
Ví duï, xeùt chöông trình ñoåi choã 2 soá. Chuùng ta caàn laøm ba vieäc: nhaäp
hai soá, ñoåi choã 2 soá, roài in keát quaû ra. Chuùng ta vieát moãi vieäc ñoù thaønh
moät thuû tuïc.
program Doicho;
var So1, So2 : integer;
procedure Nhapso;
begin
writeln(‘ Chöông trình naøy ñoåi choã hai soá nguyeân’ );
write(‘Nhaäp soá thöù nhaát’);
readln(So1);
write(‘Nhaäp soá thöù hai’);
readln(So2);
end; {Nhapso}
procedure Doihaiso;
var Tam : integer;
begin
Tam := So1;
So1 := So2;
So2 := Tam
end; {Doihaiso}
procedure Inketqua;
begin
write(‘ Hai soá sau khi ñoåi choã laø ‘)
writeln(So1: 1 , ‘ vaø ‘, So2:1)
end; {Inketqua}
begin {chöông trình chính}
Nhapso;
Doihaiso; {Ba lôøi goïi thuû tuïc}
Inketqua
end.
Haàu nhö moïi chöông trình Pascal trong thöïc teá ñeàu coù duøng ñeán thuû tuïc.
Nhö vaäy caáu truùc chung cuûa moät chöông trình Pascal thöôøng laø
ñaàu chöông trình
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 19 -
phaàn khai baùo haèng
phaàn khai baùo bieán
phaàn khai baùo caùc thuû tuïc
phaàn leänh (thaân chöông trình chính)
II.2 BIEÁN TOAØN CUÏC VAØ BIEÁN ÑÒA PHÖÔNG
Caùc bieán toaøn cuïc laø caùc bieán ñöôùc khai baùo trong chöong trình chính.
Chuùng coù theå ñöôïc duøng ôû moïi nôi trong chöông trình. Caùc bieán ñòa
phöông laø caùc bieán ñöôïc khai baùo trong caùc chöông trình con vaø chuùng
chæ ñöôïc söû duïng trong caùc chöông trình con ñoù thoâi. Khi chöông trình
con keát thuùc thì caùc bieán naøy cuõng maát ñi. Phaïm vi cuûa moät bieán laø
moät phaàn cuûa chöông trình (goïi laø khoái) söû duïng bieán ñoù. Pascal laø
ngoân ngöõ coù caáu truùc khoái :
program
A
procedure B
procedure D
begin {D}
:
end; {D}
begin {B}
:
end; {B}
procedure C
procedure E
begin {E}
:
end; {E}
procedure F
begin {F}
:
end; {F}
begin {C}
:
end; {C}
Nguyeãn Danh Höng Khoa Vaät Lyù
procedure F
procedure E
procedure C
procedure B
procedure D
program A
Kyõ thuaät laäp trình Pascal
- 20 -
begin {A}
:
end; {A}
Phaïm vi cuûa caùc bieán trong chöông trình laø caùc khoái
program A
A, B, C, D, E, F
procedure B
B, D
procedure C
C, E, F
procedure D
D
procedure E
E
procedure F
F
Chuù yù: Neáu bieán toaøn cuïc vaø bieán ñòa phöông truøng teân nhau, thì söï
thay ñoåi giaù trò cuûa bieán ñòa phöông seõ khoâng aûnh höôûng ñeán bieán toaøn
cuïc. Ta noùi laø bieán ñòa phöông coù ñoä öu tieân cao hôn. Chöông trình sau
minh hoaï ñieàu naøy.
program Phamvi;
var x: integer; {x laø bieán toaøn cuïc}
procedure Diaphuong;
var x :integer; {x laø bieán ñòa phöông}
begin
x := 5;
writeln(x : 6);
end; {Diaphuong}
begin
x := 2;
writeln(x : 6);
Diaphuong;
writeln(x : 6)
end. {Phamvi}
Keát quaû cho ra:
2 giaù
trò
cuûa
x
toaøn
cuïc
5 giaù
trò
cuûa
x
ñòa
phöông
2
giaù trò cuûa x toaøn cuïc
Chuù yù:
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 21 -
•
Chuùng ta caàn khai baùo bieán tröôùc khi söû duïng chuùng trong moät
thuû tuïc .
•
Trong cuøng moät khoái, moät thuû tuïc coù theå goïi moät thuû tuïc khaùc ñaõ
ñöôïc khai baùo tröôùc noù .
II.3 THUÛ TUÏC COÙ THAM SOÁ
Chöông trình ñoåi choã hai soá coù theå vieát laïi nhö sau baèng caùch duøng thuû
tuïc coù tham soá.
program Doicho;
var Solon, Sobe : integer;
procedure Doihaiso( var So1,So2:integer);
var Tam : integer;
begin
Tam := So1;
So1 := So2;
So2 := Tam
end; {Doihaiso}
begin {chöông trình chính}
Solon := 10;
Sobe := 5;
writeln( Solon:3, Sobe:3);
Doihaiso(Solon,Sobe);
writeln( Solon:3, Sobe:3)
end.
Ta thaáy thuû tuïc ñoåi hai soá ôû ñaây coù theâm danh saùch tham soá vaø trong lôøi
goïi thuû tuïc cuõng coù danh saùch ñoái soá ñeå truyeàn cho caùc tham soá naøy .
Tham soá ñöôïc chia laøm hai loaïi: tham trò vaø tham bieán.
Tham trò laø bieán ñiaï phöông cuûa chöông trình con. Trò ñaàu cuûa noù ñöôïc
truyeàn bôûi ñoái trong lôøi goïi thuû tuïc.
Vì tham trò laø bieán ñòa phöông, söï thay ñoåi cuûa noù khoâng aûnh höôûng gì
ñeán trò cuûa ñoái truyeàn cho noù.
Tham bieán laø bieán ñòa phöông duøng thay cho moät bieán toaøn cuïc. Noù laø
moät teân khaùc (bí danh) cuûa ñoái soá .
Söï thay ñoåi leân tham bieán laøm thay ñoåi tröïc tieáp leân ñoái maø noù thay teân.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 22 -
Söï khaùc nhau giöõa hai loaïi tham soá naøy ñöôïc minh hoïa bôûi chöông trình
sau:
program Thu_Thamso;
var a,b : integer;
procedure Thamso( x : integer; var y:integer);
begin
x := x+1;
y := y + 1; writeln(x:6, y:6);
end;
begin
a := 0;
b := 3;
Thamso(a, b);writeln(a:6, b:6);
end.
Keát quaû cho ra :
1
4
0
4
Trong ví duï treân, thuû tuïc tham soá coù hai loaïi tham soá : tham trò x vaø
tham bieán y. Tröôùc khi goïi thuû tuïc naøy vôùi hai tham soá thöïc laø a vaø b
töông öùng thì a = 0 vaø b = 3. Trong thuû tuïc ta coù hai leänh laøm thay ñoåi
giaù trò cuûa a vaø b baèng caùch taêng theâm 1. Leänh writeln(x,y) cho ra keát
quaû laø 1 vaø 4 töông öùng. Tuy nhieân, sau khi ra khoûi thuû tuïc leänh
writeln(a,b) cho thaáy chæ coù b biï thay ñoåi vì b laø tham bieán coøn a vaãn
giöõ nguyeân giaù trò vì noù laø tham trò. Vaäy khi naøo caàn thay ñoåi trò cuûa
tham soá trong caû chöông trình chính thì ta môùi duøng tham bieán.
Ta neân nhôù quy taéc sau khi truyeàn ñoái cho tham soá:
Quy taéc: Ñoái cuûa tham trò coù theå laø moät haèng, moät bieán hay moät bieåu
thöùc. Ñoái cuûa tham bieán chæ coù theå laø bieán.
II.4 HAØM
Gioáng nhö thuû tuïc, haøm cuõng laø moät loaïi chöông trình con. Khaùc bieät
giöõa haøm vaø thuû tuïc laø haøm luoân luoân traû veà moät giaù trò.
Ví duï: Haøm sau tính quaõng ñöôøng ñi theo thôøi gian vaø vaän toác
function QuangDuong(vantoc:real ; thoigian : real):real;
begin
QuangDuong := vantoc * thoigian;
end;
Caáu truùc chung cuûa haøm coù daïng nhö sau:
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 23 -
function teân haøm(danh saùch tham soá):kieåu döõ lieäu traû veà ;
Phaàn khai baùo bieán
Thaân haøm
Khaùc vôùi thuû tuïc, haøm traû veà giaù trò neân lôøi goïi haøm chæ ñöôïc duøng trong
bieåu thöùc.
Ví duï:
program KiemTraHam;
var So, Cotang :real;
function Tang(gocdo:real ): real;
var goc:real;
function DoiSangRadian(goc : real):real;
const pi = 3.1415926;
begin
DoiSangRadian := goc * pi/180
end; { DoiSangRadian}
begin {Tang}
goc := DoiSangRadian(gocdo);
Tang := sin(goc)/cos(goc);
end; {Tang}
begin {Chöông trình chính}
writeln(‘Nhap vao mot goc tinh bang do:’);
readln(So);
writeln(‘Tang cua goc ‘, So ,’ = ‘,Tang(So));
Cotang := 1/Tang(So);
writeln(‘CoTang cua goc ‘, So ,’ = ‘,Cotang)
end. {Chöông trình chính}
Ví duï treân cuõng cho thaáy caùc haøm coù theå loàng nhau.
II.5 PHÖÔNG PHAÙP LAÄP TRÌNH TÖØ TREÂN XUOÁNG
Phöông phaùp laäp trình töø treân xuoáng goàm caùc böôùc sau:
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 24 -
1. Chia baøi toaùn vaán ñeà ra thaønh nhöõng phaàn nhoû.
2. Neáu coù theå laäp trình ñöôïc ngay cho moät phaàn nhoû thì vieát thuû tuïc cho
phaàn naøy. Neáu moät phaàn vaãn coøn quaù phöùùc taïp thì chuyeån sang
böôùc 3.
3. Chia phaàn phöùùc taïp naøy thaønh nhöõng phaàn ñôn giaûn hôn roài vieát thuû
tuïc cho caùc phaàn ñôn giaûn naøy. Vieäc laøm naøy goïi laø tinh cheá töøng
böôùc.
Xeùt ví duï veà vieäc laäp trình quaûn lyù thö vieän.
Ñaàu tieân , chuùng ta phaân chia vieäc quaûn lyù thö vieän ra thaønh nhöõng
coâng vieäc sau:
•
Quaûn lyù saùch
•
Quaûn lyù theû
•
Quaûn lyù ngöôøi ñoïc
Tieáp ñoù, chuùng ta thöïc hieän töøng coâng vieäc treân
a/ Quaûn lyù saùch : Coâng vieäc naøy bao goàm
•
Laøm thö muïc saùch
•
Quaûn lyù soá saùch hieän coù
b/ Quaûn lyù theû
•
..
…
II.6 CHOÁNG LOÃI VAØ SÖÛA LOÃI
Moät kyõ thuaät choáng loãi quan troïng laø laäp trình coù tính ñôn theå
(modular).
Moät chöông trình laø coù tính ñôn theå neáu caùc chöông trình con cuûa noù laø
ñoäc laäp töông ñoái vôùi nhau vaø ñoái vôùi chöông trình chính. Caùc chöông
trình con coù theå ñöôïc thöû rieâng baèng caùc döõ lieäu giaû tröôùc khi gheùp vaøo
chöông trình chính. Neáu chöông trình con coù loãi thì loãi ñoù coù theå ñöôïc
coâ laäp vaø söûa deã daøng.
Moät ñaëc tröng khaùc cuûa laäp trình ñôn theå laø haïn cheá duøng bieán toaøn
cuïc. Noùi chung bieán toaøn cuïc khoâng neân duøng trong chöông trình con.
Söï thay ñoåi cuûa bieán toaøn cuïc trong chöông trình con coù theå gaây ra hieäu
öùng phuï . Hieäu öùng phuï laøm cho chöông trình khoù ñoïc vaø khoù hieåu.
Thay vì duøng bieán toaøn cuïc neân duøng tham soá. Neáu moät thuû tuïc chæ
duøng moät trò chuùng ta khai baùo moät tham trò. Neáu thuû tuïc thay ñoåi hoaëc
traû veà moät trò chuùng ta söû duïng tham bieán.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 25 -
Caùc loãi thöôøng gaëp khi truyeàn ñoái cho tham soá laø thieáu hoaëc thöøa ñoái soá
hoaëc kieåu döõ lieäu cuûa ñoái soá vaø tham soá laø khoâng phuø hôïp.
Quy taéc vaøng thöù hai veà söûa loãi
Khi baïn tin chaéc raèng moïi ñieàu baïn laøm laø ñuùng, vaø chöông trình cuûa
baïn vaãn khoâng chaïy, moät trong nhöõng ñieàu baïn tin chaéc laø sai.
Töø khoaù Pascal môùi:
procedure
function
Khaùi nieäm môùi:
Chöông trình con
Chöông trình chính
Thuû tuïc
Haøm
Danh saùch tham soá Lôøi goïi thuû tuïc Lôøi goïi haøm
Phaïm vi
Bieán toaøn cuïc
Bieán ñòa phöông Khoái chöông trình
Kyõ thuaät laäp trình töø treân xuoáng
Tính ñôn theå
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 26 -
BAØI TAÄP CHÖÔNG II
1.Keát quaû cuûa chöông trình sau laø gì?
Program Quiz;
Var A,B,C :integer;
Procedure Subprogram(D:integer;var E:integer;C:integer);
Var A: integer;
Begin
A:=
C+1;
E:= A+C;
C:= C*2;
End; {Subprogram}
Begin {Quiz}
A:=2;
B:=4
C:=6;
Subprogram(B,C,A);
Writeln(A,B,C)
End.
2. Keát quaû cuûa chöông trình sau laø gì?
Program Confusion;
Var A,B,C,D:integer;
Procedure Confuse(A,B:integer);
Var C:integer;
Begin
A:=5;B:=6;C:=7;D:=8;
Writeln(A,B.C,D)
End; {Confuse}
Begin
A:=1;B:=2;
C:=3;D:=4;
Writeln(A,B,C,D);
Confuse(A,B);
Writeln(A,B,C,D)
End.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 27 -
3. Keát quaû cuûa chöông trình sau laø gì?
Program HardToBelieve;
Var Number:integer;
Procedure DoubleAndAdd(var First,Second:integer);
Begin
First:=
2*First;
Second := 1+Second
End;{ DoubleAndAdd}
Procedure AddAndDouble(var First,Second:integer);
Begin
First := 1+First;
Second := 2*Second
End;
Begin
Number
:=3;
DoubleAndAdd(Number,Number);
Writeln(Number);
Number:=3;
AddAndDouble(Number,Number);
Writeln(Number)
End.
4. Vieát chöông trình tính ñieän trôû töông ñöông cuûa caùc caùch gheùp
khaùc nhau cuûa 3 ñieän trôû R1,R2,R3. Chuù yù caùch duøng thuû tuïc vaø
caùch truyeàn tham soá.
5. Vieát chöông trình tính ñieän dung töông ñöông cuûa caùc caùch gheùp
khaùc nhau cuûa 3 tuï ñieän C1,C2,C3.
6. Vieát haøm tính luyõ thöøa.
7.Vieát caùc haøm ñeå tính caùc haøm löôïng giaùc hypecbolic.
2
)
sinh(
x
x
e
e
x
−
−
=
2
)
cosh(
x
x
e
e
x
−
+
=
x
x
x
x
e
e
e
e
x
−
−
+
−
=
)
tanh(
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 28 -
8.Vieát caùc haøm trong Pascal theå hieän caùc haøm soá thöïc sau:
f(x,y) = (x+2y)/(x+y)
g(x,y) = (f(x,y)+ f(x,y)/(2f(x,x+y))
Aùp duïng ñeå tính f(a,b) vaø g(a,b) vôùi a, b nhaäp töø baøn phím.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 29 -
CHÖÔNG III CASE VAØ FOR
Chöông naøy khaûo saùt caáu truùc case vaø for. Ñoù laø nhöõng caáu truùc ñieàu
khieån coù bieåu thöùc ñieàu khieån laø kieåu thöù töï.
III-1 LAÄP TRÌNH VÔÙI CAÁU TRUÙC CASE
Caáu truùc case duøng khi coù nhieàu löïa choïn.
Xeùt chöông trình sau:
program InSoNgay;
{In soá ngaøy cuûa moät thaùng khoâng tính tôùi naêm nhuaän}
var thang : integer;
begin
write (‘Nhaäp vaøo moät thaùng : ‘);
readln
(thang);
case thang of
1, 3, 5, 7, 8, 10, 12 : writeln(‘ Thaùng’,thang, ‘co 31 ngaøy
!’);
4, 6, 9, 11 :writeln(‘ Thaùng’,thang, ‘co 30 ngaøy !’);
2 : writeln(‘ Thaùng’,thang, ‘co 28 ngaøy !’);
end {case}
end.
Daïng thoâng thöôøng cuûa caáu truùc case nhö sau:
case bieåu thöùc choïn of
haèng 1: haønh ñoäng ;
haèng 2: haønh ñoäng ;
haèng 3, haèng 4, haèng 5: haønh ñoäng ;
…
haèng N: haønh ñoäng
end;
Bieåu thöùc choïn laø bieåu thöùc kieåu thöù töï töùc laø kieåu integer, char hoaëc
boolean vaø thöôøng laø moät bieán .
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 30 -
Caùc haèng phaûi cuøng kieåu vôùi bieåu thöùc choïn.
Danh saùch caùc haèng phaûi chöùa ñuû caùc giaù trò coù theå coù cuûa bieåu thöùc
choïn.
Neáu bieåu thöùc choïn coù trò khoâng naèm trong danh saùch caùc haèng thì
chöông trình coù loãi.
Khaùi nieäm haønh ñoäng cuûa chöông trình Pascal
Trong baûn thaûo goác cuûa ngoân ngöõ Pascal Niklaus Wirth ñaõ chæ ra raèng:
“Haønh ñoäng laø baûn chaát cho moïi chöông trình maùy tính…Moät chöông
trình phaûi laøm moät vieäc naøo ñoù leân döõ lieäu cuûa noù – ngay caû khi haønh
ñoäng ñoù laø khoâng laøm gì caû! “
Moät chöông trình Pascal coù nhieàu loaïi haønh ñoäng ñöôïc lieät keâ sau ñaây:
leänh gaùn
lôøi goïi thuû tuïc
leänh
hôïp
thaønh
leänh
roãng
leänh
caáu
truùc
Chuùng ta ñaõ bieát khaùi nieäm leänh gaùn vaø lôøi goïi thuû tuïc. Leänh hôïp thaønh
laø moät nhoùm leänh ñaët giöõa begin vaø end.
Moät daáu chaám phaåy coù theå duøng ñeå bieåu dieãn moät leänh roãng nhö trong
ví duï sau ñaây:
procedure DocSoDo;
begin
case sodo of
0: writeln(‘Dung cu bo qua so do.’);
1,2,3 :writeln(‘So do qua nho’);
4,5,6,7 : ; {leänh roãng}
8,9, 10: writeln(‘So do qua lon.’);
end {case}
end;
Caáu truùc case loàng nhau
Vì haønh ñoäng coù theå laø leänh caáu truùc neân chuùng ta coù theå gaëp caáu truùc
naøy loàng trong caáu truùc khaùc. sau ñaây chuùng ta xeùt moät ví duï caáu truùc
case loàng nhau.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 31 -
Chöông trình sau moâ taû troø chôi oaún tuø tì ( one, two, three)
Ta kyù hieäu B laø buùa, K laø keùo, T laø tuùi
program OneTwoThree;
var nguoi1, nguoi2 : char;
begin
writeln(‘ Nhap vao hai nguoi choi – B, K hay T’);
readln(nguoi1,
nguoi2);
case nguoi1 of
‘K’
:
case nguoi2 of
‘K’ : writeln(‘ Keo hue keo’);
‘B’ :writeln(‘ Keo bi bua dap gay’);
‘T’:writeln (‘Keo cat tui’);
end; {case }
‘B’
:
case nguoi2 of
‘K’ : writeln(‘ Bua dap gay keo’);
‘B’ :writeln(‘ Bua hue bua’);
‘T’:writeln (‘Bua bi tui boc lai’);
end; {case }
‘T’
:
case nguoi2 of
‘K’ : writeln(‘ Tui bi keo cat ’);
‘B’ :writeln(‘ Tui boc bua’);
‘T’:writeln (‘Tui hue tui’);
end; {case }
end {case ben ngoai}
end.
III-2 LAÄP TRÌNH VÔÙI CAÁU TRUÙC FOR
Ví duï :
program TrinhBayFor;
var demlap : integer;
begin
writeln(‘Chuong trinh nay trinh bay mot vong for’);
for demlap :=1 to 5 do
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 32 -
begin
writeln(‘Xin
Chao’);
writeln(‘Lan thu : ‘, demlap);
end {for}
end.
Cuù phaùp caâu leänh for
for bieánñeám := trò ñaàu to trò cuoái do haønh ñoäng;
Voøng laëp coù theå laëp töø treân xuoáng, khi ñoù caâu leänh coù daïng :
for bieán ñeám := trò ñaàu downto trò cuoái do haønh ñoäng;
Chuù yù : bieán ñeám phaûi laø kieåu thöù töï nghóa laø khoâng nhaát thieát phaûi laø
kieåu integer.
Ví duï:
program BangChuCai;
var demchu : char;
begin
for demchu := ‘A’ to ‘Z’ do
write(demchu);
writeln;
for demchu := ‘z’ downto ‘a’ do
write(demchu);
writeln
end.
Khi vieát voøng for ta phaûi tuaân theo 5 quy taéc sau ñaây:
1. Bieán ñeám, trò ñaàu vaø trò cuoái phaûi cuøng kieåu thöù töï .
Loãi thöôøng gaëp laø vieát voøng for vôùi soá thöïc.
Ví duï:
for dem = 1.0 to 5.0 do hanhdong;
2. Bieåu thöùc cho trò ñaàu vaø trò cuoái phaûi coù giaù trò xaùc ñònh khi böôùc vaøo
voøng laëp. Heä quaû laø trò ñaàu vaø trò cuoái khoâng theå ñaët laïi trong thaân
voøng laëp.
Ví duï trong ñoaïn chöông trình sau
lower := 1;
upper := 3;
for counter := lower to upper do
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 33 -
begin
lower
:=
0;
upper := 1000; { khoâng coù taùc ñoäng leân bieán ñeám}
writeln(‘Hello’);
end; {for}
chæ in ra Hello 3 laàn chöù khoâng phaûi laø 1001 laàn.
3. Bieán ñeám phaûi ñöôïc khai baùo ñòa phöông. Nhö vaäy, neáu trong moät
thuû tuïc coù voøng for thì bieán ñeám phaûi khai baùo trong thuû tuïc ñoù .
4. Gaùn laïi trò cho bieán ñeám trong thaân voøng laëp laø moät loãi.
Ví duï:
for dem := 1 to 99 do
begin { ngöôøi vieát chöông trình muoán in ra caùc soá leû}
writeln(
dem);
dem := dem + 1; {leänh gaùn baát hôïp leä}
end; {for}
5. Trò cuûa bieán ñeám laø khoâng xaùc ñònh khi ra khoûi voøng laëp for
Caáu truùc voøng for loàng nhau
Ví duï:
Vieát chöông trình in ra hình chöõ nhaät sau:
* * * * * * * * *
* * * * * * * * *
* * * * * * * * *
Chuùng ta deã thaáy giaûi thuaät cuûa chöông trình coù theå trình baøy nhö sau:
for soá doøng
do in ra moät doøng
Moãi doøng seõ ñöôïc in ra baèng caùch laäp laïi caùc daáu * baèng soá coät , töùc laø
for soá coät
do in ra moät daáu *
Phoái hôïp laïi ta coù theå vieát
for soá doøng
for soá coät
do in ra moät daáu *
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 34 -
Kyõ thuaät phaân tích chöông trình nhö treân goïi laø phöông phaùp duøng maõ
giaû. Maõ giaû laø moät loaïi ngoân ngöõ trung gian giöõa ngoân ngöõ bình thöôøng
vaø Pascal. Kyõ thuaät maõ giaû ñöôïc söû duïng roäng raõi trong laäp trình. Töø maõ
giaû treân ta coù chöông trình sau.
program VeHinhChuNhat;
var demdong, demcot,sodong, socot : integer;
begin
writeln(‘Nhap vao so dong, socot ‘);
readln(sodong,
socot);
for demdong := 1 to sodong do
begin
for demcot := 1 to socot do write(‘* ‘);
writeln; {xuoáng doøng sau khi in ra moät doøng}
end {for ben ngoai{
end.
Phoái hôïp caáu truùc for vaø case
Ñoâi khi beân trong caáu truùc for coù theå caáu truùc case .
Ví du: Chuùng ta caàn vieát chöông trình in ra daõy soá Fibonacci. Ñoù laø
daõy soá tuaân theo quy luaät laø baét ñaàu baèng 0 vaø 1, soá tieáp theo seõ baèng
toång hai soá ñöùng tröôùc. Daõy soá naøy coù nhieàu öùng duïng trong thöïc teá.
Chuùng ta muoán in ra daõy soá naøy treân maøn hình moãi haøng 5 soá , chöông
trình nhö sau:
program DaysoFibonacci;
var Dem, Cantren, Sohientai, Sotiep : integer;
procedure TinhSotiep(var Socu, Somoi:integer);
var Tam :integer;
begin
Tam := Socu + Somoi;
Socu := Somoi;
Somoi
:=
Tam;
end; {TinhSotiep}
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 35 -
begin
writeln( ‘Ban muon in bao nhieu so Fibonacci? ‘);
readln(Cantren);
writeln(Cantren, ‘ so Fibonacci dau tien la : ’);
Sohientai := 0;
Sotiep :=1; {khoi tao day}
for dem := 1 to Cantren do
begin
write(Sohientai
:4);
TinhSotiep(Sohientai
,
Sotiep);
case (Dem mod 5 ) of
1, 2, 3, 4 : ;
0
:
writeln;{Xuong
dong}
end;{case}
end; {for}
end.
Trong chöông trình treân, chuùng ta ñaõ duøng caáu truùc case ñaët trong
voøng for ñeå xuoáng haøng sau khi in ñuû 5 soá . Cuõng caàn chuù yù caùch tính
soá tieáp trong thuû tuïc TinhSotiep. Thuû thuaät nhö vaäy raát hay ñöôïc duøng
khi tính caùc daõy soá .
III-3 CHOÁNG LOÃI VAØ SÖÛA LOÃI:
Loãi thöôøng gaëp laø thieáu end cuûa caáu truùc case, phaûi ñaûm baûo luoân luoân
keát thuùc case baèng moät chöõ end.
Loãi thöôøng gaëp khi vieát voøng for laø khoâng vieát ñuùng haønh ñoäng do ñaët
sai daáu chaám phaåy. Ví duï:
for dem :=1 to 5 do ;
begin
….
end;
Töø khoaù Pascal môùi
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 36 -
case
of
for
to
downto
Khaùi nieäm môùi
caáu truùc case
bieåu thöùc choïn
bieåu thöùc thöù töï
haønh ñoäng
leänh hôïp thaønh
leänh caáu truùc
leänh roãng
voøng laëp for
bieán ñeám
caáu truùc loàng nhau
Baøi ñoïc theâm
Giaûi phaùp thoâ sô vaø hieäu suaát
Chuùng ta coù theå duøng voøng laëp for ñeå giaûi quyeát baøi toaùn cuûa Gauss.
Ñoù coù veû laø moät giaûi phaùp thoâ sô. Giaûi phaùp thoâ sô coù nghóa laø chuùng ta
duøng moät giaûi phaùp khoâng tinh vi laëp laïi raát nhieàu laàn. Ví duï coå ñieån veà
giaûi phaùp thoâ sô laø caâu chuyeän veà baù töôùc Monte Cristo. OÂng khoâng coù
moät keá hoaïch tinh vi ñeå vöôït nguïc. Traùi laïi oâng chæ coù moät caùi muoãng
vaø duøng noù ñeå ñaøo moät ñöôøng haàm trong 14 naêm lieàn.
Thoaït nhìn giaûi phaùp thoâ sô coù veû laø moät ñieàu teä haïi so vôùi nhöõng giaûi
phaùp thoâng minh, ñeïp deõ. Tuy nhieân trong thöïc teá khoâng phaûi luùc naøo
cuõng vaäy, Ví duï, giaû söû baïn muoán tìm soá toå hôïp goàm 2 chöõ caùi khaùc
nhau taïo bôûi a,b,c d vaø e (ví duï ab,ac,ad.v.v..). Dó nhieân laø coù coâng
thöùc ñeå tính ñieàu ñoù. Nhöng trong khi baïn coá tìm ra coâng thöùc naøy, baïn
coù theå vieát ra tröïc tieáp caùc toå hôïp coù theå coù roài ñeám vaø ñeå thôøi gian suy
nghó ñeán nhöõng chuyeän khaùc hay hôn.
Haõy trôû laïi vôùi baøi toaùn cuûa Gauss. Maëc duø ñaõ coù lôøi giaûi raát ñeïp, chuùng
ta coù theå giaûi noù treân maùy tính baèng caùch coäng laàn löôït.
program Tinhtong;
var Tong, Dem: integer;
begin
Tong := 0;
for Dem :=1 to 100 do Tong := Tong + Dem;
writeln( ‘Toång laø :’,Tong:1)
end.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 37 -
Giaûi phaùp thoâ sô laø moät chuû ñeà nhaïy caûm ñoái vôùi vaøi laäp trình vieân vì
moät moái quan taâm khaùc – hieäu suaát. Moät giaûi phaùp seõ ít hieäu suaát hôn
neáu noù toán nhieàu thôøi gian maùy tính hôn. Chöông trình Tinhtong roõ raøng
laø keùm hieäu suaát hôn coâng thöùc cuûa Gauss, trong tröôøng hôïp naøy tæ leä
hieäu suaát laø 1/100. Vaäy taïi sao phaûi maát coâng nghó ñeán nhöõng giaûi phaùp
thoâ sô? Coù ba lyù do.
Lyù do 1: Khaûo saùt giaûi phaùp thoâ sô coù theå hieåu vaán ñeà toát hôn
Giaûi phaùp thoâ sô laø moät chieán löôïc suy nghó, cuõng nhö caùc chieán löôïc
suy nghó khaùc. Noù duøng ñeå môû roäng vaán ñeà, ñeå taùch bieät vaán ñeà vôùi caùc
thaønh phaàn cuûa noù, ñeå moâ phoûng quaù trình maùy tính giaûi quyeát vaán ñeà,
ñeå taäp trung vaøo chi tieát v.v... Ñoâi khi caùch toát nhaát ñeå coù moät giaûi
phaùp thoâng minh laø taïo ra moät giaûi phaùp khoâng thoâng minh, roài caûi tieán
noù.
Lyù do 2: Hieäu suaát laø moät khaùi nieäm töông ñoái
Thôøi gian chaïy maùy tính khoâng phaûi laø chi phí duy nhaát cuûa phaàn
meàm. Thôøi gian cuûa ngöôøi laäp trình thöôøng coøn ñaét hôn thôøi gian cuûa
maùy, vaø khoaûng caùch ñoù ngaøy caøng lôùn. Ñieàu ñoù khoâng coù nghóa laø
phaûi chaáp nhaän nhöõng phöông phaùp laäp trình keùm coûi. Tuy nhieân, khi
coá gaéng suy nghó ñeán moät giaûi phaùp ñeïp, phaûi luoân luoân suy nghó ñeán tæ
soá chaát löôïng/giaù caû. Hôn nöõa moät giaûi phaùp “caûi tieán” coù theå laøm cho
chöông trình phöùc taïp vaø khoù hieåu.
Lyù do 3: Giaûi phaùp thoâ sô thöôøng deã aùp duïng. Chuùng thöôøng deã söûa ñoåi
hôn caùc giaûi phaùp ñeïp.
Haõy xeùt thuaät toaùn cuûa Gauss. Noù voâ ích ñeå giaûi nhöõng vaán ñeà tính toång
khaùc. Laøm sao ñeå tính toång bình phöông, laäp phöông, hay caên baäc hai
cuûa caùc soá töø 1 ñeán 100? Giaûi phaùp thoâ sô giaûi quyeát nhanh choùng caùc
vaán ñeà naøy.
Vaán ñeà coát loõi cuûa laäp trình ruùt cuoäc laø chöông trình coù chaïy ñöôïc
khoâng? Trong saùch The Psychology of Computer Programing (Taâm lyù
laäp trình maùy tính), Gerald Weiberg ñaõ keå caâu chuyeän veà moät laäp trình
vieân chöõa chaùy cho moät döï aùn saûn xuaát xe hôi. Laäp trình vieân tröôùc ñoù
cuûa döï aùn ñaõ ra söùc cheâ bai chöông trình cuûa ngöôøi môùi ñeán laø keùm
hieäu quaû, khoâng baèng chöông trình ñaõ bò vöùt ñi cuûa haén. Laäp trình vieân
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 38 -
môùi traû lôøi “Tuy nhieân chöông trình cuûa toâi chaïy coøn cuûa anh thì khoâng.
Neáu chöông trình khoâng caàn phaûi chaïy toâi coù theå tìm ra thuaät toaùn coøn
hieäu quaû gaáp ñoâi chöông trình cuûa anh! “ Vaâng, ñuùng vaäy!
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 39 -
BAØI TAÄP CHÖÔNG III
1.Vieát chöông trình ñeå tính troïng löïôïng cuûa moät ngöôøi taïi caùc thieân
theå trong heä maët trôøi so vôùi troïng löïông cuûa ngöôøi ñoù treân traùi ñaát.
Duøng soá lieäu troïng löôïng tæ ñoái trong baûng sau(troïng löôïng treân traùi
ñaát laø 1):
Maët trôøi 27.94
Sao Thuyû
0.37 Sao Kim
0.88
Maët traêng 0.17
Sao Hoaû
0.38 Sao Moäc
2.64
Sao Thoå 1.15
Sao Dieâm
vöông
1.17 Sao
Haûi
vöông
1.18
Chöông trình nhaän vaøo troïng löôïng treân traùi ñaát vaø cho pheùp ngöôøi
duøng choïn thieân theå ñeå tính.
2. Vieát chöông trình veõ hình chöõ nhaät sau:
* * * * * *
* *
* * * * * *
Ngöôøi duøng chöông trình nhaäp vaøo chieàu daøi vaø chieàu roäng.
3. Vieát chöông trình veõ hình sau:
* * * * * *
* ###### *
* ###### *
* * * * * *
Ngöôøi duøng chöông trình nhaäp vaøo chieàu daøi vaø chieàu roäng.
4. Vieát chöông trình veõ hình sau:
* * * * *=====
* * * * *=====
* * * * *=====
============
============
Ngöôøi duøng chöông trình nhaäp vaøo chieàu daøi vaø chieàu
roäng.
5 . Vieát chöông trình veõ hình sau. Chieàu cao cuûa hình tam giaùc
*
ñöôïc nhaäp töø baøn phím.
* *
* *
* * * * *
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 40 -
6. Vieát chöông trình veõ hình sau. Chieàu cao cuûa hình tam giaùc
*
ñöôïc nhaäp töø baøn phím.
* *
* @ *
* @@*
* * * * * * * * *
* @@ *
* @ *
* *
*
7.Vieát chöông trình in ra caùc soá chaün töø 0 ñeán 100. Caùc chöõ caùi
cacùh nhau töø ‘A’ ñeán ‘Z’. Caùc chöõ caùi thöù ba , baét ñaàu töø ‘C’.
8. Vieát chöông trình in ra bình phöông cuûa caùc soá nguyeân chaün töø 0
ñeán 50.
9.Vieát chöông trình in ra baûng ñoåi töø ñoä C sang ñoä F theo töøng
khoaûng 10 ñoä. Duøng coâng thöùc:
C= (5/9) (F-32)
10.Vieát chöông trình tìm soá haïng thöù n cuûa moät caáp soá nhaân trong
caùc tröôøng hôïp sau:
a) bieát hai soá haïng ñaàu tieân
b) bieát soá haïng ñaàu tieân vaø coâng boäi
c) bieát hai soá haïng lieân tieáp vaø vò trí cuûa moät trong hai soá
haïng naøy
d) bieát moät soá haïng, vò trí cuûa soá haïng naøy vaø coâng boäi
11.Haøm random(n)cuûa Pascal cho giaù trò ngaãu nhieân phaân boá ñeàu töø
0 ñeán n-1. Haøm random() khoâng coù ñoái soá cho giaù trò ngaãu nhieân
phaân boá ñeàu töø 0 ñeán 1. Tuy nhieân trong thöïc teá, nhieàu ñaïi löôïng
ngaãu nhieân khoâng phaân boá ñeàu, maø tuaân theo moät phaân boá naøo ñoù.
Ví duï, khi caùc kyõ sö giao thoâng nghieân cöùu soá xe hôi ñi qua moät ngaõ
tö trong khoaûng thôøi gian t, hoï khaùm phaù ra raèng xaùc suaát ñeå cho k
xe ñi qua trong khoaûng thôøi gian t laø
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 41 -
!
)
(
)
,
(
k
t
e
t
k
P
k
t
λ
λ
−
=
vôùi
t≥0,λ>0, vaø k =0,1,2,…
Phaân boá naøy ñöôïc goïi laø phaân boá Poisson, coù nhieàu öùng duïng trong
khoa hoïc kyõ thuaät. Ví duï soá cuoäc goïi k tôùi toång ñaøïi trong thôøi gian t,
soá vi khuaån k trong theå tích t cuûa chaát loûng, vaø soá laàn sai hoûng k cuûa
moät heä thoáng phöùc taïp trong khoaûng thôøi gian t cuõng tuaân theo phaân
boá Poisson.
Vieát moät haøm ñeå ñaùnh giaù phaân boá Poisson vôùi k,t vaø λ baát kyø. Kieåm
tra haøm baèng caùch tính xaùc suaát ñeå 0,1,2,3,…,5 xe ñi qua moät ñieåm
trong moät phuùt, cho λ=1,6 /phuùt.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 42 -
CHÖÔNG IV IF WHILE REPEAT…UNTIL
Chöông naøy khaûo saùt caáu truùc if, while vaø repeat … until. Ñoù laø nhöõng
caáu truùc ñieàu khieån coù bieåu thöùc ñieàu khieån laø kieåu boolean.
IV-1 BIEÅU THÖÙC BOOLEAN
Bieåu thöùc boolean laø nhöõng bieåu thöùc coù giaù trò laø true hoaëc false.
Nhö vaäy bieåu thöùc boolean ñôn giaûn nhaát laø caùc haèng boolean: true vaø
false. Caùc bieåu thöùc phöùc taïp hôn ñöôïc taïo thaønh bôûi caùc toaùn töû quan
heä vaø toaùn töû boolean.
Caùc toaùn töû quan heä
= baèng
< nhoû
hôn
<=
nhoû hôn hoaëc baèng
> lôùn
hôn
>=
lôùn hôn hoaëc baèng
<>
khoâng
baèng
Caùc toaùn töû boolean
not
and or
Chuù yù laø toaùn töû quan heä coù ñoä öu tieân thaáp hôn toaùn töû boolean neân
caàn phaûi duøng daáu ngoaëc cho ñuùng.
Ví duï:
not ( Key = ‘T’)
(Dienthe = 110) and (Cuongdo < 10)
(Gioihan <5) or (Gioihan >=10)
IV-2 LAÄP TRÌNH VÔÙI CAÁU TRUÙC IF
Caáu truùc if
Caáu truùc IF laø moät caáu truùc löïa choïn daãn ñeán reõ nhaùnh chöông trình.
Daïng toång quaùt cuûa leänh if:
if
bieåu thöùc boolean
then haønh ñoäng
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 43 -
else haønh ñoäng khaùc
Ví duï:
Ñeå tìm giaù trò Max vaø Min cuûa hai soá a, b
if a< b then
begin
Max
:=
b;
Min
:=
a;
end
else
begin
Max
:=
a;
Min
:=
b;
end;
Chuù yù: tröôùc else khoâng coù daáu chaám phaåy.
Baèng caùch duøng phoái hôïp caùc leänh if ta coù theå giaûi quyeát nhieàu baøi toaùn
phöùc taïp. Ví duï: baøi toaùn ñoåi tieàn
Cho tröôùc moät soá tieàn, haõy ñoåûi ra caùc tôø giaáy baïc töông öùng, öu tieân cho
caùc giaáy baïc coù giaù trò lôùn. Ví duï: neáu soá tieàn laø 588 ngaøn ñoàng seõ ñöôïc
ñoåi thaønh
5 tôø 100 ngaøn ñoàng
1 tôø 50 ngaøn ñoàng
1 tôø 20 ngaøn ñoàng
1 tôø 10 ngaøn ñoàng
1 tôø 5 ngaøn ñoàng
1 tôø 2000 ñoàng
1 tôø 1000 ñoàng
Ta giôiù haïn chæ ñoåi tôùi ñôn vò 1000 ñoàng
Töø thuaät toaùn töông töï nhö suy luaän cuûa ngöôøi ñoåi tieàn ta coù chöông
trình sau:
program DoiTien;
var Sotien :integer;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 44 -
procedure Tinhsoto(Donvi:integer; var Sotien:integer);
var Soto:integer;
begin
Soto := Sotien div Donvi;
Sotien := Sotien mod Donvi;
write(Soto : 1 , ‘ to ‘);
case Donvi of
100 : write(‘ mot tram ‘) ;
50 : write(‘ nam muoi ‘);
20 : write(‘ hai muoi ‘) ;
10 : write(‘ muoi ‘)
;
5 : write(‘ nam ‘);
2 : write(‘ hai ‘) ;
1 : write(‘ mot ‘) ;
end;
{case}
writeln(‘ ngan dong ‘);
end;
begin
writeln(‘Nhap vao so tien can doi ( don vi ngan dong)’);
readln(Sotien);
if Sotien >= 100 then Tinhsoto(100, Sotien);
if Sotien >= 50 then Tinhsoto(50, Sotien);
if Sotien >= 20 then Tinhsoto(20, Sotien);
if Sotien >= 10 then Tinhsoto(10, Sotien);
if Sotien >= 5 then Tinhsoto(5, Sotien);
if Sotien >= 2 then Tinhsoto(2, Sotien);
if Sotien >= 1 then Tinhsoto(1, Sotien);
end.
Caáu truùc if loàng nhau
Xeùt baøi toaùn sau ñaây:
Ba teân cöôùp cöôùp ñöôïc moät soá vaøng, khi veà ñeán saøo huyeät vì ñaõ khuya
neân chuùng quyeát ñònh saùng hoâm sau seõ chia soá vaøng. Tuy nhieân, khi caû
ba ñi nguû, moät teân thöùc daäy vaø chia soá vaøng ra laøm ba phaàn, coøn thöøa
moät thoûi vaøng. Haén laáy moät phaàn cuøng vôùi thoûi thöøa roài ñi nguû . Hai teân
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 45 -
coøn laïi cuõng laøm töông töï vaø moãi laàn chia ñeàu dö moät thoûi vaøng. Saùng
hoâm sau, trong laàn chia cuoái cuøng cuõng dö moät thoûi vaøng. Ba teân cöôùp
tranh nhau thoûi vaøng naøy vaø cuoái cuøng baén nhau cheát.
Hoûi soá vaøng coù theå laø bao nhieâu neáu toång soá khoâng lôùn hôn 500 thoûi?
Baèng kyõ thuaät maõ giaû chuùng ta coù theå vieát thuaät toùan cuûa chöông trình
nhö sau:
for moãi soá töø 1 ñeán 100
if laàn chia cuûa teân cöôùp ñaàu tieân dö 1 then
if laàn chia cuûa teân cöôùp thöù hai dö 1 then
if laàn chia cuûa teân cöôùp thöù ba dö 1 then
if laàn chia cuoái cuøng dö 1
then chuùng ta coù moät lôøi giaûi
Töø ñoù chuùng ta coù chöông trình sau
program CuopVang;
var Sothu, Sochia: integer;
begin
for sothu :=1 to 500 do
if (sothu mod 3 ) = 1 then
begin {lan chia cua ten cuop thu nhat}
sochia = 2 * ( sothu div 3);
if (sochia mod 3) = 1 then
begin {lan chia cua ten cuop thu hai}
sochia = 2 * ( sochia div 3);
if (sochia mod 3) = 1 then
begin {lan chia cua ten cuop thu ba}
sochia = 2 * ( sochia div 3);
if (sochia mod 3) = 1 then
writeln(Sothu,
‘la
mot
loi
giai’);
end
end
end
end.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 46 -
IV-3 CAÁU TRUÙC VOØNG LAËP KHOÂNG XAÙC ÑÒNH
Caáu truùc repeat.. until coù cuù phaùp nhö sau:
repeat
haønh
ñoäng
until bieåu thöùc boolean; {ñieàu kieän thoaùt}
Neáu bieåu thöùc boolean laø false thì haønh ñoäng ñöôïc laëp laïi cho ñeán khi
bieåu thöùc naøy laø true. Do ñoù bieåu thöùc naøy ñöôïc goïi laø ñieàu kieän thoaùt
voøng laëp.
Chuùng ta ñaõ bieát roõ khaùi nieäm haønh ñoäng ôû chöông tröôùc. Rieâng vôùi caáu
truùc repeat..until khi haønh ñoäng laø leänh hôïp thaønh ta khoâng caàn vieát
begin vaø end.
Ví duï: Ñeám soá chöõ soá cuûa moät soá nguyeân döông nhaäp vaøo töø baøn phím.
program DemsoChuso;
var Sonhap, Sochuso: integer;
begin
writeln(‘Nhap vao mot so nguyen duong:’);
readln(Sonhap);
Sochuso := 0;
write(Sonhap, ‘ co’);
repeat
Sonhap := Sonhap div 10;
Sochuso := Sochuso + 1;
until Sonhap = 0;
writeln(Sochuso, ‘ chu so’);
end.
Caáu truùc while
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 47 -
while bieåu thöùc boolean {ñieàu kieän vaøo voøng laëp}
do haønh
ñoäng;
Trong caáu truùc while, haønh ñoäng trong voøng laëp chæ ñöôïc thöïc hieän khi
bieåu thöùc boolean laø true, do ñoù bieåu thöùc naøy ñöôïc goïi laø ñieàu kieän vaøo
voøng laëp.
Chöông trình ñeám soá chöõ soá ñöôïc vieáât laïi baèng voøng laëp while
program DemsoChuso;
var Sonhap, Sochuso: integer;
begin
writeln(‘Nhap vao mot so nguyen :’);
readln(Sonhap);
Sochuso := 0;
write(Sonhap, ‘ co’);
while Sonhap <> 0 do
begin
Sonhap := Sonhap div 10;
Sochuso := Sochuso + 1;
end;
writeln(Sochuso, ‘ chu so’);
end.
Baïn ñoïc haõy so saùnh kyõ vôùi chöông trình duøng voøng laëp while ñeå thaáy
söï khaùc bieät giöõa hai caáu truùc naøy.
Quy taéc vaøng cuûa voøng laëp:
Moät khi voøng laëp ñaõ baét ñaàu noù phaûi ñöôïc keát thuùc . Do ñoù ñieàu kieän
vaøo hoaëc thoaùt voøng laëp phaûi chöùa moät bieán maø trò cuûa noù ñöôïc bieán ñoåi
bôûi haønh ñoäng cuûa voøng laëp.
Ví duï: Voøng laëp sau ñaây khoâng bao giôø thoaùt ñöôïc.
dem := 0;
repeat
writleln(dem);
until dem = 100;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 48 -
Laäp trình vôùi caùc voøng laëp
Caùc voøng laëp ñöôïc duøng raát nhieàu trong thöïc teá. Ví duï: ta muoán moät troø
chôi laëp laïi nhieàu laàn theo yù ngöôøi chôi, phaàn thaân chöông trình naøy coù
theå vieát nhö sau:
begin {mot chuong trinh tro choi}
repeat
HuongDan;
Choi;
writeln(‘Ban muon choi tiep khong (C/K)?’);
readln(Traloi);
Ketthuc := Traloi = ‘K’;
until Ketthuc ;
end.
Voøng laëp cuõng hay ñöôïc duøng ñeå kieåm tra döõ lieäu nhaäp.
procedure KTNhap(var Trinhap : integer; Cantren, Canduoi :integer);
begin
repeat
writeln(‘Nhap vao mot so nguyen tu’, Canduoi, ‘den ’, Cantren
);
readln(Trinhap);
if Trinhap < Canduoi then
writeln(Trinhap, ‘ qua nho . Nhap lai ‘);
else if Trinhap > Cantren then
writeln(Trinhap, ‘ qua lon. Nhap lai ‘);
until (Trinhap <= Cantren) and(Trinhap >= Canduoi)
end;{KiemTraNhap}
Caùc voøng laëp cuõng raát hay ñöôïc duøng trong caùc baøi tính toång hay trung
bình cuûa moät daõy soá. Thoâng thöôøng phaûi coù ñieàu kieän ñeå keát thuùc daõy
soá . Kyõ thuaät hay gaëp laø duøng moät giaù trò ñaëc bieät goïi laø lính canh ñeå
keát thuùc daõy.
program TinhTrungbinh;
const Linhcanh = -1;
var Tri, Tong, Trungbinh : real;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 49 -
Dem
:integer;
begin
Tong := 0;
Dem := 0;
Trungbinh := 0; {Khôûi tao}
writeln(‘Nhap vao mot so :’);
readln(Tri);
if (Tri = Linhcanh) {truong hop khong co du lieu}
then writeln(‘Khong co du lieu de tinh trung binh’)
else
begin
repeat
Dem
:=
Dem+1;
Tong := Tong + Tri;
writeln(‘Nhap vao mot so :’);
readln(Tri);
until Tri = Linhcanh;
Trungbinh
:=
Tong/Dem;
writeln(‘Tri trung binh cua ‘, Dem, ‘so la: ‘,
Trungbinh:10:4);
end; {else}
end.
Söû duïng taát caû voøng laëp
Pascal coù ba loaïi voøng laëp vaø chöông trình sau ñaây seõ duøng caû ba loaïi.
Chuùng ta muoán taïo ra caùc soá ñoái xöùng (tieáng Anh goïi laø palindrome).
Giaûi thuaät ñeå taïo ra caùc soá naøy laø:
Baét ñaàu baèng moät soá nguyeân. Neáu noù chöa phaûi laø soá ñoái xöùng. ñaûo
ngöôïc soá ñoù, roài coäng soá ban ñaàu vaø soá ñaûo ngöôïc. Neáu soá môùi chöa
phaûi laø soá ñoái xöùng, laïi tieáp tuïc nhö vaäy cho ñeán khi chuùng ta thu ñöôïc
soá ñoái xöùng.
Ví du: 101 laø soá ñoái xöùng. 561 chöa phaûi laø soá ñoái xöùng. Ñaûo ngöôïc vaø
coäng ta coù, 561+165 = 726. 725 vaãn chöa laø soá ñoái xöùng , chöùng ta laøm
tieáp: 726+627 = 1353. Tieáp tuïc moät laàn nöõa ta ñöôïc: 1353+3531 =
4884. Soá naøy laø soá ñoái xöùng.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 50 -
ÔÛ böôùc phaân tích ñaàu tieân, chuùng ta vieát laïi thuaät toaùn döôùi daïng maõ giaû
laáy moät soá
while soá chöa phaûi laøsoá ñoái xöùng
ñaûo
ngöôïc
soá;
coäïng soá ñaûo ngöôïc vôùi soá ban ñaàu;
in keát quaû;
Laøm sao ñeå bieát ñöôïc moät soá laø soá ñoái xöùng?
Moät soá laø soá ñoái xöùng neáu chöõ soá 1 baèng chöõ soá n, chöõ soá thöù 2 baèng
chöõ soá n-1, chöõ soá 3 = chöõ soá n-2 v.v..
Chöõ soá cuoái cuøng cuûa moät soá nguyeân ñöôïc tính bôûi:
chöõ soá cuoái = soá mod 10
Chöõ soá ñaàu ñöôïc tính bôûi
chöõ soá ñaàu = soá div(10 luyõ thöøa (soá chöõ soá-1))
Nhö vaäy muoán tìm ñöôïc chöõ soá ñaàu, chuùng ta caàn bieát soá chöõ soá. Chuùng
ta ñaõ bieát caùch laøm ñieàu naøy qua chöông trình Ñeám soá chöõ soá.
Laøm sao ñeå ñaûo ngöôïc moät soá?
Neáu hieåu caùch ñeám soá chöõ soá, vieäc naøy seõ khoâng khoù. Ta laøm nhö sau:
tính chöõ soá cuoái cuøng
taùch noù ra khoûi soá ban ñaàu baèng div;
coäng vaøo vôùi toång tích luyõ ñaõ nhaân vôùi 10
cho ñeán khi soá ban ñaàu baèng 0.
Chuùng ta caàn phaûi chuù yù theâm moät ñieåm nöõa. Coù theå coù nhöõng soá phaûi
laëp laïi raát nhieàu laàn môùi thaønh soá ñoái xöùng. khi ñoù seõ coù nguy cô traøn soá
(overflow). Chöông trình chuùng ta phaûi kieåm tra nguy cô traøn soá naøy.
Baây giôø maõ giaû cuûa chuùng ta coù theå vieát ñaày ñuû hôn nhö sau:
while ngöôøi duøng coøn muoán chaïy chöông trình
nhaäp soá ban ñaàu;
ñeám soá chöõ soá;
kieåm tra xem coù phaûi laøsoá ñoái xöùng khoâng?
kieåm tra xem coù nguy cô traøn khoâng?
while (soá khoâng phaûisoá ñoái xöùng) and (khoâng coù nguy cô traøn)
ñaûo
ngöôïc
soá;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 51 -
coäng vôùi soá ban ñaàu;
kieåm tra xem coù phaûi laøsoá ñoái xöùng khoâng?
kieåm tra xem coù nguy cô traøn khoâng?
in keát quaû
Chuùng ta coù chöông trình sau. Khi ñoïc chöông trình, haõy chuù yù caùch
duøng caùc voøng laëp.
program PalindromeTest;
var Original,Reversed,Reversals: longint;
Palindrome,InDangerOfOverFlow: boolean;
procedure ReverseTheNumber(Original:longint; var Reversed:
longint);
{Dao nguoc so}
begin
Reversed := 0;
while (Original <> 0) do
begin
Reversed := (Reversed*10) + (Original mod 10);
Original := Original div 10
end
end; {ReverseTheNumber}
procedure CheckForOverFlow(Original:longint; var
InDangerOfOverflow: boolean);
{Kiem tra xem co tran so khong? }
var Reversed: integer;
begin
Original := (Original div 10);
ReverseTheNumber(Original,Reversed);
InDangerOfOverFlow := (Original+Reversed) > (maxlongint
div 10)
{maxlongint = 2 147 483 648}
end; {CheckForOverFlow}
procedure CheckForPalindrome(Original: longint; var Palindrome:
boolean);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 52 -
{Kiem tra xem mot so co phai la palindromekhong?
Thu tuc CountTheDigits nam trong thu tuc nay}
var Divisor, Counter, FirstDigit, LastDigit : longint;
NumberOfDigits: integer;
procedure CountTheDigits(Original: longint; var NumberOfDigits:
integer);
{Dem so chu so }
begin
NumberOfDigits := 0;
repeat
Original := Original div 10;
NumberOfDigits := NumberOfDigits + 1
until Original = 0;
end; {CountTheDigits}
begin {CheckForPalindrome}
Palindrome := true; {Initialize Palindrome.}
CountTheDigits(Original,NumberOfDigits);
Divisor := 1;
{Tinh 10 luy thua NumberOfDigits-1.}
for Counter :=1 to NumberOfDigits-1 do Divisor := Divisor*10;
for Counter := 1 to NumberOfDigits div 2 do
begin
{Tinh va so sanh chu so dau va chu so cuoi }
FirstDigit := Original div Divisor;
LastDigit := Original mod 10;
if FirstDigit <> LastDigit then Palindrome := false;
{Loai bo chu so dau va chu so cuoi ra khoi Original.}
Original := (Original mod Divisor) div 10;
Divisor := Divisor div 100
end {for}
end; {CheckForPalindrome}
begin {Palindrome}
writeln('Nhap vao mot so duong.');
readln(Original);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 53 -
repeat
write(Original:1 ,' can ');
Reversals := 0;
CheckForPalindrome(Original,Palindrome);
CheckForOverFlow(Original,IndangerOfOverFlow);
while not Palindrome and not InDangerOfOverFlow do
begin
ReverseTheNumber(Original, Reversed);
Reversals := Reversals+1;
Original := Original + Reversed;
CheckForPalindrome(Original,Palindrome);
CheckForOverFlow(Original,InDangerOfOverFlow)
end; {while}
if InDangerOfOverFlow then
writeln(' qua nhieu lan lap de thanh palindrome ')
else
writeln(Reversals:1, ' so lan lap de thanh ' , Original:1);
writeln(' Muon choi tiep? Nhap so am se ket thuc chöông trình');
readln(Original)
until Original < 0;
end. {Palindrome}
IV-4 ÑEÄ QUY
Coù moät soá baøi toaùn coù baûn chaát laëp, nhöng raát khoù tìm lôøi giaûi baèng
caùch laëp. Khi ñoù ngöôøi ta duøng kyõ thuaät ñeä quy. Trong kyõ thuaät ñeä quy,
moät chöông trình con goïi chính noù. Ví duï raát noåi tieáng laø baøi toaùn thaùp
Haø noäi. Töông truyeàn raèng ôû moät ngoâi ñeàn lôùn taïi Beùnares coù moät taám
ñeá baèng ñoàng treân ñoù coù 3 caùi coïc baèng kim cöông. Thöông ñeá khi khai
sinh ra theá giôùi ñaõ xeáp 64 caùi ñóa baèng vaøng vôùi ñöôøng kính giaûm daàn
treân moät caùi coïc. Caùc nhaø sö lieân tuïc dòch chuyeån ñóa sang moät chieác
coïc khaùc vôùi nguyeân taéc sau:
-
Moãi laàn chæ ñöôïc dích chuyeån moät ñóa.
-
Moät ñóa coù theå chuyeån töø coïc naøy sang coïc khaùc baát kyø
-
Khoâng ñöôïc ñeå moät ñóa treân moät ñóa coù ñöôøng kính nhoû hôn
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 54 -
Khi caùc nhaø sö chuyeån ñöôïc heát 64 chieác ñóa thì seõ taän theá. Ngöôøi ta
öôùc tính laø neáu moãi laàn chuyeån ñóa maát moät giaây, thì ñeå chuyeån heát
phaûi maát 58 tæ naêm.
Ñaùnh soá 3 caùi coïc laø C1, C2 vaø C3. Giaû söû coù N ñóa vôùi ñöôøng kính
giaûm daàn naèm treân C1.
Vôùi N = 1 lôøi giaûi laø hieån nhieân. Ta chuyeån ngay sang C2.
Vôí N = 2 ta chuyeån ñóa beù nhaát ( ñóa 1) sang C3,
Chuyeån ñóa 2 sang C2
Chuyeån ñóa 1 töø C3 sang C2.
Töø ñoù suy ra vôùi N ñóa giaûi thuaät laø:
Chuyeån (N-1) ñóa sang coïc trung gian.
Chuyeån ñóa cuoái cuøng sang coïc ñích.
Chuyeån (N-1) ñóa töø coïc trung gian sang coïc ñích.
Neáu chuùng ta coù thuû tuïc DichChuyen(N_dia, TuCoc, ToiCoc, CocTrung
Gian) thì ta coù giaûi thuaät ñöôïc theå hieän qua caùc lôøi goïi thuû tuïc:
DichChuyen(N-1,C1,C3,C2):
DichChuyen(
1,C1,C2,C3);
DichChuyen(N-1,C3,C2,C1);
Töø ñoù ta coù chöông trình
program ThapHanoi;
var N: integer
procedure DichChuyen(N,C1,C2,C3 : integer);
begin
if N = 1 then writeln(C1, ‘ -> ’, C2)
else
begin
DichChuyen(N-1,C1,C3,C2);
DichChuyen(
1,C1,C3,C2);
DichChuyen(N-1,C3,C2,C1);
end;
end; {DichChuyen}
begin
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 55 -
writeln (‘ Nhap so dia : ‘);
readln(N);
DichChuyen(N,1,2,3)
end.
Ñeä quy laø moät kyõ thuaät laäp trình raát ñaëc saéc, nhöng nhieàu vaán ñeà cuûa noù
vöôït ra ngoaøi khuoân khoå cuûa giaùo trình naøy. Do ñoù chuùng ta seõ khoâng ñi
saâu theâm.
IV-5 SÖÛA LOÃI VAØ CHOÁNG LOÃI
Loãi do vieát khoâng ñuùng bieåu thöùc boolean
Raát nhieàu loãi lieân quan ñeán vieäc vieát caùc bieåu thöùc boolean phöùc taïp.
Ví duï, leänh gaùn sau ñaây laø voâ nghóa trong Pascal
RightAnswer := Response = (‘A’ or ‘B’);
bôûi vì or laø moät toaùn töû boolean vaø chæ duøng vôùi caùc toaùn haïng
boolean. Caâu leänh ñuùng laø
RightAnswer := (Response = ‘A’) or (Response = ‘B’);
Cuõng caàn raát chuù yù ñeán caùc daáu ngoaëc. Hai bieåu thöùc sau laø khoâng ñoàng
nhaát duø thoaït nhìn coù veû gioáng nhau
not (Hot and Tired)
(not Hot) and (not Tired)
Bieåu thöùc beân traùi coù trò töông ñöông vôùi bieåu thöùc
not(Hot) or not (Tired)
Baïn ñoïc coù theå kieåm tra laïi baèng caùch duøng baûng söï thaät.
Loãi vôùi caáu truùc ifâ
Loãi thöôøng gaëp vôùi caáu truùc if thöôøng laø do khoâng duøng ñuùng leänh hôïp
thaønh khi caàn. Ví duï ñoaïn chöông trình sau:
if Debugging then
PrintCurrentValues;
UpdateInput(ChangeData);
else
GetRawInput(NewData);
writeln(‘ Tieáp tuïc tính’)
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 56 -
Trình bieân dòch seõ baùo loãi taïi else. Baïn ñoïc haõy suy nghó ñeå söûa loãi naøy.
Loãi vôùi voøng laëp
Haàu heát caùc loãi gaén vôí voøng laëp laø loãi ngöõ nghóa. Caùc chöông trình ñeàu
dòch ñöôïc, nhöng khoâng chaïy ñuùng. Caùc loãi naøy laø teä haïi nhaát, vì chæ coù
theå tìm ra baèng caùch thöû hoaëïc baèng moät chöùng minh hình thöùc. Vieäc thöû
chæ coù theå thöïc hieän ñöôïc vôùi moät ít döõ lieäu, do ñoù khoâng baûo ñaûm
chöông trình ñuùng vôùi moïi döõ lieäu. Coøn vieäc chöùng minh hình thöùc noùi
chung raát khoù khaên.
Tuy nhieân töông ñoái deã daøng ñeå tin töôûng laø moät voøng laëp chaïy ñuùng.
Chuùng ta caàn khaûo saùt ba tình huoáng
1. Chöông trình khoâng ñi vaøo voøng laëp trong khi leõ ra noù phaûi
vaøo.
2. Voøng laëp khoâng bao giôø thoaùt.
3. Voøng laëp keát thuùc nhöng khoâng thöïc hieän ñuùng soá laàn laëp.
Chuùng ta coù theå deã daøng kieåm tra tính ñuùng ñaén cuûa voøng laëp baèng
caùch khaûo saùt kyõ caùc ñieàu kieän :
Loái vaøo:Ñieàu kieän vaøo coù thoûa khoâng? Caùc bieán coù khôûi taïo ñuùng
khoâng? Baïn caàn voøng while hay repeat? Hay laø chæ caàn voøng for?
Loái ra: Ñieàu kieän thoaùt coù thoaû khoâng? Toaøn boä voøng laëp ñaõ ñöôïc thöïc
hieäb, hay chæ laø caâu leänh ñaàu tieân?. Coù gì ñaûm baûo laø ñieàu kieän thoaùt
ñöôïc thoaû khoâng?
Sai moät (thöøa hoaëc thieáu moät laàn laëp): Haõy theo veát voøng laëp.
kieåm tra caùc trò luùc thoaùt xem coù nhö mong muoán khoâng?
Haàu heát caùc loãi cô baûn laø ñaëït sai chaám phaåy hay khoâng duøng ñuùng leänh
hôïp thaønh. Ví duï , xeùt ñoaïn chöông trình sau ñeå tính 5!
Tich := 1;
Dem := 2;
while Dem <= 5 do ;
Tich := Tich * Dem;
Dem := Dem + 1;
writeln (Tich);
Baïn ñoïc haõy suy nghó ñeå söûa caùc loãi trong ñoaïn treân
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 57 -
Loãi sai-moät coù theå laø cöïc kyø nghieâm troïng vì chuùng luoân cho keát quaû
sai. Xeùt ñoaïn chöông trình sau ñeå tính toång caùc soá töø 1 ñeán 100.
Tong := 0;
Sotiep : =1
repeat
Tong := Tong + SoTiep;
Sotiep
:=
Sotiep
+1;
until Sotiep >= 100;
Haõy xeùt kyõ xem ñoaïn chöông trình treân coù tính ñuû 100 soá khoâng?
Moät loãi khaù tinh vi vaø khoù nhaän bieát laø duøng pheùp so saùnh = vôùi soá thöïc.
Ví duï, xeùt voøng laëp sau ñaây:
x:=0;
repeat
writeln(x);
x:=x+0.1
until (x=1);
Thoïat nhìn voøng laëp coù veû seõ keát thuùc ñuùng khi x=1. Nhöng vì x laø soá
thöïc, neân giaù trò ôû thôøi ñieåm x=1 thöïc söï coù theå laø
x=0.99999999999999999 hoaëc x=1.00000000000000001. Tình huoáng
naøy laøm cho ñieàu kieän x=1 khoâng thoûa vaø voøng laëp khoâng keát thuùc
ñöôïc. Ñeå khaéc phuïc loãi naøy, toát nhaát laø kieåm tra pheùp = trong moät
khoûang laân caän sai soá. Ví duï thay vì vieát ñieàu kieän laø (x=1) , ta coù theå
vieát (x>=1-0.0001) and (x<=1+0.00001).
Töø khoaù Pascal môùi
if
then
else
not and or
repeat
until
while
do
Khaùi nieäm môùi
toaùn töû quan heä toaùn töû boolean bieåu thöùc boolean
ñieàu kieän vaøo
ñieàu kieän thoaùt ñieàu kieän bieân
reõ nhaùnh
voøng laëp khoâng xaùc ñònh
ñeä quy
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 58 -
BAØI TAÄP CHÖÔNG IV
1.Trong moät ñeà thi moân laäp trình Pascal coù caâu sau:
“Haõy phaùt bieåu moät caâu. Neáu caâu ñoù ñuùng, baïn rôùt moân naøy. Neáu
caâu ñoù sai, baïn rôùt taát caû caùc moân khaùc cuûa hoïc kyø” . Coù caùch phaùt
bieåu naøo ñeå khoûi bò rôùt khoâng?
2. Vieát laïi 2 leänh if sau baèng moät leänh if
If n>=2 then n:= 3*n+1;
If n>=7 then n:= n-7;
3.So saùnh hai ñoaïn chöông trình sau:
If (a<=b) and (a<=c)
Then min :=a
Else if (b<=c) and (b<=a)
Then min := b
Else min :=c;
min :=a;
if b< min
then min :=b;
if c<min
then min :=c;
Coù gì khaùc bieät khoâng? Giaûi thích.
4.Boán ñoaïn chöông trình sau tính toång caùc soá chaün töø 1 ñeán 5. Phaân
tích öu khuyeát dieåm cuûa moãi ñoaïn
Sum :=0
For Counter :=1 to 5 do
If not odd(Counter) then
Sum := Sum +Counter;
Sum :=0
For Counter :=2 to 4 do
If not odd(Counter) then
Sum := Sum +Counter;
Sum :=6;
Sum :=5;
6. Vieát chöông trình tính toång sau:
1 –1/2+1/3 –1/4 + … -1/1000
Vieát theo nhieàu caùch: coäng töø traùi qua phaûi, töø phaûi qua traùi, coäng
caùc soá haïng döông(cuõng theo hai chieàu) roài tröø ñi toång caùc soá haïng
aâm. So saùnh caùc keát quaû.
5. Vieát chöông trình tính goùc khuùc xaï khi bieát goùc tôùi(tính baèng ñoä),
chieát suaát cuûa moâi tröôøng 1 vaø 2. Chuù yù tröôøng hôïp khoâng coù khuùc
xaï (phaûn xaï toaøn phaàân).
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 59 -
6.Vieát chöông trình tính haøm y(t) nhö sau:
⎭
⎬
⎫
⎩
⎨
⎧
<
+
≥
+
−
=
0
5
3
0
5
3
)
(
2
2
t
t
t
t
t
y
cho caùc giaù trò töø –9 ñeán 9 vôùi böôùc baèng 3.
7. Vieát chöông trình tính haøm y(x) = x
2
-3x+2 cho moïi x töø –1 ñeán 3
vôùi böôùc 0.1.
8. Vieát haøm tính giai thöøa
9. Cuôùc phí chuyeån phaùt nhanh laø 10000ñoàng cho 2kg ñaàu tieân, vaø
3750ñoàng cho moãi kg treân möùc 2kg. Neáu kieän haøng naëng hôn 70kg,
seõ coù theâm phuï thu 10000ñoàng. Caùc kieän haøng lôùn hôn 100kg khoâng
ñöôïc chaáp nhaän. Vieát chöông trình nhaän vaøo khoái löôïng kieän haøng
vaø tính ra cöùôc phí.
10.Phaùt bieåu naøo sau ñaây chæ ñuùng vôùi voøng laëp while? Chæ ñuùng vôùi
repeat .. until? Ñuùng hoaëc khoâng duùng vôùi caû hai caáu truùc?
a) Bieåu thöùc boolean ñöôïc ñaùnh giaù tröôùc khi vaøo voøng laëp.
b) Haønh ñoäng cuûa caáu truùc khoâng caàn vieát döôùi daïng leänh hôïp
thaønh.
c) Bieåu thöùc boolean ñöôïc ñaùnh giaù ôû cuoái voøng laëp.
d) Haønh ñoäng cuûa voøng laëp ñöôïc thöïc hieän ít nhaát moät laàn.
e) Coù theå trôû thaønh voøng laëp voâ haïn.
f) Soá laàn laëp coù theå xaùc ñònh ñöôïc moät caùch chính xaùc.
g) Phaûi coù moät bieán ñeám.
11.Moät haõng saûn xuaát maùy keùo thaáy raèng lôïi nhuaän cuûa chieác maùy
keùo thöù n laø 500+100ln(n). Tuy nhieân, chi phí löu kho taêng vaø kho
thöù k toán 100(2k-1). Cöù saûn xuaát 10 chieác maùy keùo phaûi laøm moät
kho môùi.
Vieát chöông trình ñeå tìm lôïi nhuaän toái öu.
12.Vieát chöông trình nhaäp vaøo moät daõy soá döông, keát thuùc baêøng –
999.
a)Ñeám vaø in ra soá phaàn töû cuûa daõy.
b)Tìm giaù trò trung bình
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
Nguyeãn Danh Höng Khoa Vaät Lyù
- 60 -
c)Tìm phaàn töû lôùn nhaát vaø nhoû nhaát cuøng vò trí cuûa nhöõng phaàn
töû naøy.
13. Vieát chöông trình tính haøm sau
⎪
⎪
⎩
⎪
⎪
⎨
⎧
<
<
+
≥
<
+
<
≥
+
≥
≥
+
=
0
0
0
0
0
0
0
0
)
,
(
2
2
2
2
y
and
x
y
x
y
and
x
y
x
y
and
x
y
x
y
and
x
y
x
y
x
f
14.Vieát chöông trình tính haøm
x
x
y
−
=
1
1
ln
)
(
Vieát voøng laëp ñeå cho pheùp tính vôùi nhieàu giaù trò x nhaäp vaøo. Neáu giaù
trò nhaäp vaøo baát hôïp leä, chöông trình keát thuùc.
15. Doøng chaûy qua moät diode ñöôïc cho bôûi
trong ñoù
)
1
(
/
0
−
=
kT
qV
D
D
e
I
i
i
D
laø doøng chaûy qua diode,v
D
laø hieäu theá treân diode
I
0
laø doøng roø
q laø ñieän tích electron,q=1,6x10
-19
C.
k laø haèng soá Boltzmann,k=1,38x10
-23
J/K.
T laø nhieät ñoä tuyeät ñoái
Doøng roø I
0
baèng 2,0 µA. Vieát chöông trình tính doøng cho caùc giaù trò
hieäu ñieän theá töø –1,0V ñeán +0,8V vôùi böôùc 0,1V. Laëp laïi quaù trình
cho caùc nhieät ñoä 0
0
C, 25
0
C vaø 50
0
C. Chöông trình cuõng thöïc hieän
vieäc ñoåi töø ñoä C ra ñoä K.
16. Moät vaät 200kg treo vaøo moät caùi xaø nhö hình veõ. Caùi xaø ñöôïc gaén
vaøo töôøng baèng moät choát vaø ñöôïc treo bôûi moät daây caùp daøi 8m. Söùc
caêng cuûa daây caùp ñöôïc
cho bôûi
2
2
.
.
d
lp
d
lp
lc
W
−
=
T
trong doù
T laø söùc caêng, W laø khoái löôïng
vaät, lc laø chieàu daøi daây caùp, lp
laø chieàu daøi xaø, vaø d laø khoaûng
caùch doïc theo xaø tôùi ñieåm treo
daây. Vieát chöông trình ñeå tìm
khoaûng caùch d taïi ñoù söùc caêng
Kyõ thuaät laäp trình Pascal
- 61 -
laø nhoû nhaát. Chöông trình caàn tính söùc caêng töø d=1m ñeán d=7m vôùi
moãi böôùc 0,1m.
17. Moät nhaø sinh vaät nghieân cöùu söï sinh saûn cuûa vi khuaån trong hai
moâi tröôøng caáy khaùc nhau. Trong moâi tröôøng A vi khuaån nhaân ñoâi
sau 60 phuùt, coøn trong moâi truôøng B vi khuaån nhaân ñoâi sau 90 phuùt,
Giaû söû raèng moät con vi khuaån ñöôïc ñaëït ôû moãi moâi tröôøng vaøo luùc baét
ñaàu thí nghieäm. Vieát chöông trình tính vaø in ra soá vi khuaån ôû moãi
moâi tröôøng taïi caùc khoaûng thôøi gian 3 giôøø cho ñeán 24 giôø. So saùnh soá
vi khuaån sau cuøng.
18. Caùc haøm soá löôïng giacù thöôøng ñöôïc tính baèng caùch duøng caùc
chuoãi voâ haïn. Ví duï
...
!
7
!
5
!
3
sin
7
5
3
+
−
+
−
=
x
x
x
x
x
hay laø
∑
∞
=
−
−
−
−
=
1
1
2
1
)!
1
2
(
)
1
(
sin
n
n
n
n
x
x
trong ñoù x ño baèng radian.
Vì maùy tính khoâng theå tính chuoãi voâ haïn , chuoãi thöôøng ñöôïc caét sau
moät soá soá haïng. Soá soá haïng ñöôïc giöõ laïi phaûi caàn ñuû ñoä chính xaùc.
Chuoãi ñaõ caét vôùi sinx laø
∑
=
−
−
−
−
=
N
n
n
n
n
x
x
1
1
2
1
)!
1
2
(
)
1
(
sin
Vieát chöông trình nhaän giaù trò x baèng ñoä vaø tính sinx duøng haøm coù
saün cuûa Pascal, Sau ñoù tính sinx baèng chuoãi, vôùi N=1,2,3,…,10. So
saùnh giaù trò ôû 2 caùch. Caàn bao nhieâu soá haïng ñeå ñaït ñöôïc cuøng ñoä
chính xaùc?
19. Giaù trò cuûa haøm muõ e
x
coù theå tính baèng chuoãi voâ haïn sau:
!
0
n
x
e
n
n
x
∑
∞
=
=
Vieát chöông trình tính e
x
duøng 12 soá haïng ñaàu tieân cuûa chuoãi, So
saùnh vôùi giaù trò cuûa haøm exp(x) cuûa Pascal vôùi caùc giaù trò x=-10,-5,-
1,0,1,5,10 vaø 15
20. Trung bình nhaân cuûa n soá ñöôïc ñònh nghóa laø
n
n
x
x
x
x
tbn
...
3
2
1
=
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 62 -
Vieát chöông trình tính trung bình coäng vaø trung bình nhaân cuûa n soá
döông. Chöông trình nhaäp vaøo daõy soá döông vaø keát thuùc khi ngöôøi
duøng nhaäp vaøo moät soá aâm.
21. Vieát chöông trình tính trung bình bình phöông
∑
=
=
N
i
i
x
N
tbbp
1
2
1
Ngöôøi duøng seõ nhaäp vaøo soá phaàn töû cuûa daõy roài sau ñoù nhaäp vaøo
töøng phaàn töû.
22. Vieát chöông trình tính trung bình ñieàu hoaø
n
x
x
x
N
tbdh
1
...
1
1
2
+
+
+
=
Haõy töï choïn caùch nhaäp döõ lieäu.
23. Ñoä tin caäy cuûa moät heä dieän töû thöôøng ñöôïc ño baèng thôøi gian
trung bình giöõa caùc laàn hoûng(MTBF). Ñoái vôùi moât heä thoáng lôùn chöùa
nhieàu phaàn töû , thöôøng ngöôøi ta tính MTBF cho moãi thaønh phaàn roài
sau ñoù tính MTBF cho toaøn heä thoáng.
MTBFn
MTBF
MTBF
MTBFht
1
....
2
1
1
1
1
+
+
+
=
Vieát chöông trình ñoïc vaøo soá caùc heä con, MTBF cuûa moãi heä vaø tính
MTBF cho toaøn heä thoáng. Aùp duïng chöông trình ñeå tính MTBF cho
moät heä thoáng raña bao goàm heä anten coù MTBF 2000giôø, boä truyeàn
coù MTBF 8000giôø; boä thu coù MTBF 3000 giôø vaø moät maùy tính coù
MTBF 5000giôø.
Hình minh hoaï moät heä thoáng
Nguyeãn Danh Höng Khoa Vaät Lyù
Heä con 3
Heä
con 2
Heä
con 1
Kyõ thuaät laäp trình Pascal
- 63 -
MTBF1
MTBF2
MTBF3
24. Vieát chöông trình giaûi gaàn ñuùng phöông trình cosx=x baèng
phöông phaùp chia ñoâi.
25. Vieát chöông trình tìm caùc nghieäm cuûa phöông trình cosx=sin2x
trong khoaûng (-6,6)
26. Vieát chöông trình giaûi phöông trình sinx –x
2
= 0 trong khoaûng
(0,1)baèng phöông phaùp chia ñoâi vaø vaø phöông phaùp Newton. So
saùnh soá laàn laëp cuûa hai phöông phaùp.
27. Nhieàu tích phaân khoâng theå tính tröïc tieáp ñöôïc ví duï nhö
∫
t
dx
x
x
0
sin
. Trong tröôøng hôïp ñoù, caàn phaûi tính tích phaân baèng soá. Coù
theå tính tröïc tieáp töø ñònh nghóa cuûa tích phaân, baèng caùch tính toång
dieän tích cuûa caùc hình chöõ nhaät nhö trong hình veõ. Vieát chöông trình
ñeå tính tích phaân treân trong khoaûng töø 0 ñeán π vôùi caùc böôùc ∆x
laø,1;0,05;0,01;vaø 0,005.
Haøm sinx/x
0
0.1
0.2
0.3
0.4
0.5
0.6
0.7
0.8
0.9
1
0
0.
2
0.
4
0.
6
0.
8
1
1.
2
1.
4
1.
6
1.
8
2
2.
2
2.
4
2.
6
2.
8
3
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 64 -
28. Ñeå tính gaàn ñuùng tích phaân, ta coøn coù theå duøng coâng thöùc
Simpson. Aùp duïng coâng thöùc naøy ñeå tính
∫
t
dx
x
x
0
sin
trong khoaûng töø töø
0 ñeán π vôùi caùc böôùc ∆x laø 0,1;0,05;0,01;vaø 0,005.
29.Naêm 2001, moät sinh vieân toát nghieäp nhaän möùc löông khôûi ñieåm
laø 400000 doàng/thaùng. Cöù sau 3 naêm thì ñöôïc taêng moät baäc löông.
Möùc taêng löông baèng 15% möùc löông ñang laõnh. Vieát chöông trình
tính xem ñeán naêm naøo löông cuûa sinh vieân naøy vöôït möùc 1 trieäu
ñoàng.
CHÖÔNG V PHÖÔNG PHAÙP LAÄP TRÌNH
Chuùng ta ñaõ hoïc xong caùc caáu truùc laäp trình caên baûn. Chöông naøy neâu
leân nhöõng ñieåm chung nhaát cuûa phöông phaùp laäp trình.
Laäp trình laø moät ngheä thuaät cuõng laø moät khoa hoïc. Noù laø moät ngheä
thuaät bôûi vì noù ñoøi hoûi trí töôûng töôïng toát, oùc saùng taïo vaø söï kheùo leùo.
Laø moät khoa hoïc bôûi vì caùc kyõ thuaät vaø phöông phaùp tieâu chuaån ñöôïc
aùp duïng. Maëc duø chính caùc vaán ñeà vaø caùc kyõ thuaät söû duïng ñeå giaûi
quyeát chuùng thay ñoåi, coù vaøi böôùc chung trong quaù trình phaùt trieån phaàn
meàm:
1. Phaân tích vaø ñaëc taû vaán ñeà
2. Choïn löïa caáu truùc döõ lieäu vaø phaùt trieån thuaät toaùn
3. Maõ hoaù chöông trình
4. Thöïc hieän vaø thöû chöông trình
5. Baûo trì chöông trình
Chuùng ta trình baøy ngaén goïn caùc böôùc treân.
V-1 PHAÂN TÍCH VAØ ÑAËC TAÛ VAÁN ÑEÀ:
Vaán ñeà ban ñaàu thöôøng ñöôïc moâ taû khoâng chính xaùc. Ngöôøi ñeà xuaát vaán
ñeà thöôøng khoâng hieåu toát veà noù. Anh ta khoâng bieát caùch giaûi quyeát hoaëc
khoâng hieåu veà khaû naêng vaø haïn cheá cuûa maùy tính. Do ñoù böôùc ñaàu tieân
ñeå giaûi quyeát moät vaán ñeà laø phaân tich vaø ñaëc taû noù moät caùch chính xaùc.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 65 -
Söï phaân tích naøy ñoøi hoûi tröôùc heát phaûi xaùc ñònh ñaàu ra (output), nghóa
laø nhöõng thoâng tin naøo caàn taïo ra ñeå giaûi quyeát vaán ñeà. Sau khi ñaëc taû
ñaàu ra cuûa vaán ñeà, caàn phaûi phaân tích chi tieát ñeå xaùc ñònh ñaàu
vaøo(input), ñoù laø nhöõng thoâng tin duøng ñeå giaûi baøi toaùn. Thoâng thöôøng
phaùt bieåu baøi toaùn chöùa nhöõng thoâng tin khoâng phuø hôïp vaø phaûi xaùc
ñònh phaàn thoâng tin naøo coù iùch.
Ngoaøi vieäc ñaëc taû ñaàu ra vaø ñaàu vaøo coøn caàn theâm moät soá thoâng tin nöõa.
Coù theå duøng phaàn cöùng vaø phaàn meàm naøo? Chöông trình daønh cho ñoái
töôïng naøo, chuyeân gia hay ngöôøi môùi duøng maùy tính? Kinh phí vaø thôøi
gian thöïc hieän ra sao?v.v…
V-2.CHOÏN LÖÏA CAÁU TRUÙC DÖÕ LIEÄU VAØ PHAÙT TRIEÅN THUAÄT
TOAÙN:
Giai ñoaïn naøy laø giai ñoaïn khoù khaên nhaát. Vieäc choïn löïa caáu truùc döõ
lieäu, vieäc thieát laäp caùc thuaät toaùn ñuùng ñaén laø nhöõng vaán ñeà maáu choát
cuûa vieäc laøm phaàn meàm. Hai khía caïnh naøy laø quan troïng vaø khoâng theå
taùch rôøi nhau. Niklaus Wirth, ngöôøi saùng laäp ra ngoân ngöõ Pascal ñaõ
toång keát.
Thuaät toaùn + Caáu truùc döõ lieäu = Chöông trình
Caáu truùc döõ lieäu bao goàm nhöõng döõ lieäu nguyeân thuyû vaø caùc döõ lieäu coù
caáu truùc nhö maûng, baûn ghi, taäp hôïp, danh saùch (seõ ñöôïc hoïc ôû caùc
chöông sau).
Trong tin hoïc thuaät toaùn duøng ñeå chæ moät thuû tuïc coù theå thöïc hieän baèng
maùy tính vaø ñieàu naøy daãn ñeán moät soá giôùi haïn ñoái vôùi caùc leänh taïo neân
thuû tuïc:
1. Chuùng phaûi roõ raøng ñeå coù theå bieát roõ leänh naøo laøm vieäc gì.
2. Chuùng phaûi ñuû ñôn giaûn ñeå maùy tính thöïc hieän ñöôïc.
3. Chuùng phaûi höõu haïn, nghóa laø thuaät toaùn phaûi keát thuùc sau moät soá
höõu haïn caùc pheùp toaùn.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 66 -
Caùc thuaät toaùn thöôøng ñöôïc moâ taû baèng maõ giaû. Vieäc phaân tích vaø kieåm
nghieäm thuaät toaùn seõ deã daøng hôn neáu chuùng coù caáu truùc toát. Caùc thuaät
toaùn vaø chöông trình coù caáu truùc ñöôïc thieát keá bôûi ba caáu truùc ñieàu
khieån caên baûn :
1. Tuaàn töï : caùc böôùc ñöôïc thöïc hieän laàn löôït, moãi böôùc ñuùng moät laàn.
2.Löïa choïn: moät trong nhieàu thao taùc ñöôïc choïn ñeå thöïc hieän.
3.Laëp laïi: moät hay nhieàu böôùc ñöôïc thöïc hieän laëp laïi.
Ba cô cheá ñieàu khieån naøy thaät laø ñôn giaûn, nhöng trong thöïc teá chuùng
ñuû maïnh ñeå xaây döïng baát kyø thuaät toaùn naøo.
V-3.MAÕ HOAÙ CHÖÔNG TRÌNH:
Khoâng phuï thuoäc vaøo ngoân ngöõ ñöôïc duøng, caùc chöông trình phaûi vieát
ñuùng, deã ñoïc vaø deã hieåu. Tính ñuùng ñaén ñöông nhieân laø quan troïng
nhaát. Chöông trình khoâng coù giaù trò gì neáu khoâng taïo ra keát quaû ñuùng.
Nhöõng ngöôøi môùi laäp trình thöôøng khoâng ñaùnh giaù ñöôïc taàm quan troïng
cuûa thoùi quen laäp trình toát ñeå coù chöông trình deã ñoïc vaø deã hieåu. Ñieàu
naøy laø do giöõa moâi tröôøng hoïc taäp vaø thöïc teá raát khaùc xa nhau.Nhöõng
chöông trình cuûa sinh vieân thöôøng nhoû (khoaûng vaøi traêm doøng)vaø ñöôïc
vieát moät caùch ñoäc laäp. Nhöõng chöông trình thöïc teá coù theå raát lôùn (heä
ñieàu haønh Windows95 coù khoaûng 200 trieäu doøng leänh). Nhöõng chöông
trình nhö vaäy ñöôïc vieát bôûi caùc nhoùm laäp trình vaø chuùng thöôøng ñöôïc
baûo trì bôûi nhöõng ngöôøi hoaøn toaøn khaùc vôùi nhöõng laäp trình vieân ban
ñaàu. Khi ñoù tính deã ñoïc, deã hieåu cuûa chöông trình seõ coù yù nghóa soáng
coøn.
Coù nhöõng kinh nghieäm laäp trình goùp phaàn vaøo vieäc vieát chöông trình
deã ñoïc, deã hieåu. Bôûi vì thoùi quen toát trong vieäc laäp trình laø raát cô baûn,
neân chuù yù nhöõng ñieàu sau ñaây:
Nguyeân taéc ñaàu tieân laø chöông trình phaûi coù caáu truùc toát .
Nhöõng lôøi khuyeân coù ích laø:
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 67 -
-
Duøng phöông phaùp phaân tích töø treân xuoáng
-
Söû duïng caùc caáu truùc ñieàu khieån cô baûn ñeå vieát cho moãi khoái. Chæ ñi
vaøo ôû ñænh vaø ñi ra ôû ñaùy cuûa khoái.
-
Söû duïng caùc bieán ñiaï phöông trong chöông trình con. Caùc bieán chæ
duøng trong moät chöông trình con chæ neân ñöôïc khai baoù trong
chöông trình con ño.ù
-
Söû duïng caùc tham soá ñeå trao vaø nhaän thoâng tin töø chöông trình con.
-
Ñeå baûo veä tham soá khoâng bò thay ñoåi bôûi chöông trình con, neân
duøng tham trò hôn laø tham bieán.
-
Söû duïng caùc bieán traïng thaùi ñeå baùo hieäu caùc loãi hay caùc ñieàu kieän
ñaëc bieät trong khi chaïy chöông trình con.
-
Duøng caùc teân coù tính gôïi nhôù thay vì duøng soá.
Ví duï
DoTangDanso := (0.1758 –0.1257)* Danso laø raát khoù hieåu so vôùi
TileSinh := 0.1758;
TileChet := 0.1257;
DoTangDanso := (TileSinh – TileChet) *Danso
-Coá gaéng vieát ñôn giaûn vaø roõ raøng. Caùc thuû thuaät chæ ñeå minh hoaï söï
kheùo leùo cuûa ngöôøi laäp trình neân traùnh.
Nguyeân taéc thöù hai laø moïi chöông trình neân coù chuù thích
Ñaêïc bieät laø caùc chöông trình phaûi coù lôøi chuù thích môû ñaàu. Nhöõng chuù
thích naøy giaûi thích muïc ñích cuûa chöông trình, thuaät toaùn maø noù söû
duïng, teân ngöôøi vieát, ngaøy giôø vieát ..Ngoaøi ra moät ñieàu toát laø giaûi thích
caùch ñaët teân haèng vaø bieán.
Neân duøng chuù thích cho caùc phaàn then choát cuûa chöông trình, ví duï ñaàu
vaø cuoái voøng laëp, hay choã reõ nhaùnh.
Moät chöông trình con cuõng caàn coù chuù thích, ñaëc bieät laø thoâng tin noù
nhaän vaø thoâng tin noù traû veà.
Nguyeân taéc thöù ba laø chöông trình neân vieát theo moät phong caùch toát.
Nhöõng lôøi khuyeân cho phong caùch laäp trình toát laø
-Moãi leänh cuûa chöông trình naèm treân moät doøng rieâng,
- Phoái hôïp chöõ in hoa vaø chöõ thöôøng ñeå taêng tính deã ñoïc,
-In ñaäm caùc töø khoaù (haàu heát caùc trình soaïn thaûo chöông trình thoâng
duïng hieän nay cho pheùp töï ñoäng laøm ñieàu naøy)
- Duøng caùc khoaûng troáng ñeå deã ñoïc
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 68 -
-
Ñeå moät doøng traéng tröôùc moãi phaàn chöông trình
-
Taän duïng caùch vieát thuït ñaàu doøng
V-4 THÖÏC HIEÄN VAØ THÖÛ CHÖÔNG TRÌNH
Raát hieám khi moät chöông trình vieát maø khoâng coù loãi. Caùc loãi cuù phaùp
vaø caùc loãi luùc thöïc thi thöôøng deã tìm vaø deã söûa, bôûi vì coù nhöõng thoâng
baùo loãi cuûa heä thoáng giaûi thích vaø ñònh viï nhöõng loãi naøy. Tuy nhieân,
caùc
loãi
loâgic khoù tìm hôn nhieàu. Nhöõng loãi naøy laø do maõ hoaù khoâng
chính xaùc thuaät toaùn hay do chính vieäc thieát keá thuaät toaùn.
Moät kyõ thuaät coù theå coù ích ñeå ñònh vò caùc loãi loâgic laø theo veát (trace)
chöông trình baèng caùch theâm vaøo caùc leänh in ra taïm thôøi ñeå hieån thò giaù
trò cuûa caùc bieán chuû yeáu trong caùc giai ñoaïn khaùc nhau. Haàu heát caùc
coâng cuï laäp trình hieän nay ñeàu coù hoã trôï cho vieäc theo veát naøy.
Trong moät vaøi öùng duïng, nhö trong caùc heä phoøng thuû chieán löôïc, caùc heä
ñieàu khieån taøu vuõ truï, nhöõng loãi trong chöông trình laø caû moät tai hoaï vaø
khoâng theå dung thöù ñöôïc. Trong nhöõng tröôøng hôïp nhö theá, tin töôûng
vaøo keát quaû cuûa nhöõng laàn thöû nghieäm laø chöa ñuû. Caàn phaûi coù moät
chöùng minh suy dieãn raèng chöông trình laø ñuùng vaø noù luoân luoân cho ra
keát quaû ñuùng. Vieäc kieåm tra thuaät toaùn/chöông trình laø phaàn quan troïng
trong quaù trình phaùt trieån chöông trình, lyù töôûng laø khi coù theå chöùng
minh moät caùch hình thöùc tính ñuùng ñaén cuûa moãi chöông trình. Tuy
nhieân, trong thöïc teá thôøi gian vaø coâng söùc ñeå chöùng minh seõ raát lôùn.
Maëc duø vaäy, vieäc “kieåm tra treân giaáy” chöông trình, theo veát moãi con
ñöôøng thöïc hieän cuõng laø moät söï reøn luyeän toát veà laäp trình. Ñieàu ñoù tuy
khoâng baûo ñaûm raèng thuaät toaùn/chöông trình laø tuyeät ñoái ñuùng, nhöng
noù laøm taêng söï tin caäy vaøo tính ñuùng ñaén cuûa chöông trình vaø laøm hieåu
roõ hôn chöông trình vaø vì vaäy coù theå tìm ra ñöôïc nhöõng loãi logic khoù
phaùt hieän. Khi ngöôøi laäp trình daàn daàân coù kinh nghieäm, ñieàu quan troïng
laø hoï tích luyõ ñöôïc nhöõng coâng cuï coù saün chöùa caùc thuaät toaùn maø tính
ñuùng ñaén ñaõ ñöôïc xaùc minh vaø hoï coù theå duøng moät caùch tín caäy.
V-5 BAÛO TRÌ CHÖÔNG TRÌNH:
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 69 -
Sau moät thôøi gian, caùc chöông trình thöôøng caàn phaûi thay ñoåi. Thöôøng
phaûi caûi tieán hay naâng caáp chöông trình. Caùc chöông trình coù theå thay
ñoåi deã daøng neáu ñöôïc vieát coù tính ñôn theå(modular), vì chæ caàn thay ñoåi
moät vaøiø module.
Vieäc baûo trì chöông trình laø moät phaàn quan troïng cuûa coâng ngheä phaàn
meàm vaø hôn 50% thôøi gian cuûa caùc nhaø laäp trình duøng vaøo vieäc baûo trì
chöông trình. Vieäc baûo trì thöôøng ñöôïc thöïc hieän bôûi nhöõng ngöôøi
khoâng tham gia vaøo thieát keá ban ñaàu. Do ñoù, caàn phaûi laøm heát söùc ñeå
thieát keá nhöõng chöông trình deã ñoïc, chuù thích roõ raøng, coù caáu truùc toát ñeå
coù theå deã hieåu, deã thay ñoåi vaø deã baûo trì.
BAØI TAÄP CHÖÔNG V
Haõy choïn moät chöông trình baïn ñaõ vieát ôû caùc chöông tröôùc vaø phaân tích
theo quan ñieåm laäp trình coù phöông phaùp. Haõy söûa laïi chöông trình ñoù
nhöõng phöông phaùp neâu ra trong chöông naøy.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 70 -
CHÖÔNG VI MÔÛ ROÄNG KIEÅU DÖÕ LIEÄU THÖÙ TÖÏÏ
VI –1 KIEÅU THÖÙ TÖÏ DO NGÖÔØI DUØNG ÑÒNH NGHÓA
Pascal cho pheùp ngöôøi duøng töï dònh nghóa kieåu döõ lieäu baèng caùch lieät
keâ.
Ví duï:
type Mau = (do, cam., vang, luc, lam, cham , tim);
Xemay = (Dream, Future, Wave, Viva, Spacy);
Töø khoaù duøng ñeå ñònh nghóa kieåu laø type.
Chuù yù laø caùc teân trong danh saùch lieät keâ phaûi tuaân theo ñuùng quy taéc ñaëït
teân
Khi ñaõ ñònh nghóa xong kieåu döõ lieäu, coù theå khai baùo caùc bieán thuoäc
kieåu naøy.
Ví duï:
Mau1 : Mau;
Xe: Xemay;
Chuùng ta coù theå gaùn trò cho caùc bieán naøy:
Mau1 := cam;
Xe := Future;
Khi coù theâm phaàn ñònh nghóa kieåu döõ lieäu, caáu truùc cuûa chöông trình
Pascal trôû thaønh nhö sau:
ñaàu chöông trình
phaàn
ñònh
nghóa
ñònh
nghóa
haèng
ñònh
nghóa
kieåu
phaàn
khai
baùo
khai
baùo
bieán
khai baùo thuû tuïc vaø haøm
phaàn
leänh
Caùc kieåu döõ lieäu ñöôïc khai baùo theo kieåu lieät keâ naøy laø caùc kieåu thöù töï.
Phaàn töû ñaàu tieân coù soá thöù töï laø 0. Ta coù theå duøng haøm ord ñeå tìm thöù töï
cuûa moät trò thuoäc kieåu naøo ñoù. ví duï:
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 71 -
ord(Future) =1
Caùc haøm pred vaø succ cuõng duøng ñöôïc. Ví du:
pred(cam) = do
vaø succ(do) = cam
Haøm ord nhö vaäy cho pheùp ñoåi moät kieåu thöù töï baát kyø thaønh kieåu
nguyeân. Pascal chuaån khoâng coù haøm bieán ñoåi ngöôïc laïi. TurboPascal
cho pheùp bieán ñoåi ngöôïc laïi theo cuù phaùp:
Teân kieåu döõ lieäu(Soánguyeân)
Ví duï Mau(3) = luc;
Laäp trình vôùi kieåu thöù töï do ngöôøi duøng ñònh nghóa
Vì laø kieåu thöù töï, neân caùc kieåu töï ñònh nghóa naøy duøng ñöôïc trong caáu
truùc For vaø Case.
Ví duï chuùng ta caàn tính löông haøng tuaàn theo giôø laøm vieäc. Löông giôø
ngaøy thöù baûy seõ ñöôïc tính gaáp röôõi, coøn chuû nhaät seõ tính gaáp ñoâi. Chuùng
ta coù chöông trình sau:
program Tinhluong;
const Mucthuong = 2000;
{Tieàn thöôûng seõ tính treân soá giôø thöïc teá, khoâng tính phuï troäi}
type Ngay=(ThuHai,ThuBa,ThuTu , ThuNam, ThuSau,
ThuBay,ChuNhat);
var NgayLV : Ngay;
LuongGio, TongLuong; GioTL,TienThuong : real;
GioLV:
integer;
begin
writeln(‘ Nhap vao löông giôø.’);
readln(LuongGio);
TongLuong := 0;
TienThuong := 0;
writeln(‘Nhaäp vaøo soá giôø laøm vieäc thöù hai ñeán chuû nhaät’);
for NgayLV := ThuHai to ChuNhat do
begin
readln
(GioLV);
case NgayLV of
ThuBay : GioTL := 1.5 * GioLV;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 72 -
ChuNhat : GioTL := 2 * GioLV;
ThuHai, ThuBa, ThuTu , ThuNam, ThuSau:
GioTL
:=
GioLV;
end; {case}
TienThuong := TienThuong + (GioLV*MucThuong);
TongLuong:= TongLuong +(GioTL*LuongGio)
end; {for}
TongLuong := TongLuong + TienThuong;
wrieln(‘Tong luong ca tuan la ‘,Tongluong:8:2)
end.
Kieåu döõ lieäu töï ñònh nghóa khoâng nhaäp ñöôïc töø baøn phím vaø cuõng khoâng
in ra ñöôïc. Muoán nhaäp hay in ra chuùng ta phaûi vieát thuû tuïc rieâng. Ví duï
thuû tuïc sau in ra ngaøy thöù cho kieåu Ngay ôû treân:
procedure InThu(Thu:Ngay);
begin
case Thu of
ThuHai : writeln( ‘Thöù hai’);
ThuBa : writeln( ‘Thöù ba’);
ThuTu : writeln( ‘Thöù tö’);
ThuNam : writeln( ‘Thöù naêm’);
ThuSau : writeln( ‘Thöù saùu’);
ThuBay : writeln( ‘Thöù baûy’);
ChuNhat:
writeln(‘Chuû
nhaät’);
end;
end;
VI-2 KIEÅU MIEÀN CON
Ñoâi khi chuùng ta khoâng duøng heát giaù trò cuûa moät kieåu thöù töï, maø chæ
duøng moät phaàn trong ñoù. Khi ñoù ta coù theå ñònh nghóa kieåu mieàn con:
Ví duï:
type Ngay= (ThuHai, ThuBa, ThuTu,ThuNam,ThuSau,
ThuBay,ChuNhat);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 73 -
NgayLV = ThuHai..ThuSau; {mieàn con cuûa Ngay}
NgayNghi = ThuBay..ChuNhat; {mieàn con cuûa Ngay}
Gio = 0..23
{Mieààn con cuûa integer}
ChuHoa = ‘A’..’Z’
{Mieàn con cuûa char}
Caùc kieåu töï ñònh nghóa cuõng nhö kieåu mieàn con giuùp cho chöông trình
deã ñoïc vaø deã kieåm tra loãi.
Trong danh saùch tham soáù, caùc kieåu döõ lieäu phaûi laø kieåu ñaõ ñònh nghóa,
khoâng cho pheùp vieát tröïc tieáp kieåu mieàn con.
Chuùng ta seõ coù ví duï veà caùch duøng kieåu mieàn con trong caùc chöông sau.
Töø khoaù Pascal môùi
type
Khaùi nieäm môùi
Kieåu thöù töï do ngöôøi duøng ñònh nghóa
Kieåu mieàn con
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 74 -
BAØI TAÄP CHÖÔNG VI
1.Giaû söû baïn ñaõ ñònh nghóa vaø khai baùo nhö sau:
type
Rainbow=(Infrared,Red,Orange,Yellow,Green,Blue,Violet,Ultraviolet)
;
Spectrum =Infrared..Blue
Var HotColors:Infrared..Green;
Colors:Rainbow;
ColColors:Yellow..Ultraviolet;
a) Bieán naøo coù theå ñöôïc truyeàn nhö ñoái cuûa moät tham trò kieåu
Rainbow?
b) Bieán naøo coù theå ñöôïc truyeàn nhö ñoái cuûa moät tham trò kieåu
Spectrum?
c) Bieán naøo coù theå ñöôïc truyeàn nhö ñoái cuûa moät tham bieán kieåu
Spectrum?
d) Bieán naøo coù theå ñöôïc truyeàn nhö ñoái cuûa moät tham trò ñöôïc ñònh
nghóa nhö sau:
AnyProcedure(Hue:Infrared..Ultraviolet);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 75 -
CHÖÔNG VII MAÛNG VAØ CHUOÃI
VII-1 MAÛNG:
Maûng laø caáu truùc döõ lieäu phoå bieán nhaát, coù maët trong haàu heát caùc ngoân
ngöõ laäp trình. Baïn coù moät daõy soá, moät baûng hay moät heä toaï ñoä? Haàu
nhö moïi nhoùm giaù trò nhö theá ñeàu coù theå bieåu dieãn baèng maûng, bôûi vì
caùc giaù trò maûng ñöôïc truy caäp theo vò trí thay vì theo teân.
Ñònh nghóa vaø khai baùo maûng
Cuù phaùp khai baùo maûng coù daïng
type teân maûng = array [kích thöôùc] of kieåu phaàn töû;
Kích thöôùc ñöôïc chæ ra baèng caùc caän cuûa maûng, caùc caän naøy phaûi laø kieåu
thöù töï. Kieåu phaàn töû coù theå laø kieåu döõ lieäu baát kyø.
Sau khi ñònh nghóa, coù theå khai baùo moät bieán kieåu maûng theo cuù phaùp.
var teân bieán : teân maûng;
Vi duï:
type vector = array [1..3] of real; {maûng moät chieàu}
matran
=
array[1..10,1..20] of integer; {maûng hai chieàu}
DemChuHoa = array[‘A’..’Z’] of integer; {“Chæ soá “ laø chöõ caùi}
Dientro = array[-100..100] of real; { ño ñieän trôû töø 100
0
C ñeán
100
0
C}
var v: vector;
A,B:
matran;
dch: DemChuHoa;
R:
Dientro;
Truy xuaát maûng
Caùc phaàn töû maûng ñöôïc truy xuaát theo vò trí. Vò trí ñöôïc cho bôûi chæ soá
ví duï A[1,5]. Töøng phaàn töû maûng laø moät bieán coù kieåu döõ lieäu laø kieåu
phaàn töû cuûa noù vaø thao taùc treân ñoù nhö vôùi bieán thoâng thöôøng.
Ví duï: A[1,1] := 1;
A[2,3] := A[1,3] *B[2,3];
Ñaëc bieät chuùng ta coù theå gaùn hai maûng cuøng loaïi (töùc laø gaùn ñoàng thôøi
cho moïi phaàn töû). Ví duï
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 76 -
A := B;
Chuù yù tuy quen goïi laø chæ soá, nhöng chæ soá khoâng nhaát thieát phaûi laø soá vì
ta bieát chæ soá chæ yeâu caàu laø kieåu thöù töï. Ví duï ta muoán ñeám trong 100
laàn goõ kí töï vaøo baøn phím. soá laàn xuaát hieän caùc kí töï töø ‘A’ ñeán ‘Z’ laø
bao nhieâu laàn? Khi ñoù kieåu döõ lieäu
type DemChuHoa = array[‘A’..’Z’] of integer; {“Chæ soá “ laø chöõ caùi}
seõ laøm cho thuaät toaùn cuûa chöông trình raát ñôn giaûn
program DemChu;
type DemChuHoa = array[‘A’..’Z’] of integer; {“Chæ soá “ laø chöõ caùi}
var I: integer;
Ch : char;
DCH : DemChuHoa
begin
for ch := ‘A’ to ‘Z’ do DCH[Ch] := 0;
{Khôûi taïo}
(* ñoïc 100 kí töï vaø ñeám}
for i:= 1 to 100 do
begin
readln(Ch);
ch := UpCase(Ch) ; {Bieán thaønh chöõ hoa}
DCH[Ch] := DCH[Ch] + 1;
end;
for ch := ‘A’ to ‘Z’ do
if DCH[Ch} >0 then writeln(‘So chu’,Ch, ‘ = ‘,DCH[Ch]:1)
end.
Maûng vaø voøng laëp for
Moät caùch töï nhieân caùc thao taùc treân maûng thöôøng ñöôïc thöïc hieän baèng
voøng laëp for, bôûi vì bieán ñeám coù theå duøng nhö chæ soá cuûa maûng . Ví duï:
procedure NhapMang(Var A : Mang; Canduoi, Cantren: integer);
{Nhaäp döõ lieäu vaøo moät maûng}
var i :integer;
begin
for i := Canduoi to Cantren do
readln(A[
i]);
end;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 77 -
Töông töï vôùi maûng hai chieàu. Giaû söû ta coù kieåu döõ lieäu
type Matran = array[1..10,1..20] of integer;
var Bang : matran;
Chuùng ta muoán tìm ra phaàn töû lôùn nhaát cuûa Bang. Baèng caùch duyeät laàn
löôït qua töøng haøng, ta seõ tìm ra ñöôïc phaàn töû lôùn nhaát. Ta coù thuû tuïc
procedure FindMax(var Bang: Matran);
{Tìm phaàn töû lôùn nhaát cuûa matraän }
var Max, Hang, Cot :integer;
begin
Max := Bang[1,1]; { Khôûi taïo}
for Hang := 1 to 10 do
for Cot := 1 to 20 do
if (Bang[Hang,Cot] > Max) then
Max
:=
Bang[Hang,Cot];
writeln (‘Giaù trò lôùn nhaát trong baûng laø:’, Max:1)
end; { FindMax}
Khi xöû lyù maûng, höôùng tieáp caän töø döôùi leân cuõng coù ích nhö tieáp caän töø
reân xuoáng. Phöông phaùp töø döôùi leân coù theå neâu toùm taét laø
Tìm ra quy luaät, roài thieát keá thuaät toaùn
Tieáp caän töø döôùi leân thöôøng daãn ñeán moät lôøi giaûi tröïc giaùc cuûa vaán ñeà
Ví duï, giaû söû chuùng ta muoán khôûi taïo ma traän sau
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
Chuùng ta khai baùo
type Matran = array[1..4,1..4] of integer;
var a : Matran;
Sau khi suy nghó, chuùng ta coù theå phaùt hieän ra quy luaät sau:
a[i,j] := 4*(i-1) +j;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 78 -
Töø quy luaät naøy, thuû tuïc khôûi taïo maûng treân ñöôïc vieát deã daøng.
procedure Khoitao(var a: Matran);
var i,j:integer;
begin
for i:= 1 to 4 do
for j:=1 to 4 do
a[i,j]
:=
4*(i-1)+j;
end;
Baèng caùch chuyeån ñoåi ma traän treân, baïn ñoïc deã daøng taïo ra caùc ma traän
sau
1 5 9 13
4 3 2 1
2 6 10 14
8 7 6 5
3 7 11 15
12 11 10 9
4 8 12 16
16 15 14 13
VII-2 SAÉP XEÁP
Saép xeáp laø moät trong nhöõng chuû ñeà ñöôïc khaûo saùt kyõ nhaát cuûa laäp trình.
ÔÛ ñaây chuùng ta chæ neâu vaøi phöông phaùp caên baûn.
Saép xeáp baèng caùch noåi boït
YÙ töôûng cuûa phöông phaùp naøy laø: chuùng ta duyeät qua maûng töø döôùi
leân,vaø ñoåi choã hai phaàn töû keá nhau neáu chuùng coù thöù töï ngöôïc. Sau moãi
laàn duyeät phaàn töû nhoû nhaát trong nhöõng phaàn töû coøn laïi ñöôïc noåi leân
treân (do ñoù coù teân laø noåi boït). Chuùng ta xem ví duï ôû baûng sau
khôûi ñoäng i =2
i =3
i =4
i =5
i =6
i=7
i=8
44
55
12
42
94
18
06
67
06
44
55
12
42
94
18
67
06
12
44
55
42
94
18
67
06
12
18
44
55
42
94
67
06
12
18
42
44
55
67
94
06
12
18
42
44
55
67
94
06
12
18
42
44
55
67
94
06
12
18
42
44
55
67
94
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 79 -
Ta coù chöông trình
program BubbleTest;
type Int_Arr = array[1..8] of integer;
var i: integer;
a : Int_Arr;
procedure BubbleSort(var a: Int_Arr; n:integer);
var i,j:integer;
procedure Switch( var a,b:integer);
var c: integer;
begin
c:=
a;
a:=
b;
b:=c;
end; {Switch}
begin {BubbleSort}
for i :=2 to n do
for j := n downto i do
if a[j-1]>a[j] then
Switch(a[j],a[j-1]);
end; {BubbleSort}
begin
a[1]:=44;
a[2] :=55;
a[3]:= 12
a[4] := 42;
a[5] := 94;
a[6] := 18;
a[7] := 6;
a[8] := 67;
for i := 1 to 8 do write(a[i]:4);
writeln;
BubbleSort(a,8);
for i := 1 to 8 do write(a[i]:4);
writeln;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 80 -
end.
Vì saép xeáp laø vieäc raát thöôøng gaëp vôùi döõ lieäu, neân nhieàu phöông phaùp
caûi tieán ñaõ ñöôïc ñöa ra. Trong soá ñoù noåi tieáng nhaát laø Quicksort.
Phöông phaùp naøy ñöôïc ñaët teân nhö vaäy vì toác ñoä raát nhanh, nhaát laø treân
caùc maûng lôùn.
Giaûi thuaät cuûa noù nhö sau. Choïn moät phaàn töû x (thöôøng naèm giöõa
maûng). Duyeät töø beân traùi maûng cho ñeán khi coù moät phaàn töû a[i] >x, sau
ñoù laïi duyeät töø beân phaûi maûng cho ñeán khi coù moät phaàn töû a[j] <x. Ñoåi
choã a[i] vaø a[j] tieáp tuïc quaù trình duyeät vaø ñoåi choã cho tôùi khi hai phía
gaëp nhau. Keát quaû laø maûng ñöôïc chia laø 2 phaàn: beân traùi laø caùc phaàn töû
nhoû hôn x vaø beân phaûi laø caùc phaàn töû lôùn hôn x. Vieäc laøm nhö vaäy ñöôïc
goïi laø chia phaàn. Sau ñoù tieáp tuïc chia phaàn cho moãi phaàn, cho ñeán khi
caùc phaàn chæ coøn laïi moät phaàn töû. Roõ raøng thuaät giaûi naøy coù tính ñeä quy.
Ta coù chöông trình
program QuickSortTest;
type Int_Arr = array[1..8] of integer;
var i: integer;
a : Int_Arr;
procedure QuickSort(var item: Int_Arr; n:integer);
var i,j:integer;
(*******************************************)
procedure PartialSort(left,right:integer; var a: Int_Arr);
var i,j,k : integer;
(*******************************)
procedure Switch( var a,b:integer);
var c: integer;
begin
c:=
a;
a:=
b;
b:=c;
end; {Switch}
(*************************************)
begin {PartialSott}
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 81 -
k := (a[left] + a[right]) div 2;
i := left;
j := right;
repeat
while a[i] < k do i := i+1;
while k <a[j] do j := j -1;
if i<= j then
begin
Switch(a[i],a[j]);
i
:=
i+1;
j
:=
j
-1;
end;
until i>j;
if left <j then PartialSort(left,j,a);
if i< right then PartialSort(i,right,a);
end; {PartialSort}
begin {QuickSort}
PartialSort(1,n,item)
end; {QuickSort}
begin
a[1]:=44;
a[2] :=55;
a[3]:= 12;
a[4] := 42;
a[5] := 94;
a[6] := 18;
a[7] := 6;
a[8] := 67;
for i := 1 to 8 do write(a[i]:4);
writeln;
QuickSort(a,8);
for i := 1 to 8 do write(a[i]:4);
writeln;
end.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 82 -
VII-3 TÌM KIEÁM
Tìm tuaàn töï
Tìm kieám treân moät maûng laø vieäc thöôøng gaëp trong laäp trình. Vôùi moät
maûng baát kyø, chöa ñöôïc saép xeáp, ngöôøi ta duøng caùch tìm tuaàn töï. Tìm
tuaàn töï nghóa laø chuùng ta laàn löôït duyeät qua töøng phaàn töû cuûa maûng cho
ñeán khi tìm ra phaàn töû caàn tìm. Ta coù chöông trình
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 83 -
program TimTuantu;
type Int_Arr = array[1..100] of integer;
var a:Int_Arr;
i,j : integer;
function Timtt(x:integer; a: Int_Arr; n:integer) :integer;
var i: integer;
begin
for i:= 1 to n do
if x =a[i] then
begin
Timtt
:=
i;
exit;
end;
Timtt := 0
end; {Timtt}
begin
for i := 1 to 100 do a[i] := random(100)+1;
repeat
writeln(‘ Nhaäp soá ñeå tìm (0 ñeå thoaùt): ‘);
readln(i);
j
:=
Timtt(i,a,100);
if j = 0 then
writeln(‘ So khoâng coù trong daõy’)
else
writeln(i,’ laø phaàn töû thöù’,j);
writeln;
until i = 0;
end.
Tìm kieám nhò phaân
Khi maûng ñaõ ñöôïc saép xeáp, coù theå tìm kieám treân maûng nhanh hôn nhieàu
baøng caùch tìm nhò phaân. Ta chia ñoâi maûng, so saùnh phaàn töû caàn tìm vôùi
phaàn töû giöõa. Neáu phaàn töû caàn tìm nhoû hôn phaàn töû giöõa, ta tìm ôû nöûa
ñaàu. Neáu phaàn töû caàn tìm lôùn hôn phaàn töû giöõa, ta tìm ôû nöûa sau. Soá laàn
tìm kieám seõ giaûm ñi raát nhieàu so vôùi tìm tuaàn töï (log
2
n so vôùi n/2).
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 84 -
Ta coù chöông trình
program TimNhiphan;
type Int_Arr = array[1..100] of integer;
var a:Int_Arr;
i,j : integer;
(********************************)
(* $i quick.inc *)
(********************************)
function Timnp (x:integer; a: Int_Arr; n:integer) :integer;
var high, low, mid :integer;
begin
low := 1;
high := n;
while high >= low do
begin
mid := (high+low) div 2;
if x> a[mid] then
low:=
mid
+1
else if x< a[mid] then
high
:=
mid
–1
else
high
:=
-1;
end; {while}
if high := -1 then
Timnp := mid
else
Timnp
:=
0;
end; {Timnp}
begin
for i := 1 to 100 do a[i] := random(200)+1;
QuickSort(a,100);
repeat
writeln(‘ Nhaäp soá ñeå tìm (0 ñeå thoaùt): ‘);
readln(i);
j
:=
Timtnp(i,a,100);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 85 -
if j = 0 then
writeln(‘ Soá khoâng coù trong daõy’)
else
writeln(i,’ laø phaàn töû thöù’,j);
writeln;
until i = 0;
end.
KHI NAØO NEÂN DUØNG MAÛNG?
Baïn ñaõ bieát caùch duøng maûng nhö theá naøo, nhöng chöa bieát khi naøo neân
duøng maûng? Nhieàu sinh vieân coù thoùi quen duøng maûng ñeå giaûi quyeát
vaán ñeà ngay caû khi khoâng caàn thieát. Laøm theá naøo chuùng ta coù theå bieát
khi naøo caàn duøng maûng hoaëc khoâng?
Noùi chung, neáu nhieàu döõ lieäu caàn phaûi löu tröõ ñoàng thôøi trong boä nhôù ñeå
giaûi quyeát vaán ñeà moät caùch coù hieäu quaû, khi ñoù duøng maûng laø caùch
thích hôïp. Traùi laïi, maûng seõ khoâng caàn thieát. Ví duï, xem xeùt vaán ñeà tính
trung bình cuûa moät daõy vaø vaán ñeà saép xeáp moät daõy.
Trong baøi toaùn tính trung bình, chuùng ta caàn tính caùc toång. Caùc toång naøy
coù theå tính laàn löôït ngay khi caùc phaàn töû ñöôïc nhaäp vaøo. Do ñoù chöông
trình tính trung bình khoâng caàn thieát duøng moät maûng. Baïn coù theå duøng
maûng ñeå löu tröõ soá lieäu roài tính toång nhöng ñieàu ñoù laø khoâng caàn
thieát.(Xem laïi chöông trình tính trung bình ôû chöông IV)
Traùi laïi saép xeáp moät daõy soá ñoøi hoûi toaøn boä daõy soá phaûi naèm trong boä
nhôù tröôùc khi baïn coù theå saép xeáp. Do ñoù trong tröôøng hôïp naøy baïn baét
buoäc phaûi duøng maûng.
Duøng maûng khi khoâng caàn thieát seõ coù hai nhöôïc ñieåm chính
1. Caùc maûng khoâng caàn thieát seõ laõng phí boä nhôù. Maûng coù theå ngoán
moät löôïng lôùn boä nhôù, laøm cho chöông trình phình ra hôn möùc
caàn thieát. Moät chöông trình lôùn caàn maùy tính maïnh hôn ñeå chaïy,
vaø do ñoù seõ toán tieàn hôn
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 86 -
2. Caùc maûng khoâng caàn thieát seõ haïn cheá khaû naêng cuûa chöông trình.
Ñeå hieåu ñieàu naøy, haõy xeùt laïi ví duï veà tính trung bình. Neáu chuùng
ta duøng maûng, giôùi haïn tôùi 1000 phaàn töû, thì noù chæ chaïy vôùi toái
ña 1000 döõ lieäu. Neáu caàn chaïy nhieàu hôn, buoäc phaûi söûa laïi
chöông trình. Trong khi ñoù, chöông trình khoâng duøng maûng coù
theå chaïy khoâng bò vöôùng giôùi haïn treân naøy.
VII-4 CHUOÃI
Pascal chuaån khoâng coù kieåu döõ lieäu chuoãi. Vì chuoãi ngaøy nay laø moät
kieåu döõ lieäu raát caàn thieát neân caùc phieân baûn hieän nay cuûa Pascal ñeàu coù
kieåu döõ lieäu chuoãi. Kieåu chuoãi ñöôïc khai baùo nhö sau:
type str = string[chieàudaøi];
trong ñoù chieàu daøi laø soá nguyeân coù giaù trò lôùn nhaát laø 255. Neáu khoâng
khai baùo thì chieàu daøi maëc nhieân laø 255. Chuoãi ñöôïc löu nhö moät maûng
kyù töï vôùi byte ñaàu tieân duøng ñeå chöùa chieàu daøi chuoãi. Ví duï
type str10 = string[10]
var s: str10;
neáu gaùn s:=’HELLO’ ta coù chuoãi s ñöôïc löu nhö sau
0 1
2
3 4 5 6 7
8
9
10
5 H E L L O “ @ # & ~
Chuù yù raèng byte ñaàu tieân khoâng phaûi kí töï 5 maø laø soá 5 ôû daïng nhò phaân
(00000101) vaø 5 byte cuoái cuøng coù theå chöùa döõ lieäu ngaãu nhieân.
Theá maïnh cuûa kieåu chuoãi laø coù theå xöû lyù chuùng theo hai caùch: nhö laø
moät döõ lieäu toaøn theå hay nhö laø moät maûng kyù töï. Caû hai caùch ñeàu coù
nhönõg öu theá rieâng, nhö seõ xeùt trong muïc naøy. Caùc chuoãi cuõng coù theå so
saùnh ñöôïc vôùi nhau.
Caùc haøm vaø thuû tuïc cho chuoãi
UpCase bieán moät chöõ thaønh chöõ hoa.
Length traû veà chieàu daøi cuûa chuoãi.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 87 -
Concat hay +:Noái chuoãi coù theå duøng toaùn töû + hay haøm Concat
(concatenate)
program Noichuoi;
var s1,s2,s3: string[80];
begin
s1:= ‘ Ñaây laø khuùc ñaàu “
s2 := ‘ Ñaây laø khuùc cuoái’;
s3 := Concat(s1,s2);
{s3 := s1 + s2);}
writeln(s3};
end.
Sao cheùp chuoãi: haøm chuaån Copy cho pheùp sao cheùp moät chuoãi töø moät
chuoãi ñaõ cho. haøm naøy caàn 3 ñoái: chuoãi ban ñaàu, vò trí baét ñaàu sao cheùp
vaø soá kyù töï caàn sao cheùp.
program DoCopy;
var s: string[80];
i: integer;
begin
s:= ‘Ñaây laø moät doøng daøi seõ ñöôïc vieát ra thaønh coät ‘;
i := 1;
while i< length(s) do
begin
writeln(copy(s,i,10);
i := i+10;
end;
writeln;
end.
Xoaù : thuû tuïc Delete xoaù toaøn boä hay moät phaàn cuûa chuoãi. Gioáng nhö
Copy, ta caàn chæ ra vò trí baét ñaàu vaø soá kyù töï caàn xoaù. Ví duï
Delete(s,5,3) seõ xoaù 3 kyù töï, baét ñaàu töø kyù töï thöù naêm
Cheøn: thuû tuïc Insert cheøn moät chuoãi vaøo moät chuoãi khaùc. Thuû tuïc naøy
nhaän 3 ñoái: chuoãi cheøn, chuoãi ñöôïc cheøn, vaø vò trí cheøn. Chöông trình
sau minh hoaï caùch duøng Delete vaø Insert.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 88 -
program TestInsert;
var s1,s2 :string[80];
begin
s1:=’A’
;
s2 := ‘1234567890’ ;
writeln (‘Cheøn ‘, s1 , ‘ vaøo ‘,’ s2);
Insert (s1,s2,3);
writeln(s2);
writeln(‘Xoaù ‘, s1, ‘ ra khoûi ‘, s2);
Delete(s2,3,1);
writeln(s2);
end.
Keát quaû chaïy chöông trình seõ laø:
Cheøn A vaøo 1234567890
12A34567890
Xoaù A ra khoûi 12A34567890
1234567890
Tìm kieám: haøm Pos cho pheùp tìm kieám vò trí cuûa chuoãi con trong chuoãi.
program TestPos;
var s: string[80]’
begin
s := ‘This is a test string’;
writeln(‘ The position of ‘’test’’ in “ ’, s’’ ‘” is: ‘, pos(‘test’,s);
writeln;
writeln(‘ The position of ‘’TEST’’ in “ ’, s’’ ‘” is: ‘,
pos(‘TEST’,s);
writeln;
end.
Keát quaû chöông trình laø:
The position of ‘test’ in “This is a test string” is: 11;
The position of ‘TEST’ in “This is a test string” is: 0;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 89 -
Chuyeån kieåu : Hai thuû tuïc Str vaø Val cho pheùp chuyeån ñoåi töø soá sang
chuoãi vaø ngöôïc laïi. Str nhaän hai ñoái, moät soá vaø moät bieán chuoãi. Chuùng
ta coù theå thaáy caùch duøng Str trong caùc ví duï sau:
var s: string[20];
Leänh
Keát
quaû
str(10,s);
‘10’
str(10:4,s);
‘
10’
str(3.2,s);
‘
3.2000000000E+00’
str(3.2:0,s);
‘3.2E+00’
str(3.2:10:3,s)
‘ 3.200’
Val nhaän 3 ñoái: chuoãi ñeå chuyeån thaønh soá, bieán soá ñeå nhaän keát quaû vaø
moät bieán nguyeân ñeå baùo loãi. Chöông trình sau trình baøy caùch duøng Val
program ChuoiThanh So;
type MaxStr = string[20];
var r:real; code :integer;
procedure WriteNumber(s:MaxStr);
begin
val(s,r,code);
if code = 0 then
writeln(r:0:3)
else
writeln(‘ Loãi khi chuyeån chuoãi thaønh soá’);
end;{ WriteNumber}
begin
writeln(‘ Chuyeån chuoãi 123.23 thaønh soá ‘);
WriteNumber(‘123.23’);
writeln(‘Baây giôø chuyeån chuoãi s123.23’);
WriteNumber(‘s123.23);
end.
Xöû lyù tröïc tieáp caùc kí töï
Ta coù theå thao taùc treân caùc kyù töï cuûa moät chuoãi nhö caùc thao taùc ñoái vôùi
phaàn töû maûng.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 90 -
Ví duï, vì haøm Upcase chæ thöïc hieän ôû möùc kyù töï ta vieát haøm UpcaseStr
ñeå bieán caû chuoãi thaønh chöõ hoa.
program UpperCase;
type MaxStr = string[255];
var s:MaxStr;
function UpcaseStr(s: MaxStr) : MaxStr;
var i,j: integer;
begin
j := ord(s[0]); {j := length(s);}
for i:= 1 to j do
s[i]
:=
Upcase(s[i]);
UpCaseStr
:=
s;
end;
begin
s
:=
‘abc’;
writeln(s);
writeln(‘Ñoåi thaønh chöõ hoa.’);
writeln(UpcaseStr(s));
writeln;
end.
Ví duï sau laø haøm ñaûo ngöôïc moät chuoãi
type strmax = string[255];
function Daonguoc(s:strmax):strmax;
var l,i:integer;
begin
l := length(s);
for i:=1 to l do Daonguoc[l –i+1] := s[i];
Daonguoc[0] := s[0]; {ñeå giöõ ñuùng chieàu daøi chuoãi}
end;
Tìm vaø thay theá trong chuoãi
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 91 -
Vaán ñeà vaø thay theá trong chuoãi raát hay gaëp. Phoái hôïp Pos,Delete vaø
Insert ta seõ giaûi quyeát ñöôïc vaán ñeà naøy.
program TimvaThaythe;
var
ChuoiBu : string[255];
ChuoiTim. ChuoiThay : string[20];
i :integer;
begin
ChuoiTim := ‘An’;
ChuoiThay := ‘Binh’;
ChuoiBu := ‘Haõy baûo An traû cho toâi cuoán saùch.’;
writeln(ChuoiBu);
i := Pos(chuoiTim.ChuoiBu);
Delete(ChuoiBu,i, Length(ChuoiTim));
Insert(ChuoiThay,ChuoiBu,i);
writeln(ChuoiBu);
end.
VII-5 SÖÛA LOÃI VAØ CHOÁNG LOÃI:
Moät loãi hay gaëp khi duøng maûng laø laàm laãn giöõa teân kieåu döõ lieäu vaø teân
bieán. Ví duï khi coù
type Matran = array[1..10,1..10] of real;
vaøi ngöôøi laäp trình coù xu höôùng vieát Matran[5,5] := 1; thay vì duøng moät
teân bieán kieåu Matran. Neân nhôù quy taéc
Teân kieåu döõ lieäu khoâng bao giôø xuaát hieän ôû phaàn leänh
Nhieàu loãi raát hay gaëp trong khi xöû lí maûng. Moät vaán ñeà coå ñieån laø tìm
kieám moät trò coù theå khoâng coù trong maûng. Ví duï, giaû söû ta khai baùo
TheArray : array[1..20] of integer;
Ñoaïn chöông trình sau muoán tìm phaàn töû baèng 0 trong maûng.
Dem := 1;
while (TheArray[Dem] <>0) do Dem := Dem+1;
writeln(‘Phaàn töû thöù ‘,Dem:1, ‘ baèng 0’);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 92 -
Ñoaïn maõ naøy chaïy toát neáu 0 coù maët trong TheArray. Tuy nhieân neáu
khoâng coù phaàn töû naøo baèng 0, chuùng ta seõ gaëp loãi
Run-time error 201: Range check error
cho thaáy chæ soá vöôït quaù taàm cuûa maûng. Ngöôøi ta thöû söûa baèng ñoaïn
sau
Dem := 1;
while (Dem <20) and (TheArray[Dem] <> 0) do Dem :=
Dem+1;
writeln(‘Phaàn töû thöù ‘,Dem:1, ‘ baèng 0’);
Giaû söû TheArray khoâng chöùa giaù trò 0 hay phaàn töû thöù 20 baèng 0. Trong
caûû hai tröôøng hôïp, ñoaïn treân vaãn baùo
Phaàn töû thöù 20 baèng 0
Ta chæ söûa trieät ñeå baèng caùch theâm vaøo moät kieåm tra nöõa ñeå chaéc chaén
laø tìm ñuùng phaàn töû baèng 0.
Dem := 1;
while ((Dem <20) and TheArray[Dem] <>0) do Dem := Dem+1;
if TheArray[Dem] = 0 then
writeln(‘Phaàn töû thöù ‘,Dem:1, ‘ baèng 0’)
else
writeln(‘Khoâng coù phaàn töû naøo baèng 0’);
***
Caùc maûng hai hay nhieàu chieàu thöôøng laøm roái trí. Loãi thoâng thöôøng laø
duøng quaù nhieàu voøng laëp. Ví duï ta muoán in ra caùc phaàn töû treân ñöôøng
cheùo chính cuûa moät ma traän vuoâng n*n. Moät giaûi phaùp tröïc giaùc, nhöng
sai laø
for i :=1 to n do
for j := 1 to n do
writeln(a[i,j]);
Chöông trình seõ in ra moïi phaàn töû cuûa ma traän. Lôøi giaûi ñuùng chæ caàn
moät voøng laëp
for i := 1 to n do writeln(a[i,i]);
Baïn ñoïc thöû nghó caùch ñeå in ra ñöôøng cheùo chính kia cuûa ma traän.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 93 -
Töø khoaù Pascal môùi
array
of
[..] string
Khaùi nieäm môùi
maûng
phaàn töû
chieàu
chæ soá
kích thöôùc maûng
quicksort saép xeáp noåi boït tìm kieám tuaàn töï tìm kieám nhò phaân
chuoãi
cheùp chuoãi
cheøn vaøo chuoãi thay theá trong chuoãi
xoaù chuoãi
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 94 -
BAØI TAÄP CHÖÔNG VII
1. Vieát chöông trình tính tích voâ höôùng cuûa 2 vector trong khoâng
gian 3 chieàu.
2. Vieát chöông trình tính tích coù höôùng cuûa 2 vector trong khoâng
gian 3 chieàu.
3. Neáu moät vaät bò löïc F keùo ñi vôùi vaän toác v , thì coâng suaát do löïc
sinh ra treân vaät laø
P
=
F.v
Duøng chöông trình tính tích voâ höôùng ôû baøi taäp 1 ñeå tính coâng suaát
taïo ra bôûi löïc F= 4i+3j-2k treân vaät di chuyeån vôùi vaän toác v = 4i-
2j+1k.
Chuù yù: Kyù hieäu in ñaäm laø vector, i,j,k laø caùc vector ñôn vò.
4. Vaän toác daøi lieân heä vôùi vaän toáâc goùc theo bieåu thöùc:
v= r x ω
trong ñoù r laø baùn kính vector, ω laø vaän toác goùc. Neáu khoaûng caùch töø
taâm traùi ñaát ñeán moät veä tinh laø r = 300000i+400000j+50000k vaø vaän
toác goùc cuûa veä tinh laø
ω =
-6.10
-3
i + 2.10
-3
j – 9.10
-4
k, vaän toác daøi cuûa veä tinh laø bao
nhieâu? Duøng chöông trình ôû baøi taäp 3 ñeå tính.
5. Nhieät ñoä trung bình haøng naêm quan saùt ñöôïc taïi 36 toaï ñoä treân traùi
ñaát ñöôïc cho trong baûng sau.
Vieát chöông trình tính nhieät ñoä trung bình doïc theo moãi kinh ñoä vaø
vó ñoä, roài tính nhieät ñoä trung bình treân moïi ñieåm.
90,0
0
kinh
Ñoâng
90,5
0
kinh
Ñoâng
91,0
0
kinh
Ñoâng
91,5
0
kinh
Ñoâng
92,0
0
kinh
Ñoâng
92,5
0
kinh
Ñoâng
30,0
0
vó
Baéc
18,2 22,1 22,5 24,1 24,4 24,2
30,5
0
vó
Baéc
19,4 21,1 21,9 23,1 23,6 23,7
31,0
0
vó
Baéc
18,9 20,5 20,9 21,5 22,8 23,0
31,5
0
vó
Baéc
18,6 19,9 20,4 20,8 21,5 22,2
32,0
0
vó
Baéc
18,1 19,3 19,8 20,2 20,9 21,2
32,5
0
vó
Baéc
18,3 18,8 19,6 20,0 20,5 20,9
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 95 -
6. Vieát chöông trình nhaân hai ma traän.
7. Ngöôøi ta muoán tính nhieät ñoä cuûa moät taám kim loïai moûng hình
vuoâng coù nhieät ñoä 4 caïnh ñöôïc giöõ coá ñòïnh. Ñeå moâ phoûng taám kim
loïai, ta coù theå söû duïng maûng hai chieàu, moãi phaàn töû laø nhieät ñoä taïi
moät ñieåm cuûa taám. Vieát chöông trình nhaäp vaøo nhieät ñoä cuûa 4 caïnh,
duøng caùc nhieät ñoä naøy ñeå khôûi taïo caùc haøng vaø coät ngoaøi cuøng cuûa
maûng. Sau ñoù xaùc ñònh nhieät ñoä caân baèng taïi moãi ñieåm baèng caùch
tính giaù trò trung bình ôû 4 ñieåm laân caän beân treân, beân traùi, beân phaûi
vaø phía döôùi. Laëp laïi thuû tuïc naøy, hieån thò maûng trong moãi böôùc laëp
vaø keát thuùc laëp khi giaù trò nhieät ñoä môùi taïi moãi ñieåm sai khaùc giaù trò
cuõ moät löôïng beù hôn moät löôïng voâ cuøng beù cho tröôùc.
8. Vieát chöông trình giaûi heä phöông trình tuyeán tính baèng phöông
phaùp khöû Gauss.
9.Vieát chöông trình ñeå khôùp bình phöông toái thieåu tuyeán tính. Döõ
lieäu nhaäp seõ ñöôïc truyeàn cho chöông trình con theo hai maûng X vaø
Y.
10. Troø chôi Life, phaùt minh bôûi nhaø toaùn hoïc John H.Conway, moâ
phoûng cuoäc soáng cuûa moât quaàn theå. Haõy xeùt moät maûng hình chöõ nhaät
goàm caùc oâ con, moãi oâ coù theå chöùa moät caù theå. Neáu maûng ñöôïc xem
laø voâ haïn caû hai chieàu, thì moãi oâ coù 8 oâ laùng gieàng, Trong moãi theá
heä, söï sinh vaø söï cheát dieãn ra theo quy luaät sau ñaây:
a. Moät caù theå sinh ra trong oâ troáng coù ñuùng 3 caù theå laùng gieàng.
b. Moät caù theå cheát vì coâ ñôn neáu noù coù ít hôn hai caù theå laùng gieàng.
c. Moät caù theå cheát vì quaù ñoâng neáu coù nhieàu hôn ba caù theå laùng
gieàng.
d. Taát caû caùc caù theå khaùc soáng soùt.
Vieát chöông trình troø chôi Life vaø nghieân cöùu caùc maãu caáu hình ban
ñaàu khaùc nhau.
10. Vieát chöông trình thöïc hieän vieäc tìm vaø thay theá nhieàu laàn trong
chuoãi.
11. Vieát chöông trình ñoïc soá thaønh chöõ.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 96 -
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 97 -
CHÖÔNG VIII KIEÅU RECORD
Record laø moät kieåu döõ lieäu thöôøng duøng ñeå quaûn trò döõ lieäu. Ngaøy nay,
record thöôøng ñöôïc quaûn lyù baèng caùc heä cô sôû döõ lieäu chuyeân bieät.
Chöông naøy chæ nhaèm neâu sô löôïc khaû naêng laøm vieäc vôùi record cuûa
Pascal.
VIII-1 RECORD COÙ CAÁU TRUÙC COÁ ÑÒNH:
Kieåu record (baûn ghi hay maåu tin) laø moät kieåu döõ lieäu nhieàu thaønh
phaàn, caùc thaønh phaàn coù theå coù kieåu döõ lieäu khaùc nhau. Moãi thaønh phaàn
ñöôïc goïi laø moät tröôøng (field). Cuù phaùp ñònh nghóa kieåu record coù daïng
type T = record
tr1
:
T1;
tr2
:
T2;
…
trn
:Tn;
end;
trong ñoù T1, T2,.. ,Tn laø kieåu döõ lieäu cuûa caùc tröôøng tr1, tr2,.. trn. Ví duï:
type Sophuc = record
PT:real;
PA:real;
end;
type Date = record
ngay
:
1..31;
thang
:1..12;
nam : integer;
end;
type Diachi = record
Sonha
:
string[6];
Duong
:
string[30];
Thanhpho:
string[30];
end;
type sinhvien= record
maso
:
string[10];
ho:
string[20];
ten: string[10];
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 98 -
ngaysinh :Date;
Cho_o
:Diachi;
end;
Ví duï veå kieåu sinhvien cho thaáy caùc kieåu record coù theå loàng nhau.
Khi ñaõ ñònh nghóa kieåu record, ta coù theå khai baùo caùc bieán thuoäc kieåu
naøy
Ví duï:
var ngay1, ngay2:Date;
dc1,dc2:
Diachi;
svx,svy : sinhvien
SVVL : array[1..200] of sinhvien;
Thao taùc vôùi record
Ñeå truy caäp vaøo moät tröôøng ta duøng cuù phaùp:
teân_bieánrecord.tröôøng
Caùc thao taùc treân tröôøng naøy seõ phuï thuoäc kieåu döõ lieäu cuûa tröôøng.
Ví duï:
Ngay1.ngay :=20;
Ngay1. thang := 10;
Ngay1.nam := 1984;
svx.ten := ‘Tam’;
svx.ngaysinh := Ngay1;
Chuù yù laø caâu leänh cuoái cuøng töông ñöông vôùi ba leänh sau:
svx.ngaysinh.ngay := 20;
svx.ngaysinh.thang := 10;
svx.ngaysinh.nam := 1984;
Ñeå yù caùch duøng cuù phaùp daáu chaám lieân tieáp khi coù record loàng nhau.
Coù theå gaùn tröïc tieáp hai bieán record cuøng kieåu (töùc laø gaùn ñoàng thôøi taát
caû caùc tröôøng). Ví duï
svx
:=
svy;
Hai pheùp toaùn so saùnh coù theå duøng ñöôïc treân cuøng kieåu record laø = vaø
<>.
Ví du:
if svx = svy then writeln (‘Cuøng moät sinh vieân’);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 99 -
Khoâng theå nhaäp xuaát tröïc tieáp record baèng read vaø write, cuõng nhö
khoâng thöïc hieän ñöôïc caùc pheùp tính thoâng thöôøng.
Ñeå khoûi laëp laïi nhieàu laàn teân bieán kieåu record ta coù theå duøng caâu leänh
with … do. Ví duï ñeå nhaäp döõ lieäu cho SVVL, ta coù theå vieát
for i:= 1 to 200 do
with SVVL[i] do
begin
write(‘Nhaäp maõ soá: ); readln(maso);
write(‘Nhaäp hoï ñeäm: ); readln(ho);
write(‘Nhaäp teân: ); readln(ten);
with ngaysinh do
begin
write(‘Nhaäp
ngaøy
sinh(1..31)’);
readln(ngay);
write(‘Nhaäp
thaùng
sinh(1..12)’);
readln(thang);
write(‘Nhaäp
naêm
sinh’);
readln(nam);
end;
with Cho_o do
begin
write(‘Nhaäp soá nhaø :’); readln(Sonha);
write(‘Nhaäp
teân
ñöôøng:’);
readln(Duong);
write(‘Nhaäp
thaønh
phoá:’);
readln(Thanhpho);
end;
end;
Ví duï treân cuõng cho thaáy caùc leänh with .. do coù theå loàng nhau.
VIII-2 RECORD COÙ CAÁU TRUÙC THAY ÑOÅI:
Pascal cho pheùp taïo caùc record coù moät phaàn thay ñoåi. Ví duï ñeå quaûn lyù
ñieåm cuûa sinh vieân caùc khoa khaùc nhau, ta coù theå ñònh nghóa caùc kieåu
sau:
type Khoa = (Toan, Ly, Hoa);
Diem = 0..10;
DiemSV
=
record
Hoten
:
string[30];
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 100 -
maso:string[10];
case sv_khoa of
Toan:
(Hinhhoc,
Daiso,
Giaitich);
Ly
:
(Co,
Nhiet,Dien);
Hoa:(HoaDaicuong,
HoaVoco,
HoaHuuCo);
end;
Record coù caáu truùc thay ñoåi coù caùc ñaëc ñieåm sau:
•
record coù caáu truùc thay ñoåi thöôøng coù hai phaàn: phaàn coá ñònh vaø
phaàn thay ñoåi. Phaàn coá ñònh luoân luoân ñaët tröôùc.
•
Phaàn thay ñoåi bao goàm moät tröôøng goïi laø tröôøng ñaùnh daáu (tag field)
ñöôïc ñaët trong caâu leänh case. ÖÙng vôùi moäi giaù trò cuûa tröôøng ñaùnh
daáu, ta coù caùc bieán theå cuûa record vôùi danh saùch caùc tröôøng töông
öùng ñaëït sau caùc trò cuûa leänh case vaø toaøn boä danh saùch naøy ñöôïc ñaët
trong ngoaëc ñôn. Ngay caû khi danh saùch caùc tröônøg naøy roãng, vaãn
phaûi coù caëp ngoaëc ñôn ().
•
Tröôøng ñaùnh daáu laø moät kieåu ñôn giaûn vaø vaãn laø moät tröôøng bình
thöôøng cuûa record
•
caâu leäch case ôû ñaây khoâng keát thuùc baèng end
•
Taát caû caùc teân bieán trong phaàn thay ñoåi phaûi khaùc nhau.
Record coù caáu truùc thay ñoåi ñöôïc ñaët ra ñeå thoaû maõn yeâu caàu tieát kieäm
boä nhôù, nhöng cuõng laøm cho vieäc laäp trình khaù phöùc taïp. Vôùi söï phaùt
trieån cuûa phaàn cöùng hieän nay yeâu caàu tieát kieäm boä nhôù haàu nhö khoâng
coøn yù nghóa nöõa. Do ñoù hieän nay haàu heát caùc heä quaûn trò döõ lieäu ñeàu
duøng record coù caáu truùc coá ñònh.
Döõ lieäu kieåu record coù quan heä chaët cheõ vôùi kieåu file nhö coù theå thaáy ôû
chöông sau.
Töø khoaù Pascal môùi
record
end
with
do case of
Khaùi nieäm môùi
kieåu record
tröôøng
record coù caáu truùc thay ñoåi
tröôøng ñaùnh daáu
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 101 -
BAØI TAÄP CHÖÔNG VIII
1.Vieát chöông trình thöïc hieän caùc pheùp toaùn treân soá phöùc.
2.Vieát chöông trình thöïc hieän caùc pheùp toaùn treân kieåu thôøi gian tính
baèng giôø, phuùt , giaây.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 102 -
CHÖÔNG IX KIEÅU FILE
Caùc phaàn meàm thöïc söï thöôøng phaûi ñoïc döõ lieäu töø ñóa hoaëïc löu keát quaû
ra ñóa. Döõ lieäu kieåu file (taäp tin, teäp) cuûa Pascal cho pheùp laøm ñieàu naøy.
Pascal hoã trôï 3 kieåu file: vaên baûn, ñònh kieåu vaø khoâng ñònh kieåu. Trong
giaùo trình naøy ta chæ khaûo saùt file vaên baûn vaø file ñònh kieåu.
IX-1. FILE VAÊN BAÛN
File vaên baûn bao goàm caùc doøng keát thuùc bôûi daáu xuoáng haøng vaø daáu
ñaàu doøng(maõ ASCII 10 vaø 13). File vaên baûn laø loaïi file raát thoâng duïng.
Trong Pascal file vaên baûn ñöôïc khai baùo nhö sau:
var txtFile : Text;
Moät bieán kieåu Text phaûi ñöôïc gaùn vôùi moät file treân ñóa baèng leänh
assign tröôùc khi laøm vieäc. Ví duï
assign(txtFile,’vb.txt’);
Sau khi coù leänh assign, moïi theo taùc treân file seõ thöïc hieän treân bieán
txtFile. Caùc thao taùc chính treân file laø môû, ñoïc töø file hay vieát vaøo file
vaø ñoùng file.
Coù ba caùch môû teäp laø reset, rewrite vaø append.
Reset laø môû file ñeå ñoïc. Neáu file naøy chöa coù treân ñóa maùy seõ baùo loãi.
Reset cuõng ñaëït con troû teäp vaøo ñaàu taäp tin.
Rewrite vaø append ñeàu môû file ñeå vieát. Neáu duøng rewrite vôùi moät teäp
ñaõ coù teäp naøy seõ bò xoaù vaø con troø teäp chuyeån veà ñaàu file. Traùi laïi, leänh
append cho pheùp vieát theâm vaøo file coù saün baèng caùch ñaët con troû teäp
vaøo cuoái file. Neáu duøng append vôùi moät file chöa coù, maùy seõ baoù loãi.
Leänh close ñoùng moät file ñang môû. Tuy nhieân, moái quan heä giöõa bíeán
file vaø file treân ñóa thieát laäp bôûi assign vaãn toàn taïi.
Ñeå ñoåi teân Pascal duøng thuû tuïc rename
assign(f, ‘FILE.OLD’);
rename(f,FILE.NEW);
Ñeå xoaù duøng thuû tuïc erase
assign(f, ‘FILE.OLD’);
erase(f)
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 103 -
Ñoïc file vaên baûn
Chöông trình sau minh hoaï voøng laëp caên baûn ñeå ñoïc file vaên baûn.
program Text1;
var txtf :text;
s:
string[80];
begin
assign(txtf,’vb.txt’);
reset(txtf);
while not eof(txtf) do
begin
readln(txtf,s);
writeln(s);
end;
close(txtf)
end.
Haøm eof seõ traû veà true khi heát file. Do ñoù voøng laëp treân cho pheùp ñoïc
cho ñeán khi heát file.
Chuù yù caùch duøng readln(txtf,s). Khi coù ñoái ñaàu tieân laø bieán kieåu file,
leänh read seõ ñoïc töø file maø khoâng ñoïc töø baøn phím.
Ñoïc döõ lieäu soá töø file vaên baûn
Vì caùc trình soaïn thaûo vaên baûn raát thuaän tieän, do ñoù moät caùch toát ñeå
nhaäp döõ lieäu soá laø nhaäp töø file vaên baûn, khi ñoù caùc soá lieäu naøy coù theå
kieåm tra, söûa ñoåi deã daøng. Ví duï ta coù baûng soá sau trong file
TEST.DAT
11
27.53
6.414900000E+02
21
50.83
1.184390000E+03
31
74.13
1.728290000E+03
41
97.43
2.278000000E+03
51
120.73
2.810000000E+03
61
144.03
3.359900000E+03
71
167.33
4.494167900E+03
81
190.63
4.987000000E+03
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 104 -
91
213.93
5.520000000E+03
Coät ñaàu tieân laø soá nguyeân, hai coät sau laø soá thöïc. Ta coù theå vieát chöông
trình ñoïc soá lieäu töø file TEST.DAT ñeå tính trung bình caùc coät naøy.
program Tinhtrungbinh; {Döõ lieäu ñoïc töø file}
var f:text;
i, dem :integer;
itb,r1,r2,r1tb,r2tb : real;
begin
assign(f,’TEST.DAT’);
reset(f);
dem := 0;
itb := 0;
r1tb
:=0;
r2tb := 0;
while not eof(f) do
begin
readln(f,i,r1,r2);
writeln(i:10,
r1:10:3,r2:10:3);
dem := dem + 1;
itb := itb + i;
r1tb := r1tb + r1;
r2tb := r2tb +r2;
end;
close(f);
itb := itb/dem;
r1tb := r1tb / dem;
r2tb := r2tb / dem;
writeln;
writeln(‘itb = ‘,itb:10:3, ‘r1tb = ‘,itb:10:3, ‘r2tb =’,r2tb:10:3);
end.
Vieát vaøo file vaên baûn
Chöông trình sau cheùp noäi dung vaên baûn töø file naøy sang file khaùc
program Chepfilevb;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 105 -
var f1,f2 :text;
s:
string[80];
begin
assign(f1,’vb.txt’);
reset(f1);
assign(f2, ‘vbmoi.txt’);
rewrite(f2);
while not eof(f1) do
begin
readln(f1,s);
writeln(f2,s);
end;
close(f1);
close(f2);
end.
Chuù yù caâu leänh writeln(f2,s). Khi ñoái ñaàu tieân cuûa write laø bieán file, thì
leänh naøy seõ vieát ra file thay vì vieát ra maøn hình.
IX-2 FILE ÑÒNH KIEÅU:
File ñònh kieåu laø file coù döõ lieäu thuoäc moät kieåu xaùc ñònh, nhö integer,
real, hay record. File ñònh kieåu cho pheùp truy xuaát nhanh choùng hôn
file vaên baûn.
Bôûi vì vôùi file ñònh kieåu khoâng coù khaùi nieäm doøng, neân khoâng ñöôïc
duøng readln hoaëc writeln. Ñeå ñoïc hay vieát ta chæ duøng read vaø write.
Chöông trình sau taïo ra moät file soá thöïc roài sau ñoù ñoïc laïi döõ lieäu töø file
naøy.
program RealFile;
var r: real;
f: file of real;
begin
assign(f,’REAL.DAT’);
rewrite(f);
r := 100.234;
write(f,r);
r := 132.234;
write(f,r);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 106 -
r := 9890.24;
write(f,r);
close(f);
reset(f);
while not eof(f) do
begin
read(f,r);
writeln(r:10:3);
end;
close(f);
end.
Chöông trình sau minh hoaï caùch duøng file ñònh kieåu record.
program RecordFile;
type Khach_hang = record
Ten
:
string[30];
Diachi
:
string[40];
Dienthoai:
string[15];
end;
var kh : Khach_hang;
fkh
: file of Khach_hang;
procedure Taofile;
var i: integer;
begin
assign(fkh,
‘KHACHHANG.DAT’);
rewrite(fkh);
with kh do
begin
Ten := ‘ Nguyen Van An’;
Diachi := ‘ 5 Phan Dinh Phung ‘;
Dienthoai
:=
‘063-826786’;
end;
write(fkh,kh);
with kh do
begin
Ten := ‘ Nguyen Van Phuc’;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 107 -
Diachi := ‘ 53 Nguyen Van Troi‘;
Dienthoai
:=
‘063-837456’;
end;
write(fkh,kh);
with kh do
begin
Ten := ‘ Tran Van Binh’;
Diachi := ‘ 25 Tran Phu ‘;
Dienthoai
:=
‘063-836286’;
end;
write(fkh,kh);
close(fkh);
end;
begin
Taofile;
Assign(fkh,
‘KHACHHANG.DAT’);
reset(fkh);
while not eof(fkh) do
begin
read(fkh,kh);
with kh do
begin
writeln(Ten);
writeln(Diachi);
writeln(Dienthoai);
end;
end;
close(fkh);
end.
IX-3 TRUY CAÄP NGAÃU NHIEÂN TREÂN FILE ÑÒNH KIEÅU
File vaên baûn, do baûn chaát cuûa noù, laø file truy caäp tuaàn töï. File ñònh kieåu
cuõng ñöôïc truy caäp tuaàn töï, nhö ta thaáy ôû treân. Ngoaøi ra, file ñònh kieåu
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 108 -
coøn cho pheùp truy caäp ngaãu nhieân. Ñieàu naøy ñöôïc thöïc hieän nhôø caùc
haøm vaø
thuû tuïc sau:
Thuû tuïc Seek(var f:file;p:integer) cho pheùp di chuyeån con troû teäp ñeán
record thöù p. Chuù yù laø record ñaàu tieân ñöôïc ñaùnh soá laø 0.
Haøm FilePos(f:file) :integer; traû veà soá thöù töï cuûa record trong file.
Haøm FileSize(F:File);integer; traû veà toång soá record trong file.
Chöông trình sau minh hoaï moät cô sôû döõ lieäu ñôn giaûn
program DatabaseFile;
type MaxStr = string[30];
Khach_hang
=
record
Ten
:
MaxStr;
Tuoi:
integer;
ThuNhap
:real;
end;
var kh : Khach_hang
;
fkh : File of Khach_hang;
procedure AddRec(Tennh: MaxStr; Tuoinh: integer; Thunhapnh:
real);
begin
with kh do
begin
Ten
:=
Tennh;
Tuoi
:=
Tuoinh;
ThuNhap
:=
ThuNhapnh;
write(fkh,kh);
end;
end;
procedure WriteRec;
begin
writeln;
with kh do
begin
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 109 -
writeln(‘Teân : ‘, Ten);
writeln(‘Tuoåi: ‘, Tuoi);
writeln(‘Thu
nhaäp:’,
ThuNhap:10:2);
end;
end;
begin
assign(fkh,’KHACHHANG.DAT’);
rewrite(fkh);
AddRec(‘ An’, 30, 500000);
AddRec(‘ Bình’, 60, 1500000);
AddRec(‘ Phuù’, 45, 2500000);
reset(fkh)
writeln(‘ Toång soá record trong file laø ‘, FileSize(fkh));
writeln;
(*In ra noäi dung cuûa record thöù ba *)
(* Bôûi vì soá thöù töï cuûa record ñaàu laø 0, record thöù ba coù
thöù töï laø 2 *)
seek(fkh,2);
writeln( Ñaây laø record thöù ‘, FilePos(fkh)+1);
read(fkh,kh);
WriteRec;
(*thay ñoåi noäi dung cuûa record thöù nhaát *)
seek(fkh,0);
AddRec( ‘Van’, 20, 879060)õ;
seek(fkh,0)
writeln( Ñaây laø record thöù ‘, FilePos(fkh)+1);
WriteRec;
writeln (‘Nhaán Enter ..);
readln;
close(fkh);
end.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 110 -
IX-4 TROÄN FILE
Troän file laø quaù trình phoái hôïp 2 file ñaõ coù thöù töï thaønh moät file coù thöù
töï. Coù theå noái 2 file laïi roài sau ñoù xeáp thöù töï, nhöng quaù trình ñoù seõ laâu
hôn nhieàu so vôùi troän tröïc tieáp.
Tieán trình troän laø nhö sau: ñoïc töø moãi file moät record ñaàu tieân, sau ñoù
chöông trình baét ñaàu vaøo voøng laëp. Beân trong voøng laëp chöông trình so
saùnh 2 record vaø vieáât record coù trò nhoû hôn vaøo file môùi. Moät record
khaùc ñöôïc ñoïc tieáp töø file. Quaù trình ñöôïc tieáp tuïc cho ñeán khi caû 2 file
ñeàu heát döõ lieäu.
Ñeå ñôn giaûn, chöông trình sau ñaây ñöôïc vieát ñeå troän 2 file vaên baûn,
nhöng vieäc aùp duïng cho file ñònh kieåu cuõng hoaøn toaøn töông töï. Giaû söû
ta coù
File1
File2
1
2
4
3
5
7
9
Chöông trình sau seõ troän 2 file naøy thaønh file môí theo thöù töï. Chuù yù laø
trong haøm DocDulieu, bieán kieåu file phaûi khai baùo laø tham bieán.
program TronFile;
type str80 = String[80];
var File1, File2, File3 : str80;
procedure Tron(Fname1,Fname2,Fname3 : str80);
var ok1,ok2 : boolean;
f1,f2,f3 :text;
i1,i2 : integer;
function DocDulieu(var f:text;var i :integer) :boolean;
begin
if not eof(f) then
begin
readln(f,i);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 111 -
DocDulieu
:=
true;
end
else
DocDulieu
:=
false;
end; {DocDulieu}
begin {Tron}
assign(f1,Fname1);
reset(f1);
assign(f2,Fname2);
reset(f2);
assign(f3,Fname3);
rewrite(f3);
ok1 := DocDulieu(f1,i1);
ok2 := DocDulieu(f2,i2);
while ok1 or ok2 do
begin
if ok1 and ok2 then { du lieu con o ca 2 file}
begin
if i1<i2 then
begin
writeln(f3,i1);
ok1
:=
DocDulieu(f1,i1);
end
else
begin
writeln(f3,i2);
ok2
:=
DocDulieu(f2,i2);
end
end
else if ok1 then { du lieu chi con o file1}
begin
writeln(f3,i1);
ok1
:=
DocDulieu(f1,i1);
end
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 112 -
else if ok2 then { du lieu chi con o file2}
begin
writeln(f3,i2);
ok2
:=
DocDulieu(f2,i2);
end
end; {while}
close(f1);
close(f2);
close(f3);
end; {Tron}
(*****************************)
begin{chöông trình chính}
write(‘Nhaäp vaøo teân file1’);
readln(File1);
write(‘Nhaäp vaøo teân file2’);
readln(File2);
write(‘Nhaäp vaøo teân file3’);
readln(File3);
Tron(File1,File2,File3);
end.
IX-5 CHOÁNG LOÃI VAØ SÖÛA LOÃI:
Boán loãi cô baûn khi laøm vieäc vôùi kieåu file laø
1. Thöïc hieän thao taùc treân file khi chöa coù assign.
2. Ñoïc töø file chöa reset.
3. Vieát vaøo file chöa rewrite.
4. Ñoïc döõ lieäu khi ñaõ heát file.
Ngoaøi ra caàn chuù yù laø khi bieán file trong danh saùch tham soá phaûi luoân
luoân khai baùo laø tham bieán.
Töø khoaù Pascal môùi
file of
assign rewrite reset
text
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 113 -
Khaùi nieäm môùi
file vaên baûn
file ñònh kieåu
ñoïc töø file con troû teäp
vieát vaøo file
truy caäp tuaàn tö ï truy caäp ngaãu nhieân
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 114 -
BAØI TAÄP CHÖÔNG IX
1. Moät phaàn töû trong moät ma traän ñöôïc goïi laø cöïc ñaïi ñiaï phöông
neáu noù lôùn hôn 8 phaàn töû laân caän. Ví duï trong ma traän sau phaàn töû
(2,2) laø cöïc ñaïi ñòa phöông.
⎥
⎥
⎥
⎦
⎤
⎢
⎢
⎢
⎣
⎡
−
−
−
5
3
2
3
14
7
2
7
1
Vieát chöông trình ñoïc moät ma traän töø moät taäp tin treân
ñóa vaø tìm moïi cöïc ñaïi ñòa phöông trong ma traän ñoù. Doøng ñaàu cuûa
taäp tin laø soá haøng vaø soá coät, caùc doøng tieáp theo laø giaù trò cuûa ma traän.
2.Vieát chöông trình thöïc hieän vieäc tìm vaø thay theá trong moät taäp tin
vaên baûn.
3. Vieát chöông trình thöïc hieän pheùp nhaân vaø coäng hai ma traän vôùi
döõ lieäu ñöôïc ñoïc töø moät taäp tin vaø keát quaû ñöôïc vieát vaøo moät taäp
tin khaùc.
4. Vieát chöông trình ñoïc moät danh saùch sinh vieân töø moät file vaên baûn
roài löu tröõõ vaøo moät file ñònh kieåu record. (Xem laïi caùch söû duïng
record ôû chöông truôùc.)
5. Vieát chöông trình troän danh saùch sinh vieân cuûa 2 lôùp.
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 115 -
CHÖÔNG X
KIEÅU TAÄP HÔÏP (SET)
X-1 KIEÅU TAÄP HÔÏP:
Kieåu taäp hôïp duøng ñeå taïo caùc bieán coù theå bieåu dieãn nhieàu hôn moät giaù
trò cuûa moät kieåu thöù töï ñaõ cho. Cuù phaùp ñeå ñònh nghóa kieåu taäp hôïp laø
type teân = set of kieåu_cô_baûn;
Ví duï
type CharcterSet = set of char;
Vitamins = (A,B1,B2,B3,B6,B12,C,D,E);
Sinhto
=
set of Vitamins;
Soá phaàn töû lôùn nhaát cuûa moät taäp hôïp trong Turbo Pascal laø 255.
Moät khi ñaõ ñònh nghóa kieåu taäp hôïp, ta coù theå khai baùo caùc bieán
Ví duï:
var InputCharacters, OutputCharacters, ExtraCharacters :
CharacterSet;
SinhtoRau, SinhtoTraicay,SinhtoKhoang, SinhtoTH, SinhtoTuoi:
Sinhto;
Trong bieåu thöùc taäp hôïp, caùc phaàn töû cuûa moät taäp hôïp phaûi ñaët trong
ngoaëc vuoâng. Traùi laïi teân bieán taäp hôïp khoâng caàn ñaët trong ngoaëc vuoâng
Ví duï:
OutputCharacters := [‘a’..’z’, ‘A’..’Z’, ‘0’..9’];
SinhtoTraicay := [A..B3, B12,C,E];
InputCharacter := OutputCharacters;
SinhtoKhoang := [];
Leänh gaùn cuoái cuøng taïo moät taäp hôïp roãng.
Caùc pheùp toaùn treân taäp hôïp
Pheùp hôïp kyù hieäu baèng daáu +. Hôïp cuûa hai taäp hôïp laø moät taäp hôïp chöùa
taát caû caùc phaàn töû ôûø caû 2 taäp hôïp.
Ví duï: SinhtoTh := SinhtoRau+SinhToTraicay
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 116 -
Pheùp hieäu kyù hieäu baèng daáu -. Hieäu cuûa hai taäp hôïp laø moät taäp hôïp
chöùa caùc phaàn töû coù maët trong taäp thöù nhaát maø khoâng coù maët trong taäp
thöù hai.
Ví duï: ExtraCharacter := OutputCharacters –InputCharacters
Pheùp giao kyù hieäu baèng daáu *. Giao cuûa hai taäp hôïp laø moät taäp hôïp
goàm caùc phaàn töû coù maët ôû caû 2 taäp hôïp.
Ví du: SinhtoTuoi := SinhtoRau*SinhtoTraicay;
Caùc pheùp toaùn boolean
=
<>
>= ( A chöùa B)
<= (A chöùa trong B)
in (a thuoäc veà A)
Chuù yù laø khoâng coù pheùp toaùn > vaø <
X-2 LAÄP TRÌNH VÔÙI KIEÅU TAÄP HÔÏP:
Kieåu taäp hôïp cho pheùp trong moät soá tröôøng hôïp, giaûi quyeát nhöõng yeâu
caàu thöïc teá raát thuaän tieän vaø ñôn giaûn.
Ví duï1: Ñoïc vaøo moät chuoãi kyù töï vaø in ra nhöõng nguyeân aâm vaø phuï aâm
khoâng coù trong chuoãi ñoù.
program Nguyen_Phuam;
type kytu = ‘A’..’Z’;
var i: integer;
chuoi : string;
ch : char;
n_am, P-am, n1,n2 : set of kytu;
begin
n_am := [];
p_am := [];
n2 := [];
n1 := [‘A’,’E’,’I’,’O’,’U’];
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 117 -
for ch := ‘A to ‘Z’ do n2 := n2 +[ch];
n2 := n2 – n1;
write(‘Ñoïc vaøo moät chuoãi: ‘);
readln(chuoi);
i:=1;
while i<= length(chuoi) do
begin
if upcase(chuoi[i]) in n1 then
n_am
:=
n_am
+
[UpCase(chuoi[i])];
else
p_am := p_am +[UpCase(chuoi[i])];
i
:=
i+1
end;
n_am := n1 - n_am;
p_am := n2 - p_am;
write(‘ Nhöõng nguyeân aâm khoâng söû duïng:’);
for ch:= ‘A’ to ‘U’ do
if ch in n_am then write(ch);
writeln;
write(‘ Nhöõng phuï aâm khoâng söû duïng:’);
for ch:= ‘B’ to ‘Z’ do
if ch in p_am then write(ch);
writeln;
end.
Ví duï 2: Treân 3 doøng soá lieäu nhaäp coù chöùa moãi doøng 20 soá nguyeân coù
giaù trò giôùi haïn töø 1 ñeán 100. Haõy in ra nhöõng trò naøo coù caû treân 3 doøng;
nhöõng trò naøo coù treân doøng 1 maø khoâng coù treân doøng coøn laïi (in theo
thöù töï taêng vaø khoâng in truøng trò).
program Inso;
type kn100 = 1..100;
var i, n : integer;
n1,n2,n3,n4
:
set of kn100;
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 118 -
begin
n := [];
n2 := []
n3 := [];
writeln(‘Ñoïc vaøo soá lieäu cuûa doøng 1: ‘);
for i := 1 to 20 do
begin
readln(n);
n1 := n1 + [n]
end;
writeln([Ñoïc vaøo soá lieäu cuûa doøng 2: ‘);
for i := 1 to 20 do
begin
readln(n);
n2 := n2 + [n]
end;
writeln([Ñoïc vaøo soá lieäu cuûa doøng 3: ‘);
for i := 1 to 20 do
begin
readln(n);
n3 := n3 + [n]
end;
n4 := n1*n2*n3;
writeln (‘ Nhöõng trò coù treân caû ba doøng: ‘);
n:= 0;
for i:=1 to 100 do
if i in n4 then
begin
write (i:4);
n:= n+1
end;
if n= 0 then
writeln (‘ Khoâng coù trò naøo’)
else
writeln(‘ Coù ‘, n, ‘ trò ‘);
n4 := n1 –n2 –n3;
writeln (‘ Nhöõng trò chæ coù treân doøng 1: ‘);
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 119 -
for i:=1 to 100 do
if i in n4 then write (i:4);
end.
Töø khoaùù Pascal môùi
set of
in
+
-
*
Khaùi nieäm môùi
kieåu cô baûn
taäp hôïp
taäp hôïp roãng
hôïp hieäu
giao
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 120 -
BAØI TAÄP CHÖÔNG X
1. Vieát moät haøm tính soá caùc phaàn töû cuûa moät taäp hôïp.
2. Vieát moät chöông trình tìm taát caû nhöõng chöõ khoâng coù treân moät
doøng vaên baûn cho tröôùc vaø hieån thò chuùng theo thöù töï abc.
3. Thuaät toaùn sau goïi laø saøng Eratosthenes(276-194 tröôùc Coâng
nguyeân).
(*Khi thuaät toaùn naøy keát thuùc, caùc phaàn töû coøn laïi trong taäp hôïp
Sang laø caùc soá nguyeân toá trong ñoaïn töø 2 ñeán n *)
1. Khôûi taïo taäp hôïp Sang ñeå chöùa caùc soá nguyeân töø 2 ñeán n.
2. Choïn phaàn töû Songuyento nhoû nhaát trong Sang.
3. While Songuyento
2
<=n, thöïc hieän caùc böôùc sau:
a. Loaïi tröø taát caû caùc phaàn töû coù daïng Songuyento*k,k>1
b. Thay Songuyento baêøng phaàn töû nhoû nhaát trong Sang lôùn
hôn Songuyento
Vieát moät chöông trình duøng thuaät toaùn saøng Eratosthenes ñeå tìm soá
nguyeân toá.
4. Phoái hôïp caùc voøng For vaø taäp hôïp ñeå tìm caùc soá bieåu dieãn baèng
chöõ trong baøi toaùn sau:
SEND
+MORE
MONEY
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 121 -
PHUÏ LUÏC A
CAÙC THOÂNG BAÙO LOÃI CUÛA TURBO PASCAL KHI BIEÂN DÒCH
Caùc thoâng baùo naøy ñöôïc ñeå nguyeân daïng tieáng Anh ñeå giuùp cho baïn
ñoïc quen vôùi thoâng baùo treân maùy tính. Ñeå thuaän tieän cho baïn ñoïc,
chuùng toâi dòch ra tieáng Vieät ñoàng thôøi giaûi thích theâm moät soá tröôøng hôïp
xaûy ra loãi.
LOÃI #
THOÂNG BAÙO LOÃI
1
Out of memory
Heát boä nhô.ù
2
Identifier expected
Thieáu teân (bieán, thuû tuïc hay haøm).
3
Unknown identifier
Teân chöa khai baùo hoaëc sai chính taû.
4
Duplicate identifier
Teân bò truøng.
5
Syntax error
Loãi cuù phaùp
6
Error in real constant
Haèng soá thöïc coù loãi.
7
Error in integer constant
Haèng soá nguyeân coù loãi.
8
String constant exceeds line
Loãi thieáu hoaëc thöøa daáu nhaùy ñôn(’) khi duøng haèng chuoãi.
10 Unexpected end of file
Thieáu daáu chaám (. ) ôû chöõ end cuoái chöông trình.
11 Line too long
Doøng quaù daøi.
12 Type identifier expected
Thieáu teân kieåu (trong khai baùo bieán).
13 Too many open files
Môû quaù nhieàu teäp.
14 Invalid file name
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 122 -
Teân teäp khoâng hôïp leä.
15 File not found
Teäp khoâng tìm thaáy.
16 Disk full
Ñóa ñaày.
17 Invalid compiler directive
Chæ thò trình bieân dòch khoâng hôïp leä.
18 Too many files
Quaù nhieàu taäp tin.
19 Undefined type in pointer definition
Ñònh nghóa con troû chöa xaùc ñònh kieåu.
20 Variable identifier expected
Thieáu teân bieán.
21 Error in type
Loãi khi ñònh nghóa kieåu.
22 Structure too large
Caáu truùc quaù lôùn.
23 Set base type out of range
Kieåu cô baûn cuûa taäp hôïp quaù lôùn (toái ña 256 phaàn töû)
24 File components may not be files or objects
Caùc thaønh phaàn cuûa teäp khoâng theå laø teäp hay ñoái töôïng.
25 Invalid string length
Chieàu daøi chuoãi baát hôïp leä(toái ña 255).
26 Type mismatch
Kieåu döõ lieäu khoâng phuø hôïp.
27 Invalid subrange base type
Kieåu mieàn con baát hôïp leä.
28 Lower bound > than upper bound
Caän döôùi > caän treân.
29 Ordinal type expected
Caàn kieåu thöù töï (ví duï trong CASE vaø FOR)
30 Integer constant expected
Thieáu haèng soá nguyeân.
31 Constant expected
Thieáu moät haèng.
32 Integer or real constant expected
Thieáu haèng soá nguyeân hay thöïc.
33 Pointer type identifier expected
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 123 -
Thieáu teân kieåu con troû.
34 Invalid function result type
Kieåu traû veà cuûa haøm baát hôïp leä.
35 Label identifier expected
Thieáu teân nhaõn.
36 BEGIN expected
Thieáu BEGIN.
37 END expected
Thieáu END
38 Integer expression expected
Thieáu bieåu thöùc nguyeân.
39 Ordinal expression expected
Thieáu bieåu thöùc kieåu thöù töï.
40 Boolean expression expected
Thieáu bieåu thöùc kieåu Booleanï.
41 Operand types do not match operator
Toaùn haïng khoâng phuø hôïp vôùi toaùn töû.
42 Error in expression
Bieåu thöùc coù loãi.
43 Illegal assignment
Leänh gaùn baát hôïp leä.
44 Field identifier expected
Thieáu teân tröôøng.
45 Object file too large
Teäp ñoái töôïng quaù lôùn.
46 Undefined external
Thuû tuïc hay haøm external chöa ñònh nghóa.
47 Invalid object file record
Baûn ghi teäp doái töôïng khoâng hôïp leä.
48 Code segment too large
Phaàn maõ quaù lôùn (toái ña 64K).
49 Data segment too large
Phaàn döõ lieäu quaù lôùn(toái ña 64K).
50 DO expected
Thieáu DO
51 Invalid PUBLIC definition
Ñònh nghóa PUBLIC khoâng hôïp leä
52 Invalid EXTRN definition
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 124 -
Ñònh nghóa EXTRN khoâng hôïp leä.
53 Too many EXTRN definitions
Quaù nhieàu ñònh nghóa EXTRN
54 OF expected
Thieáu OF
55 INTERFACE expected
Thieáu INTERFACE
56 Invalid relocatable reference
Tham chieáu baûng ñònh vò khoâng hôïp leä.
57 THEN expected
Thieáu THEN
58 TO or DOWNTO expected
Thieáu TO hoaëc DOWNTO
59 Undefined forward
Chöa ñònh nghóa forward
61 Invalid typecast
Eùp kieåu khoâng hôïp leä.
62 Division by zero
Chia cho soá khoâng
63 Invalid file type
Kieåu teäp khoâng hôïp leä.
64 Cannot Read or Write variables of this type
Caùc bieán kieåu naøy khoâng theå ñoïc hoaëc vieát ñöôïc.
65 Pointer variable expected
Thieáu bieán con tro.û
66 String variable expected
Thieáu bieán kieåu chuoãi.
67 String expression expected
Thieáu bieåu thöùc kieåu chuoãi.
68 Circular unit reference
Tham chieáu loøng voøng trong unit.
69 Unit name mismatch
Teân unit khoâng phuø hôïp.
70 Unit version mismatch
Phieân baûn unit khoâng phuø hôïp.
71 Internal stack overflow
Traøn boä nhôù stack trong (do quaù nhieàu möùc loàng nhau)
72 Unit file format error
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 125 -
Loãi khuoân daïng teäp unit.
73 IMPLEMENTATION expected
Thieáu IMPLEMENTATION
74 Constant and case types don't match
Haêøng choïn trong caáu truùc CASE khoâng khôùp vôùi bieåu thöùc choïn.
75 Record variable expected
Thieáu bieán kieåu record.
76 Constant out of range
Haèng quaù lôùn.
77 File variable expected
Thieáu bieán kieåu teäp.
78 Pointer expression expected
Thieáu bieåu thöùc con troû
79 Integer or real expression expected
Thieáu bieåu thöùc nguyeân hoaëc thöïc.
80 Label not within current block
Nhaõn khoâng thuoäc khoái hieän haønh.
81 Label already defined
Nhaõn ñaõ ñöôïc ñònh nghóa.
82 Undefined label in preceding statement part
Nhaõn xuaát hieän trong caâu leänh nhöng chöa ñöôïc ñònh nghóa.
83 Invalid @ argument
Ñoái cuûa @ khoâng hôïp leä
84 UNIT expected
Thieáu UNIT
85 ";" expected
Thieáu “;”
86 ":" expected
Thieáu “:”
87 "," expected
Thieáu “,”
88 "(" expected
Thieáu “(“
89 ")" expected
Thieáu “)”
90 "=" expected
Thieáu “=”
91 ":=" expected
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 126 -
Thieáu “:=”
92 "[" or "(." Expected
Thieáu “[“ hay “(“
93 "]" or ".)" expected
Thieáu “]” hay “)”
94 "." expected
Thieáu “.”
95 ".." expected
Thieáu “..”
96 Too many variables
Quaù nhieàu bieán (toång kích thöôùc vöôït quaù 64K).
97 Invalid FOR control variable
Bieán kieåm soaùt voøng FOR khoâng hôïp leä (thöôøng do khoâng khai baùo
ñòa phöông)
98 Integer variable expected
Thieáu bieán nguyeân
99 File and procedure types are not allowed here
Kieåu teäp vaø thuû tuïc khoâng ñöôïc pheùp.
100
String length mismatch
Chieàu daøi chuoãi khoâng phuø hôïp.
101
Invalid ordering of fields
Traät töï caùc tröôøng khoâng hôïp leä
102
String constant expected
Thieáu haèng chuoãi.
103
Integer or real variable expected
Thieáu bieán nguyeân hoaëc thöïc.
104
Ordinal variable expected
Thieáu bieán kieåu thöù töï.
105
INLINE error
Loãi INLINE
106
Character expression expected
Thieáu bieåu thöùc kieåu thöù töï.
107
Too many relocation items
Quaù nhieàu muïc ñònh vò.
108
Overflow in arithmetic operation
Traøn khi tính soá.
109
No enclosing FOR, WHILE, or REPEAT statement
Duøng break hay continue ôû ngoaøi voøng laëp
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 127 -
110
Debug information table overflow
Traøn baûng thoâng tin söûa loãi
112 CASE constant out of range
Haèng quaù lôùn trong caáu truùc CASE (thöôøng laø do soá nguyeân vöôït
quaù 32767)
113 Error in statement
Loãi trong phaùt bieåu (ví duï nhö khi tröôùc ELSE coù ;)
114 Cannot call an interrupt procedure
Khoâng goïi ñöôïc thuû tuïc ngaét
116
Must be in 8087 mode to compile
Phaûi dòch trong cheá ñoä 8087
117
Target address not found
Ñòa chæ ñích khoâng tìm thaáy
118
Include files are not allowed here
Teäp bao haøm khoâng tìm thaáy
119
NIL expected
Thieáu NIL
121
Invalid qualifier
Tính chaát baát hôïp leä. Loãi naøy thöôøng xuaát hieän khi duøng chæ soá vôùi
bieán khoâng phaûi kieåu maûng, duøng teân tröôøng vôùi bieán khoâng phaûi
kieåu record.
122
Invalid variable reference
Tham chieáu bieán khoâng hôïp leä
123
Too many symbols
Quaù nhieàu kyù hieäu (vöôït quaù 64K)
124
Statement part too large
Phaàn leänh quaù lôùn (vöôït quaù 24K)
126
Files must be var parameters
Teäp baét buoäc phaûi laø tham bieán
127
Too many conditional symbols
Quaù nhieàu kyù hieäu ñieàu kieän
128
Misplaced conditional directive
Chæ thò ñieàu kieän ñaët sai choã
129
ENDIF directive missing
Thieáu chæ thò ENDIF
130
Error in initial conditional defines
Loãi khi khôûi taïo diieàu kieän
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 128 -
131
Header does not match previous definition
Phaàn ñaàu (thuû tuïc) khoâng khôùp vôùi ñònh nghóa
132
Critical disk error
Loãi ñóa nghieâm troïng
133
Cannot evaluate this expression
Khoâng theå tính ñöôïc bieåu thöùc (thöôøng do goïi haøm khi khai baùo
haèng)
134
Expression incorrectly terminated
Bieåu thöùc keát thuùc khoâng ñuùng
135
Invalid format specifier
Ñaëc taû khuoân daïng khoâng hôïp leä
136
Invalid indirect reference
Tham chieáu giaùn tieáp khoâng hôïp leä
137
Structured variables are not allowed here
Bieán kieåu caáu truùc khoâng ñöôïc pheùp taïi ñaây
138
Cannot evaluate without System unit
Khoângtheå löôïng giaù vì thieáu unit System
139
Cannot access symbol table
Khoâng theå truy caäp baûng kyù hieäu
140
Invalid floating-point operation
Pheùp toaùn daáu chaám ñoäng khoâng hôïp leä
141
Cannot compile overlays to memory
Khoâng theå bieân dòch taäp overlay(che phuû) vaøo boä nhôù
142
Procedure or function variable expected
Thieáu bieán haøm hay thuû tuïc
143
Invalid procedure or function reference
Tham chieáu haøm hay thuû tuïc khoâng hôïp leä
144
Cannot overlay this unit
Khoâng theå overlay (che phuû) unit naøy
145
Too many nested scopes in .TXT
Quaù nhieàu phaïm vi loàng nhau trong vaên baûn (toái ña 512)
146
File access denied
Truy caäp file bò töø choái
147
Object type expected
Thieáu kieåu ñoái töôïng
148
Local object types are not allowed
Kieåu ñoái töôïng logic khoâgn ñöôï pheùp
149
VIRTUAL expected
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 129 -
Thieáu VIRTUAL
150
Method identifier expected
Thieáu teân phöông thöùc
151
Virtual constructors are not allowed
Haøm taïo aûo khoâg ñöôïc pheùp
152
Constructor identifier expected
Thieáu teân haøm taïo
153
Destructor identifier expected
Thieáu teân haøm huyû
154
Fail only allowed within constructors
Thuû tuïc Fail chæ ñöôïc pheùp duøng trong haøm huyû
155
Invalid combination of opcode and operands
Toå hôïp toaùn haïng vaø maõ leänh khoâng hôïp leä
156
Memory reference expected
Thieáu tham chieáu boä nhôù
157
Cannot add or subtract relocatable symbols
Khoâng theå tröø hoaëc coäng baûng taùi ñònh vò
158
Invalid register combination
Toå hôïp thanh ghi khoâng hôïp leä
159
286/287 instructions are not enabled
Caùc leänh 286/287 khoâng duøng ñöôïc
160
Invalid symbol reference
Tham chieáu kyù hieäu khoâng hôïp leä
161
Code generation error
Loãi khi sinh maõ
162
ASM expected
Thieáu ASM
163
Duplicate dynamic method index
Chæ soá phöông thöùc ñoäng bò truøng
164
Duplicate resource identifier
Teân taøi nguyeân bò truøng
165
Duplicate or invalid export index
Chæ soá export truøng hay khoâng hôïp leä
166
Procedure or function identifier expected
Thieáu teân haøm hay thuû tuïc
167
Cannot export this symbol
Khoâng theå export kyù hieäu naøy
168
Duplicate export name
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 130 -
Teân export bò truøng
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 131 -
PHUÏ LUÏC B
CAÙC THOÂNG BAÙO LOÃI KHI CHAÏY CHÖÔNG TRÌNH
Loãi # Thoâng baùo loãi
1
Invalid function number
Soá hieäu haøm khoâng hôïp leä
2
File not found
Teäp khoâng tìm thaáy
3
Path not found
Ñöôøng daãn khoâng tìm thaáy
4
Too many open files
Môû quaù nhieàu teäp
5
File access denied
Truy caäp file bò töø choái
6
Invalid file handle
Theû file khoâng hôïp leä
12 Invalid file access code
Maõ truy caäp file khoâng hôïp leä
15 Invalid drive number
Soá oå ñóa khoâng hôïp leä
16 Cannot remove current directory
Khoâng theå gôõ boû thö muïc hieän haønh
17 Cannot rename across drives
18 Khoâng theå ñoåi teân oå ñóa
100 Disk read error
Loãi ñoïc ñóa
101 Disk write error
Loãi ghi ñóa
102 File not assigned
Taäp tin chöa ñöôïc assign
103 File not open
Taäp tin chöa môû
104 File not open for input
Taäp tin chöa môû ñeå nhaäp
105 File not open for output
Taäp tin chöa môû ñeå xuaát
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 132 -
106 Invalid numeric format
Khuoân daïng soá khoâng hôïp leä (nhaäp lieäu sai)
200 Division by zero
Chia cho soá khoâng
201 Range check error
Loãi khi kieåm tra taàm(ví duï chæ soá cuûa maûng vöôït giôùi haïn)
202 Stack overflow error
Loãi traøn boä nhôù stack
203 Heap overflow error
Loãi traøn boä nhôù heap
204 Invalid pointer operation
Pheùp toaùn con troû khoâng hôïp leä
205 Floating point overflow
Pheùp toaùn daáu chaám ñoäng quaù lôùn
206 Floating point underflow
Pheùp toaùn daáu chaám ñoäng quaù nhoû
207 Invalid floating point operation
Pheùp toaùn daáu chaám ñoäng khoâng hôïp leä
210 Object not initialized
Ñoái töôïng chöa khôûi taïo
211 Call to abstract method
Goïi phöông thöùc tröøu töôïng
212 Stream registration error
Loãi ñaêng kyù doøng
213 Collection index out of range
Chæ soá taäp hôïp vöôït taàm
214 Collection overflow error
Loãi traøn taäp hôïp
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 133 -
TAØI
LIEÄU
THAM
KHAÛO
1. Doug Cooper and Michael Clancy, Oh! Pascal! University of
California, Berkeley-1982.
2.Ñoaøn Nguyeân Haûi – Nguyeãn Trung Tröïc – Nguyeãn Anh Duõng, Laäp
trình caên baûn
Ñaïi hoïc Baùch khoa TpHCM-1993
3. Niklaus Wirth , Caáu truùc döõ lieäu + Giaûi thuaät = Chöông trình,
NXB Ñaïi hoïc vaø Giaùo duïc chuyeân nghieäp- 1991
4. Robert Sedgewick , Algorithms Princeton University –1988.
5.. Stephen K. O’Brien, Turbo Pascal 6: The Complete Reference
NXB
McGraw-Hill-1993
6. Quaùch Tuaán Ngoïc, Ngoân ngöõ laäp trình Pascal, Ñaïi hoïc Baùch khoa
Haø noäi-1990
Nguyeãn Danh Höng Khoa Vaät Lyù
Kyõ thuaät laäp trình Pascal
- 134 -
Nguyeãn Danh Höng Khoa Vaät Lyù