- Các mục viết trong cặp dấu [] có thể có hoặc không tùy theo yêu cầu của thủ tục
- Các khai báo được khai báo (nếu cần) theo cú pháp như ngoài chương trình chính.
- Nếu khai báo thủ tục không có các tham số hình thức thì ta được thủ tục không tham số, còn nếu có ta gọi là thủ tục có tham số.
Ví dụ 8.2: Viết chương trình nhập vào 3 số thực a, b, c. Tìm và in lên màn hình số nhỏ nhất trong 3 số đó?
- Thủ tục min_abc được khai báo và triển khai đầy đủ trước khi nó được truy xuất,
- Các biến a, b, c được khai báo là biến toàn cục và được nhập ở chương trình chính, biến min được khai báo là biến địa phương trong thủ tục.
8.2.2. Hàm (function)
Hàm là một chương trình con thực hiện một nhiệm vụ nào đó và trả lại giá trị thông qua tên hàm.
Cấu trúc một hàm như sau:
Function [(danh sách các tham số hình thức)]:;
End;
Trong đó:
- Các mục viết trong cặp dấu [] có thể có hoặc không tùy theo yêu cầu của hàm
- Nếu khai báo hàm không có các tham số hình thức thì ta được hàm không tham số, còn nếu có ta gọi là hàm có tham số.
Ví dụ 8.3: Viết chương trình nhập vào 3 số thực a, b, c. Tìm và in lên màn hình số nhỏ nhất trong 3 số đó?
Program min_a_b_c;
Var a,b,c: real;
function min(a,b,c:real): real;
var m:real;
begin
m:=a;
if m>b then m:=b;
if m>c then m:=c;
min:=m;
end;
Begin
write(' Nhap a = ');readln(a);
write(' Nhap b = ');readln(b);
write(' Nhap c = ');readln(c);
writeln(‘min= ‘,min(a,b,c):8:2);
readln;
End.
|
{Khai báo các biến toàn cục}
{Khái báo tiêu đề hàm}
{m là biến địa phương}
{lệnh gán giá trị thông qua tên hàm}
{Bắt đầu chương trình chính}
{Lời gọi hàm}
|
*Chú ý:
- Hàm cũng tương tự như thủ tục nhưng trong chương trình con hàm cần có ít nhất một câu lệnh gán giá trị tính được cho tên hàm:
:=
Giá trị hay biểu thức mà được gán cho hàm cần phải có kiểu dữ liệu cùng kiểu với của hàm đó.
8.3. Biến toàn cục và biến địa phương
Với việc sử dụng chương trình con, một chương trình lớn có thể được chia thành nhiều chương trình con nhỏ khác nhau. Chương trình con này có thể lại là chương trình con trực tiếp của chương trình chính và cũng có thể là chương trình con của chương trình con khác. Khai báo các biến ở những vị trí khác nhau sẽ cho ta các biến làm việc trong những phạm vi, quy định khác nhau.
Những biến được khai báo trong chương trình chính được dùng trong toàn bộ khối chương trình và các khối con của nó được gọi là biến toàn cục (biến chung). Những biến được khai báo trong chương trình con và chỉ được sử dụng trong chương trình con đó và các chương trình con của nó thì được gọi là biến địa phương (biến riêng). Khái niệm biến địa phương hay toàn cục có tích chất tương đối: một biến là toàn cục của chương trình con này nhưng lại là biến địa phương của các chương trình con khác.
Việc cấp phát bộ nhớ cho các biến thuộc các chương trình khác nhau là độc lập, hai đối tượng ở hai chương trình con khác nhau có thể trùng tên nhau, chúng sẽ được cấp phát ở những vùng nhớ khác nhau. Điều này đảm bảo tính độc lập và toàn vẹn dữ liệu khi xây dựng chương trình. Ta xét ví dụ dưới đây:
Ví dụ 8.4:
Program vidu_8_4;
Var t,k: integer;
Procedure test;
Var t: integer;
Begin
k:=k+5;
t:=t+5;
End;
Begin
k:=5; t:=5;
writeln(‘k=‘,k,’va t = ‘,t);
test;
writeln(‘k=‘,k,’va t = ‘,t);
readln;
End.
|
{Khai báo biến của chương trình chính: 2 biến t, k là hai biến toàn chương trình chính}
{Khai báo biến của chương trình con: t là biến riêng của thủ tục test;}
{In ra giá trị k = 5 và t = 5}
{Lời gọi thủ tục test}
{In ra màn hình k = 10 và t = 5}
|
Nhận xét:
Trong chương trình trên mặc dù k, t đều cùng nhận giá trị ban đầu là 5 và cùng thực hiện cộng thêm 5 trong chương trình con. Tuy nhiên kết quả in ra màn hình chỉ có biến k nhận giá trị mới là 10 còn biến t vẫn nhận giá trị là 5. Trong chương trình này thì thủ tục test không làm ảnh hưởng gì đến sự thay đổi giá trị của biến toàn cục. Vì trong chương trình con cũng được khai báo một biến địa phương cùng tên t, nên khi gọi tới chương trình con thực hiện thì biến địa phương được ưu tiên.
Trong một chương trình có biến địa phương và biến toàn cục cùng tên thì khi gọi chương trình con biến địa phương của chương trình con đó sẽ được cấp phát một vùng nhớ khác và thực hiện các lệnh trong chương trình con đối với biến này trên vùng nhớ mới mà không tác động gì đến biến toàn cục cùng tên nên không bị thay đổi bởi chương trình con. Khi thoát khỏi chương trình con thì vùng nhớ của biến địa phương đó sẽ được giải phóng ngay, và khi trở lại chương trình chính thì chương trình dịch lại làm việc với biến toàn cục.
Khi viết các chương trình có chương trình con cần chú ý đặc biệt đến việc khai báo biến toàn cục và địa phương. Việc này tuy khó xác định đối với các bạn mới học song nó lại rất có lợi:
- Hạn chế thói quen lập trình tùy tiện,
- Nâng cao tính ổn định của chương trình
- Hạn chế những lỗi logic tiềm ẩn chưa được phát hiện
- Dễ sửa chữa hoặc phát triển chương trình đặc biệt là với các chương trình lớn, cần nhiều người tham gia.
Xét ví dụ dưới đây:
Ví dụ 8.5: Viết chương trình nhập vào 2 xâu st1, st. Kiểm tra xem bao nhiêu ký tự trong xâu st1 xuất hiện trong xâu st.
Program vidu_8_5;
var st1,st: xau50;
i,j:byte;
function timthay(c: char; st:xau50): boolean;
(*)
begin
timthay:=false;
i:=1;
while (i<=length(st))and(c<>st[i]) do
i:=i+1;
timthay:=i<=length(st);
end;
begin
write(' Nhap xau st = ');readln(st);
write(' Nhap xau st1= ');readln(st1);
j:=0;
for i:=1 to length(st1) do
if timthay(st1[i],st) then
j:=j+1;
writeln(' So ky tu cua xau ',st1,' tim thay
trong xau ',st,' la: ',j);
readln;
end.
Nhận xét: Chương trình này chạy cho kết quả ko chính xác. Vì biến i được sử trong hàm là biến i toàn cục của chương trình chính nên nó sẽ bị thay đổi giá trị. Hơn nữa biến i lại là biến điều khiển của vòng lặp for trong chương trình chính. Vì vậy sẽ làm cho vòng for không xác định được.
Để xửa lỗi ta bổ xung khai báo biến I là biến địa phương của hàm timthay tại vị trí (*).
8.4. Truyền tham số cho chương trình con
8.4.1. Vai trò của tham số
- Các tham số hình thức trong phần khai báo tiêu đề chương trình con là công cụ để chương trình con giao tiếp với môi trường bên ngoài. Khi thực hiện chương trình con các tham số được dùng để gửi các giá trị vào để chương trình xử lý.
- Các tên tham số khai báo được dùng trong chương trình con như tên biến địa phương đã được khai báo, vì thế không được khai báo các biến riêng của chương trình con trùng với tên các tham số của nó.
- Điểm khác biệt giữa tham số và biến riêng của chương trình con là khi bắt đầu tham gia câu lệnh, các tham số chỉ có tên chứ chưa có giá trị như các biến. Chỉ khi xuất hiện lời gọi chương trình con thì các tham số mới được truyền giá trị từ bên ngoài vào và chương trình con sẽ được thực hiện với bộ giá trị đó. Cũng vì lý do đó mà chúng được gọi là tham số hình thức.
- Khi gọi chương trình con, các tham số hình thức có thể nhận bất cứ một tên biến nào khác với tên hình thức đã khai báo, chỉ cần giá trị của những tên này là tương thích kiểu với kiểu của tham số tương ứng.
- Các tên bên ngoài được truyền vào chương trình con được gọi là tham số thực vì chúng thực sự tham gia chương trình con với tư cách là một giá trị.
- Khi thực hiện lời gọi chương trình con, các tham số được truyền vào cần đảm bảo rằng việc truyền là tương ứng một-một về cả kiểu dữ liệu và thứ tự.
- Các tham số thực sự được truyền cho các tham số hình thức khi có lời gọi CTC theo hai phương thức sau:
truyền theo tham trị,
truyền theo tham biến.
Chia sẻ với bạn bè của bạn: