Bài giảng Lập trình C - Chương 2: Mảng hai chiều - Trần Minh Thái
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình C - Chương 2: Mảng hai chiều - Trần Minh Thái", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- bai_giang_lap_trinh_c_chuong_2_mang_hai_chieu_tran_minh_thai.pptx
Nội dung text: Bài giảng Lập trình C - Chương 2: Mảng hai chiều - Trần Minh Thái
- 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
- KHÁI NIỆM VÀ KHAI BÁO 3
- Khái niệm Cột Cột Cột Cột Cột Cột 0 1 2 3 4 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 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]; matran a; 7
- 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 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 10
- 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 Xử lý phần tử a[d][c] của ma trận a } } 12
- Nhập/xuất ma trận số nguyên Khai báo #include #include #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 Cột Cột Cột Cột 0 1 2 3 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; 푠 −1 for(int i=0; i<=sc -1; i++) 푠 = [푖] { 푖=0 s = s + a[k][i]; } 23
- Tính tổng của 1 cột trong ma trận a Cột Cột Cột Cột Cột 0 1 2 3 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; 푠 −1 for(int i=0; i<=sd -1; i++) 푠 = [푖] { 푖=0 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
- MA TRẬN VUÔNG 27
- 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 28
- 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ử thuộc đường chéo phụ 29
- 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 30
- 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 trên đường chéo phụ 31
- 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