Click to edit Master subtitle style
MẢNG 2 CHIỀU
(2D Array)
Khoa Công nghệ thông tin
Trường Đại học Ngoại ngữ - Tin học TP.HCM (HUFLIT)
1
NỘI DUNG
Khái niệm
Khai báo
Truy xuất dữ liệu kiểu mảng 2 chiều
Nhập, xuất mảng 2 chiều
Bài tập thực hành
2
KHÁI NIỆM MẢNG 2 CHIỀU
3
Khái niệm
C# hỗ trợ các kiểu mảng sau:
Mảng 1 chiều (single-dimensional array)
Mảng nhiều chiều (multi-dimensional array)
Mảng răng cưa (jagged array)
4
Khái niệm
Mảng 2 chiều thực chất là mảng 1 chiều mà mỗi
phần tử của nó là một mảng khác.
Mảng có từ 2 chiều trở lên được gọi chung là
mảng nhiều chiều.
Mảng nhiều chiều được dùng để lưu các dữ
liệu dạng bảng, ma trận trong chương trình.
5
Khái niệm
Ma trận
0
1
… m-1
0
0
n-1
0
An
…
…
An,m
… n-1
n-1
Ma trận vuông
6
Khái niệm
Ma trận vng
0
… n-1
0
0
… n-1
0
…
…
n-1
n-1
n-1
dịng = cột
dịng > cột
dịng < cột
0
0
0
… n-1
0
… n-1
0
n-1
dòng + cột = n-1
…
n-1
… n-1
0
…
…
An
… n-1
0
…
An
0
n-1
dòng + cột > n-1
dòng + cột < n-1
7
KHAI BÁO MẢNG 2 CHIỀU
8
Khai báo (System.Array)
Kiểu mảng nhiều chiều:
<kiểu cơ sở>[,] <tên mảng>;
int[,] a;
// mảng 2 chiều
Kiểu mảng răng cưa:
<kiểu cơ sở>[][] <tên mảng>;
int[][] a;
// mảng răng cưa 2 chiều
9
Khai báo (System.Array)
Ví dụ: Khai báo mảng 2 chiều a có 3 dịng, 5 cột
<kiểu cơ sở>[,] <tên mảng>;
<kiểu cơ sở>[][] <tên mảng>;
Mỗi dịng có thể có
số lượng phần tử
khác nhau không?
int[][] a;
a = new int[3][];
a[0] = new int[5];
a[1] = new int[5];
a[2] = new int[5];
int[,] b;
b = new int[3,5];
10
Khai báo (System.Array)
int[][] a;
a = new int[5][];
a[0] = new int[6];
a[1] = new int[5];
a[2] = new int[2];
a[3] = new int[3];
a[4] = new int[7];
11
Khai báo (System.Array)
Khởi tạo giá trị:
1
5
9
7
5
2
7
3
8
4
8
4
3
7
5
int[][] a = new int[3][] {
new int[5]{1,5,9,7,5},
new int[5]{2,7,3,8,4},
new int[5]{8,4,3,7,5}};
int[,] b = new int[3,5]{
{1,5,9,2,3},
{2,7,3,6,4},
{8,4,3,7,9}};
12
TRUY XUẤT DỮ LIỆU
KIỂU MẢNG 2 CHIỀU
13
Truy xuất phần tử
Thông qua chỉ số (index) tương tự như mảng 1
chiều:
Kiểu mảng nhiều chiều: a[2,3];
Kiểu mảng răng cưa: a[2][3];
Lưu ý:
Index phải là số nguyên dương.
Index phải nằm trong phạm vi kích thước mảng đã
được khai báo, nếu khơng .NET sẽ báo lỗi
IndexOutOfRangeException
14
NHẬP, XUẤT MẢNG 2 CHIỀU
15
Nhập mảng 2 chiều
Yêu cầu: Nhập vào từ bàn phím một mảng a
gồm n dòng m cột.
Ý tưởng:
Nhập số dòng n và số cột m của mảng.
Khởi tạo mảng có n dòng và m cột.
Nhập từng phần tử của mảng: từ a[0][0] đến a[n1][m-1]
16
Nhập mảng 2 chiều
Kiểu mảng răng cưa
public static void NhapMang(out int[][] a){
int rows, cols;
Console.Write("Nhap so dong n = ");
rows = Convert.ToInt32(Console.ReadLine());
Console.Write("Nhap so cot m = ");
cols = Convert.ToInt32(Console.ReadLine());
a = new int[rows][];
for(int i=0; i
a[i] = new int[cols];
for(int j=0; j
Console.Write("a[{0}][{1}] = ", i, j);
a[i][j] =
Convert.ToInt32(Console.ReadLine());
}
}
}
17
Nhập mảng 2 chiều
Kiểu mảng nhiều chiều
public static void NhapMang(out int[,] a){
int rows, cols;
Console.Write("Nhap so dong cua mang = ");
rows = Convert.ToInt32(Console.ReadLine());
Console.Write("Nhap so cot cua mang = ");
cols = Convert.ToInt32(Console.ReadLine());
a = new int[rows,cols];
for (int i = 0; i < a.GetLength(0); i++){
for (int j = 0; j < a.GetLength(1); j++){
Console.Write("a[{0},{1}] = ", i, j);
a[i,j] =
Convert.ToInt32(Console.ReadLine());
}
}
}
18
Xuất mảng 2 chiều
Yêu cầu: In ra màn hình mảng a gồm n dòng m
cột.
Ý tưởng:
Duyệt mảng từ dòng 0 đến dòng n-1;
Tại mỗi dòng, in giá trị của phần tử a[i][j] (j: 0 →
m-1), mỗi phần tử cách nhau bởi dấu khoảng
trắng.
Kết thúc mỗi dòng chèm thêm ký tự xuống dòng
“\n”.
19
Xuất mảng 2 chiều
Kiểu mảng răng cưa
public static void XuatMang(int[][] a){
for (int i = 0; i < a.Length; i++){
for (int j = 0; j < a[i].Length; j++){
Console.Write(a[i][j] + " ");
}
Console.WriteLine();
}
}
static void Main(string[] args){
int[][] a;
NhapMang(out a);
XuatMang(a);
}
20
Xuất mảng 2 chiều
Kiểu mảng nhiều chiều
public static void XuatMang(int[,] a){
for (int i = 0; i < a.GetLength(0); i++){
for (int j = 0; j < a.GetLength(1); j++){
Console.Write(a[i,j] + " ");
}
Console.WriteLine();
}
}
static void Main(string[] args){
int[,] a;
NhapMang(out a);
XuatMang(a);
}
21
BÀI TẬP THỰC HÀNH
22
Bài tập thực hành
Bài 1: Viết hàm đọc mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚] từ
file Input.txt. Lập ma trận B là ma trận chuyển vị
của A (𝐵𝐵[𝑖𝑖, 𝑗𝑗] = 𝐴𝐴[𝑗𝑗, 𝑖𝑖]), ghi ma trận B vào file
Output.txt.
Input:
- Dòng 1 chứa 2 số nguyên dương n,m;
- n dòng tiếp theo, mỗi dòng chứa m số nguyên là giá trị các phần tử
trong ma trận A.
Output:
- Ma trận B là ma trận chuyển vị của ma trận A.
Bài tập thực hành
Bài 2: Viết hàm tìm chỉ số phần tử có giá trị lớn
nhất trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]. Xuất chỉ số và
giá trị của phần tử lớn nhất ra màn hình.
Bài tập thực hành
Bài 3: Viết hàm tìm phần tử lớn (nhỏ) nhất trong
dòng thứ k (0 ≤ 𝑘𝑘 < 𝑛𝑛) của mảng 2 chiều
𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚].
Bài 4: Viết hàm tìm phần tử lớn (nhỏ) nhất trong
cột thứ k 0 ≤ 𝑘𝑘 < 𝑚𝑚 của mảng 2 chiều
𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚].