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

Ebook kỹ thuật và thủ thuật lập trình visual basic 2010 2011 tập 2 phần 1 xuân thịnh, nam thuận

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 (2.65 MB, 139 trang )

Th.S: XUÂN THỊNH - NAM THUẬN
và nhóm Un học thực dụng

Kỹ thuật và thủ thuật
lập trình
VISUAL BASIC 2010 - 2011
Từ căn bản đến nâng cao - dành cho học sinh, sinh viên
các trường Cao Đẳng và Đ ại Học
♦ M icrosoít V isuaJ B asic 2010-2011 là b ản nâiig cấp và
cải liế n qxian trọng ciia ngôn n g ữ lậ p tr in h lâ ê m trìn h
biên d ịc h V lsual B asic p h o b iế n , m ộ t công Iighệ điíỢc
r ắ t n h iề u các n h à lập trìn li Id iắp th ế giới tin cậy sử
diuig
♦ V ớ i cách bố cục c h ặ t c h ẽ th e o từ n g c h ủ đ ề chitơng và

rát Iihiều bài tập thực Ì i ằ i ử ì từng bước và chương trùửi

New Edition

m ăii, b a n sẽ n h a n h chóĩig học đư ợc cá ch tạ o các ííng
dụncị V isuai Basic
♦ Các tín h n ăn g m ới n h á t c ủ a Visi.ial B asic sẽ giiip b ạn
lập trìn h n h an li hơn và (ĩạ t h iệ u qiiâ cao hơn, n h ấ t là
k h i b ạ n tliíc h sử dụiig và tíc h h ợp th ô n g tlii từ các cơ
sở d ữ liệ u , các phư ơng tiệ n g iả i trí» các tra n g W eb và

Wcb slte. Hy vọng saii k h i học xong các birôc và t h ủ
th u ậ t lậ p trìn h tro n g q u y ển sá c h n ày với V isiial Basic

NHÀ XUẤT BẢN HỒNG ĐỨC



L ỜI NỐI ĐẦU
M icro so ft V isu a l B asic 8010-8011 là b ả n n â n g c ấ p và cải
tiế n q u a ii trọ n g c ủ a n g ò n Iigữ lậ p tr ìn h ld.êm trìrứ i b iê n d ịc h
V istia l B a sic p h ổ b iế n , m ộ t công n g h ệ đưỢc r ắ t lủ iiề u các n h à
lậ p trìiử i Ichắp ứ iế giớ i tin cậy s ử d ụ n g . V is u a l B asic 2 0 1 0 2 0 1 1 lchông p h ả i là s ả n p h ẩ m độc lậ p m à là m ộ t th à iứ i p h ầ n
c h in h c ử a M ỉcro so ít V isu a l S tu d io 201 0 -2 0 1 1 - m ộ t h ệ th ố n g
p h á p t r i ể n to à n d iệ n cho p h é p Hgười d ù n g tạ o r a lứ iữ ng ứ ng
diỊHg m ạ n h m ẽ d à n h ch o W indow s, W eb, các t l ii ế t b ị cầ m
tay , v à r ấ t n liiề u m ô i trư ờ n g Iđiác.
Bộ s á c h "K ỷ t h u ậ t v à tJhủ t h u ậ t lậ p t r ìn h VTSIIA L B A ­
S IC 2 0 1 0 -2 0 1 1 " gồ m 2 tậ p , h ư ớ ng d ẩ n to à n đ iệ n về lậ p trìn li
V is u a l B a sic s ử d ụ n g p h ầ n m ề m V isu a l B a sic 2010-2011.
V ới c á c h b ố cụ c c h ặ t c h ẽ th e o từ n g c h ủ đ ề ch ư ơ n g và r ắ t
n h iề u b à i tậ p th ự c h à n h từ n g bư ớ c và ch ư ơ n g tr ì n h m ẫ\i,
b ạ n s ẽ n h a n h ch ó n g h ọ c được cá ch tạ o các ứ n g d tư ig V istial
B a sic 2 0 1 0 -2 0 1 1 c h ấ t lượng c h u y ê n n g h iệ p d à n h ch o h ệ đ iề u
h à n h W ữ id o w s và n h iề u bộ t i ì n h d u y ệ t W eb. C ác t í n h n ăn g
m ớ i n h ắ t c ủ a V isu a l B asic sẽ g iú p b ạ n lậ p tr ù ứ i n h a iứ i h ơ n
v à đ ạ t h iệ u q u ả cao hơ n , n liấ t là k lii b ạ n tliic h s ử d ự n g và
t íc h h ợ p th ô iig t i n t ừ các cơ sở d ữ liệ u , các p h ư ơ n g tiệ n g iả i
t r í, các tr a n g W cb v à W cb sitc.
H y v ọ n g s a u k h i h ọ c x o ĩ i g các bư ớ c v à t h ủ t h u ậ t lậ p trìiứ i
tro n g q u y ể n sác li n ày với V isu al B asic và V is u a l S tu d io In teg r a te d D e v e lo p m e n t E n \lro n n ie n t (ID E ), b ạ n s ẽ Id iô n g nhữmg
tạ o đưỢc các ch ư ơ n g tr ìn h ứ ng d iu ig c ă n b ả ii m à còn có k h ả
n ă n g s ử d ụ n g n liiề u công c ụ c ủ a p h ầ n m ề m n à y đ ể v iế t các
ch ư ơ n g tr b ủ i ch o M icro soít V isu a l
2 0 1 0 -2 0 1 1 , M icrosoít
V is u a l c # 2 0 1 0 -2 0 1 1 , M icrosoữ V isu a l W eb D ev elo p er 2010,
v à n h i ề u s ả n p h ẩ m k h ác .


T á c g iả


C h ư ơ n g 11: S ử dụng các m ảng đ ể quản lý dữ liệu s ố và chuỗi

PHẦN (II
Lộp trình nâng coo và thiết kế
giao diện người dùng
Chương II : Sử dụ n g c á c m ản g đ ể qu ản lý
d ừ liệu s ố v à chuỗi
ChtMĩig 12: Làm việ c vớ i cá c tậ p hợp
Chướng 13: K h ả o s ấ t c á c File T ex t v à x ử
lý chuỗi
Chương 14: Q uản lý c á c ịo r tn Windou)s và
c á c cơntroỉ v à o th ờ i g ia n ch ạy
Chương 15: Tbêm đ ồ h ọa v à cá c h iệu ứìig
h o ạ t h ìn h

Chươĩtg 16: Thừa k ế c á c fo r m v à tạ o các
c la s s c ơ s ở
Chương 1 7: Làm việ c vớ i c á c m á y in


8

____________ C h ư d n g 11; Sử dụng các m ảng đ ể quản lý dữ liệu s ố v à chuỗi




,

.

.

.

Sử dụng các mỏng để quỏn
ụ dữ liệu số và chuỗi

Sau k h i hoàn th à n h chtM ng n à y bạn s ẽ có thể:
*

TỔ chức thông tin trong các m ảng có kicb cỡ cố định I>à m ảng dộng,

K G iữ gìn d ữ liệu m ảng khi bạn tái định chiềíi các mảng.
*

Sứ dụng các m ảng trong m ã đ ể quản lý các lượng lởn clữ liệu.

a S ứ dụng các phĩccmg tbữc Hort và Keverse trong class Array d ể sáp
xế p lại thứ tự các mảng.
^ S ử dụng control ProgressBar trong các cbĩcơng trình đ ể th ể hiện ĩtĩọt
tác ưít m ất thời gian bao lân.

u ản lý th ô n g tin tro n g m ột ứng dụng M icrosoíl Visual Basic là
m ột tá c vụ quan trọ n g và k h i các chương trìn h trở n ên đáng kể
hơn, b ạn sẽ cần các công cụ bổ sung để lưu trữ v à xử lý dữ liệu.
M ột phường p h áp n h a n h để quản lý dữ liệu tro n g các chương trìn h là lưu

trữ và tru y tìm th ô n g tin tro n g các íĩle tex t phụ n h ư b ạ n sẽ th ấ y trong
chương 13. Tuy n h iên , phưcmg pháp to àn diện n h ấ t là lưu trữ và truy tìm
thông tin b ằn g việc sử dụng các cơ sở dữ liệu và b ạn sẽ b ắ t đầu học cách
tích hợp các chương trìn h với các cơ sd dữ liệu tro n g chương 18-


C h ư ớ n g 11: s ử dụng các m ảng để quản lý dữ liệu s ố và chuỗi

9

T rong chưcmg này, b ạn sẽ học cách tổ chức các biến và th ô n g tin khác
th à n h các k h u n g chứa hữu dụng được gọi là các m ảng (array). B ạn sẽ học
cách hợp lý h ó a những tác vụ quản lý dữ liệu b ằn g các m ảng có kích cỡ cố
đ ịn h và các m ảng động và cách sử dụng các m ảng tro n g m ã để quản lý các
lượng lớn dữ liệu. B ạn sẽ học cách tá i định chiều các m ảng và gìn giữ dữ
liệu tro n g các m ản g k h i b ạn quyết định th a y đổi kích cỡ của m ộ t m ảng. Để
m inh họa các m ảng lớn có th ể xử lý như thê' nào, b ạn sẽ sử dụng các phương
thức S o rt và R everse tro n g class A rray của M icrosoft .NET F ram ew ork để
sắ p xếp lạ i th ứ tự m ột m ảng chứa các giá trị số nguyên 6 chữ sô’ ngầu nhiên.
Sau cùng, b ạ n sẽ học sử dụng control P rogressB ar để cho người dùng biết
m ột tiế n tr ìn h (liên quan đến m ảng hoặc nào dó) m ấ t th ờ i gian bao lâu.
N hững kỹ th u ậ t m à b ạn sẽ học m ang lại m ột bước khởi đầu làm quen vững
chắc với n h ữ n g kỹ th u ậ t lập trìn h cơ sở dữ liệu m à b ạn sẽ k h ai th á c sau đó
tro n g sách.

Làm việc với các mảng của các biến
Trong p h ầ n n ày b ạn sẽ học về các m ảng (array), m ột phương p h áp hữu
dụng để lưu trữ h ầu như b ất kỳ lượng dữ liệu tro n g quá trin h thực th i
chương trìn h . Các m ảng là m ột cơ cấu m ạn h và được th ử nghiệm qua thời
gian để lưu trữ các giá trị liên quan m ột cách logic tro n g m ột chương trìn h .

N hững người p h á t triể n ra BASIC, Pascal, c , và những ngôn ngữ lập trìn h
phổ biến k h á c k ế t n h ập các m ảng vào các p h iên b ả n sớm n h ấ t của những
sả n p h ẩm n à y để th am chiếu đến m ột nhóm giá tr ị b ăn g việc sử dụng một
tê n và để xử lý những giá t n đó m ột cách riên g lẻ hoặc chung.
Các m ản g có th ể giúp b ạn theo dõi m ột tậ p hợp nhỏ các giá trị bằng
nhữ ng cách k h ông thực tiễ n sử dụng những biến tru y ền thống. Ví dụ, hãy
tưởng tượng tạo m ột b ản g điểm bóng chày chín lượt chơi tro n g m ộ t chương
trìn h . Đ ể lưu và gọi lại các số điểm cho mỗi ỉược chơi của tr ậ n đấu, có th ể
b ạn r ấ t m uôn tạo h ai nhóm gồm 9 biến {tổng cộng 18 biến) tro n g chương
trìn h . Có lẽ b ạn sẽ đ ặ t cho chúng m ột tê n nào dó n h ư InninglH om eT eam ,
InninglV istingT eam ... để làm cho chúng rõ ràng. L àm việc riên g lẻ với
nhữ ng biến n ày đòi hỏi thời gian và không gian đ án g kể tro n g chưcmg
trìn h . T h ậ t m ay th ay , với Visual Basic, b ạn có th ể tổ chức các nhóm gồm
các biến tương tự th à n h m ột m ảng có m ột tê n chung và m ột index dễ sử
dụng. Ví dụ, b ạn có th ể tạo m ột m ảng hai chiều (cao h a i đơn vị và rộng 9
đơn vị) được đ ậ t tê n là Scoreboard để chứa các số điểm cho tr ậ n đấu bóng
chày. H ãy xem diều n ày làm việc như th ế nào.


10______________ C h ư ớ n g 11: sử dụng các m àng để quản lý dữ liệu s ố và chuỗi

Tạo m ột mảng
B ạn tạo hoặc k h a i báo các m ảng trong m â chương trìn h tương tự như
bạn k h ai báo các biến dơn giản. N hư thường lệ, vị trí m à b ạn k h ai báo biến
tro n g đó quyết đ ịn h nơi nó có th ể được sử dụng hoặc phạm vi (scope) của nó
nh ư sau:
*

Nếĩt bạn khai báo m ột m ảng một cách cục bộ trong m ột thủ tục, bạn có
th ề sứ dụng nó chỉ trong thủ tục đó.


u Nếu bạn khai báo m ột m ảng ở p h ầ n trôn củng cùa m ột /orm . bạn củ tb ể
sứ dụng nó qua siiốt fo n n .
^ N ếu bạn khai báo m ột m ảng m ột cách pttbỉíc trong m ộtpỉiblỉc, bạn có
th ể s ủ dụng nó ờ bất cứ ncH nào trong proịecỉ.

K hi b ạ n k h ai báo m ột biến, b ạn thường bao hàm th ô n g tin được trìn h
bày tro n g b ản g 11.1 tro n g câu lệnh k h ai báo.
Bảng 11.1 Các phẩn tử cú pháp cho một phẩn khai báo m ảng

Các p h ầ n tử cú pháp
tron g k h ai báo m àng

Mô tà

Tên mảng

Tên mà bạn sẽ sử dụng để đại diện cho mảng
trong chương trình. Nói chung, các tên mảng
tuân theo các quy tắc y như các tên biến,
(Xem chương 5, để biết thêm thông tin về
các biến).

Kiểu dữ liệu

Kiểu dữ liệu mà bạn sẽ lưu trữ trong mảng.
Trong hầu hết các trường hợp. tấ t cả biến
trong inộL mảug là cùng một kiểu. Bạn có
th ể xác định một trong các kiểu dữ liệu cơ
bản hoặr nếu bạn chưa chắc chắn kiểu dữ

liệu nào sẽ dược lưu trữ trong m ảng hoặc
bạn sẽ sử đụng nhiều kiểu hay không, bạn
có thể xác định kiểu Object.

Số chiều

Số chiều mà mảng sẽ chứa. Hầu h ế t các mảng
là một chiều (raột danh sách các giá trị) hoặc
hai chiều (một bảng các giá trị), nhưng bạn
có thể xác định các chiều bổ sung nếu bạn
làm việc với một mô hình toán học phức lạp
chẳng hạn như một hình dạng ba chiều. Số
chiều trong một mảng đôi khi được gọi là
hạng (rank) của mảng.

SỐ phần tử

Sô' phần tử mà mảng sẽ chứa. Các phần tử
trong mảng tương ứng trực tiếp với iniex
mảng. Index mảng đầu tiên luôn là 0 (zero)-


C h ư ơ n g 1 1 : S ử d ụ n g c á c m ả n g đ ể q u ản !ý d ữ liệ u s ố v à c h u ỗ i

11

• • • • • • •

Thủ thuật
Các mảng chứa một số phần tử được xác lập được gọi là các mảng có kích cỡ cố

đ ịn h (flx e d size array). Các m ảng chứa m ọt số phần tử khả biến (các mảng có
th ể m ở rộ n g tro n g quá trìn h thực th i chương trìn h ) được gọi là các m ảng động
(d y n a tĩiic array).

Khai báo m ột mảng có kích cỡ cố định
Cú p h áp cơ b ản cho m ột m ảng có kích cỡ cô' định public là
Dim ArrayNam e(Dim 1lndex, Dim2lndex, ... ) As DataType

Các đối sô’ sau đây quan trọng:
a D im là từ khóa khai báo mảng, sứ dụng Public thay ỉ’ì nếu bạn đặi
m ả n g trong m ột modnỉe.
m A rrayN am e là tên biển của mảng.
» D im lỉn d e x là giởi hạn trẽn của chiều thứ n h ấ t của mảng, đ â y là số

p h ầ n tứ trt'c cho 1.
a D im 2 ỉn d ex là giới hạn trên của chiền thứ hai của mảng, đ â y là số p h ầ n
tứ tnc cho 1. (Các chiều bổ sung có th ề được đìCa vào nếu chúng được
tách biệt bàng các ảấn phẩy).
M D ataType là m ột tì( khóa ticơng ứng t>ới kiểu d ũ liệu m à sẽ được đìCa vào
m ảng.

Ví dụ để k h a i báo m ột m ảng chuỗi m ột chiều có tê n là Em ployees có chồ
d àn h cho 10 tê n n h ân viên (dược đ án h số từ 0 đ ến 9), b ạn có th ể gõ nhập
dòng m ả sau đây tro n g m ột thủ tục sự kiện;
Dim Employees{9) As string

T rong m ột module, p h ần khai báo m ảng này trô n g như sau:
Public Employees(9) As string

B ạn cùng có th ể xác định m ột cách tường m inh giới h ạ n dưới của m ảng

là zero b ằn g việc sử dụng m ã tro n g m ột th ủ tục sự kiện:
Dim Employees(0 To 9) As string

Cú p h áp "0 to 9" n ày được đưa vào để làm cho m ã dễ đọc hơn - những
nểười mới đ ến chương trìn h của bạn sẽ hiểu ngay ra rằ n g m ảng Employees
có 10 p h ầ n tử được đ án h số từ 0 đến 9. Tuy nhiên, giới h ạ n dưới của m ảng


12

C h ư ơ n g 11: S ử dụng các m ảng đ ể quản lý dư liệu s ố và chuỗi

p h ải luôn là zero. B ạn không th ể sử dụng cú pháp n ày để tạo m ộ t giới hạn
dưới khác cho mảngOành riêng bộ nhớ
K hi b ạn tạo m ột m ảng, Visual Basic dành riên g chỗ trố n g cho nó tro n g
bộ nhớ. Ả nh chụp m àn h ìn h sau đây m inh họa về k h á i niệm m ả n g Employees 10 p h ần tử được tổ chức n h ư th ế nào. Các p h ần tử được đ án h sô' từ 0 đến
9 th a y vì từ 1 đến 10 bdi vì các index m ảng luôn b ắ t đầu với 0.
E m p lo y e e s

Đ ể k h ai báo m ột m ảng 2 chiều public có tên là Scoreboard có chỗ trống
đ àn h cho hai h àn g và chín cột dữ Uệu số nguyên S h o rt, b ạn có th ể gõ n h ập
câu lện h sau đây tro n g m ột th ủ tục sự kiện hoặc ở p h ần trê n cùng của form:
Dim Scoreboard(1, 8) As Short

Sử dụng cú pháp n h ấ n m ạ n h giới h ạn dưới (zero), b ạn cũng có th ể khai
báo m ảng n h ư sau:
Dim Scoreboard(0 To 1, 0 To 8) As Short

Sau khi b ạn k h ai báo m ột m ản g hai chiều như vậy và Visual B asic d ành
riê n g chỗ trố n g cho nó tro n g bộ nhớ, bạn có th ể sử dụng m ả n g trong

chưcmg trìn h n h ư th ể nó là m ộ t b ản g các giá tr ị n h ư được m in h h ọ a trong
ả n h chụp m àn h ìn h dưới đây. (Trong trường hợp n ày các p h ầ n tử m ảng
được đánh sô' từ 0 đến 1 và từ 0 dến 8).


C h ư ớ n g 11: S ử dụng các m ảng để quản iý dừ liệu s ố và chu ỗi

13

Scoreboârd
C á c cột

0
C ác hàng

1

0

Làm việc vớ i các phần tử mảng
Để th a m chiếu đ ến m ột p h ần tử của m ột m ảng, b ạn có th ể sử dụng tên
m ảng và m ột index m ảng được đ ặ t trong các dấu ngoặc đơn. Index sẽ là m ột
số nguyên hoặc m ột biểu thức vốn tạo n ên m ột số nguyên, Ví dụ, index có
th ể là m ột b iế n số nguyên chẳng h ạ n như num, hoặc m ột biểu thức chẳng
h ạn n h ư num -1. (Biến bộ đếm cho m ột vòng lặp For... N ex t thường được sử
dụng). Ví dụ, câu lệ n h sau đây gán giá trị "Leslie" vào p h ầ n tử có m ột index
là 5 tro n g ví dụ m ản g Employees trong p h ần trưức:
Employees(5) = ‘ Leslie’

Câu lệ n h n ày tạo r a k ế t quả dưới đây tro n g m ột m ản g Employees:

E m ployees

Lesile

Tương tự, câu lệ n h sau đây gán số 4 vào h à n g 0, cột 2 (phần trê n cùng
của lượt chơi th ứ ba) tro n g ví dụ m ảng Scoreboard tro n g p h ần trước:
Scoreboard{0, 2) = 4


14

C h ư ơ n g 11: Sử dụng các m ảng đ ể quản lý dữ liệu s ố và chu ôi

Câu lện h n ày tạo ra k ế t quả sau dây tro n g m ảng Scoreboard:
Scoreboard
C ác cột

0

1

2

3

4

5

6


7

8

C ả c hàng

B ạn có th ể sử dụng những kỹ th u ậ t tạo index n ày để g án hoặc tru y tìm
b ấ t kỳ p h ần tử m ảng.
Khai báo m ột mảng và gán cho nó các giá t r ị ban đầu
Cũng có th ể k h a i báo m ột m ản g và g án cho nó các g iá tr ị b a n đầu cùng
m ột lúc. Cú p h áp câu lệ n h n ày đôi khi tương đương với n h ữ n g gì b ạ n đã
học về việc g án m ộ t g iá tr ị ban đầu vào m ộ t b iế n tạ i th ờ i đ iểm k h a i báo
và hừu dụng k h i b ạn b iế t trước m ộ t m ản g cần lớ n bao n h iê u và nội dung
của nó là gì.
Để tạo m ột m ảng b ằn g cách này, bạn sử dụng nhữ ng gì được gọi là một
trực kiện m ảng (array liberal). M ột trực kiện m ản g gồm m ột d an h sách các
giá tr ị dược p h ân cách b ằn g dấu phẩy được đ ặ t tro n g các dấu ngoặc (II). Khi
b ạ n sử dụng cú p h áp này, b ạn có th ể cung cấp kiểu m ản g hoặc để Visual
B asic sử dụng sự suy lu ận kiểu (type inference) để quyết đ ịn h m ả n g n ên có
kiểu nào. Ví dụ, để k h a i báo m ột m ảng m ột chiều có tê n là W a ite rs có kiểu
S trin g và điền vào nó 7 tê n , b ạn sử dụng cú p h áp sau đây:
Dim W aiters() As strin g = {"Ben", "Sue", "Lee", "Kim-, "Pat", "Eve", “S a i")

Chú ý rằ n g kích cỡ của m ảng này được tự động quyết đ ịn h bởi Visual
Basic k h i W aiters được khai báo. Ngoài ra, nếu b ạn k h ông biểu th ị m ột
kiểu m ảng, Visual B asic sẽ sử dụng sự suy luận kiểu để quyết đ ịnh đúng
kiểu dữ liệu m ảng cho bạn. Rõ ràng, nếu tấ t cả dữ liệu có cùng m ột kiểu,
trìn h biên dịch sẽ b iế t rõ kiểu dữ liệu nào n ê n được sử dụng cho m ảng.
N hưng nếu có m ột hồn hợp các kiểu chẳng h ạ n n h ư n h iều sô' nguyên, sô' có

độ chính xác đơn và sô' có độ chính xác kép, M icrosoĩt Visual Studio sẽ chọn
m ột kiểu dữ liệu cho m ản g đủ lớn để chứa tấ t cả giá trị. T ro n g n h iều trường
hợp, đây sẽ là kiểu dữ liệu Object bởi vì các biến (và các m ảng) O bject được
th iế t k ế đậc b iệt để chứa b ấ t kỳ kiểu dữ liệu.
Câu lệ n h sau đây k h ai báo m ột m ảng có tê n là In v e stm e n ts và sử dụng
m ột trực k iện m ản g dể th ê m bốn giá trị vào m ản g k h i nó được tạo. Vì kiểu


C h ư d n g 1 1 : S ử d ụ n g c á c m ả n g đ ể q u ầ n lý d ữ liệ u s ổ v à ch u ò i_______________ 15

không được xác định, Visual B asic đánh giá các p h ần tử m ảng và quyết
định rằn g tro n g trường hợp này kiểu Object th ì th íc h hợp n h ất.
Dim investmentsO = (5000, 20350, 499.99, 10000}
------------------------------------------------------------------------------------------------------------------

Nếu xác lập Option Infer của trình biên dịch được xác lập sang On,
kiểu Double sẽ đưỢc xác định khi câu lệnh ở ưên đưỢc thực thi,
Xem chương 1 đ ể ^ ^ t r Ợ ^ ú p đ i ề u chỉnh xác lập nàỵ^________
M ột m ả n g đa chiều cũng có th ể được k h ai báo b ằn g cách n ày m ặc dù bạn
cần cẩn th ậ n liệ t kê các phần tử tro n g th ứ tự phù hợp (nghĩa là h àn g 0
trước tiê n rồi đ ến h àn g 1 h àn g 2...), Ví dụ, câu lện h sau đây k h a i báo m ột
m ảng h a i chiều có tê n là Rectangle và gán bốn giá tr ị san g mảng;
Dim Rectangle = ({10, 20}, {50, 60})

M ảng n à y có h a i h àn g và hai cột. P h ần tử m ảng (0,0 - đó là h àn g 0 cột
0) bây giờ chứa m ột giá trị 10 và p h ần tử (0,1 ' đó là h àn g 0 cột 1) bây giờ
chứa m ột g iá trị 20. Cũng chú ý rằ n g có ba tậ p hợp dấu ngoặc được sử dụng
tro n g p h ầ n k h a i báo; những dâu ngoặc n ày làm rõ các p h ần tử nào đang
được gán và giữ chúng trong th ứ tự phù hợp.
Ảnh chụp m àn h ìn h dưới đây m in h họa Visual Studio Code E d ito r với ba

ví dụ về các p h ần k h ai báo trực k iệ n m ảng đâ được tr ìn h bày tro n g phần
này. Chú ý rằ n g Code E ditor à ch ế độ debugging (hoặc b reak mode) và cửa
sổ W atch x u ấ t h iệ n và h iển thị nội dung của m ảng W aiters. (C hế độ Debugging mode và cửa sổ W atch đã được giới thiệu tro n g chưcmg 8). M ột vòng
lặp For... N ex t cũng đang được sử dụng để h iển th ị nội dung của m ảng
W aiters tro n g m ộ t hộp thông báo m ặc dù b ạ n k hông th ể th ấ y k ế t quả của
vòng lập n ày tr ê n m àn h ìn h này. Các vòng lặp F or... N e x t là nhữ ng công
cụ ho àn hảo để xử lý các m ảng như bạn sẽ th ấ y tro n g p h ần tiếp theo.


C h ư ớ n g 11: s ử dụng các m ảng đ ể quản lý dữ liệu s ố và chuôi

16

:ÍÍS33;V'W»fW C-pl6 . ♦ ậ ,x*


^^Suttanỉ
_____________

i i -‘-M
rA

sV
^rM
* ’*'’,
.
^ : «jVí»\«rr
»wtrwCỉiĩ^f~
»V

>V
ũ*.*. ~
êv^il

+

év b

«•

éT

• {‘^**.

* ">

*»'i' 'vaì

WMowiAp^i(«li«

&{« ỉnv*ttM >'tỉ() • fSỈM» :« )» .$ , 4«> '<9, ieC9í'

ỈA.*mI «A

2ÍS M s u n ậ ỉ * • « / : » . M ) , [ i t , M } ỉ
ữl« 1 6 t

r < r i • • Te 0

Ind Svn


'|4 CỈAỉ»

NlA^t
> w»inr)

Vfữ>
f 0)
*ữ)

*

n)



^o

Ty^

Vllui

|L■Su»'

•Uí‘
'tìn»'
•»«t*

•ív»*

*s«l*

Sl»«'9Ỉ

: ỉi

^ • SVí«*9
1. •

<•

&M9

* • *H*J

^

i, • Srhi^

'• • kri*kị

PoobltO
^t»SK

lnveí»7rwft»

1
Co(U

CM6


Tạo m ột m ảng có kích cỡ cố định để chứa các n h iệ t độ
Bài tậ p sau đây sử dụng m ột m ản g m ột chiều có tê n là T em p eratu res để
ghi chép các n h iệ t độ cao h àn g ngày cho m ột tu ầ n lễ 7 ngày. Chương trìn h
m inh họa b ạn có th ể sử dụng m ột m ảng n h ư t h ế nào để lưu trữ và xử lý m ột
nhóm các giá tr ị liên quan trê n m ột form. B iến m ảng T em p eratu res được
kh ai báo ở p h ần trê n cùng của form và sau đó các n h iệ t độ được g án sang
m ản g b ằn g việc sử dụng m ộ t h àm InputBox và m ột vòng lặp F or... N ex t m à
bạn đã học ở chương 7. Bộ đếm vòng lặp (loop counter) được sử dụng để
th a m chiếu m ỗi p h ần tử tro n g m ảng. Sau đó các nội dung m ản g được hiển
th ị trê n form b ằn g việc sử dụng m ộ t vòng lặp For... N ext và m ộ t đô'i tượng
hộp text. N h iệ t độ cao tru n g bình cũng được tín h và được h iể n thị.
Các hàm UBound và LBound
Đ ể đ ơ n g iả n h ó a v iệ c làm v iệ c v ớ i m ả n g , c h ư ơ n g trình F ỉx e d A rra y sử
đ ụ n g hàm U B o u n d đ ể kiể m tra tìm g iớ i h ạ n tré n h o ặ c giá trị in đ e x c a o n h ấ t
c ủ a m ả n g . V ớ i U B o u n d b ạ n c ó th ể x ử lý c á c m ả n g m à th a m c h iế u đ ế n c á c
câ u lệ n h k h a i b á o đ ã đ ịn h n g h ĩa ch ín h x á c b a o n h iê u giá trị m à m ả n g sẽ
c h ứ a . H à m L B o u n d c ó m ố i iiê n h ệ c h ặ t ch ẽ x á c n h ận g iá trị in d e x d ư ớ i
h o ặ c g iớ i h ạ n d ư ớ i c ủ a m ộ t m ả n g , c ũ n g c ó sẵ n c h o bạn d ư ớ i d ạ n g m ộ t tính
n ă n g c ủ a c á c p h iê n b ả n irư ớ c đ ó củ a V is u a l B a s ic . T u y n h iê n , b ở i v l bây
g iờ tấ t c ả m ả n g V is u a l B a s ic c ó m ộ t giới h ạ n d ư ớ i là z e ro (0 ), h à m c h ỉ v iệ c
trả v é m ộ t g iá trị là 0. C á c hàm U B o u n d v à L B o u n d c ó cú p h á p
L B o u n d (A rra y N a m e )
U B o u n d (A rra y N a m e )
T ro n g đ ó A rra y N a m e là tê n c ủ a m ộ t m ả n g đ ã đ ư ợ c khai b á o tro n g p ro je c t.


C h ư ớ n g 1 1 : S ử d ụ n g c á c m à n g đ ể q u ả n lý dữ liệu số' v à c h u ỗ i_______________ 1 7

Sử đụng một mảng có kích cỡ c ố định

1. Khởi động Visuaỉ Studio, và tạo m ột project Visual Basic Windows
F orm s A pplication mới có tê n là M y F ix e d A rra y .
2. Vẽ m ột đối tượng hộp te x t trê n form.
3. Xác lập thuộc tín h M ultilìne của đối tượng T extB oxl san g True sao
cho b ạn có th ể đ ịnh lại kích cỡ đối tượng.
4. Đ ịnh lại kích cỡ đô'i tượng hộp tex t sao cho nó lấp đầy p h ần lớn
form.
5. Vẽ hai đô'i tượng nút rộng trê n form bên dưới đô'i tượng hộp tex t
được định hướng cái này b ên cạnh cái kia.
6. Xác lập các thuộc tín h sau đây cho form và các đô'i tượng của nó;
Đ ôi tưỢng

Thuộc tín h

Xác lập

TextBoxl

ScrollBar

Vertical

B uttonl

Text

"Enter Temps”

Button2


Text

"Display Temps"

F o rm l

Text

"Fixed Array Temps"

F orm trô n g giống như form được m inh họa tro n g ả n h chụp m àn
h ìn h dưới đây:
P b ttd A rĩíy T e m p ỉ

Ertìei Tem;iỉ

Ị ' o 1 l r? 1 9 ^ ^



D iỉựạyTem ci” ]

7. T rong Solution Explorer, n h ấp nút View Code để h iển th ị Code
E ditor,
8. Cuộn đến p h ầ n trê n cùng của m ã chương trìn h của form, và ngay
bên dưới câu lệ n h Public C lass F orm l, gõ n h ập p h ần k h a i báo m ảng
sau đây:


18


C h ư ơ n g 11: s ử d ụ n g c á c m ả n g đ ể q u ả n lý d ữ liệ u s ố v à c h u ỗ i
Dim Teperatijres(0 To 6) As Single

Câu lện h n ày tạo m ột m ảng có tê n là T em p eratu res (có kiểu Single)
chứa bảy p h ầ n tử dược đ án h số từ 0 đến 6. Bdi vì m ả n g đã được k h a i
báo ở p h ần trê n cùng của form, nó có sẵ n tro n g t ấ t cả th ủ tục sự k iệ n
tro n g form.
9. H iển th ị lại form và sau đó n h ấp đôi n ú t E n te r T em ps (B u tto n l).
Thủ tục sự kiện B uttonl_C lick x u ất h iệ n tro n g Code E ditor.
10. Gõ n h ập các câu lện h chương trìn h sau đây để n h ắ c người dùng về
các n h iệ t độ và để tả i dữ liệu đầu vào vào m ảng:
Dim Prompt, Title As string
Dìm í As Short
Prompt * "Enter the day'style high temperatures."
For i = 0 To UBound(Temperatures)
Title = 'Day "& (i + 1)
Temperatures(i) = lnputBox(Prompt, Titíe)
Next

Vòng lặp For... N ext sử dụng b iến bộ đếm số nguyên s h o rt i là m ột
index m ảng để tả i các n h iệ t dộ vào các p h ần tử m ản g 0 d ến 6. Thay
vì sử dụng cú p h áp vòng lặp F or được đơn g iản hóa:
For i * 0 to 6

Để xử lý m ảng, m ột cú p h áp hơi phức tạ p được chọn đòi hỏi hàm
ƯBound để đ ạ t được sự lin h h o ạt tro n g tưcmg lai. Cấu trú c vòng lặp
For:
For 1 a 0 To UBound(Temperatures)


Quyết đ ịnh giới h ạn trê n của m ảng bằng việc sử dụng cấu trú c Ubounđ.
Kỹ th u ậ t này lin h h o ạ t hơn bởi vì nếu m ảng được mở rộ n g hoặc được
giảm sau đó, vòng lặp For tự động tự diều ch ỉn h sa n g kích cỡ m ảng
mới.
Để đ iền các n h iệ t độ vào m ảng, th ủ tục sự k iện sử dụng m ột hàm
InputBox, để h iển th ị ngày h iện h àn h b ằn g việc sử dụng bộ đếm
vòng lặp For.
11. H iển th ị lại form, và sau đó n h ấ p đôi n ú t D isplay T em ps (Button2).


C h ư ớ n g 11: S ử dụng các m ảng để quản lý dữ liệu sô' v à chuỗi______________ 19

12. Gõ n h ập các câu lệnh sau đây trong thủ tục sự k iện Button2_Click;
Dim Result As string
Dim i As Short
Dim Total As Single = 0
Result = "High temperatures for the week:” & vbCrLí & v b C rư
For i = 0 To UBoijnđ(Temperatures)
Result = Result & "Day " & (i + 1) & vbTab & _
Temperatures(i) & vbCrLÍ
Total = Total + Temperatures(i)
Next
Result = Result & vbCrLt & _
"Average temperature; “ & Format(Total / 7, “0.0")
T extB oxl.T ext = Result

Thủ tục sự kiện n ày sử dụng vòng lặp For... N ext để xoay vòng theo
chu k ỳ qua các p h ầ n tữ trong m ảng và nó th êm m ỗi p h ần tữ trong
m ả n g vào m ột biến chuỗi có tê n là Resưlt được k h a i báo ở p h ần trê n
cùng của th ủ tục sự kiện. M ột scT chuỗi trực k iện , h ằn g và to án tử

ghép chuỗi (&) đã được sử dụng để đệm và định d ạn g chuồi b ằn g việc
sử dụng các ký tự trở về đầu dòng {vbCrLf), ký tự ta b (vbTab), và các
tiêu đề chính (heading).H ằng vbCrLf, được sử dụng ở đây lẩn đầu
tiê n chứa ký tự trở về dầ u dòng và ký tự chuyển dòng và là m ột cách
hiệu quả để tạo các dòng mới. H ằng vbTab của việc sử dụng ở đây
lầ n đầu tiên để đ ặ t m ột sô' khoảng cách nào đó giữa các giá trị ngày
và n h iệ t độ tro n g chuỗi Result. ở cuối th ủ tục lưu trữ, m ộ t giá trị
tru n g b ìn h cho các n h iệ t dộ được quyết đ ịnh và chuỗi sau cùng được
g án vào thuộc tín h T ext của đô'i tượng hộp text, n h ư được m in h họa
tro n g câu lện h này:
TextB oxl.T ext = Result

13. N h ấp n ú t Save All trê n th a n h công cụ S ta n d a rd để lưu project: Xác
d ịn h íold er C :\V b lO sb s\C h a p ll làm vị trí.
Bây giờ b ạn sẽ chạy chương trình.
• • • • • • •

Thủ thuật
Chương trìn h Fixed hoàn chỉnh được đật trong ío ld e r C : \ v b l OsbsXChapl \F ixe d
A rra y .


2 0 ______________ C h ư ờ n g 11: sử d ụ n(j các m ảng đ ể quản lý dữ liệu s ố v à chuỗi

14. N h ấp n ú t S ta r t D e b u g g in g trên th a n h công cụ S ta n d a rd để chạy
chương trìn h .
15. N h ấp n ú t E n t e r T e m p s, và khi được n hắc bởi h à m InputBox, gõ
n h ập 7 n h iệ t độ khác nhau.
Hộp th o ại h à m InputBox trông như sau:
Diyl

Eníet íhe dôy's \'I*QỲỈlempeta^uie

1 0<

í

Canceỉ 1

16. Sau k h i b ạn go n h ập các nhiệt độ, n h ấp n ú t D is p la y T e m p s .
Sử dụng m ảng, Visual Basic hiển th ị từng n h iệ t độ tro n g hộp te x t và
in m ột giá trị tru n g bình ỏ cuối. M àn h ìn h trô n g tương tự n h ư sau:
8r Fi«dArrỉyTempj

ị ca ^ ạ

lempei^ures kit ỉhevveek
òay 1 77
Dâý2 79
oáyì 80
Oâý 4 80
õdý 5 76
Oâý? 75
Avefổộ8t«ừíDCídtuic 777

^ Enieí Tcmps

i 0isplâyTesTịs

17. N h ấp n ú t C lo se trê n fortn để k ết thúc chương trìn h .
Tạo m ột m ảng dộng

N hư b ạn có th ể th ấ y , các m ảng (array) hoàn to àn tiệ n lợi để ỉàm việc với
các d anh sách số, đặc b iệt nếu bạn xử lý chúng b ằn g việc sử dụng các vòng
lặp For... N ext. N hư ng phải làm p nếu bạn không chắc ch ắn b ạn sẽ cần
bao nhiêu k hông g ian m ảng trước khi bạn chạy chương trìn h ? Ví dụ, phải
làm gì nếu b ạn muôn để người dùng chọn bao nhiêu n h iệ t độ được n h ập vào
chương trìn h Fixed A rray?
Visual B asic giải quyết vấn dề này m ột cách hiệu quả b ằn g m ột khung
chứa co g iãn đặc b iệ t được gọi là một m ảng động (dynam ic array). Các


C h ư ớ n g 11: Sử dụng các m ảng để quản lý dữ liệu sổ v à chuỗi______________ 21_

m ảng động được định chiều vào thời gian chạy khi người dùng xác định của
m ảng hoặc k h i logic m à b ạn thêm vào chương trìn h quyết định m ột kích cỡ
m ảng dựa vào các điều kiện cụ thể. Đ ịnh chiều cho m ột m ảng động đòi hỏi
m ột sô’ bước bởi vì m ặc dù kích cỡ của m ảng không được xác định cho đến
khi chương trìn h chạy, b ạn cần "giữ chỗ trước" cho m ảng vào thời gian
th iế t kế. Đ ể tạo m ột m ảng động, b ạn làm theo nhữ ng bước cơ b ản sau đây:
1. Xác đ ịn h tê n và kiểu của m ảng trong chương trìn h vào thời gian
th iế t kế, bỏ qua sô' p h ần tử trong mảng. Ví dụ, để tạo m ột m ảng
động có tê n là T em peratures, bạn gỗ nhập:
Dim Temperatures{) As Single

2. T h êm m â để quyết định số p h ần tử m à sẽ n ằm tro n g m ảng vào thời
g ian chạy. B ạn có th ể nhắc nhở người dùng b ằn g việc sử dụng m ột
h à m InputBox hoặc m ột đối tượng hộp text, hoặc b ạn có th ể tín h các
n h u cầu lưu trữ của chương trìn h bằng việc sử dụng các thuộc tín h
hoặc logic khác. Ví dụ, các câu lệnh sau đây n h ậ n được kích cỡ m ảng
từ người dùng và gán nó san g biến Days có kiểu Short:
Dim Days As Short

Days = lnputBox("How many days?'', "Create Array")

3. Sử dụng biến tro n g m ột câu lện h ReDim để dịnh chiều cho m ảng, trừ
đi 1 bởi vì các m ảng dựa vào zero. Ví dụ, câu lện h sau đây xác lập
kích cỡ của m ảng T em peratures vào thời gian chạy b ằn g việc sử
dụng biến Days:
ReDim Temperatures{Days - 1)

Q UAN TRỌ NG

Vổí ReDim, bọn khỗng nễn cấ thay đổi (ố chiều irong mỗÍ mâng mâ bqn đđ khai báo irước dó.
4. Sử dụng h àm UBound dể quyết định giới h ạ n trê n m ột vòng lặp
For... N ext và xử lý các p h ần tử m ảng khi cần th iế t như được m inh
họa ở đây:
For i = 0 to Ubound(Temperatures)
Temperatures(i) = lnputBox(Prompt, Title)
Next


2 2 ______________ C h ư d n g 11; S ũ dụng các m ảng để quàn íý dO liệ u sò' và chuỗi

T rong bài tậ p tiếp theo b ạn sẽ sử dụng các bước n ày để chỉnh sửa
chương trìn h Fixed A rray sao cho nó có th ể xử lý b ấ t kỳ số n h iệ t độ
b ằn g việc sử dụng m ột m ảng động.

Sử dụng một mảng động để chứa các nhiệt độ
1. Mở C o d e E d ito r để h iển th ị m a chương trìn h cho project Fixed
A rray.
2. Cuộn đ ến p h ần trê n cùng của m à của form, m à lúc đầu b ạn đã khai
báo m ản g cố đ ịnh T em peratures.

3. Loại bỏ 0 To 6 ra khỏi p h ần khai báo m ảng T em p eratu res sao cho
bây giờ m ảng là m ột m ảng động.
Câu lện h trô n g n h ư sau:
Dlm TemperaturesO As Sìngle

4. T hêm p h ần k h a i báo biến sau đây ngay b ên dưới p h ần k h ai báo
m ản g T em peratures:
Dim Days As Integer

B iến số nguyên Days sẽ được sử dụng để n h ậ n dữ liệu đầu vào từ
người dùng và để đ ịn h chiều cho m ảng động vào th ờ i gian chạy.
5. C uộn xuô'ng tro n g Code E d ito r đ ể h iể n th ị th ủ tụ c sự k iệ n
B uttonl_C lick và chỉnh sửa m ã sao cho nó trô n g giống n h ư sau đây,
(Các p h ần tử th a y đổi hoặc dược th êm vào sẽ được tô bóng).
Dim Prompt, Title As strin g
Dim i As Short
Prompt = "E n te rth e day’s high temperature."
Days = lnputBox("How many days?” , “ Create Array” )
lí Days > 0 Then ReDim Temperatures(Days - 1 )
For i = 0 To UBoiJnd{Temperatures)
Title = “ Day “ & (i + 1)
Temperatures(i) = lnpưtBox(Prompt, Title)
Next

Dòng th ứ tư và dòng th ứ năm nhắc nhở người dùng về số n h iệ t độ
m à người dùng m uôn lưu và sau đó dữ liệu đầu vào của người dùng
được sử dụng để đ ịn h chiều cho m ột m ảng động. Câu trúc quyết định


C h ư ơ n g 11: s ủ dụng các m ảng để quản lý dữ liệu s ố và chuỗi


23

If... T hen dược sử dụng để xác n h ận rằ n g số ngày lớn hơn zero.
(Đ ịnh chiều tro n g m ột m ảng với m ột số nhỏ hơn zero hoặc bằng zero
sẽ tạo ra m ột lỗi). Bởi vì index 0 của m ảng được sử dụng để lưu trữ
n h iệ t dộ cho ngày đầu tiên, biến Days được giảm xuống 1 khi định
chiều cho m ảng. Biến Days không được cần đến để quyết đ ịnh giới
h ạn trê n của vòng lặp For... N ext - n h ư tro n g ví dụ trước, hàm
Ubound được sử dụng th ay vào đó.
6. C uộn xuống tro n g Code E d ito r để h iể n th ị th ủ tụ c sự k iệ n
Button2_Click. C hỉnh sửa m ã sao -cho nó trô n g giống n h ư thường
trìn h dưới đây. (Các p h ần tử được thay đổi sẽ được tô bóng).
Dim Result As string
Dim i As Short
Dim ĩo ta l As Single = 0
Result = “ High temperatures:” & vbCrLí & vbCrLí
For i = 0 To UBound(Temperatures)
Result = Result & "Day

& (i + 1) & vbTab & _

Temperatures(i) & vbCrLí
Total = Total + Temperatures(i)
Next
Result = Resiilt & vbCrLí & _
“Average temperature: “ & Format{Total / Days, “ 0.0” )
T e x tB o x U e x t a Result

B iến Days th a y th ế số 7 trong phép tín h n h iệ t độ tru n g bình ở cuối

th ủ tục sự kiện. Tiêu đề "High tem peratures" m à sẽ h iể n th ị trong
hộp te x t cũng đã được biên tập.
7. H iển th ị form.
8. T hay đổi thuộc tín h T ext của F o rm l th à n h "Dynamic Array",
9. Lưu các th a y đổi sang đĩa.

• ••••••

Thủ thuật
P ro je c t D y n a m ic A rra y h o à n
C :\V b 1 0 s b s \C h a p l\D y n a m ic Array.

c h ỉn h

được

đát

10. N h ấp n ú t s t a r t D e b u g g ín g để chạy chương trìn h .

tro n g

ío ld e r


24

C h ư ờ n g 11:

sử d ụ n g c á c m ả n g đ ể q u ả n lý d ư liệ u s ố v à c h u ỗ i


11. N h ấp n ú t E n t e r T e m p s.
12. Gõ n h ập 5 k h i b ạn được n hắc nhở về sô' n g ày m à b ạn muôn ghi
chép, và sau đó n h ấp OK.

13. Gõ n h ập 5 n h iệ t độ khi được nhắc.
14. K hi b ạn gõ n h ập xong các n h iệ t độ, n h ấp n ú t D is p la y T e m p s .
Chưcmg trìn h h iển th ị 5 n h iệ t độ trê n form, cùng với n h iệ t độ trung
b ìn h của chúng. M àn h ìn h trô n g tưcmg tự n h ư ả n h chụp m àn hình
dưới đây;
« ? D y n a m ie A r r a y

'

'

Ki^ỉempeíâỉưes
O òọ\
0 ^ 3
D ^5

72
74
71
69
70

A v e tâ g e (e m p 6 td tu e .

71


2

I Dgpặ^Tgmp!
15. N h ấp n ú t C lo se trê n form để k ế t thúc chương trìn h .
Bạn đã thực h iện sử dụng h ai loại m ảng phổ b iến tro n g lập trìn h
Visual Basic. Khi b ạn viết các chương trìn h riê n g của m ìn h chảng
bao lâu b ạn sẽ sử dụng các m ảng lớn hơn nhiều n h ư n g n h ữ n g khái
niệm th ì y n h ư nhau và b ạn sẽ ngạc n h iên k h i th â y V isual Basic có
th ể h o àn th à n h các phép tín h liên quan đến m ản g n h a n h n h ư th ế
nào.

Giữ gìn nội dung mảng bằng việc sử dụng ReDim Preserve
T rong bài tậ p trước, bạn đã sử dụng câu lện h ReDim để xác đ ịn h kích cỡ
của m ột m ảng động vào thời gian chạy. Tuy nhiên, m ột k h u y ết điểm tiềm


C h ư ơ n g 11: S ử dụng các m ảng dể quản lý đữ liệu số v à chuỗi

25

ẩ n k ế t hợp với câu lện h ReDim là nếu bạn tá i đ ịnh chiều tro n g m ột m ảng
đã có dữ liệu trong đó, tấ t cả dữ liệu h iện có bị m ấ t không th ể tru y tìm lại
được. Sau k h i câu lện h ReDim được thực thi, nội đung của m ột m ảng động
được xác lập sang giá trị m ặc định của chúng, chẳng h ạ n như zero hoặc
null. Phụ thuộc vào quan điểm của bạn, dây có th ể được xem là m ột tính
n ăn g hữu dụng để làm rỗng nội dung của các m ảng hoặc nó có th ể là một
tín h n ăn g gây khó chịu đòi hỏi m ột giải pháp.
T h ật m ay thay, Visual Basic cung cấp từ khóa P reserv e m à b ạn có th ể sử
dụng để giừ gìn dữ liệu trong m ộ t m ảng khi b ạn th a y đổi các chiều của nó.

Cú pháp cho từ khóa P reserve như sau:
ReDim Preserve Arrayname{Dim1Elements, Dim2Elements, ...)

T rong m ộ t câu lệnh ReDim như vậy, m ảng phải tiếp tục có cùng số chiều
và chứa cùng m ột kiểu dữ liệu. Ngoài ra, có m ột diều k iện là b ạ n chỉ có th ể
định lại kích cỡ chiều m ảng sau cùng. Ví dụ, nếu m ảng có h ai hoặc nhiều
chiều, bạn có th ể th ay đổi kích cỡ của chỉ chiều cuối cùng và vẫn giữ p n nội
dung của m ảng. (Các m ảng m ột chiều tự động vượt qua cuộc te s t này, do đó
bạn có th ể tự do mở rộng kích cỡ của m ảng động b ằn g cách sử đụng từ khóa
Preserve).
Các ví dụ sau đây m inh h ọ a cách b ạn có th ể sử dụng P reserve để tàn g
kích cỡ của chiều sau cùng tro n g m ột m ảng động m à k h ông xóa b ấ t kỳ dữ
liệu hiện có chứa trong mảng.
Nếu lúc đầu b ạn đã khai báo m ột m ảng chuỗi dộng có tê n là Philosophers b ằn g việc sử dụng cú pháp;
Dim PtìilosophersO As strin g

B ạn có th ể tá i định chiều cho m ảng và th ê m dữ liệu vào nó bằng việc sử
dụng m ã tương tự hư sau:
ReDim Philosophers(200)
Philosophers(200) = 'David Probsr

Bạn có th ể mở rộng kích cỡ của m ảng P hilosophers th à n h 301 p h ần tử
(0-300), và giữ gìn nội dung h iện có bằng việc sử dụng cú p h áp sau đây:
DeDim Preserve Philosophers(300)


2 6 _______________ C h ư d n g 1 1 : S ử d ụ n g các m ả n g đ ể q u ằ n lý d ữ liệ u s6' và c h u ỗ i

Sử dụng ReDim cho các mảng ba chiều
M ột ví dụ phức tạ p hơn đòi hỏi một m ảng ba chiều sử dụng m ột cú pháp

tương tự. H ãy tưởng tượng rằn g bạn muôn sử dụng m ột m ả n g ba chiều, có
độ chính xác đơn, dấu động có tên là myCube tro n g chương trìn h . B ạn có
th ể k h ai báo m ảng myCube bằng việc sử dụng cú p h áp sau đây:
Dim myCube(..) As Single

Sau đó b ạn có th ể tá i định chiều cho m ảng và th ê m dữ liệu vào nó bằng
việc sử dụng m ã sau đây:
ReDim myCube(25, 25, 25)
myCube{10, 1 , 1 ) = 150.46

m à sau đó b ạn có th ể mở rộng kích cỡ của chiều th ứ ba trong m ảng
(trong k h i giũ gìn nội dung cùa m ảng) bằng việc sử dụng cú pháp sau đây:
ReDim Preserve myCube(25, 25, 50)

Tuy n h iên , tro n g ví dụ này, chỉ chiều th ứ b a mới có th ể dược mở rộng chiều th ứ n h ấ t và chiều th ứ hai không th ể được th a y đổi nếu b ạn tá i định
chiều cho m ảng b ằn g việc sử dụng từ khóa P reserve. Việc cố th a y đổi kích
cỡ của chiều th ứ n h ấ t hoặc chiều thứ hai tro n g ví dụ này sẽ tạo ra m ột lỗi
run-tim e khi câu lện h ReD im Preserve được thực thi.
Thử nghiệm m ộ t ch ú t với ReDim Preserve, và b ạn th ấ y b ạn có th ể sử
đụng nó n h ư th ế nào để làm cho các m ảng riên g của b ạn tr ở n ên lin h hoạt
và m ạn h mẽ.

Tiến thêm một bước: xử lý các mảng lổn bằng việc sử
dụng các phương thức trọng class Array
T rong các p h ần trước, b ạn đã học về việc sử dụng các m ảng để lưu trữ
thông tin tro n g quá trìn h thực th i chương trìn h . T rong p h ầ n này, b ạn sẽ
học về việc sử dụng các phương thức trong class A rray của .NET Fram ework, m à b ạn có th ể sử dụng để nhanh chóng p h â n loại, tìm kiếm và đảo
ngược các p h ần tử tro n g m ột m ảng cũng như thực h iệ n nhữ ng chức nàng
khác. Chương trìn h m ẫu được tạo m inh họa nhữ ng tín h n ă n g này làm việc
đặc b iệt tố t như th ế nào với các m ảng Tất lớn. B ạn cũng sẽ học cách sử dụng

control ProgressB ar.
Class A rray
K hi b ạn tạo các m ảng tro n g Visual Basic, b ạ n sử dụng m ột class cơ sở
được định n g h ĩa bởi V isual Basic để thực th i các m ản g bên tro n g các chương


C h ư ơ n g 11: Sử dụng các m ảng đ ể quản lý dữ liệu s ố và chu ỗi

27

trìn h do người dùng tạo ra. Class A rray này cũng cung cấp m ột bộ sưu tập
các phương thức m à b ạn có th ể sử đụng để xử lý các m ản g tro n g khi chúng
đang h o ạ t động tro n g các chương trìn h . Các phương thức hữu dụng n h ấ t
bao gồm A rray.Sort, A rray.Pind, A rray.Reserve, Array.Copy, và A rray.Clear.
Bạn có th ể đ ịnh vị những phương thức thú vị k h ác b ằn g việc th ử nghiệm
với class A rray trong Code E ditor {băng cách sử dụng M icrosoít IntelliSense)
và b ằn g cách th a m khảo tà i liệu Visual Studio H elp. Các phương thức class
A rray h o ạ t động giống nhiều n h ư các phương thức .NET Fram ew ork m à
b ạ n đã sử dụng tro n g sách này; nghĩa là chúng được gọi theo tê n và (trong
trường hợp này) đòi hỏi m ột tê n m ảng hợp lệ dưới dạng m ột đối số. Ví dụ,
để p h ân loại m ột m ảng các n h iệ t độ (chẳng h ạ n n h ư m ảng T em peratures
m à b ạn đã tạo tro n g bài tập vừa rồi), bạn sử dụng cú p h áp sau đây:
Array.Short(Temperatures)

B ạn thực h iện m ột lệnh gọi n h ư vậy sau k h i m ản g T em peratures đã
được k h a i báo và được điền vào dữ liệu trong chương trìn h . Khi Visual Basic
thực th i phương thức A rray.Sort, nó tạo m ột vị tr í lưu trữ tạ m th ờ i cho
m ảng tro n g bộ nhớ và sử dụng m ột thường trìn h p h ân loại để tá i tể chức
m ảng theo th ứ tự bảng chữ cái. Sau khi việc p h ân loại h o àn tấ t, m ảng gốc
được xáo trộ n theo th ứ tự tă n g d ần với giá tr ị nhỏ n h ấ t ở vị tr í m ản g 0 và

giá tr ị lớn n h ấ t ở vị tr í m ảng sau cùng. Với ví dụ T em p eratu res ở trê n , việc
p h ân loại tạo ra m ột m ảng các n h iệ t dộ h àn g ngày được tổ chức từ m á t n h ấ t
đến nóng n h ất.
T ro n g b à i tậ p sau đây b ạn sẽ th ấy các phương th ứ c A rray .S o rt và
A rray.R everse có th ể được sử dụng như th ế nào đề sáp xếp lại th ứ tự n h an h
chóng m ột m ảng lớn chứa các sô' 6 chữ số được chọn ngẫu n h iê n giữa 0 và
1,000,000. B ạn cũng sẽ th ử nghiệm với control ProgressB ar, control này
cung cấp sự p h ản hồi trực quan hữu dụng cho người dùng tro n g quá trìn h
p h ân loại dài.

Sử dụng các phương thức Array cho một mảng có 3,000 phần tử
1. T rên m enu File, nhấp o p e n Project và sau đó mở project A rray
C lass S orts được đ ặt tro n g folder C :\V b lO s b s\C h a p ll.
2. H iển th ị form nếu nó chưa xuất hiện.
M àn h ìn h trô n g tương tự như hình m inh họa dưới đây:


2 8 ______________ C h ư ớ n g 11: Sử đụng các m ảng đ ể quản lý dữ liệu s ố v à chuỗi

Pde

Pro^ct

Outld Debug

T«ỉ'n

D«l*

Fofm»t


P&rmỉvtiỉDorịnl X

A íríy C liis Serti

(

F orm n ày trô n g tưcmg tự như các project trước tro n g chương n ày và
có m ộ t hộp te s t để h iể n th ị dữ liệu m ảng. Tuy n h iê n , nó cũng chứa
ba n ú t để xử lý các m ảng lớn và m ột đối tượng progress b a r (th an h
tiế n độ cho người dùng sự p h ản hồi tro n g các th a o tá c m ản g dài
hơn). Sự p h ản hồi trực quan hữu dụng khi các p h ép tín h xảy ra lâu
hơn m ột v ài giây để hoàn th à n h và nếu bạn sử đụng m ã n ày để p h ân
loại m ộ t m ảng có 3,000 p h ần tử m ảng, th ì chắc chắn sẽ hơi chậm
m ột chút.
3. N hấp th a n h tiế n độ trê n form.
Đối tượng P ro g ressB arl được chọn trê n form và được liệ t kê trê n cửa
sổ P roperties. Đối tượng progress b a r được tạo b ằn g việc sử dụng
control P rogrcssB ar trê n tab Common C ontrols tro n g ToolBox. Một
th a n h tiế n dộ được th iế t k ế để h iển th ị tiế n độ của m ộ t sự tín h toán
b ằn g việc h iể n th ị m ột số h ìn h chữ n h ậ t màu th ích hợp dược sắp xếp
tro n g m ột th a n h tiến dộ nằm ngang. Khi việc tín h to án h o àn tấ t
th a n h chứa đầy các h ìn h chữ n h ật. (Trong W indows 7 và W indows
V ista, m ột hiệu ứng làm n h ẫn được áp dụng sao cho th a n h tiến độ
dần dần chứa đầy m ột dãy màu đồng n h ấ t - m ột hiệu ứng đặc biệt
h ấ p dần). Có lẽ b ạn đã th ấy th a n h tiế n độ n h iều lầ n tro n g k h i bạn
đownload các ííle hoặc cài đ ặ t các chương trìn h tro n g W indows. Bây
giờ b ạn có th ể tạo m ột th a n h tiến độ tro n g các chương trìn h riêng
của bạn.
Các thuộc tín h quan trọ n g làm cho m ột th a n h tiế n độ làm việc là các

thuộc tín h M inimum, Maximum, và Value và những thuộc tín h này
thường được xử lý sử dụng m ã chương trìn h . (Các thuộc tín h progress


C h ư ơ n g 11: s ủ d ụ n g c á c m ảng để quản lý dữ liệu s ố và chu ỗi

29

b a r khác, m à b ạ n có th ể kiểm tr a tro n g cửa sổ P roperties diều khiển
diện m ạo và chức n ăn g của th a n h tiến độ). B ạn có th ể kiểm tr a các
thuộc tín h M inim um và Maximum được xấc lập n h ư th ế nào bằng
việc xem th ủ tục sự k iện Form l_L oad của chương trìn h này.
4. N h ấp đôi form đê’ hiển th ị thủ tục sự k iện F orm l_L oad.
B ạn th â y m ã sau đây:
rormlvtk

P u b li c C ia s i 'O -B
D i» fta n d A rrệ jt(ộ r©

ĩut

tf’e

A í lcoj?

• i . i i l i y Au* o f e lit ie n t í

l.0«4(RyVal 5«ride'- As Syỉte*/.’^

5y*.'AXe Ai Syste**.


, ) H^ndlei •

P r ữ | r « 4 « B * r ỉ .H in ỉ > tu « a ?

PrOli-eiiSarl.Mixiípg* • ƯỘCurii^RanđArrây)
L a b c ỉ ỉ . T e x t ■ J & O íjn d (R « n đ irr> y ) ► :
Snđ Sub
* ilJ

w ít"

r a r ^ ỉ r A ,)rfb /c r. erirt

in

te s t

oox

P rÌM A te 5 ^b 6 u t t o n l_ C lic k < Ễ > V * l b «itder A ỉ S v s U í . •*. , B y V ô i « As S y J t e « . t ' - ) h « n d ỉe
C if f i A i
i ■ d To L’6ộund(R»>>d<ỉrray)
R a n đ A rrA y (l) •

In ;( S r ìd ( } ’

T e » t B c a l, T c * t - T í x tO ô x l, Te«? & R M f l V r « y ( i ) 4 v b C r i.f
P r ữ |r e s s 9 a . “ l . v a l u í •




'- ^ v e

p r o s '« s s

0 9 '-

M ex: ì

£nd Sub
th e

írr*'>y

y ^ in g

tKff í r r ® v

» -* t íứ tH ỉổ

P r i v a t e ịu £ B u t t ^ 2 C ỉic k ( B y v » ỉ ie n d « '

irrt

d l•.p i« ^

ỉ y s t e n . —* . ' ’ , d y V â l «

Ỉy ỉte x .


P i» ỉ As ĩ f ì t e g « r
T e>cO oK i .T « K t A '- '3 , . $ o r t ( f t a n d A r r o y )
Tor ỉ

■ 0

Te LIDour>d(RandAT'r«^ị

Đ ể m ộ t th a n h tiế n độ hiển th ị m ột chỉ báo chính xác cho b iết một
tá c vụ tín h to á n sẽ m ấ t bao lâu để hoàn th à n h , b ạn cần xác lập các
số đo tương đối cho diểm đầu và điểm cuôl của th a n h . Điều này được
ho àn th à n h b ằ n g các thuộc tín h M inim um và M aximum được xác lập
để tương hợp p h ầ n tử cuôl cùng và p h ần tử sau cùng tro n g m ảng m à
b ạ n đ an g xây dựng. N hư đã ghi chú, p h ần tử m ảng dầu tiê n luôn là
zero n h ư n g p h ầ n tử m ảng cuối cùng phụ thuộc vào kích cỡ của m ảng,
do đó h à m ư b o u n d đã được sử dụng để tr ả về số đó và thuộc tín h
M axim um của th a n h tiến độ được xác lập m ột cách phù hợp. M ảng
m à b ạ n đ an g xử lý trong bài tậ p n ày là R andA rray, m ột m ảng số
nguyên Long được k h ai báo ban đầu để chứa 500 p h ần tử (0 đến
499).
5. N h ấ p n ú t S t a r t D e b u g g in g để chạy chương trìn h .
Chương tr ìn h chạy và form A rray Class S orts tnở trê n m àn hình.
T ro n g th ủ tụ c sự k iệ n Form l_L oad của nó, chương trìn h đã khai báo


×