Tải bản đầy đủ (.pptx) (28 trang)

Bài giảng lập trình c nâng cao chương 2 ma trận

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (383.71 KB, 28 trang )

TRẦN MINH THÁI
Email:
Website: www.minhthai.edu.vn
Cập nhật: 05 tháng 01 năm 2015
Chương 2. Ma trận
#2
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
#3
Khái niệm
Kiểu dữ liệu ma trận được tổ chức theo dạng bảng
2 chiều. Thực chất mỗi dòng của ma trận 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
#4
Khái niệm
Dòng 0
Dòng 1
Dòng 2
Dòng 3
Cột
0
Cột
1
Cột
2


Cột
3
Cột
4
Cột
5
Ma trận có 4 dòng 6 cột (kích thước 4 x 6)
#5
Khai báo ma trận
Cú pháp
<KDL> 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 <KDL> matran[MAX][MAX];
VD: Khai báo ma trận các số nguyên a
#define MAX 100
typedef int matran[MAX][MAX];
matran a;
#7
Khai báo và khởi gán
<KDL> 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 các thành phần của ma trận ta dựa vào chỉ
số dòng và chỉ 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
// Cập nhật giá trị tại chỉ số dòng 2, cột 3 thành 10
a[2][3] = 10;
#9
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
#10
Các thao tác
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++)
{
Xử lý phần tử a[d][c]
}
}
Duyệt dòng d
của ma trận a
#11
Nhập/xuất ma trận số nguyên
Khai báo
#define MAX 100
typedef int matran[MAX][MAX];
void NhapMT(matran a, int sd, int sc);
void XuatMT(matran a, int sd, int sc);
#12
Nhập/xuất ma trận số nguyên
void NhapMT(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]);
}
}
}
#13
Nhập/xuất ma trận số nguyên

void XuatMT(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”);
}
}
#14
Nhập/xuất ma trận số nguyên
void main()
{
matran a;
int sd, sc;
printf("Nhap so dong cua ma tran: ");
scanf(“%d”, &sd);
printf("Nhap so cot cua ma tran: “);
scanf(“%d”, &sc);
NhapMT(a, sd, sc);
printf(“Cac phan tu trong ma tran\n”);
XuatMT(a, sd, sc);
}
#15
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:
Phát sinh giá trị ngẫu nhiên cho ma trận

Xuất các phần tử lẻ
Xuất các phần tử là số nguyên tố
Xuất các phần tử có giá trị lớn hơn x
#16
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;
}
}
}
1. Sử dụng thư viện <stdlib.h> và <time.h>
2. Dùng hàm srand((unsigned int) time(NULL))
ở đầu hàm main()
#17
17
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
5. Tìm cột có tổng nhỏ nhất
#18
Tính tổng của 1 dòng trong ma trận a
Dòng 0

Dòng 1
Dòng 2
Dòng sd-1
Cột
0
Cột
1
Cột
2
Cột
3
Cột
sc-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]
#19
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];
}
#20
Tính tổng của 1 cột trong ma trận a
Dòng 0
Dòng 1
Dòng 2
Dòng sd-1
Cột
0
Cột
1
Cột
2
Cột
3
Cột
sc-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]
#21
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];
}
#22
22
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
#23
Ma trận vuông
Ma trận có số dòng và số cột bằng nhau
Đường chéo chính: chỉ số dòng = chỉ số cột
Đường chéo phụ: chỉ số cột+chỉ số dòng = k/thước - 1
0,0 0,5
1,1 1,4
2,2 2,3
3,2 3,3
4,1 4,4
5,0 5,5
#24
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:
Nhập ma trận
Xuất ma trận

Xuất các phần tử thuộc đường chéo chính
Xuất các phần tử thuộc đường chéo phụ
#25
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:
Xuất các phần tử thuộc phần tam giác phía dưới của
đường chéo chính

×