Bài 18: Ví dụ về cách viết và sử dụng chương trình con
1. Cách viết và sử dụng thủ tục
a. Cấu trúc của thủ tục
Procedure [ < danh sách tham số > ];
[ < phần khai báo > ]
Begin
[ < dãy các lệnh > ]
End;
Trong đó:
- Phần đầu thủ tục: gồm tên Procedure và tên thủ tục, danh sách tham số (nếu có).
- Phần khai báo: xác định các hằng, kiểu, biến và xác định các chương trình con khác được sử dụng trong thủ tục.
- Dãy câu lệnh: viết giữa cặp tên dành riêng Begin và End.
Một số lưu ý:
- Sau tên dành riêng End kết thúc chương trình chính là dấu chấm (.) còn sau End kết thúc thủ tục là dấu chấm phẩy (;).
- Các thủ tục, nếu có, phải được khai báo và mô tả trong phần khai báo của chương trình chính, ngay sau phần khai báo biến.
- Khi cần thực hiện, ta phải viết lệnh gọi thủ tục tương tự như các thủ tục chuẩn.
b. Ví dụ về thủ tục
Ví dụ 1: Lập chương trình cho phép vẽ nhiều hình chữ nhật với kích thước khác nhau.
Gợi ý làm bài:
- Để vẽ được hình chữ nhật với kích thước khác nhau, cần có hai tham số cho dữ liệu vào là chiều dài và chiều rộng.
- Phần đầu thủ tục được viết như sau: Procedure Ve_Hcn (chdai, chrong: integer);
- Thủ tục Ve_Hcn vẽ hình chữ nhật với kích thước tùy ý theo giá trị của tham số chdai và chrong. Với chdai và chrong là nguyên dương.
Chương trình mẫu:
Program VD_hcn;
Uses crt;
Var a,b,i:integer; {bien toan cuc}
Procedure Ve_Hcn(chdai,chrong:integer); {Bat dau CTC}
Var i, j: integer; {bien cuc bo}
Begin
{ve canh tren hinh chu nhat}
For i:=1 to chdai do write(‘*’);
Writeln;
For j:=1 to chrong -2 do {ve 2 canh ben}
Begin
Write(‘*’);
For i:=1 to chdai – 2 do write(‘ ’);{ve khoang trang}
Writeln(‘*’);
End;
{ve canh duoi}
For i:=1 to chdai do write(‘*’);
Writeln;
End; {Ket thuc CTC}
Begin
Clrscr;
Ve_Hcn(25,10); {ve hinh chu nhat 25x10}
Writeln; {cach 1 dong}
Ve_Hcn(5,10); {ve hinh chu nhat 5x10}
Readln;
Clrscr;
{ve 4 hinh chu nhat hinh dau tien 4x2. Moi hinh sau co kich thuoc gap doi hinh truoc}
a:=4; b:=2;
for i:=1 to 4 do
begin
Ve_Hcn(a,b);
readln;
a:=a*2; b:=b*2;
end;
End.
c. Một số khái niệm
- Tham số giá trị (tham trị): tham số hình thức được thay bằng tham số thực sự tương ứng là các giá trị cụ thể và không được khai báo sau từ khóa var.
+ Các tham số chdai, chrong của thủ tục Ve_Hcn là tham trị. Trong lệnh gọi Ve_Hcn(25,10) tham số chdai được thay bởi số nguyên 25, tham số chrong được thay bởi số nguyên 10.
- Tham số biến (tham biến): tham số hình thức được thay bằng tham số thực sự tương ứng là tên các biến và được khai báo sau từ khóa var.
+ Trong lời gọi thủ tục Ve_Hcn(a,b), tham số chdai được thay bởi giá trị hiện thời của biến a, tham số chrong được thay bởi giá trị hiện thời của biến b.
- Để phân biệt tham biến và tham trị Pascal sử dụng từ khóa Var để khai báo những tham số biến.
2. Cách viết và sử dụng hàm
a. Cấu trúc của hàm
Function < tên hàm > [ < danh sách tham số > ) ] : < kiểu dữ liệu > ;
[ < phần khai báo > ]
Begin
[ < dãy các lệnh > ]
< tên hàm > := < biểu thức >
End;
Trong đó:
- Kiểu dữ liệu chỉ có thể là kiểu dữ liệu chuẩn: integer, real, char, boolean, string.
- Khác với thủ tục, trong thân hàm cần có lệnh gán giá trị cho tên hàm: < tên hàm >:= < biểu thức >;
b. Sử dụng hàm
Ví dụ 2: Xét chương trình rút gọn một phân số, trong đó sử dụng hàm tính ước chung lớn nhất (ƯCLN) của hai số nguyên.
Chương trình mẫu:
Program Rutgon_Phanso;
Uses crt;
Var Tuso, Mauso, a: Integer; {Bien toan cuc}
Function UCLN(x, y: Integer): Integer; {Bat dau ham UCLN}
Var sodu: Integer; {Bien cuc bo}
Begin
while y <> 0 do
begin
sodu:= x mod y;
x:= y;
y:= sodu;
end;
UCLN:= x; {Gan gia tri cho ten ham}
End; {Ket thuc ham}
Begin
Clrscr;
write('Nhap vao Tu So va Mau So: '); readln(Tuso,Mauso);
a:= UCLN(Tuso,Mauso);
If a > 1 then
begin
Tuso:= Tuso div a;
Mauso:= Mauso div a;
end;
writeln(Tuso,'/', Mauso);
End.
Một số lưu ý:
- Việc sử dụng hàm hoàn toàn giống như sử dụng các hàm chuẩn.
- Lệnh gọi hàm bao gồm tên hàm và tham số thực sự tương ứng với tham số hình thức.
- Lệnh gọi hàm có thể tham gia vào một biểu thức như một toán hạng và thậm chí là tham số của lời gọi hàm, thủ tục khác, ví dụ: A:= 6*UCLN(Tuso,Mauso);
Bài tập 1
Viết chương trình con để tính n! = 1.2...n.
Gợi ý giải:
Vì bài toán này trả về 1 giá trị duy nhất nên ta dùng hàm.
Function GiaiThua(n:Integer) : Integer;
Var P, i: Integer;
Begin
P:=1;
For i:=1 To n Do
P:=P*i;
GiaiThua:=P;
End;
Bài tập 2
Viết chương trình con để tìm điểm đối xứng của điểm (x,y) qua gốc tọa độ.
Gợi ý giải:
Vì bài toán này trả về tọa độ điểm đối xứng (xx,yy) gồm 2 giá trị nên ta dùng thủ tục.
Procedure DoiXung(x,y:Integer; Var xx,yy:Integer);
Begin
xx:=-x;
yy:=-y;
End;
Nhận xét 2 ví dụ trên:
- n, x, y được gọi là tham trị (không có từ khóa var đứng trước) vì sau khi ra khỏi chương trình con giá trị của nó không bị thay đổi.
- xx, yy được gọi là tham biến (có từ khóa var đứng trước) vì sau khi ra khỏi chương trình con giá trị của nó bị thay đổi.
1. Cách viết và sử dụng thủ tục
a. Cấu trúc của thủ tục
Procedure [ < danh sách tham số > ];
[ < phần khai báo > ]
Begin
[ < dãy các lệnh > ]
End;
Trong đó:
- Phần đầu thủ tục: gồm tên Procedure và tên thủ tục, danh sách tham số (nếu có).
- Phần khai báo: xác định các hằng, kiểu, biến và xác định các chương trình con khác được sử dụng trong thủ tục.
- Dãy câu lệnh: viết giữa cặp tên dành riêng Begin và End.
Một số lưu ý:
- Sau tên dành riêng End kết thúc chương trình chính là dấu chấm (.) còn sau End kết thúc thủ tục là dấu chấm phẩy (;).
- Các thủ tục, nếu có, phải được khai báo và mô tả trong phần khai báo của chương trình chính, ngay sau phần khai báo biến.
- Khi cần thực hiện, ta phải viết lệnh gọi thủ tục tương tự như các thủ tục chuẩn.
b. Ví dụ về thủ tục
Ví dụ 1: Lập chương trình cho phép vẽ nhiều hình chữ nhật với kích thước khác nhau.
Gợi ý làm bài:
- Để vẽ được hình chữ nhật với kích thước khác nhau, cần có hai tham số cho dữ liệu vào là chiều dài và chiều rộng.
- Phần đầu thủ tục được viết như sau: Procedure Ve_Hcn (chdai, chrong: integer);
- Thủ tục Ve_Hcn vẽ hình chữ nhật với kích thước tùy ý theo giá trị của tham số chdai và chrong. Với chdai và chrong là nguyên dương.
Chương trình mẫu:
Program VD_hcn;
Uses crt;
Var a,b,i:integer; {bien toan cuc}
Procedure Ve_Hcn(chdai,chrong:integer); {Bat dau CTC}
Var i, j: integer; {bien cuc bo}
Begin
{ve canh tren hinh chu nhat}
For i:=1 to chdai do write(‘*’);
Writeln;
For j:=1 to chrong -2 do {ve 2 canh ben}
Begin
Write(‘*’);
For i:=1 to chdai – 2 do write(‘ ’);{ve khoang trang}
Writeln(‘*’);
End;
{ve canh duoi}
For i:=1 to chdai do write(‘*’);
Writeln;
End; {Ket thuc CTC}
Begin
Clrscr;
Ve_Hcn(25,10); {ve hinh chu nhat 25x10}
Writeln; {cach 1 dong}
Ve_Hcn(5,10); {ve hinh chu nhat 5x10}
Readln;
Clrscr;
{ve 4 hinh chu nhat hinh dau tien 4x2. Moi hinh sau co kich thuoc gap doi hinh truoc}
a:=4; b:=2;
for i:=1 to 4 do
begin
Ve_Hcn(a,b);
readln;
a:=a*2; b:=b*2;
end;
End.
c. Một số khái niệm
- Tham số giá trị (tham trị): tham số hình thức được thay bằng tham số thực sự tương ứng là các giá trị cụ thể và không được khai báo sau từ khóa var.
+ Các tham số chdai, chrong của thủ tục Ve_Hcn là tham trị. Trong lệnh gọi Ve_Hcn(25,10) tham số chdai được thay bởi số nguyên 25, tham số chrong được thay bởi số nguyên 10.
- Tham số biến (tham biến): tham số hình thức được thay bằng tham số thực sự tương ứng là tên các biến và được khai báo sau từ khóa var.
+ Trong lời gọi thủ tục Ve_Hcn(a,b), tham số chdai được thay bởi giá trị hiện thời của biến a, tham số chrong được thay bởi giá trị hiện thời của biến b.
- Để phân biệt tham biến và tham trị Pascal sử dụng từ khóa Var để khai báo những tham số biến.
2. Cách viết và sử dụng hàm
a. Cấu trúc của hàm
Function < tên hàm > [ < danh sách tham số > ) ] : < kiểu dữ liệu > ;
[ < phần khai báo > ]
Begin
[ < dãy các lệnh > ]
< tên hàm > := < biểu thức >
End;
Trong đó:
- Kiểu dữ liệu chỉ có thể là kiểu dữ liệu chuẩn: integer, real, char, boolean, string.
- Khác với thủ tục, trong thân hàm cần có lệnh gán giá trị cho tên hàm: < tên hàm >:= < biểu thức >;
b. Sử dụng hàm
Ví dụ 2: Xét chương trình rút gọn một phân số, trong đó sử dụng hàm tính ước chung lớn nhất (ƯCLN) của hai số nguyên.
Chương trình mẫu:
Program Rutgon_Phanso;
Uses crt;
Var Tuso, Mauso, a: Integer; {Bien toan cuc}
Function UCLN(x, y: Integer): Integer; {Bat dau ham UCLN}
Var sodu: Integer; {Bien cuc bo}
Begin
while y <> 0 do
begin
sodu:= x mod y;
x:= y;
y:= sodu;
end;
UCLN:= x; {Gan gia tri cho ten ham}
End; {Ket thuc ham}
Begin
Clrscr;
write('Nhap vao Tu So va Mau So: '); readln(Tuso,Mauso);
a:= UCLN(Tuso,Mauso);
If a > 1 then
begin
Tuso:= Tuso div a;
Mauso:= Mauso div a;
end;
writeln(Tuso,'/', Mauso);
End.
Một số lưu ý:
- Việc sử dụng hàm hoàn toàn giống như sử dụng các hàm chuẩn.
- Lệnh gọi hàm bao gồm tên hàm và tham số thực sự tương ứng với tham số hình thức.
- Lệnh gọi hàm có thể tham gia vào một biểu thức như một toán hạng và thậm chí là tham số của lời gọi hàm, thủ tục khác, ví dụ: A:= 6*UCLN(Tuso,Mauso);
Bài tập 1
Viết chương trình con để tính n! = 1.2...n.
Gợi ý giải:
Vì bài toán này trả về 1 giá trị duy nhất nên ta dùng hàm.
Function GiaiThua(n:Integer) : Integer;
Var P, i: Integer;
Begin
P:=1;
For i:=1 To n Do
P:=P*i;
GiaiThua:=P;
End;
Bài tập 2
Viết chương trình con để tìm điểm đối xứng của điểm (x,y) qua gốc tọa độ.
Gợi ý giải:
Vì bài toán này trả về tọa độ điểm đối xứng (xx,yy) gồm 2 giá trị nên ta dùng thủ tục.
Procedure DoiXung(x,y:Integer; Var xx,yy:Integer);
Begin
xx:=-x;
yy:=-y;
End;
Nhận xét 2 ví dụ trên:
- n, x, y được gọi là tham trị (không có từ khóa var đứng trước) vì sau khi ra khỏi chương trình con giá trị của nó không bị thay đổi.
- xx, yy được gọi là tham biến (có từ khóa var đứng trước) vì sau khi ra khỏi chương trình con giá trị của nó bị thay đổi.