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

Bài giảng Kỹ thuật lập trình 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 (1.29 MB, 33 trang )

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

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


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


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

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


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
<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 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++)
{
Xử lý phần tử a[d][c]

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

}
}

12


Nhập/xuất ma trận số nguyên
Khai báo
#include<stdio.h>
#include<conio.h>
#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
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

18


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
5. Tìm cột có tổng nhỏ nhất

21

21


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


×