Trang chủ C# cơ bản Mảng 2 chiều trong C#

Mảng 2 chiều trong C#

Nguyễn Dương 07-06-2024

1. MẢNG 2 CHIỀU LÀ GÌ?

Mảng 2 chiều được hiểu như một bảng có m hàng và n cột.
Ta cùng xem hình minh họa dưới đây:
Mảng 2 chiều

- Các phần tử trong mảng 2 chiều được truy xuất dựa vào chỉ số của 2 chiều, tạm gọi là chỉ số hàng và chỉ số cột. 
Ví dụ trong bảng trên:
A[3,3] sẽ là số nguyên 37
A[0,0] là số nguyên 5
A[1,1] là 26

2. CÁCH KHAI BÁO, KHỞI TẠO MẢNG 2 CHIỀU

- Khai báo
<kiểu dữ liệu> [,] <tên mảng>;

Cách khai báo tương tự mảng 1 chiều, chỉ thêm 1 dấu phẩy

- Cấp phát vùng nhớ
int [,] ArrayC = new int [6,9];

Cấp phát vùng nhớ thông qua toán tử new và phải khai báo chỉ số hàng và cột.
Sau khi mảng được cấp phát vùng nhớ thì các phần tử trong mảng sẽ mang giá trị mặc định:
  • Đối với số nguyên là 0
  • Đối với số thực là 0.0
  • Đối với kiểu ký tự là '' (ký tự rỗng)
  • Đối với kiểu tham chiếu là null

- Khởi tạo giá trị khi khai báo
<kiểu dữ liệu>[,] <tên mảng> = new <kiểu dữ liệu>[,]         
{
            { <dữ liệu dòng 1 cột 1>, ..., <dữ liệu dòng 1 cột n> },
            .....................................................
            { <dữ liệu dòng m cột 1>, ..., <dữ liệu dòng m cột n> }
};

Nếu khởi tạo giá trị ngay khi khai báo thì bạn không cần cung cấp số dòng và số cột tối đa mà trình biên dịch sẽ tự đếm xem bạn đã khởi tạo bao nhiều dòng và mỗi dòng bao nhiêu giá trị rồi xem nó như số dòng số cột tối đa.  

<kiểu dữ liệu>[,] <tên mảng> =          
{
            { <dữ liệu dòng 1 cột 1>, ..., <dữ liệu dòng 1 cột n> },
            .....................................................
            { <dữ liệu dòng m cột 1>, ..., <dữ liệu dòng m cột n> }
};

Về bản chất thì cách này trình biên dịch vẫn xem xét số phần tử khởi tạo và cấp phát vùng nhớ cho biến mảng sau đó thực khởi tạo giá trị cho các phần tử trong mảng. Nhưng cách viết này có vẻ nhanh và gọn hơn so với cách cấp phát vùng nhớ rồi mới khởi tạo giá trị.

3. SỬ DỤNG MẢNG 2 CHIỀU

Sử dụng tương tự mảng 1 chiều


Một số phương thức và thuộc tính thường sử dụng:
Thuộc tính
Tác dụng
Length
Trả về số phần tử tối đa của mảng (kiểu int). Đối với mảng 2 chiều thì sẽ bằng số hàng nhân với số cột (m x n)
LongLength
Trả về số phần tử tối đa của mảng (kiểu long)

GetLength(số chiều)
Trả về số phần tử trong chiều xác định (kiểu int). Số chiều là số nguyên dương được đánh số từ 0. Đối với mảng 2 chiều thì GetLength(0) sẽ trả về độ dài chiều thứ nhất, tương đương số hàng. GetLength(1) sẽ trả về độ dài chiều thứ 2, tương đương số cột.
GetLongLength(số chiều)
Tác dụng tương tự GetLength, trả về kiểu long
Rank
Trả về số chiều của mảng, kiểu int
Clone()
Copy giá trị ra một vùng nhớ mới
Ví dụ 1: Khởi tạo mảng 2 chiều gồm 7 hàng và 9 cột, giá trị tùy chọn. Sau đó, in ra màn hình giá trị của các phần tử trong mảng.
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp4
{
    class Program
    {
        static void Main(string[] args)
        {
            int[,] A =
            {
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
                {1, 2, 3, 4, 5, 6, 7, 8, 9},
            };

            for (int i = 0; i < A.GetLength(0); i++)
            {
                for (int j = 0; j < A.GetLength(1); j++)
                {
                    Console.Write("{0,3}", A[i,j]);
                }
                Console.WriteLine();
            }
            Console.ReadLine();
        }
    }
}

Kết quả: 

Ví dụ 2: Viết chương trình về mảng số nguyên, nhập từ bàn phím số hàng và số cột và giá trị các phần tử của mảng. Sau đó in mảng vừa nhập ra màn hình. 
using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp69
{
    class Program
    {
        static void Main(string[] args)
        {
            int Row, Col;
            Console.OutputEncoding = Encoding.UTF8;

            Console.Write("Mời nhập số hàng: ");
            Row = int.Parse(Console.ReadLine());
            Console.Write("Mời nhập số cột: ");
            Col = int.Parse(Console.ReadLine());

            int[,] IntArray = new int[Row, Col];

            for(int i = 0; i < IntArray.GetLength(0); i++)
            {
                for(int j = 0; j < IntArray.GetLength(1); j++)
                {
                    Console.Write("Nhập giá trị phần tử [{0},{1}]: ", i, j);
                    IntArray[i, j] = int.Parse(Console.ReadLine());
                }
            }

            Console.WriteLine();
            Console.WriteLine("Mảng vừa nhập");

            for (int i = 0; i < IntArray.GetLength(0); i++)
            {
                for (int j = 0; j < IntArray.GetLength(1); j++)
                {
                    Console.Write("{0,3}", IntArray[i,j]);                 
                }
                Console.WriteLine();
            }

            Console.ReadLine();
        }
    }
}

Kết quả: 

Ví dụ 3: Tiếp theo ví dụ 2, tính tổng tất cả phần tử trong mảng.
Trong ví dụ này thì chỉ cần thêm biến Sum đồng thời tính giá trị biến Sum kèm theo khi in mảng ra màn hình.
int Sum = 0;
Console.WriteLine("Mảng vừa nhập");

for (int i = 0; i < IntArray.GetLength(0); i++)
{
      for (int j = 0; j < IntArray.GetLength(1); j++)
      {
            Console.Write("{0,3}", IntArray[i,j]);
            Sum += IntArray[i, j];
      }
      Console.WriteLine();
}

Console.WriteLine("Tổng giá trị các phần tử trong mảng là: {0}", Sum);

Kết quả: 

Bài viết liên quan

Hàm đệ quy trong C# Hàm đệ quy trong C#
enum trong C# enum trong C#
Struct trong C# Struct trong C#
Lớp String trong C# Lớp String trong C#
Vòng lặp foreach trong C# Vòng lặp foreach trong C#
Mảng đa chiều, mảng của mảng trong C# Mảng đa chiều, mảng của mảng trong C#