1 / 43

CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

CÂU HỎI : Cho biết kết quả thực thi chương trình sau:. int f(int); void main() { int n=3; cout<<“Tong day so: “<<f(n); getch(); } int f(int a) { if (a>0) return a*a + f(a-1); else return 0; }. CHÖÔNG 6. KIỂU ARRAY (Tiếp theo). A. ARRAY 1 CHIỀU:. Khai báo biến kiểu array

astra
Download Presentation

CÂU HỎI : Cho biết kết quả thực thi chương trình sau:

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. CÂU HỎI: Cho biết kết quả thực thi chương trình sau: int f(int); void main() { int n=3; cout<<“Tong day so: “<<f(n); getch(); } int f(int a) { if (a>0) return a*a + f(a-1); else return 0; }

  2. CHÖÔNG 6 KIỂU ARRAY (Tiếp theo)

  3. A. ARRAY 1 CHIỀU: • Khai báo biến kiểu array • Truy xuất biến array • Truyền thông số kiểu array • Sử dụng hàm tạo số ngẫu nhiên • Một số thuật tóan trên array

  4. III. Hàm có thông số kiểu array: • Thông số hình thức không cần chỉ định số phần tử. Thông số thực có thể có số lượng phần tử bất kỳ. Ví dụ 1: Hàm xuất giá trị mảng void xuat(int a[], int n) { for(int i=0; i<n; i++) cout<<setw(3)<<a[i]; } Giả sử ta có mảng: int a[100]; int b[20]; Các lời gọi hàm sau đều hợp lệ: xuat(a,100); xuat(b,20); int n=10; xuat(a,n);

  5. III. Hàm có thông số kiểu array • Thông số kiểu array mặc định truyền dạng tham biến. Ví dụ 1: Hàm nhập giá trị mảng void nhap(int a[], int& n) { cout<<“nhap so phan tu “;cin>>n; for (int i=0; i<n; i++) { cout<<“Nhập a[“<<i<<“] =”; cin>>a[i]; } } void main() { int a[50],n; nhap(a,n); xuat(a,n); getch(); }

  6. IV. Sử dụng hàm tạo số ngẫu nhiên • Hàm random(n) cho kết quả là một số ngẫu nhiên có trị 0  n -1. • Các số ngẫu nhiên sinh ra thay đổi sau mỗi lần gọi hàm khởi động trình ngẫu nhiên randomize(); • Hai hàm này được cung cấp bởi thư viện stdlib.h

  7. Ví dụ 1: Nhập các phần tử mảng bằng số ngẫu nhiên 0-99: void nhap(int a[], int& n) { cout<<“nhap so phan tu “;cin>>n; randomize(); for (int i=0; i<n; i++) a[i]= random(100); } void xuat(int a[], int n) { for(int i=0; i<n; i++) cout<<setw(3)<<a[i]; } void main() { int a[50],n; nhap(a,n); xuat(a,n); getch(); }

  8. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array 0. max/min 1. Tính tổng/tích dãy số: Duyệt tòan bộ mảng, thực hiện cộng hoặc nhân tích lũy. int tong(int a[], int n) { int sum=0; for (int i=0; i<n; i++) sum +=a[i]; return sum; }

  9. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array 2. Tìm kiếm: Duyệt mảng cho đến khi tìm thấy. Thường sử dụng lệnh lặp while. Ví dụ 1: Tìm vị trí phần tử đầu tiên có trị x. Nếu không tìm thấy trả về -1. int ViTri(int a[], int n, int x) { int vt=0; while (vt<n && a[vt]!=x) vt++; if (vt<n) return vt; else return -1; }

  10. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array Ví dụ 2: Tìm vị trí phần tử cuối cùng của dãy là số nguyên tố (-1 nếu không tìm thấy). int PrimeNumber(int n) { if (n==0) return 1; if (n==1) return 0; if (n<0) n=-n; int i=2; while (n%i !=0) i++; return (i<n); }

  11. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array int LastPrimeNumber(int a[], int n) { int i=n-1; while (!PrimeNumber(a[i]) && i>=0) i--; return i; }

  12. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array 3. Đếm số phần tử theo điều kiện cho trước: Duyệt tòan bộ mảng, tăng trị biến đếm khi phần tử đang duyệt thỏa điều kiện. Ví dụ: Đếm số phần tử lẽ. Đếm số phần tử chẵn. Đếm số phần tử là số chính phương.

  13. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array Ví dụ: Đếm số phần tử là số chính phương. int ChinhPhuong(int n) { int i=1; while (i*i<n) i++; return (i*i == n); } int SoPTChinhPhuong(int a[], int n) { int dem=0; for(int i=0; i<n; i++) if (ChinhPhuong(a[i]) dem++; return dem; }

  14. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array 4. Sắp xếp – Thuật tóan bubble sort: Mô tả thuật tóan: • Duyệt tòan bộ n phần tử mảng, tìm phần tử nhỏ nhất đặt lên vị trí đầu bằng cách đổi chỗ // 0  n-1 • Kế đến, duyệt n-1 phần tử còn lại, tìm phần tử nhỏ nhất đặt lên vị trí 1 bằng cách đổi chỗ // 1  n-1 • Kế đến, duyệt n-2 phần tử còn lại, tìm phần tử nhỏ nhất đặt lên vị trí 2 bằng cách đổi chỗ // 2  n-1 • ... • Cuối cùng duyệt 2 phần tử cuối // n-2  n-1

  15. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array 4. Sắp xếp – Thuật tóan bubble sort: Câu lệnh tương ứng: • i=0; for( j =i+1; j<n; j++) so sánh a[i] và a[j] đổi chỗ; • i=2; for( j =i+1; j<n; j++) so sánh a[i] và a[j] đổi chỗ; • i=3; for( j =i+1; j<n; j++) so sánh a[i] và a[j] đổi chỗ; • ... • i=n-2; for( j =i+1; j<n; j++) so sánh a[i] và a[j] đổi chỗ;

  16. V. Một số thuật tóan thường gặp trên dữ liệu kiểu array 4. Sắp xếp – Thuật tóan bubble sort: Cài đặt hàm: void sort(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]) { tam=a[i]; a[i]=a[j]; a[j]=tam; } }

  17. B. ARRAY 2 CHIỀU: Định nghĩa: Là kiểu mảng một chiều trong đó mỗi phần tử có kiểu là kiểu mảng một chiều. Nội dung: • Khai báo và truy xuất phần tử. • Truyền thông số kiểu array 2 chiều. • Một số thuật tóan trên array 2 chiều.

  18. I. Khai báo và truy xuất phần tử 1. Cú pháp khai báo biến: Ý nghĩa: Khai báo biến TênBiến là dãy có N1 phần tử, mỗi phần tử là dãy N2 phần tử kiểu TênKiểu Trong đó: TênKiểu: các kiểu cơ sở, là kiểu đơn N1, N2 là các hằng số N1 là số phần tử của chiều thứ 1 N2 là số phần tử của chiều thứ 2 TênKiểu TênBiến[N1][N2]

  19. I. Khai báo và truy xuất phần tử Ví dụ 1: Để lưu điểm của 5 môn, mỗi môn có 3 cột điểm. float diem[5][3]; Ví dụ 2: Lưu họ tên cho 10 sinh viên, mỗi họ tên là một dãy 30 ký tự. char HoTen[10][30];

  20. I. Khai báo và truy xuất phần tử Lưu ý 1: Người ta thường trình bày mỗi phần tử của chiều thứ 1 trên một dòng. Nên N1 còn gọi là số dòng, N2 là số cột. Ví dụ 3: Biến diem là một bảng 5 dòng, 3 cột Biến HoTen một bảng 10 dòng, 30 cột Ví dụ 4: Để lưu ma trận số nguyên dạng sau: 4 5 7 1 2 1 8 4 4 6 1 4 Ta khai báo biến: int MaTran[3][4];

  21. Hàng 1 Hàng 2 Hàng 3 I. Khai báo và truy xuất phần tử Lưu ý 2: Các phần tử của biến mảng 2 chiều được cấp phát không gian nhớ liên tục theo thứ tự hàng. Ví dụ 5: Các phần tử của biến MaTran trong bộ nhớ như sau: 4 5 7 1 2 1 8 4 4 6 1 4

  22. I. Khai báo và truy xuất phần tử 2. Truy xuất biến mảng 2 chiều: Phải truy xuất từng phần tử. Ý nghĩa: Truy xuất phần tử ở dòng i cột j của biến mảng 2 chiều TênBiến Trong đó: i, j là biểu thức nguyên. i là chỉ số chiều thứ nhất, hay chỉ số dòng. j là chỉ số chiều thứ hai, hay chỉ số cột. cú pháp: TênBiến[i][j]

  23. I. Khai báo và truy xuất phần tử Ví dụ 1: int T[2][3]; Biến T gồm các phần tử T[0][0], T[0][1], T[0][2] T[1][0], T[1][1], T[1][2] T[2][0], T[2][1], T[2][2] T[0][0] là một biến nguyên int. T[0] là một mảng nguyên 3 phần tử.

  24. I. Khai báo và truy xuất phần tử Ví dụ 2: Nhập dữ liệu cho biến mảng 2c int T[10][20]; for(int i=0; i<10; i++) for(int j=0; j<20; j++) { cout<<“Nhập a[“<<i<<“]=“; cin>>a[i][j]; }

  25. I. Khai báo và truy xuất phần tử Lưu ý: Quản lý số dòng cột thực tế nhập bằng 2 biến nguyên m, n. Ví dụ 2: const SIZE1=50; const SIZE2=50; int T[SIZE1][SIZE2]; int m, n; cout<<“số dòng:”; cin>> m; cout<<“số cột:”; cin>>n; for(int i=0; i<m; i++) for(int j=0; j<n; j++) { cout<<“Nhập a[“<<i<<“]=“; cin>>a[i][j]; }

  26. I. Khai báo và truy xuất phần tử 3. Khai báo có khởi động trị: Ví dụ : int T[3][2]={ {1,2}, {3,4}, {5,6} }; Kết quả mảng T được mang giá trị 1 2 3 4 5 6

  27. II. Thông số kiểu mảng 2 chiều: 1. Cách viết thông số hình thức: • Thông số hình thức kiểu mảng 2 chiều không cần chỉ ra số dòng, nhưng phải chỉ định số cột. • Khi gọi hàm, thông số thực phải là mảng 2 chiều có số cột khai báo giống như thông số hình thức. Ví dụ: hàm xuất mảng 2 chiều.

  28. const N=50; void xuatM2C(int T[][N],int m, int n) { for(int i=0; i<m; i++) { for(int j=0; j<n; j++) cout<<setw(3)<<T[i][j]; cout<<endl; } } void main() { int a[10][50]; int b[20][50]; int c[50][30]; ..... int m=5, n=5; xuatM2C(a,m,n); xuatM2C(b,m,n); xuatM2C(c,m,n);//sai cú pháp. }

  29. II. Thông số kiểu mảng 2 chiều: 2. Mảng 2 chiều là tham biến: • Thông số kiểu mảng 2 chiều mặc định là truyền bằng địa chỉ (tham biến). Ví dụ: hàm nhập mảng 2 chiều.

  30. const SIZE1=50; const SIZE2=50; void nhapM2C(int T[][SIZE2], int&m, int&n) { cout<<“số dòng:”; cin>> m; cout<<“số cột:”; cin>>n; for(int i=0; i<m; i++) for(int j=0; j<n; j++) { cout<<“Nhập a[“<<i<<“]=“; cin>>a[i][j]; } }

  31. III. Một số thuật tóan trên M2C: • Là các thuật tóan trên mảng 1 chiều được áp dụng trên một số phần tử giới hạn hoặc trên tòan mảng 2C. Ví dụ: - Tổng cột thứ 5 của mảng. - Sắp xếp tăng các phần tử trên đường chéo chính. - ... • Vì vậy ta xét thao tác cơ bản trên M2C là các cách duyệt M2C: 1. Duyệt dòng 2. Duyệt cột 3. Duyệt đường chéo chính 4. Duyệt đường chéo phụ 5. Duyệt nửa tam giác trên đường chéo phụ.

  32. III. Một số thuật tóan trên M2C: Xét mảng T[5][5] Dòng L=1

  33. III. Một số thuật tóan trên M2C: 1. Duyệt dòng: Các phần tử trên dòng thứ L là các phần tử có chỉ số thứ nhất là L Ví dụ: int T[4][5]={{1,2,3,4,5},{6,7,8,9,10}}; int L; cout<<“Cho biết dòng cần in: “; cin>>L; for(int i=0; i<5; i++) cout<<setw(3)<<T[L][i]; Kết quả: Nếu nhập L=1 ta có: 6 7 8 9 10

  34. III. Một số thuật tóan trên M2C: Xét mảng T[5][5] Cột K=1

  35. III. Một số thuật tóan trên M2C: 2. Duyệt cột: Các phần tử trên cột thứ K là các phần tử có chỉ số thứ hai là K. Ví dụ: int T[4][5]={{1,2,3,4,5},{6,7,8,9,10}, {5,4,3,2,1},{10,9,8,7,6} }; int K; cout<<“Cho biết cột cần in: “; cin>>K; for(int i=0; i<4; i++) cout<<setw(3)<<T[i][k]; Kết quả: Nếu nhập K=1 ta có: 2 7 4 9

  36. III. Một số thuật tóan trên M2C: Xét mảng T[5][5]

  37. III. Một số thuật tóan trên M2C: 3. Duyệt đường chéo chính: Các phần tử trên đường chéo chính là các phần tử có chỉ số dòng bằng chỉ số cột.(ma trận vuông) Ví dụ: int T[4][4]={ {1,2,3,4}, {5,6,7,8}, {4,3,2,1}, {8,7,6,5} }; for(int i=0; i<4; i++) cout<<setw(3)<<T[i][i]; Kết quả: 1 6 2 5

  38. III. Một số thuật tóan trên M2C: Xét mảng T[5][5]

  39. III. Một số thuật tóan trên M2C: 4. Duyệt đường chéo phụ: Các phần tử trên đường chéo chính là các phần tử có chỉ số dòng cộng chỉ số cột bằng kích thước mảng-1. Ví dụ: int T[4][4]={ {1,2,3,4}, {5,6,7,8}, {4,3,2,1}, {8,7,6,5} }; for(int i=0; i<4; i++) cout<<setw(3)<<T[i][4-1-i]; Kết quả: 4 7 3 8

  40. III. Một số thuật tóan trên M2C: dòng <= cột i <= j

  41. 5. Duyệt đường ½ tam giác trên đường chéo chính: Các phần tử ở nửa trên đường chéo chính là các phần tử có chỉ số dòng i, chỉ số cột j thỏa i<=j; Ví dụ: int T[4][4]={ {1,2,3,4}, {5,6,7,8}, {4,3,2,1}, {8,7,6,5} }; for(int i=0; i<4; i++) { for(int j=0; j<4; j++) if (i<=j) cout<<setw(3)<<T[i][j]; cout<<endl; } Kết quả: 1 2 3 4 6 7 8 2 1 5

  42. III. Một số thuật tóan trên M2C: i<=j Tóm lại i+j>=n-1 i+j<=n-1 i>=j

  43. Ví dụ áp dụng các cách duyệt: Sắp xếp các phần tử trên đường chéo phụ. void swap(int&a, int&b) { int t=a; a=b; b=t; } void sapxep(int m[N][N], int n) { //i, j la chỉ số thứ 1 của phần tử for(int i=0; i<n-1; i++) for(int j=i+1; j<n; j++) if (m[i][n-i-1]>m[j][n-j-1]) swap(m[i][n-i-1], m[j][n-j-1]); }

More Related