Lệnh Do While...Loop và Do Until...Loop có thể được viết theo dạng khác tức là điều kiện được đặt ở cuối của vòng lặp. Trong trường hợp này biểu thức điều kiện được viết ngay sau mã lệnh. Mã lệnh luôn luôn được thực hiện ít nhất là một lần sau đó điều kiện mới được kiểm tra. Những dạng này gồm các lệnh Do...Loop While và Do...Loop Until . Đây là ví dụ về lệnh Do…Loop While:
Dim WhileValue As Integer
WhileValue = 0
Do
MessageBox.Show(WhileValue) WhileValue = WhileValue + 1
Loop While (WhileValue < 2)
Đây là ví dụ của lệnh Do...LoopUntil:
Dim UntilValue As Integer
UntilValue = 0
Do
Gợi ý
Tên biến LoopIndex ởđây là tùy chọn. Nó có thể là LoopCounter, LoopVariable, X, hoặc là cái gì đó khác. Gợi ý Đểđiều kiện ở cuối lệnh lặp đảm bảo đoạn mã trong vòng lặp thực hiện ít nhất một lần.
MessageBox.Show(UntilValue) UntilValue = UntilValue + 1
Loop Until (UntilValue > 1)
Để ý rằng trong cả hai trường hợp, biểu thức điều kiện bây giờ là một bộ phận của lệnh Loop hơn là bộ phận của lệnh Do. Các lệnh sau Do và trước Loop được thực hiện ít nhất một lần. Sau đó biểu thức điều kiện được kiểm tra để xác định xem vòng lặp có tiếp tục nữa không. Trong ví dụ trên, nếu UntilValue được khởi tạo là 5 thì hộp thông báo sẽ hiển thị 5 trước khi thực hiện kiểm tra biểu thức điều kiện.
7. Lệnh Exit Do
Bạn có nhớ Cliff dậy cách thoát khỏi vòng lặp For...Next bằng cách sử dụng lệnh Exit For. Bạn cũng có thể thoát ra khỏi các lệnh lặp Do While...Loop, Do Until...Loop, Do...Loop While và Do...Loop Until theo cách tương tự như thế bằng cách sử dụng lệnh "Exit Do". Bạn sử dụng lệnh If...Then để cung cấp một biểu thức lô gíc nhằm điều khiển sự thực hiện của lệnh Exit Do. Nếu biểu thức lô gíc có giá trị đúng thì lệnh Exit Do được thực hiện và vòng lặp kết thúc. Sử dụng Exit Do khi bạn muốn thoát khỏi vòng lặp trước khi biểu thức lô gíc của lệnh lặp thoả mãn điều kiện thoát khỏi vòng lặp.
Hãy viết mã lệnh để thoát khỏi vòng lặp Do Until...Loop. Tạo một ứng dụng Window tên là ExitDo. Thêm một nút lệnh vào Form1. Nhấp đúp vào nút Button1 để soạn thảo mã lệnh cho sự kiện nhấn nút của nó như dưới đây (các mã lệnh này cũng giống như mã lệnh của ứng dụng DoLoopUntil):
Dim UntilValue As Integer
UntilValue = 0 Do Until (UntilValue > 10) MessageBox.Show(UntilValue) UntilValue = UntilValue + 1 If UntilValue = 5 Then Exit Do End If Loop
MessageBox.Show("Giá trị thoát= " & UntilValue)
Dịch và chạy chương trình. Nhấn nút Button1. Trong mỗi lần lặp, giá trị của UntilValue sẽ tăng lên 1 và hộp thông báo sẽ hiển thị đếm lặp (0,1,2,3 and 4). Bạn phải nhấn nút OK trong từng lần lặp. Khi giá trị của UntilValue bằng 5, biểu thức so sánh của lệnh If...Then có giá trị đúng. Lệnh Exit Do được thực hiện. Vòng lặp kết thúc và mã lệnh ở dòng đầu tiên ngay sau lệnh Loop Until được thực hiện, nó hiển thị lại giá trị của UntilValue tại thời điểm vòng lặp kết thúc. Mã lệnh hiển thị hộp thông báo với nội dung là "Giá trị thoát = 5". Nhấn nút OK để trở về.
Bạn có thể sử dụng chính lệnh Exit Do này trong mã lệnh Do While...Loop để kết thúc vòng lặp trước khi biểu thức điều kiện của nó trở thành sai.
BÀI 12. HÀM
1. Thủ tục là gì?
Thủ tục con (gọi là thủ tục cho tiện) giống như là một chương trình nhỏ (mini-program). Bạn viết chúng để thực hiện các tác vụ cụ thể trong ứng dụng. Khi bạn viết một ứng dụng, hãy chia nhỏ nó thành chức năng nhỏ hơn và viết thủ tục thực hiện từng chức năng nhỏ này. Ứng dụng có thể chứa số thủ tục bằng số thủ tục mà bạn cần. Nhưng cố gắng viết các thủ tục sao cho các thủ tục này chứa một chức năng cụ thể của ứng dụng.
Tại sao lại sử dụng thủ tục? Thủ tục giúp bạn viết lệnh và gỡ lỗi chương trình dễ ràng hơn vì chúng chúng chia các chức năng của ứng dụng thành các chức năng nhỏ hơn. Viết và gỡ lỗi vài thủ tục con ngắn thì dễ ràng hơn viết và gỡ lỗi toàn bộ ứng dụng rất nhiều. Một khi bạn đã gỡ lỗi thủ tục thì nó đã sẵn sàng cho bạn sử dụng. Nó sẽ làm việc vào bất cứ khi nào bạn cần sử dụng nó.
Dùng thủ tục là một cách giúp bạn tiết kiệm rất nhiều thời gian, khi bạn có nhiều mã lệnh phức tạp mà bạn muốn truy nhập chúng từ các phần khác nhau của ứng dụng. Chúng có thể được sử dụng một cách lặp đi lặp lại. Một khi bạn viết một thủ tục, nó có thể được sử dụng tại bất cứ nơi đâu trong ứng dụng. Thậm chí thủ tục có thể sử dụng các thủ tục khác. Các bạn thử tưởng tượng xem!
Thủ tục cũng là cách dùng để chia công việc lập trình trong các ứng dụng lớn. Mỗi lập trình viên thường được phân công viết các thủ tục của ứng dụng. Họ chịu trách nhiệm viết và gỡ lỗi các thủ tục do họ viết và đảm bảo rằng chúng làm việc được với các phần khác của chương trình.
Một vài sử dụng phổ biến của thủ tục là để thực hiện tính toán, định dạng và hiển thị thông tin, tuỳ biến giao diện người dùng, nhắc nhở người dùng nhập dữ liệu, cung cấp đầu vào và đầu ra cho chương trình.
2. Viết thủ tục của bạn
Bây giờ các bạn sẽ viết thủ tục con sau đó sẽ học cách sử dụng nó trong ứng dụng. Chúng ta sẽ bắt đầu bằng việc học cú pháp của cách viết thủ tục. Đây là cú pháp của thủ tục.
Private Sub TenThuTuc()
Lenh 1 lenh 2 ... Lenh n
End Sub
Để ý là các từ "Private", "Sub", "End Sub" là từ khoá. Trong cửa sổ mã lệnh, chúng có màu xanh da trời. Từ khoá Private nghĩa là thủ tục này chỉ có thể được truy cập bởi mã lệnh khác trong cùng một Form hoặc cùng một Class (lớp). TenThuTuc là tên của thủ tục.
Bạn có thể sử dụng bất cứ tên nào bạn muốn để đặt tên cho thủ tục nhưng tốt nhất là bạn nên chọn tên có khả năng gợi ý (liên tưởng) tới chức năng của thủ tục, sao cho thông qua tên thủ tục bạn cũng có thể biết chức năng của thủ tục dùng để làm gì.
Để ý cặp dấu ngoặc đơn đi sau tên thủ tục. Khi thông tin được chuyển cho thủ tục, các biến lưu giữ thông tin được đặt trong cặp dấu ngoặc đơn. Bạn đã nhìn thấy tất cả các điều này trong tất cả các thủ tục xử lý sự kiện mà bạn đã sử dụng trong các bài trước. Các lệnh của thủ tục là các dòng mã lệnh nằm giữa các dòng Sub và End Sub. Các lệnh này được thực hiện theo thứ tự từ trên xuống dưới. Bạn hầu như có thể sử dụng bất cứ lệnh nào bạn muốn trong thủ tục.
Bây gờ bạn viết thủ tục và gọi thủ tục này từ mã lệnh.
Tạo một ứng dụng Window tên là SimpleSub. Mở cửa sổ mã lệnh. Tìm đến dòng lệnh "Windows Forms Designer generated code". Trên dòng tiếp theo của dòng lệnh này, nhập vào mã lệnh sau:
Private Sub ThongBao()
MessageBox.Show("Đây là thông báo từ thủ tục ThongBao")
End Sub
Như bạn thấy, khi mã lệnh trong thủ tục ThongBao được thực hiện, hộp thông báo sẽ hiển thị nội dung: " Đây là thông báo từ thủ tục ThongBao".
3. Gọi thủ tục của bạn
Để mã lệnh trong thủ tục thực hiện, bạn cần viết lệnh để gọi nó. Khi thủ tục được gọi thì mã lệnh được chứa trong thân thủ tục được thực hiện. Cú pháp gọi thủ tục rất đơn giản. Bạn sử dụng tên thủ tục và theo sau nó là cặp dấu ngoặc đơn. Đây là cú pháp gọi thủ tục:
TenThuTuc()
Bây giờ, hãy gọi thủ tục mà bạn vừa mới viết.
Trong dự án SimpleSub (thủ tục đơn giản), thêm một nút lệnh vào Form1. Thay đổi thuộc tính Text của Button1 thành "Thông báo". Nhấp đúp vào Button1 để soạn thảo mã lệnh cho sự kiện nhấn nút của nó như sau:
ThongBao()
Dịch và chạy chương trình. Nhấn nút " Thông báo". Hộp thông báo hiển thị thông báo "Đây là thông báo từ thủ tục ThongBao ". Thông báo này đã đến từ đâu? Đây là dòng mã
lệnh được chứa trong thủ tục ThongBao. Khi thủ tục được gọi từ sự kiện nhấn nút thì dòng mã lệnh này được thực hiện.
Bây giờ bạn sẽ thêm một thủ tục khác vào dự án SimpleSub. Nó sẽ hiển thị thông báo khác. Mở cửa sổ mã lệnh và thêm mã lệnh sau đây vào sau lệnh End Sub của thủ tục ThongBao:
Private Sub ThongBao1()
MessageBox.Show("Đây là thông báo từ thủ tục ThongBao1"
End Sub
Lần này, hãy gọi thủ tục ThongBao1 từ thủ tục ThongBao thay vì từ sự kiện nhấn nút. Sửa lại mã lệnh của thủ tục ThongBao như sau:
Private Sub ThongBao ()
MessageBox.Show("Đây là thông báo từ thủ tục ThongBao") ThongBao1()
End Sub
Chúng ta thêm lệnh gọi thủ tục ThongBao1 vào trong thủ tục ThongBao. Dịch và chạy chương trình SimpleSub. Nhấn nút "Thông báo". Hai thông báo được hiển thị. Thông báo thứ nhất hiển thị nội dung " Đây là thông báo từ thủ tục ThongBao". Thông báo thứ hai hiển thị " Đây là thông báo từ thủ tục ThongBao1". Mã lệnh này làm việc như thế nào? Thủ tục xử lý sự kiện nhấn nút gọi thủ tục ThongBao. Khi thủ tục này được gọi thì mã lệnh nó chứa, được thực hiện. Thủ tục ThongBao chứa hai dòng mã lệnh. Dòng đầu tiên đưa ra hộp thông báo với nội dung " Đây là thông báo từ thủ tục ThongBao". Dòng thứ hai gọi thủ tục ThongBao1, đưa ra hộp thông báo với nội dung " Đây là thông báo từ thủ tục ThongBao1".
Bạn đã tạo hai thủ tục và gọi thủ tục thứ nhất từ sự kiện nhấn nút của nút lệnh còn thủ tục thứ hai thì được gọi từ thủ tục thứ nhất!
4. Viết và gọi thủ tục có tham số
Một trong những tiện lợi của Visual Basic.NET, và hầu hết các ngôn ngữ lập trình hiện đại khác đó là bạn có thể truyền thông tin cho thủ tục. Điều này rất là hữu ích, vì bạn có thể viết một thủ tục tạo ra các kết quả hoặc các hành động khác nhau tuỳ thuộc vào thông tin được chuyển cho nó. Những thông tin mà bạn truyền cho thủ tục được gọi là “đối số” của thủ tục. Khi bạn viết một thủ tục có các tham số bạn phải chỉ rõ số lượng tham số và kiểu của chúng.
Đây là cú pháp viết thủ tục có tham số:
Private Sub TenThuTuc (ByVal TenThamSo1 As KieuThamSo1, ByVal
TenThamSo2 As KieuThamSo2, ByVal TenThamSoN As KieuThamSoN) Lenh1
Lenh 2 ...
Lenh N
End Sub
Ở đây cặp dấu ngoặc đơn không trống. Chúng chứa danh sách tham số và kiểu của tham số của thủ tục. Để ý từ "ByVal" là từ khoá. Nên trong cửa sổ mã lệnh nó có màu xanh. Kiểu của tham số là các kiểu phổ biến như số nguyên
(Integer), chuỗi (String), v.v. Các tham số được phân cách với nhau bằng dấu phẩy.
Một ví dụ thực tế sẽ làm cho điều này trở nên rõ ràng hơn nhiều. Mở cửa sổ mã lệnh trong dự án SimpleSub. Ngay tại dòng tiếp theo của dòng chứa lệnh End Sub của thủ tục ThongBao, nhập vào mã lệnh sau :
Private Sub ThongBaoChung(ByVal noidung
As String)
MessageBox.Show(noidung)
End Sub
Thủ tục này yêu cầu phải truyền một đối số có kiểu chuỗi (String) cho nó. Khi thủ tục được gọi, nó sẽ đưa ra hộp thông báo hiển thị nội dung của đối số chuỗi mà nó nhận được.
Bây giờ hãy gọi thủ tục ThongBaoChung và truyền đối số chuỗi cho nó. Thêm một nút lệnh thứ hai vào Form1 của dự án SimpleSub. Thay đổi thuộc tính Text của Button2 thành "Thông báo bất kỳ". Nhấp đúp vào Button2 để soạn thảo mã lệnh cho sự kiện nhấn nút của nó như sau:
ThongBaoChung("Bất kì thông báo nào") ThongBaoChung("Một vài thông báo còn lại") ThongBaoChung("Một thông báo khác")
Dịch và chạy ứng dụng. Nhấn nút " Thông báo bất kỳ". Ba thông báo được hiển thị. Điều này có thể xảy ra như thế nào? Mã lệnh của thủ tục xử lý kiện nhấn nút gọi thủ tục ThongBaoChung ba lần. Mỗi một lần nó truyền cho thủ tục đối số là một chuỗi văn bản khác nhau. Lần thứ nhất, thủ tục được gọi với đối số " Bất kì thông báo nào ". Lần thứ hai, thủ tục được gọi với đối số " Một vài thông báo còn lại". Lần thứ ba, thủ tục được gọi với đối số " Một thông báo khác ". Khi mã lệnh trong thủ tục được thực hiện, đối số truyền cho thủ tục được sử dụng bởi lệnh MessageBox.Show.
Hãy xem một ví dụ nữa. Lần này tôi sẽ viết thủ tục với hai tham số có kiểu số nguyên, thủ tục sẽ cộng giá trị của hai tham số nguyên này lại, và sau đó hiển thị kết quả trong hộp thông báo.
Thêm một thủ tục tên là Cong vào dự án SimpleSub. Thủ tục Cong như sau:
Private Sub Cong(ByVal ThamSo1 As Integer, ByVal ThamSo2 As Integer)
Dim Tong As Integer
Tong = ThamSo1 + ThamSo2
Gợi ý
Tham số sau từ khóa ByVal có nghĩa là giá trị của tham số tuy
được chuyền cho thủ tục nhưng giá trị ban đầu của tham số vẫn không thay đôi.
MessageBox.Show(Tong)
End Sub
Để ý là khi thủ tục bị gọi nó sẽ yêu cầu hai đối số nguyên. Bây giờ thêm nút lệnh thứ ba vào Form1 của dự án SimpleSub. Thay đổi thuộc tính Text của Button3 thành ”Cộng”. Nhấp đúp vào Button3 để soạn thảo mã lệnh cho sự kiện nhấn nút của nó như sau:
Cong(34, 57)
Dịch và chạy chương trình. Nhấn nút "Cộng". Hộp thông báo hiển thị 91. Mã lệnh của thủ tục xử lý sự kiện nhấn nút lệnh gọi thủ tục Cong và truyền các đối số, 34 và 57 cho thủ tục Cong. Thủ tục Cong thực hiện ba dòng lệnh. Dòng lệnh đầu khai báo biến Tong. Sau đó biến Tong được gán giá trị tổng của ThamSo1 (34) và ThamSo2 (57). Đối số ThamSo1 và ThamSo2 lưu giữ giá trị truyền cho thủ tục khi thủ tục được gọi. Cuối cùng, thủ tục hiển thị giá trị của Tong (91)
Bây giờ bạn có thể tự viết thủ tục và truyền thông tin cho nó. Tiếp bạn sẽ học cách viết các hàm. Bạn có thể truyền thông tin cho hàm bằng cách sử dụng các đối số, cũng như khi bạn làm việc với thủ tục. Nhưng khác với thủ tục là bạn có thể nhận thông tin trả về từ một hàm.
5. Viết hàm của bạn
Sự khác nhau chính giữa thủ tục và hàm là bạn có thể lấy thông tin trả về từ hàm. Thông tin này được gọi là giá trị trả về. Hàm có một giá trị trả về, giá trị này có kiểu là một kiểu xác định. Khi bạn viết một hàm bạn phải xác định kiểu của giá trị trả về. Hãy để tôi chỉ cho bạn cú pháp viết một hàm có các đối số và một giá trị trả về:
Private Function TenHam(ByVal TenThamso1 As KieuThamso1, ByVal
TenThamso2 As KieuThamso2, ByVal TenThamsoN As KieuThamsoN) As KieuTrave MaLenh1 MaLenh2 ... MaLenhN TenHam =GiaTriTreVe End Function
Chú ý các từ "Private", "Function", và "End Function" là từ khoá. Chúng có màu xanh. Tên hàm có thể là một tên bất kỳ không trùng với các từ khoá của Visual Basic .NET. Tên hàm nên thể hiện được chức năng của hàm. Danh sách tham số và kiểu tham số được chứa trong cặp dấu ngoặc đơn ngay sau tên của hàm. Các tham số được phân cách với nhau bởi dấu phẩy. Bạn có thể dùng số tham số không hạn chế, nhưng chỉ có duy nhất một giá trị trả về. Bạn phải xác định kiểu của giá trị trả về (ví dụ, As Integer hoặc As String). Dòng cuối cùng để đặt giá trị trả về. Chú ý là dòng lệnh này gán cho tên của hàm giá trị mà hàm sẽ trả về.
Một ví dụ thực tế sẽ giúp giải thích cú pháp của hàm. Các bạn tạo một ứng dụng Windows gọi là FunctionJunction . Mở cửa sổ mã lệnh và tìm dòng mã lệnh: "Windows Forms Designer generated code". Tại dòng tiếp theo của dòng này hãy thêm dòng lệnh sau đây vào:
Private Function NhanHaiSo (ByVal Thuaso1 As Integer, ByVal Thuaso2 As Integer)
As Integer
NhanHaiSo = Thuaso1 * Thuaso2
End Function
Hàm này gọi là NhanHaiSo có hai tham số có kiểu là số nguyên Thuaso1 và Thuaso2. Kiểu trả về là xác định ngay sau danh sách tham số, trong trường hợp này, nó được xác định là một số nguyên (As Integer). Trong thân hàm chứa dòng lệnh:
NhanHaiSo = Thuaso1 * Thuaso2
Dòng mã lệnh này nhân hai đối số và gán kết quả cho giá trị trả về. Tên hàm là NhanHaiSo phải được sử dụng như là tên của giá trị trả về nếu không sẽ có lỗi.
Bây giờ, hãy gọi hàm này và sử dụng giá trị của nó trong chương trình.