Bài giảng Giới thiệu lập trình - Chương 11: Hàm nâng cao - Lê Nguyên Khôi

pdf 19 trang hoanguyen 3850
Bạn đang xem tài liệu "Bài giảng Giới thiệu lập trình - Chương 11: Hàm nâng cao - Lê Nguyên Khô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:

  • pdfbai_giang_gioi_thieu_lap_trinh_chuong_11_ham_nang_cao_le_ngu.pdf

Nội dung text: Bài giảng Giới thiệu lập trình - Chương 11: Hàm nâng cao - Lê Nguyên Khôi

  1. a
  2.  Nh ắc l ại Hàm – Cơ B ản  Nạp ch ồng hàm  Nạp ch ồng toán t ử Gi ới Thi ệu L ập Trình 1
  3. ơ  Khai báo hàm int bin ( int , int ) ;  Đị nh ngh ĩa hàm int bin ( int so1 , int so2 ) { // thân hàm miêu tả đị nh ngh ĩa // không khai báo l ại so1 , so2 }  Ch ữ ký hàm int bin ( int , int )  Lời g ọi hàm int a = bin ( so1 , so2 ) ;  Sử d ụng tên hàm, tên tham s ố, không có ki ểu Gi ới Thi ệu L ập Trình 2
  4. ơ a  Truy ền giá tr ị int bin ( int , int ) ;  Tạo và truy ền m ột b ản sao > t ốn chi phí  Thay đổ i b ản sao , b ản g ốc ngoài hàm không đổ i  Xóa b ản sao khi k ết thúc hàm  Truy ền tham chi ếu int bin ( int & , int & ) ;  Chính bản g ốc đượ c truy ền ( đị a ch ỉ b ản g ốc)  Thay đổ i trong hàm, b ản g ốc thay đổ i  Không xóa b ản g ốc khi k ết thúc hàm Gi ới Thi ệu L ập Trình 3
  5. ơ const  Truy ền tham chi ếu int bin ( int & , int & ) ;  Thay đổ i trong hàm, b ản g ốc thay đổ i  Không mu ốn hàm thay đổ i, s ử d ụng t ừ khóa const  Bảo v ệ d ữ li ệu, không cho thay đổ i, d ữ li ệu “ch ỉ-đọ c” int bin ( const int & , const int & ) ;  Quy ướ c:  Luôn truy ền tham chi ếu  Dữ li ệu không thay đổ i, dùng const  Dữ li ệu thay đổ i, không dùng const Gi ới Thi ệu L ập Trình 4
  6. a  Các hàm th ực hi ện công vi ệc t ươ ng t ự  Trùng tên, nh ưng khác nhau v ề tham s ố  Số l ượ ng tham s ố  Ki ểu tham s ố  Xác đị nh hàm nào đượ c g ọi:  Sử d ụng thông tin v ề tham s ố Số l ượ ng & ki ểu tham s ố  Ki ểu c ủa hàm Gi ới Thi ệu L ập Trình 5
  7. void _trungDiem ( const ToaDo & td1 , const ToaDo & td2 , ToaDo & trungDiem ) { trungDiem.x = ( td1.x + td2.x ) / 2; trungDiem.y = ( td1.y + td2.y ) / 2; } ToaDo * _trungDiem ( const ToaDo & td1 , const ToaDo & td2 ) { ToaDo * trungDiem = new ToaDo; (*trungDiem).x = ( td1.x + td2.x ) / 2; (*trungDiem).y = ( td1.y + td2.y ) / 2; return trungDiem; } Gi ới Thi ệu L ập Trình 6
  8.  Khác s ố l ượ ng tham s ố  Hàm tính t ổng các s ố truy ền vào  Tính tổng 3 s ố nguyên int _tong ( int , int , int ) ;  Tính t ổng 2 s ố nguyên int _tong ( int , int ) ;  Tính t ổng 1 số nguyên int _tong ( int ) ;  Dựa trên s ố l ượ ng tham s ố để g ọi hàm t ươ ng ứng Gi ới Thi ệu L ập Trình 7
  9.  Tham s ố m ặc đị nh int _tong(int so1, int so2 = 0, int so3 = 0) { return so1 + so2 + so3; }  Có th ể g ọi _tong ( 1 , 2 , 3 ) _tong ( 1 , 2 ) _tong ( 1 )  Có đị nh ngh ĩa hàm int _tong ( int , int )  _tong ( 1 , 2 ) gọi hàm nào Gi ới Thi ệu L ập Trình 8
  10.  Khác ki ểu tham s ố  Hàm tính t ổng 2 s ố truy ền vào int _tong ( int , int ) ; double _tong ( double , double ) ;  Dựa trên ki ểu tham s ố để g ọi hàm t ươ ng ứng  Tại sao không s ử d ụng chuy ển đổ i ki ểu t ự độ ng  Ki ểu tr ả v ề không đúng  Nguy hi ểm  _tong(1,2) gọi int _tong(int, int);  _tong(1.0,2.0) gọi double _tong(double, double); Gi ới Thi ệu L ập Trình 9
  11.  Khác ki ểu tham s ố  Hàm tính t ổng 2 s ố truy ền vào double _tong ( int , double ) ; double _tong ( double , int ) ;  Dựa trên ki ểu tham s ố để g ọi hàm t ươ ng ứng  Sử d ụng chuy ển đổ i ki ểu t ự độ ng _tong ( 3 , 3 ) ho ặc _tong ( 3.5 , 3.5 )  Gọi hàm nào  Thêm đầ y đủ int _tong ( int , int ) ; double _tong ( double , double ) ; Gi ới Thi ệu L ập Trình 10
  12.  Toán t ử th ực ch ất là hàm  Sử d ụng toán t ử gi ống l ời g ọi hàm  Viết theo m ột cách khác  Ví d ụ: so sánh b ằng  1 == 2 th ực ch ất == ( 1 , 2 ) Gi ới Thi ệu L ập Trình 11
  13.  Gi ống nh ư hàm, toán t ử c ũng có th ể n ạp ch ồng  Đị nh ngh ĩa toán t ử cho ki ểu d ữ li ệu m ới  Nạp ch ồng toán t ử so sánh cho ki ểu c ấu trúc struct PS { int ts , ms ; } ; bool operator == ( const PS & ps1 , const PS & ps2 ) { return ( ps1.ts * ps2.ms == ps2.ts * ps1.ms ) ; } bool operator != ( const PS & , const PS & ) ; Gi ới Thi ệu L ập Trình 12
  14. struct PS { int ts , ms ; } ; bool operator == ( const PS & , const PS & ) ; bool operator != ( const PS & , const PS & ) ; int main() { PS ps1 , ps2 ; // nh ập d ữ li ệu if ( ps1 == ps2 ) if ( ps1 != ps2 ) } Gi ới Thi ệu L ập Trình 13
  15. struct PS { int ts , ms ; } ; PS operator + ( const PS & ps1 , const PS & ps2 ) { PS tongPS; // c ập nh ật tongPS return tongPS; } int main() { PS ps1 , ps2 , tongPS ; tongPS = ps1 + ps2 ; } Gi ới Thi ệu L ập Trình 14
  16. struct PS { int ts , ms ; } ; PS operator + ( const PS & ps , const int & i ) { PS tongPS; // c ập nh ật tongPS return tongPS; } int main() { PS ps , tongPS ; tongPS = ps + 1 ; } Gi ới Thi ệu L ập Trình 15
  17. ostream & operator << ( ostream & outStream , const PS & ps ) { outStream << ps.ts << "/" << ps.ms ; return outStream; } int main() { PS ps , tongPS ; tongPS = ps + 1 ; cout << tongPS; } Gi ới Thi ệu L ập Trình 16
  18. a int _getMax(int so1 , int so2) { if (so1 < so2) return so2; return so1; } double _getMax(double so1 , double so2) { if (so1 < so2) return so2; return so1; } PS _getMax(PS so1 , PS so2) { if (so1 < so2) return so2; return so1; } Gi ới Thi ệu L ập Trình 17
  19. a template T _getMax ( T so1 , T so2 ) { if ( so1 ( ps1 , ps2 ) ; } Gi ới Thi ệu L ập Trình 18