1. Trong Pascal, khai báo `Type Matrix = array[1..5, 1..5] of Integer;` tạo ra một mảng có bao nhiêu hàng và bao nhiêu cột?
A. 5 hàng, 5 cột
B. 1 hàng, 5 cột
C. 5 hàng, 1 cột
D. 25 hàng, 25 cột
2. Để truy cập vào phần tử ở hàng thứ 2 và cột thứ 3 của mảng hai chiều `float matrix[5][6];` trong ngôn ngữ C++, ta sử dụng chỉ số nào sau đây?
A. matrix[3][2];
B. matrix[2][3];
C. matrix[1][2];
D. matrix[3][3];
3. Phát biểu nào sau đây là đúng về việc sử dụng mảng hai chiều để biểu diễn một hình chữ nhật?
A. Số hàng biểu diễn chiều rộng, số cột biểu diễn chiều cao.
B. Số hàng biểu diễn chiều cao, số cột biểu diễn chiều rộng.
C. Số hàng và số cột đều biểu diễn cả chiều rộng và chiều cao.
D. Không thể biểu diễn hình chữ nhật bằng mảng hai chiều.
4. Cho mảng hai chiều `char board[5][5];`. Nếu ta muốn kiểm tra xem có ký tự X nào xuất hiện ở bất kỳ vị trí nào trong mảng hay không, ta cần lặp qua tất cả các phần tử và thực hiện phép so sánh nào?
A. So sánh `board[i][j] == X`
B. So sánh `board[i][j] != X`
C. So sánh `board[i][j] > X`
D. So sánh `board[i][j] < X`
5. Phát biểu nào sau đây là đúng về mảng hai chiều trong lập trình?
A. Mảng hai chiều luôn luôn được cấp phát động.
B. Mảng hai chiều có thể có số lượng cột khác nhau cho mỗi hàng.
C. Mảng hai chiều là một cấu trúc dữ liệu tuyến tính.
D. Mảng hai chiều cho phép truy cập phần tử bằng một cặp chỉ số.
6. Cho mảng hai chiều `int arr[3][3];`. Nếu ta muốn tìm phần tử lớn nhất trên đường chéo chính, ta cần duyệt qua các phần tử nào?
A. arr[0][0], arr[0][1], arr[0][2]
B. arr[0][0], arr[1][1], arr[2][2]
C. arr[0][2], arr[1][1], arr[2][0]
D. arr[0][0], arr[1][0], arr[2][0]
7. Nếu một mảng hai chiều biểu diễn một lưới ô vuông, và ta muốn tô màu cho tất cả các ô nằm trên biên của lưới, ta sẽ thực hiện duyệt các phần tử nào?
A. Chỉ duyệt các phần tử có chỉ số hàng hoặc cột bằng 0.
B. Duyệt tất cả các phần tử của mảng.
C. Duyệt các phần tử ở hàng đầu tiên, hàng cuối cùng, cột đầu tiên và cột cuối cùng.
D. Chỉ duyệt các phần tử có chỉ số hàng bằng chỉ số cột.
8. Phát biểu nào sau đây mô tả đúng nhất khái niệm phần tử biên (boundary element) của một mảng hai chiều `M[R][C]`?
A. Là các phần tử nằm trên đường chéo chính của mảng.
B. Là các phần tử có giá trị lớn nhất hoặc nhỏ nhất trong mảng.
C. Là các phần tử nằm ở hàng đầu tiên, hàng cuối cùng, cột đầu tiên hoặc cột cuối cùng của mảng.
D. Là các phần tử có chỉ số hàng hoặc chỉ số cột bằng 0.
9. Phát biểu nào sau đây là đúng về cách lưu trữ mảng hai chiều trong bộ nhớ máy tính?
A. Các phần tử của mảng hai chiều được lưu trữ xen kẽ theo từng hàng và cột.
B. Các phần tử của mảng hai chiều được lưu trữ liên tiếp nhau theo thứ tự từng hàng (row-major order) hoặc từng cột (column-major order).
C. Các phần tử của mảng hai chiều được lưu trữ hoàn toàn ngẫu nhiên trong bộ nhớ.
D. Mỗi phần tử của mảng hai chiều được lưu trữ ở một địa chỉ bộ nhớ riêng biệt, không liên quan đến các phần tử khác.
10. Trong ngôn ngữ C++, khi khai báo `int a[3][2] = {{1, 2}, {3, 4}, {5, 6}};`, giá trị của `a[1][0]` là gì?
11. Cho khai báo mảng hai chiều trong C++: `int arr[3][4];`. Số lượng phần tử tối đa mà mảng này có thể chứa là bao nhiêu?
12. Cho mảng hai chiều `char grid[4][5];`. Nếu ta muốn lưu trữ các ký tự theo từng cột, ví dụ `grid[0][0] = A`, `grid[1][0] = B`, `grid[2][0] = C`, `grid[3][0] = D`, thì cách duyệt nào hiệu quả nhất để khởi tạo cột đầu tiên?
A. Sử dụng vòng lặp `for` duyệt theo hàng (index i từ 0 đến 3) và gán `grid[i][0]`.
B. Sử dụng vòng lặp `for` duyệt theo cột (index j từ 0 đến 4) và gán `grid[0][j]`.
C. Sử dụng vòng lặp `for` duyệt theo hàng (index i từ 0 đến 3) và gán `grid[0][i]`.
D. Sử dụng vòng lặp `for` duyệt theo cột (index j từ 0 đến 4) và gán `grid[j][0]`.
13. Cho đoạn mã Pascal sau:
```pascal
Var A: array[1..3, 1..4] of Integer;
...
For i := 1 to 3 do
For j := 1 to 4 do
A[i, j] := i * j;
```
Giá trị của phần tử `A[2, 3]` sau khi thực hiện đoạn mã là bao nhiêu?
14. Cho đoạn mã C++ sau:
```cpp
int data[2][3];
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
data[i][j] = i + j;
}
}
```
Giá trị của `data[1][2]` là bao nhiêu?
15. Trong ngôn ngữ lập trình Pascal, khi khai báo mảng hai chiều, cú pháp khai báo nào sau đây là đúng?
A. Var ten_mang : array[so_dong, so_cot] of kieu_du_lieu;
B. Var ten_mang : array[so_dong] of array[so_cot] of kieu_du_lieu;
C. Var ten_mang : array[kieu_du_lieu] of so_dong, so_cot;
D. Var ten_mang : array(so_dong, so_cot) of kieu_du_lieu;
16. Để tìm phần tử nhỏ nhất trong mỗi cột của mảng hai chiều `float matrix[4][5];`, ta nên sử dụng cấu trúc vòng lặp nào?
A. Vòng lặp ngoài duyệt theo cột, vòng lặp trong duyệt theo hàng.
B. Vòng lặp ngoài duyệt theo hàng, vòng lặp trong duyệt theo cột.
C. Chỉ cần một vòng lặp duy nhất.
D. Vòng lặp ngoài duyệt theo đường chéo, vòng lặp trong duyệt theo biên.
17. Trong Pascal, hàm `High()` và `Low()` có thể được sử dụng để xác định giới hạn trên và dưới của chỉ số mảng. Nếu khai báo mảng là `Type Arr = array[5..10] of Real;`, thì `High(Arr)` sẽ trả về giá trị nào?
18. Cho mảng hai chiều `int matrix[3][4];`. Nếu ta muốn tính tổng các phần tử trên đường chéo phụ (từ trên phải xuống dưới trái), ta cần duyệt qua các phần tử nào?
A. matrix[0][0], matrix[1][1], matrix[2][2]
B. matrix[0][3], matrix[1][2], matrix[2][1]
C. matrix[0][3], matrix[1][3], matrix[2][3]
D. matrix[0][0], matrix[1][0], matrix[2][0]
19. Trong C++, nếu bạn muốn tính tổng tất cả các phần tử của mảng hai chiều `int matrix[2][3] = {{1, 2, 3}, {4, 5, 6}};`, đoạn mã nào sau đây thực hiện đúng chức năng đó?
A. int sum = 0; for (int i=0; i<2; ++i) for (int j=0; j<3; ++j) sum += matrix[i][j];
B. int sum = 0; for (int i=0; i<3; ++i) for (int j=0; j<2; ++j) sum += matrix[j][i];
C. int sum = 0; for (int i=1; i<=2; ++i) for (int j=1; j<=3; ++j) sum += matrix[i][j];
D. int sum = 0; for (int i=0; i<2; ++i) sum += matrix[i][0] + matrix[i][1] + matrix[i][2];
20. Đâu là ưu điểm chính của việc sử dụng mảng hai chiều so với việc sử dụng nhiều mảng một chiều riêng lẻ để biểu diễn dữ liệu dạng bảng?
A. Tiết kiệm bộ nhớ hơn.
B. Dễ dàng hơn trong việc truy cập và xử lý dữ liệu có cấu trúc hàng cột.
C. Tốc độ truy cập phần tử nhanh hơn đáng kể.
D. Cho phép lưu trữ các kiểu dữ liệu khác nhau trong cùng một mảng.
21. Phát biểu nào sau đây về mảng hai chiều là KHÔNG đúng?
A. Mảng hai chiều là một tập hợp các phần tử có cùng kiểu dữ liệu.
B. Mảng hai chiều có thể được xem như một bảng dữ liệu với các hàng và các cột.
C. Mỗi phần tử trong mảng hai chiều được xác định duy nhất bởi một cặp chỉ số (chỉ số hàng, chỉ số cột).
D. Số lượng chỉ số cho mỗi phần tử trong mảng hai chiều luôn là hai.
22. Nếu ta có một mảng hai chiều `int scores[3][4];` và muốn gán giá trị 0 cho tất cả các phần tử, cách tiếp cận nào sau đây là phổ biến và hiệu quả nhất?
A. Sử dụng hai vòng lặp lồng nhau để duyệt qua từng phần tử và gán giá trị 0.
B. Gán trực tiếp `scores = 0;`.
C. Sử dụng hàm `memset()` với giá trị 0.
D. Khởi tạo mảng ngay khi khai báo với tất cả giá trị là 0.
23. Khi duyệt qua tất cả các phần tử của một mảng hai chiều `int data[R][C];` (với R là số hàng, C là số cột) bằng hai vòng lặp `for` lồng nhau, vòng lặp ngoài thường dùng để duyệt theo chiều nào?
A. Cột
B. Hàng
C. Tùy chọn, không có quy tắc cố định
D. Đường chéo
24. Khi thực hiện phép chuyển vị (transpose) cho một ma trận vuông `A` kích thước `n x n`, phần tử `A[i][j]` sẽ được chuyển thành phần tử nào trong ma trận chuyển vị `B`?
A. B[i][j]
B. B[j][i]
C. B[n-i+1][n-j+1]
D. B[i][n-j+1]
25. Cho mảng hai chiều `int matrix[3][3];`. Nếu ta muốn tính tổng các phần tử nằm trên đường chéo chính và đường chéo phụ, cần lưu ý điều gì đặc biệt?
A. Phần tử nằm ở giao điểm của hai đường chéo (phần tử trung tâm) sẽ bị đếm hai lần.
B. Các phần tử trên đường chéo chính và phụ không bao giờ trùng nhau.
C. Cần phải sử dụng mảng ba chiều để lưu trữ kết quả.
D. Chỉ cần tính tổng từng đường chéo riêng biệt, không cần quan tâm đến sự trùng lặp.