You are on page 1of 26

BÀI 5B:

MẢNG NHIỀU CHIỀU


2
Mảng nhiều chiều
 Mảng nhiều chiều có thể là 2 chiều, 3 chiều
hoặc nhiều hơn.
 Trong mảng nhiều chiều, quan trọng nhất là mảng 2
chiều (2-dimensional), còn được gọi ma trận
(matric) hay bảng (table)
 Ví dụ ma trận số nguyên có 2 dòng 4 cột:
0 1 2 3

0 5 0 -2 4
1 9 6 7 8

BUSINESS INFORMATION TECHNOLOGY


3
Ví dụ khai báo và cấp phát
 Khai báo mảng nhiều chiều:
<kiểu DL> [ , ] <tên_mảng>;
VD: int[,] A;
float[,] X;
string[,,] LapPhuong; //mảng 3 chiều

 Khai báo và cấp phát mảng nhiều chiều


 Dùng từ khóa new
 Phải chỉ rõ kích thước của mỗi chiều
<kiểuDL>[,] <tên_mảng> = new <kiểuDL>[<hàng>,<cột>];
int[,] A = new int[3, 4];
float[,] X = new float[8, 2];
string[,,] LapPhuong = new string[5, 5, 5];

BUSINESS INFORMATION TECHNOLOGY


4
Ví dụ (tt)
using System;
class Vidu
{
static public void Main()
{
int [ , ] month = new int[2, 4];
float [ , , ] room = new float [4, 5, 10];
string[ , ] name;
for (int i=0; i<2 ; i++)
for (int j=0; j<4 ; j++) month[i,j]=2*i+j;

}
}

BUSINESS INFORMATION TECHNOLOGY


Khởi tạo giá trị cho mảng nhiều chiều 5
 Tạo và khởi tạo giá trị cho mảng :
int[,] A =
{
{1, 2, 3, 4}, // các giá trị của dòng 0
{5, 6, 7, 8}, // các giá trị của dòng 1
{9, 10, 11, 12} // các giá trị của dòng 2
}; //Kthước của mtrận là 3 x 4 (3 dòng, 4 cột)

 Ma trận được mô tả bởi nhiều dòng, mỗi dòng có nhiều


giá trị

BUSINESS INFORMATION TECHNOLOGY


Truy xuất các phần tử của mảng 2 chiều 6

 Truy xuất phần tử của mảng 2 chiều:


<tên mảng>[<chỉ_số_dòng>,<chỉ_số_cột>]
 Ví dụ gán phần tử của mảng cho biến:
int[,] A = {{1, 2, 3}, {4, 5, 6}}
int X = A[1, 1]; //X = 5
 Ví dụ gán giá trị cho mảng 2 chiều:
int[,] A = new int[3, 4]; Số dòng
for (int i=0; i<A.GetLength(0); i++)
for (int j=0; j<A.GetLength(1); j++)
A[i, j] = i + j;
Số cộ t

BUSINESS INFORMATION TECHNOLOGY


7
Nhập một ma trận
 Nhập số liệu cho ma trận từ bàn phím
Console.Write("Nhap so dong va so cot: ");
int m = int.Parse(Console.ReadLine());
int n = int.Parse(Console.ReadLine());
int[,] A = new int[m, n];
for (int i=0; i<m; i++)
{
for (int j=0; j<n; j++)
{
Console.Write("A[{0},{1}] = ", i, j);
A[i, j] = int.Parse(Console.ReadLine());
}
}

BUSINESS INFORMATION TECHNOLOGY


8
Nhập một ma trận (tt)
 Nhập số liệu cho ma trận (cách khác)
Console.WriteLine("Nhap so dong va so cot: ");
int m = int.Parse(Console.ReadLine());
int n = int.Parse(Console.ReadLine());
int[,] A = new int[m, n];
Console.WriteLine("Nhap so lieu cho mang A: ");
for (int i=0; i<m; i++)
{
for (int j=0; j<n; j++)
{
Console.SetCursorPosition(5*j, i+4);
A[i, j] = int.Parse(Console.ReadLine());
}
}

BUSINESS INFORMATION TECHNOLOGY


9
Nhập một ma trận (tt)
 Tạo số liệu ngẫu nhiên cho ma trận
Console.Write("Nhap so dong va so cot: ");
int m = int.Parse(Console.ReadLine());
int n = int.Parse(Console.ReadLine());
int[,] A = new int[m, n];
Random cute = new Random();
for (int i=0; i<m; i++)
{
for (int j=0; j<n; j++)
{
A[i, j] = cute.Next(100);
}
}

BUSINESS INFORMATION TECHNOLOGY


10
In ma trận
 In ma trận ra màn hình:
for (int i=0; i<A.GetLength(0); i++)
{
for (int j=0; j<A.GetLength(1); j++)
{
Console.Write("{0} ", A[i, j]);
}
Console.WriteLine();
}
 A.GetLength(0)  trả về số dòng của M.trận
 A.GetLength(1)  trả về số cột của M.trận
BUSINESS INFORMATION TECHNOLOGY
11
Ví dụ 1:
 Nhập 2 số m, n. Khai báo mảng Amxn. Tạo số
liệu ngẫu nhiên cho mảng A. In mảng A ra màn
hình
Chép dán các đoạn CT ở các slide trước, sau đó thi hành
chương trình

BUSINESS INFORMATION TECHNOLOGY


12
Ví dụ 2:
 Tìm một ma trận con 2 x 2 trong ma trận mà
có tổng các phần tử là lớn nhất
int[,] A = {
{7, 1, 3, 3, 2, 1},
{1, 3, 9, 8, 5, 6},
{4, 6, 7, 9, 1, 0}
};
int MaxSum = int.MinValue; int sum;
for (int i=0; i<A.GetLength(0)-1; i++)
for (int j=0; j<A.GetLength(1)-1; j++)
{ sum = A[i, j] + A[i, j+1] + A[i+1, j] + A[i+1, j+1];
if (sum > MaxSum) MaxSum = sum;
}
Console.WriteLine("Tong lon nhat la: "+MaxSum);

BUSINESS INFORMATION TECHNOLOGY


13
Ví dụ 3:
 Tìm số lớn nhất và số nhỏ nhất của ma trận
Amxn
//Khai báo và tạo số liệu ngẫu nhiên cho mảng A mxn
//xử lý
int max = A[0,0], min = A[0,0];
for (int i=0; i<A.GetLength(0); i++)
for (int j=0; j<A.GetLength(1); j++)
{
if (max < A[i,j]) max = A[i,j];
if (min > A[i,j]) min = A[i,j];
}
Console.WriteLine("So lon nhat la: "+max);
Console.WriteLine("So nho nhat la: "+min);

BUSINESS INFORMATION TECHNOLOGY


14
Ví dụ 4:
 Tìm số lớn nhất và số nhỏ nhất trên mỗi
hàng của ma trận Amxn
//Khai báo và tạo số liệu ngẫu nhiên cho mảng A mxn
//xử lý
int max , min ;
for (int i=0; i<A.GetLength(0); i++)
{ max = A[i,0]; min = A[i,0];
for (int j=0; j<A.GetLength(1); j++)
{
if (max < A[i,j]) max = A[i,j];
if (min > A[i,j]) min = A[i,j];
}
Console.WriteLine("Dong {0}: {1} va {2}",i,max,min);
}

BUSINESS INFORMATION TECHNOLOGY


15
Ví dụ 5:
 Tính và In ra tam giác Pascal
//Khai báo ma trận vuông Anxn
//xử lý
for (int i=0; i<A.GetLength(0); i++)
{
Console.WriteLine();
for (int j=0; j<=i; j++)
{
if (j==0 || j==i) A[i,j]=1;
else A[i,j] = A[i-1,j-1] + A[i-1,j];
Console.Write("{0} ",A[i,j]);
}
}

BUSINESS INFORMATION TECHNOLOGY


Sao chép mảng
Lớp Array
17
Sao chép mảng
 Đôi khi chúng ta cần sao chép giá trị từ mảng
này đến mảng khác
 Nếu làm theo cách trực quan chúng ta sẽ sao chép
không chỉ các giá trị mà còn là tham chiếu đến mảng
Thay đổi một vài giá trị trong một mảng sẽ ảnh
hưởng đến các giá trị của mảng khác

int[] <tên_mảng_đích>=<tên_mảng_nguồn>;

Cách này chỉ sao chép giá trị:


Array.Copy(<mảng_nguồn>, <mảng_đích>);

BUSINESS INFORMATION TECHNOLOGY


Mảng răng cưa (Jagged Array) 18

 Là mảng mà số phần tử trong mỗi chiều có thể


khác nhau
 Ví dụ khai báo mảng răng cưa có 2 chiều
<kiểu dữ liệu> [ ] [ ] <tên mảng> ;
Nhận xét :
 là 1 mảng, mỗi phần tử trong mảng lại là 1
mảng khác

BUSINESS INFORMATION TECHNOLOGY


19
Ví dụ
Mảng có 2 chiều, chiều thứ nhất có 2 phần tử
Phần tử thứ 1 chiều thứ nhất có 2 phần tử
Phần tử thứ 2 chiều thứ nhất có 5 phần tử

BUSINESS INFORMATION TECHNOLOGY


20
Khai báo (Ví dụ)
int [ ] [ ] list ; //khai báo
list = new int[ 2][ ] ;
list[0] = new int [2] ;
list [1] = new int [5] ;

BUSINESS INFORMATION TECHNOLOGY


21
Một số lưu ý khi sử dụng mảng
A.Length : số phần tử của mảng A
A.GetLength(0) : số phần tử chiều thứ 1 (hoặc số
dòng của ma trận A)
A.GetLength(1) : số phần tử chiều thứ 2 (hoặc số
cột của ma trận A)
A.GetLength(n-1) : số phần tử chiều thứ n của
mảng A n chiều
A.Rank : số chiều của mảng A

Cấu trúc lặp foreach hữu hiệu hơn là dùng for !!!
BUSINESS INFORMATION TECHNOLOGY
22
Bài tập tại lớp (1):
 Đọc ma trận Amxn. Cho biết số lớn nhất và nhỏ nhất
của mỗi cột

BUSINESS INFORMATION TECHNOLOGY


23
Bài tập tại lớp (2):
 Đọc ma trận vuông Anxn. Cho biết ma trận có đối xứng
qua đường chéo chính

BUSINESS INFORMATION TECHNOLOGY


24
Bài tập tại lớp (3):
 Đọc ma trận vuông Anxn. Cho biết tổng các phần tử
dương và chia hết cho 5 ở tam giác dưới đường chéo
chính (kể cả chéo chính)

BUSINESS INFORMATION TECHNOLOGY


Bài tập về nhà 25

 Làm các bài tập trong file BaiTapMang.docx


trừ các bài đã sửa trên lớp

BUSINESS INFORMATION TECHNOLOGY

You might also like