H ng d n l p trình VB.NET ướ Ch ng 11: S d ng m ng và t pươ
h p
Ch ng ươ 11:
S d ng m ng và t p h p (Collection)
--------oOo--------
N i dung th o lu n:
- T ch c thông tin d li u có chi u dài c đ nh và m ng đ ng
- D tr m ng d li u khi đ nh nghĩa l i kích th c m ng ướ
- X lý t p h p các đ i t ng đi u khi n trên form ượ
- S d ng vòng l p For Each…Next đ duy t qua danh sách t p h p các đ i
t ngượ
- T o t p h p c a riêng b n đ qu n lý d li u chu i
Khi ch ng trình tr nên l n l ng thông tin d ươ ượ li u l n, b n không th ch dùng
bi n còn c n đ n m t công c l u tr , x t t h n đó m ng. M ng ch a danhế ế ư ơ
sách tu n t các ph n t cùng đ nh d ng.
Chúng ta cũng th nhóm các đ i t ng vào thành t p h p đ d qu n lý, dùng vòng ượ
l p For each…Next đ duy t qua các ph n t c a t p h p.
Các tính năng m i trong VB.NET:
- M ng có ch s c s là 0 ơ
- Hàm Lbound luôn tr v 0 gi i h n th p nh t c a m ng. Hàm Ubound tr
v gi i h n trên c a m ng. S ph n t c a m ng là Ubound()-1
- VB.NET dùng l p System.Collections đ x lý t p h p
- B n th ch a các đi u khi n trong m ng n u m ng c a b n khai báo ki u ế
Object
1. Làm vi c v i m ng các bi n ế
M ng giúp qu n các d li u l n h t s c d dàng. Vi c truy c p các ph n t c a ế
m ng thông qua ch s .
1.1. T o m ng
Vi c khai báo m ng t ng t nh khai báo bi n. ươ ư ế Vi c khai báo th ng ch a các thông ườ
tin nh :ư
- Tên m ng: Tên đ i di n cho m ng, vi c truy c p m t ph n t m ng g m tên
m ng và ch s m ng.
- Ki u d li u: T t c các ph n t trong m ng ph i có cùng ki u.
- Kích th c m ng: Là s chi u c a m ng.ướ
Biên so n: Ph m Đ c L p - 1 - Add: cnt-44-dh,
VIMARU
H ng d n l p trình VB.NET ướ Ch ng 11: S d ng m ng và t pươ
h p
- S ph n t c a m ng: S ph n t t i đa c a m ng
1.2. Khai báo m ng c đ nh
Cú pháp chung khai báo m ng có kích th c là: ướ
Dim ArrayName(Dim1Index, Dim2Index) As DataType
Trong đó:
- ArrayName: tên m ng
- Dim1Index và Dim2Index: là hai chi u c a m ng
- Datatype: ki u d li u c a m ng. Khi ch a xác đ nh ki u c th , th dùng ư
ki u Object.
Ví d :
Khai báo Dim Employee(4) As String khai báo m ng m t chi u ch a 5 ph n t có tên
là Employee có ki u String.
B n cũng th khai báo m ng m t cách toàn c c trong module b ng t khóa Public
nh sau: ưPublic Employee(4) As String.
M ng m t chi u có d ng:
Đ khai báo m ng hai chi u mang tên ScoreBoard b n có th khai báo nh sau: ư
Dim ScoreBoard(1, 4) As Short
M ng này g m 2*5 = 10 ph n t t ng ng v i 10 ô vuông g m hai dòng và 5 c t ươ đánh
s t 0.
1.3. Làm vi c v i các ph n t trong m ng
Sau khi khai báo, b n th s d ng m ng. Vi c truy c p vào m t ph n t c a m ng
nh tên m ng ch s c a m ng đ t trong ngo c đ n, ch s s nguyên ơ , bi nế
nguyên hay bi u th c có giá tr . Đ duy t qua t t c các ph n t trong m ng, dùng vòng
l p For…Next. Ví d :
Biên so n: Ph m Đ c L p - 2 - Add: cnt-44-dh,
VIMARU
Employee
0
1
2
3
4
H ng d n l p trình VB.NET ướ Ch ng 11: S d ng m ng và t pươ
h p
employee(3) = "Thanh Van"
Phát bi u trên gán cho ph n t có ch s th 3 (t i ô th 4) tên là “Thanh Van”.
ScoreBoard(0, 2) = 12
Phát bi u trên gán cho ph n t dòng 0, c t 2 giá tr là 12.
1.4. T o và s d ng m ng có kích th c c đ nh ướ
Bây gi ta t o d MyFixedArray s d ng m ng m t chi u tên nhietdo đ ghi l i
giá tr nhi t đ cao th p hàng ngày trong tu n. M ng này đ c khai báo đ u form ượ
đ c gán giá tr b ng hàm ượ InputBox nh vòng l p For…Next. Toàn b n i dung c a
m ng sau đó l i đ c hi n th l i vào m t textbox cũng nh vòng l p For…Next. ượ
Thi t k giao di n:ế ế
T o m i m t gi i pháp thêm vào m t d án cùng tên MyFixedArray. Thi t kế ế
giao di n nh hình: ư
Trong đó: nút button1 text là “Đi n nhi t đ ”, button2 là “Hi n th nhi t đ ”, button3
là “Thoát”.
Vi t mã:ế
Tr c h t ta khai báo m ng ướ ế nhietdo ngay d i dòng ướ Public Class Form1 nh sau:ư
Dim nhietdo(6) As Single
Khai báo nh th này nghĩa t t c các th t c, các hàm đ u th s d ng m ngư ế
này.
Biên so n: Ph m Đ c L p - 3 - Add: cnt-44-dh,
VIMARU
H ng d n l p trình VB.NET ướ Ch ng 11: S d ng m ng và t pươ
h p
Ti p theo ta t o ra s ki n nh p vào các giá tr nhi t đ trong tu n b ng cách t o thế
t c Button1_Click và nh p mã nh sau: ư
Private Sub Button1_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button1.Click
Dim Prompt, tieude As String
Dim i As Short
Prompt = "Đi n vào nhi t đ c a ngày."
For i = 0 To UBound(nhietdo)
tieude = "Ngày " & (i + 1)
nhietdo(i) = CInt(InputBox(Prompt, tieude))
Next
End Sub
Trong đó, hàm Ubound(nhietdo) hàm l y v ch s trên c a m ng nhietdo, trong
tr ng h p này là 6.ườ
Sau đó ta cho hi n th các giá tr nhi t đ trong b y ngày trong tu n cũng nh giá tr ư
nhi t đ trung bình b ng th t c Button2_Click khi ng i dùng click vào nút “Hi n thườ
nhi t đ ” nh sau: ư
Private Sub Button2_Click(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Button2.Click
Dim ketqua As String
Dim i As Short
Dim tong As Single = 0
ketqua = "Nhi t đ c a tu n: " & vbCrLf & vbCrLf
For i = 0 To UBound(nhietdo)
ketqua = ketqua & "Ngày " & (i + 1) & _
vbTab & nhietdo(i) & vbCrLf
tong = tong + nhietdo(i)
Next
ketqua = ketqua & vbCrLf & _
"Nhi t đ trung bình: " & _
Format(tong / 7, "0.0")
TextBox1.Text = ketqua
End Sub
Th t c này l i s d ng vòng l p For…Next đ duy t l i các ph n t trong m ng sau
khi đã đ c gán giá tr th t c button1_Click. ượ Bi n ếketqua đ c dùng đ làm chu iượ
k t xu t g p các giá tr ph n t m ng. Sau m i l n g p ta s d ng h ng s ế vbCrLf đ
khi n d u ng t dòng d u v đ u dòng (t ng đ ng v i hai hàm ế ươ ươ Chr(13)
Chr(10)). H ng vbTab đ phân cách gi a ph n ghi ngày và ghi nhi t đ .
B n t o th th c Button3_Click và nh p phát bi u End đ k t thúc ch ng trình. ế ươ
Ch y ch ng trình: ươ
B n ch y ch ng trình nh p đ giá tr nhi t đ 7 ngày r i cho hi n th giá tr đó lên ươ
xem sao.
Biên so n: Ph m Đ c L p - 4 - Add: cnt-44-dh,
VIMARU
H ng d n l p trình VB.NET ướ Ch ng 11: S d ng m ng và t pươ
h p
1.5. T o m ng đ ng
Vi c dùng m ng r t thu n ti n. Tuy nhiên khi b n ch a bi t chính xác s ph n t ư ế
c a m ng bao nhiêu thì sao? d khi b n mu n đ ng i dùng nh p vào bao nhiêu ườ
nhi t đ tùy thích, nh p càng nhi u thì đ chính xác càng cao.
VB gi i quy t vi c này b ng m ng đ ng. ế Kích th c m ng đ ng ch đ c ch đ nh khiướ ượ
ch ng trình th c thi ch không đ nh trong lúc vi t mã. Vi c khai báo tr c kích th cươ ế ướ ướ
m ng là không c n thi t nh ng cũng c n dành ch tr c cho m ng đó. ế ư ướ
Các b c t o m ng đ ng:ướ
- Ch đ nh tên ki u cho m ng khi thi t k form, d ế ế Dim nhietdo() As
Single
- Thêm mã xác đ nh kích th c m ng khi ch ng trình th c thi. d khi ướ ươ
ch ng trình ch y b n h i xem ng i dùng mu n nh p bao nhiêu ngàyươ ườ , ví d :
Dim songay As Integer
songay = InputBox("Ban muon nhap bao nhieu ngay?", "Tao mang dong")
- Dùng bi n songay đ đ nh l i kích th c m ng (tr đi 1 vì m ng tínhế ướ t 0). Ví
d
If songay > 0 Then ReDim nhietdo(songay - 1)
- Ti p theo ta dùng hàm Ubound(nhietdo) đ xác đ nh s ph n t c a m ng.ế
Bây gi chúng ta s làm l i ví d trên s d ng m ng đ ng:
- Tr c h t, b n khai báo l i m ng đ ng khai báo bi n songay ch a s ngàyướ ế ế
ng i dùng mu n nh p b ng đo n mã ngay d i dòng khai báo l p form1:ườ ướ
Dim nhietdo() As Single
Dim songay As Integer
- Sau đó s a l i mã c a th t c Button1_Click nh sau: ư
Dim Prompt, tieude As String
Dim i As Short
Prompt = "Đi n vào nhi t đ c a ngày."
'Nhap so ngay muon ghi nhiet do
songay = InputBox("Ban muon nhap bao nhieu ngay?", "Tao mang
dong")
If songay > 0 Then ReDim nhietdo(songay - 1)
For i = 0 To UBound(nhietdo)
tieude = "Ngày " & (i + 1)
nhietdo(i) = CInt(InputBox(Prompt, tieude))
Next
- Ti p theo thay s 7 trong th t c Button2_Click b ng bi n ế ế songay:
ketqua = ketqua & vbCrLf & _
"Nhi t đ trung bình: " & _
Biên so n: Ph m Đ c L p - 5 - Add: cnt-44-dh,
VIMARU