1. Giới thiệu
Hãy tưởng tượng một mảng bình thường giống như một hộp pizza dài, nơi tất cả các miếng nằm thành hàng — ngon đấy, nhưng hơi đơn điệu.
Còn bây giờ, hãy nghĩ đến lịch làm việc hoặc bàn cờ vua. Ở đó mọi thứ được tổ chức thành hàng và cột — tức là thành bảng. Đó chính là bài toán kinh điển cho mảng hai chiều.
Trong đời sống thực, mảng hai chiều xuất hiện ở khắp nơi:
- Bảng lương nhân viên (hàng — nhân viên, cột — các tháng).
- Hình ảnh trên màn hình (mỗi "ô" là màu của pixel, có hai tọa độ: X và Y).
- Tính toán ma trận và xử lý dữ liệu.
- Bàn cờ vua hoặc sân chơi caro.
Đôi khi mảng hai chiều còn được gọi là ma trận (tên này đến từ toán học).
Có rất nhiều chỗ mà bạn — lập trình viên — sẽ cần dùng mảng hai chiều. Hầu như mọi trò chơi bàn cờ đều là mảng hai chiều sẵn rồi: “Cờ vua”, “Cờ tướng”, “Caro”, “Bắn tàu”:
Sân chơi của “Cờ vua” hay “Bắn tàu” cực kỳ hợp với mảng hai chiều, nơi bạn chỉ cần dùng số làm tọa độ ô. Không phải “tốt e2 → e4”, mà là “tốt (4,1) → (4,3)”. Làm vậy cho lập trình viên còn dễ hơn nhiều.
2. Cú pháp khai báo mảng hai chiều
Chỉ sợ lần đầu thôi! Cùng tìm hiểu từng bước nhé.
Quy tắc chung
kiểu[,] tenMang;
Dấu phẩy , trong ngoặc không phải lỗi do coder thức đêm uống cà phê đâu, mà là để chỉ: mảng hai chiều.
Ví dụ
int[,] matrix;
double[,] gradesTable;
string[,] chessBoard;
Tạo mảng
Chỉ định kích thước: số hàng và cột.
matrix = new int[3, 4]; // 3 hàng, 4 cột
Đây là bảng 3x4: tưởng tượng bảng Excel có 3 hàng và 4 cột.
Có thể vừa khai báo biến vừa tạo mảng hai chiều luôn:
int[,] matrix = new int[3, 4];
Cũng có thể khởi tạo luôn giá trị (giống như mảng một chiều):
int[,] example = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// Bảng 3 hàng, 3 cột
Lưu ý: TẤT CẢ các hàng khi khởi tạo kiểu này phải cùng độ dài. Không được để hàng đầu 3 phần tử, hàng hai chỉ 2 phần tử.
Sơ đồ trực quan
┌─────┬─────┬─────┬─────┐
│ 0 │ 1 │ 2 │ 3 │ ← cột (Columns)
├─────┼─────┼─────┼─────┤
│ 0,0 │0,1 │0,2 │0,3 │ ← hàng 0 (Row 0)
├─────┼─────┼─────┼─────┤
│ 1,0 │1,1 │1,2 │1,3 │ ← hàng 1 (Row 1)
├─────┼─────┼─────┼─────┤
│ 2,0 │2,1 │2,2 │2,3 │ ← hàng 2 (Row 2)
└─────┴─────┴─────┴─────┘
Mỗi phần tử được xác định bằng cặp chỉ số [hàng, cột].
3. Truy cập phần tử bằng chỉ số
Trong mảng hai chiều, để truy cập phần tử bạn cần hai chỉ số:
- Đầu tiên — số hàng
- Thứ hai — số cột
matrix[1, 2] = 99; // Ở hàng thứ hai (chỉ số 1), cột thứ ba (chỉ số 2)
Nếu bạn quen chơi cờ vua thì nhớ nhé: chỉ số bắt đầu từ 0. Tức là, phần tử đầu tiên là [0, 0].
Ghi và đọc
int[,] data = new int[5, 2];
data[1, 1] = 5; // ghi
int value = data[1, 1]; // đọc
Đây là cách nó sẽ nằm trong bộ nhớ:
4. Điền dữ liệu cho mảng hai chiều
Cùng viết code để điền ma trận bằng các số liên tiếp từ 1 đến 12, cho dễ hình dung cách hoạt động nhé.
int[,] matrix = new int[3, 4];
int value = 1;
for (int row = 0; row < 3; row++)
{
for (int col = 0; col < 4; col++)
{
matrix[row, col] = value;
value++;
}
}
Ở đây vòng lặp ngoài chạy qua hàng, vòng trong — cột.
Minh họa:
Sau khi chạy xong:
┌────┬────┬────┬────┐
│ 1 │ 2 │ 3 │ 4 │
├────┼────┼────┼────┤
│ 5 │ 6 │ 7 │ 8 │
├────┼────┼────┼────┤
│ 9 │10 │11 │12 │
└────┴────┴────┴────┘
5. Kích thước: lấy số hàng và cột
Thường thì bạn sẽ cần biết kích thước mảng "lúc chạy". Trong C# có sẵn hàm GetLength() rất tiện.
int[,] matrix = new int[3, 4];
int rows = matrix.GetLength(0); // số hàng (chiều đầu) - 3
int columns = matrix.GetLength(1); // số cột (chiều hai) - 4
Console.WriteLine($"Hàng: {rows}, Cột: {columns}");
đừng nhầm với Length — với mảng hai chiều thì đây là tổng số tất cả phần tử (hàng × cột).
6. In mảng hai chiều ra màn hình
Để in bảng hai chiều, thường dùng hai vòng lặp — giống như vẽ mê cung trên console vậy. Ví dụ:
for (int row = 0; row < matrix.GetLength(0); row++)
{
for (int col = 0; col < matrix.GetLength(1); col++)
{
Console.Write(matrix[row, col] + "\t"); // "\t" — tab cho đẹp
}
Console.WriteLine(); // xuống dòng mới
}
Ví dụ in ra:
1 2 3 4
5 6 7 8
9 10 11 12
À mà, giờ bạn đã biết cách "vẽ" bảng đẹp chỉ với vài dòng code rồi nhé!
7. Mảng nhiều chiều
Và còn một điều thú vị nữa về mảng, chắc bạn cũng đoán ra rồi. Nếu làm được mảng hai chiều, thì ba chiều cũng được chứ?
Đúng vậy, bạn có thể tạo mảng bao nhiêu chiều cũng được. Những mảng này gọi là mảng nhiều chiều.
Cách khai báo mảng nhiều chiều
Chỉ cần liệt kê số chiều cần thiết bằng dấu phẩy:
int[,,,] matrix = new int[2, 3, 4, 5];
Ở đây là mảng bốn chiều:
- 2 phần tử theo chiều đầu,
- 3 — theo chiều hai,
- 4 — theo chiều ba,
- 5 — theo chiều bốn.
Trong bộ nhớ, mảng này là một “khối lập phương” dữ liệu lớn, được đóng gói liên tục.
Cách truy cập phần tử
Truy cập phần tử bằng tất cả chỉ số cùng lúc:
matrix[0, 1, 2, 3] = 42;
int value = matrix[1, 2, 0, 4];
- Chỉ số bắt đầu từ 0, như mọi khi trong C#.
- Tổng số phần tử trong mảng này là 2 × 3 × 4 × 5 = 120 phần tử.
Ví dụ thực tế về mảng nhiều chiều
- 2D — bảng, bàn cờ, hình ảnh.
- 3D — “khối lập phương” trong đồ họa máy tính, dữ liệu cho tính toán khoa học (ví dụ: nhiệt độ ở các điểm không gian và thời gian khác nhau).
- 4D trở lên — hiếm dùng, nhưng có trong toán học nâng cao, mô phỏng, machine learning, v.v.
GO TO FULL VERSION