Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 14 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
14
Dung lượng
403,79 KB
Nội dung
Mảng hai chiều CHƯƠNG MẢNG HAI CHIỀU Đây kiểu liệu dùng để biểu diễn liệu kiểu bảng, kiểu liệu thích hợp cho toán liên quan đến đồ thị, biểu diễn ảnh, … I TÓM TẮT LÝ THUYẾT I.1 Khái niệm Mảng hai chiều thực chất mảng chiều phần tử mảng mảng chiều, truy xuất hai số dòng cột Từ khái niệm ta đưa khái niệm mảng nhiều chiều sau: mảng có từ hai chiều trở lên gọi mảng nhiều chiều I.2 Khai báo mảng Từ khái niệm ta có cú pháp khai báo mảng hai chiều sau: • Cách 1: Con trỏ < Kiểu liệu > < Tên mảng > [ < Số dòng tối đa > ][ < Số cột tối đa> ]; Ví dụ: int A[10][10]; // Khai báo mảng chiều kiểu int gồm 10 dòng, 10 cột float b[10][10]; // Khai báo mảng chiều kiểu float gồm 10 dòng, 10 cột • Cách : Con trỏ < Kiểu liệu > **; Ví dụ : int **A ; // Khai báo mảng động chiều kiểu int float **B ; // Khai báo mảng động chiều kiểu float Tương tự mảng chiều, để sử dụng ta phải cấp phát vùng nhớ cho malloc calloc huỷ sau dùng free Ví dụ : Khai báo mảng số nguyên A có kích thước 5x6 int **A; A = ( int **) malloc (5) ; for ( int i = ; i < ; i ++ ) A[i]=(int *) malloc (6) ; I.3 Truy xuất phần tử mảng Để truy xuất thành phần mảng hai chiều ta phải dựa vào số dòng số cột Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 64 Mảng hai chiều Ví dụ: int A[3][4] = { {2,3,9,4} , {5,6,7,6} , {2,9,4,7} }; Với khai báo ta có : A[0][0] = 2; A[0][1] = 3; A[1][1] = 6; A[1][3] = 6; Với ví dụ ta có hình dạng ma trận sau 3 2 # Lưu ý: Khi nhập liệu cho mảng hai chiều, mảng số nguyên ta nhập liệu theo cách thông thường Nhưng mảng số thực ta phải thơng qua biến trung gian Ví dụ : float a[10][10]; float tmp; scanf (“%f”, &tmp); a[2][2] = tmp; // Mang so thuc a // Bien trung gian tmp // Nhap lieu cho bien trung gian // Gan du lieu vao phan tu a[2][2] I.4 Ma trận vuông khái niệm liên quan a Khái niệm Là ma trận có số dịng số cột b Tính chất ma trận vng • Đường chéo loại o Đường chéo loại bao gồm đường chéo đường chéo song song với đường chéo Trong đường chéo đường chéo có : số dịng = số cột Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 65 Mảng hai chiều o Truy xuất phần tử đường chéo loại : để truy xuất phần tử đường chéo loại ta dựa vào số dòng số cột sau : cột – dịng = số Ví dụ : Cho ma trận vuông A(n x n) Gọi (io, jo) toạ độ điểm xuất phát, ta duyệt đừơng chéo xuất phất từ (io, jo) sau : for ( i = io, j = jo ; i < n ; i ++, j ++ ) printf (“%4d”,A[i][j]); • Đường chéo loại 2: o Đường chéo loại bao gồm đường chéo phụ đường song song với Trong đường chéo phụ đường chéo có: số cột + số dịng = số dòng ( số cột ) o Truy xuất phần tử đường chéo loại : để truy xuất phần tử đường chéo loại ta dựa vào số dịng số cột sau : cột + dòng = số Ví dụ: Cho ma trận vng A(n x n) Gọi (io, jo) toạ độ điểm xuất phát, ta duyệt đường chéo xuất phất từ (io, jo) sau : for ( i = io , j = jo ; i < n && j > = ; i ++ , j ) printf (“%4d”,A[i]][j]); II BÀI TẬP Để đơn giản việc khai báo ma trận, ta định nghĩa kiểu ma trận phần tử với kiểu liệu sau: #define MAX 100 typedef MATRAN[MAX][MAX]; Ví dụ: Khai báo ma trận số nguyên a #define MAX 100 Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 66 Mảng hai chiều typedef int MATRAN[MAX][MAX]; MATRAN a; II.1 Một số kĩ thuật • Phương pháp nhập xuất ma trận void Nhap (MATRAN a, int &d, int &c ) { printf (“\nNhap so dong: ”); scanf (“ %d”, &d ); printf (“\nNhap so cot: ”); scanf (“%d”, &c ); for ( int i = 0; i < d; i ++ ) for (int j = 0; j < c; j ++) { printf (“ a[%d][%d] = ”, i, j ); scanf (“%d”, &a[i][j]); } } • void Xuat (MATRAN a, int d, int c) { printf (“\nNoi dung ma tran:\n”); for (int i = 0; i < d; i++) { for (int j = 0; j < c; j++) printf (“ \t %d ”, a[i][j] ); printf (“\n”); } } Kĩ thuật đặt cờ hiệu Viết hàm kiểm tra xem ma trận số nguyên có tồn số nguyên lẻ lớn 100 không? int KiemTraLe (MATRAN a, int d, int c) { int flag = 0; //tra ve neu co nguoc lai tra ve for (int i = 0; i < d; i ++ ) for (int j = 0; j < c; j++) if ( a[i][j] % != && a[i][j] > 100 ) { flag = 1; break; } return flag; } Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 67 Mảng hai chiều • Kĩ thuật đặt lính canh Viết hàm tìm phần tử nhỏ ma trận int Min (MATRAN a, int d, int c ) { int = a[0][0]; for ( int i = ; i < d ; i ++ ) for (int j = ; j < c ; j ++) if ( a[i][j] < ) = a[i][j]; return min; } • Phương pháp tính tổng Viết hàm tính tổng phần tử ma trận long Tong (MATRAN a, int d, int c) { long tong = 0; for ( int i = 0; i < d; i ++ ) for ( int j = 0; j < c; j ++) tong + = a[i][j]; return tong; } • Phương pháp xếp Viết hàm xếp ma trận tăng dần từ xuống từ trái sang phải không dùng mảng phụ void SapTang(MATRAN a, int d, int c) { for (int i = 0; i 2), xét trường hợp n số lẻ với tính chất P tổng số Hướng dẫn : Ma phương bảng vuông cấp n, ô nhận giá trị cho, hàng, cột đường chéo thoả mãn tính chất P cho trước Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 75 Mảng hai chiều Ví dụ : Với n = 83 (*) Viết hàm in ma trận số nguyên dương theo qui luật mô tả sau : phần tử phía đường chéo phụ giá trị bình phương giá trị → n × , giá trị từ đường chéo phụ trở xuống số nguyên tố Ma trận xếp ví dụ bên Ví dụ : n = 84 Cho ma trận vuông a cấp n ( n lẻ, ≤ n ≤ 15 ), phần tử có giá trị nguyên dương Hãy xây dựng hàm kiểm tra xem ma trận a có phải ma phương hay khơng? 85 (**) Viết chương trình giải tốn hậu Hãy đặt hậu bàn cờ 8x8 cho chúng không ăn (2 hậu ăn hàng, cột nằm đường chéo) Hướng dẫn: Dùng ma trận 8x8 để lưu bàn cờ Mỗi ô có trạng thái : • Có hậu • Ơ trống • Ơ khơng dược -1 86 (**) Viết chương trình giải tốn mã tuần Hãy mã 64 lượt bàn cờ 8x8 cho ô qua lần (xuất phát từ ô bất kỳ) Hướng dẫn : Đứng bàn cờ mã hướng sau Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 76 Mảng hai chiều n o u p z t q s r Khai báo hướng mã sau: typedef struct DIEM { int x, y; }; DIEM huongdi[8]={{-2,-1},{-2,1},{-1,2},{1,2},{2,1},{2,-1},{1,-2},{-1,-2}}; Trong thành phần huongdi độ lệch dịng cột so với vị trí mã Ví dụ: huongdi[0] (tức đến vị trí n hình vẽ) có độ lệch dịng cột (Giá trị âm biểu thị độ lệch bên trái cột hay hướng lên dịng) Chọn vị trí cho vị trí phải gần với biên hay góc (tức số đường đi nhất) 87 Viết chương trình giải tốn Taci Cho ma trận vng 3x3 gồm số nguyên từ -> ô trống Bài toán đặt đưa ma trận trạng thái đầu trạng thái đích, lần dịch chuyển Ví dụ : Trạng thái đầu Trạng thái đích => III KẾT LUẬN Kiểu liệu mảng hai chiều ứng dụng rộng rãi tốn tìm đường đồ thị, xử lý ảnh, xử lý liệu dạng bảng, … Lưu ý nhập mảng hai chiều số thực phải thông qua biến trung gian Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 77 ... 0; Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 68 Mảng hai chiều for ( int i = ; i < d ; i ++) for ( int j = ; j < c ; j ++) if ( a[i][j] % = = ) dem ++; return dem; } II.2 Bài tập a Bài tập nhập... số nhỏ 64 Viết hàm thay phần tử có giá trị x thành phần tử có giá trị y ma trận (x , y nhập từ bàn phím) Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 72 Mảng hai chiều II.3 Bài tập luyện tập nâng... 86 (**) Viết chương trình giải tốn mã tuần Hãy mã 64 lượt bàn cờ 8x8 cho ô qua lần (xuất phát từ ô bất kỳ) Hướng dẫn : Đứng bàn cờ mã hướng sau Giáo trình Bài Tập Kỹ Thuật Lập Trình Trang 76