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 đủ
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:
bai_giang_ky_thuat_lap_trinh_chuong_3_ham.pdf

