Bài giảng Giới thiệu lập trình - Hàm - nâng cao - Lê Nguyên Khôi
Tóm tắt Bài giảng Giới thiệu lập trình - Hàm - nâng cao - Lê Nguyên Khôi: ... 6 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 ) / ...ouble , 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 Hàm Nạp Chồng 10 Khác kiểu tham...ts * ps2.ms == ps2.ts * ps1.ms ) ; } bool operator != ( const PS & , const PS & ) ; Giới Thiệu Lập Trình Toán Tử Nạp Chồng 13 struct PS { int ts , ms ; } ; bool operator == ( const PS & , const PS & ) ; bool operator != ( const PS & , const PS & ) ; int main() { PS ps1 , ps2 ; // nhập...
Giới Thiệu Lập Trình Hàm – Nâng Cao TS. Lê Nguyên Khôi Trường Đại học Công nghệ, ĐHQGHN Nội Dung 1 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 Hàm – Cơ Bản 2 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 Hàm – Cơ Bản – Truyền Tham Số 3 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 Hàm – Cơ Bản – Sử Dụng const 4 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 Hàm Nạp Chồng (Function Overloading) 5 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 Hàm Nạp Chồng – Ví Dụ 6 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 Hàm Nạp Chồng 7 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 Hàm Nạp Chồng 8 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 Hàm Nạp Chồng 9 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 Hàm Nạp Chồng 10 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 Toán Tử 11 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 Toán Tử Nạp Chồng 12 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 Toán Tử Nạp Chồng 13 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 Toán Tử Nạp Chồng 14 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 Toán Tử Nạp Chồng 15 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 Toán Tử Nạp Chồng 16 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 Template – Giới Thiệu 17 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 Template – Giới Thiệu 18 template T _getMax ( T so1 , T so2 ) { if ( so1 < so2 ) return so2; return so1; } int main() { PS ps1 , ps2 , psMax; psMax = _getMax ( ps1 , ps2 ) ; } Giới Thiệu Lập Trình
File đính kèm:
- bai_giang_gioi_thieu_lap_trinh_ham_nang_cao_le_nguyen_khoi.pdf