CodeGym /Các khóa học /C# SELF /Mảng hai chiều

Mảng hai chiều

C# SELF
Mức độ , Bài học
Có sẵn

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àngcộ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”:

Mảng hai chiều 2

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;
Khai báo mảng hai chiều

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àngcộ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
Khởi tạo mảng hai chiều với giá trị

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)
Gán giá trị cho phần tử trong mảng hai chiều

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ớ:

Mảng hai chiều

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++;
    }
}
Điền mảng hai chiều bằng số liên tiếp

Ở đâ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}");
Chú ý:

đừ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];
Khai báo mảng bốn chiều

Ở đâ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.
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Khởi tạo mảng hai chiều và in ra các phần tử của nó
Khởi tạo mảng hai chiều và in ra các phần tử của nó
2
Nhiệm vụ
C# SELF, mức độ, bài học
Đã khóa
Tính tổng các phần tử của từng dòng trong mảng hai chiều
Tính tổng các phần tử của từng dòng trong mảng hai chiều
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION