Professional Documents
Culture Documents
Chương 6
Chương 6
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.
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
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ó:
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:
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:
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.
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
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
Cách một mảng có thể thay thế các quyết định lồng nhau
count5 = count4 =
đếm 5 + 1 đếm 4 + 1
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
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
235
Không Đúng số lượng [dep] =
dep = 1? số lượng [dep] + 1
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.
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
Không
đầ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
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.
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ử.
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 ++.
"Tháng 5", "Tháng 6", "Tháng 7", "Tháng 8", "Tháng 9", "Tháng 10",
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
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
chuẩn bị()
Đúng
mục <>
findItem () kết thúc()
HOÀN THÀNH?
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
KÍCH THƯỚC?
Không
foundIt = "Y"
đầu ra đầu ra
MSG_NO MSG_YES
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.
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
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.
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ệ.
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
Không
foundIt = "Y"
đầu ra đầu ra
MSG_NO MSG_YES
giá cả =
VALID_PRICES [phụ]
sub = sub + 1
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.
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 ()
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ụ]
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.
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
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
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
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
đầu ra "Hết
việc làm" Không x=x-1
đầu ra "Enter
số lượng đặt hàng
hoặc ", QUIT," thành
bỏ "
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ề
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
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
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
Để 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.
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]
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"
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 đó
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:
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
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
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.
Một phần tử là một mục dữ liệu duy nhất trong một mảng.
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.
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
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
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.
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
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
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.
0–5 Tốt
https://translate.googleusercontent.com/translate_f 39/47
9/7/2021 Lưu trữ dữ liệu trong mảng
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
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
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
Trang 43
Bài tập
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
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
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.
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.
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.
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