CHƯƠNG TRÌNH CON
- Chương
trình có nhiều phân đoạn mỗi phân đoạn thực hiện một chức năng nào đó (khi đó
ta sử dụng CTC để làm các phân đoạn trên).
- Trong
chương trình, có những phân đoạn cần phải lặp đi, lặp lại nhiều lần ở những chỗ
khác nhau. Để tránh viết lại các đoạn đó người ta thường phân chương trình ra
thành nhiều CTC.
- Một tiện lợi
khác của việc sử dụng CTC là ta có thể dễ dàng kiểm tra tính đúng đắn của nó
trước khi ráp nối vào chương trình chính. Do đó việc xác định sai sót và tiến
hành điều chỉnh trong chương trình sẽ thuận lợi hơn.
=> CTC là
một đoạn chương trình thực hiện trọn vẹn hay một chức năng nào đó. Trong
Pascal, có 2 dạng CTC: Hàm và Thủ tục.
- Thủ tục (PROCEDURE): Dùng để thực hiện một hay
nhiều nhiệm vụ nào đó.
- Hàm (FUNCTION): Trả về một giá trị nào đó
(có kiểu vô hướng, kiểu string). Hàm có thể sử dụng trong các biểu thức.
2. Khai báo CTC:
- Nhắc lại cấu
trúc của một chương trình:
USES ………; {Khai
báo các thư viện}
CONST …….; {Khai
báo hằng}
TYPE ………; {Khai
báo kiểu}
VAR ……….; {Khai
báo biến}
Khai báo CTC
BEGIN {Chương
trình chính}
<Các lệnh>;
END.
- Như vậy phần
khai báo CTC nằm ở cuối phần khai báo.
a) Khai báo và lời gọi
hàm:
Ø Khai báo:
FUNCTION <tên hàm>(Danh sách các tham số):<kiểu dữ liệu>;
[Khai báo Const, Type, Var]
BEGIN
<Các lệnh
trong hàm>;
<tên
hàm>:=<giá trị>;
END;
- Chú ý: luôn
có phép gán tên hàm cho giá trị để hàm trả về giá trị khi được gọi.
- Ví dụ: Tính
tổng của 2 số x và y
Function tong(x,y:integer):integer;
Var s: integer;
Begin
s:=x+y;
tong:=s;
End;
Ø Lời gọi hàm:
<tên hàm>(danh sách các tham số thực);
Ví dụ:
tong(4,5); {Hàm trả về kết quả tổng của 2
số 4 và 5}
b) Khai báo và lời gọi
thủ tục:
Ø
Khai báo:
PROCEDURE <tên thủ tục>(Danh sách các tham số); {không có giá trị trả về}
[Khai báo Const, Type, Var]
BEGIN
<Các câu lệnh>;
END;
Ví dụ:
Procedure inso(n:integer);
Var i:integer;
Begin
For i:=1 to n do write(i:5);
End;
Ø Lời gọi thủ tục:
<tên thủ tục>(danh sách các tham số thực);
Ví dụ:
inso(6);
3. Biến toàn cục và
biến cục bộ:
- Biến toàn cục là biến được khai báo
trong chương trình chính. Các biến này có thể được dùng ở mọi nơi trong chương
trình và tồn tại trong suốt thời gian làm việc của chương trình.
- Biến cục bộ (biến địa phương) là các
biến được khai báo trong CTC. Các biến này chỉ được sử dụng trong phạm vi CTC
mà nó được khai báo. Sau khi kết thúc CTC các biến này sẽ không tồn tại.
Ví dụ:
Program vidu;
Var a, b, c: integer; {3 biến
toàn cục}
Procedure thutuc(n:integer);
{n là biến cục bộ}
Var i: integer; {i là biến cục
bộ}
Begin
For i:=1 to 10 do
writeln(i);
End;
Begin
a:=5; b:=6; c:=8;
thutuc(a);
thutuc(b);
thutuc(c);
readln;
End.
- Trong trường
hợp biến cục bộ trùng tên với biến toàn cục thì máy không bị nhầm lẫn mà sẽ thực
hiện trên biến cục bộ. Biến toàn cục không bị ảnh hưởng.
4. Cách truyền tham số
trong chương trình con:
- CTC không cần
có tham số (sau tên CTC) nếu không dùng đến chúng hoặc dùng trực tiếp biến toàn
cục.
- Khi truyền
tham số, các tham số trong lời gọi CTC phải đúng thứ tự và kiểu tương ứng với
khi khai báo CTC.
Ví dụ:
Procedure inso(a:integer; b:char);
Begin
{Các lệnh của
chương trình con}
End;
Khi gọi:
inso(13, 'a'); {lời gọi đúng}
inso('a',13); {lời gọi sai}
inso(13); {lời gọi sai}
- Tham số
hình thức (đối) là các tham số sau tên hàm và thủ tục trong khai báo.
- Tham số thực
là các tham số sau tên hàm và thủ tục trong lời gọi.
- Tham biến: là các tham số được khai
báo sau từ khoá Var. Các tham số thực phải là các biến chứ không được là giá trị.
Tham biến có thể được thay đổi trong CTC và sau khi ra khỏi CTC nó vẫn giữu giá
trị thay đổi đó.
- Tham trị: là các tham số được khai
báo mà không đứng sau từ khoá Var. Các tham số thực có thể là các giá trị, hằng,
biến. Tham trị có thể thay đổi trong CTC nhưng sau khi kết thúc CTC giá trị của
nó trở về như ban đầu.
- Các tham số
trong hàm luôn là các tham trị, các tham số trong thủ tục có thể là tham trị hoặc
là tham biến.
5. Phân biệt cách sử
dụng hàm và thủ tục:
- Hàm khác thủ
tục ở chỗ hàm trả về một giá trị cho lệnh gọi thông qua tên hàm còn thủ tục thì
không.
|
Dùng hàm |
Dùng thủ tục |
|
- Kết quả của một bài toán trả
về 1 giá trị duy nhất (kiểu vô hướng, kiểu string hoặc kiểu con trỏ). - Lời gọi CTC cần nằm trong biểu
thức tính toán. |
- Kết quả của bài toán không trả
về giá trị nào hoặc trả về nhiều giá trị hoặc trả về kiểu dữ liệu có cấu trúc
(Array, Record, File). - Lời gọi CTC không nằm trong
các biểu thức tính toán. |
- Chú ý: Nếu 1 công việc
có thể là bằng hàm thì chắc chắn sẽ làm được bằng thủ tục. Tuy nhiên sẽ phức tạp
hơn khi dùng hàm nhưng một chương trình làm bằng thủ tục thì chưa chắc ta đã
làm được bằng hàm.
6. Tính đệ quy của chương trình con:
Một CTC trong Pascal có thể gọi về
chính nó. Một lời gọi như thế là một lời gọi đệ quy.
Ta
xét ví dụ sau: Nhập vào 1 số n và tính n!. Ta đã biết n!=1 nếu n = 0 trong
trường hợp n>=1 ta có n!=n.(n-1)!
Hàm
tính n!
Function giai_thua(n:integer):longint;
Begin
If
n = 0 then giai_thua:=1
Else
giai_thua:=n*giai_thua(n-1);
End;
- Lưu ý:
+ Khi sử dụng đệ quy phải có điều kiện
kết thúc đệ quy (trường hợp suy biến). Trong ví dụ ta xét điều kiện kết thúc đệ
quy chính là n = 0. Nếu không có điều kiện kết thúc này chương trình của ta sẽ
lặp vô hạn.
+ Luôn có lời gọi đệ quy, trong trường
hợp trên là lời gọi giai_thua(n-1);
Post a Comment