1. Cho mảng `int grades[3][3];`. Nếu ta muốn gán giá trị 90 cho học sinh thứ 3 (chỉ số 2) trong bài kiểm tra thứ 2 (chỉ số 1), câu lệnh nào là đúng?
A. grades[3][2] = 90;
B. grades[2][1] = 90;
C. grades[1][2] = 90;
D. grades[2][2] = 90;
2. Phát biểu nào sau đây là đúng về việc truy cập phần tử trong mảng hai chiều?
A. Chỉ có thể truy cập phần tử đầu tiên và cuối cùng.
B. Cần biết cả chỉ số hàng và chỉ số cột để truy cập một phần tử cụ thể.
C. Chỉ cần biết chỉ số hàng là đủ.
D. Chỉ cần biết chỉ số cột là đủ.
3. Khi duyệt mảng hai chiều theo kiểu cột-major (ví dụ: Fortran), vòng lặp ngoài sẽ biểu diễn cái gì?
A. Số lượng hàng.
B. Số lượng cột.
C. Tổng số phần tử.
D. Chỉ số của phần tử.
4. Ý nghĩa của việc khai báo `const int ROWS = 5; const int COLS = 10; int my_array[ROWS][COLS];` là gì?
A. Tạo một mảng có kích thước thay đổi được.
B. Tạo một mảng có kích thước cố định 5x10 và dễ đọc, dễ bảo trì hơn.
C. Tạo một mảng có thể chứa tối đa 50 phần tử mà không phân biệt hàng cột.
D. Tạo hai mảng riêng biệt.
5. Nếu một mảng hai chiều có `N` hàng và `M` cột, thì tổng số phần tử trong mảng là bao nhiêu?
A. N + M
B. N * M
C. N ^ M
D. M ^ N
6. Cho mảng hai chiều `float data[3][2];`. Giá trị của `data[2][1]` sẽ được lưu trữ ở đâu trong bộ nhớ (so với `data[0][0]`)?
A. Ở một vị trí bộ nhớ xa hơn, sau tất cả các phần tử của hàng 0 và hàng 1.
B. Ở một vị trí bộ nhớ gần hơn, trước các phần tử của hàng 0.
C. Ở cùng một vị trí bộ nhớ.
D. Vị trí phụ thuộc vào trình biên dịch.
7. Tại sao khi truyền mảng hai chiều làm tham số cho một hàm trong C/C++, ta thường cần chỉ định số cột?
A. Để trình biên dịch biết kích thước của mỗi hàng, từ đó tính toán địa chỉ phần tử.
B. Để giới hạn số lượng phần tử có thể truy cập.
C. Để đảm bảo tính bảo mật của dữ liệu.
D. Chỉ số cột là không bắt buộc.
8. Khi khai báo mảng hai chiều `char letters[2][3];`, kích thước bộ nhớ mà mảng này chiếm dụng (giả sử char chiếm 1 byte) là bao nhiêu?
A. 2 byte
B. 3 byte
C. 5 byte
D. 6 byte
9. Nếu ta muốn tìm phần tử có giá trị lớn nhất trong một mảng hai chiều, bước đầu tiên thường là gì?
A. Khởi tạo một biến `max_value` với giá trị 0.
B. Khởi tạo một biến `max_value` với giá trị của phần tử đầu tiên của mảng.
C. So sánh tất cả các phần tử với nhau trước.
D. Sắp xếp mảng theo thứ tự giảm dần.
10. Trong khai báo mảng hai chiều `int arr[3][4];`, số 3 đại diện cho điều gì theo quy ước chung?
A. Số lượng cột của mảng.
B. Kích thước tổng cộng của mảng.
C. Số lượng hàng của mảng.
D. Số lượng phần tử tối đa có thể lưu trữ.
11. Cho mảng `int data[N][M]`. Nếu `N` là 5 và `M` là 3, thì chỉ số hàng hợp lệ sẽ nằm trong khoảng nào?
A. 0 đến 5
B. 1 đến 5
C. 0 đến 4
D. 1 đến 4
12. Nếu một mảng hai chiều có 3 hàng và 2 cột, thì số lượng phần tử của mảng là bao nhiêu?
A. 3 + 2 = 5
B. 3 * 2 = 6
C. 3 ^ 2 = 9
D. 2 ^ 3 = 8
13. Trong ngôn ngữ lập trình C/C++, mảng hai chiều thường được lưu trữ trong bộ nhớ theo kiểu nào?
A. Theo hàng (row-major order).
B. Theo cột (column-major order).
C. Ngẫu nhiên, tùy thuộc vào trình biên dịch.
D. Theo cấu trúc cây.
14. Trong các phát biểu sau, phát biểu nào KHÔNG đúng về mảng hai chiều?
A. Mỗi phần tử của mảng hai chiều được xác định bởi hai chỉ số: chỉ số hàng và chỉ số cột.
B. Tất cả các phần tử trong một mảng hai chiều phải có cùng kiểu dữ liệu.
C. Kích thước của mảng hai chiều có thể thay đổi tùy ý trong quá trình thực thi chương trình.
D. Mảng hai chiều có thể được xem như một mảng của các mảng.
15. Cho đoạn mã sau: `int grid[2][2] = {{1, 2}, {3, 4}}; int sum = 0; for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { sum += grid[i][j]; } }`. Giá trị cuối cùng của `sum` là bao nhiêu?
16. Nếu ta có một ma trận vuông kích thước NxN, thì tổng số phần tử của nó là bao nhiêu?
17. Cho khai báo `int matrix[2][3];`. Làm thế nào để truy cập phần tử ở hàng thứ nhất (chỉ số 0) và cột thứ hai (chỉ số 1)?
A. matrix[2][1];
B. matrix[1][2];
C. matrix[0][1];
D. matrix[1][0];
18. Khai báo nào sau đây KHÔNG hợp lệ cho mảng hai chiều trong C/C++?
A. int arr[][5];
B. int arr[3][];
C. int arr[4][6];
D. int arr[2][3] = {{1,2,3}, {4,5,6}};
19. Đâu là cách hiệu quả nhất để khởi tạo một mảng hai chiều với tất cả các phần tử bằng 0?
A. Sử dụng vòng lặp `for` lồng nhau gán 0 cho từng phần tử.
B. Sử dụng vòng lặp `while` lồng nhau gán 0 cho từng phần tử.
C. Khai báo `int arr[3][4] = {0};`
D. Không có cách nào hiệu quả, phải gán từng phần tử.
20. Đâu là một ứng dụng phổ biến của mảng hai chiều trong thực tế?
A. Lưu trữ danh sách các số nguyên tố.
B. Biểu diễn bản đồ, lưới ô vuông, hoặc ma trận trong toán học.
C. Quản lý các biến đơn lẻ.
D. Lưu trữ chuỗi ký tự dài.
21. Đâu là cách khai báo đúng cho một mảng hai chiều lưu trữ số nguyên với 5 hàng và 10 cột?
A. int arr[10][5];
B. int arr[5][10];
C. int arr(5, 10);
D. int arr[5, 10];
22. Khi khởi tạo một mảng hai chiều `int A[2][2] = {{1, 2}, {3, 4}};`, phần tử nào sẽ có giá trị là 4?
A. A[0][0]
B. A[1][0]
C. A[0][1]
D. A[1][1]
23. Đâu là cách khai báo và khởi tạo mảng hai chiều `int matrix[3][2]` với các giá trị `{{1, 2}, {3, 4}, {5, 6}}` một cách đầy đủ nhất?
A. int matrix[3][2] = {1, 2, 3, 4, 5, 6};
B. int matrix[3][2] = {{1, 2}, {3, 4}, {5, 6}};
C. int matrix[2][3] = {{1, 2}, {3, 4}, {5, 6}};
D. int matrix[3][2] = {1, 3, 5, 2, 4, 6};
24. Nếu muốn tính tổng tất cả các phần tử của mảng hai chiều `int board[4][4]`, ta cần sử dụng cấu trúc lặp nào là hiệu quả nhất?
A. Một vòng lặp `for` đơn.
B. Hai vòng lặp `for` lồng nhau.
C. Một vòng lặp `while`.
D. Không cần vòng lặp, chỉ cần truy cập trực tiếp từng phần tử.
25. Khi duyệt qua tất cả các phần tử của mảng hai chiều bằng vòng lặp lồng nhau, vòng lặp ngoài thường đại diện cho cái gì?
A. Số lượng cột.
B. Số lượng hàng.
C. Tổng số phần tử.
D. Chỉ số của phần tử.