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

Bài giảng Lập trình C nâng cao‎: Chương 2 - Trần Minh Thái

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 (263.13 KB, 28 trang )

Chương 2. Ma trận

TRẦN MINH THÁI
Email:
Website: www.minhthai.edu.vn
Cập nhật: 05 tháng 01 năm 2015


Nội dung
#2

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


Khái niệm
#3

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


Khái niệm
#4
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

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


Khai báo ma trận
#5

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];


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

Để đơ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;


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

<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} };



Truy xuất phần tử
#8

Để 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;


Các thao tác
#9

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


Các thao tác
#10


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]
}
}


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

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);


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

void NhapMT(matran a, int sd, int sc)
{

for(int d=0; d{
for(int c=0; c{
printf("Nhap gia tri [%d][%d]: “, d, c);
scanf(“%d”, &a[d][c]);
}
}
}


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

void XuatMT(matran a, int sd, int sc)
{
for(int d=0; d{
for(int c=0; c{
printf(“%d\t”, a[d][c]);
}
printf(“\n”);
}
}


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


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);
}


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

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


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

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()


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

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

17


Tính tổng của 1 dịng trong ma trận a
#18
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]


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

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];
}


Tính tổng của 1 cột trong ma trận a
#20
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]


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

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];
}


Bài tập xóa
#22


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

22


Ma trận vng
#23

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

4,1
5,0

1,4
2,2

2,3

3,2

3,3
4,4

5,5


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

Cho ma trận vng số ngun 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ụ


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

Cho ma trận vng số ngun 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


×