Lập trình C Chương 2. Mảng hai chiều (3 tiết)

Trần Minh Thái Email: minhthai@huflit.edu.vn Website: www.minhthai.edu.vn Cập nhật: 21/02/2017

1

Nội dung

• Khái niệm

• Khai báo

• Các thao tác cơ bản trên ma trận

• Thao tác trên ma trận vuông

• Bài tập

2

3

KHÁI NIỆM VÀ KHAI BÁO

Khái niệm

Cột 0

Cột 1

Cột 2

Cột 3

Cột 4

Cột 5

Dòng 0

Dòng 1

Dòng 2

Dòng 3

4

Ma trận có 4 dòng 6 cột (kích thước 4 x 6)

Khái niệm

• Kiểu dữ liệu mảng 2 chiều được tổ chức theo dạng bảng.

• Mỗi dòng là mảng 1 chiều

• Kích thước được xác định bởi số dòng và số cột

• Chỉ số dòng và cột được tính từ 0

5

Khai báo ma trận

• Cú pháp

tên ma trận [số dòng][số cột];

• VD1: khai báo ma trận số nguyên a có 10 dòng và 15 cột

int a[10][15];

• VD2: khai báo ma trận số thực b có 25 dòng và 10 cột

float b[25][10];

6

Định nghĩa kiễu dữ liệu

ể ơ ậ ả ệ Đ  đ n gi n trong vi c khai báo ma tr n:

#define MAX 100

typedef  matran[MAX][MAX];

ố ậ VD: Khai báo ma tr n các s  nguyên a

#define MAX 100

typedef int matran[MAX][MAX];

7

matran a;

Khai báo và khởi gán

tên ma trận[số dòng][số cột]={{gt11, gt12, …},

{gt21, gt22, …},

{gtk1, gtk2, …}};

VD: int a[3][4] = {{2,3,9,4},

{5,6,7,6},

{2,9,4,7} };

8

Truy xuất phần tử

́

̀

ự

̀ ́

́

̀

̀

̉ ̉

̀ ́ Đê  truy  xuâ t  ca c  tha nh  phâ n  cua  ma  tr n  ta  d a  va o  chi sô  do ng va  chi sô  côt

̉ ̉ ̣

ỉ ố ộ

ỉ ố

Cú pháp: tên ma tr n[ch  s  dòng][ch  s  c t]

•VD:

x = a[1][2]; // x = 7

ị ạ

ỉ ố

9

ậ // C p nh t giá tr  t

i ch  s  dòng 2, c t 3 thành 10

a[2][3] = 10;

10

CÁC THAO TÁC XỬ LÝ CƠ BẢN

Các thao tác

• Nhập/ xuất

• Tìm kiếm

• Đếm

• Tính tổng/ trung bình

• Sắp xếp dòng/ cột

• Xóa dòng/ cột

• Chèn thêm dòng/ cột

11

Cấu trúc lệnh xử lý phổ biến

• Sử dụng 2 vòng lặp lồng nhau để duyệt ma trận

• Mỗi lần lặp sẽ duyệt từng dòng của ma trận

• Gọi sd là số dòng, sc là số cột và a là ma trận. Cấu trúc duyệt

tổng quát:

for(int d=0; d<=sd-1; d++)

{

for(int c=0; c<=sc-1; c++)

{

Duy t dòng d  ủ c a ma tr n a

Xử lý phần tử a[d][c]

}

}

12

Nhập/xuất ma trận số nguyên

#include #include

Khai báo

#define MAX 100 typedef int matran[MAX][MAX];

void NhapKichThuoc(int &sd, int &sc); void Nhap(matran a, int sd, int sc); void Xuat(matran a, int sd, int sc);

13

Nhập/xuất ma trận số nguyên

void NhapKichThuoc(int &sd, int &sc) { printf("Nhap so dong: "); scanf("%d", &sd); printf("Nhap so cot: "); scanf("%d", &sc); }

14

Nhập/xuất ma trận số nguyên

void Nhap(matran a, int sd, int sc) { for (int d = 0; d < sd; d++) { for (int c = 0; c < sc; c++) { printf("Nhap gia tri [%d][%d]: ", d, c); scanf("%d", &a[d][c]); } } }

15

Nhập/xuất ma trận số nguyên

void Xuat(matran a, int sd, int sc) { for (int d = 0; d < sd; d++) { for (int c = 0; c < sc; c++) { printf("%d\t", a[d][c]); } printf("\n"); } }

16

Nhập/xuất ma trận số nguyên

int main() { matran a; int sd, sc; NhapKichThuoc(sd, sc); printf("Nhap gia tri cho ma tran:\n"); Nhap(a, sd, sc); printf("Cac phan tu trong ma tran\n"); Xuat(a, sd, sc); getch(); return 0; }

17

Minh họa thực thi của chương trình

18

Nhap so dong cua ma tran: 3 Nhap so cot cua ma tran: 4 Nhap gia tri cho ma tran: Nhap gia tri [0][0]: 1 Nhap gia tri [0][1]: 2 Nhap gia tri [0][2]: 3 Nhap gia tri [0][3]: 4 Nhap gia tri [1][0]: 5 Nhap gia tri [1][1]: 6 Nhap gia tri [1][2]: 7 Nhap gia tri [1][3]: 8 Nhap gia tri [2][0]: 9 Nhap gia tri [2][1]: 10 Nhap gia tri [2][2]: 11 Nhap gia tri [2][3]: 12 Cac phan tu trong ma tran 1 2 3 4 5 6 7 8 9 10 11 12

Bài tập nhập/xuất

ậ ố

ế

Cho ma tr n s  nguyên a g m sd dòng và sc c t. Vi

t các

hàm sau:

1.

ẫ Phát sinh giá tr  ng u nhiên cho ma tr n

ầ ử ẻ

2. Xu t các ph n t

l

ầ ử

3. Xu t các ph n t

là s  nguyên t

ầ ử

ơ

4. Xu t các ph n t

ị ớ  có giá tr  l n h n x

19

Phát sinh giá trị ngẫu nhiên

void PhatSinh(matran a, int sd, int sc) { for (int d = 0; d <= sd - 1; d++) { for (int c = 0; c <= sc - 1; c++) { a[d][c] = rand() % MAX; } } }

20

Bài tập tìm kiếm

ế ậ ố Cho ma tr n s  nguyên, vi t các hàm:

1. Tìm ph n t

ầ ử ớ ấ  l n nh t

ầ ử ớ ị 2. Tìm v  trí ph n t ấ  l n nh t

ầ ử ủ ầ ấ ị ệ 3. Tìm v  trí xu t hi n đ u tiên c a ph n t ị  có giá tr

x

ổ ớ ấ 4. Tìm dòng có t ng l n nh t

21

21

ộ ổ ỏ ấ 5. Tìm c t có t ng nh  nh t

Tính tổng của 1 dòng trong ma trận a

Cột 0

Cột 1

Cột 2

Cột 3

Cột sc-1

Dòng 0

Dòng 1

Dòng 2

… … … … … …

Dòng sd- 1

Tổng dòng 2 = a[2][0] + a[2][1] + a[2][2] + … + a[2][sc-1]

 Tổng dòng k = a[k][0] + a[k][1] + a[k][2] + … + a[k][sc-1]

22

Tính tổng của 1 dòng trong ma trận a

Gọi s là tổng dòng k s = a[k][0] + a[k][1] + a[k][2] + … + a[k][sc-1]

int s = 0; for(int i=0; i<=sc -1; i++) {

s = s + a[k][i];

23

}

Tính tổng của 1 cột trong ma trận a

Cột 0

Cột 1

Cột 2

Cột 3

Cột sc-1

Dòng 0

Dòng 1

Dòng 2

… … … … … …

Dòng sd- 1

Tổng cột 2 = a[0][2] + a[1][2] + a[2][2] + … + a[sd-1][2]

 Tổng cột k = a[0][k] + a[1][k] + a[2][k] + … + a[sd-1][k]

24

Tính tổng của 1 cột trong ma trận a

Gọi s là tổng cột k s = a[0][k] + a[1][k] + a[2][k] + … + a[sd-1][k]

int s = 0; for(int i=0; i<=sd -1; i++) {

s = s + a[i][k];

25

}

Bài tập xóa

ế ậ ố Cho ma tr n s  nguyên, vi t các hàm:

ị ớ ấ ứ • Xóa dòng có ch a giá tr  l n nh t

• Xóa c t có ch a giá tr  x

26

26

ứ ộ ị

27

MA TRẬN VUÔNG

Ma trận vuông

• Ma tr n có s  dòng và s  c t b ng nhau

ố ộ ằ ậ ố

• Đ

́ ́ ̀ ̀ ươ ̉ ̉ ̣ ́ ng che o chính : chi sô  do ng = chi sô  côt

̀ ́ ́ ̉ ̣ ̉ ụ  chi sô  côt+chi sô  do ng =

0,0

0,5

1,1

1,4

2,2 2,3

3,2 3,3

4,1

4,4

5,0

5,5

28

̀ ướ ươ • Đ k/th ́ ng che o ph : c ­ 1

Bài tập nhập/xuất

ậ ố ướ ế Cho  ma  tr n  vuông  s   nguyên  kích  th c  n,  vi t  các

hàm:

ậ ậ 1. Nh p ma tr n

ấ ậ 2. Xu t ma tr n

3. Xu t các ph n t

ầ ử ấ ộ ườ thu c đ ng chéo chính

4. Xu t các ph n t

29

ầ ử ấ ộ ườ ụ thu c đ ng chéo ph

Bài tập nhập/xuất

ậ ố ướ ế c  n,  vi t  các

Cho  ma  tr n  vuông  s   nguyên  kích  th hàm:

ầ ộ ướ ủ thu c ph n tam giác phía d i c a

• Xu t các ph n t đ

30

ấ ườ ầ ử ng chéo chính

Bài tập nhập/xuất

ậ ố ướ ế c  n,  vi t  các

Cho  ma  tr n  vuông  s   nguyên  kích  th hàm:

ử ầ ộ thu c  ph n  tam  giác  phía  trên

31

ấ ườ ụ ầ • Xu t  các  ph n  t ng chéo ph đ

Bài tập

Cho ma trận vuông số nguyên kích thước n, viết các hàm:

1.

Nhập ma trận có các phần tử đối xứng qua đường chéo chính

2.

Tính tổng các phần tử không thuộc đường chéo chính

3.

Tính giá trị trung bình các phần tử thuộc đường chéo phụ

4.

Tìm phần tử có giá trị lớn nhất thuộc đường chéo chính

32

Q&A

33