Tải bản đầy đủ (.pdf) (37 trang)

BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN - CHƯƠNG 1

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (529.86 KB, 37 trang )

BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPMHSPKT HY 2005

Bài tập chơng 1

NGÔN NGữ LậP TRìNH VISUAL BASIC
MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ
Khai báo các biến thuộc các kiểu dữ liệu cơ bản (byte, integer, long, string,
boolean, single) và kiểu mảng, kiểu bản ghi trong Visual Basic.
Sử dụng các hàm nhập xuất dữ liệu (MsgBox và InputBox) của VB.
Sử dụng và vận dụng được các cấu trúc rẽ nhánh (If...Then và
If...Then...Else), cấu trúc đa rẽ nhánh (Select Case) và các loại vòng lặp :
For; Do While...Loop; Do...Loop để viết chương trình.
Sử dụng được một số hàm xử lý xâu thường dùng.

A - ĐỀ BÀI TẬP
Bài tập 1: Sử dụng hàm MsgBox và InputBox Viết chương trình giải phương trình
bậc 2. Hệ số a, b, c nhập từ bàn phím bằng hàm InputBox (Giải sử a ≠ 0).
Bài tập 2: Minh hoạ cấu trúc If … Then. Viết chương trình tính lương như sau: Cho
người dùng nhập vào lương cơ bản LCB, Hệ số lương HSL và chức vụ CV. Nếu
chức vụ là "giam doc" thì cộng thêm 500000 vào lương thực lĩnh (LTL), nếu là
"truong phong" thì cộng thêm 300000, nếu là "to truong" thì cộng thêm 200000, nếu
là "nhan vien" thì khơng cộng. Sau đó hiển thị tổng số lương thực lĩnh.
Bài tập 3-Select Case: Yêu cầu như bài 2, nhưng sử dụng cấu trúc Select Case
Bài tập 4: Hiển thị các loại thông báo sử dụng hàm MsgBox. Viết chương trình
hiển thị 4 loại hộp thoại MsgBox như mô tả dưới đây khi người dùng nhập vào các
số tương ứng 1,2,3,4 bằng hàm InputBox:

1


2

3

4

Bài tập 5: Sử dụng cấu trúc Select Case. Viết chương trình cho phép người dùng
nhập vào 2 số thực a và b và một trong các phép toán gồm +, -, *, /, \ (Chia lấy phần
nguyên), mod (chia lấy phần dư) hoặc ^ (Luỹ thừa). Sau đó hiển thị kết quả tương
ứng. Ví dụ nếu nhập 2 số 10, 20 và phép toán là + thì thơng báo "Kết quả là 30" v.v.
Trang 1


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Bài tập 6: Sử dụng vòng lặp FOR. Viết chương trình tính tổng của dãy số sau và
hiển thị kết quả ra màn hình: S = 1 + 2 + 3 + ... + N , Với N nhập từ bàn phím.
Bài tập 7: Sử dụng vịng lặp For với điều khoản Step. Hãy viết chương trình tính
tổng các số chẵn từ 1 đến 100.
Bài tập 8: Sử dụng vòng lặp For đếm ngược “FOR … DOWNTO…”.
Hãy sử dụng vòng lặp For in ra các số từ 100 đến 1 bằng lệnh Debug.Print.
Bài tập 9: Sử dụng vòng lặp Do…Loop Until
Cho người dùng nhập vào một dãy các số nguyên (âm và dương) và tính tổng các
số âm, tổng các số dương. Việc nhập kết thúc nếu số nhập vào là 0.
Bài tập 10: Sử dụng cấu trúc Do While … Loop. Hãy cho biết cần gửi số tiền tiết
kiệm 1 triệu đồng vào ngân hàng trong thời gian mấy năm để có 2 triệu đồng. Biết
rằng lãi suất hàng năm là 8%.
Bài tập 11: Thốt khỏi vịng lặp với Exit For, Exit Do. Viết chương trình nhập số

nguyên n và kiểm tra xem có phải là số nguyên tố hay không ?.
Bài tập 12: Sự tương đương giữa các cấu trúc lặp. Tính n! sử dụng các cấu trúc
lặp khác nhau.
Bài tập 13: Sử dụng vòng lặp FOR
Lập trình tính tổng của dãy số sau và hiển thị kết quả ra màn hình :
S=

8

∑ n2 +
n =1

200

∑ n2 +

n =100

310

∑n

2

n =300

Bài tập 14 – Tính N !: Viết chương trình nhập số ngun N (0Bài tập 15- Tính tổng 1 dãy số: Tính tổng của dãy sau, với n nhập từ bàn phím:
S = 1. n + 2 + 2. n + 3 + 3. n + 4 + ... + i. n + (i + 1) + ... + n. n + (n + 1)


Bài tập 16- Tính dãy Fibonasi: Tính tổng của day số Fibonasi theo 2 cách: bằng đệ
qui và không đệ qui, với N nhập từ bàn phím. Biết rằng dãy số Fibonasi được định
nghĩa như sau:
F (n) = 1 nếu n = 0, n = 1
F (n) = Fn-2 + Fn-1 nếu n ≥ 2
Bài tập 17- Tìm Ứơc số chung lớn nhất : Tìm ước số chung lớn nhất của 2 số a và
b (a,b nhập từ bàn phím).
Bài tập 18-Tối giản phân số : Kiểm tra xem phân số a/b (a, b nhập từ bàn phím) đã
tối giản hay chưa? Nếu chưa tối giản thì hãy thực hiện rút gọn phân số đó và in ra
màn hình.

Trang 2


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Bài tập 19- Tìm số nguyên tố: Nhập vào một dãy số nguyên dương bằng hàm
InputBox. Sau đó in ra các giá trị là số nguyên tố.
Bài tập 20-Đếm ký tự: Lập trình cho người dùng nhập vào một xâu ký tự S. Sau đó
đếm xem trong xâu nhập vào có bao nhiêu ký tự là a và A.
Biết rằng :
- Hàm Mid(S, i, 1) cho ta ký tự thứ i trong xâu S
- Hàm Len(S) cho ta độ dài của xâu S
Bài tập 21-Tính tổng dãy số: Viết chương trình nhập x và n rồi tính tổng
x x2 x3
xn
S = 1+ +
+

+ ... +
2 3
4
n +1
x 0 x1 x 2 x 3
xn
(Hay có thể viết dưới dạng S =
)
+ +
+
+ ... +
1
2
3
4
n +1
Bài tập 22 : Bài tốn tìm phần tử lớn nhất (nhỏ nhất) trong một danh sách
Viết chương trình nhập n số nguyên vào một mảng ngun A, sau đó tìm số lớn nhất
trong mảng nguyên đó.
Bài tập 23: Liệt kê các phần tử lớn nhất (nhỏ nhất) trong danh sách.
Nhập danh sách gồm n số nguyên, sau đó hiển thị các phần tử có giá trị lớn nhất.
Bài tập 24: Sắp xếp một dãy số nguyên. Viết chương trình cho phép nhập vào N
số nguyên. Sau đó sắp xếp dãy số này theo chiều tăng dần và hiển thị dãy đã sắp
xếp ra màn hình bằng lệnh Debug.Print.
Bài tập 25 – Quick Sort: Nhập vào một dãy N số nguyên dương, sau đó sắp xếp
dãy này tăng dần theo giải thuật Quick-Sort. Kết quả in ra bằng hàm Debug.Print.
Bài tập 26- Heap Sort: Nhập vào một dãy N số nguyên dương, sau đó sắp xếp dãy
này tăng dần theo giải thuật Heap-Sort. Kết quả in ra bằng hàm Debug.Print.
Bài tập 27: Sắp xếp một dãy các phần tử, trong đó mỗi phần tử là một xâu ký
tự theo vần Alphabet (Theo thứ tự từ điển) bằng thuật tốn sắp xếp đơn giản.

Viết chương trình nhập vào danh sách tên của một lớp, sau đó sắp xếp theo vần
Alphabet và hiển thị kết quả sắp xếp ra màn hình bằng hàm Debug.Print
Bài tập 28-Chuẩn hố xâu: Nhập vào một xâu ký tự bất kỳ sau đó chuẩn hố và in
ra màn hình. Xâu chuẩn hố ở đây là xâu khơng có 2 dấu trắng liền nhau, khơng có
dấu trắng ở hai đầu và sau dấu chấm hoặc dấu phảy phải có một dấu trắng.
Bài tập 29-Chuẩn hoá xâu: Yêu cầu như bài 28 và mỗi ký tự đầu câu là chữ HOA.
Bài tập 30-Tách số khỏi xâu: Nhập vào một xâu ký tự có chứa cả chữ số và chữ
cái ví dụ: “Ngày mồng 2 tháng 9 năm 1945 Bác Hồ đã đọc tuyên ngôn độc lập tại
Quảng trường Ba Đình lịch sử !”. Giả sử các số là nguyên dương. Hãy tách các số
đó ra khỏi xâu và in ra màn hình (Ở đây sẽ tách được 3 số là 2, 9 và 1945).

Trang 3


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Bài tập 31-Tách Câu: Nhập vào một xâu ký tự bất kỳ, kết thúc mỗi câu là một dấu
chấm. Hãy in mỗi câu trong xâu đó trên một dòng bằng hàm Debug.print.
Bài tập 32-Chuyển đổi Font chữ: Giả sử một tệp văn bản có nội dung được định
dạng với font chữ .vntime, Hãy chuyển nội dung của tệp này sang font chữ VIQR và
lưu vào một tệp khác. Tên tệp nguồn và tệp đích tương ứng là : c:\FontVNTime.txt và
c:\FontVIQR.txt.
Bài tập 33-Thống kê ký tự trong xâu: Nhập một xâu ký tự bất kỳ, sau đó in ra màn
hình số lượng từng loại ký tự đã nhập.
Bài tập 34-Thay thế ký tự: Nhập vào một xâu, sau đó thay thế tất cả các ký tự trắng
(chr(32)) bằng ký tự “_”. Kết quả in ra màn hình bằng hàm MsgBox.
Bài tập 35-Cộng số nguyên lớn: Viết chương trình cộng 2 số nguyên dương lớn
bất kỳ và in kết quả ra màn hình.

Bài tập 36-Ma trận số: Viết chương trình nhập vào một ma trận gồm m hàng và n
cột. Sau đó tính tổng các phần tử dương, tổng các phần tử trên 2 đường chéo chính.
Bài tập 37- Kiểm tra "đường thẳng" trong ma trận: Nhập một ma trận vng kích
thước N x N. Ma trận này chỉ chứa các số 0 và 1. Hãy lập trình để cho biết ma trận
đó có ít nhất 5 phần tử thẳng hàng (ngang, dọc, chéo xi, chéo ngược) có cùng giá
trị là 1 hay không ?
Bài tập 38- Mảng bản ghi: Viết chương trình nhập vào một danh sách cán bộ, sau
đó sắp xếp danh sách cán bộ theo tuổi và lưu vào một tệp tên là Canbo.txt. Thông tin
về cán bộ gồm: Họ và tên, Năm sinh, Quê quán, Hệ số lương.

PHỤ LỤC 1
Dưới đây là mô tả một số hàm rất hay dùng trong VB để bạn tham khảo trong khi lập
trình và cho các bài tập sau này .
Tên hàm
Mơ tả
Ví dụ
Abs (x)
Sqr(x)
Round(x)
Asc(Ch)
Chr(n)
UCase(S)
LCase(S)
Len(S)
Mid(S,i,n)
Left(S, n)
Right(S,n)
Trim(S)
LTrim(S)
RTrim(S)

StrReverse(S)
Str(x)
Val(S)
Instr(n,S1,S2)
Split(S, C)

Hàm tính giá trị tuyệt đối của một số.
Tính căn bậc hai của một số x (x>=0)
Làm tròn số x
Trả về mã của ký tự Ch
Trả về ký tự có mã Ascii là n
Trả về xâu chữ hoa (Nhưng không làm thay đổi
đến xâu S)
Trả về xâu chữ thường (Nhưng không làm thay
đổi đến xâu S)
Trả về độ dài của xâu S
Lấy một xâu con trong S từ vị trí thứ i, n ký tự.
Nếu bỏ qua tham số n thì mặc định là lấy từ vị trí i
đến hết xâu.
Lấy ra n ký tự trong xâu S tính từ bên trái
Lấy ra n ký tự trong xâu S tính từ bên phải
Trả về một xâu S nhưng bỏ các dấu trắng hai đầu
(Xâu S không bị thay đổi).
Giống như Trim(S) nhưng chỉ cắt phía trái
Giống như Trim(S) nhưng chỉ cắt phía phải
Đảo ngược xâu S (S không bị thay đổi)
Chuyển số x sang dạng xâu
Chuyển một xâu sang dạng số
Kiểm tra xâu S2 có năm trong xâu S1 hay khơng.
Hàm trả về giá trị > 0 nếu có.

Tách xâu S thành các phần tử, với ký hiệu phân

Abs(-5)
5
Sqr(4)
2
Round(3.2)
3
Asc("A")
65
Chr(65)
"A"
UCase("aBc")

"ABC"

UCase("aBc")

"abc"

Len("abc123")

6

Mid("ABCDE", 2,3)

"BCD"

Left(S,"ABCD",3)
"ABC"

Right(S,"ABCD",3)
"BCD"
Trim(" ABC ")

"ABC"

LTrim(" ABC ")
"ABC "
RTrim(" ABC ")
" ABC"
StrReverse("AB")
"BA"
Str(10)
"10"
Val("10")
10
Instr(1,"ABC", "BC")

2

Dim S As string, R As

Trang 4


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

tách là C.


Replace
(S, S1, S2)
FileLen(F)
CurDir

Cho biết kích thước của file F tính theo bytes
Trả về đường dẫn của thư mục hiện hành

Year(D)

Trả về năm của biến kiểu Date D

Month(D)
Day(D)
Hour(T)
Now
Time

Trả về tháng của biến kiểu Date D
Trả về ngày của biểu thức kiểu Date D
Trả về giờ của biểu thức kiểu Time T
Hàm trả về ngày tháng hiện hành
Trả về giờ phút giây hiện hành
Hàm trả về một số ngẫu nhiên trong khoảng [0, 1)
Lưu ý: trước đó phải gọi thủ tục Randomize.

Rnd

Thay thế các xâu con S1 trong S bằng xâu S2


Variant
Dim I As integer
S = “ha,noi,viet,nam”
R = Split(S,”,”)
For i=0 to Ubound(R)
Msgbox R(i)
Next
Dim S As string
S = Replace(“A!!”,”!!”,”!”)
MsgBox FileLen("C:\io.sys")
Msgbox CurDir
Dim D As Date
D = Now
Msgbox Year(D)
MsgBox Month(Now)
Day(#21/2/2004#)
21
Hour(Time)
Msgbox now
Msgbox Time
Msgbox Rnd

B. HƯỚNG DẪN - GIẢI MẪU
Bài tập 1
a. Hướng dẫn: Cần tính giá trị của ∆, Sau đó sử dụng cấu trúc lệnh If...Then...Else
(Hoặc cấu trúc Select Case) để kiểm tra ∆ và tính nghiệm.
b. Chương trình mẫu:
Cách 1: Sử dụng cấu trúc If..Then … Else


Cách 2: Sử dụng cấu trúc Select Case

Private Sub Form_Load()
Dim a As Single, b As Single
Dim c As Single
Dim Delta As Single
Dim x1 As Single, x2 As Single

Private Sub Form_Load()
Dim a As Single, b As Single
Dim c As Single
Dim Delta As Single
Dim x1 As Single, x2 As Single

a = InputBox("Nhập hệ số a (a <> 0) :")
b = InputBox("Nhập hệ số b : ")
c = InputBox("Nhập hệ số c : ")
Delta = b ^ 2 - 4 * a * c
If Delta < 0 Then
MsgBox "Vô nghiệm ", vbInformation
Else
If Delta = 0 Then
x1 = -b / (2 * a)
MsgBox "Có nghiệm kép:" & x1
Else
x1 = (-b + Sqr(Delta)) / (2 * a)
x2 = (-b - Sqr(Delta)) / (2 * a)
MsgBox "x1=" &x1 & " x2=" &x2
End If '//// Của If Delta = 0
End If

'//// Của If Delta < 0
End Sub

a = InputBox("Nhập hệ số a (a<>0):")
b = InputBox("Nhập hệ số b : ")
c = InputBox("Nhập hệ số c : ")
Delta = b ^ 2 - 4 * a * c
Select Case Delta
Case Is < 0
MsgBox "Vô nghiệm "
Case 0
x1 = -b / (2 * a)
MsgBox "Nghiệm kép:" & x1
Case Is > 0
x1 = (-b + Sqr(Delta)) / (2 * a)
x2 = (-b - Sqr(Delta)) / (2 * a)
MsgBox "x1=" &x1 &" x2=" &x2
End Select
End Sub

c. Ghi chú: Cấu trúc Select Case của VB rất mạnh, nó khơng những kiểm tra biểu
thức ở dạng số ngun mà cịn có thể kiểm tra cả dạng số thực, xâu ký tự, đồng thời
với mối loại giá trị có thể kiểm tra một khoảng giá trị (sử dụng từ khoá Case is …)
Trang 5


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005


Bài tập 2
a. Hướng dẫn: Lương thực lĩnh (LTL) = HSL * LCB + Phụ cấp chức vụ. Để tính Phụ
cấp chức vụ, cần sử dụng câu lệnh If ... Then để kiểm tra xem chức vụ nhập vào có
là "giam doc", "truong phong" hay "to truong" hay khơng để cộng thêm.
b. Chương trình mẫu:
Chương trình nhập và tính lương
Private Sub Form_Load()
Dim HSL As Long, LCB As Long, PCCV As Long, LTL As Long
Dim CV As String
LCB = InputBox("nhập vào lương cơ bản : ", "Tính lương", 290000)
HSL = InputBox("nhập vào hệ số lương", "Tính lương", 1.92)
CV = InputBox("Chức vụ ")
If CV = "giam doc" Then LTL = HSL * LCB + 500000
If CV = "truong phong" Then LTL = HSL * LCB + 300000
If CV = "to truong" Then LTL = HSL * LCB + 20000
If CV = "nhan vien" Then LTL = HSL * LCB
End Sub

c. Ghi chú: Có thể thay thế cấu trúc If...Then ở trên bằng cấu trúc If....Then...ElseIf
hoặc bằng cấu trúc đa rẽ nhánh Select Case (Đây là cấu trúc phù hợp nhất)
Bài tập 3
a. Hướng dẫn: Cấu trúc Case trong VB cho phép kiểm tra cả biểu thức dạng Xâu, Số
nên có thể áp dụng vào giải quyết bài toán này.
b. Chương trình mẫu:
Tính lương đơn giản minh hoạ cấu trúc Select Case
Private Sub Form_Load()
Dim HSL As Long, LCB As Long, PCCV As Long, LTL As Long
Dim CV As String
LCB = InputBox("nhập vào lương cơ bản : ", "Tính lương", 290000)
HSL = InputBox("nhập vào hệ số lương", "Tính lương", 1.92)

CV = InputBox("Chức vụ ")
Select Case CV
Case "giam doc"
LTL = HSL * LCB + 500000
Case "truong phong"
LTL = HSL * LCB + 300000
Case "to truong"
LTL = HSL * LCB + 20000
Case Else
LTL = HSL * LCB
End Select
MsgBox "Lương của bạn là : " & LTL
End Sub

C. Ghi chú: Để chương trình vẫn tính đúng cho dù người dùng có thể nhập chức vụ
ở dạng chữ thường hay chữ HOA thì nên UCase các xâu trước tiên. (Xem phụ lục 1)

Trang 6


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Bài tập 4
a. Hướng dẫn: Để hiển thị hộp thoại Msgbox với các nút và biểu tượng khác nhau, ta
chỉ cần thêm các hằng vào tham số thứ 2 của hàm MsgBox, ví dụ : vbQuestion,
vbYesNo, vbOKCancel, vbInformation, vbAbortRetryIgnore....
Ngoài ra, để biết người dùng muốn hiển thị loại hộp thoại nào (nhập vào số mấy) cần
sử dụng cấu trúc Select Case để kiểm tra và ra quyết định.

b. Chương trình mẫu:
Private Sub Form_Load()
Dim Kieu As Byte
Kieu = InputBox("B¹n hÃy nhập vào một số (1-4) để chọn kiểu MsgBox : ")
Select Case Kieu
Case 1: MsgBox "Kiểu đơn giản chỉ có nút OK" '///Viết nhiều lệnh cần cách nhau dấu ":"
Case 2: MsgBox "Cã 2 nót Yes vµ No", vbYesNo
Case 3: MsgBox "Cã nót OK, Cancel vµ dÊu hái chÊm", vbOKCancel Or vbQuestion
Case 4: MsgBox "Cã 3 nót vµ dÊu cảnh báo màu đỏ", vbAbortRetryIgnore Or vbCritical
Case Else: MsgBox "Bạn phải nhập 1,2,3 hoặc 4", vbExclamation, "nhập sai"
End Select
End Sub

c. Ghi chú:




Có thể kết hợp hiển thị các nút, các biểu tượng bằng cách tổ hợp OR giữa
các hằng số: Ví dụ vbOKCancel Or vbExclamation để hiển thị 2 nút
OK/Cancel kèm thêm biểu tượng khuyến cáo ….
Hàm MsgBox luôn trả về một số để cho biết là người dùng vừa click chọn nút
nào của hộp thơng báo MsgBox. Ví dụ: giá trị trả về là vbOK, vbCancel….

Bài tập 5
a. Hướng dẫn:
Việc cộng, trừ, nhân hay chia a với b v.v... cịn phụ thuộc vào phép tốn (tốn tử) mà
người dùng nhập vào là gì. Do vậy, để ra quyết định là thực hiện phép toán nào lên 2
toán hạng a và b đó, cần sử dụng cấu trúc Select Case để kiểm tra tốn tử nhập
vào.

b. Chương trình mẫu:
Private Sub Form_Load()
Dim a As Single, b As Single, KetQua As Single
Dim PhepToan As String
a = InputBox("NhËp sè h¹ng thø nhÊt: ")
PhepToan = InputBox("Nhập vào phép toán (+,-,*,/,mod,div,^)")
b = InputBox("Nhập số hạng thø hai: ")
Select Case PhepToan
Case "+": KetQua = a + b
Case "-"
KetQua = a - b
Case "*": KetQua = a * b
Case "/": KetQua = a / b
Case "div": KetQua = a \ b
Case "mod": KetQua = a Mod b
Case "^": KetQua = a ^ b

Trang 7


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPMHSPKT HY 2005

Case Else: MsgBox "Tôi không hiểu phép toán này !", vbExclamation, "Nhập sai"
End Select
MsgBox "Kết quả của " & a & PhepToan & b & " lµ : " & KetQua
End Sub

Thực hiện các phép toán cơ bản dùng cấu trúc Select Case

C. Ghi chú : các phép chia nguyên và chia dư trong VB:

• Phép chia \ là phép chia lấy phần nguyên: Ví dụ 10 \ 3 = 3. Phép chia / là
phép chia thông thường (lấy cả phần nguyên và phần dư), ví dụ: 5 / 2 = 2.5.

• Phép mod là chia lấy phần dư, ví dụ 10 mod 3 = 1, 6 mod 4 = 2 v.v…
Bài tập 6
a. Hướng dẫn: S là tổng các số hạng thứ i, với i chạy từ 1 đến N, Số hạng tổng quát
là i. Do vậy để tính tổng của dãy số S, có thể sử dụng một trong 3 loại vịng lặp đã
biết.
b. Chương trình mẫu (Gõ đoạn mã trong thủ tục Form_Load)
Cách 1: Sử dụng vòng lặp For
Dim i As Integer
Dim N As Integer
Dim S As Long
N=Inputbox("Nhập số N (N>0) : ")
S=0
For i=1 To N
S=S+i
‘///S = S + <Số hạng tổng quát>
Next
Msgbox "Tổng = " & S
Cách 2: Sử dụng vòng lặp Do...Loop Until
Dim i As Integer
Dim N As Integer
Dim S As Long
N=Inputbox("Nhập số N (N>0) : ")
S=0
i=1
Do

S=S+i
i=i+1
Loop UNTIL i > N
Msgbox "Tổng = " & S
Cách 3 : Dùng vòng lặp Do While ... Loop
Dim i As Integer
Dim N As Integer
Dim S As Long
N=Inputbox("Nhập số N (N>0) : ")
S=0
i=1
Do While i <= N
Trang 8


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

S=S+i
i=i+1
Loop
Msgbox "Tổng = " & S
Bài tập 7
a. Hướng dẫn: Có nhiều cách tính nhưng trong trường hợp này có thể sử dụng vịng
lặp For kết hợp với điều khoản Step:
b. Chương trình mẫu:
Private Sub Form_Load()
Dim i As Integer, S As Long
S=0

For i = 2 To 100 Step 2
S=S+i
Next
MsgBox "Tổng các số chẵn từ 1->100 là : " & S
End Sub
c. Ghi chú:



Nếu khơng có điều khoản Step thì sau mỗi lần lặp biến chạy i tự động được
tăng lên 1 đơn vị. Cịn nếu có điều khoản Step 2 thì sau mỗi lần lặp, biến chạy
i được tăng lên 2 đơn vị. Tổng quát, nếu Step N (N nguyên âm hoặc dương)
thì sau mỗi lần lặp, biến chạy được tăng (nếu N > 0) hay giảm đi (Nếu N<0) n
đơn vị.



Nếu cho i chạy từ 1 (For i = 1 TO 100…) thì kết quả cho ta là tổng các số lẻ .

Bài tập 8
a. Hướng dẫn: Thơng thường trong VB, với vịng lặp For thì cứ sau mỗi lần lặp biến
chạy tự động được tăng lên 1 đơn vị. Tuy nhiên, trong một số trường hợp ta muốn
biến chạy thay đổi theo chiều giảm dần (Tương tự như For… Downto … của
Pascal), tức là sau mỗi lần lặp thì biến chạy lại bị giảm đi một đơn vị thì cần phải sử
dụng đến điều khoản Step N với N là một số âm. Nếu muốn sau mỗi vòng lặp biến
chạy i giảm đi một đơn vị thì ta cần viết : For i = N to 1 Step -1
b. Chương trình mẫu:
Private Sub Form_Load()
Dim i As Integer
For i = 100 To 1 Step -1

Debug.Print i
Next
End Sub

Bài tập 9
a. Hướng dẫn: Vì khơng biết người dùng nhập bao nhiêu số do vậy ta có thể dùng
vịng lặp khơng xác định để tiến hành cơng việc nhập. Ngồi ra, cũng cần có 2 biến
để lưu tổng các số âm và dương. Điều kiện kết thúc vòng lặp sẽ là n=0.

Trang 9


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

b.Giải mẫu:
Private Sub Form_load()
Dim n As Long, i As Long
Dim TongAm As Long
Dim TongDuong As Long
TongAm = 0
TongDuong = 0

'/// Khëi t¹o tr−íc khi tÝnh tỉng
'/// Khëi t¹o trớc khi tính tổng

Do
n = InputBox("Nhập vào một số nguyên : ")
If n > 0 Then

TongDuong = TongDuong + n
Else
TongAm = TongAm + n
End If
Loop Until n = 0
'/// Lặp cho đến khi nào nhập n = 0 thì dừng.
MsgBox "Tổng các số âm = " & TongAm & ". Tong các số dơng = " & TongDuong
End Sub

c. Ghi chú:






Vịng lặp Do …. Loop Until <ĐK> sẽ kết thúc khi điều kiện <ĐK> bằng true
Vòng lặp Do…Loop Until khác với vòng lặp dạng Do….Loop While <ĐK> ở
chỗ vòng lặp Do…Loop While <ĐK> kết thúc khi <ĐK> vẫn là False.
Thực chất, cấu trúc lặp Do…Loop Until và Do … Loop While là tương
đương nhau, do vậy để tránh nhầm lẫn chúng ta chỉ nên nhớ một loại khi thực
hành.
Có thể thốt khỏi vịng lặp dạng Do… Loop bằng câu lệnh Exit Do

Bài tập 10
a. Hướng dẫn: Vì khơng thể biết được là sau bao nhiêu năm thì tổng số tiền sẽ là
2.000.000, mà chỉ biết rằng mỗi năm sẽ tăng thêm một lượng nào đó. Do vậy, ở đây
ta sẽ sử dụng vịng lặp khơng xác định và mỗi lần lặp ta sẽ kiểm tra xem đã được số
tiền cần thiết hay chưa? Nếu đủ rồi thì thốt và số lần thử chính là số năm cần tìm.
Nhưng ở đây tại sao ta lại sử dụng vòng lặp Do While…Loop mà khơng là Do

…Loop ?. Sở dĩ sử dụng vịng lặp Do While … Loop là vì rằng số tiền gửi vào ban
đầu đã rất có thể lớn hơn số tiền kỳ vọng !
b. Chương trình mẫu:
Private Sub Form_Load()
Dim SoNam As Integer, TongTien As Long
SoNam = 0
TongTien = 1000000
Do While TongTien < 2000000
SoNam = SoNam + 1
TongTien = (1 + 0.05) ^ SoNam * TongTien /// Công thức cần nhớ
Loop
MsgBox "Cần phải gửi trong " & SoNam & " năm !"
End Sub
c. Ghi chú: Đây là bài tốn tính tiền gửi tiết kiệm, GDP có thể áp dụng trong cuộc sống

Trang 10


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Bài tập 11
a. Hướng dẫn: Một số N được gọi là số nguyên tố nếu như nó chỉ chia hết cho 1 và
chính nó. Hay nói cách khác là số N khơng là ngun tố nếu như nó chia hết cho ít
nhất một số nằm trong khoảng [2…N-1]. Như vậy, để kiểm tra ta chỉ cần duyệt tất cả
các số i trong phạm vi từ [2…N-1] xem N mod i = 0 ?, nếu xảy ra thì kết luận ngay
rằng N không là nguyên tố, trái lại nếu sau khi đã duyệt hết mà khơng thấy trường
hợp đó xảy ra thì kết luận N là nguyên tố.
Người ta đã chứng minh được rằng không cần phải duyệt từ [2…N-1] mà chỉ cần

duyệt trong phạm vi hẹp hơn là từ [2.. N ] .
b. Chương trình mẫu:
Private Sub Form_Load()
Dim n As Integer, i As Integer, KetQua As Boolean
n = InputBox("Nhập vào một số nguyên ")
KetQua = True
For i = 2 To Sqr(n)
If n Mod i = 0 Then
KetQua = False
Exit For

/// Thoát ngay khỏi vòng lặp For

End If
Next
If KetQua = True Then MsgBox n & là số nguyên tè !”
If KetQua = False Then MsgBox n & “ không phải là số nguyên tố !
End Sub
c. Ghi chỳ:

ã

thốt vơ điều kiện khỏi vịng lặp Do While…, Do…Loop While hay
Do … Loop Until thì cần gọi lệnh Exit Do



Hàm Sqr(n) trong VB dùng để tính n (khơng phải là tính bình phương như
trong một số ngơn ngữ lập trình khác – như Pascal).




Nếu cơng việc gì chỉ làm một lần (ví dụ thơng báo kết quả như trên) thì
“KHƠNG BAO GIỜ” được đặt trong vịng lặp mà phải đặt ở ngồi vịng lặp. Vì
đặc điểm của vịng lặp là “lặp đi lặp lại” nhiều lần một công việc !

Bài tập 12
a. Hướng dẫn: Giai thừa của số N được tính theo cơng thức N!=1.2.3…N-1.N. Để
tính tốn ta thực hiện nhân dồn các số i ( i = 1 ÷ N) vào kết quả.
b. Chương trình mẫu:
Private Sub Form_Load()
Dim n As Integer, i As Integer, KetQua As Long

Trang 11


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPMHSPKT HY 2005

'/// Nhập số n, đảm bảo 0
Do
n = InputBox("CÇn tÝnh giai thõa cđa mÊy : ")
Loop Until (0 < n And n < 10)
'/// Sử dụng vòng lặp For

KetQua = 1
For i = 1 To n
KetQua = KetQua * i

Next
Debug.Print "KÕt qu¶ cđa " & n & "! = " & KetQua
'/// Sử dụng vòng lặp Do While

KetQua = 1
i=1
Do While i <= n
KetQua = KetQua * i
i=i+1
Loop
Debug.Print "KÕt qu¶ cđa " & n & "! = " & KetQua
'/// Sử dụng vòng lặp Do Until

KetQua = 1
i=1
Do Until i > n
KetQua = KetQua * i
i=i+1
Loop
Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua
'/// Sử dụng vòng lặp Do ... Loop While

i=1
KetQua = 1
Do
KetQua = KetQua * i
i=i+1
Loop While i <= n
Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua
'/// Sử dụng vòng lặp Do ... Loop Until


i=1
KetQua = 1
Do
KetQua = KetQua * i
i=i+1
Loop Until i > n
Debug.Print "KÕt qu¶ cña " & n & "! = " & KetQua
End Sub

c. Ghi chú:





Có thể tính N! bằng phương pháp đệ qui : GiaiThua = GiaiThua (n-1) * N.
Người ta đã chứng minh được rằng tất các cấu trúc lặp đều có thể viết tương
đương theo các cấu trúc khác.
Trong VB có rất nhiều cấu trúc lặp, tuy nhiên chỉ cần thuộc 3 cấu trúc sau là đủ:
o For …
Trang 12


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN



Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005


o Do
………
Loop Until <ĐK>
o Do While <ĐK>
……..
Loop
Cấu trúc Do While <ĐK> … Loop và Do Until <ĐK>…. Loop cùng có điểm
giống nhau là kiểm tra điều kiện trước khi lặp (giống như cấu trúc While …do
trong Pascal hay While trong C/C++) nhưng cấu trúc Do While <ĐK> …
Loop chỉ lặp khi điều kiện <ĐK> vẫn đúng, còn cấu trúc Do Until <ĐK>….
Loop chỉ lặp khi điều kiện <ĐK> vẫn sai (Hay thốt nếu <ĐK> là đúng).



Cấu trúc Do … Loop While <ĐK> và cấu trúc Do … Loop Until <ĐK> cùng
giống nhau là thực hiện lặp sau đó mới kiểm tra điều kiện (Giống cấu trúc
Repeat … Until trong pascal hay do … While trong C/C++), nhưng cấu trúc
Do … Loop While <ĐK> chỉ lặp nếu điều kiện vẫn cịn đúng, trong khi đó cấu
trúc Do … Loop Until <ĐK> chỉ lặp nếu biểu thức điều kiện vẫn cịn sai (Hay
nói cách khác là kết thúc lặp nếu điều kiện lặp là đúng)



Khi thực hành, khơng nhất thiết phải nhớ cả 4 kiểu lặp đã nêu ở trên mà bạn
nên vận dụng thành thạo 3 cấu trúc lặp được khuyến cáo dùng là For, Do
While và Do … Loop Until, vì 3 cấu trúc này tương tự như các cấu trúc lặp
trong một số ngơn ngữ lập trình phổ biến khác (For,While…do,Repeat
..Until).

Bài tập 13

a. Hướng dẫn: Ta có thổng S = S1 + S2 + S3, với S1, S2, S3 tương ứng với 3 tổng
trên. Sử dụng vòng lặp để tính tổng của mỗi Si, sau đó cộng lại để được kết quả.
b. Chương trình mẫu:
Private Sub form_load()
Dim i As Integer
Dim Tong As Long
Dim S1 As Long, S2 As Long, S3 As Long
Tong = 0
' Đầu tiên do ch−a tÝnh nªn Tong b»ng 0
S1 = 0
S2 = 0
S3 = 0
'/// TÝnh tæng S1
For i = 1 To 8
S1 = S1 + i ^ 2
Next
'/// TÝnh tæng S2
For i = 100 To 200
S2 = S2 + i ^ 2

Next
'/// TÝnh tæng S3
For i = 300 To 310
S3 = S3 + i ^ 2

Next
S = S1 + S2 + S3
MsgBox "Tổng là : " & Tong, vbInformation, "Thông báo ..."
End Sub


Trang 13


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Bài tập 14:
a. Hướng dẫn: Cơng thức tính giai thừa của số N là: N! = 1.2.3…N-1.N, như vậy ở
đây ta cần nhân liên tiếp các số i (i chạy từ 1 đến n) vào kết quả. Trong đó, giá trị
khởi tạo cho kết quả là 1. Bài này có thể giải theo cách đệ qui hoặc khơng đệ qui.
b. Chương trình mẫu
Cách 1: Dùng vịng lặp (Khơng dùng đệ qui)
Private Sub Form_Load()
Dim i As Integer, n As Integer
Dim KetQua As Long
'/// NhËp sè n (0
Do
n = InputBox("NhËp sè N : ", "TÝnh giai thõa")
Loop Until (0 < n And n < 20)
KetQua = 1
For i = 1 To n
KetQua = KetQua * i
Next
MsgBox n & " ! bằng " & KetQua
End Sub
Cách 2: Dùng đệ qui
'/// Hµm ®Ö qui tÝnh N !


Function GiaiThua(ByVal N As Integer) As Long
If N = 1 Then
GiaiThua = 1
Else
GiaiThua = GiaiThua(N - 1) * N
End If
End Function
Private Sub Form_Load()
Dim i As Integer, N As Integer
Dim KetQua As Long
'/// NhËp sè n (0
Do
N = InputBox("NhËp sè N : ", "TÝnh giai thõa")
Loop Until (0 < N And N < 20)
MsgBox N & " ! bằng " & GiaiThua(N)
End Sub

Trang 14


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Bài tập 15:
a. Hướng dẫn: Với bài toán dạng tính tổng của một chuỗi số khi biết số hạng tổng
quát Si, nói chung là đơn giản. Có thể thực hiện theo giải thuậ như sau:
S=0
For i = i0 TO in

S = S + Si
Next
Với mỗi dãy khác nhau thì giá trị i0, N, Si có thể khác nhau và cần phải xác định.

- Giá trị i0 và N thường xác định bởi giải phương trình Si = S0 và Si = Sn
- Số hạng tổng quát Si thường có thể nhìn thấy ngay trong đề bài.
Trong bài này:

-

S i = i * n + (i + 1)

-

Xác định i0: Cho S0 = Si ⇔ 1 * n + 2 = i * n + (i + 1) ⇒ i0=1

-

Xác định in: Cho Sn = Si ⇔ n * n + (n + 1) = i * n + (i + 1) ⇒ in=n

b. Chương trình mẫu:
Private Sub Form_Load()
Dim S As Single, i As Integer, N As Integer
N = InputBox("NhËp sè N : ")
S=0
For i = 1 To N
S = S + i * Sqr(N + (i + 1))
Next
MsgBox "Tổng của dÃy đà cho là : " & S
End Sub

Bài tập 16
a. Hướng dẫn: Với các bài toán được định nghĩa theo kiểu đệ qui thì cách giải phù
hợp và dễ nhất là theo giải thuật qui. Tuy nhiên, tốc độ bị chậm đáng kể khi số N lớn,
ngoài ra cịn có thể bị tràn Stack.
b. Chương trình mẫu:
'/// TÝnh d·y Fibonasi dïng §Ư qui

Function Fib_Dequi(ByVal N As Integer) As Long
If N = 0 Or N = 1 Then Fib_Dequi = 1
If N > 1 Then Fib_Dequi = Fib_Dequi(N - 2) + Fib_Dequi(N - 1)
End Function
'/// TÝnh d·y Fibonasi KHÔNG dùng Đệ qui

Function Fib_KhongDequi(ByVal N As Integer) As Long
Dim i As Integer
Dim F1 As Long, F2 As Long, KetQua As Long
F1 = 1
F2 = 1
KetQua = 1

Trang 15


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

i=2
Do While i <= N
KetQua = F1 + F2

F1 = F2
F2 = KetQua
i=i+1
Loop
Fib_KhongDequi = KetQua
End Function
'--------------------------------------------------------------------------------------------------------------------------'/// Chơng trình chÝnh

Private Sub Form_Load()
MsgBox "Fib (30) = " & Fib_Deq ui(30)
MsgBox "Fib (30) = " & Fib_KhongDequi(30)
End Sub

Chú ý: Riêng với bài tốn này, người ta cịn có thể giải bằng phương pháp qui hoạch
động (Dynamic Programming) rất đơn giản như sau:
Function Fib_DynamicPrgramming(ByVal N As Integer) As Long
Dim i As Integer
Dim F(1000) As Long '/// Bảng chứa giá trị đà tính toán đợc ở bớc trung gian
'/// Điểm xuất phát

F(0) = 1
F(1) = 1
For i = 2 To N
F(i) = F(i - 2) + F(i - 1)
Next
Fib_DynamicPrgramming = F(N)
End Function

Bài tập 17:
a. Hướng dẫn: Để tìm ước số chung lớn nhất của 2 số nguyên a và b, người ta có

thể dựa vào cơng thức Ơ-Le và cài đặt bằng vịng lặp hoặc đệ qui. Việc tìm ước số
chung được ứng dụng vào tối giản phân số.
b. Chương trình mẫu:
'/// T×m USCLN không dùng đệ qui

Function USCLN(a As Integer, b As Integer) As Integer
Dim Du As Integer
Du = a Mod b
Do While Du <> 0
a=b
b = Du
Du = a Mod b
Loop
USCLN = b
End Function

Trang 16


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPMHSPKT HY 2005

'/// Tìm USCLN bằng Đệ qui

Function USCLN_Dequi(a As Integer, b As Integer) As Integer
If a Mod b = 0 Then
USCLN_Dequi = b
Else
USCLN_Dequi = USCLN_Dequi(b, a Mod b)

End If
End Function
'----------------------------------------------------------------------------------------------------------------------------'/// Chơng trình chính

Private Sub Form_Load()
MsgBox "ớc số chung lớn nhÊt cđa 20 vµ 30 lµ : " & USCLN(20, 30)
MsgBox "−íc sè chung lín nhÊt cđa 20 vµ 30 lµ : " & USCLN_Dequi(20, 30)
End Sub

Bài tập 18:
a. Hướng dẫn: Phân số dạng a/b được gọi là tối giản nếu Ước số chung lớn nhất của
a và b là 1. Ví dụ: phân số 5/7 và 9/7 là tối giản; 4/6 và 6/4 là chưa tối giản.
b. Chương trình mẫu:
'/// T×m −íc sè chung lín nhÊt cđa 2 sè a vµ b

Function USCLN(a As Integer, b As Integer) As Integer
If a Mod b = 0 Then
USCLN = b
Else
USCLN = USCLN(b, a Mod b)
End If
End Function
'----------------------------------------------------------------------------------------------------------------------------'/// Chơng trình chính

Private Sub Form_Load()
Dim a As Integer, b As Integer, TuMoi As Integer, MauMoi As Integer
a = InputBox("NhËp tö sè : ")
b = InputBox("NhËp mÉu sè : ")
If USCLN(a, b) = 1 Then
MsgBox "Ph©n sè " & a & "/" & b & " đà tối giản", vbInformation

Else
TuMoi = a / USCLN(a, b)
MauMoi = b / USCLN(a, b)

‘/// TÝnh l¹i tư sè míi
‘/// Tính lại mẫu số mới

MsgBox "Phân số sau khi tối giản là : " & TuMoi & "/" & MauMoi
End If
End Sub

Bài tập 19:
a. Hướng dẫn: Trước hết cần xây dựng hàm kiểm tra xem số N có phải là ngun tố
hay khơng ? Sau đó sử dụng kết quả này vào giải quyết u cầu bài tốn.
b. Chương trình mẫu:
Trang 17


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

'/// Hµm kiĨm tra xem sè N cã phải là số nguyên tố hay không ?

Function LaSoNguyenTo(ByVal n As Integer) As Boolean
Dim i As Integer
LaSoNguyenTo = True
For i = 2 To Round(Sqr(n))
If n Mod i = 0 Then
LaSoNguyenTo = False

Exit Function
End If
Next
End Function
'----------------------------------------------------------------------------------------------------------------------------'/// Chơng trình chính

Private Sub Form_Load()
Dim i As Integer, n As Integer, DaySo(100) As Integer
n = InputBox("Sè phÇn tư cÇn nhËp : ", , 10)
For i = 1 To n
DaySo(i) = InputBox("NhËp sè thø " & i)
Next
For i = 1 To n
If LaSoNguyenTo(DaySo(i)) Then Debug.Print DaySo(i)
Next
End Sub

Bài tập 20
a. Hướng dẫn:
Để đếm số ký tự a và A trong một xâu S, chúng ta cần duyệt và kiểm tra lần lượt
từng ký tự nằm trong xâu S và so sánh với ký tự a và A. Để duyệt (lấy từng ký tự
trong xâu S) chúng ta có thể sử dụng một trong 3 loại vịng lặp. Hàm Mid(S,i,1) cho
ta ký tự tại vị trí thứ i trong xâu S.
b. Chương trình mẫu (Sử dụng vịng lặp Do While):
Form_load()
Dim S As String
Dim TongAa As Integer
Dim i As Integer
S = InputBox("Bạn hÃy nhập một xâu : ")
i=1

TongAa = 0

'Bắt đầu từ ký tự thứ nhất
'Khởi tạo số ký tự A hoa và a thờng ban đầu bằng 0.

Do While i <= Len(S)
If Mid(S, i, 1) = "A" Or Mid(S, i, 1) = "a" Then
TongAa = TongAa + 1
End If
‘/// Chuyển đến vị trí của ký tự tiếp theo
i=i+1
Loop
MsgBox "Tổng số ký tự a và A trong xâu là " & TongAa & " ký tù"
End Sub

Trang 18


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

C. Ghi chú: Trong vịng lặp For thì biến chạy sẽ được tự động tăng lên 1 đơn vị, còn
trong vòng lặp Do While ... Loop và Do...Loop biến chạy không tự động tăng lên 1,
do vậy ta phải tự thực hiện tăng biến chạy lên 1 đơn vị bằng câu lệnh i = i + 1 như
bài tập ở trên.
Bài tập 21:

xi
(Đây là số

i+n
hạng tổng quát) và i chạy từ 0 đến N. Do vậy để tính tổng chúng ta cần sử dụng một
trong 3 loại vòng lặp đã học.
a. Hướng dẫn: Tổng S chính là tổng của các số hạng thứ i, với Si =

b. Chương trình mẫu: (Sử dụng vịng lặp For, bạn hãy thực hiện với vòng lặp
do...While và do...Loop)
Private Sub Form_Load()
Dim i As Integer, N As Integer, x As Single
Dim S As Single
'///////// NhËp x vµ n ////////////////////////
x = InputBox("NhËp vµo sè x : ")
N = InputBox("NhËp vµo sè n : ")
S=0
'// Khëi t¹o tỉng S = 0
For i = 0 To N
S = S + x ^ i / (i + 1)
‘/// Nói chung là : S = S + <Số hạng tổng quát>
Next
MsgBox "Tæng S = " & S, vbInformation, "TÝnh tổng chuỗi"
End Sub

Chỳ ý: Khi tớnh tng ca mt dóy số bất kỳ, việc khó khăn nhất là phải xác định được
số hạng tổng quát Si, sau đó là cận dưới và cận trên của vịng lặp. Cịn tổng thì
thường tính theo cơng thức : S = S + Si
Bài tập 22
a. Hướng dẫn: Trước hết cần khai báo một mảng nguyên, sau đó hỏi người dùng
xem muốn nhập bao nhiêu số và sử dụng vòng lặp để tiến hành nhập dữ liệu cho
mảng.
Để tìm số lớn nhất, thơng thường ta giả định là phần tử đầu tiên. Sau đó dùng vòng

lặp để duyệt qua các phần tử còn lại và so sánh, nếu số đang xét lớn hơn số giả định
thì ta lại thay đổi giá trị của số giả định bằng phần tử đang xét.
b. Chương trình mẫu:
Private Sub Form_Load()
Dim i As Integer, N As Integer
Dim MAX As Integer
Dim A(100) As Integer
'Khai báo mảng A có 101 phần tử
'///////// Nhập số phần tử n
N = InputBox("Bạn cần nhập bao nhiªu sè: ")

Trang 19


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

For i = 1 To N
A(i) = InputBox("NhËp vào số thứ " & i)
Next
'/////// Tìm số lớn nhất trong N số vừa nhập ///////////////////////
MAX = A(1)
'///Giả định phần tử lớn nhất là phần tử A(1)
For i = 1 To N
If A(i) > MAX Then MAX = A(i)
Next
MsgBox "PhÇn tư lín nhÊt lµ : " & MAX
End Sub


C. Ghi chú: ở trên chúng ta đã khai báo mảng A(100) và như vậy phần tử đầu tiên là
A(0), nhưng khi nhập ta lại cho i chạy từ 1, tức là khơng sử dụng phần tử A(0). Đây
là thói quen sử dụng của mỗi người. Bạn có thể sử dụng A(0) hay khơng là tuỳ, cịn
nếu sử dụng A(0) thì vịng lặp trên sẽ có dạng : For i= 0 to N - 1 ....
Bài tập 23
a. Hướng dẫn: Cần phải tìm ra số lớn nhất, kí hiệu là MAX, sau đó hiển thị những
phần tử có giá trị bằng với MAX vừa tìm được.
b. Chương trình mẫu:
Private Sub Form_Load()
Dim i As Integer, MAX As Integer
Dim DS(100) As Integer, N As Integer
'/// Nhập các số

N = InputBox("Nhập số phần tử : ")
For i = 1 To N
DS(i) = InputBox("NhËp sè thø " & i)
Next
'/// Tìm số lớn nhất các số vừa nhËp

MAX = DS(1)
For i = 1 To N
If MAX < DS(i) Then MAX = DS(i)
Next
'/// Hiển thị những phần tử bằng với MAX (chính là những ptử lớn nhất)

For i = 1 To N
If DS(i) = MAX Then Debug.Print DS(i)
Next
End Sub
C. Ghi chú:

• Có thể áp dụng để giải bài tốn tìm số nhỏ nhất, in ra các số nhỏ nhất v.v…
• Trong danh sách khơng phải chỉ có duy nhất một phần tử lớn nhất (nhỏ nhất)
Bài tập 24
a. Hướng dẫn:
Để sắp xếp một dãy số A có N phần tử ta tiến hành như sau:
• Bắt đầu từ phần tử đầu tiên
Trang 20


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN





Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

Tại vị trí (phần tử) thứ i trong mảng A, Ta xét tất cả các số từ thứ i+1 đến N
xem có số nào nhỏ hơn phần tử thứ i đang xét hay khơng. Nếu có phần tử A(j)
nào đó nhỏ hơn A(i) thì hốn đổi giá trị của A(i) Cho A(j). Để hoán đổi A(i) với
A(j) ta thực hiện như sau:
o TrungGian = A(i)
o A(i) = A(j)
o A(j) = TrungGian
Lặp lại đối với các phần tử A(i) cho đến khi nào i >= N thì dừng.

b. Chương trình mẫu:
Private Sub Form_Load()
Dim i As Integer, N As Integer, TrungGian As Integer
Dim A(100) As Integer

'Khai báo mảng A có 101 phần tử
'///////// Nhập số phần tử N và nhập dữ liệu cho mảng A
N = InputBox("Bạn cần nhập bao nhiªu sè: ")
For i = 1 To N
A(i) = InputBox("NhËp vào số thứ " & i)
Next
'/////// Sắp xếp mảng A theo chiều tăng dần ///////////////////////
For i = 1 To N - 1
'///Duyệt từng phần tử từ 1 đến N-1
For j = i + 1 To N
'///Kiểm tra các phần tử còn lại đứng sau phần tử thứ i
If A(j) < A(i) Then '///Nu nh hn s i thi` Hoán đổi A(i) víi A(j)
TrungGian = A(i)
A(i) = A(j)
A(j) = TrungGian
End If
Next
Next
Debug.Print "D·y sau khi s¾p xÕp "
For i = 1 To N
Debug.Print A(i)
Next
End Sub

Chú ý:



Thuật tốn sắp xếp ở trên thường xun được sử dụng trong các bài tốn
khơng địi hỏi nhiều về tốc độ và nó có thể áp dụng để sắp xếp một danh sách

tổng quát (cả số và xâu), do vậy chúng ta cần nắm vững thuật toán này.



Nếu muốn sắp xếp danh sách theo chiều giảm dần thì chỉ việc thay câu lệnh
If A(j) < A(i) Then … Thành If A(j) > A(i) Then ….

Bài tập 25
a. Hướng dẫn: Về bản chất, giải thuật Quick_Sort sử dụng phương pháp “Chia để trị”
(Deive and Conquer). Có thể mơ tả thơ thuật tốn này như sau:
- Chọn một vị trí K ở giữa (Khơng nhất thiết là chính giữa) của danh sách L.
- Duyệt từng phần tử và xét: Nếu phần tử L[i] < L[k] thì cho vào danh sách con
L1, cịn nếu L[i] >= L[k] thì cho vào danh sách L2. Kết quả ta được:
L = L1 ∪ L[k] ∪ L2, Trong đó L[k] ở vị trí đúng. Tiếp tục thực hiện đệ qui với L1
và L2… Do L hữu hạn nên thuật toán sẽ dừng. Độ phức tạp của thuật tốn
này trung bình vào cỡ O(n) = n.Log2n.
Trang 21


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

b. Chương trình mẫu:
'/// Thđ tơc t¸ch danh sách thành 2 danh sách con và 1 vị trí ®óng (Chèt-K)

Sub TachDanhSach(DS() As Integer, ByVal L As Integer, ByVal R As Integer, K As Integer)
Dim i As Integer, j As Integer, Tam As Integer
i=L
j=R

Do While i < j
Do While DS(j) > DS(i)
j=j-1
Loop
Do While (DS(i) <= DS(L)) And (i < j)
i=i+1
Loop
If (j > i) Then
Tam = DS(i)
DS(i) = DS(j)
DS(j) = Tam
End If
Loop
K=j
Tam = DS(L)
DS(L) = DS(j)
DS(j) = Tam
End Sub
'----------------------------------------------------------------------------------------------------------------------------'/// Thùc hiƯn s¾p xÕp Quick_Sort

Private Sub Quick_Sort(ByRef DS() As Integer, ByVal L As Integer, ByVal R As Integer)
Dim K As Integer
If R > L Then
TachDanhSach DS, L, R, K
Quick_Sort DS, L, K - 1
Quick_Sort DS, K + 1, R
End If
End Sub
'----------------------------------------------------------------------------------------------------------------------------'/// Chơng trình chính


Private Sub Form_Load()
Dim i As Integer, n As Integer, DaySo(100) As Integer
n = InputBox("Sè phÇn tư cÇn nhËp : ", , 10)
For i = 1 To n
DaySo(i) = InputBox("NhËp sè thø " & i)
Next
Debug.Print "D·y sè sau khi sắp xếp là : " & vbCrLf
Quick_Sort DaySo, 1, n
For i = 1 To n
Debug.Print DaySo(i)
Next
End Sub

Trang 22


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

c. Ghi chú:



Trong phần khai báo hàm và thủ tục, nếu trước tham số hình thức khơng có
từ khố byref đứng trước thì VB hiểu đó là tham biến (tham chiếu).



Tham số hình thức trong phần khai báo chương trình con là một mảng thì phải

viết dưới dạng như sau: <Tên> () As <Kiểu cơ bản>, Cách viết: A (10) As
integer hay A (1 to 10) As String v.v… là sai !.



Giải thuật Quick_Sort thực hiện tương đối nhanh khi n lớn. Người ta gọi giải
thuật sắp xếp Quick_Sort và một số giải thuật sắp xếp nhanh khác (như
Merge sort, Heap sort…) thuộc phương pháp sắp “Công nghiệp”, do vậy cần
phải nhớ và vận dụng thành thạo giải thuật này.

Bài tập 26
a. Hướng dẫn: Ý tưởng của giải thuật này là dùng mảng một chiều để biểu diễn cây
nhị phân. Sau đó tinh chỉnh dần các cây con đã được sắp xếp để cho kết quả cuối
cùng.
b. Chương trỡnh mu
'/// Thủ tục hoán đổi giá trị của 2 biÕn a vµ b cho nhau (sÏ sử dơng trong chơng trình)

Sub Swap(a As Integer, b As Integer)
Dim Tam As Integer
Tam = a
a=b
b = Tam
End Sub
'----------------------------------------------------------------------------------------------------------------------------'/// Thđ tơc ®iỊu chØnh lại cây con bắt đầu từ nút i để nó trở thành một đống (Heap)
'/// Điều chỉnh tại nút i của cây DS, có N phần tử

Sub DieuChinhNut(i As Integer, N As Integer, DS() As Integer)
Dim R As Integer
If i > (N \ 2) Then Exit Sub
'/// So s¸nh con trái và con phải của nút i, nếu con nào lớn hơn thì

'/// R sẽ lu vị trí của con đó
R=2*i
'/// Giả sử con trái lớn hơn

If (R + 1 <= N) And (DS(R) < DS(R + 1)) Then R = R + 1
If DS(i) < DS(R) Then '//NÕu nót cha i nhỏ hơn thì tráo đổi lại giá trị để thoả mÃn là Heap
Call Swap(DS(i), DS(R))
Call DieuChinhNut(R, N, DS) '/// cần phải điều chỉnh lại nút R sau khi hoán đổi
End If
End Sub
'----------------------------------------------------------------------------------------------------------------------------'/// điều chỉnh toàn bộ N nút của cây (Danh sách) để toàn bộ cây thoả mÃn lµ Khèi Heap

Sub DieuChinhToanBo(N As Integer, DS() As Integer)
Dim i As Integer
For i = N \ 2 To 1 Step -1
Call DieuChinhNut(i, N, DS)
Next
End Sub

Trang 23


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

'/// Thùc hiÖn HeapSort

Sub Heap_Sort(N As Integer, DS() As Integer)
Dim i As Integer

DieuChinhToanBo N, DS
For i = N To 2 Step -1
Swap DS(1), DS(i)
DieuChinhNut 1, i - 1, DS
Next
End Sub
'----------------------------------------------------------------------------------------------------------------------------'/// Chơng trình chính

Private Sub Form_Load()
Dim i As Integer, N As Integer, DaySo(100) As Integer
N = InputBox("Sè phÇn tư cÇn nhËp : ", , 10)
For i = 1 To N
DaySo(i) = InputBox("NhËp sè thø " & i)
Next
Debug.Print "D·y sè sau khi sắp xếp là : " & vbCrLf
Heap_Sort N, DaySo
For i = 1 To N
Debug.Print DaySo(i)
Next
End Sub

c. Ghi chú:
• Toán tử “\” để thực hiện phép chia lấy phần ngun.
• Khi gọi hàm hay thủ tục có thể thêm từ khố Call hoặc khơng, nhưng khi có từ
khố Call thì các tham số phải được đặt trong ngoặc đơn như trên.
• Một cây nhị phân có thể biểu diễn bằng mảng một chiều, trong đó nút con trái
của nút i có chỉ số là i*2 và nút con phải là i*2 + 1. Nút cha của nút i có chỉ số
là i \ 2.
Bài tập 27
a. Hướng dẫn: Việc sắp xếp có thể thực hiện thơng qua giải thuật sắp xếp đơn giản

có độ phức tạp tính tốn n2. (Áp dụng thuật toán đã sử dụng trong bài tập 12)
b. Chương trình mẫu:
Private Sub Form_Load()
Dim DanhSach(100) As String
Dim SoSV As Integer
Dim i As Integer

‘// Mảng lưu danh sách tên của lớp
'//Số Sinh viên nhập vào

SoPT = InputBox("Bạn cần nhập tên của bao nhiêu người : ")
For i = 1 To SoSV
DanhSach(i) = InputBox("Nhập tên của người thứ " & i)
Next
Dim j As Integer, TrungGian As String
'/// Sắp xếp tăng dần bằng 1 thuật toán đơn giản (dùng với số pt ít)

Trang 24


BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN

Biên soạn: Bộ mơn CNPM–ĐHSPKT HY 2005

For i = 1 To SoSV- 1
For j = i + 1 To SoSV
If DanhSach(j) < DanhSach(i) Then
TrungGian = DanhSach(i)
DanhSach(i) = DanhSach(j)
DanhSach(j) = TrungGian

End If
Next
Next
'/// Hiển thị danh sách vừa sắp xếp ra cửa sổ Immediate
'/// Nhấn Ctrl-G để hiển thị cửa sổ này
For i = 1 To SoSV
Debug.Print DanhSach(i)
Next
End Sub

c. Ghi chú: Có thể áp dụng giải thuật Quic_Sort và Heap_Sort ở các bài tập trước để
thực hiện sắp xếp trên danh sách ở dạng xâu ký tự.
Bài tập 28:
a. Hướng dẫn: Sử dụng các hàm thao tác xâu ký tự.



Hàm Trim(S) trả về xâu S nhưng khơng có dấu trắng ở 2 đầu (Lưu ý: Bản thân
xâu S khơng bị thay đổi).



Hàm Replace(S, Sc, Sm) : Hàm thay thế tất cả các xâu con Sc nằm trong xâu
cha S bằng xâu Sm.

b. Chương trình mẫu:
'----------------------------------------------------------------------------------------------------------------------------'/// Hµm chuẩn hoá xâu ký tự S. Giá trị trả về cho hàm là xâu đợc chuẩn hoá
'/// Xâu vào đợc truyền ở dạng tham trị. Hàm không làm thay đổi xâu vào S

'----------------------------------------------------------------------------------------------------------------------------Function ChuanHoa(ByVal S As String) As String

'/// Thêm dấu trắng vào sau dấu chấm "." -> hay du “.” = “.” + dấu trắng

S = Replace(S, ".", "." & Chr(32))
'//Thêm dấu trắng vào sau dấu phảy "," -> hay thay dấu “,” bằng dấu “,” + dấu trắng

S = Replace(S, ",", "," & Chr(32))
'/// Thay 2 dÊu tr¾ng bằng 1 dấu trắng cho đến khi nào không còn 2 dÊu tr¾ng liỊn nhau

Do While InStr(1, S, Chr(32) & Chr(32)) > 0
S = Replace(S, Chr(32) & Chr(32), Chr(32))
Loop
'/// C¾t dấu trắng ở 2 đầu xâu

S = Trim(S)
'/// Trả kết quả về cho hàm. (Lu ý: Bản thân xâu S không bị thay đổi khi ra khỏi hàm)

ChuanHoa = S
End Function
'----------------------------------------------------------------------------------------------------------------------------'/// Chơng trình chính

Private Sub Form_Load()
Dim S As String
S = InputBox("H·y nhËp mét x©u ký tù : ")
MsgBox "X©u sau khi chuẩn hoá là : " & ChuanHoa(S)
End Sub

Trang 25



×