Professional Documents
Culture Documents
CHAPTER
*
Arrays and Strings
6 M ảng và ch u ỗ i
Ngoài ra, ở cuối chương còn zỏ phần bài tập có lời g iải, bài tập bổ
sung và đáp án Ìihằm giúp các bọn thực h àn h và áp dụng m ột cách
hiệu quả vào công việc thực tế.
/
366 Chapter 6: Arrays anơ strings
CHỦ DIỂM 6.1
INTRODUCTION TO ARRAYS
G i ó i thiệu sơ lược về mảnq
An a r r a y is a group of memory locations all of the same type that have
the same name. Previously, in a program to calculate employee pay, the
user would type in the employee number, the pay rate, and the number of
hours worked. There would be one variable to hold each piece of informa
tion as shown in Fig. 6-1, i-nd then the gross pay would be calculated.
101 6.25 40
1 101
16251 1401 □
employeeNum2 hourlyRate2 hoursWorked2 grossPay2
11031 ran FI 11
Fig- 6-2 Individual variables íor three em ployees.
EXAM PLE 6.2 Most other processing of arrays also entails loops. One com
mon example is to calculate the sum of all the items in an integer array.
Pseudocode for summing an array would look like this:
set the sum to 0 before the loop starts
loop from lev = 0 to lev = n -1 where n is the total number of items in the array
add the arrayllcv] to the running sum
end loop
mySales
IẵL
[0] 250 300 325
[1] 350 325 400
[2] 220 315 210
[3] 210 310 295
E XAM PLE 6.3 A sales representative m ight have a report of th e sales for
each m onth of each quarter, as shown in Fig. 6-4. The rows [0] through
[3] rep resen t th e four quarters of the year. The columns [0] through [2]
represent the th ree m onths in each quarter. Each elem ent of th e array is
Chương 6: Mảng và Chuỗi 369
accessed through two subscripts, one for th e row and one for th e column,
in that order. For example, in Fig. 6-4 the contents of en try mySales[l][2]
IS “400.”
Two-dimensional arrays follow the rules of single-dimension arrays. The
array is declared specifying the number of memory locations desired by
stating the number of rows and the number of columns. Each item in the
array must contain the same type of data. The entire array has one name
and each elem ent is accessible through the use of its row and column
numbers.
Most processing of these arrays is accomplished through the use of nested
loops, one for the row and one for the column.
myName
[01 [11 [21 [31 M
1 J 1 o 1 A ! N «nd string 1
myCity
toi m [21 [31 M LSI 161 m
1 C - H 1 1 c A G o 1 and string 1
month
10] [1] [21 [31
1 M A Y end string
grains
[01 [11 [2] 13] 4] [51
[0] c 0 r n end String
m w h e a t end string
r e end string
[21 y
6.1. G IỚ I T H IỆ U VỂ M ẢN G
Một m ảng là m ột nhóm các vị trí trong bộ nhớ có cùng kiểu và cùng
tên. Trước đây trog một chương trình đ ể tính số tiền p hải chi trả cho
nhân viên người dùng cần phải gõ nhập mã số của nhân viên, số
tiền chi trả và số giờ làm việc. Sẽ có một biến đ ể g iữ mỗi mảng
thông tin như m inh họa trong hình 6.1, rồi sau đó số tiền chi trả gộp
được tính toán.
101
H ìn h 6.1 Các biến riêng biệt dành cho chi trả lương
__________________________________________ J
Chương 6: Mảng và Chuỗi 371
Nếu có nhiều nhăn viên thì chương trình có th ề có một vòng lặp
dành cho người dùng đ ể gõ nhập thông tin vào các biến giống nhau
dành cho người công nhăn thứ hai rồi tính khoảng tiền gộp mà
người dó nhận được, sau đó đến người thứ ba v,v.... Tuy nhiên, một
bài toán nảy sinh là nếu người chủ muốn có một bảng báo cáo có
chứa danh sách chi trả hàng tuần đối với tất cả các nhăn viên, mức
chi trả trung binh mỗi tuần mộtdanh sách tất cả các nhân viên nhận
số tiền bên trẽn mức chi trả trung bình. S ố tiền trung bình không
thể dược tính toán đến khi tất cả các nhăn viên được nhập xong. Để
so sánh mức nhận tiền của mỗi người với mức trung bình, tất cả
thông tin cần phải được nhập vào lần thứ hai.
Một giải pháp cho vấn đề này đó là bạn phải có một biến khác dành
cho mỗi nhăn viên như m inh họa trong hình 6.2. Mỗi khoảng chi trả
cho nhân viên phải được so sánh với giá trị trung bình. Điều này sẽ
có thể thực hiện được nếu chỉ có hai hoặc ba nhân viẽn, nhưng nó
hoàn toàn không thực tế khi bạn khai báo các biến riêng biệt dành
cho khoảng 20 hoặc 100 hoặc 1000 nhân viên.
Có một giải pháp cho vấn đề này đó là sử dụng một mảng. Các mảng
cho phép lưu trữ cách xử lý một lượng dữ liệu lớn. Ba mảng dược
khai báo, một d ể giữ tất cả các sô nhân viên, một dùng cho tẩtcả các
định mức chi trả theo giờ và thứ ba là dành cho tất cả giờ làm việc
như minh họa trong hình 6.3. Thông tin được nhập vào theo một
cách thức sao cho nhân viên có một con sô' định danh nằ m trong ô 2
thì nhận được định mức lương trong ô 2. và hoạt động sô giờ nằm
trong ô 2. Mỗi khoản tiền chi trả gộp của cá nhânsẽ được tính toán
và tìm giá trị trung bình. Mỗi dữ liệu cá nhân vẫn nằm trong bộ nhớ
và có th ể nhanh chóng được xem xét tạo nên một danh sách những
người có mức chi trả bên trẽn mức trung binh.
I 101 1 1 625 1 1 40 1 1 1
employeeNunứ bourlyRate2 hoursWorked2 grossPay2
1 102 1 1 725 1 B 1 1
employeeNum3 hourlyRale3 hoursWorkcd3 grossPay3
1 103 1 1 655 1 H 1 1
6.1.1 X ử lỷ các m ả n g
Mảng tổng th ể sẽ được khai báo một lần và được biết dưới một tẽn.
Lúc được khai báo, sô chính xác của các vị trí bộ nhớ sẽ được xác lập
ở nơi được chỉ định. Tất cả vị trí phải có chứa dữ liệu cùng kiểu. Mỗi
yếu tố (element) hoặc vị trí bộ nhớ riêng biệt trong m ảng phải dược
thông qua việc sử dụng chỉ số hoặc số subscript. Ví dụ, trong hình
6.3, employeeNums[3] ám chỉ đến những yểu tố trong ô số 3 của
mảng employeeNUms có chứa “104”, hoặc hourlyRates[4] sẽ truy cập
yếu tố trong ô 4 với m ảng hourlyRates có chứa “6.25". Các chi số
thường bắt dầu bằng số 0.
Dữ liệu nhập vào và xuấtra dành cho một m ảng được hoàn thành
thông qua việc sử dụng các vòng lặp. Mỗi lần thông qua vòng lặp có
m ột ô khác nhau trong mảng được điền vào hoặc được in.
V I D Ụ 6.1 Tạo mã giả cho một vòng lặp đ ể điền hoặc in một mảng
n hạng mục như dưới đây.
loop from lev = 0 to lev = n -1 where n is the tctal number of items in the arrm
input or out-put array[lev]
end loop
V I D Ụ 6.2 Hầu hết việc xử lý các m ảng củng chi tiết hóa các vòng
lặp. Một ví dụ p h ổ biến đó là tính tổng của tất cả các hạng mục trong
một m ảng nguyên. Lập mã giả d ể tính tổng một m ảng như dưới
đây.
set the sum to 0 before the loop starts
loop from lev = 0 to lev = n -1 where n is the total number of items in the array
add the arrayDcv] to the running sum
end loop
IChương 6: Máng và Chuỗi 373
Quy trình xử lý chuyên biệt của các mảng trong Visual Basic, C++ và
Java được m inh họa về sau trong chương này. Mỗi ngôn ngữ sẽ xù lý
chúng theo một cách thức hơi khác nhau. Tuy nhiên, trong tất cả các
ngôn ngữ người lập trình phải cẩn thận không được xử lý vượt quá sô
cuối của mảng. Ví dụ, nếu có 10 hạng mục trong một mảng được gọi
là grossPay, được đặt trong các 6 từ [0] đến [9], m ột câu lệnh
grossPay[20] sẽ xảy ra các vấn đề bởi vì chúng không có trong vị trí
nhớ với sư thiết kế.
6.1.2 Các m ản g n hiều ch iều (nhiều th ứ nguyên)
Các mảng một chiều bình thường thì tốt cho việc xử lý danh sách các
hạng mục. Tuy nhiên, đôi khi vẩn cần đến các m ảng hai chiều.
mySales
I2L
[0] 250 300 325
[11 350 325 400
[2] 220 315 210
[31 210 310 295
V í D Ụ 6.3 Một người đại diện bán hàng có th ể có một bản báo cáo về
việc kinh doanh hàng tháng của mỗi quý, như m inh họa trong hình
6.4. Các hàng từ [0] đến [3] đại diện cho 4 quý trong năm . các cột từ
[0] đến [12] đại diện cho 3 tháng trong mỗi quý. Mỗi thành phần
của mảng được tiếp cận thông qua 2 chl số, một chỉ số cho hàng và
một chi số cho cột theo thứ tự. Ví dụ, ở hình 6.4 , nội dung cùa
mySales[lJ[2] nhập vào là 400.
Các máng hai chiều tuân theo quy tác của các màng một chiều. Màng này
dược khai báo bàng các xác định số vị trí nhớ mong muốn khi khai báo số
hàng hay số cột. Toàn bộ màng có một tên và mỗi thành phần có thể tiếp cận
được bàng cách dùng số hàng và số cột của nó.
Phần lớn quy trình xử lý mảng được thực hiện bàng cách sử dụng các
vòng lặp lồng, m ột vòng lặp cho hàng và một vòng lặp cho cột.
V Í D Ụ 6.4 Mã giả đ ể in một mảng hai chiều có dạng như sau:
loop from row = 0 to row = n -1 where n is the number of rows in the array
loop from col = 0 to col = m -1 where m is the number of columns in the array
p rin t out array[row][col]
end col loop
end row loop
374 Chapter 6.ểArrays and Strings
Cũng có th ể có khả năng nhiều han hai chiểu nhưng rắt ít được sù
dụng đ ể xem ví dụ.. Xem phần các bài tập có lời giải 6.4 và 6.5 ở cuối
chương
6.1.3 Các ch u ỗi - M ột lo ạ i m ản g d ặ c b iệ t
Các ví dụ về mảng mà chúng ta đã xem xét là những con số. Ngoài
ra ta vẫn có th ể xử lý các mảng ký tự. N hững m ảng này thường được
gọi là các chuỗi, đây là một loại mảng đặc biệt bài vì chúng được
dùng thường xuyên. Một máng các chuỗi được thực thi dưới dạng một
m ảng các ký tự hai chiểu.
VI D Ụ 6.5 Hãy vẽ các mảng mộtchiều có chứa các chuỗi sau đây:
JO A N ”, “CHICAGO”, và “M AY”. Bên cạnh đó, hãy vẽ một mảng hai
chiều có chứa các chuỗi “corn", wheat”, và “rye”.
Kết quả được m inh họa trong hình 6.5
myNam e
[01 [11 [2] [3] [4]
1 J 0 A I N I •rid string 1
myCity
[01 [1] [2] [31 4] [5] [6] m
1 C H I C A G ° •nd string 1
month
[0] [1] [2] [3]
1 M A I üü
grains
toi [1 ] Í21 [3] 0 [5]
[0] c 0 r n •ndrtrtng
11] w h e a t •nd string
[2] r y e and string
EXAMPLE 6.8 W rite a Visual Basic program to read in a set of ten test
scores, find the average, and print out the average and the scores th a t are
above average.
376 Chapter 6: Arrays and Strings
Figure 6-6 shows a section of code th a t would accomplish th is task. In each
section, the For ...Next loop goes through the entire array to fill or process
each element.
'read in sco r e s
For lcv=l To 10 'read in the entire array
s c o r e s (l e v ) = I n p u t B o x ( ' E n t e r the number*)
Next lev
EXAM PLE 6.9 Declare an array to keep track of daily tem peratures for 31
days in 12 months. Declare an array to m onitor 5 te st scores for each
person in the class numbered from 101 to 110. Declare a two-dimensional
array of strings w ith 4 rows and 26 columns.
Dim d a i l y T e m p e r a t u r e s ( l t o l 2 , l t o 3 1 ) As I n t e g e r ' 12
m o n t h l y r o w s , 31 d a i l y c o l u m n s
Dim c l a s s S c o r e s ( 10 1 t o 1 1 0 , 1 t o 5) As I n t e g e r 1s t u
d e n t n u m b e r s 101 t o 110, 5 s c o r e s
D i m n a m e T a b l e ( 3 , 25) As s t r i n g ' rows 0 t o 3 , 0 t o 2 5
Chương 6: Mảng và Chuỗi 377
Processing of two-dimensional arrays is accomplished using nested
For.Next loops, as shown in Fig. 6-7.
EXAMPLE 6.10 W rite a Visual Basic program where four weeks of tem
peratures are entered and printed in a well-documented chart. Remember
that the Dim statem ent always indicates rows first and then columns. The
code to implement this program is shown in Fig. 6-7.
Dim r o w As I n t e g e r , c o l As I n t e g e r
Dim t e m p s (1 To 4 , 1 To 7 ) As S i n g l e
Dim m e s s a g e As S t r i n g
'r e a d i n temps
F o r r o w = l To 4
F o r c o l = l To 7
m e s s a g e = " E n t e r t h e t e m p e r a t u r e f o r week
" + S t r ( r o w ) +" a n d d a y " + S t r ( c o l )
temps(row, c o l ) =InputBox(message) ' s e e c h a p t e r 3 t o
rev iew e x p l a n a t i o n of message
Next c o l
Next row
'p rin t c h art - heading f i r s t
P r i n t 'DAY:", ' S u n ' , "Mo n " , " T u e " , " We d " , " T h u " ,
"Fri", 'S a t'
F o r r o w = l To 4 'd o e v e r y t h i n g f o r e a c h row i n t h i s
loop
P r i n t "Week"; ro w, ' l a b e l f o r e a c h row f o l l o w e d by
comma f o r n e x t c o l u m n
F o r c o l = l To 7 'do e v e ry th in g fo r each
column i n t h i s l o o p
P r i n t t e m p s ( r o w , c o l ) , ' e a c h t e m p f o l l o w e d b y comma f o r
n e x t column
Next c o l
Print ' t a k e c u r s o r t o n e x t l i n e f o r n e x t row
Next row
The output for the code in Fig. 6-7 w ith sample data entered looks like
this:
« 1 Ctffun s
DAY Sun Mon T im W ad Thu Fn Sal
w * .k 1 55 St 57 59 60 52 49
to ề k 2 45 42 • 45 42 35 30 26
fflMk 3 21 25 a 32 36 39 40
*M k 4 45 48 52 53 57 51 49
378 Chapter 6: Arrays and Stringt
The output for this code is shown below. Notice th a t a space is consid
ered a character. It is listed as one of the middle two characters for both
“Susan B. Anthony” and “Alexander the Great.”
'handle scores
lcv-1
numln-InputBox(‘Enter the score (-1 to stop)*)
Do While (lcvdO And numln>0) 'stop at 10 or -1
numScores=numScores+l
s c o r e s (lev)-numln
numIn=InputBox(’Enter the score (-1 to stop)*)
lcv*lcv*l
Loop
'handle temps
Dim temps (1 To 7) As Integer
For lcv=l To 7
nu mln-Inpu t B o x (‘D a y * ♦ Str(lcv)** Enter the temperature*)
t e m p s (lev)=numln
Next lev
6.2.2 X ử lý cá c m ản g
Hầu hết quy trinh xử lý Visual Basic với các mảng dược hoàn thành
bàng cách sử dụng các vòng lặp For ... Next.
VÍ D Ụ 6.8 Hãy viết một chương trình Visual Basic đ ề đọc trong một
tập hợp 10 điểm thi, tỉm điểm, trung binh và in ra điểm trung bình
và các điểm năm bên trên điểm trung binh.
Hình 6.6 trình bày một mục mã hoàn tất tác vụ này. Trong mỗi mục,
vòng lập For...Next thông qua toàn bộ mảng đ ể lấp đầy hoặc xử lý
mỗi phần tử.
382 Chapter 6: Arrays and String»
'read in scores
For lcv=l To 10 'read in the entire array
scores(lev ) - I n p u t B o x ( ’Enter the n u m b e r ’)
Next lev
6.2.3 Các m ả n g h a i c h iề u
Các m ảng hai chiều được khai báo với các đường biên hàng và các
đường biên cột trong cùng dấu móc đan, tách nhau bởi dấu phẩy.
Trong mỗi trưởng hợp. Nếu không có biên dưới được chi định, thì
biên dưới g 'd sử bàng 0.
V I D Ụ 6.9 Hãy khai báo một m ảng đ ể theo dõi nhiệt độ hàng ngày
trong 31 ngày trong vòng 12 tháng. Khai báo một m ảng đ ể giám sát
5 điểm thi cho mỗi một người trong lớp dược đánh số từ 101 đến 110.
Khai báo một m ảng hai chiều của các chuỗi có 4 hàng và 26 cột.
D i m d a i l y T e m p e r a t u r e s ( l t o l 2 , 1 t o 31) As I n t e g e r '12
m o n t h l y r o w s , 31 d a i l y c o l u m n s
D i m c l a s s S c o r e s ( 10 1 t o 1 1 0 , 1 t o 5) As I n t e g e r ' stu
d e n t n u m b e r s 1 01 t o 1 1 0 , 5 s c o r e s
D i m n a m e T a b l e ( 3 , 25) As s t r i n g ' rows 0 t o 3 , 0 t o 2 5
Việc xử lý các m ảng hai chiều được hoàn thành bàng cách sủ dụng
các vòng lập lồng nhóm For ... N et như m inh họa hình 6.7.
V Í D Ụ 6.10 Hãy viết một chương trình Visual Basic ở đó có 4 tuản,
nhiệt độ được nhập vào và được in trong một biểu dồ. H ãy nhớ rằng
Chương 6: Mảng và Chuỗi 383
cảu lệnh Dim luôn luôn chỉ định trước tiên là các hàng và sau đó là
các cột.
Mã để thực thi chương trình này dược m inh họa trong hình 6.7.
Dim row As I n t e g e r , c o l As I n t e g e r
Dim temps (1 To 4. 1 To 7) As S i n g l e
Dim mess age As S t r i n g
' r e a d i n temps
For row-1 To 4
For c o l - 1 To 7
m e s s a g e - ' E n t e r t h e t e m p e r a t u r e f o r week ’ ♦ S t r ( r o w ) * ' an d da y • ♦ S t r ( c o l )
tem ps(row, c o l ) - I n p u tB o x (m e s s a g e ) ' s e e c h a p t e r 3 t o r e v i e w e x p l a n a t i o n o£ messa ge
Next c o l
Next row
' p r i n t c h a rt - heading f i r s t
P r i n t *DAY: * , ’Su n", 'Hon*. ‘T u e ’ , ‘Wed*, ’Thu*, " F r i * . ' S a t *
Por row-1 To 4 ' d o e v e r y t h i n g f o r e a c h row i n t h i s l o o p
P r i n t "Week*; row, ' l a b e l f o r e a c h row f o l l o w e d by comma f o r n e x t column
For c o l - 1 To 7 ' d o e v e r y t h i n g f o r e a c h column i n t h i s l oo p
P r i n t tem ps (ro w , c o l ) , ' e a c h temp fo l l o w e d by comma f o r n e x t column
Next c o l
P rint ' t a k e c u r s o r t o n e x t l i n e f o r n e x t row
Next row
6.2.4 X ử lý ch u ôi
Visual Basic cung cấp một kiểu dữ liệu đặc biệt được gọi là String đ ể
xử lý các m ảng kỷ tự. Kiểu String giúp cho các nhà lập trình dễ dàng
xử lý bởi vì biến String có th ể mở rộng hay thu hẹp chiều dài cần
thiết cho bất cứ giá trị String đã cho nào. Người lập trình không cần
phải theo dõi phần cuối của chuỗi. Visual Basic cũng cung cấp các
hàm cần thiết đ ể xử lý chuỗi.
VÍ D Ụ 6.11 Hãy xem một mã dưới đây.
DimmyName As s t r i n g
myName="J o e "
P r i n t myName; ' i s ' ; L e n (mỵName) ; " c h a r a c t e r s l o n g "
myName= " A l e x a n d e r t h e G r e a t "
P r i n t m y N a m e ; ' i s ; L e n (myName) ; * c h a r a c t e r s l o n g "
384 Chapter 6: Arrays and Strings
V I D Ụ 6.12 Hãy viết một chương trình Visual Basic d ể xem xét một
mảng các chuỗi và xác định nội dung sau đây: (a) chiều dài của mỗi
chuỗi, (b) ký tự bên trái nhất, (c) ba ký tự bên phải nhất và (d) hai ký
tự ở giữa.
H ình 6.8 m inh họa mã bàng cách sử dụng các hàm Visual Basic.
Đ íu ra của m ã này được m inh họa dưới đây. Lưu ý rằng m ột khoảng
trông được xem là một ký tự. Nó được liệt kê dưới dạng một trong số