BÀI TP LP TRÌNH HNG S KIN
Biên son: B môn CNPM–HSPKT 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 HOÀN THÀNH CÁC BÀI 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 hàm 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 hàm x lý xâu thng dùng.
A - BÀI TP
Bài tp 1: S dng hàm MsgBox và InputBox Vit chng trình gii phng trình
bc 2. H s a, b, c nhp t bàn phím bng hàm InputBox (Gii s a ≠ 0).
Bài tp 2: Minh ho cu trúc If … Then. Vit chng trình tính lng nh sau: Cho
ngi dùng nhp vào lng c bn LCB, H s lng HSL và chc v CV. Nu
chc v là "giam doc" thì cng thêm 500000 vào 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.
Bài tp 3-Select Case: Yêu cu nh bài 2, nhng s dng cu trúc Select Case
Bài tp 4: Hin th các loi thông báo s dng hàm MsgBox. Vit chng trình
hin th 4 loi hp thoi MsgBox nh mô t di đây khi ngi dùng nhp vào các
Bài tp 10: S dng cu trúc Do While … Loop. Hãy cho bit cn gi s tin tit
kim 1 triu đng vào ngân hàng trong thi gian my nm đ có 2 triu đng. Bit
rng lãi sut hàng nm là 8%.
Bài tp 11: Thoát khi vòng lp vi Exit For, Exit Do. Vit chng trình nhp s
nguyên n và kim tra xem có phi là s nguyên t hay không ?.
Bài tp 12: S tng đng gia các cu trúc lp. Tính n! s dng các cu trúc
lp khác nhau.
Bài tp 13: S dng vòng lp FOR
Lp trình tính tng ca dãy s sau và hin th kt qu ra màn hình :
S =
∑∑∑
===
++
310
300
2
200
100
2
8
1
2
nnn
nnn
Bài tp 14 – Tính N !: Vit chng trình nhp s nguyên N (0<N<20) và tính N!.
Bài tp 15- Tính tng 1 dãy s: Tính tng ca dãy sau, vi n nhp t bàn phím:
Bài tp 20-m ký t: Lp trình cho ngi dùng nhp vào mt xâu ký t S. Sau đó
đm xem trong xâu nhp vào có bao nhiêu ký t là a và A.
Bit rng :
- Hàm Mid(S, i, 1) cho ta ký t th i trong xâu S
- Hàm Len(S) cho ta đ dài ca xâu S
Bài tp 21-Tính tng dãy s: Vit chng trình nhp x và n ri tính tng
S =
1
432
1
32
+
+++++
n
xxxx
n
(Hay có th vit di dng S =
1
4321
3210
+
+++++
n
xxxxx
n
)
cái ví d: “Ngày mng 2 tháng 9 nm 1945 Bác H đã đc tuyên ngôn đc lp ti
Qung trng Ba ình lch s !”. Gi s các s là nguyên dng. Hãy tách các s
đó ra khi xâu và in ra màn hình ( đây s tách đc 3 s là 2, 9 và 1945).
BÀI TP LP TRÌNH HNG S KIN
Biên son: B môn CNPM–HSPKT HY 2005 Trang 4
Bài tp 31-Tách Câu: Nhp vào mt xâu ký t bt k, kt thúc mi câu là mt du
chm. Hãy in mi câu trong xâu đó trên mt dòng bng hàm Debug.print.
Bài tp 32-Chuyn đi Font ch: Gi s mt tp vn bn có ni dung đc đnh
dng vi font ch .vntime, Hãy chuyn ni dung ca tp này sang font ch VIQR và
lu vào mt tp khác. Tên tp ngun và tp đích tng ng là : c:\FontVNTime.txt và
c:\FontVIQR.txt.
Bài tp 33-Thng kê ký t trong xâu: Nhp mt xâu ký t bt k, sau đó in ra màn
hình s lng tng loi ký t đã nhp.
Bài tp 34-Thay th ký t: Nhp vào mt xâu, sau đó thay th tt c các ký t trng
(chr(32)) bng ký t “_”. Kt qu in ra màn hình bng hàm MsgBox.
Bài tp 35-Cng s nguyên ln: Vit chng trình cng 2 s nguyên dng ln
bt k và in kt qu ra màn hình.
Bài tp 36-Ma trn s: Vit chng trình nhp vào mt ma trn gm m hàng và n
ct. Sau đó tính tng các phn t dng, tng các phn t trên 2 đng chéo chính.
Bài tp 37- Kim tra "đng thng" trong ma trn: Nhp mt ma trn vuông kích
thc N x N. Ma trn này ch cha các s 0 và 1. Hãy lp trình đ cho bit ma trn
đó có ít nht 5 phn t thng hàng (ngang, dc, chéo xuôi, chéo ngc) có cùng giá
tr là 1 hay không ?
Bài tp 38- Mng bn ghi: Vit chng trình nhp vào mt danh sách cán b, sau
đó sp xp danh sách cán b theo tui và lu vào mt tp tên là Canbo.txt. Thông tin
v cán b gm: H và tên, Nm sinh, Quê quán, H s lng.
LTrim(S) Ging nh Trim(S) nhng ch ct phía trái LTrim(" ABC ") "ABC "
RTrim(S) Ging nh Trim(S) nhng ch ct phía phi RTrim(" ABC ") " ABC"
StrReverse(S) o ngc xâu S (S không b thay đi) StrReverse("AB") "BA"
Str(x) Chuyn s x sang dng xâu Str(10) "10"
Val(S) Chuyn mt xâu sang dng s Val("10") 10
Instr(n,S1,S2)
Kim tra xâu S2 có nm trong xâu S1 hay không.
Hàm tr v giá tr > 0 nu có.
Instr(1,"ABC", "BC") 2
Split(S, C) Tách xâu S thành các phn t, vi ký hiu phân Dim S As string, R As
BÀI TP LP TRÌNH HNG S KIN
Biên son: 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 bng xâu S2
Dim S As string
S = Replace(“A!!”,”!!”,”!”)
FileLen(F) Cho bit kích thc ca file F tính theo bytes MsgBox FileLen("C:\io.sys")
CurDir Tr v đng dn ca th mc hin hành Msgbox CurDir
Year(D) Tr v nm ca bin kiu Date D
c = InputBox("Nhp h s c : ")
Delta = b ^ 2 - 4 * a * c
If Delta < 0 Then
MsgBox "Vô nghim ", vbInformation
Else
If Delta = 0 Then
x1 = -b / (2 * a)
MsgBox "Có nghim kép:" & x1
Else
x1 = (-b + Sqr(Delta)) / (2 * a)
x2 = (-b - Sqr(Delta)) / (2 * a)
MsgBox "x1=" &x1 & " x2=" &x2
End If '//// Ca If Delta = 0
End If '//// Ca 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("Nhp h s a (a<>0):")
b = InputBox("Nhp h s b : ")
c = InputBox("Nhp h s c : ")
Delta = b ^ 2 - 4 * a * c
Select Case Delta
Case Is < 0
LCB = InputBox("nhp vào lng c bn : ", "Tính lng", 290000)
HSL = InputBox("nhp vào h s lng", "Tính lng", 1.92)
CV = InputBox("Chc 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 cu trúc If Then trên bng cu trúc If Then ElseIf
hoc bng cu trúc đa r nhánh Select Case (ây là cu trúc phù hp nht)
Bài tp 3
a. Hng dn:
Cu trúc Case trong VB cho phép kim tra c biu thc dng Xâu, S
nên có th áp dng vào gii quyt bài toán này.
b. Chng trình mu:
Tính lng đn gin minh ho cu 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("nhp vào lng c bn : ", "Tính lng", 290000)
HSL = InputBox("nhp vào h s lng", "Tính lng", 1.92)
CV = InputBox("Chc v ")
Select Case CV
Case "giam doc"
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: ")
a. Hng dn:
S là tng các s hng th i, vi i chy t 1 đn N, S hng tng quát
là i. Do vy đ tính tng ca dãy s S, có th s dng mt trong 3 loi vòng lp đã
bit.
b. Chng trình mu (Gõ đon mã trong th tc
Form_Load)
Cách 1: S dng vòng lp For
Dim i As Integer
Dim N As Integer
Dim S As Long
N=Inputbox("Nhp s N (N>0) : ")
S = 0
For i=1 To N
S = S + i ‘///S = S + <S hng tng quát>
Next
Msgbox "Tng = " & S
Cách 2: S dng vòng lp Do Loop Until
Dim i As Integer
Dim N As Integer
Dim S As Long
N=Inputbox("Nhp s N (N>0) : ")
S = 0
i = 1
Do
S = S + i
i = i + 1
Loop UNTIL i > N
S = S + i
Next
MsgBox "Tæng c¸c sè ch½n tõ 1->100 lµ : " & S
End Sub
c. Ghi chú:
• Nu không có điu khon Step thì sau mi ln lp bin chy i t đng đc
tng lên 1 đn v. Còn nu có điu khon Step 2 thì sau mi ln lp, bin chy
i đc tng lên 2 đn v. Tng quát, nu Step N (N nguyên âm hoc dng)
thì sau mi ln lp, bin chy đc tng (nu N > 0) hay gim đi (Nu N<0) n
đn v.
• Nu cho i chy t 1 (For i = 1 TO 100…) thì kt qu cho ta là tng các s l .
Bài tp 8
a. Hng dn:
Thông thng trong VB, vi vòng lp For thì c sau mi ln lp bin
chy t đng đc tng lên 1 đn v. Tuy nhiên, trong mt s trng hp ta mun
bin chy thay đi theo chiu gim dn (Tng t nh For… Downto … ca
Pascal), tc là sau mi ln lp thì bin chy li b gim đi mt đn v thì cn phi s
dng đn điu khon Step N vi N là mt s âm. Nu mun sau mi vòng lp bin
chy i gim đi mt đn v thì ta cn vit : For i = N to 1 Step -1
b. Chng trình mu:
Private Sub Form_Load()
Dim i As Integer
For i = 100 To 1 Step -1
Debug.Print i
Next
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
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 TP LP TRÌNH HNG S KIN
Biên son: 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)
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! bng phng pháp đ qui : GiaiThua = GiaiThua (n-1) * N.
• Ngi ta đã chng minh đc rng tt các cu trúc lp đu có th vit tng
đng theo các cu trúc khác.
• Trong VB có rt nhiu cu trúc lp, tuy nhiên ch cn thuc 3 cu trúc sau là đ:
o For …
BÀI TP LP TRÌNH HNG S KIN
Biên son: B môn CNPM–HSPKT HY 2005 Trang 13
o Do
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 TP LP TRÌNH HNG S KIN
Biên son: B môn CNPM–HSPKT HY 2005 Trang 14
Bài tp 14:
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 & " ! bng " & 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
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ự
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ú
'/// 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)
'/// 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
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
iBi tp 22
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
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ỳ ý:
b. Chng trỡnh mu:
'/// Thủ tục tách danh sách thnh 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)
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ở thnh 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
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.
TrungGian = DanhSach(i)
DanhSach(i) = DanhSach(j)
DanhSach(j) = TrungGian
End If
Next
Next
'/// Hin th danh sỏch va sp xp ra ca s Immediate
'/// Nhn Ctrl-G hin th ca s ny
For i = 1 To SoSV
Debug.Print DanhSach(i)
Next
End Sub
c. Ghi chỳ: Cú th ỏp dng gii thut Quic_Sort v Heap_Sort cỏc bi tp trc
thc hin sp xp trờn danh sỏch dng xõu ký t.
Bi tp 28:
a. Hng dn:
S dng cỏc hm thao tỏc xõu ký t.
Hm Trim(S) tr v xõu S nhng khụng cú du trng 2 u (Lu ý: Bn thõn
xõu S khụng b thay i).
Hm Replace(S, S
c
, S
m
) : Hm thay th tt c cỏc xõu con S
c
nm trong xõu
cha S bng xõu S
m
.
b. Chng trỡnh mu:
End Sub