Lệnh gọi thủ tục (tt)<br />
Sau khi đã định nghĩa thủ tục, ta có thể dùng (gọi) nó. Thủ tục chỉ<br />
được thi hành khi người ta gọi nó bằng lệnh gọi thủ tục. Cú pháp của<br />
lệnh gọi như sau :<br />
[Call] name [arglist]<br />
Ví dụ : giả sử ta đã định nghĩa (viết) 1 thủ tục sau đây :<br />
Private Sub Update_Display(d As Byte)<br />
nó cho phép hiệu chỉnh giá trị Display sau khi người dùng ấn thêm ký<br />
số d. Như vậy khi người dùng ấn thêm ký số 5, ta sẽ thực hiện gọi thủ<br />
tục như sau :<br />
Call Update_Display (5)<br />
hay : Update_Display (5)<br />
Lưu ý : Trong trường hợp gọi thủ tục không có bất kỳ tham số nào ta nên<br />
dùng thêm từ khóa "Call' để chương trình trong sáng, dễ đọc.<br />
<br />
<br />
<br />
Môn : Tin học<br />
Chương 8 : Các lệnh thực thi VB<br />
Slide 235<br />
<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
MÔN TIN HỌC<br />
Chương 9<br />
<br />
ĐỊNH NGHĨA THỦ TỤC & SỬ DỤNG<br />
9.1 Thủ tục & tầm vực sử dụng thủ tục<br />
9.2 Cú pháp định nghĩa hàm.<br />
9.3 Cú pháp định nghĩa thủ tục<br />
9.4 Gọi thủ tục<br />
9.5 Cơ chế truyền tham số<br />
9.6 Các thủ tục định nghĩa sẵn<br />
<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
Môn : Tin học<br />
Chương 9 : Định nghĩa thủ tục & sử dụng<br />
Slide 236<br />
<br />
118<br />
<br />
Nhắc lại cấu trúc tổ chức 1 chương trình<br />
<br />
<br />
<br />
<br />
Một chương trình thường cung cấp nhiều chức năng cho người dùng ⇒<br />
Chương trình thường là 1 hệ thống phức tạp. Để dễ quản lý và xây dựng<br />
chương trình, người ta thường chia nó ra nhiều đơn vị nhỏ hơn. Hiện có 2<br />
phương pháp chia nhỏ chương trình :<br />
phương pháp có cấu trúc : chương trình được chia nhỏ thành nhiều<br />
module chức năng, mỗi module chứa nhiều điểm nhập (entry), mỗi<br />
điểm nhập cung cấp 1 dịch vụ (chức năng) rõ ràng, đơn giản nào đó.<br />
Ta gọi mỗi điểm nhập là thủ tục thực hiện chức năng tương ứng.<br />
phương pháp hướng đối tượng : chương trình được chia nhỏ thành<br />
nhiều đối tượng, mỗi đối tượng chứa nhiều điểm nhập (entry), mỗi<br />
điểm nhập cung cấp 1 dịch vụ (chức năng) rõ ràng, đơn giản nào đó.<br />
Ta gọi mỗi điểm nhập là thủ tục thực hiện chức năng tương ứng.<br />
Tóm lại, dù dùng phương pháp chia nhỏ chương trình nào thì đơn vị chức<br />
năng nhỏ nhất mà người lập trình có thể xây dựng và dùng (gọi) lại nhiều<br />
lần trong chương trình là thủ tục.<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
Môn : Tin học<br />
Chương 9 : Định nghĩa thủ tục & sử dụng<br />
Slide 237<br />
<br />
9.1 Phân loại thủ tục trong VB<br />
<br />
<br />
<br />
<br />
Nếu ta phân tích chương trình theo cấu trúc thì chương trình VB là tập các<br />
standard module, trong mỗi module ta có thể định nghĩa n thủ tục khác nhau<br />
thuộc 1 trong 2 dạng :<br />
thủ tục - Sub : 1 đoạn lệnh thực thi VB để thực hiện 1 chức năng rõ ràng,<br />
đơn giản nhưng không trả về giá trị kèm theo tên thủ tục.<br />
hàm - Function : 1 đoạn lệnh thực thi VB để thực hiện 1 chức năng rõ ràng,<br />
đơn giản và trả về giá trị kèm theo tên hàm.<br />
Nếu ta phân tích chương trình theo hướng đối tượng thì chương trình VB là tập<br />
các form hay class module, trong mỗi module ta có thể định nghĩa n thủ tục<br />
khác nhau thuộc 1 trong 3 dạng :<br />
thủ tục - Sub : 1 đoạn lệnh thực thi VB để thực hiện 1 chức năng rõ ràng,<br />
đơn giản nhưng không trả về giá trị kèm theo tên thủ tục.<br />
hàm - Function : 1 đoạn lệnh thực thi VB để thực hiện 1 chức năng rõ ràng,<br />
đơn giản và trả về giá trị kèm theo tên hàm.<br />
truy xuất thuộc tính - Property : 1 đoạn lệnh thực thi VB để đọc/ghi 1 thuộc<br />
tính tương ứng của đối tượng. Có 3 thủ tục loại này là Get, Set và Let.<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
Môn : Tin học<br />
Chương 9 : Định nghĩa thủ tục & sử dụng<br />
Slide 238<br />
<br />
119<br />
<br />
Tầm vực sử dụng thủ tục trong VB<br />
<br />
<br />
<br />
<br />
Trong mỗi standard module, ta có thể xác định tầm vực sử dụng của từng thủ<br />
tục :<br />
cục bộ trong module : dùng từ khóa Private trong lệnh định nghĩa thủ tục.<br />
toàn cục trong chương trình : dùng từ khóa Public trong lệnh định nghĩa thủ<br />
tục.<br />
Trong mỗi form hay class module, ta có thể xác định tầm vực sử dụng của từng<br />
thủ tục :<br />
cục bộ trong module (đối tượng) : dùng từ khóa Private trong lệnh định nghĩa<br />
thủ tục.<br />
cục bộ trong Project : dùng từ khóa Friend trong lệnh định nghĩa thủ tục.<br />
công cộng (ai dùng cũng được) : dùng từ khóa Public trong lệnh định nghĩa<br />
thủ tục. Các thủ tục công cộng của đối tượng được gọi là method để phân<br />
biệt với Sub/Function.<br />
Về nguyên tắc, các thủ tục Property Get, Set và Let đều phải có tầm vực<br />
công cộng (dùng từ khóa Public).<br />
<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
Môn : Tin học<br />
Chương 9 : Định nghĩa thủ tục & sử dụng<br />
Slide 239<br />
<br />
9.2 Cú pháp định nghĩa hàm - Function<br />
<br />
<br />
<br />
<br />
<br />
<br />
Cú pháp để định nghĩa 1 hàm :<br />
[Public | Private | Friend] [Static] Function name [(arglist)] [As type]<br />
[statements]<br />
[name = expression]<br />
[Exit Function]<br />
[statements]<br />
[name = expression]<br />
End Function<br />
Dùng từ khóa Public để định nghĩa hàm có tầm vực toàn cục, nghĩa là<br />
bất kỳ lệnh nào của chương trình đều có thể gọi hàm Public.<br />
Dùng từ khóa Friend để định nghĩa method thuộc 1 class module nhưng<br />
chỉ có tầm vực cục bộ trong Project, nghĩa là chỉ có các lệnh trong cùng<br />
Project mới có thể gởi thông điệp đến hàm Friend của đối tượng đó, còn<br />
các lệnh ở ngoài Project thì không thấy hàm Friend của đối tượng này.<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
Môn : Tin học<br />
Chương 9 : Định nghĩa thủ tục & sử dụng<br />
Slide 240<br />
<br />
120<br />
<br />
Cú pháp định nghĩa hàm - Function (tt)<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Dùng từ khóa Private để định nghĩa hàm có tầm vực cục bộ trong<br />
module, nghĩa là chỉ có các lệnh trong cùng module mới có thể gọi hàm<br />
Private trong module tương ứng.<br />
Dùng từ khóa Static để định nghĩa các biến cục bộ trong hàm đều là<br />
Static, nghĩa là giá trị của chúng vẫn tồn tại qua các lần gọi khác nhau<br />
đến hàm này.<br />
[statements] là danh sách các lệnh định nghĩa biến, hằng, kiểu cục bộ<br />
trong function và các lệnh thực thi miêu tả chính xác chức năng của<br />
hàm.<br />
Lệnh gán name = expression cho phép gán giá trị trả về cho lệnh gọi<br />
hàm.<br />
Lệnh Exit Function cho phép trả ngay điều khiển về lệnh gọi hàm này<br />
(thay vì thực thi tiếp các lệnh còn lại của hàm).<br />
<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
Môn : Tin học<br />
Chương 9 : Định nghĩa thủ tục & sử dụng<br />
Slide 241<br />
<br />
Cú pháp định nghĩa hàm - Function (tt)<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
arglist là danh sách các tham số hình thức, mỗi tham số được cách<br />
nhau bởi dấu ',' và được định nghĩa theo cú pháp như sau :<br />
[Optional] [ByVal | ByRef] [ParamArray] varname[( )] [As type]<br />
[=defaultvalue]<br />
Dùng từ khóa Optional để khai báo rằng tham số tương ứng là nhiệm ý<br />
trong lúc gọi hàm : truyền hay không cũng được. Trong trường hợp này<br />
ta nên dùng thêm thành phần [= defaultvalue] để xác định giá trị cần<br />
truyền nhiệm ý.<br />
Dùng từ khóa ByRef để khai báo việc truyền tham số bằng tham khảo,<br />
đây là chế độ truyền tham số nhiệm ý. Ngược lại dùng từ khóa ByVal để<br />
khai báo cơ chế truyền tham số bằng giá trị.<br />
Chỉ có thể dùng từ khóa ParamArray cho tham số cuối trong danh sách<br />
tham số, tham số này cho phép ta truyền bao nhiêu tham số cụ thể cũng<br />
được.<br />
Khoa Công nghệ Thông tin<br />
Trường ĐH Bách Khoa Tp.HCM<br />
<br />
Môn : Tin học<br />
Chương 9 : Định nghĩa thủ tục & sử dụng<br />
Slide 242<br />
<br />
121<br />
<br />
Thí dụ định nghĩa hàm<br />
<br />
<br />
Đoạn code sau định nghĩa hàm tính n! giai thừa theo giải thuật đệ qui :<br />
Public Function giaithua(ByVal n As Long) As Long<br />
If n