Lý thuyết Phần Chương trình
Thứ Bảy, 14 tháng 3, 2015
Chương trình con gồm 2 loại Hàm(Function) và thủ tục(Procedure)
Sự khác nhau cơ bản và duy nhất của hai loại chương trình con này là Function trả lại giá trị qua tên của function và do đó nó được sử dụng trong một biểu thức. còn Procedure không trả lại kết quả thông qua tên của nó nên không thể viết trong các biểu thức.
Ví dụ: chương trình con tính sin(x) thuộc loại Function, writeln,readln là các thủ tục
CẤU TRÚC MỘT CHƯƠNG TRÌNH PASCAL CHUẨN CÓ THỨ TỰ NHƯ SAU
PROGRAM Tên_chương_trình;
CONST
.................{Khai báo hằng};
TYPE
.................{Khai báo kiểu cấu trúc dữ liệu};
VAR
.................{Khai báo biến};
{--------------Các chương trình con---------------------}
PROCEDERE Tên_thủ_tuc(Danh sách tham số(nếu có));
{Khai báo const, type, và của riêng procedure nếu cần}
...................
BEGIN
....................{Thân chương trình con}
END;
FUNCTION Tên_hàm(Danh sách tham số(nếu có)):kiểu_dữ_liệu;
{Khai báo const, type, và của riêng procedure nếu cần}
...................
BEGIN
.....................{Thân chương trình con}
Tên_hàm:=Biểu thức;
END;
{.................Thân chương trình chính.................}
BEGIN
.........................
END.
Ví dụ minh họa
Program vidu;
var a,b,c,s:real;
{------------------------------}
Procedure nhap(var x,y,z:Real);
Begin
Write('nhap 3 canh tam giac:');
Readln(x,y,z);
End;
{------------------------------}
Function dientich(x,y,z:real): Real;
Var p:real;
Begin
P:=(x+y+z)/2;
dientich:=sqrt(p*(p-x)*(p-y)*(p-z));
end;
{------------------------------}
BEGIN
nhap(a,b,c); {gọi lại CTC}
s:=dientich(a,b,c); {gọi lại CTC}
Write('dien tich tam giac=',s:8:3);
Readln
end.
* Truyền tham số cho chương trình con
Tham số dùng ở đầu các chương trình con gọi là tham số hình thức(là các giá trị đại diện cho các biến vào/ra trong chương trình)
Function dientich(x,y,z:real): Real;
Procedure nhap(var x,y,z:Real);
x,y,z là các tham số hình thức
còn ở trong chương trình chính khi nào ta muốn sử dụng chương trình con thì ta phải truyền tham số thực sự cho nó tương ứng với tham số hình thức:
ví dụ: dientich(a,b,c); nhap(a,b,c); thig a,b,c là các tham số thực sự.
Ở ví dụ trên sử dụng cả Hàm (Function) và Thủ tục (Procedure) nhưng ở phần tham số của 2 chương trình con này có điều đặc biệt. VớiProcedure thì khai báo var x,y,z:Real còn với Function thi khai báo x,y,z:real
Tại sao lại có sự khác nhau như vậy???
- Đối với tham số trong chương trình con được chia làm 2 loại là tham số giá trị và tham số biến. Hiểu một cách đơn giản tham số giá trị là tham số không thay đổi giá trị khi kết thúc chương trình con còn tham số biến là tham số có thể thay đổi giá trị khi kết thúc chương trình con.
- ở ví dụ trên Procedure nhap(var x,y,z:Real); x,y,z là tham số biến
Function dientich(x,y,z:real): Real; x,y,z là tham số giá trị
- Để phân biệt tham số giá trị và tham số biến người ta dùng từ khóa Var khai báo tham số biến.
* Phân tích ví dụ trên với
Procedure nhap(var x,y,z:Real);
ban đầu x,y,z chưa có giá trị
sau khi thực hiện lệnh
Begin
Write('nhap 3 canh tam giac:');
Readln(x,y,z);
End;
Giá trị x,y,z thay đổi bằng dữ liệu được nhập từ bàn phím
vậy x,y,z đã thay đổi giá trị do đó nó phải là tham số biến(Tham biến)
Function dientich(x,y,z:real):real;
Với đầu vào là x,y,z và đầu ra là dientich:=sqrt(p*(p-x)*(p-y)*(p-z));
không có phép toán nào làm thay đổi giá trị của x,y,z nên nó là tham số giá trị(Tham trị)
* Khi nào thì dùng tham số biến???
Với những tham số mà khi kết thúc chương trình con mà ta vẫn còn dùng đến nó sau khi thực hiện một số phép biến đổi(có thể thay đổi giá trị). Thông thường ta dùng trong các thủ tục còn với hàm thì giá trị trả về qua tên hàm vì thế ta ít quan tâm đến tham số có thay đổi hay không?
* Khi nào thì nên dùng chương trình con
- Khi chương trình quá dài
- Có nhiều đoạn lệnh lặp lại
- Không thể xử lí nếu không chia nhỏ bài toán thành nhiều phần (chia để trị)
* Khi nào thì dùng Procedure và khi nào thì dùng Function??
- Chương trình con là Function khi phải thỏa mãn yêu cầu
+ Nếu ta muốn nhận lại 1 và chỉ một kết quả
+ Kết quả phải là kiểu vô hướng.(kiểu vô hướng là kiểu dữ liệu gồm một tập các giá trị của nó sắp xếp theo một thứ tự tuyến tính:
số nguyên, số thực, kí tự, logic)
số nguyên, số thực, kí tự, logic)
+ Có cần tên chương trình con(chứa kết quả) để viết trong biểu thức không?
Nếu không thỏa mãn yêu cầu trên thì nó là Procedure
Xét ví dụ sau:
Để tính bình phương 1 số
- nếu dùng function ta có
Function binh_phuong(x:real):real;
begin
binh_phuong:=x*x;
end;
- nếu dùng Procedure, ta có
Procedure binh_phuong(x:real; var x2:real);
begin
x2:=x*x;
end;
Trong 2 trường hợp ta đều phải có tham trị x
với Function tên hàm đóng vai trò là biến chứa giá trị
còn với thủ tục ta phải khai báo tham biến x2 để chứa giá trị của phép toán bình
phương. Hãy xem để tính c=a2+b2 của 2 trường hợp trên
với Function
c:= binh_phuong(a)+binhphuong(b);
Với Procedure
binh_phuong(a,z); c:=z; {c:=a2}
binh_phuong(b,z); c:=c+z; {c:=a2+b2}
Vậy ta thấy rằng Function lợi hơn trong trường hợp này
Bài liên quan
Home
Comments[ 0 ]
Đăng nhận xét