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 Khái niệm 4... Mảng 2 chiều thực chất là mảng 1 c
Trang 1Click 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)
Trang 3KHÁI NIỆM MẢNG 2 CHIỀU
Trang 4C# 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)
Khái niệm
4
Trang 5Mả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
Khái niệm
Trang 8KHAI BÁO MẢNG 2 CHIỀU
8
Trang 9Kiểu mảng nhiều chiều:
<kiểu cơ sở> [,] <tên mảng> ;
Kiểu mảng răng cưa:
<kiểu cơ sở> [][] <tên mảng> ;
Khai báo (System.Array)
int[,] a; // mảng 2 chiều
int[][] a; // mảng răng cưa 2 chiều
Trang 10<kiểu cơ sở> [,] <tên mảng> ; <kiểu cơ sở> [][] <tên mảng> ;
Khai báo (System.Array)
int[][] a;
a = new int[3][];
a[0] = new int[5];
a[1] = new int[5];
a[2] = new int[5];
Trang 11Khai 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];
Trang 12Khởi tạo giá trị:
Khai báo (System.Array)
Trang 13TRUY XUẤT DỮ LIỆU
KIỂU MẢNG 2 CHIỀU
Trang 14Thô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
Truy xuất phần tử
14
Trang 15NHẬP, XUẤT MẢNG 2 CHIỀU
Trang 16Yêu cầu: Nhập vào từ bàn phím một mảng a
Trang 17Kiểu mảng răng cưa
Nhập mảng 2 chiều
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<rows; i++){
a[i] = new int[cols];
for(int j=0; j<cols; j++){
Console.Write("a[{0}][{1}] = ", i, j);
a[i][j] =
Convert.ToInt32(Console.ReadLine());
} }
}
Trang 18Kiểu mảng nhiều chiều
Nhập mảng 2 chiều
18
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());
} }
}
Trang 19Yê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”
Xuất mảng 2 chiều
Trang 20Kiểu mảng răng cưa
Xuất mảng 2 chiều
20
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);
}
Trang 21Kiểu mảng nhiều chiều
Xuất mảng 2 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);
}
Trang 22BÀI TẬP THỰC HÀNH
22
Trang 23Bà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
Input:
- 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
- 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
Trang 24Bà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
Trang 25Bà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
Trang 26Bài 5: Viết hàm thêm một hàng tại vị trí thứ k
(0 ≤ 𝑘𝑘 ≤ 𝑛𝑛) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài 6: Viết hàm thêm một cột tại vị trí thứ k
(0 ≤ 𝑘𝑘 ≤ 𝑚𝑚) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài tập thực hành
Trang 27Bài 7: Viết hàm xóa một hàng tại vị trí thứ k ( 0 ≤ 𝑘𝑘 < 𝑛𝑛 ) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài 8: Viết hàm xóa một cột tại vị trí thứ k ( 0 ≤ 𝑘𝑘 < 𝑚𝑚 ) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài tập thực hành
Trang 28Bài 9: Viết hàm hoán vị 2 hàng thứ k và l
( 0 ≤ 𝑘𝑘, 𝑙𝑙 < 𝑛𝑛 ) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài 10: Viết hàm hoán vị 2 cột thứ k và l
( 0 ≤ 𝑘𝑘, 𝑙𝑙 < 𝑚𝑚 ) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài tập thực hành
Trang 29Bài 11: Viết hàm tính tổng các phần tử của hàng thứ k ( 0 ≤ 𝑘𝑘 < 𝑛𝑛 ) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài 12: Viết hàm tính tổng các phần tử của cột
thứ k ( 0 ≤ 𝑘𝑘 < 𝑚𝑚 ) trong mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
Bài tập thực hành
Trang 30Bài 13: Viết hàm sắp xếp mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
sao cho tổng của các dòng tăng dần từ trên xuống dưới
Bài 14: Viết hàm sắp xếp mảng 2 chiều 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚]
sao cho tổng của các cột tăng dần từ trái sang
phải
Bài tập thực hành
Trang 31Bài 15: Viết chương trình nhân 2 ma trận
Trang 32Bài 16: Cho ma trận vuông 𝐴𝐴 𝑛𝑛 𝑥𝑥 𝑛𝑛 Viết các hàm sau:
a) Tính tổng các phần tử nằm trên đường chéo chính b) Tính tổng các phần tử nằm trên đường chéo phụ
c) Tính tổng các phần tử nằm phía trên đường chéo
chính d) Tính tổng các phần tử nằm phía trên đường chéo
phụ
Bài tập thực hành
Trang 33Bài 17: Cho hai số m và n Hãy tạo một ma trận xoáy ốc từ ngoài vào trong theo chiều kim đồng
hồ với kích thước của ma trận là 𝑚𝑚 𝑥𝑥 𝑛𝑛
(1 ≤ 𝑚𝑚, 𝑛𝑛 ≤ 100)
Ví dụ: 𝑚𝑚 = 𝑛𝑛 = 4 thì ta có ma trận xoáy ốc như sau:
Bài tập thực hành
Trang 34Input: Chứa hai số nguyên dương m và n
Output: Đưa ra các dòng của ma trận xoáy ốc
Trang 35Bài 18: Bảng kết quả của một giải vô địch bóng đá
mỗi đội phải đá vòng tròn 1 lượt, tức là mỗi đội phải
đá n – 1 trận)
Trong đó:
+ Tất cả các phần tử thuộc đường chéo chính bằng 0 + 𝐴𝐴[𝑖𝑖][𝑗𝑗] = 3 nếu đội i thắng đội j, và đội i có 3 điểm
+ 𝐴𝐴[𝑖𝑖][𝑗𝑗] = 1 nếu đội i hòa với đội j, và đội i có 1 điểm
+ 𝐴𝐴[𝑖𝑖][𝑗𝑗] = 0 nếu đội i thua đội j, và đội i có 0 điểm
Hãy thực hiện các công việc sau:
Trang 36Input:
- Dòng 1 chứa số nguyên dương n (n <= 50);
- n dòng tiếp theo, mỗi dòng chứa n số nguyên là số điểm cả mỗi đội
Trang 37Bài 19: Tại một ngôi làng nọ, người ta cần đặt
trạm cứu thương tại một hộ dân nào đó sao cho
khoảng cách từ trạm đến hộ dân xa trạm nhất là nhỏ nhất Hãy tìm vị trí đặt trạm cứu thương trong n hộ dân của ngôi làng đó Biết rằng vị trí của mỗi hộ dân được xác định bằng cặp tọa độ nguyên (x , y)
Bài tập thực hành
Trang 38Input:
- Dòng 1 chứa số nguyên dương n (n <= 50);
- n dòng tiếp theo, mỗi dòng chứa cặp số nguyên (x , y) là tọa độ của hộ dân