570 likes | 944 Views
KỸ THUẬT LẬP TRÌNH. GV: Phạm Thị Xuân Diệu Email: phamdieucse@gmail.com Blog: http://xuandieu.wordpress.com. Chương 3:. MẢNG VÀ CÁC THAO TÁC TRÊN MẢNG. 1. Khái niệm. 2. Mảng một chiều. 3. Mảng nhiều chiều.
E N D
KỸ THUẬT LẬP TRÌNH GV: Phạm Thị Xuân Diệu Email: phamdieucse@gmail.com Blog: http://xuandieu.wordpress.com
Chương 3: MẢNG VÀ CÁC THAO TÁC TRÊN MẢNG
1. Khái niệm 2. Mảng một chiều 3. Mảng nhiều chiều
Mảng là một tập hợp các giá trị có cùng kiểu dữ liệu nằm liên tiếp nhau trong bộ nhớ và được tham chiếu bởi một tên chung chính là tên mảng. • Mỗi phần tử của mảng được tham chiếu thông qua chỉ mục (index). 1. Khái niệm Giá trị Vị trí Vị trí được tính từ 0
Nếu mảng có n phần tử thì phần tử đầu tiên có chỉ mục là 0 và phần tử cuối có chỉ mục là n-1. • Để tham chiếu đến một phần tử ta dùng tên mảng và chỉ mục của phần tử được đặt trong cặp dấu []. Ví dụ: a[0] • Số lượng phần tử có trong mảng được gọi là kích thước của mảng. luôn cố định, phải được xác định trước và không đổi trong suốt quá trình thực hiện chương trình. 1. Khái niệm
Mảng là 1 đối tượng dùng để lưu trữ các phần tử có cùng 1 kiểu dữ liệu Chỉ số mảng bắt đầu được tính từ 0 cho tới n-1 Tức là nếu như mảng có 10 phần tử, thì vị trí sẽ được tính từ số 0 cho tới 9. Với 0 là vị trí của phần tử số 1, số 1 là vị trí của phần tử số 2 …. i=0 i=1 i=2 i=3 i=4 i=5 1. Khái niệm Mảng M có 6 phần tử 9 0 8 7 10 50 N=6 M[i] M[4] Là phần tử tại vị trí thứ i M[0] Đối với duyệt mảng, người ta thường dùng vòng for, ít khi dùng vòng while, do.. while
Khai báo một mảng một chiều • Cú pháp: typearrayName[elements]; • type: kiểu dữ liệu của mỗi phần tử mảng. • arrayName: tên mảng • elements: số phần tử có trong mảng • Ví dụ:int a[5] 2. Mảng một chiều a a[0] a[1] a[2] a[3] a[4]
Ví dụ: int a[100]; //Khai báo mảng số nguyên a gồm 100 phần tử float b[50]; //Khai báo mảng số thực b gồm 50 phần tử char str[30]; //Khai báo mảng ký tự str gồm 30 ký tự 2. Mảng một chiều • Nhằm thuận tiện cho việc viết chương trình, ta nên định nghĩa hằng số MAX ở đầu chương trình – là kích thước tối đa của mảng - như sau: • #define MAX 100 • void main() • { • int a[MAX], b[MAX]; • //Các lệnh • } Như vậy khi duyệt mảng thì các chỉ số không được vượt quá hoặc bằng số phần tử của mảng
Mảng phải được khai báo tường minh • Kích thước (tính bằng byte) của mảng được tính theo công thức: Total_size = sizeof(type) * elements Ví dụ: int num[100]; Mảng num có kích thước là: 2bytes * 100 = 200bytes (giả sử int chiếm 2 bytes) 2. Mảng một chiều
Mỗi phần tử mảng là một biến thông thường. Ví dụ: int num[3]; num[0] = 2; //gán 2 cho phần tử num[0] num[1] = num[0] + 3 //num[1] có giá trị 5 num[2] = num[0] + num[1]; //num[2] có giá trị 7 cout << num[1]; //In ra giá trị 5 2. Mảng một chiều
Khai báo và khởi tạo mảng một chiều • Cú pháp: typearrayName[]= {value1, value2, ..., value n}; • Lưu ý: • Không khai báo kích thước mảng. • Số lượng phần tử trong mảng là số các giá trị được cung cấp trong cặp dấu ngoặc {}, được phân cách nhau bởi dấu phẩy. 2. Mảng một chiều
Ví dụ: int soChan[] = {2,4,6,8,10}; Mảng soChan có 5 phần tử lần lượt là: soChan[0] có giá trị là 2 soChan[1] có giá trị là 4 ... soChan[4] có giá trị là 10 2. Mảng một chiều
Khai báo và gán giá trị ban đầu cho mảng một chiều: Gán từng phần tử int a[5] = {3, 6, 8, 1, 12}; Gán số lượng phần tử khởi tạo ít hơn số phần tử của mảng: int a[8] = {3,5,2} 2. Mảng một chiều
Truy xuất giá trị • Tên mảng [ vị trí cần truy xuất ] • void main() • { • int a[5] = {3, 6, 8, 11 , 12}; • cout<<“Giá trị mảng tại vị trí 3 = “<<a[3]; • } • Kết quả: Giá trị mảng tại vị trí 3 = 11 2. Mảng một chiều Vị trí 3 11
Các thao tác trên mảng: • Nhập • Xuất (liệt kê) • Tìm kiếm • Đếm • Sắp xếp • Kiểm tra mảng thỏa điều kiện cho trước • Tách/ ghép mảng • Chèn / xóa 2. Mảng một chiều
Cách nhập dữ liệu cho từng phần tử trong mảng như thế nào? • Có 2 cách nhập dữ liệu cho từng phần tử trong mảng: • - cách 1: nhập bằng tay từ bàn phím • - cách 2: cho máy tự động nhập • Chúng ta nên kết hợp hàm (hôm bữa học) để nhập và xuất mảng. 2. Mảng một chiều
Ví dụ: Tạo một mảng nguyên a có N phần tử. Mỗi phần tử có giá trị là chỉ mục của nó. In mảng ra màn hình. 2. Mảng một chiều
Viết bằng Hàm 2. Mảng một chiều
Nhập mảng tự động bằng máy: Để khởi tạo xuất ra các số ngẫu nhiên, ta phải viết hàm này trước: 2. Mảng một chiều srand(time(NULL)); Hàm trên có ý nghĩa là yêu cầu máy tính khởi động để tạo các số ngẫu nhiên : Tức là mỗi lần chạy chương trình thì nó sẽ tự động phát sinh ra các con số có giá trị khác nhau. **** nếu như không có dòng này thì mỗi lần chạy chương trình sẽ cho ra có số ngẫu nhiên GIỐNG NHAU.
Để lấy giá trị ngẫu nhiên , ta dùng công thức bên dưới: 2. Mảng một chiều rand()%n : Tứclấylấycácgiátrịngẫunhiêntừ 0 chotới n-1 Nhưvậynếu ta gọi rand()%100 : tứclàlấygiátrị ngẫu nhiêntừ 0 99 Đềbài : Hãyxuấtcácsốngẫunhiêntừ -55 chotới 150 (-77 88) Rand()%n -77=88 n=166 (3095) rand()%n +30=95n=66 (-55150)Rand()%n -55 =150 n=206 (-50 -100)?
Liệt kê các phần tử thỏa điều kiện cho trước: • Mẫu 1: • void LietKeXXX(int a[], int n) • { • for (int i = 0; i<n; i++) • if (a[i] thỏa điều kiện) • Xuất a[i]; • } • Mẫu 2: • void LietKeXXX(int a[], int n, int x) • { • for (int i = 0; i<n; i++) • if (a[i] thỏa điều kiện so với x) • Xuất a[i]; • } 2. Mảng một chiều
Ví dụ 1: Liệt kê các phần tử có giá trị chẵn trong mảng • void LietKeChan(int a[], int n) • { • for (int i = 0; i<n; i++) • if (a[i] %2 ==0) • cout<<a[i]<<“\t”; • } 2. Mảng một chiều Ví dụ 2: Liệt kê các phần tử có giá trị lớn hơn x trong mảng • void LietKeLonHonX(int a[], int n, int x) • { • for (int i = 0; i<n; i++) • if (a[i] > x) • cout<<a[i]< <“\t”; • }
Ví dụ 3: Chương trình nhập vào mảng một chiều số nguyên a, kích thước n. In ra các phần tử có giá trị lớn hơn x có trong mảng 2. Mảng một chiều
Đếm: 2. Mảng một chiều • Mẫu 2: • int DemXXX(int a[], int n, int x) • { • int d = 0; • for (int i = 0; i<n; i++) • if (a[i] thỏa điều kiện so với x) • d++; • return d; • } • Mẫu 1: • int DemXXX(int a[], int n) • { • int d = 0; • for (int i = 0; i<n; i++) • if (a[i] thỏa điều kiện) • d++; • return d; • }
Ví dụ 1: Đếm các phần tử có giá trị là số nguyên tố 2. Mảng một chiều
Tìm kiếm 2. Mảng một chiều Mẫu 1: Tìm và trả về vị trí phần tử có giá trị lớn nhất int TimVTMax(int a[], int n) { int vtmax = 0; for (int i = 1; i < n; i++) if (a[i] > a[vtmax]) vtmax = i; return vtmax; } Mẫu 2: Tìm vị trí phần tử có giá trị x (nếu x không xuất hiện trong mảng trả về -1) int TimVTX(int a[], int n, int x) { for (int i = 0; i < n; i++) if (a[i] == x) return i; return -1; }
Kiểm tra xem mảng có thỏa điều kiện cho trước *TH1: kiểm tra tồn tại một phần tử trong mảng thỏa điều kiện nào đó cho trước tìm phần tử thỏa điều kiện để kết luận. *TH2: kiểm tra tất cả các phần tử thỏa điều kiện nào đó cho trước tìm phần tử không thỏa điều kiện để kết luận mảng không thỏa điều kiện. 2. Mảng một chiều
Mẫu TH1: • bool KiemTraTonTaiXXX(int a[], int n) • { • for (int i = 0; i<n; i++) • if (a[i] thỏa điều kiện) • return true; • return false; • } 2. Mảng một chiều • Mẫu TH2: • bool KiemTraXXX(int a[], int n) • { • for (int i = 0; i<n; i++) • if (a[i] không thỏa điều kiện) • return false; • return true; • }
Ví dụ 1: Kiểm tra xem mảng có tồn tại số lẻ không? 2. Mảng một chiều
Ví dụ 2: Kiểm tra xem mảng có toàn giá trị âm không? (true: có/ false: không) 2. Mảng một chiều
Tính tổng, giá trị trung bình có điều kiện 2. Mảng một chiều • Mẫu tính tổng: • int TongXXX(int a[], int n) • { • int s = 0; • for (int i = 0; i<n; i++) • if (a[i] thỏa điều kiện) • s += a[i]; • return s; • }
Tính tổng, giá trị trung bình có điều kiện • Mẫu tính trung bình: • float TrungBinhXXX(int a[], int n) • { • int s = 0; • int d = 0; • for (int i = 0; i<n; i++) • if (a[i] thỏa điều kiện) • { • s += giatri; • d ++; • } • if (d==0) • return 0; • return (float) s / d; • } 2. Mảng một chiều
Ví dụ 1: Tính tổng các phần tử có giá trị lẻ trong mảng 2. Mảng một chiều
Sắp xếp • Mẫu phương thức sắp thứ tự tăng: • void SapTang(int a[], int n) • { • for (int i = 0; i < n-1; i ++) • for(int j = i+1; j < n; j ++) • if (a[i] > a[j]) • HoanVi(a[i], a[j]); • } • void HoanVi(int &a, int &b) • { • int tam = a; • a = b; • b = tam; • } 2. Mảng một chiều
C/C++ hỗ trợ mảng nhiều chiều. Dạng đơn giản nhất của mảng nhiều chiều là mảng hai chiều. • Mảng hai chiều thực chất là mảng của những mảng một chiều. Ta có thể xem mảng hai chiều là một ma trận gồm các hàng và các cột 3. Mảng nhiều chiều
Khai báo mảng hai chiều typearrayName[rows][columns]; • rows: số hàng • columns: số cột Ví dụ: Khai báo mảng số nguyên 3 hàng 4 cột int a[3][4] 3. Mảng nhiều chiều
Ví dụ 1:int M[5][3]; Tức là khai báo 1 mảng 2 chiều tên là M, có 5 dòng, 3 cột. tổng số phần tử trong mảng = 5*3 =15 phần tử Ví dụ 2:float K[3][4]; khai báo 1 mảng 2 chiều tên là K có kiểu số thực, số dòng là 3, số cột là 4 tổng số phần tử là 4*3=12; - Tương tự như mảng 1 chiều, chỉ số của các phần tử được đánh dấu từ số 0 cho tới số dòng -1 hoặc số cột -1 3. Mảng nhiều chiều
Giả sử ta có mảng M 2 chiều, có 4 dòng và 5 cột Chiều duyệt theo cột, thường đặt tên là j j =1 j =2 j =3 j =0 j =4 3. Mảng nhiều chiều i =0 Tức là để truy suất 1 phần tử tại dòng thứ ivà tại cột thứ j thì ta viết: M[i][j] - Ví dụ, muốn lấy phần tử tại dòng 2, cột 3 thì ta viết M[2][3] i =1 Chiều duyệt theo dòng, thường đặt tên là i i =2 i =3 Thông thường, người ta sử dụng 2 vòng for lồng nhau để duyệt mảng 2 chiều. Vòng for ngoài duyệt theo dòng, vòng for trong duyệt theo cột
int M[dòng][cột]; • Ví dụ: • int M[3][2] ; • Dòng =3, cột =2 tổng số phần tử = 2*3 =6 phần tử 3. Mảng nhiều chiều Để duyệt mảng, ta kết hợp 2 vòng for lồng nhau, vòng for ngoài chạy theo chỉ số dòng (đặt là i), vòng for trong chạy theo chỉ số cột (đặt là j)
Ma Trận vuông : mảng 2 chiều có số cột và số dòng bằng nhau 3. Mảng nhiều chiều • Cáchkhaibáosẽthayđổi 1 ít so vớimảng 2 chiềubình thường. • Vì ma trận vuông là ma trận có số cột và số dòng bằng nhau, nên ta thường khai báo CẤP của mà trận thay vì khai báo số dòng, số cột. • Nếu nói ma trận vuông cấp 3 có 3*3 =9 phần tử • Tức là khi nói tới ma trận vuông thì người ta nói tới cấp. Nếu ma trận là cấp N thì số phần tử của nó sẽ là N2
1) Viết hàm xuất đường chéo chính, đường chéo phụ cho mảng 2 chiều 0 1 2 3 • Nhận xét: • Đường chéo chính (màu vàng) thì chỉ số i và j là luôn luôn bằng nhau • Đường chéo phụ (màu xanh) thì i +j =n-1 4 3. Mảng nhiều chiều 0 1 2 3 4