Upload
vonhan
View
233
Download
6
Embed Size (px)
Citation preview
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
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
NỘI DUNG
2
KHÁI NIỆM MẢNG 2 CHIỀU
3
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 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
5
Ma trận
Khái niệm
6
0
…
n-1
0 1 … m-1
An,m
0
…
n-1
An
0 … n-1
Ma trận vuông
Ma trận vuông
Khái niệm
7
0
…
n-1
An
0 … n-1
0
…
n-1
0 … n-1
0
…
n-1
0 … n-1
dòng = cột dòng > cột dòng < cột
0
…
n-1
An
0 … n-1
0
…
n-1
0 … n-1
0
…
n-1
0 … n-1
dòng + cột = n-1 dòng + cột > n-1 dòng + cột < n-1
KHAI BÁO MẢNG 2 CHIỀU
8
Kiể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)
9
int[,] a; // mảng 2 chiều
int[][] a; // mảng răng cưa 2 chiều
<kiểu cơ sở>[,] <tên mảng>;
<kiểu cơ sở>[][] <tên mảng>;
Khai báo (System.Array)
10
int[,] b; b = new int[3,5];
Mỗi dòng có thể có số lượng phần tử khác nhau không?
Ví dụ: Khai báo mảng 2 chiều a có 3 dòng, 5 cột
int[][] a; a = new int[3][]; a[0] = new int[5]; a[1] = new int[5]; a[2] = new int[5];
Khai báo (System.Array)
11
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];
Khởi tạo giá trị:
Khai báo (System.Array)
12
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}};
1 5 9 7 5
2 7 3 8 4
8 4 3 7 5
TRUY XUẤT DỮ LIỆU KIỂU MẢNG 2 CHIỀU
13
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
Truy xuất phần tử
14
NHẬP, XUẤT MẢNG 2 CHIỀU
15
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[n-1][m-1]
Nhập mảng 2 chiều
16
Kiểu mảng răng cưa
Nhập mảng 2 chiều
17
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()); } } }
Kiể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()); } } }
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”.
Xuất mảng 2 chiều
19
Kiể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); }
Kiểu mảng nhiều chiều
Xuất mảng 2 chiều
21
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); }
BÀI TẬP THỰC HÀNH
22
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 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚].
Bài tập thực hành
Bà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
Bà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
Bà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
Bà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
Bà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
Bài 15: Viết chương trình nhân 2 ma trận 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑚𝑚] và 𝐵𝐵[𝑚𝑚 𝑥𝑥 𝑝𝑝]. Biết rằng:
𝐴𝐴 𝑛𝑛 𝑥𝑥 𝑚𝑚 ∗ 𝐵𝐵 𝑚𝑚 𝑥𝑥 𝑝𝑝 = 𝐶𝐶[𝑛𝑛 𝑥𝑥 𝑝𝑝]
và 𝐶𝐶𝑖𝑖𝑖𝑖 = ∑ 𝐴𝐴𝑖𝑖𝑖𝑖 .𝐵𝐵𝑖𝑖𝑖𝑖𝑚𝑚
𝑖𝑖=1
Bài tập thực hành
Bà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
Bà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
Input: 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 Ví dụ:
Bài tập thực hành
Input.txt Output.txt
3 4 1 2 3 4
10 11 12 5
9 8 7 6
Bài 18: Bảng kết quả của một giải vô địch bóng đá được cho bởi ma trận 𝐴𝐴[𝑛𝑛 𝑥𝑥 𝑛𝑛] (có n đội tham gia và 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: a) In ra màn hình tất cả các đội có số điểm lớn nhất. b) In ra màn hình tất cả các đội có số trận thắng nhiều hơn
thua? c) Hãy chỉ ra các đội không thua trận nào?
Bài tập thực hành
Input: - 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. Output - Dòng 1 là kết quả câu a - Dòng 2 là kết quả câu b - Dòng 2 là kết quả câu c Ví dụ:
Bài tập thực hành
Input.txt Output.txt
4 0 0 0 1 3 0 3 1 3 0 0 1 1 1 1 0
2 2 2 4
Bà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
Input: - 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. Output - Dòng 1: Khoảng cách từ trạm cứu thương đến hộ dân xa nhất (làm tròn đến 2 chữ số thập phân). - Dòng 2: Cặp số nguyên (x , y) là tọa độ trạm cứu thương. Ví dụ:
Bài tập thực hành
Input.txt Output.txt
5 1 5 2 3 6 8 9 12 7 3
6.4 (6 , 8)