210 likes | 426 Views
Chương 9. Định nghĩa và sử dụng thủ tục. Cấu trúc tổ chức một chương trình. C ó 2 cách tổ chức chương trình : Phương pháp có cấu trúc : Chương trình Module Thủ tục ( Lệnh) phương pháp hướng đối tượng : Chương trình Đối tượng Tác vụ (thủ tục) ( Lệnh)
E N D
Chương 9 Định nghĩa và sử dụng thủ tục
Cấu trúc tổ chức một chương trình • Có 2 cách tổ chức chương trình : • Phương pháp có cấu trúc : Chương trình Module Thủ tục ( Lệnh) • phương pháp hướng đối tượng : Chương trình Đối tượng Tác vụ (thủ tục) ( Lệnh) • Tóm lại, dù dùng phương pháp nào thì đơn vị chức 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 lần trong chương trình là thủ tục.
Phân loại thủ tục trong VB • Trong lập trình cấu trúc, có 2 loại : • Sub : không trả trị về, thi hành như một lệnh. • Function : trả trị về, thi hành như một biểu thức. • Theo lập trình hướng đối tượng, có 3 loại : • Sub : không trả trị về, thi hành như một lệnh. • Function : trả trị về, thi hành như một biểu thức. • Property : cho phép truy xuất một thuộc tính của đối tượng. Được chia ra 3 loại nhỏ là GET, SET và LET.
Tầm vực sử dụng của thủ tục • Trong Standard module, có thể định ra 2 loại tầm vực : • Toàn cục : dùng từ khóa Public để định nghĩa. • Cục bộ trong module : dùng từ khóa Private để định nghĩa. • Trong Form hay Class module, có thể định ra 3 loại tầm vực : • Công cộng : dùng từ khóa Public để định nghĩa. Còn được gọi là Phương thức (Method) để phân biệt với Sub / Function. • Cục bộ trong Project : dùng từ khóa Friend để định nghĩa. • Cục bộ trong module : dùng từ khóa Private để định nghĩa. • Về nguyên tắc, các thủ tục Property Get, Set và Let đều phải có tầm vực công cộng.
Định nghĩa hàm - Function • Cú pháp : [Public|Private|Friend] [Static] Function<tên hàm> [ ( <thsố>) ] [ As <kiểu> ] [<N lệnh>] End Function • Public, Private, Friend qui định tầm vực. • Static qui định tất cả các biến trong hàm đều là Static. • <thsố> là danh sách các tham số hình thức (slide kế). • <kiểu> là kiểu dữ liệu trả về. • <tên hàm> do nsd đặt, dùng để gọi hàm sau này. • Giá trị trả về của hàm phải được gán vào một biến có tên chính là <tên hàm>.
Danh sách tham số hình thức • Danh sách tham số hình thức có dạng : [Optional] [ByVal|ByRef] [ParamArray]<tên>[()] [As<kiểu>] [=<trị mặc định>] • Optional cho biết tham số có thể cung cấp khi gọi hàm hay không cung cấp cũng được. Dùng kết hợp với <trị mặc định>. • ByVal qui định tham số hình thức nhận giá trị từ tham số thực (là tham số cung cấp lúc gọi hàm). Nói cách khác, tham số thực có thể là một biểu thức. • ByRef qui định tham số hình thức nhận tham khảo từ tham số thực. Tham số thực phải là biến. Nếu không có ByVal hay ByRef thì hiểu ngầm là ByRef. • ParamArray chỉ dùng cho tham số cuối của danh sách và được hiểu tham số cuối sẽ tương ứng với một dãy nhiều tham số (nghĩa là số lượng tham số thực nhiều hơn tham số hình thức).
Ví dụ định nghĩa hàm • Đoạn code sau định nghĩa hàm tính n! giai thừa theo giải thuật vòng lặp : Private Functiongiaithua(ByVal n As Integer) As Long Dim gt As Long If n <= 0 Then ' nếu n <=0 thì trả về -1 giaithua = -1 Exit Function End If gt=1 Do While n>1 gt = gt * n n = n - 1 Loop giaithua = gt End Function
Hàm đệ qui • Hàm tự gọi lại chính nó trong khi thực hiện các lệnh được gọi là hàm đệ qui (recursive). • Hàm đệ qui thường rất gọn nhưng khi thi hành sẽ sử dụng bộ nhớ rất nhiều do sinh ra biến cục bộ liên tục. • Đa số các bài toán có dạng fn(x)=g(fn-1(x)) đều có thể viết thành hàm đệ qui. • Đệ qui hổ tương : A gọi B và B gọi lại A. • Định nghĩa hàm nào trước ? • Vấn đề : tham khảo trước = khai báo - tham khảo - định nghĩa.
Định nghĩa thủ tục - Sub • Cú pháp : [ Public|Private|Friend ] [ Static ] Sub<tên thủ tục> [ ( <thsố>) ] [ <N lệnh> ] End Sub • Ý nghĩa các thông số Public, Private, Friend, Static, <thso> giống trong định nghĩa hàm. • Các sự kiện tương tác của các đối tượng giao diện đều là Sub. • Sub không trực tiếp trả trị về nhưng có thể trả trị gián tiếp qua tham số biến (ByRef).
Ví dụ Sub • Tính tổng các số nguyên từ 1 đến n. Số n nhập từ bàn phím. Private Sub Main() Dim S As Integer Call TinhTong(S) Debug.Print "Tong = " & S End Sub Private SubTinhTong(ByRef Tong As Integer) Dim n As Integer, i As Integer n = CInt(InputBox("Nhap n =")) Tong = 0 For i = 1 To n Tong = Tong + i Next End Sub
Định nghĩa Method Get • Cú pháp : Public Property Get<tên method> [(<thso>)] [As <kiểu>] [ <N lệnh> ] End Sub • Method Get cho phép bên ngoài có thể đọc giá trị của một thuộc tính bên trong đối tượng nhưng dưới sự kiểm soát của đối tượng đó.
Định nghĩa Method Let • Cú pháp : Public Property Let<tên method> ([<thsố>,]<giá trị>) [ <N lệnh> ] End Sub • Method Let cho phép bên ngoài có thể gán giá trị mới cho một thuộc tính bên trong đối tượng nhưng dưới sự kiểm soát của đối tượng đó.
Định nghĩa Method Set • Cú pháp : Public Property Set<tên method> ([<thsố>,]<tham khảo>) [ <N lệnh> ] End Sub • Method Set cho phép bên ngoài có thể gán tham khảo cho một thuộc tính (kiểu đối tượng) bên trong đối tượng nhưng dưới sự kiểm soát của đối tượng đó.
Cơ chế truyền tham số • Tham số hình thức : tham số lúc định nghĩa. • Tham số thực : tham số lúc gọi. • Nguyên tắc truyền tham số : • Số lượng bằng nhau. • Tương hợp kiểu. • Tham số thực sẽ được gán vào cho tham số hình thức tương ứng. • Cách gán tham số thực thay đổi tùy theo ByVal hay ByRef : • ByVal : gán trị tham số thực có thể là biểu thức. • ByRef : gán tham khảo tham số thực phải là biến.
Cơ chế truyền tham số (tt.2) // version truyền bằng giá trị Private Sub Hoanvi1(ByVal x As Integer, ByVal y As Integer) Dim tmp As Integer tmp = x x = y y = tmp End Sub // version truyền bằng tham khảo Private Sub Hoanvi2(ByRef x As Integer, ByRef y As Integer) Dim tmp As Integer tmp = x x = y y = tmp End Sub // version truyền bằng tham khảo Private Sub Hoanvi3(x As Integer, y As Integer) Dim tmp As Integer tmp = x x = y y = tmp End Sub
Cơ chế truyền tham số (tt.3) • Hãy khảo sát kỹ 3 thủ tục hoán vị dữ liệu trong slide trước. • Bây giờ hãy chú ý tới việc sử dụng chúng và kết quả đạt được : ... Dim intN As Integer Dim intM As Integer intN = 4 intM = 8 Call Hoanvi1(intN, intM) Call Hoanvi2(intN, intM) Call Hoanvi3(intN, intM) ... intN = 4 intM = 8 intN = 4 intM = 8 intN = 8 intM = 4 intN = 4 intM = 8
Các thủ tục định sẵn của VB • Về nguyên tắc, các thủ tục (Sub, Function, Property) phải được định nghĩa trước khi sử dụng. • Tuy nhiên, đối với một số các thủ tục định sẵn của VB, ta có thể gọi bất cứ lúc nào mà không cần phải định nghĩa.
Hàm MsgBox - hiển thị thông báo • Cú pháp : MsgBox(prompt [,buttons] [,title] [,helpfile,context]) trong đó : • prompt là biểu thức chuỗi miêu tả thông báo cần hiển thị. • buttons chọn số lượng và loại nút nhấn hiện trên form. • title là biểu thức chuỗi miêu tả title bar của form thông báo. • helpfile là biểu thức chuỗi miêu tả đường dẫn file Help được dùng với form thông báo (theo cơ chế context-sensitive Help). • context là biểu thức số miêu tả chỉ số của "topic" cần dùng trong file Help • Thường để gọi dễ dàng hàm MsgBox, ta chỉ cần miêu tả tham số prompt bắt buộc. MSDN
Hàm InputBox - nhập chuỗi • Cú pháp : InputBox (prompt [,title] [,default] [,xpos] [,ypos] [,helpfile,context]) trong đó : • prompt, title,helpfile, context : giống trong MsgBox. • xpos, ypos : biểu thức số chỉ tọa độ (x,y) của điểm trên-trái của cửa sổ (mặc định là giữa màn hình). • default : biểu thức chuỗi miêu tả giá trị default của chuỗi được nhập. • Thường để gọi dễ dàng hàm InputBox, ta chỉ cần miêu tả tham số prompt bắt buộc. MSDN
Hàm chuyển đổi kiểu • VB cung cấp các hàm sau để ta có thể chuyển giá trị từ kiểu nào đó về kiểu xác định : • CBool (expression) : chuyển trị của biểu thức về kiểu Boolean • CByte (expression) : chuyển trị của biểu thức về kiểu Byte • CCur (expression) : chuyển trị của biểu thức về kiểu Currency • CDate (expression) : chuyển trị của biểu thức về kiểu Date • CDbl (expression) : chuyển trị của biểu thức về kiểu Double • CDec (expression) : chuyển trị của biểu thức về kiểu Decimal • CInt (expression) : chuyển trị của biểu thức về kiểu Integer • CLng (expression) : chuyển trị của biểu thức về kiểu Long • CSng (expression) : chuyển trị của biểu thức về kiểu Single • CStr (expression) : chuyển trị của biểu thức về kiểu String • CVar (expression) : chuyển trị của biểu thức về kiểu Variant
Các hàm thư viện liên kết động • Khi viết code VB, người lập trình còn có thể sử dụng các hàm / thủ tục trong các thư viện liên kết động. • Thư viện liên kết động thường là các tập tin *.dll lưu giữ các hàm / thủ tục. • Hàm / thủ tục trong thư viện DLL được nạp vào bộ nhớ và thi hành lúc chạy chương trình (run-time). • Sử dụng thư viện DLL giúp giảm nhẹ không gian lưu trữ chương trình vì chỉ cần một thư viện DLL dùng chung cho mọi ứng dụng. • Hệ điều hành Windows cung cấp nhiều thư viện DLL dưới dạng các hàm API (Application Programming Interface). Chương trình VB có thể gọi bất kỳ hàm nào trong thư viện này theo cơ chế liên kết động như đã trình bày ở trên. • Muốn sử dụng một hàm / thủ tục trong thư viện DLL, người lập trình phải khai báo bằng lệnh Declare (Ch 6).