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
• 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
ố ậ 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
{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
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