Chương trình con trong Pascal
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.
9 trang |
Chia sẻ: tlsuongmuoi | Lượt xem: 2962 | Lượt tải: 3
Bạn đang xem nội dung tài liệu Chương trình con trong Pascal, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
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}
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)
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
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
= (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
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 max<dodai(xa,ya,xb,yb)then max:=dodai(xa,ya,xb,yb);{NÕu max nhá h¬n ®é dµi AV th× cËp nhËt max}
end;
writeln('Do dai doan thang dai nhat : ',max:0:2);{XuÊt max}
readln;
end.
Bµi tËp 3:
{ NhËp N. Sau ®ã nhËp N sè h¹ng. TÝnh UCLN vµ BCNN cña N sè ®ã.
Híng dÉn
ViÕt hµm tÝnh UCLN,BCNN gi÷a 2 sè
UCLN (A1..An) = UCLN( UCLN(A1..An-1) ,An)
BCNN (A1..An) = BCNN( BCNN(A1..An-1) ,An)}
uses crt;
var
a,i,n:integer;{a,i,n kiÓu integer}
u,b:integer;{u,b kiÓu integer (biÕn lu UCNN,BCNN)}
function ucln(a,b:integer):integer;
begin
while ab do{Trong khi ab th×}
if a>b 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
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;
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
Lu ý 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<tinh(a)then{nÕu max < sè íc cña a th×}
begin
max:=tinh(a);{CËp nhËt max}
luua:=a;{G¸n luua b»ng a}
end;
end;
writeln('So co nhieu uoc nhat la :',luua);{XuÊt luua}
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}
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)}
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<3 then fibo:=1{NÕu n<3 th× g¸n fibo=1}
else fibo:=fibo(n-1)+fibo(n-2);{Ngîc l¹i g¸n fibo = ...}
end;
begin
clrscr;{Xo¸ mµn h×nh}
write('N = ');readln(n);{§äc N}
writeln(fibo(n));{XuÊt fibo(n)}
readln;
end.
Bµi tËp 8:{ ViÕt thñ tôc BCC(x,y,k:byte) in ra mµn h×nh b¶ng cöu ch¬ng k t¹i vÞ trÝ x,y}
uses crt;
procedure bcc(x,y,k:byte);
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.
Các file đính kèm theo tài liệu này:
- Chương trình con trong Pascal.doc