Chương trình con trong Pascal
Trong khi lập trình chúng ta thường gặp những đoạn chương trình lặp đi lặp lại nhiều lần ở những chỗ khác nhau. Để tránh rườm rà những đoạn chương trình này được thay thế bằng các chương trình con tương ứng. Khi cần, ta chỉ cần gọi tên chương trình con đó ra.
CH ¦¥NG TR×NH CON
I. Kh¸i niÖm vÒ ch¬ng tr×nh con (Sub-program)
Trong khi lËp tr×nh chóng ta th êng gÆp nh÷ng ®o¹n ch¬ng tr×nh lÆp ®i
lÆp l¹i nhiÒu lÇn ë nh÷ng chç kh¸c nhau. §Ó tr¸nh r êm rµ nh÷ng ®o¹n ch¬ng
tr×nh nµy ®îc thay thÕ b»ng c¸c ch¬ng tr×nh con t ¬ng øng. Khi cÇn, ta chØ cÇn
gäi tªn ch¬ng tr×nh con ®ã ra.
Lý do thø hai ®Ó x©y dùng ch¬ng tr×nh con: Mét vÊn ®Ò lín vµ phøc t¹p
sÏ t¬ng øng víi mét ch¬ng tr×nh cã thÓ rÊt lín vµ dµi. Do ®ã viÖc söa ch÷a ch-
¬ng tr×nh sÏ rÊt khã kh¨n. Ta cã thÓ ph©n tÝch nã thµnh c¸c vÊn ®Ò nhá h¬n,
®Ó dÔ kiÓm tra, sau ®ã ghÐp l¹i thµnh mét ch¬ng tr×nh lín.
II. PROCEDURE vµ FUNCTION (Thñ tôc vµ Hµm)
Trong Pascal cã hal lo¹i CTC :
- PROCEDURE (thñ tôc)
- FUNCTION (hµm)
Sù kh¸c nhau c¬ b¶n vµ duy nhÊt cña hai lo¹i CTC nµy lµ
FUNCTION tr¶ l¹i mét gi¸ trÞ kÕt qu¶ v« híng th«ng qua tªn function vµ
do ®ã nã cã thÓ sö dông nh mét biÕn, h»ng biÓu thøc. Cßn PROCEDURE
kh«ng tr¶ l¹i kÕt qu¶ th«ng qua tªn cña biÓu thøc nªn procedure kh«ng thÓ
viÕt trong biÓu thøc.
VD : C¸c PROCEDURE c¬ b¶n cña Pascal
- Writeln
- Readln
_ Textcolor
C¸c FUNCTION c¬ b¶n
- Sin(x) : tr¶ vÒ gi¸ trÞ kiÓu thùc
- Chr(i) : tr¶ vÒ gi¸ trÞ kiÓu Char
III. CÊu tróc cña mét ch¬ng tr×nh con
{PhÇn khai b¸o cña ch¬ng tr×nh chÝnh}
VAR .....
CONST ....
{C¸c ch¬ng tr×nh con}
1
PROCEDURE Tªn_thñ_tôc (Khai b¸o c¸c tham sè, nÕu cÇn);
{PhÇn khai b¸o trong CTC}
BEGIN
.....
END;
FUNCTION Tªn_Hµm (khai b¸o c¸c tham sè nÕu cÇn):kiÓu d÷ liÖu;
{PhÇn khai b¸o trong CTC}
BEGIN
.....
END;
{Ch¬ng tr×nh chÝnh}
BEGIN
.....
END.
IV. ChuyÓn tham sè cho ch¬ng tr×nh con
Cã 2 c¸ch chuyÓn tham sè :
- Tham trÞ (value parameter)
- Tham biÕn (variable parameter)
VD : PROCEDURE Thidu(i,j:integer; VAR x,y:real);
Tham trÞ : i,j
Tham biÕn : x,y
Sù kh¸c nhau gi÷a tham trÞ vµ tham biÕn :
- Tham trÞ cã thÓ lµ h»ng, biÕn, biÓu thøc. Cßn tham biÕn chØ cã thÓ lµ biÕn
- NÕu tham trÞ lµ biÕn th× gi¸ trÞ nã sÏ kh«ng thay ®æi sau khi CTC thùc
hiÖn. Cßn tham biÕn sÏ thay ®æi gi¸ trÞ nÕu trong CTC cã lÖnh lµm thay ®æi
gi¸ trÞ cña nã
VD :
* Hµm SIN (X)
Trong nµy X lµ tham trÞ vµ ta cã thÓ viÕt
- KQ := SIN (1); X=1
- KQ := SIN (Y*2); X=Y*2
- KQ := SIN (X); X=X
Vµ sau khi thùc hiÖn gi¸ trÞ cña X vÉn kh«ng thay ®æi.
* Hµm DEC (X)
2
Trong nµy X lµ tham biÕn, ta chØ cã thÓ viÕt
- DEC (X); X lµ biÕn kiÓu nguyªn
Kh«ng thÓ viÕt
- DEC (5); X lµ h»ng
- DEC (Y*2); X lµ biÓu thøc
Sau khi gäi hµm gi¸ trÞ cña X sÏ thay ®æi (gi¶m ®i 1)
V. FUNCTION vµ c¸ch lùa chän
Trong FUNCTION b¾t buéc ph¶i cã lÖnh g¸n gi¸ trÞ cho tªn hµm
Tªn_hµm :=
Chóng ta chØ nªn dïng FUNCTION khi vµ chØ khi nã ®ång thêi tho¶ c¸c ®iÒu
kiÖn sau :
- NÕu ta muèn nhËn l¹i mét vµ chØ mét kÕt qu¶
- KÕt qu¶ ®ã ph¶i lµ kiÓu v« híng
Cßn nÕu kh«ng tho¶ m·n th× chóng ta nªn dïng PROCEDURE
VD : CTC tÝnh b×nh ph¬ng cña mét sè
FUNCTION Binh_Phuong (X:real):real;
BEGIN
Binh_Phuong := X*X;
END;
NÕu dïng procedure
PROCEDUR Binh_Phuong (X:Real; VAR kq:real);
BEGIN
kq := X*X;
END;
Khi kiÓm tra xem tæng b×nh ph¬ng cña a vµ b cã b»ng c kh«ng :
- NÕu lµ FUNCTION ta viÕt :
IF Binh_Phuong(a)+Binh_Phuong(b) = Binh_phuong(c) THEN
- NÕu lµ PROCEDURE ta viÕt
Binh_Phuong (a,kqa);
Binh_Phuong (b,kqb);
Binh_Phuong (c,kqc);
IF kqa+kqb=kqc THEN
Râ rµng c¸ch dïng FUNCTION cã lîi h¬n
3
VI. BiÕn toµn côc vµ biÕn côc bé
1. BiÕn toµn côc
Lµ c¸c biÕn ®îc khai b¸o trong ch¬ng tr×nh chÝnh. C¸c biÕn nµy ®Òu cã t¸c
dông ë mäi n¬i trong ch¬ng tr×nh.
2. BiÕn côc bé
Lµ c¸c biÕn ®îc khai b¸o trong ch¬ng tr×nh con. C¸c biÕn nµy chØ cã t¸c dông
trong ch¬ng tr×nh con ®ã. Khi ch¬ng tr×nh con kÕt thóc, c¸c biÕn nµy còng mÊt
t¸c dông theo.
3. Chó ý
NÕu trong CTC cã khai b¸o biÕn (h»ng) trïng víi tªn biÕn (h»ng) trong ch¬ng
tr×nh chÝnh th× ch¬ng tr×nh con sÏ u tiªn xö lý biÕn (h»ng) trong ch¬ng tr×nh
chÝnh. Vµ khi tho¸t khái ch¬ng tr×nh con ®ã. Gi¸ trÞ cña biÕn trong ch¬ng
tr×nh vÉn gi÷ nguyªn gi¸ trÞ tr íc khi gäi CTC.
VD : CONST I=5;
PROCEDURE THU;
VAR I : INTEGER;
BEGIN
I := 6;Writeln(I);
END;
BEGIN
Writeln(I);THU;Writeln(I);
END.
Trªn mµn h×nh sÏ xuÊt hiÖn
5 Gi¸ trÞ biÕn toµn côc
6 Gi¸ trÞ biÕn ®Þa ph¬ng
5 Gi¸ trÞ biÕn toµn côc
VII. TÝnh ®Ö quy cña ch¬ng tr×nh con
Trong PROCEDURE vµ FUNCTION cã thÓ cã lêi gäi chÝnh nã. TÝnh chÊt nµy
gäi lµ ®Ö quy.
VD : TÝnh N! qua ®Þnh nghÜa
N! = 1.2.3...(n-1).n
hoÆc ®Þnh nghÜa theo ®Ö quy N! =1 khi N=0
4
= (n-1)!.n khi N>=1
Khi ®ã hµm GIAI_THUA cã thÓ ®Þnh nghÜa nh sau
FUNCTION GIAI_THUA (n:integer):integer;
BEGIN
IF n=0 THEN GIAI_THUA := 1 ELSE GIAI_THUA := n*GIAI_THUA(n-1);
END;
Bµi tËp 1:{ NhËp a,b,c lµ hÖ sè cña mét hµm sè bËc 2. Sau ®ã ta nhËp X liªn tôc, øng
víi mçi gi¸ trÞ cña X, ta in ra gi¸ trÞ cña Y t ¬ng øng.
Ch¬ng tr×nh kÕt thóc khi ta nhËp 0
H íng dÉn
ViÕt ch¬ng tr×nh con tÝnh Y t ¬ng øng X}
uses crt;
var
a,b,c,x:real;{a,b,c,x kiÓu real}
function y(x:real):real;
begin
y:=a*x*x+b*x+c;{TÝnh y theo x}
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('A, B, C = ');readln(a,b,c);{NhËp a,b,c}
repeat
write('X = ');readln(x);{NhËp X}
if x0 then writeln('Y = ',y(x):0:2);{NÕu x0 th× in ra Y t ¬ng øng}
until x=0;
end.
Bµi tËp 2:
{ NhËp N. Sau ®ã nhËp N to¹ ®é A,B cña N ®êng th¼ng. In ra mµn h×nh ®êng
th¼ng cã ®é dµi lín nhÊt.
H íng dÉn
ViÕt hµm tÝnh ®é dµi ®o¹n th¼ng víi tham sè lµ 2 to¹ ®é}
uses crt;
var max,xa,ya,xb,yb:real;{max,xa,ya,xb,yb kiÓu real}
i,n:integer;{i,n kiÓu integer}
function dodai(xa,ya,xb,yb:real):real;
begin
5
dodai:=sqrt(sqr(xa-xb)+sqr(ya-yb));{G¸n dodai b»ng ®é dµi ®o¹n AB}
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('N = ');readln(n);{NhËp N}
max:=0;{G¸n max b»ng 0}
for i:=1 to n do{Cho i ch¹y tõ 1 ®Õn N}
begin
write('XA, YA, XB, YB = ');readln(xa,ya,xb,yb);{§äc to¹ ®é A,B}
if maxb then a:=a-b else b:=b-a;{NÕu a>b th× g¸n a=a-b ngîc l¹i g¸n b=b-a}
ucln:=a;{G¸n ucln b»ng a}
end;
function bcnn(a,b:integer):integer;
begin
6
bcnn:=a*b div ucln(a,b);{TÝnh bcnn}
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('N = ');readln(n);{§äc N}
write('So thu 1 : ');readln(a);{§äc phÇn tö thø 1 vµo a}
u:=a;b:=a;{G¸n u,b b»ng a}
for i:=2 to n do{Cho i ch¹y tõ 2 ®Õn n}
begin
write('So thu ',i,' : ');readln(a);{NhËp sè thø i vµo a}
u:=ucln(u,a);{G¸n u b»ng UCLN cña u vµ a}
b:=bcnn(b,a);{G¸n b b»ng BCNN cña u vµ b}
end;
writeln('UCLN = ',u);
writeln('BCNN = ',b);
readln;
end.
{ NhËp N. In ra mµn h×nh c¸c sè nguyªn tètõ 1 ®Õn N
H íng dÉn
ViÕt hµm NGUYENTO(N) tr¶ vÒ gi¸ trÞ TRUE nÕu N nguyªn tè}
uses crt;
var
i,n:integer;{i,n kiÓu integer}
function nt(n:integer):boolean;
var i:integer;{Khai b¸o i kiÓu integer}
begin
for i:=2 to trunc(sqrt(n))do{Cho i ch¹y tõ 2 ®Õn trunc(sqrt(n))}
if n mod i=0 then begin nt:=false;exit;end;{NÕu n chia hÕt cho i th× g¸n nt=false;tho¸t
khái CT con b»ng exit}
nt:=true;{G¸n nt b»ng TRUE}
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('N = ');readln(n);{§äc N}
for i:=2 to n do{Cho i ch¹y tõ 2 ®Õn N}
if nt(i)then write(i:5);{NÕu i ntè th× xuÊt I}
readln;
7
end.
Bµi tËp 4:
{ NhËp sè N. Sau ®ã nhËp N phÇn tö. In ra phÇn tö cã sè íc lµ lín nhÊt
H íng dÉn
ViÕt hµm TINH(N) tr¶ vÒ sè íc cña N
L u ý r»ng sè 0 cã sè íc lín nhÊt trong tÊt c¶ mäi sè}
uses crt;
var
i,n:integer;{i,n kiÓu integer}
a,max,luua:integer;{a,max,luua kiÓu integer}
function tinh(n:integer):integer;
var i,souoc:integer;{Khai b¸o i,souoc kiÓu integer}
begin
if n=0 then tinh:=maxint{NÕu N=0 th×}
else{Ngîc l¹i}
begin
souoc:=0;{G¸n souoc b»ng 0}
for i:=1 to n do{Cho i ch¹y tõ 1 ®Õn N}
if n mod i=0 then inc(souoc);{NÕu n chia hÕt cho i th× t¨ng souoc}
tinh:=souoc;{G¸n tinh b»ng souoc}
end;
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('N = ');readln(n);{§äc N}
max:=0;{G¸n max b»ng 0}
for i:=1 to n do{Cho i ch¹y tõ 1 ®Õn N}
begin
write('So thu ',i,' : ');readln(a);{NhËp sè thø i vµo a}
if max if luua=0 then write('Co vo so uoc')else writeln('Co ',max,' uoc');{NÕu luua=0 th× xuÊt
cã v« sè íc ngîc l¹i xuÊt max}
readln;
end.
Bµi tËp 5:
{ ViÕt ch¬ng tr×nh hiÖn ra Menu sau
0 - Thoat
1 - Tinh dien tich hinh chu nhat
2 - Tinh dien tich hinh tron
3 - Tinh dien tich hinh thang
Hay an mot so de chon :
Sau ®ã øng víi mçi sè b¹n h·y viÕt thñ tôc tÝnh diÖn tÝch t ¬ng øng}
uses crt;
var
ch:char;{ch kiÓu char}
procedure hcn;
var a,b:real;{Khai b¸o a,b kiÓu real}
begin
write('A, B = ');readln(a,b);{§äc a,b}
writeln('Dien tich hcn la : ',a*b:0:2);{XuÊt dt}
readln;
end;
procedure htron;
var r:real;{Khai b¸o r kiÓu real}
begin
write('R = ');readln(r);{§äc r}
writeln('Dien tich hinh tron : ',r*r*3.14:0:2);{XuÊt dt}
readln;
end;
procedure hthang;
var a,b,h:real;{Khai b¸o a,b,h kiÓu real}
begin
write('Nhap day lon, day be, chieu cao : ');readln(a,b,h);{§äc a,b,h}
writeln('Dien tich hinh thang : ',(a+b)*h/2:0:2);{XuÊt dt}
9
readln;
end;
begin
repeat
clrscr;{Xo¸ mµn h×nh}
writeln('0 - Thoat');
writeln('1 - Tinh dien tich hcn');
writeln('2 - Tinh dien tich hinh tron');
writeln('3 - Tinh dien tich hinh thang');
write('Hay an mot so de chon :');
repeat ch:=readkey;until(ch='1')or(ch='2')or(ch='3')or(ch='0');{NhËn ch ®Õn khi nµo
ch='0'..'3'}
clrscr;{Xo¸ mµn h×nh}
case ch of
'1':hcn;
'2':htron;
'3':hthang;
end;
until ch='0';
end.
Bµi tËp 6:{ ViÕt thñ tôc ®Ö quy ®¶o c¸c ch÷ sè cña mét sè.
VD : §äc vµo sè : 12345
In ra : 54321
H íng dÉn
PROCEDURE dao(n:integer);
NÕu N>0 th×
XuÊt n mod 10;
Gäi ®Ö quy dao(n div 10)}
uses crt;
var
n:integer;{n kiÓu integer}
procedure dao(n:integer);
begin
if n>0 then{NÕu n>0 th×}
begin
write(n mod 10);{In ra hµng ®¬n vÞ cña n}
dao(n div 10);{Gäi thñ tôc dao(n div 10)}
10
end;
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('N = ');readln(n);{§äc N}
dao(n);
readln;
end.
Bµi tËp 7:
{ D·y sè Fibonaci lµ d·y sè F1,F2...Fn ®îc t¹o ra víi c«ng thøc
F1 = F2 = 1
Fn = Fn-1 + Fn-2 (n>2)
H·y nhËp sè N. TÝnh Fn
H íng d©n
ViÕt hµm ®Ö quy FIBO(N) tr¶ vÒ gi¸ trÞ Fn}
uses crt;
var
n:integer;{n kiÓu integer}
function fibo(n:longint):longint;
begin
if n var i:byte;{Khai b¸o i kiÓu byte}
begin
for i:=1 to 10 do{Cho i ch¹y tõ 1 ®Õn 10}
begin
gotoxy(x,y+i-1);{nh¶y tíi vÞ trÝ x,y+i-1}
write(k,' x ',i,' = ',k*i);{XuÊt k x i}
end;
end;
begin
clrscr;
bcc(5,5,3);
bcc(20,10,9);
readln;
end.
12