Bài 17: Chương trình con và phân loại
1. Khái niệm chương trình con
a. Khái niệm:
Để viết chương trình giải các bài toán lớn, phức tạp người lập trình có thể chia thành nhiều bài toán nhỏ, mỗi bài toán là một dãy lệnh mô tả một số thao tác nhất định (gọi là chương trình con). Sau đó ghép nối các chương trình con thành chương trình chính.
Chương trình con là dãy các lệnh mô tả một số thao tác nhất định và có thể được thực hiện từ nhiều vị trí trong chương trình.
b. Lợi ích của việc sử dụng chương trình con
- Tránh được việc phải lặp đi lặp lại cùng một dãy lệnh.
- Hỗ trợ việc thực hiện các chương trình lớn.
- Phục vụ cho quá trình trừu tựng hĩa.
- Mở rộng khả năng ngơn ngữ.
- Thuận tiện cho việc phát triển nâng cấp chương trình.
2. Phân loại và cấu trúc chương trình con
a. Phân loại
Trong nhiều ngôn ngữ lập trình, chương trình con thường gồm hai loại:
- Hàm (Function): Là chương trình con thực hiện một số thao tác nào đó, và trả về một giá trị qua tên của nó.
Ví dụ 1:
+ sin(x) nhận vào giá trị thực x và trả về giá trị sinx,
+ sqrt(x) nhận vào giá trị x trả về giá trị căn bậc hai của x,
+ length(x) nhận vào xâu x và trả về độ dài của xâu x,...
- Thủ tục (Procedure): Là chương trình con thực hiện một số thao tác nào đó, và không trả về giá trị nào qua tên của nó.
Ví dụ 2: các thủ tục vào/ra chuẩn hay thủ tục xử lí xâu: writeln, readln, delete,…
b. Cấu trúc chương trình con
< phần đầu >
[< phần khai báo >]
< phần thân >
- Phần đầu: Cấu trúc chương trình con tương tự chương trình chính, nhưng nhất thiết phải có phần đầu để khai báo tên, nếu là Hàm thì phải có khai báo kiểu dữ liệu trả về.
- Phần khai báo: Có thể khai báo cho dữ liệu vào và ra, các hằng được sử dụng trong chương trình con.
- Phần thân: Là các dãy lệnh được thưc hiện trong chương trình con từ dữ liệu vào và được kết quả như mong muốn. Phần này luôn nằm giữa 2 từ khoá là Begin và End. Ở giữa là các thao tác cần thực hiện. Sau từ khóa End là dấu chấm phẩy (;).
Một số lưu ý:
- Một chương trình con có thể có hoặc không có tham số hình thức, có thể có hoặc không có biến cục bộ.
+ Tham số hình thức: Là tham số được đưa vào khi định nghĩa chương trình con.
+ Tham số thực sự: Là tham số được viết trong lời gọi chương trình con. Gồm các hằng và biến nằm trong dấu ngoặc ( ) có tên chương trình con.
+ Biến cục bộ: Là các biến được khai báo trong chương trình con.
+ Biến toàn phần: Là các biến được khai báo trong chương trình chính.
- Trong thân hàm cần có lệnh: < tên hàm > := < biểu thức >;
- Kết thúc chương trình con là dấu chấm phẩy (;)
c. Thực hiện chương trình con
- Để thực hiện (gọi) một chương trình con, ta cần phải có lệnh gọi nó tương tự lệnh gọi hàm hay thủ tục chuẩn, bao gồm tên chương trình con với tham số (nếu có) là các hằng và biến chứa dữ liệu vào và ra tương ứng với các tham số hình thức đặt trong cặp ngoặc ( và ). Các hằng và biến này được gọi là các tham số thực sự.
Ví dụ 3:
- Lệnh gọi chương trình con sẽ thực hiện từ trên xuống dưới trong chương trình chính.
- Khi thực hiện gọi chương trình con, các tham số hình thức dùng để nhập dữ liệu vào của tham số thực sự tương ứng. Khi xuất dữ liệu thì tham số hình thức lưu trữ dữ liệu ra sẽ trả giá trị cho tham số thực sự tương ứng.
Câu 1
Sự giống nhau và khác nhau giữa hàm và thủ tục
Gợi ý trả lời:
- Giống nhau:
+ Đều là chương trình con, có cấu trúc giống một chương trình.
+ Đều có thể chứa các tham số (tham số giá trị và tham số biến), cùng tuân theo các quy định về khai báo và sử dụng các loại tham số này. (Có thể không có tham số).
- Khác nhau:
+ Hàm:
- Đầu hàm bắt đầu bằng từ khóa Function
- Luôn trả về một giá trị thuộc kiểu xác định thông qua tên hàm (các kiểu dữ liệu đơn giản: integer, real, boolean, char, string).
- Phải chỉ ra kết quả của hàm thuộc kiểu dữ liệu nào.
- Trong thân hàm thường có câu lệnh gán giá trị cho tên hàm.
+ Thủ tục: Đầu thủ tục bắt đầu bằng từ khóa Procedure
Câu 2
Chương trình tính tích của hai số nguyên a và b
- Hàm:
Function Tich(a, b: integer): integer;
Var Kq: Integer;
Begin
Kq := a*b;
Tich := Kq;
End;
- Thủ tục:
Procedure tt_Tich(a, b: integer);
Var Kq: Integer;
Begin
Kq := a*b;
Write('Tích của' , a, 'và', b, 'là', Kq);
End;
Hãy nhận xét cấu trúc hàm và thủ tục của chương trình tính tích ở trên.
Gợi ý trả lời:
- Hàm trả về giá trị sau khi thực hiện nên có lệnh gán kết quả cho tên hàm Tích := Kq; và cũng chính vì vậy nên sau khai báo tên hàm có khai báo tên kiểu dữ liệu trả về Tich(a, b: integer): integer;
- Thủ tục không trả về kết quả nên có câu lệnh xuất kết quả ngay trong thủ tục Write('Tích của , a, ' và ', b, ' là ', Kq);
1. Khái niệm chương trình con
a. Khái niệm:
Để viết chương trình giải các bài toán lớn, phức tạp người lập trình có thể chia thành nhiều bài toán nhỏ, mỗi bài toán là một dãy lệnh mô tả một số thao tác nhất định (gọi là chương trình con). Sau đó ghép nối các chương trình con thành chương trình chính.
Chương trình con là dãy các lệnh mô tả một số thao tác nhất định và có thể được thực hiện từ nhiều vị trí trong chương trình.
b. Lợi ích của việc sử dụng chương trình con
- Tránh được việc phải lặp đi lặp lại cùng một dãy lệnh.
- Hỗ trợ việc thực hiện các chương trình lớn.
- Phục vụ cho quá trình trừu tựng hĩa.
- Mở rộng khả năng ngơn ngữ.
- Thuận tiện cho việc phát triển nâng cấp chương trình.
2. Phân loại và cấu trúc chương trình con
a. Phân loại
Trong nhiều ngôn ngữ lập trình, chương trình con thường gồm hai loại:
- Hàm (Function): Là chương trình con thực hiện một số thao tác nào đó, và trả về một giá trị qua tên của nó.
Ví dụ 1:
+ sin(x) nhận vào giá trị thực x và trả về giá trị sinx,
+ sqrt(x) nhận vào giá trị x trả về giá trị căn bậc hai của x,
+ length(x) nhận vào xâu x và trả về độ dài của xâu x,...
- Thủ tục (Procedure): Là chương trình con thực hiện một số thao tác nào đó, và không trả về giá trị nào qua tên của nó.
Ví dụ 2: các thủ tục vào/ra chuẩn hay thủ tục xử lí xâu: writeln, readln, delete,…
b. Cấu trúc chương trình con
< phần đầu >
[< phần khai báo >]
< phần thân >
- Phần đầu: Cấu trúc chương trình con tương tự chương trình chính, nhưng nhất thiết phải có phần đầu để khai báo tên, nếu là Hàm thì phải có khai báo kiểu dữ liệu trả về.
- Phần khai báo: Có thể khai báo cho dữ liệu vào và ra, các hằng được sử dụng trong chương trình con.
- Phần thân: Là các dãy lệnh được thưc hiện trong chương trình con từ dữ liệu vào và được kết quả như mong muốn. Phần này luôn nằm giữa 2 từ khoá là Begin và End. Ở giữa là các thao tác cần thực hiện. Sau từ khóa End là dấu chấm phẩy (;).
Một số lưu ý:
- Một chương trình con có thể có hoặc không có tham số hình thức, có thể có hoặc không có biến cục bộ.
+ Tham số hình thức: Là tham số được đưa vào khi định nghĩa chương trình con.
+ Tham số thực sự: Là tham số được viết trong lời gọi chương trình con. Gồm các hằng và biến nằm trong dấu ngoặc ( ) có tên chương trình con.
+ Biến cục bộ: Là các biến được khai báo trong chương trình con.
+ Biến toàn phần: Là các biến được khai báo trong chương trình chính.
- Trong thân hàm cần có lệnh: < tên hàm > := < biểu thức >;
- Kết thúc chương trình con là dấu chấm phẩy (;)
c. Thực hiện chương trình con
- Để thực hiện (gọi) một chương trình con, ta cần phải có lệnh gọi nó tương tự lệnh gọi hàm hay thủ tục chuẩn, bao gồm tên chương trình con với tham số (nếu có) là các hằng và biến chứa dữ liệu vào và ra tương ứng với các tham số hình thức đặt trong cặp ngoặc ( và ). Các hằng và biến này được gọi là các tham số thực sự.
Ví dụ 3:
- Lệnh gọi chương trình con sẽ thực hiện từ trên xuống dưới trong chương trình chính.
- Khi thực hiện gọi chương trình con, các tham số hình thức dùng để nhập dữ liệu vào của tham số thực sự tương ứng. Khi xuất dữ liệu thì tham số hình thức lưu trữ dữ liệu ra sẽ trả giá trị cho tham số thực sự tương ứng.
Câu 1
Sự giống nhau và khác nhau giữa hàm và thủ tục
Gợi ý trả lời:
- Giống nhau:
+ Đều là chương trình con, có cấu trúc giống một chương trình.
+ Đều có thể chứa các tham số (tham số giá trị và tham số biến), cùng tuân theo các quy định về khai báo và sử dụng các loại tham số này. (Có thể không có tham số).
- Khác nhau:
+ Hàm:
- Đầu hàm bắt đầu bằng từ khóa Function
- Luôn trả về một giá trị thuộc kiểu xác định thông qua tên hàm (các kiểu dữ liệu đơn giản: integer, real, boolean, char, string).
- Phải chỉ ra kết quả của hàm thuộc kiểu dữ liệu nào.
- Trong thân hàm thường có câu lệnh gán giá trị cho tên hàm.
+ Thủ tục: Đầu thủ tục bắt đầu bằng từ khóa Procedure
Câu 2
Chương trình tính tích của hai số nguyên a và b
- Hàm:
Function Tich(a, b: integer): integer;
Var Kq: Integer;
Begin
Kq := a*b;
Tich := Kq;
End;
- Thủ tục:
Procedure tt_Tich(a, b: integer);
Var Kq: Integer;
Begin
Kq := a*b;
Write('Tích của' , a, 'và', b, 'là', Kq);
End;
Hãy nhận xét cấu trúc hàm và thủ tục của chương trình tính tích ở trên.
Gợi ý trả lời:
- Hàm trả về giá trị sau khi thực hiện nên có lệnh gán kết quả cho tên hàm Tích := Kq; và cũng chính vì vậy nên sau khai báo tên hàm có khai báo tên kiểu dữ liệu trả về Tich(a, b: integer): integer;
- Thủ tục không trả về kết quả nên có câu lệnh xuất kết quả ngay trong thủ tục Write('Tích của , a, ' và ', b, ' là ', Kq);