Professional Documents
Culture Documents
Hàm (function)
• Tại
ạ thời điểm hàm được ợ gọgọi trongg main,, điều khiển được ợ
chuyển cho hàm addition, khi đó chạy hàm main bị dừng lại và
chỉ tiếp tục khi hàm addition kết thúc.
• Tại
T i lúc
lú hàm
hà được
đ gọi,i giá
iá trịị của
ủ cảả hai
h i đối (5 vàà 3) được
đ sao
chép tới biến cục bộ int a và int b trong hàm addtion.
• Biến cục bộ khác được khai báo (int r). Trong trường hợp này
a là 5, b là 3 và kết quả là 8 được gán cho r.
• Câu lệnh cuối cùng trong hàm : return r;
2. Phân tích
• Cuối của hàm addition, và trả điều khiển trở lại nơi mà hàm
được gọi, trong trường hợp này là hàm main(). Đúng lúc này,
chương
h t ì h tiếp
trình tiế tục
t trở
t ở lại
l i tiến
tiế trình
t ì h trong
t main
i chính
hí h xác á tạit i
thời điểm nó bị ngắt để gọi hàm addition.
• Giá trịị của biến địa
ị p
phươngg r,, tại
ạ thời điểm trả về có ggiá trịị là 8
• Sau đó hàm main đơn gian chỉ là in giá trị bằng cách gọi
cout << "The result is " << z;
• Một hàm có thể được gọi nhiều lần trong chương trình.
• Xem phân tích: sử dụng chạy từng bước trong Debug.
Debug
3. Hàm void
• Nếu hàm không cần trả về giá trị. Trường hợp này, kiểu(type)
được sử dụng là void,
void để thể hiện sự vắng mặt của giá trị trả về.
về
• Cú pháp :
type name ( argument1, argument2 ...) { statements }
• Ví dụ: hàm in thông báo – kết quả
void in_thong_bao (){
cout << “Day la mot ham!";
}
i t main
int i (){
in_thong_bao (); // không được bỏ dấu ().
}
4. Đối được truyền bằng giá trị hoặc tham chiếu
• Trong các hàm trước đó, các đối số luôn luôn được truyền
bằng giá trị. Nghĩa là, khi gọi một hàm, những gì được truyền
vào hàm là các giá trị củaủ các đối
ố sốố này vào thời điểm
ể gọi,
được sao chép vào các biến thể hiện bởi các tham số hàm.
• Ví dụ: int x = 5,
5 y = 3,
3 z;
z = addition ( x, y );
• Hàm addition được truyền 5 và 3, là các bản sao của các biến
x và y tương ứng.
• Bất
ấ kỳ sự thay
h đổi
đổ các
á biến
b ế trong hàm
hà không
khô làm
là ảnh
ả h hưởng
h ở
đến các biến x và y bên ngoài hàm addition.
• Vì x, y không truyền chính nó cho hàm trong khi gọi, mà chỉ là
bản sao của chúng tại thời điểm hiện tại.
4. Đối được truyền bằng giá trị hoặc tham chiếu
• Trường hợp,
hợp có thể sử dụng để truy cập một biến bên ngoài từ
bên trong một hàm. (mô đun nhập số liệu nhap_ab)
• Để làm điều đó, đối có thể được truyền tham chiếu (reference)
– địa chỉ) thay bằng giá trị.
• Để truy cập các đối số của nó, hàm khai báo các tham số của nó
như các tham chiếu.
chiếu Trong C + +,
+ tham chiếu ký hiệu (&) liền
sau kiểu tham số.
• Khi một biến được truyền bằng tham chiếu, biến được truyền
đi không còn là một bản
ả sao nữa.
• Bất kỳ sửa đổi nào trên các biến cục bộ tương ứng của chúng
trong hàm được tác động trở lại vào biến được truyền như các
đối số trong cuộc gọi.
5. Tham chiếu sử dụng const
• Hàm hoạt động trực tiếp trên (bí danh của) các chuỗi truyền
như là đối số.
• Phiên bản của cong_ab lấy tham chiếu hiệu quả hơn nhiều so
với phiên bản lấy giá trị, vì nó không cần phải sao chép “đắt
tiền” để sao chép chuỗi.
tiền chuỗi
• Mặt khác, hàm với các tham chiếu thường được coi là các
hàm sửa đổi các đối số được truyền.
• Giải pháp để đảm bảo rằng tham chiếu của nó sẽ không được
sửa đổi bởi hàm này, được thực hiện bằng cách áp đặt các
tham số như hằng số (const):
string cong_ab (const string& a, const string& b){
return a+b;;
}// truy cập trực tiếp các đối, ko bản sao, ko thay đổi
5 Tham chiếu sử dụng const
5.
• Vì vậy,
ậy, các tham chiếu const cungg cấpp các tính chất tươngg tựự
như truyền các đối số theo giá trị, nhưng với hiệu suất tăng
lên cho các tham số của các kiểu lớn. Đó là, lý do tại sao chúng
cực kỳ phổ biến trong C++ cho các đối số của các kiểu kết hợp.
hợp
• Lưu ý rằng, đối với hầu hết các kiểu cơ bản (int, float,
double,…), không có sự khác biệt đáng chú ý về hiệu suất, và
trong một số trường hợp, các tham chiếu const thậm chí có
thể kém hiệu quả hơn!
6. Con trỏ trỏ tới hàm ‐ Pointers to functions
• C++ cho phép thao tác với con trỏ tới hàm. Sử dụng của con
trỏ là để truyền một hàm như là một đối của hàm khác.
• Các con trỏ tới hàm được khai báo giống như khai báo hàm
thông thường, ngoại trừ tên của hàm là nằm trong ngoặc và
một dấu * được đặt trước tên: ((*function
function_name).
name)
• Khai báo thông thường biến con trỏ: type *var_name
• Vậy
ậy các đối thì viết thế nào?
• Khai báo hàm thông thường:
double ten_ham (int a, int b);
• Con trỏ hàm: double (*ten_ham)(int, int);
C++ cho phép truyền con trỏ tới một hàm. Để làm điều này, khai
báo tham số như kiểu con trỏ.
#include<iostream>
void f(int *j);
int main() {
int i;
int *p;
p = &i; // p tro toi i
f(p); // f(&i);
cout<<"Gia
cout<< Gia tri cua i = "<<*p<<endl;
<< p<<endl;
}
void f(int *j){
*j = 100;
}
11. Gọi hàm với đối là mảng một chiều
• Có 3 cách
á h để khai
kh i báo
bá tham
th sốố để nhận
hậ mảng
ả con trỏ.
tỏ
1. Cách 1: Khai báo mảng giống kiểu và kích thước sử dụng để gọi
hàm.
• Ví dụ 1:
int main() {
int num[10];
for(int j=0;j<10;j++) num[j]=j;
display(num);
p y( );
}
void display(int num[10]) {
i i;i
int
for(i=0;i<10;i++) {
cout<<"num["<<i<<"]
cout num[ i ] = "<<num[i]<<endl;
num[i] endl;
}
}
12. Mảng 2 chiều
• Cách 2:
• Dùng 2 đối:
float *pa; // biểu thị địa chỉ đầu của mảng a
int N; // biểu thị số cột của mảng a
• Trong thân hàm, để truy cập đến phần tử a[i][j] ta dùng công
thức
thức. *(pa+i*N+j)
• Chú ý: mảng hai chiều được qui về mảng một chiều, phức tạp
hơn cách 1,, nhưngg khôngg cố định
ị bao nhiêu cột,
ộ , nên có thể
dùng hàm cho bất kỳ mảng hai chiều nào.
13. Gọi hàm với đối là xâu ký tự (string)
• sin(x),
( ), cos(x),
( ), tan(x),
( ), asin(x),
( ), acos(x),
( ), atan();
();
• atan2(y,x):
• sinh(x), cosh(x), tanh(x);
• pow(x,y), sqrt(x)
• ceil(x), floor(x);
• fabs(x),
( ) fmod(x,y)
( )
• exp(x), log(x), log10(x)
Function Description
abs(x) Returns the absolute value of x
acos(x) Returns the arccosine of x, in radians
asin(x) Returns the arcsine of x,
x in radians
atan(x) Returns the arctangent of x, in radians
cbrt(x) Returns the cube root of x
ceil(x) Returns the value of x rounded up to its nearest integer
cos(x) Returns the cosine of x,
x in radians
cosh(x) Returns the hyperbolic cosine of x, in radians
x
exp(x) Returns the value of E
x
expm1(x) Returns e ‐1
fabs(x) Returns the absolute value of a floating x
fdim(x, y) Returns the positive difference between x and y
Function Description
( )
floor(x) Returns the value of x rounded down to its nearest
integer
2 2
hypot(x, y) Returns sqrt(x +y ) without intermediate overflow
or underflow
d fl
fma(x, y, z) Returns x*y+z without losing precision
fmax(x y)
fmax(x, Returns the highest value of a floating x and y
fmin(x, y) Returns the lowest value of a floating x and y
fmod(x, y) Returns the floating point remainder of x/y
pow(x, y) Returns the value of x to the power of y
sin(x) Returns the sine of x (x is in radians)
sinh(x) Returns the hyperbolic sine of a double value
tan(x) Returns the tangent of an angle
tanh(x) Returns the hyperbolic tangent of a double value