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

Bài tập ngôn ngữ lập trình VB docx

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 (3.28 MB, 173 trang )

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 1

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
3
2
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.
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 1
0
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 16
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 17
'/// 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 18
'/// Hm 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 20
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 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)

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ở 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



'/// So sánh con trái v con phải của nút i, nếu con no 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 ton bộ N nút của cây (Danh sách) để ton 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)
BI TP LP TRèNH HNG S KIN
Biờn son: B mụn CNPMHSPKT HY 2005


Trang 25
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
'/// 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:


'
'/// Hm chuẩn hoá xâu ký tự S. Giá trị trả về cho hm l xâu đợc chuẩn hoá
'/// Xâu vo đợc truyền ở dạng tham trị. Hm không lm thay đổi xâu vo S
'
Function ChuanHoa(ByVal S As String) As String

'/// Thêm dấu trắng vo sau dấu chấm "." -> hay du . = . + du trng
S = Replace(S, ".", "." & Chr(32))

'//Thêm dấu trắng vo sau dấu phảy "," -> hay thay du , bng du , + du trng
S = Replace(S, ",", "," & Chr(32))

'/// Thay 2 dấu trắng bằng 1 dấu trắng cho đến khi no 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 hm. (Lu ý: Bản thân xâu S không bị thay đổi khi ra khỏi hm)
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

×