24/05/2018, 14:24

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 ...

0

Chương IV:

  1. 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

Đối với Borland Pascal 7.0 điều này không còn bắt buộc vì ta có thể gọi hàm như gọi một thủ tục. Không nhất thiết phải lấy giá trị trả về. Để thực hiện được điều này trong menu Options >Compiler cần khai báo cú pháp mở rộng (eXtended syntax), hoặc trong chương trình cần có dẫn hướng biên dịch {$ X+}. Nếu không, khi biên dịch (gõ F9) Pascal sẽ thông báo lỗi “Error 122: Invalid variable reference”. Tuy vậy, dù không có dẫn hướng biên dịch {$ X+}, khi gõ CTRL+F9 chương trình vẫn chạy như thường! Ví dụ:{$X+}Program TestExtendSyntax;uses crt;var i,j:byte;{-------------}Function DoiViTri(i,j: byte):byte;Var Tam:byte;BEGINTam:=i; i:=j; j:=tam;Gotoxy(i,j); write('*')END;{--------------}BEGINi:=5; j:=20;Gotoxy(i,j); write('*');Doivitri(i,j);readln;END.
khi thoả mãn các yêu cầu sau.
  • 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.

  1. 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.

  1. 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

0