Bài giảng Kỹ thuật lập trình - Phần 2, Chương 6: Mẫu (template)

ppt 27 trang phuongnguyen 2750
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Kỹ thuật lập trình - Phần 2, Chương 6: Mẫu (template)", để 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:

  • pptbai_giang_ky_thuat_lap_trinh_phan_2_chuong_6_mau_template.ppt

Nội dung text: Bài giảng Kỹ thuật lập trình - Phần 2, Chương 6: Mẫu (template)

  1. Phần 2: Ngôn ngữ lập trình C++ Chương 6: Mẫu (template)
  2. Các nội dung chính 1. Giới thiệu 2. Mẫu hàm 3. Mẫu lớp 2
  3. 1. Giới thiệu n Khái niệm Mẫu (template): q Là một kỹ thuật cho phép một thành phần chỉ cần được định nghĩa một lần hoặc một số ít lần, nhưng có thể được sử dụng lại nhiều lần cho nhiều đối tượng khác q Là kỹ thuật cho phép tham số hóa kiểu dữ liệu; như cho phép định nghĩa cấu trúc Stack , với T là tham số kiểu, đại diện cho kiểu DL của các phần tử của Stack. Sau đó T có thể được thay thế bằng một kiểu DL cụ thể, ví dụ int, và C++ sẽ tự động tạo ra code để định nghĩa Stack q Nó có thể dùng để thay thế cho việc định nghĩa chồng hàm q Trong C++, các thành phần mà ta có thể tạo Mẫu là Hàm và Lớp 3
  4. 2. Mẫu hàm n Khái niệm mẫu hàm n Tạo mẫu hàm n Sử dụng mẫu hàm 4
  5. Khái niệm mẫu hàm n Là hàm mà khi định nghĩa có sử dụng một hoặc nhiều mẫu n Mẫu hàm được dùng để cho phép định nghĩa hàm một lần, nhưng có thể được gọi nhiều lần với tham số là các kiểu dữ liệu khác nhau template int i, j; char a,b; void swap (T &x, T &y){ float x, y; T z = x; swap(i, j); x = y; swap(a, b); y= z; swap(x, y); } 5
  6. Tạo một mẫu hàm n Cú pháp Khai báo tên mẫu q Một mẫu hàm có thể sử dụng một template void swap1(T &x, T &y){ hoặc nhiều tên T z = x; mẫu x = y; y= z; } Tên mẫu sẽ được sử dụng trongphần đầu và/hoặc trong thân hàm 6
  7. Tạo một mẫu hàm n Mẫu hàm có hai tên mẫu template void swap2 (T &x, U &y){ T z = x; x = (T) y; y= (U) z; } 7
  8. Sử dụng mẫu hàm n Việc gọi mẫu hàm cũng giống như gọi hàm thông thường. Hàm được gọi này, khi đó được gọi là hàm thể hiện n Khi gọi hàm mẫu, thì tùy theo kiểu dữ liệu của hàm thể hiện, mà chương trình dịch sẽ tự động tạo ra định nghĩa phù hợp cho hàm này. 8
  9. Ví dụ áp dụng mẫu hàm 9. int main(int argc, char* argv[]) { 1. #include 10. int i=20,j=30; 2. using namespace std; 11. char c1='A',c2='B'; 12. float x=20.15, y=35.5; 3. //Định nghĩa mẫu hàm 13. //Gọi mẫu hàm 4. template 14. swap1(i,j); 5. void swap1(T &a,T &b) { 15. swap1(c1,c2); 6. T c; 16. swap1(x,y); 7. c=a; a=b; b=c; 17. cout<<"i="<<i<<" j="<<j<<endl; 8. } 18. cout<<"c1="<<c1<<" c2="<<c2<<endl; 19. cout<<"x="<<x<<" y="<<y<<endl; 20. return 0; 21.} 9
  10. Ví dụ áp dụng mẫu hàm n Kết quả chạy chương trình trên Output i=30 j=20 c1=B c2=A x=35.5 y=20.15 10
  11. Mẫu hàm và sự chồng hàm n Mẫu hàm là một công cụ hỗ trợ cho việc chồng hàm, chứ không hoàn toàn thay thế được cho chồng hàm n Ví dụ hàm swap1 ở trên không thực hiện được việc hoán đổi 2 chuỗi ký tự, khi đó ta phải chồng hàm này. 11
  12. 1. #include 2. #include 3. using namespace std; 15.int main(int argc, char argv) 16.{ 4. //Định nghĩa mẫu hàm 17. int i=10,j=20; 5. template 18. swap1(i,j); 6. void swap1(T &a,T &b) { 19. cout<<"i="<<i<<"; j="<<j<<endl; 7. T c; 20. char name1[]="Gone With The Wind"; 8. c=a; a=b; b=c; 21. char name2[]="Mission Impossible"; 9. } 22. swap1(name1,name2); 9. void swap1(char a[], char 23. cout<<"Name 1:"<<name1<<endl; b[]){ 24. cout<<"Name 2:"<<name2; 10. char st[1000]; 25. return 0; 11. strcpy(st,a); 26.} 12. strcpy(a,b); 13. strcpy(b,st); 14.} 12
  13. Kết quả chạy chương trình Output i=20; j=10 Name 1: Mission Impossible Name 2: Gone With The Wind 13
  14. 3. Mẫu lớp n Khái niệm mẫu lớp n Tạo mẫu lớp n Sử dụng mẫu lớp 14
  15. Khái niệm mẫu lớp n Là lớp mà khi định nghĩa có sử dụng một hoặc nhiều mẫu n Mẫu lớp được dùng để cho phép định nghĩa lớp một lần, nhưng có thể tạo ra nhiều lớp khác nhau với tham số là các kiểu dữ liệu khác nhau template class Stack { typedef Stack IntStack; Stack() ; typedef Stack FloatStack; ~Stack() ; typedef Stack StringStack; int push(const T& x); int pop(T& x) ; IntStack s1; int isEmpty() const; FloatStack s2; int isFull() const; }; 15
  16. Tạo mẫu lớp n Cú pháp: Khai báo tên mẫu template class Stack { Stack() ; ~Stack() ; int push(const T&); int pop(T&) ; T* top; }; Tên mẫu sẽ được sử dụng trong thân lớp cho các thành phần dữ liệu và các hàm thành viên 16
  17. Sử dụng mẫu lớp n Lớp thể hiện: là lớp được tạo ra từ mẫu lớp với các mẫu được thay thế bằng các kiểu dữ liệu cụ thể n Có 2 cách để tạo ra lớp thể hiện: q Cách 1: định nghĩa tường minh một lớp thể hiện cho một kiểu dữ liệu cụ thể từ mẫu lớp (với từ khóa typedef), rồi sau đó khai báo các đối tượng thuộc lớp thể hiện này. q Cách 2: Khai báo luôn các đối tượng thuộc lớp thể hiện ngầm định (không tường minh) 17
  18. 2 cách sử dụng mẫu lớp typedef Stack IntStack; Cách 1: typedef Stack FloatStack; tường minh IntStack s1; FloatStack s2; Cách 2: Stack s1; ngầm định Stack s2; 18
  19. Ví dụ áp dụng: xây dựng mẫu lớp Stack, tệp Stack.h //stack.h 1. #pragma once 2. template 3. class Stack 4. { 5. public: 6. Stack(unsigned int msize=10) ; 7. ~Stack() { delete [] top ; } 8. int push(const T&); 9. T pop() ; // pop an element off the stack 10. int isEmpty()const { return size == 0 ; } 11. int isFull() const { return size == maxsize ; } 12. private: 13. int size ; // Number of elements on Stack 14. int maxsize; 15. T* top ; 16. } ; 19
  20. Tệp Stack.h //stack.h (tiếp) 17.//constructor with the default size 10 18.template 19.Stack ::Stack(unsigned int msize) 20.{ 21. size = 0; 22. maxsize=msize; 23. top = msize>0?(new T[msize]):NULL; 24.} 20
  21. Tệp Stack.h //stack.h (tiếp) 25.// push an element onto the Stack 26.template 27.int Stack ::push(const T& item) 28.{ 29. if (!isFull()) 30. { 31. top[size] = item ; 32. size++; 33. return 1 ; // push successful 34. } 35. return 0 ; // push unsuccessful 36.} 21
  22. Tệp Stack.h //stack.h (tiếp) 37.// pop an element off the Stack 38.template 39.T Stack ::pop() 40.{ 41. if (!isEmpty()) 42. { 43. size ; 44. return top[size]; // pop successful 45. } 46. return NULL ; // pop unsuccessful 47.} 22
  23. Sử dụng Stack theo cách 1. Hàm main 1. #include 2. #include "Stack.h" Output: 3. using namespace std; Stack of integers: 4. typedef Stack IntStack; 9 8 7 6 5 4 3 2 1 5. int main(int argc, char argv) 6. { 7. IntStack si(20); 8. for (int i=1;i<10;i++) si.push(i); 9. cout<<"Stack of integers: "; 10. while (!si.isEmpty()) { 11. cout<<si.pop()<<" "; 12. } 13. return 0; 14.} 23
  24. Sử dụng Stack theo cách 2. Hàm main 1. #include 2. #include "Stack.h" Output: 3. using namespace std; Stack of characters: 4. int main(int argc, char argv) J I H G F E D C B A 5. { 6. Stack sc(30); 7. for (int i=0;i<10;i++) sc.push('A'+i); 8. cout<<"Stack of characters: "; 9. while (!sc.isEmpty()) { 10. cout<<sc.pop()<<" "; 11. } 12. return 0; 13.} 24
  25. Các câu hỏi tóm tắt n Thế nào là một mẫu ? n Mục đích của việc xây dựng mẫu là gì ? n Thế nào là mẫu hàm ? n So sánh giữa mẫu hàm và sự chồng hàm n Mẫu lớp là gì ? n Nêu các cách sử dụng mẫu lớp 25
  26. Bài tập n Bài 1: Viết mẫu hàm tính tổng của một dãy N phần tử n Bài 2: Viết mẫu hàm cho phép tìm một phần tử K trong một dãy A có N phần tử n Bài 3: Xây dựng mẫu lớp cho cấu trúc hàng đợi n Bài 4: Xây dựng mẫu lớp cho danh sách tổng quát, sử dụng cấu trúc lưu trữ móc nối đơn, mà có các thao tác sau: q Khởi tạo: tạo một danh sách rỗng q Lấy kích thước của danh sách q Bổ sung: bổ sung một phần tử vào đầu, vào cuối, và vào một vị trí bất kỳ trong danh sách q Lấy ra: lấy ra một phần tử ở đầu, ở cuối và ở vị trí bất kỳ trong danh sách 26
  27. Thank you! 27