MẢNG 2 CHIỀU (2D Array)anhtt/Slidesss/KTLT182/Chap4.pdf · 2018-03-29 · Mảng 2 chiều...

Post on 10-Jul-2018

233 views 6 download

Transcript of MẢNG 2 CHIỀU (2D Array)anhtt/Slidesss/KTLT182/Chap4.pdf · 2018-03-29 · Mảng 2 chiều...

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)