<< Chapter < Page Chapter >> Page >

Cách khai báo tham biến:

Tên chương trình con (Var tên tham biến: kiểu dữ liệu);

  • Tham trị:

Tham trị là những tham số truyền vào cho chương trình con xử lý nhưng khi quay về chương trình mẹ vẫn phải giữ nguyên giá trị ban đầu.

Tên chương trình con (tên tham trị: kiểu dữ liệu);

  • Truyền tham số cho chương trình con:

Khi tham số hình thức trong chương trình con là tham biến thì tham số thực trong chương trình mẹ phải là biến chứ không thể là hằng. Trong mọi trường hợp cả hai tham số thực và tham số hình thức đều phải cùng kiểu dữ liệu…(các tham biến khi ra khỏi chương trình con giá trị thay đổi).

Khi tham số hình thức là tham trị thì tham số thực phải là một giá trị.

  • Biến toàn cục và biến địa phương:
  • 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 có tác dụng ở mọi nơi trong toàn bộ chương trình.
  • Biến địa phương: là các biến được khai báo trong các chương trình con. Các biến này chỉ có tác dụng trong phạm vi chương trình con đó mà thôi.

Chú ý: Trong một chương trình con, nếu biến toàn cục trùng tên với biến địa phương thì biến địa phương được ưu tiên hơn.

 

Ví dụ 1.3:

Program  KhaoSatBien;

Var a,b: Integer;   {biến toàn cục}

 

Procedure  ThuBien;

Var  a: Integer; {biến địa phương}

Begin

    a:=10;

    Writeln(‘A=’,a,’B=’,b);

End;

       

Begin

    a:=50;

    b:=200;

    ThuBien;                         {A=10  B=200}

    Writeln(‘A=’,a,’B=’,b);      {A=50  B=200}

End.

  • Tính đệ quy của chương trình con:

Thông thường lời gọi một chương trình con chỉ được thực hiện khi chương trình con đó đã được thiết kế hoàn chỉnh. Tuy nhiên, Pascal còn cho phép một chương trình con ngay khi trong quá trình xây dựng lại có thể gọi tới chính nó, tính chất này được gọi là “Đệ quy của chương trình con”.

  • Lời gọi chương trình con:

Một chương trình mẹ có nhiều chương trình con trực thuộc, bên trong mỗi chương trình con lại có thể có các chương trình con riêng. Khi thiết kế, mỗi chương trình con phải là một khối riêng biệt hoặc có thể có các lệnh nhảy Goto từ chương trình con này tới chương trình con khác.

  • Gọi chương trình con từ trong chương trình mẹ:

Lời gọi chương trình con có thể đặt bất kỳ chỗ nào trong chương trình mẹ. Nếu chương trình con là một thủ tục thì lời gọi chương trình con có thể tạo nên một câu lệnh, ví dụ:

Readln;

Nếu chương trình con là hàm thì tên hàm không thể tạo nên một câu lệnh, vì vậy tên hàm phải nằm trong một biểu thức hay trong một thủ tục nào đó. Ví dụ, ta không thể viết:

Sqrt(9);

gọi hàm như sau là hợp lệ: a:=sqrt(9)+5;

  • Gọi chương trình con từ chương trình con khác:

Các chương trình con cùng cấp có thể gọi tới nhau và truyền tham số cho nhau. Nguyên tắc gọi là: những chương trình con xây dựng sau có thể gọi tới các chương trình con đã xây dựng trước nó, đồng thời các chương trình con cấp dưới cũng có thể gọi tới các chương trình con cấp trên nếu chúng cùng một gốc. Các chương trình con xây dựng trước muốn gọi tới các chương trình con xây dựng sau thì phải có chỉ báo forward.

Xét một số ví dụ sau:

Ví dụ 1.4

Program Goi_CTC;

Type dayso=array[1..60] of byte; S1:=string[30];

Var

a:s1; b:dayso; i,j,n:byte;

Procedure nhapso(m:byte; var c:dayso);

Begin

For i:=1 to m do

begin

Write(‘c[‘,i.’]=’); readln(c[i]);

End;

End;

Function tinhtong(m:byte; var d:dayso):real;

Var tong:real;

Begin

tong:=0;

For i:=1 to m do tong:=tong+d[i];

Tinhtong:=tong;

End;

Procedure Inkq(k:byte; e: dayso);

Begin

Write(‘tong cac ptu =’,tinhtong(k,e):8:0); {chương trình con gọi một chương trình con cùng cấp}

Readln;

End;

BEGIN

Write(‘nhap so ptu n’); readln(n);

Nhapso(n,b);

Inkq(n,b);

End.

Nếu hàm tinhtong xây dựng sau thủ tục Inkq, thì phải có chỉ báo forward.

Thêm dòng: Function tinhtong(m:byte; var d:dayso):real; forward; trước khi xây dựng các chương trình con.

Ví dụ 1.5

Program Goi_CTC;

Type dayso=array[1..60] of byte; S1:=string[30];

Var

a:s1; b:dayso; i,j,n:byte;

Procedure nhapso(m:byte; var c:dayso);

Begin

End;

Function tinhtong(m:byte; var d:dayso):real;

Var tong:real;

Begin

End;

Procedure xuly(j:byte;ds:dayso);

Procedure Inkq(k:byte;e:dayso);

Var i:byte;

Begin

Writeln(‘tong cac phan tu mang=’,tinhtong(k,e):8:0;

Writeln (‘day so sap xep giam dan’);

For i:=1 to k do write(e[i],’ ‘);

Readln;

End; {ket thuc thu tuc Inkq}

Procedure sapxep(m:byte;ds:dayso);

Var p,q:byte; tg:byte;

Begin

For p:=1 to m-1 do

For q:=p+1 to m do

If(d[p]<d[q] then

Begin

Tg:=d[p];

d[p]:=d[q];

d[q]:=tg;

end;

inkq(m,d); {goi den chuong trinh con cùng cấp}

end; {ket thuc thu tuc sap xep}

Begin {than thu tuc Xuly}

Write(‘thu tuc xu ly dung de sap xep va in ket qua}

Sapxep(j,ds);

End;

BEGIN

Write(‘nhap so phan tu’); readln(n);

Nhapso(n,b);

Xuly(n,b);

END.

Bài tập:

Tính C n k = n ! k ! ( n k ) ! size 12{C rSub { size 8{n} } rSup { size 8{k} } = { {n!} over {k! \( n - k \) !} } } {}

(có sử dụng chương trình con)

Get Jobilize Job Search Mobile App in your pocket Now!

Get it on Google Play Download on the App Store Now




Source:  OpenStax, Lập trình nâng cao. OpenStax CNX. Sep 19, 2008 Download for free at http://cnx.org/content/col10576/1.2
Google Play and the Google Play logo are trademarks of Google Inc.

Notification Switch

Would you like to follow the 'Lập trình nâng cao' conversation and receive update notifications?

Ask