Download as pdf or txt
Download as pdf or txt
You are on page 1of 48

Trang 1

Lưu trữ dữ liệu trong mảng

Lưu trữ dữ liệu trong mảng


Một mảng là một loạt hoặc danh sách các giá trị trong bộ nhớ máy tính. Tất cả các giá trị phải giống nhau
loại dữ liệu. Thông thường, tất cả các giá trị trong một mảng đều có điểm chung; ví dụ, họ
có thể đại diện cho danh sách số ID nhân viên hoặc giá cho các mặt hàng được bán trong cửa hàng.
227
Bất cứ khi nào bạn yêu cầu nhiều vị trí lưu trữ cho các đối tượng, bạn có thể sử dụng
đối của một mảng lập trình. Nếu bạn lưu trữ các giấy tờ quan trọng trong một loạt các cặp hồ sơ
và gắn nhãn mỗi thư mục bằng một chữ cái liên tiếp trong bảng chữ cái, khi đó bạn đang sử dụng
tương đương với một mảng. Nếu bạn giữ biên lai trong một chồng hộp giày và dán nhãn cho mỗi hộp bằng
tháng, bạn cũng đang sử dụng tương đương với một mảng. Tương tự, khi bạn lập kế hoạch các khóa học cho
học kỳ tới tại trường của bạn bằng cách nhìn xuống danh sách các khóa học cung cấp, bạn đang sử dụng một mảng.

Các mảng được thảo luận trong chương này là mảng một chiều, tương tự như danh sách. Mảng với
nhiều chiều được đề cập trong Chương 8 của phiên bản Toàn diện của cuốn sách này.

Mỗi mảng trong cuộc sống thực này giúp bạn tổ chức các đối tượng hoặc thông tin. Bạn có thể lưu trữ tất cả
giấy tờ hoặc biên lai hộp các tông khổng lồ hoặc khóa học nếu chúng được in riêng lẻ trong một
cuốn sách lớn. Tuy nhiên, việc sử dụng hệ thống lưu trữ và hiển thị có tổ chức giúp cuộc sống của bạn dễ dàng hơn trong từng
trường hợp. Tương tự, một mảng cung cấp một hệ thống lưu trữ và hiển thị có tổ chức cho dữ liệu của chương trình.

Mảng chiếm bộ nhớ máy tính như thế nào


Khi bạn khai báo một mảng, bạn khai báo một cấu trúc chứa nhiều mục dữ liệu; mỗi dữ liệu
item là một phần tử của mảng. Mỗi phần tử có cùng một kiểu dữ liệu và mỗi phần tử chiếm
anarea inmemory bên cạnh, hoặc contiguousto, những người khác. Bạn có thể cho biết số lượng phần tử
một mảng sẽ giữ — kích thước của mảng — khi bạn khai báo mảng cùng với
biến và hằng số. Ví dụ: bạn có thể khai báo một số ba phần tử chưa được khởi tạo
mảng có tên giá và một mảng chuỗi chưa khởi tạo gồm 10 tên nhân viên như sau:

giá num [3]

string staffNames [10]

Khi đặt tên mảng, người lập trình tuân theo các quy tắc tương tự như khi đặt tên biến. Đó là,
tên mảng phải bắt đầu bằng một chữ cái và không chứa dấu cách nhúng. Ngoài ra, nhiều
lập trình viên tuân theo một trong các quy ước sau đây khi đặt tên mảng để làm cho nó nhiều hơn
rõ ràng rằng tên đại diện cho một nhóm các mục:
Mảng thường được đặt tên bằng cách sử dụng danh từ số nhiều như giá hoặc tên nhân viên .
Mảng thường được đặt tên bằng cách thêm từ cuối cùng ngụ ý một nhóm, chẳng hạn như priceList ,
priceTable hoặc priceArray .

Mỗi phần tử mảng được phân biệt từ những người khác với một độc đáo subscript , cũng được gọi là một
chỉ mục , là một số cho biết vị trí của một mục cụ thể trong một mảng. Tất cả
các phần tử mảng có cùng tên nhóm, nhưng mỗi phần tử riêng lẻ cũng có một
Trang 2

chỉ số dưới cho biết nó cách phần tử đầu tiên bao xa. Ví dụ, một yếu tố năm
mảng sử dụng các chỉ số con từ 0 đến 4 và mảng mười phần tử sử dụng các chỉ số con từ 0 đến 9. Trong tất cả
ngôn ngữ, giá trị chỉ số con phải là số nguyên tuần tự (số nguyên). Trong hiện đại nhất
ngôn ngữ, chẳng hạn như Visual Basic, Java, C ++ và C #, phần tử mảng đầu tiên được truy cập bằng cách sử dụng
chỉ số dưới 0, và cuốn sách này tuân theo quy ước đó.

Để sử dụng một phần tử mảng, bạn đặt chỉ số con của nó trong dấu ngoặc vuông hoặc dấu ngoặc
(tùy thuộc vào ngôn ngữ lập trình) sau tên nhóm. Cuốn sách này sẽ sử dụng hình vuông
dấu ngoặc để giữ các chỉ số con của mảng để bạn không nhầm tên mảng với tên phương thức.
Nhiều ngôn ngữ lập trình mới hơn như C ++, Java và C # cũng sử dụng dấu ngoặc vuông
ký hiệu.
Sau khi bạn khai báo một mảng, bạn có thể gán giá trị cho một số hoặc tất cả các phần tử riêng lẻ.
Cung cấp giá trị mảng đôi khi được gọi là điền mảng . Đoạn mã sau đây cho thấy một
khai báo mảng ba phần tử, theo sau là ba câu lệnh riêng biệt điền vào
mảng:
Tuyên bố
giá num [3]
giá [0] = 25,00
giá [1] = 36,50
giá [2] = 47,99

Hình 6-1 cho thấy một mảng có tên là giá


giá [1]
chứa ba yếu tố, vì vậy
giá [0] giá cả [2]
các phần tử là giá [0] , giá [1] và
giá cả [2] .
Các phần tử mảng đã được
đã gán các giá trị 25,00, 36,50 và 47,99,
tương ứng. Giá phần tử [0] là
không có số nào từ đầu của 25,00 36,50 47,99
mảng. Giá phần tử [1] là một
số từ đầu của
mảng và giá [2] là hai số
xa.
Khi người lập trình đề cập đến mảng Hình 6-1 Sự xuất hiện của một mảng ba phần tử
giá phần tử [0], họ nói trong bộ nhớ máy tính
"Giá dưới 0" hoặc đơn giản là "giá © 2015 Cengage Learning

số không."

Nếu thích hợp, bạn có thể khai báo và khởi tạo các phần tử mảng trong một câu lệnh. Phần lớn
ngôn ngữ lập trình sử dụng một câu lệnh tương tự như sau để khai báo một phần tử ba
mảng và gán một danh sách các giá trị cho nó:

giá num [3] = 25,00, 36,50, 47,99


Trang 3 Lưu trữ dữ liệu trong mảng

Bạn đã học được rằng bạn có thể khai báo nhiều biến của cùng một kiểu dữ liệu trong một câu lệnh, chẳng hạn như
sau đây:

num testScore = 0, tuổi

Nếu bạn muốn khai báo các biến đơn và một mảng có cùng kiểu dữ liệu trong cùng một câu lệnh, bạn có thể
đạt được độ rõ ràng tốt hơn bằng cách sử dụng ký hiệu chẳng hạn như dấu ngoặc nhọn để đặt giá trị phần tử mảng, như trong
tiếp theo:

num giá [3] = {25,00, 36,50, 47,99}, testScore = 0, tuổi

Khi bạn sử dụng danh sách các giá trị để khởi tạo một mảng, giá trị đầu tiên bạn liệt kê sẽ được gán cho
phần tử mảng đầu tiên (phần tử 0) và các giá trị tiếp theo được gán cho
các phần tử còn lại theo thứ tự. Nhiều ngôn ngữ lập trình cho phép bạn khởi tạo một
mảng có ít giá trị bắt đầu hơn có các phần tử mảng được khai báo, nhưng không có ngôn ngữ
cho phép bạn khởi tạo một mảng bằng cách sử dụng nhiều giá trị bắt đầu hơn các vị trí có sẵn.
Khi các giá trị bắt đầu được cung cấp cho một mảng trong cuốn sách này, mỗi phần tử sẽ
được cung cấp với một giá trị.
Sau khi một mảng đã được khai báo và các giá trị thích hợp đã được gán cho
, bạn có thể sử dụng một phần tử riêng lẻ giống như cách bạn sẽ sử dụng bất kỳ dữ liệu nào khác
mặt hàng cùng loại. Ví dụ: bạn có thể nhập giá trị cho các phần tử mảng và bạn có thể
xuất ra các giá trị và nếu các phần tử là số, bạn có thể thực hiện phép tính với chúng.
Tham khảo nhanh 6-1 tóm tắt các đặc điểm của mảng.

THAM KHẢO NHANH 6-1 Đặc điểm của Mảng


Mảng là danh sách các mục dữ liệu ở các vị trí bộ nhớ liền nhau.

Mỗi mục dữ liệu trong một mảng là một phần tử.

Mỗi phần tử mảng là cùng một kiểu dữ liệu; theo mặc định, điều này có nghĩa là mỗi phần tử đều giống nhau
kích thước.

Mỗi phần tử được phân biệt với các phần tử khác bằng một chỉ số con, là một số nguyên.

Các chỉ số con có thể sử dụng cho một phạm vi mảng từ 0 đến một ít hơn số phần tử trong một mảng.

Mỗi phần tử mảng có thể được sử dụng giống như một mục duy nhất của cùng một kiểu dữ liệu.
Trang 4

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Lưu trữ dữ liệu trong mảng

230 1. Trong một mảng, mỗi phần tử có cùng kiểu dữ liệu.

2. Mỗi phần tử mảng được truy cập bằng cách sử dụng một chỉ số con, có thể là một số hoặc một
chuỗi.

3. Các phần tử của mảng luôn chiếm các vị trí bộ nhớ liền kề.

Cách một mảng có thể thay thế các quyết định lồng nhau
Xem xét một ứng dụng được yêu cầu bởi một công ty
bộ phận nhân sự thống kê
về những người phụ thuộc được yêu cầu của nhân viên. Các
bộ phận muốn có một báo cáo liệt kê số lượng Người phụ thuộc Đếm
nhân viên đã yêu cầu 0, 1, 2, 3, 4 hoặc 5 0 43
người phụ thuộc. (Giả sử rằng bạn biết rằng không 1 35
nhân viên có hơn năm người phụ thuộc.) 2 24
3 11
Ví dụ, Hình 6-2 cho thấy một báo cáo điển hình.
4 5
Nếu không sử dụng một mảng, bạn có thể viết 5 7
ứng dụng tạo ra số lượng cho sáu
danh mục người phụ thuộc (0 đến 5) bằng cách sử dụng
Hình 6-2 Báo cáo về Người phụ thuộc điển hình
một loạt các quyết định. Hình 6-3 cho thấy © 2015 Cengage Learning

mã giả và lưu đồ cho quyết định-


làm một phần của một ứng dụng như vậy. Mặc du
logic này hoạt động, độ dài và độ phức tạp của nó là
không cần thiết một khi bạn hiểu cách sử dụng một mảng.
Trang 5

Cách một mảng có thể thay thế các quyết định lồng nhau

Các tuyên bố quan trọng:


num dep
num count0 = 0 Không Đúng
num count1 = 0 dep = 0?
num count2 = 0
num count3 = 0 231
Không Đúng count0 =
num count4 = 0 dep = 1? đếm0 + 1
num count5 = 0

Không Đúng count1 =


dep = 2? count1 + 1

Không Đúng count2 =


dep = 3? count2 + 1

Không Đúng count3 =


dep = 4? đếm 3 + 1

count5 = count4 =
đếm 5 + 1 đếm 4 + 1

nếu dep = 0 thì


count0 = count0 + 1
khác
nếu dep = 1 thì Đừng làm điều đó
count1 = count1 + 1 Mặc dù logic này
khác hoạt động, quyết định-
nếu dep = 2 thì quá trình làm là
count2 = count2 + 1 cồng kềnh.
khác
nếu dep = 3 thì
count3 = count3 + 1
khác
nếu dep = 4 thì
count4 = count4 + 1
khác
count5 = count5 + 1
endif
endif
endif
endif
endif

Hình 6-3 Lưu đồ và mã giả của quá trình ra quyết định sử dụng một loạt các quyết định —
cách khó
© 2015 Cengage Learning
Trang 6

Quá trình ra quyết định trong Hình 6-3 hoàn thành mục đích của nó và logic là đúng, nhưng
quy trình rườm rà và chắc chắn không được khuyến khích. Làm theo logic ở đây để bạn hiểu cách
ứng dụng hoạt động. Trong các trang tiếp theo, bạn sẽ thấy cách làm cho ứng dụng trở nên thanh lịch hơn.

Trong Hình 6-3, biến dep được so sánh với 0. Nếu nó là 0, 1 được thêm vào count0 . Nếu nó không phải là 0,
sau đó dep được so sánh với 1. Dựa trên kết quả, 1 được thêm vào đếm 1 hoặc dep được so sánh với 2,
và như thế. Mỗi khi ứng dụng thực hiện quá trình ra quyết định này, 1 lần cuối cùng là
được thêm vào một trong sáu biến hoạt động như một bộ đếm. Logic đếm phụ thuộc trong
Hình 6-3 hoạt động, nhưng ngay cả khi chỉ với sáu loại người phụ thuộc, việc ra quyết định
quá trình này là khó sử dụng. Điều gì sẽ xảy ra nếu số lượng người phụ thuộc có thể là bất kỳ giá trị nào từ 0 đến 10 hoặc 0
đến 20? Với một trong hai tình huống này, logic cơ bản của chương trình sẽ vẫn như cũ;
tuy nhiên, bạn sẽ cần phải khai báo nhiều biến bổ sung để giữ số lượng, và bạn
sẽ cần nhiều quyết định bổ sung.
Sử dụng một mảng cung cấp một cách tiếp cận thay thế cho vấn đề lập trình này và rất nhiều
giảm số lượng câu lệnh bạn cần. Khi bạn khai báo một mảng, bạn cung cấp một nhóm
tên cho một số biến liên quan trong bộ nhớ. Ví dụ, sáu số phụ thuộc
bộ tích lũy có thể được định nghĩa lại thành một mảng có tên là số đếm . Các yếu tố riêng lẻ
trở thành số đếm [0] , số đếm [1] , số đếm [2] , số đếm [3] , số đếm [4] và số đếm [5] , như được hiển thị
trong quá trình ra quyết định sửa đổi trong Hình 6-4.
Trang 7 Cách một mảng có thể thay thế các quyết định lồng nhau

Các tuyên bố quan trọng:


num dep
Không Đúng
số lượng num [6] = 0, 0, 0, 0, 0, 0 dep = 0?

Không Đúng số lượng [0] = 233


dep = 1? số lượng [0] + 1

Không Đúng số lượng [1] =


dep = 2? số lượng [1] + 1

Không Đúng số lượng [2] =


dep = 3? số lượng [2] + 1

Không Đúng số lượng [3] =


dep = 4? số lượng [3] + 1

số lượng [5] = số lượng [4] =


số lượng [5] + 1 số lượng [4] + 1

nếu dep = 0 thì


counts [0] = counts [0] + 1
khác
nếu dep = 1 thì
counts [1] = counts [1] + 1
khác
Đừng làm điều đó
nếu dep = 2 thì
Ra quyết định
counts [2] = counts [2] + 1
quá trình vẫn còn
khác
cồng kềnh.
nếu dep = 3 thì
counts [3] = counts [3] + 1
khác
nếu dep = 4 thì
counts [4] = counts [4] + 1
khác
counts [5] = counts [5] + 1
endif
endif
endif
endif
endif

Hình 6-4 Lưu đồ và mã giả của quá trình ra quyết định - nhưng vẫn là một con đường khó
© 2015 Cengage Learning
Trang 8

Câu lệnh tô bóng trong Hình 6-4 cho thấy rằng khi dep bằng 0, 1 được thêm vào số đếm [0] . Bạn
có thể thấy các câu lệnh tương tự cho phần còn lại của các phần tử mảng đếm ; khi dep là 1, 1 là
được thêm vào số đếm [1] , khi dep là 2, 1 được thêm vào số đếm [2] , v.v. Khi giá trị dep
là 5, điều này có nghĩa là nó không phải là 1, 2, 3 hoặc 4, vì vậy 1 được thêm vào số đếm [5] . Nói cách khác, 1 được thêm vào
cho một trong các phần tử của mảng đếm thay vì một biến riêng lẻ có tên
count0 , count1 , count2 , count3 , count4 hoặc count5 .
Phiên bản này có phải là một cải tiến lớn so với
bản gốc trong hình 6-3? Tất nhiên là không. Bạn vẫn chưa tận dụng được lợi thế của
lợi ích của việc sử dụng mảng trong ứng dụng này.
Lợi ích thực sự của việc sử dụng một mảng nằm ở khả năng bạn sử dụng một biến làm chỉ số con cho
mảng, thay vì sử dụng một hằng chữ chẳng hạn như 0 hoặc 5. Lưu ý trong logic trong Hình 6-4 rằng
trong mỗi quyết định, giá trị được so sánh với dep và hằng số là chỉ số con trong
kết quả Có quá trình luôn luôn giống hệt nhau. Nghĩa là, khi dep bằng 0, chỉ số con được sử dụng để thêm 1
đến mảng đếm là 0; khi dep là 1, chỉ số con được sử dụng cho mảng đếm là 1, v.v.
Do đó, bạn chỉ có thể sử dụng dep làm chỉ số con cho mảng. Bạn có thể viết lại quyết định-
quy trình chế tạo như trong Hình 6-5.
Trang 9

Các tuyên bố quan trọng:


num dep
số lượng num [6] = 0, 0, 0, 0, 0, 0 Không Đúng
dep = 0?

235
Không Đúng số lượng [dep] =
dep = 1? số lượng [dep] + 1

Không Đúng số lượng [dep] =


dep = 2? số lượng [dep] + 1

Không Đúng số lượng [dep] =


dep = 3? số lượng [dep] + 1

Không Đúng số lượng [dep] =


dep = 4? số lượng [dep] + 1

số lượng [dep] = số lượng [dep] =


số lượng [dep] + 1 số lượng [dep] + 1

nếu dep = 0 thì


counts [dep] = counts [dep] + 1
khác
nếu dep = 1 thì
counts [dep] = counts [dep] + 1
Đừng làm điều đó
khác
Ra quyết định
nếu dep = 2 thì
quy trình không có
counts [dep] = counts [dep] + 1
được cải thiện.
khác
nếu dep = 3 thì
counts [dep] = counts [dep] + 1
khác
nếu dep = 4 thì
counts [dep] = counts [dep] + 1
khác
counts [dep] = counts [dep] + 1
endif
endif
endif
endif
endif

Hình 6-5 Lưu đồ và mã giả của quá trình ra quyết định bằng cách sử dụng một mảng — nhưng vẫn là một
cách khó
© 2015 Cengage Learning
Trang 10

Đoạn mã trong Hình 6-5 trông không hiệu quả hơn đoạn mã trong Hình 6-4. Tuy nhiên,
chú ý đến các tuyên bố được tô bóng trong Hình 6-5 — quá trình xảy ra sau mỗi quyết định là
giống hệt nhau. Trong mỗi trường hợp, bất kể giá trị của dep là bao nhiêu, bạn luôn thêm 1 để đếm
[dep] .
Nếu bạn luôn thực hiện cùng một hành động bất kể câu trả lời cho câu hỏi là gì,
không cần phải đặt câu hỏi. Thay vào đó, bạn có thể viết lại quy trình ra quyết định dưới dạng
được thể hiện trong Hình 6-6.

Các tuyên bố quan trọng:


num dep
số lượng num [6] = 0, 0, 0, 0, 0, 0

counts [dep] = counts [dep] + 1


số lượng [dep] =
số lượng [dep] + 1

Hình 6-6 Lưu đồ và mã giả của quá trình ra quyết định hiệu quả bằng cách sử dụng một mảng
© 2015 Cengage Learning

Tuyên bố duy nhất trong Hình 6-6 loại bỏ toàn bộ quá trình ra quyết định vốn là
phần được đánh dấu ban đầu trong Hình 6-5! Khi dep là 2, 1 được thêm vào số đếm [2] ; khi dep
là 4, 1 được thêm vào số đếm [4] , v.v. Bây giờ bạn đã cải thiện đáng kể bản gốc
Hợp lý. Hơn nữa, quá trình này không thay đổi cho dù có 20, 30 hay bất kỳ
số loại có thể. Để sử dụng nhiều hơn năm bộ tích lũy, bạn sẽ khai báo
đếm bổ sung các phần tử trong mảng, nhưng logic phân loại sẽ vẫn giống như
nó ở trong Hình 6-6.

Hình 6-7 cho thấy toàn bộ chương trình tận dụng mảng để tạo ra
báo cáo hiển thị số lượng cho các danh mục phụ thuộc. Các biến và hằng số được khai báo và,
trong mô-đun getReady () , giá trị đầu tiên cho dep được nhập vào chương trình. bên trong
mô-đun countDependents () , 1 được thêm vào phần tử thích hợp của mảng đếm và
giá trị tiếp theo là đầu vào. Vòng lặp trong logic dòng chính trong Hình 6-7 là một vòng lặp không xác định; nó
tiếp tục miễn là người dùng không nhập giá trị sentinel. Khi nhập dữ liệu hoàn tất,
các finishUp () mô-đun hiển thị báo cáo. Đầu tiên, tiêu đề được xuất ra, sau đó dep được đặt lại về 0,
và sau đó mỗi dep và số đếm [dep] được xuất ra trong một vòng lặp. Câu lệnh đầu ra đầu tiên chứa
0 (là số người phụ thuộc) và giá trị được lưu trữ trong số [0] . Sau đó, 1 được thêm vào dep
và cùng một bộ hướng dẫn được sử dụng lại để hiển thị số đếm cho mỗi số
người phụ thuộc. Vòng lặp trong mô-đun finishUp () là một vòng lặp xác định; nó thực thi chính xác
sáu lần.
Trang 11
chuẩn bị()

khởi đầu

đầu ra "Enter
người phụ thuộc hoặc ",
Tuyên bố
QUIT, "thoát"
num dep
số lượng num [6] = 0, 0, 0, 0, 0, 0
num QUIT = 999
đầu vào dep

237

chuẩn bị() trở về

dep <> Đúng


QUIT? countDependents ()

Không

kết thúc() countDependents ()

dừng lại số lượng [dep] =


số lượng [dep] + 1

đầu ra "Enter
người phụ thuộc hoặc ",
kết thúc() QUIT, "thoát"

đầu ra
đầu vào dep
"Số lượng người phụ thuộc"

trở về
dep = 0

Đúng đầu ra dep,


dep <6? dep = dep + 1
số lượng [dep]

Không

trở về

Hình 6-7 Lưu đồ và mã giả cho chương trình báo cáo Người phụ thuộc (tiếp theo)
Trang 12

(còn tiếp)

khởi đầu
Tuyên bố
num dep
số lượng num [6] = 0, 0, 0, 0, 0, 0
num QUIT = 999
chuẩn bị()
trong khi dep <> QUIT
countDependents ()
cuối cùng
kết thúc()
dừng lại

chuẩn bị()
đầu ra "Nhập người phụ thuộc hoặc", QUIT, "để thoát"
đầu vào dep
trở về

countDependents ()
counts [dep] = counts [dep] + 1
đầu ra "Nhập người phụ thuộc hoặc", QUIT, "để thoát"
đầu vào dep
trở về

kết thúc()
đầu ra "Số lượng người phụ thuộc"
dep = 0
trong khi dep <6
đầu ra dep, số lượng [dep]
dep = dep + 1
cuối cùng
trở về

Hình 6-7 Lưu đồ và mã giả cho chương trình báo cáo Người phụ thuộc
© 2015 Cengage Learning

Chương trình trong Hình 6-7 có thể được cải thiện bằng cách đảm bảo rằng giá trị của subcript dep nằm trong
phạm vi trước khi thêm 1 vào số đếm [dep]. Ở phần sau của chương này, bạn sẽ tìm hiểu thêm về cách đảm bảo rằng
chỉ số con nằm trong phạm vi hợp lệ cho một mảng.

Chương trình đếm phụ thuộc sẽ hoạt động nếu nó chứa một chuỗi dài các quyết định
và các câu lệnh đầu ra, nhưng chương trình dễ viết hơn khi bạn sử dụng một mảng và truy cập
giá trị sử dụng số lượng người phụ thuộc làm chỉ số con. Ngoài ra, chương trình mới còn hơn
hiệu quả, dễ hiểu hơn cho các lập trình viên khác và dễ bảo trì hơn. Mảng là
không bao giờ bắt buộc, nhưng thường thì chúng có thể cắt giảm đáng kể thời gian lập trình của bạn và
làm cho logic của bạn dễ hiểu hơn.
Học cách sử dụng mảng đúng cách có thể làm cho nhiều tác vụ lập trình hiệu quả hơn nhiều và
chuyên nghiệp. Khi bạn hiểu cách sử dụng mảng, bạn sẽ có thể cung cấp
giải pháp cho các vấn đề mà nếu không sẽ yêu cầu các bước lập trình tẻ nhạt.
Trang 13

Xem video Tích lũy các giá trị trong một mảng.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Cách một mảng có thể thay thế các quyết định lồng nhau

1. Bạn có thể sử dụng một mảng để thay thế một chuỗi dài các quyết định.

2. Bạn nhận thấy lợi ích chính của mảng khi bạn sử dụng một số không được đặt tên
hằng số dưới dạng chỉ số con thay vì sử dụng một biến.

3. Quá trình hiển thị mọi phần tử trong mảng 10 phần tử về cơ bản là không
khác với việc hiển thị mọi phần tử trong mảng 100 phần tử.

Sử dụng Hằng số với Mảng


Trong Chương 2, bạn đã biết rằng các hằng số được đặt tên giữ các giá trị không thay đổi trong quá trình
thực hiện chương trình. Khi làm việc với mảng, bạn có thể sử dụng hằng số theo một số cách:
Để giữ kích thước của một mảng
Như các giá trị mảng
Dưới dạng các đăng ký

Sử dụng một hằng số làm kích thước của một mảng


Chương trình trong Hình 6-7 vẫn còn một lỗ hổng nhỏ. Trong suốt cuốn sách này, bạn có
đã học cách tránh các số ma thuật — nghĩa là, các hằng số không có tên. Vì tổng số được xuất trong
ở cuối chương trình trong Hình 6-7, chỉ số con của mảng được so sánh với hằng số 6.
Chương trình có thể được cải thiện nếu bạn sử dụng một hằng số được đặt tên thay thế. Sử dụng một hằng số được đặt tên
làm cho mã của bạn dễ sửa đổi và dễ hiểu hơn. Trong hầu hết các ngôn ngữ lập trình, bạn có thể
thực hiện một trong hai cách tiếp cận:
Trang 14

Bạn có thể khai báo một hằng số được đặt tên chẳng hạn như ARRAY_SIZE = 6 . Sau đó, bạn có thể sử dụng
hằng số này mỗi khi bạn truy cập vào mảng, luôn đảm bảo rằng mọi chỉ số con bạn sử dụng
vẫn nhỏ hơn giá trị không đổi.
Trong nhiều ngôn ngữ, giá trị đại diện cho kích thước mảng được cung cấp tự động cho
mỗi mảng bạn tạo. Ví dụ, trong Java, sau khi bạn khai báo một mảng có tên là số đếm ,
kích thước của nó được lưu trữ trong một trường có tên counts.length . Trong cả C # và Visual Basic,
kích thước mảng là số đếm. Độ dài , với chữ hoa L. Không tồn tại giá trị được tạo tự động
bằng C hoặc C ++.

Sử dụng Hằng số làm Giá trị Phần tử Mảng


Đôi khi các giá trị được lưu trữ trong mảng phải là hằng số vì chúng không bị thay đổi
trong quá trình thực hiện chương trình. Ví dụ: giả sử bạn tạo một mảng chứa các tên
cho các tháng trong năm. Khi khai báo một mảng các hằng được đặt tên, người lập trình
thông thường sử dụng tất cả các chữ cái viết hoa với dấu gạch dưới ngăn cách các từ. Đừng nhầm lẫn
định danh mảng với nội dung của nó — quy ước trong cuốn sách này là sử dụng tất cả các chữ cái viết hoa trong
định danh không đổi, nhưng không nhất thiết phải có trong giá trị mảng. Một mảng có tên MONTHS chứa
các giá trị hằng số có thể được khai báo như sau:
string MONTHS [12] = "Tháng 1", "Tháng 2", "Tháng 3", "Tháng 4",

"Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10",

"Tháng Mười Một tháng Mười Hai"

Sử dụng một hằng số làm chỉ số con của mảng


Đôi khi bạn sẽ muốn sử dụng một hằng số không được đặt tên làm chỉ số con cho một mảng.
Ví dụ: để hiển thị giá trị đầu tiên trong một mảng có tên là salesArray , bạn có thể viết
câu lệnh sử dụng hằng số chữ không có tên như một chỉ số con, như sau:
đầu ra salesArray [0]

Bạn cũng có thể có dịp sử dụng hằng số được đặt tên làm chỉ số con. Ví dụ, nếu
salesArray nắmgiữ các giá trị bán hàng cho từng trong số 20 tiểu bang được công ty của bạn bao phủ và Indiana là
trạng thái 5, bạn có thể xuất giá trị cho Indiana bằng một hằng số không có tên như sau:
đầu ra salesArray [5]

Tuy nhiên, nếu bạn khai báo một hằng được đặt tên là num INDIANA = 5 , thì bạn có thể hiển thị tương tự
giá trị bằng cách sử dụng câu lệnh này:
đầu ra salesArray [INDIANA]

Một lợi thế của việc sử dụng một hằng số được đặt tên trong trường hợp này là câu lệnh trở nên tự
ghi lại tài liệu — bất kỳ ai đọc tuyên bố của bạn dễ dàng hiểu rằng ý định của bạn
là để hiển thị giá trị bán hàng cho Indiana.
Trang 15

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng Hằng số với Mảng

1. Nếu bạn tạo một hằng số được đặt tên bằng một kích thước mảng, bạn có thể sử dụng nó như một 241
chỉ số con cho mảng.

2. Nếu bạn tạo một hằng số được đặt tên bằng một kích thước mảng, bạn có thể sử dụng nó làm giới hạn
dựa vào đó để so sánh các giá trị chỉ số dưới.

3. Khi bạn khai báo một mảng trong Java, C # hoặc Visual Basic, một hằng số đại diện cho
kích thước mảng được cung cấp tự động.

Tìm kiếm một mảng cho một kết hợp chính xác
Trong ứng dụng đếm phụ thuộc trong chương này, biến chỉ số con của mảng
các số nguyên nhỏ được tổ chức thuận tiện — số lượng người phụ thuộc được phép từ 0 đến
5 — và biến dep đã truy cập trực tiếp vào mảng. Thật không may, cuộc sống thực không phải lúc nào
xảy ra ở dạng số nguyên nhỏ. Đôi khi bạn không có một biến nào có thể giữ một cách thuận tiện
vị trí mảng; đôi khi bạn phải tìm kiếm trong một mảng để tìm một giá trị bạn cần.

Hãy xem xét một doanh nghiệp đặt hàng qua thư trong đó khách hàng đặt hàng có tên, địa chỉ,
số mặt hàng và số lượng đặt hàng. Giả sử rằng số mặt hàng mà từ đó khách hàng
có thể chọn là các số có ba chữ số, nhưng có lẽ chúng không được đánh số 001 liên tiếp
đến 999. Ví dụ: giả sử bạn cung cấp sáu mặt hàng: 106, 108, 307, 405, 457 và 688, như
được hiển thị trong khai báo mảng VALID_ITEMS bóng mờ trong Hình 6-8. Mảng được khai báo là
không đổi vì số mục không thay đổi trong quá trình thực hiện chương trình. Khi một
khách hàng đặt một mặt hàng, nhân viên văn thư có thể biết đơn hàng đó có hợp lệ hay không bằng cách nhìn xuống
danh sách và xác minh theo cách thủ công rằng số mặt hàng đã đặt có trên đó. Theo cách tương tự, một
chương trình máy tính có thể sử dụng một vòng lặp để kiểm tra số lượng mặt hàng đã đặt hàng với mỗi VALID_ITEMS
phần tử, tìm kiếm một kết hợp chính xác. Khi bạn tìm kiếm qua một danh sách từ đầu này đến đầu kia
khác, bạn đang thực hiện tìm kiếm tuyến tính .
Trang 16

khởi đầu chuẩn bị()

Tuyên bố đầu ra "Nhập mục


242 num item số hoặc ", HOÀN TẤT,
num SIZE = 6 "bỏ"
num VALID_ITEMS [SIZE] = 106, 108, 307,
405, 457, 688
num phụ mục đầu vào
string foundIt
num badItemCount = 0
string MSG_YES = "Hàng có sẵn" trở về
string MSG_NO = "Không tìm thấy mục"
num FINISH = 999

chuẩn bị()

Đúng
mục <>
findItem () kết thúc()
HOÀN THÀNH?

Không xuất badItemCount,


"các mục không hợp lệ
kết thúc() số "

dừng lại trở về

Hình 6-8 Lưu đồ và mã giả cho chương trình xác minh tính sẵn có của mặt hàng (tiếp theo)
Trang 17

(còn tiếp)

findItem ()

foundIt = "N"
243

phụ = 0

phụ < Đúng

KÍCH THƯỚC?

Không

Không item = Đúng


Không đã tìm thấy nó Đúng VALID_ITEMS [phụ]?
= "Y"?

foundIt = "Y"
đầu ra đầu ra
MSG_NO MSG_YES

badItemCount = sub = sub + 1


badItemCount + 1

đầu ra "Nhập mục tiếp theo


số hoặc ", HOÀN TẤT,
"bỏ"

mục đầu vào

trở về

Hình 6-8 Lưu đồ và mã giả cho chương trình xác minh tính sẵn có của mặt hàng (tiếp theo)
Trang 18

(còn tiếp)

khởi đầu
Tuyên bố
244 num item
num SIZE = 6
num VALID_ITEMS [SIZE] = 106, 108, 307,
405, 457, 688
num phụ
string foundIt
num badItemCount = 0
string MSG_YES = "Hàng có sẵn"
string MSG_NO = "Không tìm thấy mục"
num FINISH = 999
chuẩn bị()
trong khi mục <> FINISH
findItem ()
cuối cùng
kết thúc()
dừng lại

chuẩn bị()
đầu ra "Nhập số mục hoặc", FINISH, "để thoát"
mục đầu vào
trở về

findItem ()
foundIt = "N"
phụ = 0
trong khi phụ <SIZE
nếu item = VALID_ITEMS [sub] thì
foundIt = "Y"
endif
sub = sub + 1
cuối cùng
if foundIt = "Y" then
xuất ra MSG_YES
khác
đầu ra MSG_NO
badItemCount = badItemCount + 1
endif
đầu ra "Nhập số mục tiếp theo hoặc", FINISH, "để thoát"
mục đầu vào
trở về

kết thúc()
xuất badItemCount, "các mục có số không hợp lệ"
trở về

Hình 6-8 Lưu đồ và mã giả cho chương trình xác minh tính sẵn có của mặt hàng
© 2015 Cengage Learning
Trang 19

Để xác định xem số mặt hàng đã đặt có hợp lệ hay không, bạn có thể sử dụng một loạt sáu quyết định để
so sánh số với từng giá trị trong số sáu giá trị được phép. Tuy nhiên, cách tiếp cận ưu việt
được hiển thị trong Hình 6-8 là tạo một mảng chứa danh sách các số mục hợp lệ và sau đó
tìm kiếm thông qua mảng để có kết quả khớp chính xác với mặt hàng đã đặt hàng. Nếu bạn tìm kiếm thông qua
toàn bộ mảng mà không tìm thấy kết quả phù hợp với mặt hàng mà khách hàng đã đặt hàng, điều đó có nghĩa là
số mặt hàng không hợp lệ. 245

Các findItem () mô-đun trong hình 6-8 có các bước sau để xác minh rằng một số mặt hàng
tồn tại:
Một biến cờ có tên là foundIt được đặt thành "N" . Một lá cờ là một biến được thiết lập để chỉ ra
cho dù một số sự kiện đã xảy ra. Trong ví dụ này, N chỉ ra rằng số hạng mục có
vẫn chưa được tìm thấy trong danh sách. (Xem câu lệnh tô bóng đầu tiên trong phương thức findItem () trong
Hình 6-8.)

Chỉ số con, con , được đặt thành 0. Chỉ số con này sẽ được sử dụng để truy cập từng VALID_ITEMS
thành phần.

Một vòng lặp thực thi, thay đổi con từ 0 đến con nhỏ hơn kích thước của mảng. Trong vòng
vòng lặp, số mặt hàng đã đặt của khách hàng được so sánh với mỗi số mặt hàng trong
mảng. Nếu mặt hàng do khách hàng đặt phù hợp với bất kỳ mặt hàng nào trong mảng, thì biến cờ là
được gán "Y" . (Xem câu lệnh tô bóng cuối cùng trong phương thức findItem () trong Hình 6-8.)
Sau khi tất cả sáu số mặt hàng hợp lệ đã được so sánh với mặt hàng đã đặt, nếu khách hàng
không mục nào khớp với mục nào trong số chúng, thì biến cờ foundIt sẽ vẫn giữ giá trị "N" .
Nếu giá trị của biến cờ là "Y" sau khi toàn bộ danh sách đã được tìm kiếm, điều đó có nghĩa là
mục hợp lệ và một thông báo thích hợp được hiển thị, nhưng nếu cờ chưa được chỉ định
"Y" ,
không tìm thấy mục này trong mảng các mục hợp lệ. Trong trường hợp này, một thông báo lỗi là
đầu ra và 1 được thêm vào số lượng mục xấu.

Để thay thế cho việc sử dụng biến string foundIt trong phương thức trong Hình 6-8, bạn có thể thích sử dụng
biến số mà bạn đặt thành 1 hoặc 0. Hầu hết các ngôn ngữ lập trình cũng hỗ trợ kiểu dữ liệu Boolean
bạn có thể sử dụng cho foundIt; khi bạn khai báo một biến là Boolean, bạn có thể đặt giá trị của nó thành true hoặc false.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Tìm kiếm một mảng cho một kết hợp chính xác

1. Chỉ số nguyên có thể được lưu trữ trong mảng.

2. Chỉ các số nguyên có thể được sử dụng làm chỉ số con của mảng.

3. Cờ là một biến cho biết liệu một số sự kiện đã xảy ra hay chưa.
Trang 20

Sử dụng Mảng song song


Khi bạn chấp nhận một số mặt hàng vào chương trình công ty đặt hàng qua thư, bạn thường
muốn đạt được nhiều điều hơn là chỉ xác minh sự tồn tại của mặt hàng. Ví dụ, bạn
có thể muốn xác định tên, giá cả hoặc số lượng sẵn có của mặt hàng đã đặt hàng.
Các tác vụ như thế này có thể được hoàn thành một cách hiệu quả bằng cách sử dụng các mảng song song. Mảng song song là
hai hoặc nhiều mảng trong đó mỗi phần tử trong một mảng được liên kết với phần tử
ở cùng một vị trí tương đối trong mảng khác. Mặc dù bất kỳ mảng nào cũng có thể chứa
một kiểu dữ liệu, mỗi mảng trong một tập hợp các mảng song song có thể là một kiểu khác nhau.

Giả sử rằng bạn có một danh sách các số mặt hàng và giá liên quan của chúng. Một mảng
có tên là VALID_ITEMS chứa sáu phần tử; mỗi phần tử là một số mục hợp lệ. Nó là
mảng song song cũng có sáu phần tử. Mảng được đặt tên là VALID_PRICES ; mỗi phần tử là một
giá của một mặt hàng. Mỗi giá trong mảng VALID_PRICES đều thuận tiện và có chủ đích
được lưu trữ ở cùng vị trí với số mục tương ứng trong mảng VALID_ITEMS .
Hình 6-9 cho thấy các mảng song song có thể trông như thế nào trong bộ nhớ máy tính.

VALID_ITEMS [1] VALID_ITEMS [3] VALID_ITEMS [5]


VALID_ITEMS [2]
VALID_ITEMS [0] VALID_ITEMS [4]

106 108 307 405 457 688

0,59 0,99 4,50 15,99 17,50 39,00

VALID_PRICES [0] VALID_PRICES [2] VALID_PRICES [5]

VALID_PRICES [1] VALID_PRICES [3] VALID_PRICES [4]

Hình 6-9 Các mảng song song trong bộ nhớ


© 2015 Cengage Learning

Khi bạn sử dụng các mảng song song:

Hai hoặc nhiều mảng chứa dữ liệu liên quan.


Một chỉ số con liên quan đến các mảng. Nghĩa là, các phần tử ở cùng một vị trí trong mỗi mảng là
liên quan về mặt logic.
Trang 21

Hình 6-10 cho thấy một chương trình khai báo các mảng song song. Các VALID_PRICES mảng được tô;
mỗi phần tử trong đó tương ứng với một số mục hợp lệ.

khởi đầu chuẩn bị()

Tuyên bố đầu ra "Nhập mục


num item số hoặc ", HOÀN TẤT,
giá num "bỏ"
num SIZE = 6
num VALID_ITEMS [SIZE] = 106, 108, 307,
405, 457, 688 mục đầu vào
num VALID_PRICES [SIZE] = 0,59, 0,99,
4,50, 15,99, 17,50, 39,00
num phụ trở về
string foundIt
num badItemCount = 0
string MSG_YES = "Hàng có sẵn"
string MSG_NO = "Không tìm thấy mục"
num FINISH = 999

chuẩn bị()

Đúng
mục <>
findItem ()
HOÀN THÀNH? kết thúc()

Không
xuất badItemCount,
kết thúc() "các mục không hợp lệ
số "

dừng lại
trở về

Hình 6-10 Lưu đồ và mã giả của chương trình tìm giá mặt hàng bằng cách sử dụng
mảng song song (tiếp tục)
Trang 22

(còn tiếp)

findItem ()

foundIt = "N"

248

phụ = 0

phụ < Đúng


KÍCH THƯỚC?

Không

Không item = Đúng


Không đã tìm thấy nó Đúng VALID_ITEMS [phụ]?
= "Y"?

foundIt = "Y"
đầu ra đầu ra
MSG_NO MSG_YES

giá cả =
VALID_PRICES [phụ]

badItemCount = đầu ra "The


badItemCount + 1 giá của ", mặt hàng,
"là", giá

sub = sub + 1

đầu ra "Nhập mục tiếp theo


số hoặc ", HOÀN TẤT,
"bỏ"

mục đầu vào

trở về

Hình 6-10 Lưu đồ và mã giả của chương trình tìm giá mặt hàng bằng cách sử dụng
mảng song song (tiếp tục)
Trang 23

(còn tiếp)

khởi đầu
Tuyên bố
num item
giá num
num SIZE = 6
num VALID_ITEMS [SIZE] = 106, 108, 307,
405, 457, 688
num VALID_PRICES [SIZE] = 0,59, 0,99,
4,50, 15,99, 17,50, 39,00
num phụ
string foundIt
num badItemCount = 0
string MSG_YES = "Hàng có sẵn"
string MSG_NO = "Không tìm thấy mục"
num FINISH = 999
chuẩn bị()
trong khi mục <> FINISH
findItem ()
cuối cùng
kết thúc()
dừng lại

chuẩn bị()
đầu ra "Nhập số mục hoặc", FINISH, "để thoát"
mục đầu vào
trở về

findItem ()
foundIt = "N"
phụ = 0
trong khi phụ <SIZE
nếu item = VALID_ITEMS [sub] thì
foundIt = "Y"
giá = VALID_PRICES [phụ]
endif
sub = sub + 1
cuối cùng
if foundIt = "Y" then
xuất ra MSG_YES
đầu ra "Giá của", mặt hàng, "là", giá
khác
đầu ra MSG_NO
badItemCount = badItemCount + 1
endif
đầu ra "Nhập số mục tiếp theo hoặc", FINISH, "để thoát"
mục đầu vào
trở về

kết thúc()
xuất badItemCount, "các mục có số không hợp lệ"
trở về

Hình 6-10 Lưu đồ và mã giả của chương trình tìm giá mặt hàng bằng cách sử dụng các mảng song song
© 2015 Cengage Learning
Trang 24

Một số lập trình viên phản đối việc sử dụng một tên biến khó hiểu cho một chỉ số con, chẳng hạn như sub trong Hình 6-10,
bởi vì những cái tên như vậy không mang tính mô tả. Những lập trình viên này thích một cái tên như priceIndex.
Những người khác chấp thuận tên ngắn khi biến chỉ được sử dụng trong một khu vực giới hạn của chương trình, vì nó được sử dụng
ở đây, để bước qua một mảng. Các lập trình viên không đồng ý về nhiều vấn đề phong cách như vấn đề này. Là một lập trình viên,
trách nhiệm của bạn là tìm ra những quy ước được sử dụng giữa các đồng nghiệp của bạn trong một tổ chức.
Khi chương trình trong Hình 6-10 nhận được đơn đặt hàng của khách hàng, nó sẽ xem xét từng
VALID_ITEMS các giá trị riêng biệt bằng cách thay đổi chỉ số phụ từ 0 thành số mục
có sẵn. Khi tìm thấy kết quả khớp với số hạng mục, chương trình sẽ kéo số
giá song song ra khỏi danh sách các giá trị VALID_PRICES và lưu giá trị đó trong biến giá . (Xem
các câu lệnh tô bóng trong Hình 6-10.)
Mối quan hệ giữa số lượng một mặt hàng và giá của nó là mối quan hệ gián tiếp . Cái đó
có nghĩa là bạn không truy cập trực tiếp vào giá bằng cách biết số mặt hàng. Thay vào đó, bạn xác định
giá bằng cách biết vị trí mảng của số mục. Khi bạn tìm thấy kết quả phù hợp với đơn hàng đã đặt
số mặt hàng trong mảng VALID_ITEMS , bạn biết rằng giá của mặt hàng là như nhau
vị trí trong mảng khác, VALID_PRICES . Khi VALID_ITEMS [phụ] là mục chính xác,
VALID_PRICES [phụ] phải là giá chính xác, vì vậy phụ liên kết các mảng song song.
Mảng song song hữu ích nhất khi các cặp giá trị có mối quan hệ gián tiếp. Nếu các giá trị trong
chương trình có mối quan hệ trực tiếp, bạn có thể không cần các mảng song song. Ví dụ, nếu
các mục được đánh số 0, 1, 2, 3, v.v. liên tục, bạn có thể sử dụng số mục dưới dạng
chỉ số dưới cho mảng giá thay vì sử dụng một mảng song song để chứa số mặt hàng. Thậm chí nếu
các mục được đánh số 200, 201, 202, v.v. liên tiếp, bạn có thể trừ một hằng số
giá trị (200) từ mỗi và sử dụng nó như một chỉ số con thay vì sử dụng một mảng song song.
Giả sử rằng một khách hàng đặt mua mặt hàng 457. Hãy tự tìm hiểu logic để xem liệu bạn có đến
lên với giá chính xác cho mỗi mặt hàng, $ 17,50. Sau đó, giả sử rằng một khách hàng đặt hàng mặt hàng 458.
Đi qua logic và xem liệu thông báo Không tìm thấy mục thích hợp có được hiển thị hay không.

Cải thiện hiệu quả tìm kiếm


Chương trình đặt hàng qua thư trong Hình 6-10 vẫn hơi kém hiệu quả. Khi khách hàng đặt hàng
mục 106 hoặc 108, một kết quả phù hợp được tìm thấy ở lần đầu tiên hoặc lần thứ hai đi qua vòng lặp, và
tiếp tục tìm kiếm không cung cấp thêm lợi ích. Tuy nhiên, ngay cả sau khi một trận đấu được thực hiện,
chương trình trong Hình 6-10 tiếp tục tìm kiếm qua mảng mục cho đến khi con đạt đến
giá trị KÍCH THƯỚC . Một cách để dừng tìm kiếm khi mục đã được tìm thấy và tìm thấy Nó được đặt thành
"Y" là thay đổi câu hỏi kiểm soát vòng lặp. Thay vì chỉ tiếp tục vòng lặp while
số lượng so sánh không vượt quá chỉ số con mảng cao nhất được phép, bạn nên
tiếp tục vòng lặp trong khi mục đã tìm kiếm không được tìm thấy và số lượng so sánh có
không vượt quá mức tối đa. Rời khỏi vòng lặp ngay khi tìm thấy kết quả phù hợp sẽ cải thiện
hiệu quả của chương trình. Mảng càng lớn thì càng có lợi khi thoát khỏi tìm kiếm
lặp lại ngay sau khi bạn tìm thấy giá trị mong muốn.
Trang 25

Sử dụng Mảng song song

Hình 6-11 cho thấy phiên bản cải tiến của mô-đun findItem () với vòng lặp được thay đổi-
câu hỏi kiểm soát được tô bóng.

findItem ()

foundIt = "N" 251

phụ = 0

Đúng

sub <SIZE VÀ
foundIt = "N"?

Không
Không item = Đúng
VALID_ITEMS [phụ]?
Không đã tìm thấy nó Đúng
= "Y"?
foundIt = "Y"

đầu ra đầu ra
MSG_NO MSG_YES
giá cả =
VALID_PRICES [phụ]

badItemCount = đầu ra "The


badItemCount + 1 giá của ", mặt hàng,
"là", giá
sub = sub + 1

đầu ra "Nhập mục tiếp theo


số hoặc ", HOÀN TẤT,
"bỏ"

mục đầu vào

trở về

Hình 6-11 Lưu đồ và mã giả của mô-đun tìm giá mặt hàng và thoát khỏi vòng lặp như
ngay sau khi nó được tìm thấy (tiếp tục)
Trang 26

(còn tiếp)

findItem ()
foundIt = "N"
phụ = 0
trong khi sub <SIZE AND foundIt = "N"
nếu item = VALID_ITEMS [sub] thì
foundIt = "Y"
giá = VALID_PRICES [phụ]
endif
sub = sub + 1
cuối cùng
if foundIt = "Y" then
xuất ra MSG_YES
đầu ra "Giá của", mặt hàng, "là", giá
khác
đầu ra MSG_NO
badItemCount = badItemCount + 1
endif
đầu ra "Nhập số mục tiếp theo hoặc", FINISH, "để thoát"
mục đầu vào
trở về

Hình 6-11 Lưu đồ và mã giả của mô-đun tìm giá mặt hàng và thoát khỏi vòng lặp như
ngay sau khi nó được tìm thấy
© 2015 Cengage Learning

Lưu ý rằng chương trình tìm giá mang lại hiệu quả cao nhất khi thường xuyên nhất
các mục có thứ tự được lưu trữ ở đầu mảng, do đó chỉ những mục hiếm khi được sắp xếp
yêu cầu nhiều vòng lặp trước khi tìm thấy một kết quả phù hợp. Thông thường, bạn có thể cải thiện hiệu quả tìm kiếm bằng cách
sắp xếp lại các phần tử của mảng.

Khi bạn học lập trình, bạn sẽ học các kỹ thuật tìm kiếm khác. Ví dụ: một tìm kiếm nhị phân bắt đầu
nhìn vào giữa danh sách đã sắp xếp, sau đó xác định xem nó nên tiếp tục cao hơn hay thấp hơn.

Xem video Sử dụng Mảng song song.


Trang 27

Tìm kiếm một mảng cho một kết hợp phạm vi

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng Mảng song song

1. Các mảng song song phải cùng kiểu dữ liệu.

2. Mảng song song thường chứa cùng một số phần tử.


3. Bạn có thể cải thiện hiệu quả của việc tìm kiếm thông qua các mảng song song bằng cách sử dụng
xuất cảnh sớm.

Tìm kiếm một mảng cho một kết hợp phạm vi


Số mặt hàng đặt hàng của khách hàng cần khớp chính xác với số mặt hàng có sẵn để xác định
giá chính xác của một mặt hàng. Tuy nhiên, đôi khi, các lập trình viên muốn làm việc với phạm vi
giá trị trong mảng. Trong Chương 4, bạn đã biết rằng phạm vi giá trị là bất kỳ chuỗi giá trị nào — cho
ví dụ, 1 đến 5 hoặc 20 đến 30.
Giả sử rằng một công ty quyết định cung cấp số lượng
giảm giá khi một khách hàng đặt hàng nhiều Định lượng Giảm giá %

như trong Hình 6-12. 0–8 0

9–12 10
Bạn muốn có thể đọc theo đơn đặt hàng của khách hàng
dữ liệu và xác định tỷ lệ phần trăm chiết khấu dựa trên 13–25 15

về số lượng đặt hàng. Ví dụ, nếu một 26 trở lên 20


khách hàng đã đặt 20 mặt hàng, bạn muốn
có thể đầu ra Chiết khấu của bạn là 15 phần trăm. Một Hình 6-12 Giảm giá cho các đơn đặt hàng theo
cách tiếp cận không tốt có thể là thiết lập một mảng định lượng
với nhiều yếu tố như bất kỳ khách hàng nào có thể © 2015 Cengage Learning

bao giờ đặt hàng và lưu trữ mức chiết khấu thích hợp
cho mỗi số có thể, như thể hiện trong Hình 6-13. Mảng này được thiết lập để chứa
giảm giá cho 0 mặt hàng, 1 mặt hàng, 2 mặt hàng, v.v. Cách tiếp cận này có ít nhất ba nhược điểm:
Trang 28

Nó yêu cầu một mảng rất lớn sử dụng nhiều bộ nhớ.


Bạn phải lưu trữ cùng một giá trị lặp đi lặp lại. Ví dụ: mỗi phần tử trong số chín phần tử đầu tiên
nhận cùng một giá trị, 0 và mỗi phần tử trong số bốn phần tử tiếp theo nhận cùng một giá trị, 10.
Làm thế nào để bạn biết bạn có đủ phần tử mảng? Là số lượng đặt hàng của khách hàng là 75
các mặt hàng đủ? Điều gì sẽ xảy ra nếu một khách hàng đặt hàng 100 hoặc 1000 mặt hàng? Không quan trọng là bao nhiêu
các phần tử bạn đặt trong mảng, luôn có khả năng khách hàng sẽ đặt hàng nhiều hơn.
num DISCOUNTS [76]
= 0, 0, 0, 0, 0, 0, 0, 0, 0,
0,10, 0,10, 0,10, 0,10, Đừng làm điều đó
0,15, 0,15, 0,15, 0,15, 0,15, Mặc dù mảng này là
0,15, 0,15, 0,15, 0,15, 0,15, có thể sử dụng được, nó lặp đi lặp lại,
0,15, 0,15, 0,15, dễ bị lỗi, và
0,20, 0,20, 0,20, 0,20, 0,20, Khó sử dụng.
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20,
0,20, 0,20, 0,20, 0,20, 0,20

Hình 6-13 Mảng chiết khấu có thể sử dụng được - nhưng không hiệu quả
© 2015 Cengage Learning

Một cách tiếp cận tốt hơn là tạo ra hai


mảng song song, mỗi mảng có bốn num DISCOUNTS [4] = 0, 0,10, 0,15, 0,20
num QUAN_LIMITS [4] = 0, 9, 13, 26
như trong Hình 6-14.
Mỗi tỷ lệ chiết khấu được liệt kê một lần trong
Mảng DISCOUNTS và phần cuối của Hình 6-14 Mảng song song được sử dụng để xác định
mỗi phạm vi số lượng được liệt kê trong giảm giá
Mảng QUAN_LIMITS . © 2015 Cengage Learning

Để tìm mức chiết khấu chính xác cho bất kỳ


số lượng đặt hàng của khách hàng, bạn có thể bắt đầu với giới hạn phạm vi số lượng cuối cùng ( QUAN_LIMITS [3] ).
Nếu số lượng đặt hàng ít nhất là giá trị đó, 26, vòng lặp sẽ không bao giờ được nhập và khách hàng nhận được
tỷ lệ chiết khấu cao nhất ( DISCOUNTS [3] , hoặc 20 phần trăm). Nếu số lượng đặt hàng không ít nhất
QUAN_LIMITS [3] —đó là, nếu nó nhỏ hơn 26 — thì bạn giảm chỉ số phụ và kiểm tra xem có
số lượng ít nhất là QUAN_LIMITS [2] , hoặc 13. Nếu vậy, khách hàng nhận được KHOẢNG CÁCH [2] , hoặc 15
phần trăm, v.v. Hình 6-15 cho thấy một chương trình chấp nhận số lượng đặt hàng của khách hàng và
xác định tỷ lệ chiết khấu thích hợp.
Trang 29

khởi đầu dọn phòng ()

Tuyên bố đầu ra "Enter


số lượng num số lượng đặt hàng hoặc ",
255
num SIZE = 4 QUIT, "thoát"
num DISCOUNTS [4] = 0, 0,10, 0,15, 0,20
num QUAN_LIMITS [4] = 0, 9, 13, 26
num x số lượng đầu vào
num QUIT = -1
trở về

dọn phòng ()

Đúng
số lượng <>
xác địnhDiscount ()
QUIT?

Không

xác địnhDiscount ()
hoàn thành()

x = KÍCH THƯỚC - 1
dừng lại

số lượng < Đúng


hoàn thành()
QUAN_LIMITS [x]?

đầu ra "Hết
việc làm" Không x=x-1

đầu ra "Của bạn


trở về tỷ lệ chiết khấu là ",
KHAI BÁO [x]

đầu ra "Enter
số lượng đặt hàng
hoặc ", QUIT," thành
bỏ "

số lượng đầu vào

trở về

Hình 6-15 Chương trình xác định tỷ lệ chiết khấu (tiếp theo)
Trang 30

(còn tiếp)

khởi đầu
Tuyên bố
số lượng num
num SIZE = 4
num DISCOUNTS [4] = 0, 0,10, 0,15, 0,20
num QUAN_LIMITS [4] = 0, 9, 13, 26
num x
num QUIT = -1
dọn phòng ()
trong khi số lượng <> QUIT
xác địnhDiscount ()

cuối cùng
hoàn thành()
dừng lại

dọn phòng ()
đầu ra "Nhập số lượng đã đặt hàng hoặc", QUIT, "để thoát"
số lượng đầu vào
trở về

xác địnhDiscount ()
x = KÍCH THƯỚC - 1
trong khi số lượng <QUAN_LIMITS [x]
x=x-1
cuối cùng
đầu ra "Tỷ lệ chiết khấu của bạn là", DISCOUNTS [x]
đầu ra "Nhập số lượng đã đặt hàng hoặc", QUIT, "để thoát"
số lượng đầu vào
trở về

hoàn thành()
đầu ra "Kết thúc công việc"
trở về

Hình 6-15 Chương trình xác định tỷ lệ chiết khấu


© 2015 Cengage Learning

Một cách tiếp cận thay thế cho cách tiếp cận được đưa ra trong Hình 6-15 là lưu trữ giá trị cao nhất của mọi phạm vi
trong một mảng. Sau đó, bạn bắt đầu với phần tử thấp nhất và kiểm tra các giá trị nhỏ hơn hoặc bằng
mỗi giá trị phần tử mảng.

Khi sử dụng một mảng để lưu trữ các giới hạn phạm vi, bạn sử dụng một vòng lặp để thực hiện một loạt các so sánh
nếu không sẽ yêu cầu nhiều quyết định riêng biệt. Chương trình xác định khách hàng
tỷ lệ chiết khấu trong Hình 6-15 yêu cầu ít hướng dẫn hơn so với hướng dẫn không sử dụng mảng,
và các sửa đổi đối với chương trình sẽ dễ dàng thực hiện hơn trong tương lai.
Trang 31

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Tìm kiếm một mảng cho một kết hợp phạm vi

1. Để giúp xác định phạm vi trong đó giá trị rơi vào, bạn có thể lưu trữ giá trị cao nhất trong 257

mỗi phạm vi trong một mảng.

2. Để giúp xác định phạm vi trong đó giá trị rơi vào, bạn có thể lưu trữ giá trị thấp nhất trong
mỗi phạm vi trong một mảng.

3. Khi sử dụng một mảng để lưu trữ các giới hạn phạm vi, bạn sử dụng một loạt các phép so sánh

ế không sẽ yêu cầu


nếu ầ nhiều
ề cấu
ấ trúc vòng lặp riêng biệt.
Còn lại trong Array Bounds
Để đảm bảo rằng các chỉ số con hợp lệ được sử dụng với một mảng, bạn phải hiểu hai
các khái niệm:
Kích thước của mảng
Giới hạn của các đăng ký có thể sử dụng

Hiểu kích thước mảng


Mọi mảng đều có kích thước hữu hạn. Bạn có thể nghĩ về kích thước của mảng theo một trong hai cách — hoặc bằng cách
số phần tử trong mảng hoặc bằng số byte trong mảng. Mảng luôn
bao gồm các phần tử của cùng một kiểu dữ liệu và các phần tử của cùng một kiểu dữ liệu luôn luôn
chiếm cùng một số byte bộ nhớ, vì vậy số byte trong một mảng luôn là một
bội số của số phần tử trong một mảng. Ví dụ, trong Java, số nguyên chiếm 4 byte
bộ nhớ, do đó, một mảng 10 số nguyên chiếm đúng 40 byte.

Để thảo luận đầy đủ về byte và cách chúng đo bộ nhớ máy tính, hãy đọc Phụ lục A.

Hiểu giới hạn chỉ số phụ


Trong mọi ngôn ngữ lập trình, khi bạn truy cập dữ liệu được lưu trữ trong một mảng, bạn phải sử dụng
chỉ số con chứa một giá trị truy cập bộ nhớ bị chiếm bởi mảng. Nếu bạn làm như vậy, của bạn
chỉ số dưới là trong giới hạn ; nếu bạn không làm như vậy, chỉ số phụ của bạn nằm ngoài giới hạn .
Trang 32

Một chỉ số con truy cập một phần tử mảng bằng cách sử dụng số học. Tên mảng là địa chỉ bộ nhớ
và chỉ số con cho biết giá trị cần được nhân với kích thước kiểu dữ liệu để tính toán
địa chỉ phần tử của chỉ số. Ví dụ: giả sử rằng một mảng giá được lưu trữ trong bộ nhớ
vị trí 4000, như trong Hình 6-16, và giả sử rằng máy tính của bạn lưu trữ số
mỗi biến sử dụng bốn byte. Như hình cho thấy, phần tử 0 ở vị trí bộ nhớ 4000 + 0 * 4,
hoặc 4000, phần tử 1 ở vị trí bộ nhớ 4000 + 1 * 4 hoặc 4004 và phần tử 2 ở bộ nhớ
vị trí 4000 + 2 * 4 hoặc 4008. Nếu bạn sử dụng chỉ số phụ nằm ngoài giới hạn, chương trình của bạn sẽ
cố gắng truy cập một địa chỉ không phải là một phần của không gian của mảng.

Tờ khai
giá num [3] = 25,00, 36,50, 47,99
giá [1]
giá [0] giá cả [2]

Đừng làm điều đó


giá [3] điểm tới
25,00 36,50 47,99
địa chỉ 4012 (4000 + 3 * 4),
nằm ngoài giới hạn.

Địa chỉ bộ nhớ: 4000 4004 4008


(4000 + 0 * 4) (4000 + 1 * 4) (4000 + 2 * 4)

Hình 6-16 Một mảng và các địa chỉ bộ nhớ liên quan của nó
© 2015 Cengage Learning

Một lỗi phổ biến của các lập trình viên mới bắt đầu là quên rằng các chỉ số con của mảng bắt đầu bằng 0. Nếu bạn
giả sử rằng chỉ số con đầu tiên của một mảng là 1, bạn sẽ luôn "tắt từng cái" trong thao tác với mảng của mình.
Ví dụ: nếu bạn cố gắng thao tác một mảng 10 phần tử bằng cách sử dụng các chỉ số con từ 1 đến 10, bạn sẽ
phạm hai lỗi: Youwillfailtoaccessthefirst element that usessubscript0 andy you willattempt
để truy cập một phần tử bổ sung ở vị trí 10 khi chỉ số con có thể sử dụng cao nhất là 9.
Ví dụ, kiểm tra chương trình trong Hình 6-17. Chương trình chấp nhận một giá trị số cho
monthNum và hiển thị tên được liên kết với tháng đó. Logic trong Hình 6-17 tạo ra một
giả định có vấn đề: rằng mọi số do người dùng nhập đều là số tháng hợp lệ.
Trang 33 Còn lại trong Array Bounds

khởi đầu

Tuyên bố
num thángNum
string MONTHS [12] = "Tháng 1", "Tháng 2",
"Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7",
"Tháng 8", "Tháng 9", "Tháng 10",
"Tháng Mười Một tháng Mười Hai"

đầu vào khởi đầu

thángNum Tuyên bố
num thángNum
string MONTHS [12] = "Tháng 1", "Tháng 2",
"Tháng 3", "Tháng 4", "Tháng 5", "Tháng 6", "Tháng 7",
thángNum = "Tháng 8", "Tháng 9", "Tháng 10",
thángNum - 1
"Tháng Mười Một tháng Mười Hai"
đầu vào tháng
monthNum = monthNum - 1
đầu ra sản lượng MONTHS [thángNum]
MONTHS [thángNum] dừng lại

dừng lại
Đừng làm điều đó

Chỉ số dưới thángNum


có thể nằm ngoài giới hạn
cho mảng MONTHS.

Hình 6-17 Xác định chuỗi tháng từ mục nhập số của người dùng

Trong chương trình ở Hình 6-17, lưu ý rằng 1 bị trừ khỏi monthNum trước khi nó được sử dụng như một chỉ số con.
Mặc dù tháng 1 là tháng đầu tiên trong năm nhưng tên của nó vẫn chiếm vị trí trong mảng với số 0
chỉ số dưới. Với các giá trị có vẻ tự nhiên bắt đầu bằng 1, chẳng hạn như số tháng, một số lập trình viên sẽ
thích tạo một mảng 13 phần tử và đơn giản là không bao giờ sử dụng phần tử có vị trí số 0. Bằng cách đó, mỗi "tự nhiên"
số tháng sẽ là giá trị chính xác để truy cập dữ liệu của nó mà không cần trừ đi. Các lập trình viên khác không thích
lãng phí bộ nhớ bằng cách tạo thêm một phần tử mảng không sử dụng. Mặc dù các chương trình khả thi có thể được tạo
có hoặc không có phần tử mảng bổ sung, các lập trình viên chuyên nghiệp nên tuân theo các quy ước và
sở thích của đồng nghiệp và người quản lý của họ.

Trong Hình 6-17, nếu người dùng nhập một số quá nhỏ hoặc quá lớn, một trong hai điều sẽ
xảy ra tùy thuộc vào ngôn ngữ lập trình bạn sử dụng. Khi bạn sử dụng giá trị chỉ số dưới
âm hoặc cao hơn chỉ số phụ cao nhất được phép:

Một số ngôn ngữ lập trình sẽ ngừng thực thi chương trình và gây ra lỗi
thông điệp.

Các ngôn ngữ lập trình khác sẽ không đưa ra thông báo lỗi nhưng sẽ truy cập một giá trị trong
vị trí bộ nhớ nằm ngoài vùng chiếm bởi mảng. Khu vực đó có thể chứa
rác, hoặc tệ hơn, nó vô tình có thể chứa tên của một tháng không chính xác.
Trang 34

Dù bằng cách nào, một lỗi logic xảy ra. Người dùng nhập dữ liệu không chính xác thường xuyên; một chương trình tốt
nên có thể xử lý lỗi và không cho phép chỉ số phụ nằm ngoài giới hạn.

Người dùng có thể nhập một số không hợp lệ hoặc có thể không nhập một số nào cả. Trong Chương 5, bạn đã học được rằng nhiều
ngôn ngữ có một phương thức tích hợp với tên như isNumeric () có thể kiểm tra những lỗi như vậy.

Bạn có thể cải thiện chương trình trong Hình 6-17 bằng cách thêm một bài kiểm tra đảm bảo chỉ số con được sử dụng
để truy cập vào mảng nằm trong giới hạn của mảng. Nếu bạn thấy rằng giá trị đầu vào không nằm trong khoảng 1
và 12 bao gồm, bạn có thể thực hiện một trong các cách tiếp cận sau:

Hiển thị thông báo lỗi và kết thúc chương trình.


Sử dụng giá trị mặc định cho tháng. Ví dụ: khi một tháng đã nhập không hợp lệ, bạn
có thể muốn giả định rằng đó là tháng mười hai.
Liên tục nhắc nhở người dùng về một giá trị mới cho đến khi nó hợp lệ.
Cách bạn xử lý một tháng không hợp lệ tùy thuộc vào các yêu cầu của chương trình của bạn như
chính sách của người dùng, người giám sát hoặc công ty của bạn.

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Còn lại trong Array Bounds

1. Các phần tử trong một mảng thường là các kiểu dữ liệu khác nhau, vì vậy việc tính toán số lượng
bộ nhớ mà mảng chiếm là khó.

2. Nếu bạn cố gắng truy cập một mảng có chỉ số con quá nhỏ, một số
ngôn ngữ lập trình sẽ ngừng thực thi chương trình và gây ra lỗi
thông điệp.

3. Nếu bạn cố gắng truy cập một mảng có chỉ số con quá lớn, một số
ngôn ngữ lập trình truy cập vị trí bộ nhớ không chính xác bên ngoài mảng
giới hạn.
Trang 35

Sử dụng vòng lặp for để xử lý một mảng


Trong Chương 5, bạn đã học về vòng lặp for — vòng lặp mà trong một câu lệnh đơn lẻ, khởi tạo một
biến điều khiển vòng lặp, so sánh nó với một giới hạn và thay đổi nó. Các cho vòng lặp là một đặc biệt
công cụ thuận tiện khi làm việc với mảng vì bạn thường xuyên phải xử lý mọi
phần tử của một mảng từ đầu đến cuối. Như với một trong khi vòng lặp, khi bạn sử dụng cho vòng lặp,
bạn phải cẩn thận để ở trong giới hạn của mảng, hãy nhớ rằng mảng có thể sử dụng cao nhất
chỉ số dưới nhỏ hơn một so với kích thước của mảng. Hình 6-18 cho thấy một vòng lặp for đúng
hiển thị tất cả các tên bộ phận của công ty được lưu trữ trong một mảng được khai báo là DEPTS .
Lưu ý rằng dep được tăng dần qua một ít hơn số phòng ban vì
với mảng năm mục, các chỉ số con bạn có thể sử dụng là 0 đến 4.

khởi đầu
Tuyên bố
num dep
num SIZE = 5
string DEPTS [SIZE] = "Kế toán", "Nhân sự",
"Kỹ thuật", "Dịch vụ khách hàng", "Tiếp thị"
for dep = 0 to SIZE - 1 step 1
đầu ra DEPTS [dep]
endfor
dừng lại

Hình 6-18 Mã giả sử dụng vòng lặp for để hiển thị một mảng tên bộ phận
© 2015 Cengage Learning

Vòng lặp trong Hình 6-18 hơi kém hiệu quả bởi vì nó thực hiện năm lần,
phép toán trừ trừ 1 từ SIZE xảy ra mỗi lần. Năm phép trừ
các hoạt động không tiêu tốn nhiều năng lượng hoặc thời gian của máy tính, nhưng trong một vòng lặp xử lý
hàng nghìn hoặc hàng triệu phần tử mảng, hiệu quả của chương trình sẽ bị ảnh hưởng.
Hình 6-19 cho thấy một giải pháp ưu việt. Một hằng số mới được gọi là ARRAY_LIMIT được tính toán
một lần, sau đó được sử dụng nhiều lần trong thao tác so sánh để xác định thời điểm dừng
đạp xe qua mảng.

khởi đầu
Tuyên bố
num dep
num SIZE = 5
num ARRAY_LIMIT = SIZE - 1
string DEPTS [SIZE] = "Kế toán", "Nhân sự",
"Kỹ thuật", "Dịch vụ khách hàng", "Tiếp thị"
cho dep = 0 đến ARRAY_LIMIT bước 1
đầu ra DEPTS [dep]
endfor
dừng lại

Hình 6-19 Mã giả sử dụng vòng lặp for hiệu quả hơn để xuất tên phòng ban
© 2015 Cengage Learning
Trang 36

HAI SỰ THẬT & MỘT LỜI NÓI DỐI


Sử dụng vòng lặp for để xử lý một mảng

1. Vòng lặp for là một công cụ đặc biệt tiện lợi khi làm việc với mảng vì
khởi tạo, kiểm tra và thay đổi biến điều khiển vòng lặp được mã hóa cùng nhau.

2. Bạn thường xuyên cần xử lý mọi phần tử của mảng từ đầu đến cuối
theo kiểu tuyến tính.

3. Một lợi thế khi sử dụng vòng lặp for để xử lý các phần tử mảng là bạn không cần
quan tâm đến giới hạn mảng.

Tóm tắt chương


Mảng là một chuỗi hoặc danh sách các giá trị được đặt tên trong bộ nhớ máy tính, tất cả đều có
cùng một kiểu dữ liệu nhưng được phân biệt bằng các chỉ số dưới. Mỗi phần tử mảng chiếm một khu vực
trong bộ nhớ bên cạnh hoặc tiếp giáp với những người khác.
Bạn thường có thể sử dụng một biến làm chỉ số con cho một mảng, điều này cho phép bạn thay thế
nhiều quyết định lồng nhau với ít câu lệnh hơn.
Hằng số có thể được sử dụng để giữ kích thước của một mảng, để biểu thị các giá trị của nó hoặc dưới dạng các chỉ số con.
Sử dụng các hằng số được đặt tên có thể làm cho các chương trình dễ hiểu và dễ bảo trì hơn.
Tìm kiếm thông qua một mảng để tìm một giá trị bạn cần bao gồm việc khởi tạo một chỉ số con, sử dụng
một vòng lặp để kiểm tra từng phần tử mảng và đặt cờ khi tìm thấy kết quả phù hợp.
Với mảng song song, mỗi phần tử trong một mảng được liên kết với phần tử trong cùng
vị trí tương đối trong mảng khác.
Khi bạn cần so sánh một giá trị với một phạm vi giá trị trong một mảng, bạn có thể lưu trữ
giá trị thấp hoặc cao cấp của mỗi phạm vi để so sánh.
Khi bạn truy cập dữ liệu được lưu trữ trong một mảng, điều quan trọng là sử dụng một chỉ số con có chứa
giá trị truy cập bộ nhớ trong giới hạn mảng.
Các cho vòng lặp là một công cụ đặc biệt thuận tiện khi xử lý mọi phần tử của một mảng
một cách tuần tự.
Trang 37

Điều khoản quan trọng


Một mảng là một loạt hoặc danh sách các giá trị trong bộ nhớ máy tính, tất cả đều có cùng tên
nhưng được phân biệt với các số đặc biệt được gọi là chỉ số dưới.

Một phần tử là một mục dữ liệu duy nhất trong một mảng.

Các kích thước của mảng là số phần tử nó có thể giữ.

Một subscript , còn gọi là một chỉ số , là một con số cho biết vị trí của một mặt hàng cụ thể
trong một mảng.
Điền mảng là hành động gán giá trị cho các phần tử của mảng.

Một tìm kiếm tuyến tính là một tìm kiếm thông qua một danh sách từ đầu này đến người kia.

Một lá cờ là một biến cho biết một số sự kiện đã xảy ra.

Trong mảng song song , mỗi phần tử trong một mảng được liên kết với phần tử trong cùng một
vị trí tương đối trong (các) mảng khác.
Một mối quan hệ gián tiếp mô tả mối quan hệ giữa các mảng song song trong đó
một phần tử trong mảng đầu tiên không truy cập trực tiếp vào giá trị tương ứng của nó trong
mảng thứ hai.

Một tìm kiếm nhị phân là một trong đó bắt đầu ở giữa của một danh sách được sắp xếp, và sau đó sẽ xác định xem
nó sẽ tiếp tục cao hơn hoặc thấp hơn để tìm giá trị mục tiêu.

Trong giới hạn mô tả một chỉ số con mảng nằm trong phạm vi của các chỉ số con được chấp nhận cho
mảng của nó.

Nằm ngoài giới hạn mô tả một chỉ số con của mảng không nằm trong phạm vi chấp nhận được
subcripts cho mảng của nó.
Bài tập

Câu hỏi đánh giá

1. Chỉ số con là a (n) .


a. phần tử trong một mảng
b. tên thay thế cho một mảng
c. số đại diện cho giá trị cao nhất được lưu trữ trong một mảng
d. số cho biết vị trí của một phần tử mảng

Trang 38

CHƯƠNG 6 Mảng

2. Mỗi phần tử trong một mảng phải có cùng như những người khác.
a. loại dữ liệu
b. chỉ số dưới
c. giá trị
264
d. vị trí bộ nhớ

3. Giả sử rằng bạn đã khai báo một mảng số được đặt tên là các giá trị có
13 yếu tố. Điều nào sau đây phải đúng?
a. giá trị [0] nhỏ hơn giá trị [1]
b. giá trị [2] được lưu trữ liền kề với giá trị [4]
c. giá trị [13] nằm ngoài giới hạn
d. giá trị [12] là giá trị lớn nhất trong mảng

4. Các chỉ số con của bất kỳ mảng nào luôn là .

a. số nguyên c. nhân vật

https://translate.googleusercontent.com/translate_f 37/47
9/7/2021 Lưu trữ dữ liệu trong mảng
b. phân số d. chuỗi ký tự

5. Giả sử rằng bạn đã khai báo một mảng số có tên là các số và hai trong số
phần tử là số [1] và số [4] . Bạn có biết rằng .
a. hai yếu tố giữ cùng một giá trị
b. mảng chứa đúng bốn phần tử
c. có chính xác hai phần tử giữa hai phần tử đó
d. hai phần tử ở cùng một vị trí bộ nhớ

6. Giả sử rằng bạn đã khai báo một mảng số có tên là các số và hai trong số
phần tử là số [1] và số [4] . Bạn có biết rằng .
a. số [4] lớn hơn số [1]
b. mảng có ít nhất năm phần tử
c. mảng đã được khởi tạo
d. hai phần tử cách nhau ba byte trong bộ nhớ

7. Giả sử rằng bạn muốn viết một chương trình nhập dữ liệu khách hàng và hiển thị
tóm tắt về số lượng khách hàng nợ hơn 1000 đô la mỗi người, trong mỗi
12 khu vực bán hàng. Biến dữ liệu khách hàng bao gồm tên , mã bưu điện , balanceDue , và
regionNumber .
Tại một số thời điểm trong quá trình xử lý hồ sơ, bạn sẽ thêm 1 vào
phần tử mảng có chỉ số con sẽ được đại diện bởi .
a. Tên c. số dư
b. Mã Bưu Chính d. regionNumber

Trang 39

Bài tập

8. Một chương trình chứa một mảng bảy phần tử chứa tên của các ngày
tuần. Khi bắt đầu chương trình, bạn hiển thị tên ngày bằng cách sử dụng một chỉ số phụ
được đặt tên là dayNum . Bạn hiển thị lại các giá trị mảng tương tự ở cuối chương trình,
bạn ở đâu như một chỉ số con cho mảng.

a. phải sử dụng dayNum 265


b. có thể sử dụng dayNum , nhưng cũng có thể sử dụng một biến khác
c. không được sử dụng dayNum
d. phải sử dụng một hằng số thay vì một biến

9. Giả sử rằng bạn đã khai báo một mảng như sau: các giá trị num [4] = 0, 0, 0, 0 .
Hoạt động nào sau đây là hoạt động được phép?
a. giá trị [2] = 17 c. giá trị [3] = giá trị [0] + 10
b. giá trị đầu vào [0] d. tất cả những điều trên

10. Giả sử rằng bạn đã khai báo một mảng như sau: các giá trị num [4] = 0, 0, 0, 0 .
Hoạt động nào sau đây là hoạt động được phép?
a. giá trị [4] = 80
https://translate.googleusercontent.com/translate_f 38/47
9/7/2021 Lưu trữ dữ liệu trong mảng

b. giá trị [2] = giá trị [4] - giá trị [0]


c. giá trị đầu ra [3]
d. tất cả những điều trên

11. Điền vào một mảng với các giá trị trong quá trình thực thi chương trình được gọi là
mảng.
a. thi hành c. dân cư
b. thuộc địa hóa d. khai báo

12. A là một biến có thể được đặt để cho biết liệu một số sự kiện có
xảy ra.
a. chỉ số dưới c. quầy tính tiền
b. Ảnh bìa d. cờ

13. Bạn gọi hai mảng trong đó mỗi phần tử trong một mảng được liên kết với
phần tử ở cùng một vị trí tương đối trong mảng kia?
a. mảng gắn kết c. mảng ẩn
b. mảng song song d. mảng vuông góc

14. Trong hầu hết các ngôn ngữ lập trình hiện đại, chỉ số con cao nhất bạn nên sử dụng
với mảng 12 phần tử là .
a. 10 c. 12
b. 11 d. 13

Trang 40

CHƯƠNG 6 Mảng

15. Mảng song song .


a. thường xuyên có một mối quan hệ gián tiếp
b. không bao giờ có một mối quan hệ gián tiếp
c. phải cùng một kiểu dữ liệu
266 d. không được cùng kiểu dữ liệu

16. Mỗi phần tử trong một mảng bảy phần tử có thể chứa (các) giá trị.
a. một c. ít nhất bảy
b. bảy d. số lượng không giới hạn

17. Sau cuộc triển lãm chó hàng năm mà Học viện huấn luyện chó Barkley trao giải
điểm cho mỗi người tham gia, học viện chỉ định trạng thái cho mỗi con chó dựa trên
tiêu chí trong Bảng 6-1.

Số điểm đã kiếm được Mức độ thành tích

0–5 Tốt

6–7 Thông minh

https://translate.googleusercontent.com/translate_f 39/47
9/7/2021 Lưu trữ dữ liệu trong mảng

8–9 Cấp trên

10 Không thể tin được

Bảng 6-1 Mức độ thành tích của Học viện huấn luyện chó Barkley

Học viện cần một chương trình so sánh điểm của một con chó kiếm được với
thang điểm phân loại, để mỗi con chó có thể nhận được chứng chỉ xác nhận
mức độ phù hợp của thành tích. Trong số những điều sau đây, bộ giá trị nào sẽ là
hữu ích nhất cho nội dung của một mảng được sử dụng trong chương trình?
a. 0, 6, 9, 10 c. 5, 7, 9, 10
b. 5, 7, 8, 10 d. bất kỳ ở trên

18. Khi bạn sử dụng giá trị chỉ số dưới âm hoặc cao hơn số
các phần tử trong một mảng, .
a. việc thực thi chương trình dừng lại và một thông báo lỗi được đưa ra
b. một giá trị ở vị trí bộ nhớ nằm ngoài vùng bị chiếm bởi mảng sẽ
được truy cập
c. một giá trị ở vị trí bộ nhớ nằm ngoài vùng bị chiếm bởi mảng sẽ
được truy cập, nhưng chỉ khi giá trị là kiểu dữ liệu chính xác
d. hành động kết quả phụ thuộc vào ngôn ngữ lập trình được sử dụng

Trang 41

Bài tập

19. Trong mọi mảng, một chỉ số con nằm ngoài giới hạn khi nó .

a. tiêu cực c. 1
b. 0 d. 999

20. Bạn có thể truy cập mọi phần tử của mảng bằng cách sử dụng .
267

a. trong khi vòng lặp c. cả hai ở trên


b. vòng lặp for d. không có cái nào ở trên

Bài tập lập trình

1. a. Thiết kế logic cho một chương trình cho phép người dùng nhập 12 số, sau đó
hiển thị chúng theo thứ tự ngược lại của mục nhập.

b. Sửa đổi chương trình hiển thị ngược để người dùng có thể nhập bất kỳ số lượng
các số lên đến 12 cho đến khi nhập một giá trị sentinel.

2. a. Thiết kế logic cho một chương trình cho phép người dùng nhập 12 số, sau đó
hiển thị từng số và sự khác biệt của nó với số trung bình của
số đã nhập.

https://translate.googleusercontent.com/translate_f 40/47
9/7/2021 Lưu trữ dữ liệu trong mảng
b. Sửa đổi chương trình trong Bài tập 2a để người dùng có thể nhập bất kỳ giá trị nào
các số lên đến 12 cho đến khi nhập một giá trị sentinel.

3. a. Thiết kế logic cho một chương trình cho phép người dùng nhập 12 số, sau đó
hiển thị tất cả các số, số lớn nhất và số nhỏ nhất.
b. Sửa đổi chương trình trong Bài tập 3a để người dùng có thể nhập bất kỳ giá trị nào
các số lên đến 12 cho đến khi nhập một giá trị sentinel.

4. a. Những người làm công tác đăng ký tại hội nghị dành cho các tác giả của sách thiếu nhi đã
dữ liệu thu thập về những người tham gia hội nghị, bao gồm cả số lượng sách
mỗi tác giả đã viết và độ tuổi độc giả mục tiêu của họ. Những người tham gia có
được viết từ 1 đến 40 cuốn mỗi cuốn và độ tuổi của độc giả nhắm mục tiêu là từ 0 đến 16.
Thiết kế một chương trình liên tục chấp nhận tên tác giả, số lượng sách
đã viết, và tuổi của người đọc mục tiêu cho đến khi nhập giá trị sentinel. Sau đó, hiển thị danh sách
Có bao nhiêu người tham gia đã viết mỗi số sách (từ 1 đến 40).
b. Sửa đổi chương trình đăng ký tác giả để đầu ra là danh sách bao nhiêu
những người tham gia đã viết từ 1 đến 5 cuốn sách, 6 đến 12 cuốn sách và 13 cuốn sách trở lên.
c. Sửa đổi chương trình đăng ký tác giả để đầu ra là số
số lượng sách được viết cho từng nhóm tuổi sau: dưới 3 tuổi, từ 3 đến
7, 8 đến 10, 11 đến 13 và 14 tuổi trở lên.

Trang 42

CHƯƠNG 6 Mảng

5. a. Downdog Yoga Studio cung cấp năm Số lớp Tên lớp


các loại lớp, như thể hiện trong Bảng 6-2.
1 Yoga 1
Thiết kế một chương trình chấp nhận một
2 Yoga 2
số đại diện cho một lớp và sau đó
hiển thị tên của lớp. 3 Yoga cho trẻ em
268 4 Yoga trước khi sinh
b. Sửa đổi Downdog Yoga Studio
5 Yoga cao cấp
chương trình đó yêu cầu lớp số
có thể được nhập liên tục cho đến khi Bảng 6-2 Các lớp học tại Downdog Yoga Studio
giá trị sentinel được nhập. Sau đó hiển thị
mỗi số lớp, tên và số lượng
số lượng yêu cầu cho mỗi lớp.

6. a. Trường Tiểu Học Watson có 30 phòng học được đánh số từ 1 đến 30.
Mỗi lớp học có thể chứa bất kỳ số lượng học sinh nào lên đến 35. Mỗi học sinh
làm bài kiểm tra thành tích vào cuối năm học và nhận điểm
từ 0 đến 100. Viết chương trình chấp nhận dữ liệu cho mỗi học sinh trong
trường học — mã số học sinh, số lớp học, và điểm trong bài kiểm tra thành tích.
Thiết kế một chương trình liệt kê tổng số điểm ghi được cho mỗi trong số 30 lớp học.
b. Sửa đổi chương trình Trường Tiểu học Watson sao cho điểm trung bình của bài kiểm tra
điểm số là kết quả đầu ra cho mỗi lớp học, chứ không phải là tổng điểm cho mỗi lớp học.

https://translate.googleusercontent.com/translate_f 41/47
9/7/2021 Lưu trữ dữ liệu trong mảng
7. Quán cà phê Jumpin 'Jive Sản phẩm Giá ($)
tính phí $ 2,00 cho một cốc
cà phê và cung cấp các phần bổ trợ Kem đánh 0,89
được thể hiện trong Bảng 6-3. Quế 0,25

Thiết kế logic cho một Nước sốt sô cô la 0,59


ứng dụng cho phép người dùng Amaretto 1,50
nhập phần bổ trợ có thứ tự conti- Rượu whisky Ailen 1,75
sắc thái cho đến khi giá trị sentinel là
đã nhập. Sau mỗi mục, hiển thị Bảng 6-3 Danh sách bổ trợ cho quán cà phê Jumpin 'Jive

giá của nó hoặc tin nhắn Xin lỗi,


chúng tôi không mang điều đó làm đầu ra.
Phòng ban Phòng ban
Sau khi tất cả các mục đã được nhập,
Con số Tên
hiển thị tổng giá cho đơn đặt hàng.
8. Thiết kế logic ứng dụng cho một 1 Nhân viên

công ty muốn có báo cáo 2 Tiếp thị

khắc phục sự cố về biên chế bằng cách 3 Chế tạo


Phòng ban. Đầu vào bao gồm từng 4 Dịch vụ máy tính
số phòng ban của nhân viên, 5 Bán hàng
lương theo giờ và số giờ 6 Kế toán
đã làm việc. Đầu ra là danh sách các 7 Đang chuyển hàng
bảy phòng ban trong công ty
và tổng biên chế (tỷ lệ Bảng 6-4 Số và tên bộ phận

Trang 43

Bài tập

giờ) cho mỗi


Tổng hàng tuần Khấu trừ
Phòng ban. Bộ phận
Thanh toán ($) Phần trăm (%)
tên được thể hiện trong Bảng 6-4.
0,00–300,00 10
9. Thiết kế một chương trình mà
300,01–550,00 13
putes trả cho nhân viên. 269
550,01–800,00 16
Cho phép người dùng liên tục
800.01 trở lên 20
nhập tên của nhân viên cho đến khi
một giá trị lính gác thích hợp
Bảng 6-5 Tỷ lệ khấu lưu dựa trên tổng lương
được nhập. Cũng nhập từng
lương theo giờ của nhân viên và
số giờ làm việc. Tính tổng lương của mỗi nhân viên (tỷ lệ giờ), khấu trừ
tỷ lệ phần trăm thuế (dựa trên Bảng 6-5), số thuế khấu trừ, và khoản thanh toán ròng
(tổng lương trừ thuế khấu trừ). Hiển thị tất cả các kết quả cho từng nhân viên.
Sau khi nhân viên cuối cùng được nhập, hiển thị tổng số giờ
đã làm việc, tổng tiền lương, tổng khấu lưu cho tất cả nhân viên và
tổng biên chế ròng.
Giá mỗi
10. Thực hiện các chuyến tham quan khắp đất nước
Mã Nơi Đến Người ($)
các chuyến đi tham quan cho các nhóm từ nó
cơ sở nhà ở Iowa. Tạo ra một 1 Chicago 300,00
ứng dụng liên tục 2 Boston 480,00
chấp nhận dữ liệu chuyến tham quan, bao gồm3 Miami 1050,00

https://translate.googleusercontent.com/translate_f 42/47
9/7/2021 Lưu trữ dữ liệu trong mảng
số
số du lịchngày
tháng, ba chữ
và số;
nămcác
4 San Francisco 1300,00

giá trị đại diện cho chuyến tham quan bắt đầu Bảng 6-6 Mã và giá các chuyến tham quan trên toàn quốc
ngày; số lượng khách du lịch tham gia
chuyến du lịch; và một mã số
đại diện cho điểm đến. Như dữ liệu là Giảm giá mỗi
đã nhập cho mỗi chuyến tham quan, hãy xác minh rằng Số lượng khách du lịch Khách du lịch ($)
tháng, ngày, năm và mã đích
có giá trị; nếu bất kỳ điều nào trong số này không hợp 1–5lệ, con- 0

tin tưởng để nhắc người dùng cho đến khi dữ liệu hợp lệ6–12 75

đã nhập. Mã đích hợp lệ là 13–20 125

được thể hiện trong Bảng 6-6. 21–50 200


51 trở lên 300
Thiết kế logic cho một ứng dụng
xuất ra từng số chuyến tham quan, đã được xác thựcBảng 6-7 Giảm giá các chuyến tham quan khắp đất nước
ngày bắt đầu, mã điểm đến, điểm đến
tên, số lượng khách du lịch, tổng cộng
giá cho chuyến tham quan, và giá cho chuyến du lịch sau khi giảm giá. Tổng giá gộp là
giá tour trên mỗi khách nhân với số lượng khách. Giá cuối cùng bao gồm một
giảm giá cho mỗi người trong các nhóm du lịch lớn hơn, dựa trên Bảng 6-7.

Trang 44

CHƯƠNG 6 Mảng

11. a. Tạp chí Cuộc sống Hàng ngày muốn có một phân tích về các đặc điểm nhân khẩu học của
độc giả. Bộ phận tiếp thị đã thu thập hồ sơ khảo sát độc giả
chứa tuổi, giới tính, tình trạng hôn nhân và thu nhập hàng năm của độc giả.
Thiết kế một ứng dụng cho phép người dùng nhập dữ liệu người đọc và khi dữ liệu
mục nhập đã hoàn tất, tạo ra số lượng độc giả theo các nhóm tuổi như sau: dưới
270 20, 20–29, 30–39, 40–49 và 50 tuổi trở lên.

b. Sửa đổi chương trình Tạp chí Cuộc sống Hàng ngày để tạo ra số lượng
độc giả theo giới tính trong nhóm tuổi — nghĩa là nữ dưới 20 tuổi, nam dưới 20 tuổi,
và như thế.
c. Sửa đổi chương trình Tạp chí Cuộc sống Hàng ngày để tạo ra số lượng độc giả
theo các nhóm thu nhập như sau: dưới $ 30.000, $ 30.000– $ 49.999, $ 50.000–
69.999 đô la và 70.000 đô la trở lên.

12. Bộ phận Bán hàng cho Kỳ nghỉ của Glen Ross sử dụng bảy nhân viên bán hàng, như thể hiện trong Bảng 6-8.
Khi nhân viên bán hàng bán hàng,
Nhân viên bán hàng
bản ghi được tạo, bao gồm cả ngày tháng,
Số ID Tên
thời gian và số tiền bán hàng. Các
thời gian được biểu thị bằng giờ và phút, 103 Darwin
dựa trên đồng hồ 24 giờ. Việc bán 104 Kratz
số tiền được biểu thị bằng toàn bộ đô la. 201 Shulstad
Nhân viên bán hàng kiếm được một khoản hoa hồng 319 Vận may
khác nhau cho mỗi lần bán hàng, dựa trên tỷ lệ
https://translate.googleusercontent.com/translate_f 43/47
9/7/2021 Lưu trữ dữ liệu trong mảng
lịch trình trong Bảng 6-9. 367
388
Wickert
Miller

Thiết kế một ứng dụng tạo ra mỗi 435 Vick


những điều sau đây:
Bảng 6-8 Nhân viên bán hàng của Glen Ross
a. Danh sách từng số nhân viên bán hàng,
tên, tổng doanh số và tổng
tiền hoa hồng
b. Danh sách mỗi tháng trong năm như Uỷ ban
Số tiền bán hàng ($) Tỷ lệ (%)
cả một số và một từ (cho
ví dụ, ngày 1 tháng 1), và tổng số 0–50,999 4
doanh số bán hàng trong tháng cho tất cả 51,000–125,999 5
nhân viên bán hàng 126.000–200.999 6
c. Danh sách tổng doanh thu cũng như tổng 201,000 trở lên 7
hoa hồng kiếm được bởi tất cả
nhân viên bán hàng cho mỗi Bảng 6-9 Lịch hoa hồng của Glen Ross

các khung thời gian sau, dựa trên


giờ trong ngày: 00–05, 06–12,
13–18 và 19–23

Trang 45

Bài tập

13. a. Thiết kế một ứng dụng trong đó số ngày cho mỗi tháng trong năm là
được lưu trữ trong một mảng. (Ví dụ: tháng 1 có 31 ngày, tháng 2 có 28, v.v.
Giả sử rằng năm đó không phải là năm nhuận.) Hiển thị 12 câu ở cùng một định dạng cho
mỗi tháng; ví dụ, câu được hiển thị cho tháng 1 là Tháng 1 có 31 ngày.
b. Sửa đổi chương trình tháng và ngày để chứa một mảng song song lưu trữ
271
tên tháng. Hiển thị 12 câu trong cùng một định dạng; ví dụ, cái đầu tiên
câu là tháng Giêng có 31 ngày.
c. Sửa đổi chương trình tháng và ngày để nhắc người dùng về số tháng
và hiển thị câu tương ứng ở định dạng tương tự như trong Bài tập 13b.
d. Nhắc người dùng nhập ngày và tháng sinh và tiếp tục nhắc cho đến khi
ngày đã nhập nằm trong phạm vi của tháng. Tính toán vị trí số của ngày trong
năm. (Ví dụ: ngày 2 tháng 2 là ngày 33.) Sau đó, sử dụng các mảng song song, hãy tìm
và hiển thị dấu hiệu Zodiac truyền thống cho ngày. Ví dụ, dấu hiệu cho
Ngày 2 tháng 2 là Bảo Bình.

Thực hiện bảo trì


1. Tệp có tên MAINTENANCE06-01.txt được bao gồm trong tệp có thể tải xuống của bạn
hồ sơ sinh viên. Giả sử rằng chương trình này là một chương trình làm việc trong tổ chức của bạn
và nó cần sửa đổi như được mô tả trong các nhận xét (các dòng bắt đầu bằng
hai dấu gạch chéo) ở đầu tệp. Công việc của bạn là thay đổi chương trình để đáp ứng
các thông số kỹ thuật mới.

https://translate.googleusercontent.com/translate_f 44/47
9/7/2021 Lưu trữ dữ liệu trong mảng

Tìm lỗi

1. Các tệp có thể tải xuống của bạn cho Chương 6 bao gồm DEBUG06-01.txt, DEBUG06-02.txt,
và DEBUG06-03.txt. Mỗi tệp bắt đầu với một số nhận xét mô tả
vấn đề. Nhận xét là những dòng bắt đầu bằng hai dấu gạch chéo (//). Theo dõi
nhận xét, mỗi tệp chứa mã giả có một hoặc nhiều lỗi bạn phải tìm
và sửa lại.
2. Các tệp có thể tải xuống của bạn cho Chương 6 bao gồm một tệp có tên DEBUG06-04.jpg
chứa một sơ đồ có lỗi cú pháp và / hoặc lôgic. Kiểm tra lưu đồ và
sau đó tìm và sửa tất cả các lỗi.

Khu vực chơi game

1. Tạo logic cho trò chơi Magic 8 Ball trong đó người dùng nhập một câu hỏi chẳng hạn như
Tương lai của tôi có gì? Máy tính chọn ngẫu nhiên một trong tám
câu trả lời mơ hồ, chẳng hạn như Nó vẫn còn được xem.
2. Tạo logic cho một ứng dụng có chứa một mảng 10 câu trắc nghiệm
câu hỏi liên quan đến sở thích yêu thích của bạn. Mỗi câu hỏi có ba câu trả lời

Trang 46

CHƯƠNG 6 Mảng

các lựa chọn. Đồng thời tạo một mảng song song chứa câu trả lời đúng cho mỗi
câu hỏi — A, B hoặc C. Hiển thị từng câu hỏi và xác minh rằng người dùng chỉ nhập
A, B hoặc C là câu trả lời — nếu không, hãy tiếp tục nhắc người dùng cho đến khi có câu trả lời hợp lệ
đã nhập. Nếu người dùng trả lời một câu hỏi chính xác, hiển thị đúng !; nếu không thì,
hiển thị Câu trả lời đúng là và chữ cái của câu trả lời đúng. Sau khi người dùng
272 trả lời tất cả các câu hỏi, hiển thị số câu trả lời đúng và sai.
3. a. Tạo logic cho trò chơi xúc xắc. Ứng dụng ngẫu nhiên "ném" năm viên xúc xắc
cho máy tính và năm viên xúc xắc cho người chơi. Sau mỗi lần ném ngẫu nhiên, lưu trữ
kết quả trong một mảng. Ứng dụng hiển thị tất cả các giá trị, có thể là
từ 1 đến 6 bao gồm cho mỗi lần chết. Quyết định người chiến thắng dựa trên những điều sau
thứ bậc của các giá trị khuôn. Bất kỳ sự kết hợp nào cao hơn sẽ đánh bại một sự kết hợp thấp hơn; ví dụ,
năm của một loại đánh bại bốn của một loại.

Năm loại

Bốn loại
Ba của một loại
Một đôi
Đối với trò chơi này, giá trị của xúc xắc số không được tính. Ví dụ: nếu cả hai người chơi
có ba viên cùng loại, đó là hòa, bất kể giá trị của ba viên xúc xắc là bao nhiêu.
Ngoài ra, trò chơi không công nhận một ngôi nhà đầy đủ (ba của một loại cộng với hai của một
Tốt bụng). Hình 6-20 cho thấy cách trò chơi có thể được chơi trong một dòng lệnh
Môi trường.

https://translate.googleusercontent.com/translate_f 45/47
9/7/2021 Lưu trữ dữ liệu trong mảng

Hình 6-20 Cách thực hiện điển hình của trò chơi xúc xắc

b. Cải thiện trò chơi xúc xắc để khi cả hai người chơi có cùng số
xúc xắc phù hợp, giá trị cao hơn sẽ thắng. Ví dụ, hai 6s đánh bại hai 5s.
4. Thiết kế logic cho trò chơi Hangman, trong đó người dùng đoán các chữ cái trong một
từ ẩn. Lưu trữ các chữ cái của một từ trong một mảng các ký tự. Hiển thị một dấu gạch ngang cho
mỗi chữ cái còn thiếu. Cho phép người dùng liên tục đoán một chữ cái cho đến khi tất cả các chữ cái
trong từ được đoán đúng. Khi người dùng nhập mỗi lần đoán, hiển thị từ
một lần nữa, điền vào chữ cái đã đoán nếu nó đúng. Ví dụ, nếu từ ẩn

Trang 47

Bài tập

là máy tính, đầu tiên hiển thị một loạt tám dấu gạch ngang: --- -----. Sau khi người dùng đoán
p, màn hình trở thành --- p-- -. Đảm bảo rằng khi người dùng thực hiện đúng
đoán, tất cả các chữ cái phù hợp được điền vào. Ví dụ: nếu từ là chuối và
người dùng đoán a, cả ba ký tự a phải được điền vào.

5. Tạo hai mảng song song đại diện cho một bộ bài tiêu chuẩn gồm 52 thẻ chơi. Một 273
mảng là số và giữ các giá trị từ 1 đến 13 (đại diện cho Át, 2 đến
10, Jack, Queen và King). Mảng còn lại là một mảng chuỗi chứa các bộ quần áo (Câu lạc bộ,
Kim cương, Trái tim và Bích). Tạo các mảng sao cho tất cả 52 lá bài đều là
đã gửi. Sau đó, tạo một trò chơi thẻ War chọn ngẫu nhiên hai thẻ (một thẻ cho
người chơi và một cho máy tính) và tuyên bố người chiến thắng hoặc hòa dựa trên
giá trị số của hai thẻ. Trò chơi sẽ kéo dài trong 26 vòng và sử dụng đầy đủ
bộ bài không có thẻ lặp lại. Đối với trò chơi này, giả sử rằng lá bài thấp nhất là quân Át.
Hiển thị giá trị của thẻ của người chơi và máy tính, so sánh giá trị của chúng và
xác định người chiến thắng. Khi tất cả các thẻ trong bộ bài đã hết, hãy hiển thị
đếm số lần người chơi thắng, số lần máy tính
chiến thắng, và số lượng các mối quan hệ.
Dưới đây là một số gợi ý:

Bắt đầu bằng cách tạo một loạt tất cả 52 thẻ chơi.
Chọn một số ngẫu nhiên cho vị trí bộ bài của lá bài đầu tiên của người chơi và
chỉ định thẻ ở vị trí mảng đó cho người chơi.
Di chuyển mọi quân bài có vị trí cao hơn trong bộ bài “xuống” một quân để lấp đầy khoảng trống. Trong
nói cách khác, nếu số ngẫu nhiên đầu tiên của người chơi là 49, hãy chọn thẻ tại
vị trí 49 (cả giá trị số và chuỗi), di chuyển thẻ đã ở trong
vị trí 50 đến vị trí 49 và di chuyển thẻ ở vị trí 51 sang vị trí
https://translate.googleusercontent.com/translate_f 46/47
9/7/2021 Lưu trữ dữ liệu trong mảng
50. Chỉ có 51 lá bài còn lại trong bộ bài sau khi lá bài đầu tiên của người chơi được chia, vì vậy
mảng thẻ có sẵn nhỏ hơn một.

Theo cách tương tự, hãy chọn ngẫu nhiên một thẻ cho máy tính và "xóa"
thẻ từ bộ bài.

Lên cho cuộc thảo luận

1. Lịch trình tàu là một ví dụ thực tế hàng ngày của một mảng. Xác định ít nhất bốn
hơn.
2. Mọi phần tử trong mảng luôn có cùng kiểu dữ liệu. Tại sao điều này là cần thiết?

https://translate.googleusercontent.com/translate_f 47/47

You might also like