CHƯƠNG TRÌNH CON
0 Chương IV: KHÁI NIỆM VỀ Trong chương trình, có những đ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 phải viết lại các đoạn đó người ta thường phân ...
Chương IV:
- KHÁI NIỆM VỀ
Trong chương trình, có những đ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 phải viết lại các đoạn đó người ta thường phân chương trình ra thành nhiều module, mỗi module giải quyết một công việc nào đó, các module như vậy là những chương trình con (subprogram).
Một tiện lợi khác của việc sử dụng module 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.
Trong Pascal chương trình con được viết dưới dạng hàm (FUNCTION) hoặc thủ tục (PROCEDURE). Hàm và thủ tục đều là những chương trình con, nhưng 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. Do đó ta chỉ dùng hàm
- Ta muốn nhận một kết quả và chỉ một mà thôi.
- Ta cần dùng tên chương trình con (chứa kết quả đó) để viết trong các biểu thức.
Nếu không thỏa hai yêu cầu trên thì ta dùng thủ tục.
Borland Pascal thiết kế và cài đặt sẵn trong các Unit đi gèm theo gói phần mềm nhiều thủ tục và hàm rất tiện dùng. Muốn sử dụng các thủ tục hoặc hàm trong Unit nào ta chỉ cần khai báo tên Unit đó trong câu lệnh USES. Tuy nhiên phần lớn các thủ tục và hàm dùng trong chương trình là do người dùng phải tự viết.
- HÀM (FUNCTION)
Hàm là một chương trình con tính toán trả về cho ta một giá trị kiểu vô hướng. Cấu trúc hàm như sau:
FUNCTION <Tên hàm>[(<Th.số>:<Kiểu>[;<Th.số>: <Kiểu>])]: <KiểuKQ>; | (Header) |
[VAR <Biến>:<Kiểu>[;<Biến>: <Kiểu>]] | Khai báo các biến cục bộ nếu có. |
BEGIN <các câu lệnh>END; | Thân hàm |
- Tên hàm là một danh biểu, phải tuân thủ theo qui tắc đặt danh biểu đã đề cập ở chương I.
- Một hàm có thể không có hoặc có một hoặc nhiều tham số. Trong trường hợp có nhiều tham số có cùng một kiểu dữ liệu thì ta có thể viết chúng cách nhau bởi dấu , (phẩy). Ngược lại, các tham số hình thức khác kiểu nhau thì phải cách nhau dấu ; (chấm phẩy).
- KiểuKQ là một kiểu vô hướng, nó phản ảnh kiểu của giá trị mà hàm trả về lại sau khi chạy xong. Ví dụ, ta khai báo hàm như sau:
FUNCTION TEST(x,y:Integer; z:Real): Real;
Đây là một hàm có tên là TEST, với 3 tham số, x và y thuộc kiểu Integer, z thuộc kiểu real, hàm trả về một kết quả kiểu real.
- Trong hàm, ta có thể sử dụng các hằng, kiểu, biến dùng riêng trong nội bộ hàm.
- Thông thường mục đích sử dụng hàm là để lấy trị trả về do đó cần lưu ý gán kết quả cho tên hàm trong thân hàm.
Ví dụ 1: Ta xây dựng hàm DT truyền tham số vào là bán kính của hình tròn, hàm này sẽ trả về diện tích của hình tròn đó.
Program TinhDienTich;
Uses Crt;
VAR BanKinh: real; Phép gán để trả về giá trị cho tên hàm. Ch: Char;
{--------------------------------------------}
Function DT(Radius:Real):Real;
Begin
DT := PI * Radius* Radius;
End;
{--------------------------------------------}
Begin
Clrscr;
Repeat
Write(‘Nhập bán kính: ’); Readln(BanKinh);
Writeln(‘Diện tích hinh tron tuong ung: ‘ ,DT(Bankinh):0:2);
Writeln;
Write(‘Tiếp tục (C/K)? ’);
Repeat
ch:=readkey;
Until Upcase(ch) in [‘C’,’K’];
Until UpCase(Ch) = ‘K’; {Lưu ý: ‘K’ in hoa}
End.
Ví dụ 2:
Program TinhGiaithua;
USES CRT;
Var Num:longint; Ch:char; X,Y:byte;
{---------------------------------------------}
Function GiaiThua(m: longint): longint;
Var Tam, Dem:Longint;
BEGIN
IF (M<0) THEN
Begin
Write(‘Khong tinh duoc’); HALT(1);
End
ELSE
Begin
Tam:=1;
For Dem:=1 to m do Tam:=Tam*Dem;
GiaiThua:=Tam;
End;
END;
{-------------- Chương trình chính -------------------------}
BEGIN
Writeln(‘CHUONG TRINH TINH GIAI THUA.’);
REPEAT
Write(‘Cho so nguyen muon tinh giai thua. M= ‘);
X:=WhereX; Y:=WhereY;
REPEAT
Gotoxy(X,Y); CLREOL; Readln(Num);
UNTIL (Num>=0);
Writeln(M,’! = ’,GiaiThua(Num));
REPEAT
Write(‘Tinh nua khong ? (C/K) :’); CH:=READKEY;
UNTIL Upcase(Ch) in [‘C’,’K’];
Writeln(Ch);
UNTIL Upcase(Ch)=’K’;
Readln
END.
- THỦ TỤC (PROCEDURE)
Cấu trúc của một thủ tục như sau:
PROCEDURE <Tên>(<Th.số>:<Kiểu>[;<Th.số>: <Kiểu>]): <Kiểu>; | (Header) |
[VAR <Biến>:<Kiểu>[;<Biến>: <Kiểu>] | Khai báo các biến cục bộ nếu có. |
BEGIN <các câu lệnh>END; | Thân thủ tục. |
Như vậy cấu trúc của một thủ tục cũng tương tự như cấu trúc của một hàm. Chỉ có hai điều