Bài giảng Kỹ thuật lập trình - Chương 3: Hàm

Chương 3:  
Hàm  
Nội dung  
1. Truyền tham trị, tham biến và tham số ngầm  
định  
2. Đa năng hó a hàm (function overload)  
3. Con trỏ hàm và tham số hó a hàm  
4. Khá i quá t hó a hàm (function templates)  
5. Biểu thức lamda và hàm nặc danh  
2
Khá i niệm về hàm  
• Là một nhó m cá c khai bá o và cá c câ u lệnh  
được gá n một tên gọi  
• Đây là khối lệnh được đặt tên nên sử dụng thuận  
tiện, hiệu quả  
• Hàm thường trả về một giá trị  
• Là một chương trì nh con  
• Khi viết chương trì nh C/C++ ta luô n định nghĩa một  
hàm có tên là main  
• Phí a trong hàm main ta có thể gọi cá c hàm khá c  
• Bản than cá c hàm này lại có thể gọi cá c hàm  
khá c ở trong nó và cứ tiếp tục như vậy…  
3
Cấu phá p  
return-type name(argument-list)  
{
local-declarations  
statements  
return return-value;  
}
4
Ví dụ: Square  
Đây là định nghĩa hàm ngoài  
hàm main  
int main(void)  
{
double num = 0.0, sqr = 0.0;  
printf("enter a number\n");  
scanf("%lf",&num);  
Đây là chỗ gọi hàm  
square  
sqr = square(num);  
printf("square of %g is %g\n", num, sqr);  
return 0;  
}
5
Tại sao cần sử dụng hàm?  
• Chia vấn đề thành nhiều tá c vụ con  
• Dễ dàng hơn khi giải quyết cá c vấn đề phức  
tạp  
• Tổng quá t hó a được tập cá c câ u lệnh  
hay lặp lại  
• Ta khô ng phải viết cùng một thứ lặp đi lặp  
lại nhiều lần  
• printf và scanf là ví dụ điển hì nh…  
• Hàm giúp chương trì nh dễ đọc và bảo trì  
hơn nhiều  
6
Hàm và truyền tham số  
• Trong C: tên hàm phải là duy nhất, lời gọi hàm phải có các  
đối số đúng bằng và hợp tương ứng về kiểu với tham số  
trong đn hàm. C chỉ có duy nhất 1 cách truyền tham số:  
tham trị (kể cả dùng địa chỉ cũng vậy).  
• Trong C++: ngoài truyền tham trị, C++ còn cho phép truyền  
tham chiếu. Tham số trong C++ còn có kiểu tham số ngầm  
định (default parameter), vì vậy số đối số trong lời gọi hàm  
có thể ít hơn tham số định nghĩa. Đồng thời C++ còn có cơ  
chế đa năng hóa hàm, vì vậy tên hàm không phải duy nhất.  
7
Truyền tham chiếu  
• Hàm nhận tham số là con trỏ  
void Swap(int *X, int *Y) {  
int Temp = *X;  
*X = *Y;  
*Y = Temp;  
}
• Để hoán đổi giá trị hai biến A và B  
Swap(&A, &B);  
8
Truyền tham chiếu  
• Hàm nhận tham số là tham chiếu  
void Swap(int &X, int &Y){  
int Temp = X;  
X = Y;  
Y = Temp;  
}
• Để hoán đổi giá trị hai biến A và B  
Swap(A, B);  
9
Truyền tham chiếu  
#include <iostream.h>  
Khi một hàm trả  
về một tham  
chiếu, chúng ta  
có thể gọi hàm  
ở phía bên trá i  
của một phép  
gá n.  
int X = 4;  
int & MyFunc(){  
return X;  
}
int main(){  
Cout << "X=“ << X << endl;  
Cout << "X=“ << MyFunc() << endl;  
MyFunc() = 20; // ~X=20  
Cout << "X=“ << X << endl;  
return 0;  
}
10  
Tham số ngầm định  
• Định nghĩa cá c giá trị tham số mặc định cho cá c hàm  
• Ví dụ  
void MyDelay(long Loops = 1000){  
for(int I = 0; I < Loops; ++I) ;  
}
• MyDelay(); // Loops có giá trị là 1000  
• MyDelay(5000); // Loops có giá trị là 5000  
11  
Tham số ngầm định  
• Nếu có prototype, các tham số có giá trị mặc định chỉ  
được cho trong prototype của hàm và không được lặp  
lại trong định nghĩa hàm.  
• Một hàm có thể có nhiều tham số có giá trị mặc định.  
Cá c tham số có giá trị mặc định cần phải được nhóm  
lại vào các tham số cuối cùng (hoặc duy nhất) của một  
hàm. Khi gọi hàm có nhiều tham số có giá trị mặc  
định, chúng ta chỉ có thể bỏ bớt các tham số theo thứ  
tự từ phải sang trái và phải bỏ liên tiếp nhau  
• Ví dụ:  
int MyFunc(int a = 1, int b, int c = 3, int d = 4); // ✖  
int MyFunc(int a, int b = 2, int c = 3, int d = 4); // ✔  
12  
Đa năng hó a hàm (Overloading)  
• Cung cấp nhiều hơn một định nghĩa cho tên hàm đã  
cho trong cùng một phạm vi.  
• Trì nh biên dịch sẽ lựa chọn phiên bản thích hợp của  
hàm hay toán tử dựa trên các tham số mà nó được  
gọi.  
13  
#include <iostream.h>  
#include <math.h>  
int MyAbs(int X){  
return abs(X);  
}
long MyAbs(long X){  
return labs(X);  
}
double MyAbs(double X){  
return fabs(X);  
}
int main(){  
int X = -7;  
long Y = 200000l;  
double Z = -35.678;  
cout << "Tri tuyet doi cua so nguyen " << X <<" la " <<  
MyAbs(X) << endl;  
cout << "Tri tuyet doi cua so nguyen " << Y <<" la " <<  
MyAbs(Y) << endl;  
cout << "Tri tuyet doi cua so real " << Z <<" la " << MyAbs(Z)  
<< endl;  
return 0;  
}
14  
Đa năng hoá toá n tử  
• Định nghĩa lại chức năng của các toán tử  
đã có sẵn  
▪ Thể hiện các phép toán một cách tự nhiên  
hơn  
• Ví dụ: thực hiện các phép cộng, trừ số  
phức  
▪ Trong C: Cần phải xây dựng các hàm  
AddSP(), TruSP()  
▪ Khô ng thể hiện được phép cộng và trừ cho  
các biểu thức như: a=b+c-d+e+f-h-k  
15  
#include <stdio.h>  
struct SP {  
double real;  
double img;  
};  
SP SetSP(double real, double img);  
SP AddSP(SP C1,SP C2);  
SP SubSP(SP C1,SP C2);  
void DisplaySP(SP C);  
int main(void) {  
SP C1,C2,C3,C4;  
C1 = SetSP(1.0,2.0);  
C2 = SetSP(-3.0,4.0);  
cout << "\nSo phuc thu nhat:";  
cout << "\nSo phuc thu hai:";  
C3 = AddSP(C1,C2);  
C4 = SubSP(C1,C2);  
DisplaySP(C1);  
DisplaySP(C2);  
cout << "\nTong hai so phuc nay:"; DisplaySP(C3);  
cout << "\nHieu hai so phuc nay:"; DisplaySP(C4);  
return 0;  
}
16  
SP SetSP(double real,double img) {  
SP tmp;  
tmp.real = real; tmp.img = img;  
return tmp;  
}
SP AddSP(SP C1,SP C2) {  
SP tmp;  
tmp.real = C1.real + C2.real;  
tmp.img = C1.img + C2.img;  
return tmp;  
}
SP SubSP(SP C1,SP C2) {  
SP tmp;  
tmp.real = C1.real - C2.real;  
tmp.img = C1.img - C2.img;  
return tmp;  
}
void DisplaySP(SP C) {  
cout << C.real << " i " << C.img;  
}
C++  
• C++ cho phép chúng ta có thể định nghĩa lại chức năng  
của các toán tử đã có sẵn một cách tiện lợi và tự nhiên.  
Điều này gọi là đa năng hóa toán tử.  
• Một hàm định nghĩa một toán tử có cú pháp sau:  
data_type operator operator_symbol ( parameters ){  
………………………………  
}
Trong đó:  
• data_type: Kiểu trả về.  
• operator_symbol: Ký hiệu của toán tử.  
• parameters: Các tham số (nếu có).  
#include <iostream.h>  
struct { double real; double img;} SP;  
SP SetSP(double real, double img);  
void DisplaySP(SP C);  
SP operator + (SP C1, SP C2);  
SP operator - (SP C1, SP C2);  
int main() {  
SP C1,C2,C3,C4;  
C1 = SetSP(1.1,2.0);  
C2 = SetSP(-3.0,4.0);  
cout << "\nSo phuc thu nhat:"; DisplaySP(C1);  
cout << "\nSo phuc thu hai:"; DisplaySP(C2);  
C3 = C1 + C2;  
C4 = C1 - C2;  
cout << "\nTong hai so phuc nay:"; DisplaySP(C3);  
cout << "\nHieu hai so phuc nay:"; DisplaySP(C4);  
return 0;  
}
SetSP(double real,double img) {  
SP tmp;  
tmp.real = real; tmp.img = img;  
return tmp;  
}
SP operator + (SP C1,SP C2) {  
SP tmp;  
tmp.real = C1.real + C2.real;  
tmp.img = C1.img + C2.img;  
return tmp;  
}
SP operator - (SP C1,SP C2) {  
SP tmp;  
tmp.real = C1.real - C2.real;  
tmp.img = C1.img - C2.img;  
return tmp;  
}
void DisplaySP(SP C) {  
cout << "(“ << C.real << ",“ << C.img << ")";  
}
Tải về để xem bản đầy đủ
pdf 43 trang yennguyen 21400 Free
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 - Chương 3: Hàm", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_ky_thuat_lap_trinh_chuong_3_ham.pdf