BỘ GIÁO DỤC VÀ ĐÀO TẠO
TRƯỜNG ĐẠI HỌC
KHOA
Bài tập
trình hướng sự kiện
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 1
Bài tập chơng 1
NGÔN NGữ LậP TRìNH VISUAL BASIC
MC TIấU: SAU KHI HON THNH CC BI TP, NGI HC Cể TH
Khai bỏo cỏc bin thuc cỏc kiu d liu c bn (byte, integer, long, string,
boolean, single) v kiu mng, kiu bn ghi trong Visual Basic.
S dng cỏc hm nhp xut d liu (MsgBox v InputBox) ca VB.
S dng v vn dng c cỏc cu trỳc r nhỏnh (If Then v
If Then Else), cu trỳc a r nhỏnh (Select Case) v cỏc loi vũng lp :
For; Do While Loop; Do Loop vit chng trỡnh.
S dng c mt s hm x lý xõu thng dựng.
A - BI TP
Bi tp 1: S dng hm MsgBox v InputBox Vit chng trỡnh gii phng trỡnh
bc 2. H s a, b, c nhp t bn phớm bng hm InputBox (Gii s a 0).
Bi tp 2: Minh ho cu trỳc If Then. Vit chng trỡnh tớnh lng nh sau: Cho
ngi dựng nhp vo lng c bn LCB, H s lng HSL v chc v CV. Nu
chc v l "giam doc" thỡ cng thờm 500000 vo lng thc lnh (LTL), nu l
"truong phong" thỡ cng thờm 300000, nu l "to truong" thỡ cng thờm 200000, nu
l "nhan vien" thỡ khụng cng. Sau ú hin th tng s lng thc lnh.
Bi tp 3-Select Case: Yờu cu nh bi 2, nhng s dng cu trỳc Select Case
Bi tp 4: Hin th cỏc loi thụng bỏo s dng hm MsgBox. Vit chng trỡnh
hin th 4 loi hp thoi MsgBox nh mụ t di õy khi ngi dựng nhp vo cỏc
s tng ng 1,2,3,4 bng hm InputBox:
1
3
2
4
Bi tp 5: S dng cu trỳc Select Case. Vit chng trỡnh cho phộp ngi dựng
nhp vo 2 s thc a v b v mt trong cỏc phộp toỏn gm +, -, *, /, \ (Chia ly phn
nguyờn), mod (chia ly phn d) hoc ^ (Lu tha). Sau ú hin th kt qu tng
ng. Vớ d nu nhp 2 s 10, 20 v phộp toỏn l + thỡ thụng bỏo "Kt qu l 30" v.v.
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 2
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: Thoá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 =
∑∑∑
===
++
310
300
2
200
100
2
8
1
2
nnn
nnn
Bài tập 14 – Tính N !: Viết chương trình nhập số nguyên N (0<N<20) và tính N!.
Bà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:
)1( )1( 4.33.22.1 +++++++++++++= nnnininnnS
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)
= F
n-2
+ F
n-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.
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 3
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
S =
1
432
1
32
+
+++++
n
xxxx
n
(Hay có thể viết dưới dạng S =
1
4321
3210
+
+++++
n
xxxxx
n
)
Bài tập 22 : Bài toá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 nguyên 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 toá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 hoá xâu: Nhập vào một xâu ký tự bất kỳ sau đó chuẩn hoá và in
ra màn hình. Xâu chuẩn hoá ở đâ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).
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 4
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 vuông 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 xuôi, 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) Hàm tính giá trị tuyệt đối của một số. Abs(-5) 5
Sqr(x) Tính căn bậc hai của một số x (x>=0) Sqr(4) 2
Round(x) Làm tròn số x Round(3.2) 3
Asc(Ch) Trả về mã của ký tự Ch Asc("A") 65
Chr(n) Trả về ký tự có mã Ascii là n Chr(65) "A"
UCase(S)
Trả về xâu chữ hoa (Nhưng không làm thay đổi
đến xâu S)
UCase("aBc") "ABC"
LCase(S)
Trả về xâu chữ thường (Nhưng không làm thay
đổi đến xâu S)
UCase("aBc") "abc"
Len(S) Trả về độ dài của xâu S Len("abc123") 6
Mid(S,i,n)
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.
Mid("ABCDE", 2,3) "BCD"
Left(S, n) Lấy ra n ký tự trong xâu S tính từ bên trái Left(S,"ABCD",3) "ABC"
Right(S,n) Lấy ra n ký tự trong xâu S tính từ bên phải Right(S,"ABCD",3) "BCD"
Trim(S)
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).
Trim(" ABC ") "ABC"
LTrim(S) Giống như Trim(S) nhưng chỉ cắt phía trái LTrim(" ABC ") "ABC "
RTrim(S) Giống như Trim(S) nhưng chỉ cắt phía phải RTrim(" ABC ") " ABC"
StrReverse(S) Đảo ngược xâu S (S không bị thay đổi) StrReverse("AB") "BA"
Str(x) Chuyển số x sang dạng xâu Str(10) "10"
Val(S) Chuyển một xâu sang dạng số Val("10") 10
Instr(n,S1,S2)
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ó.
Instr(1,"ABC", "BC") 2
Split(S, C) Tách xâu S thành các phần tử, với ký hiệu phân Dim S As string, R As
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 5
tách là C. Variant
Dim I As integer
S = “ha,noi,viet,nam”
R = Split(S,”,”)
For i=0 to Ubound(R)
Msgbox R(i)
Next
Replace
(S, S1, S2)
Thay thế các xâu con S1 trong S bằng xâu S2
Dim S As string
S = Replace(“A!!”,”!!”,”!”)
FileLen(F) Cho biết kích thước của file F tính theo bytes MsgBox FileLen("C:\io.sys")
CurDir Trả về đường dẫn của thư mục hiện hành Msgbox CurDir
Year(D) Trả về năm của biến kiểu Date D
Dim D As Date
D = Now
Msgbox Year(D)
Month(D) Trả về tháng của biến kiểu Date D MsgBox Month(Now)
Day(D) Trả về ngày của biểu thức kiểu Date D Day(#21/2/2004#) 21
Hour(T) Trả về giờ của biểu thức kiểu Time T Hour(Time)
Now Hàm trả về ngày tháng hiện hành Msgbox now
Time Trả về giờ phút giây hiện hành Msgbox Time
Rnd
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.
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
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
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
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ố nguyên 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 …)
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 6
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)
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang
7
Bi tp 4
a. Hng dn: hin th hp thoi Msgbox vi cỏc nỳt v biu tng khỏc nhau, ta
ch cn thờm cỏc hng vo tham s th 2 ca hm MsgBox, vớ d : vbQuestion,
vbYesNo, vbOKCancel, vbInformation, vbAbortRetryIgnore
Ngoi ra, bit ngi dựng mun hin th loi hp thoi no (nhp vo s my) cn
s dng cu trỳc Select Case kim tra v ra quyt nh.
b. Chng trỡnh mu:
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 kt hp hin th cỏc nỳt, cỏc biu tng bng cỏch t hp OR gia
cỏc hng s: Vớ d vbOKCancel Or vbExclamation hin th 2 nỳt
OK/Cancel kốm thờm biu tng khuyn cỏo .
Hm MsgBox luụn tr v mt s cho bit l ngi dựng va click chn nỳt
no ca hp thụng bỏo MsgBox. Vớ d: giỏ tr tr v l vbOK, vbCancel.
Bi tp 5
a. Hng dn:
Vic cng, tr, nhõn hay chia a vi b v.v cũn ph thuc vo phộp toỏn (toỏn t) m
ngi dựng nhp vo l gỡ. Do vy, ra quyt nh l thc hin phộp toỏn no lờn 2
toỏn hng a v b ú, cn s dng cu trỳc Select Case kim tra toỏn t nhp
vo.
b. Chng trỡnh mu:
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
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 8
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
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 9
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. Ngoà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.
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 10
b.Gii mu:
Private Sub Form_load()
Dim n As Long, i As Long
Dim TongAm As Long
Dim TongDuong As Long
TongAm = 0 '/// Khởi tạo trớc khi tính tổng
TongDuong = 0 '/// 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 '/// Lp cho n khi no nhp n = 0 thỡ dng.
MsgBox "Tổng các số âm = " & TongAm & ". Tong các số dơng = " & TongDuong
End Sub
c. Ghi chỳ:
Vũng lp Do . Loop Until <K> s kt thỳc khi iu kin <K> bng true
Vũng lp DoLoop Until khỏc vi vũng lp dng Do.Loop While <K>
ch vũng lp DoLoop While <K> kt thỳc khi <K> vn l False.
Thc cht, cu trỳc lp DoLoop Until v Do Loop While l tng
ng nhau, do vy trỏnh nhm ln chỳng ta ch nờn nh mt loi khi thc
hnh.
Cú th thoỏt khi vũng lp dng Do Loop bng cõu lnh Exit Do
Bi tp 10
a. Hng dn: Vỡ khụng th bit c l sau bao nhiờu nm thỡ tng s tin s l
2.000.000, m ch bit rng mi nm s tng thờm mt lng no ú. Do vy, õy
ta s s dng vũng lp khụng xỏc nh v mi ln lp ta s kim tra xem ó c s
tin cn thit hay cha? Nu ri thỡ thoỏt v s ln th chớnh l s nm cn tỡm.
Nhng õy ti sao ta li s dng vũng lp Do WhileLoop m khụng l Do
Loop ?. S d s dng vũng lp Do While Loop l vỡ rng s tin gi vo ban
u ó rt cú th ln hn s tin k vng !
b. Chng trỡnh mu:
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 bi toỏn tớnh tin gi tit kim, GDP cú th ỏp dng trong cuc sng
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 11
Bi tp 11
a. Hng dn: Mt s N c gi l s nguyờn t nu nh nú ch chia ht cho 1 v
chớnh nú. Hay núi cỏch khỏc l s N khụng l nguyờn t nu nh nú chia ht cho ớt
nht mt s nm trong khong [2N-1]. Nh vy, kim tra ta ch cn duyt tt c
cỏc s i trong phm vi t [2N-1] xem N mod i = 0 ?, nu xy ra thỡ kt lun ngay
rng N khụng l nguyờn t, trỏi li nu sau khi ó duyt ht m khụng thy trng
hp ú xy ra thỡ kt lun N l nguyờn t.
Ngi ta ó chng minh c rng khụng cn phi duyt t [2N-1] m ch cn
duyt trong phm vi hp hn l t ] 2[ N .
b. Chng trỡnh mu:
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ỳ:
thoỏt vụ iu kin khi vũng lp Do While, DoLoop While hay
Do Loop Until thỡ cn gi lnh Exit Do
Hm Sqr(n) trong VB dựng tớnh n (khụng phi l tớnh bỡnh phng nh
trong mt s ngụn ng lp trỡnh khỏc nh Pascal).
Nu cụng vic gỡ ch lm mt ln (vớ d thụng bỏo kt qu nh trờn) thỡ
KHễNG BAO GI c t trong vũng lp m phi t ngoi vũng lp. Vỡ
c im ca vũng lp l lp i lp li nhiu ln mt cụng vic !
Bi tp 12
a. Hng dn: Giai tha ca s N c tớnh theo cụng thc N!=1.2.3N-1.N.
tớnh toỏn ta thc hin nhõn dn cỏc s i ( i = 1
ữ N) vo kt qu.
b. Chng trỡnh mu:
Private Sub Form_Load()
Dim n As Integer, i As Integer, KetQua As Long
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 12
'/// NhËp sè n, ®¶m b¶o 0<n<10
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 …
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 13
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 thoá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 S
i
, 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
BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN
Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005
Trang 14
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<n<20)
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<n<20)
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
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 1
5
Bi tp 15:
a. Hng dn: Vi bi toỏn dng tớnh tng ca mt chui s khi bit s hng tng
quỏt S
i
, núi chung l n gin. Cú th thc hin theo gii thu nh sau:
S = 0
For i = i
0
TO i
n
S = S + S
i
Next
Vi mi dóy khỏc nhau thỡ giỏ tr i
0
, N, Si cú th khỏc nhau v cn phi xỏc nh.
- Giỏ tr i
0
v N thng xỏc nh bi gii phng trỡnh S
i
= S
0
v S
i
= S
n
- S hng tng quỏt S
i
thng cú th nhỡn thy ngay trong bi.
Trong bi ny:
- )1(* ++= iniS
i
- Xỏc nh i
0
: Cho S
0
= S
i
2*1 +n = )1(* ++ ini i
0
=1
- Xỏc nh i
n
: Cho S
n
= S
i
)1(* ++ nnn = )1(* ++ ini i
n
=n
b. Chng trỡnh mu:
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
Bi tp 16
a. Hng dn:
Vi cỏc bi toỏn c nh ngha theo kiu qui thỡ cỏch gii phự
hp v d nht l theo gii thut qui. Tuy nhiờn, tc b chm ỏng k khi s N ln,
ngoi ra cũn cú th b trn Stack.
b. Chng trỡnh mu:
'/// 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
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 1
6
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 vi bi toỏn ny, ngi ta cũn cú th gii bng phng phỏp qui hoch
ng (Dynamic Programming) rt n gin 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
Bi tp 17:
a. Hng dn:
tỡm c s chung ln nht ca 2 s nguyờn a v b, ngi ta cú
th da vo cụng thc -Le v ci t bng vũng lp hoc qui. Vic tỡm c s
chung c ng dng vo ti gin phõn s.
b. Chng trỡnh mu:
'/// 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
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 1
7
'/// 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
Bi tp 18:
a. Hng dn: Phõn s dng a/b c gi l ti gin nu c s chung ln nht ca
a v b l 1. Vớ d: phõn s 5/7 v 9/7 l ti gin; 4/6 v 6/4 l cha ti gin.
b. Chng trỡnh mu:
'/// 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)
/// Tính lại tử số mới
MauMoi = b / USCLN(a, b) /// 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
Bi tp 19:
a. Hng dn: Trc ht cn xõy dng hm kim tra xem s N cú phi l nguyờn t
hay khụng ? Sau ú s dng kt qu ny vo gii quyt yờu cu bi toỏn.
b. Chng trỡnh mu:
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 1
8
'/// 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
Bi tp 20
a. Hng dn:
m s ký t a v A trong mt xõu S, chỳng ta cn duyt v kim tra ln lt
tng ký t nm trong xõu S v so sỏnh vi ký t a v A. duyt (ly tng ký t
trong xõu S) chỳng ta cú th s dng mt trong 3 loi vũng lp. Hm Mid(S,i,1) cho
ta ký t ti v trớ th i trong xõu S.
b. Chng trỡnh mu (S dng vũng lp 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 'Bắt đầu từ ký tự thứ nhất
TongAa = 0 '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
i = i + 1
/// Chuyn n v trớ ca ký t tip theo
Loop
MsgBox "Tổng số ký tự a và A trong xâu là " & TongAa & " ký tự"
End Sub
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 19
C. Ghi chỳ: Trong vũng lp For thỡ bin chy s c t ng tng lờn 1 n v, cũn
trong vũng lp Do While Loop v Do Loop bin chy khụng t ng tng lờn 1,
do vy ta phi t thc hin tng bin chy lờn 1 n v bng cõu lnh i = i + 1 nh
bi tp trờn.
Bi tp 21:
a. Hng dn: Tng S chớnh l tng ca cỏc s hng th i, vi S
i
=
ni
x
i
+
(õy l s
hng tng quỏt) v i chy t 0 n N. Do vy tớnh tng chỳng ta cn s dng mt
trong 3 loi vũng lp ó hc.
b. Chng trỡnh mu: (S dng vũng lp For, bn hóy thc hin vi vũng lp
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 hng tng 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 bt k, vic khú khn nht l phi xỏc nh c
s hng tng quỏt S
i
, sau ú l cn di v cn trờn ca vũng lp. Cũn tng thỡ
thng tớnh theo cụng thc : S = S + S
i
Bi tp 22
a. Hng dn: Trc ht cn khai bỏo mt mng nguyờn, sau ú hi ngi dựng
xem mun nhp bao nhiờu s v s dng vũng lp tin hnh nhp d liu cho
mng.
tỡm s ln nht, thụng thng ta gi nh l phn t u tiờn. Sau ú dựng vũng
lp duyt qua cỏc phn t cũn li v so sỏnh, nu s ang xột ln hn s gi nh
thỡ ta li thay i giỏ tr ca s gi nh bng phn t ang xột.
b. Chng trỡnh mu:
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ố: ")
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 2
0
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 mng A(100) v nh vy phn t u tiờn l
A(0), nhng khi nhp ta li cho i chy t 1, tc l khụng s dng phn t A(0). õy
l thúi quen s dng ca mi ngi. Bn cú th s dng A(0) hay khụng l tu, cũn
nu s dng A(0) thỡ vũng lp trờn s cú dng : For i= 0 to N - 1
Bi tp 23
a. Hng dn: Cn phi tỡm ra s ln nht, kớ hiu l MAX, sau ú hin th nhng
phn t cú giỏ tr bng vi MAX va tỡm c.
b. Chng trỡnh mu:
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 dng gii bi toỏn tỡm s nh nht, in ra cỏc s nh nht v.v
Trong danh sỏch khụng phi ch cú duy nht mt phn t ln nht (nh nht)
Bi tp 24
a. Hng dn:
sp xp mt dóy s A cú N phn t ta tin hnh nh sau:
Bt u t phn t u tiờn
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 21
Ti v trớ (phn t) th i trong mng A, Ta xột tt c cỏc s t th i+1 n N
xem cú s no nh hn phn t th i ang xột hay khụng. Nu cú phn t A(j)
no ú nh hn A(i) thỡ hoỏn i giỏ tr ca A(i) Cho A(j). hoỏn i A(i) vi
A(j) ta thc hin nh sau:
o TrungGian = A(i)
o A(i) = A(j)
o A(j) = TrungGian
Lp li i vi cỏc phn t A(i) cho n khi no i >= N thỡ dng.
b. Chng trỡnh mu:
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ỳ ý:
Thut toỏn sp xp trờn thng xuyờn c s dng trong cỏc bi toỏn
khụng ũi hi nhiu v tc v nú cú th ỏp dng sp xp mt danh sỏch
tng quỏt (c s v xõu), do vy chỳng ta cn nm vng thut toỏn ny.
Nu mun sp xp danh sỏch theo chiu gim dn thỡ ch vic thay cõu lnh
If A(j) < A(i) Then Thnh If A(j) > A(i) Then .
Bi tp 25
a. Hng dn:
V bn cht, gii thut Quick_Sort s dng phng phỏp Chia tr
(Deive and Conquer). Cú th mụ t thụ thut toỏn ny nh sau:
- Chn mt v trớ K gia (Khụng nht thit l chớnh gia) ca danh sỏch L.
- Duyt tng phn t v xột: Nu phn t L[i] < L[k] thỡ cho vo danh sỏch con
L
1
, cũn nu L[i] >= L[k] thỡ cho vo danh sỏch L
2
. Kt qu ta c:
L = L
1
L[k] L
2
, Trong ú L[k] v trớ ỳng. Tip tc thc hin qui vi L1
v L2 Do L hu hn nờn thut toỏn s dng. phc tp ca thut toỏn
ny trung bỡnh vo c O(n) = n.Log
2
n.
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 22
b. Chng trỡnh mu:
'/// 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
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 23
c. Ghi chỳ:
Trong phn khai bỏo hm v th tc, nu trc tham s hỡnh thc khụng cú
t khoỏ byref ng trc thỡ VB hiu ú l tham bin (tham chiu).
Tham s hỡnh thc trong phn khai bỏo chng trỡnh con l mt mng thỡ phi
vit di dng nh sau: <Tờn> () As <Kiu c bn>, Cỏch vit: A (10) As
integer hay A (1 to 10) As String v.v l sai !.
Gii thut Quick_Sort thc hin tng i nhanh khi n ln. Ngi ta gi gii
thut sp xp Quick_Sort v mt s gii thut sp xp nhanh khỏc (nh
Merge sort, Heap sort) thuc phng phỏp sp Cụng nghip, do vy cn
phi nh v vn dng thnh tho gii thut ny.
Bi tp 26
a. Hng dn:
í tng ca gii thut ny l dựng mng mt chiu biu din cõy
nh phõn. Sau ú tinh chnh dn cỏc cõy con ó c sp xp cho kt qu cui
cựng.
b. Chng 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
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005
Trang 24
'/// 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 \ thc hin phộp chia ly phn nguyờn.
Khi gi hm hay th tc cú th thờm t khoỏ Call hoc khụng, nhng khi cú t
khoỏ Call thỡ cỏc tham s phi c t trong ngoc n nh trờn.
Mt cõy nh phõn cú th biu din bng mng mt chiu, trong ú nỳt con trỏi
ca nỳt i cú ch s l i*2 v nỳt con phi l i*2 + 1. Nỳt cha ca nỳt i cú ch s
l i \ 2.
Bi tp 27
a. Hng dn: Vic sp xp cú th thc hin thụng qua gii thut sp xp n gin
cú phc tp tớnh toỏn n
2
. (p dng thut toỏn ó s dng trong bi tp 12)
b. Chng trỡnh mu:
Private Sub Form_Load()
Dim DanhSach(100) As String // Mng lu danh sỏch tờn ca lp
Dim SoSV As Integer '//S Sinh viờn nhp vo
Dim i As Integer
SoPT = InputBox("Bn cn nhp tờn ca bao nhiờu ngi : ")
For i = 1 To SoSV
DanhSach(i) = InputBox("Nhp tờn ca ngi th " & i)
Next
Dim j As Integer, TrungGian As String
'/// Sp xp tng dn bng 1 thut toỏn n gin (dựng vi s pt ớt)