Professional Documents
Culture Documents
202 PF Chapter 4 Function
202 PF Chapter 4 Function
1)
ThS.
Trần Ngọc Bảo Duy
HÀM (P.1)
Khái niệm về hàm
Hàm là gì?
Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Function (P.1).1
Function (P.1)
Tổng quan
ThS.
Trần Ngọc Bảo Duy
Các nguyên tắc thực thi khi gọi hàm Các nguyên tắc thực thi khi gọi
hàm
Tổ chức mã nguồn
Tổ chức mã nguồn Hàm inline
Function (P.1).2
Function (P.1)
ThS.
Trần Ngọc Bảo Duy
Function (P.1).3
Function (P.1)
Hàm là gì?
ThS.
Trần Ngọc Bảo Duy
Định nghĩa
Hàm là một đơn vị xử lý bao gồm một chuỗi các lệnh có
liên quan, được thực hiện cùng nhau để hoàn thành một
Khái niệm về hàm
công việc nào đó. Hàm là gì?
Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Function (P.1).4
Function (P.1)
Hàm là gì?
ThS.
Trần Ngọc Bảo Duy
Định nghĩa
Hàm là một đơn vị xử lý bao gồm một chuỗi các lệnh có
liên quan, được thực hiện cùng nhau để hoàn thành một
Khái niệm về hàm
công việc nào đó. Hàm là gì?
Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Function (P.1).4
Function (P.1)
Hàm là gì?
ThS.
Trần Ngọc Bảo Duy
Định nghĩa
Hàm là một đơn vị xử lý bao gồm một chuỗi các lệnh có
liên quan, được thực hiện cùng nhau để hoàn thành một
Khái niệm về hàm
công việc nào đó. Hàm là gì?
Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Function (P.1).4
Function (P.1)
Hàm là gì?
ThS.
Trần Ngọc Bảo Duy
Function (P.1).5
Function (P.1)
Hàm là gì?
ThS.
Trần Ngọc Bảo Duy
Các giá trị Chuỗi lệnh Các giá trị Truyền tham số cho
hàm
đầu vào của hàm đầu ra Truyền bằng trị
Truyền bằng tham chiếu
Function (P.1).5
Function (P.1)
Lý do sử dụng hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).6
Function (P.1)
Lý do sử dụng hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).6
Function (P.1)
Lý do sử dụng hàm
ThS.
Trần Ngọc Bảo Duy
2 Sử dụng lại một đơn vị tính toán mà không cần phải Tự định nghĩa một
hàm
viết lại. Tự định nghĩa một hàm
Các nguyên tắc thực thi khi gọi
• Tiết kiệm thời gian phát triển. hàm
Tổ chức mã nguồn
• Có thể chia sẽ đơn vị tính toán không chỉ cho một dự Hàm inline
Function (P.1).6
Function (P.1)
Lý do sử dụng hàm
ThS.
Trần Ngọc Bảo Duy
2 Sử dụng lại một đơn vị tính toán mà không cần phải Tự định nghĩa một
hàm
viết lại. Tự định nghĩa một hàm
Các nguyên tắc thực thi khi gọi
• Tiết kiệm thời gian phát triển. hàm
Tổ chức mã nguồn
• Có thể chia sẽ đơn vị tính toán không chỉ cho một dự Hàm inline
Function (P.1).6
Function (P.1)
Hàm main
ThS.
Trần Ngọc Bảo Duy
} Tổ chức mã nguồn
Hàm inline
Function (P.1).7
Function (P.1)
Hàm main
ThS.
Trần Ngọc Bảo Duy
} Tổ chức mã nguồn
Hàm inline
Function (P.1).7
Function (P.1)
Hàm main
ThS.
Trần Ngọc Bảo Duy
} hàm
Tổ chức mã nguồn
Hàm inline
Function (P.1).7
Function (P.1)
Hàm main
ThS.
Trần Ngọc Bảo Duy
int main () {
// Some commands Khái niệm về hàm
Hàm là gì?
return 0; Tại sao phải sử dụng hàm?
Function (P.1).7
Function (P.1)
Truyền tham số vào dòng lệnh
ThS.
Trần Ngọc Bảo Duy
for ( int i = 0; i < argc ; i ++) Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
cout << " Thong ␣ so ␣ thu ␣ " << i << " : ␣ "
Tự định nghĩa một
<< argv [ i ] << endl ; hàm
Tự định nghĩa một hàm
Các nguyên tắc thực thi khi gọi
return EXIT_SUCCESS ; hàm
Tổ chức mã nguồn
} Hàm inline
Sau khi dịch thành công thành file main, chạy: Truyền tham số cho
hàm
Truyền bằng trị
Function (P.1).8
Function (P.1)
Truyền tham số vào dòng lệnh
ThS.
Trần Ngọc Bảo Duy
Function (P.1).8
Function (P.1)
Truyền tham số vào dòng lệnh
ThS.
Trần Ngọc Bảo Duy
1 argc: số lượng các thông số, kể cả tên chương trình. Truyền tham số cho
hàm
2 argv:một danh sách các chuỗi, mỗi chuỗi là một thông Truyền bằng trị
Truyền bằng tham chiếu
số. Khi truyền vào, tất cả các dữ liệu điều được hiểu
như chuỗi.
Function (P.1).8
Function (P.1)
Hàm thư viện
ThS.
Trần Ngọc Bảo Duy
1 Dùng chỉ thị tiền xử lý #include để thông báo với trình Khái niệm về hàm
Hàm là gì?
biên dịch là có một sử dụng một thư viện nào đó. Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Ví dụ: #include <math.h>. Tự định nghĩa một
hàm
2 Gọi các hàm cần thiết. Khi gọi một hàm chỉ cần biết: Tự định nghĩa một hàm
Các nguyên tắc thực thi khi gọi
• Các giá trị cần cung cấp cho hàm. Hàm inline
Function (P.1).9
Function (P.1)
ThS.
Trần Ngọc Bảo Duy
TỰ ĐỊNH NGHĨA
Hàm là gì?
Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Function (P.1).10
Function (P.1)
Sử dụng hàm tự tạo
ThS.
Trần Ngọc Bảo Duy
• Mô tả một hàm.
Hàm main và hàm thư viện
Function (P.1).11
Function (P.1)
Định nghĩa hàm, Gọi hàm
ThS.
Trần Ngọc Bảo Duy
13 } dấu phẩy ,.
Function (P.1).12
Function (P.1)
Định nghĩa hàm, Gọi hàm
ThS.
Trần Ngọc Bảo Duy
4 int add ( int a , int b ) các câu lệnh được thực hiện Hàm main và hàm thư viện
13 }
Function (P.1).12
Function (P.1)
Định nghĩa hàm, Gọi hàm
ThS.
Trần Ngọc Bảo Duy
4 int add ( int a , int b ) truyền vào các giá trị cho các Hàm main và hàm thư viện
7 return c ; định giá trị nào sẽ được Các nguyên tắc thực thi khi gọi
hàm
8 } truyền cho thông số nào. Tổ chức mã nguồn
9
• Phải truyền đủ (không Hàm inline
13 }
Function (P.1).12
Function (P.1)
Giá trị trả về của hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).13
Function (P.1)
Giá trị trả về của hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).13
Function (P.1)
Giá trị trả về của hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).13
Function (P.1)
Giá trị trả về của hàm
ThS.
Trần Ngọc Bảo Duy
• Khi hàm thực thi lệnh return, các lệnh phía sau sẽ dừng Hàm inline
Function (P.1).13
Function (P.1)
Giá trị trả về của hàm
ThS.
Trần Ngọc Bảo Duy
• Khi hàm thực thi lệnh return, các lệnh phía sau sẽ dừng Hàm inline
Function (P.1).13
Function (P.1)
Quá tải hàm (Function overloading)
ThS.
Trần Ngọc Bảo Duy
• C/C++ cho phép nhiều hàm cùng tên được định nghĩa,
miễn là các hàm này phải khác nhau về danh sách tham
số (về số lượng, về kiểu, về thứ tự của từng tham số). Khái niệm về hàm
Hàm là gì?
int add(int a, int b); Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
double add(double a, double b);
Tự định nghĩa một
int add(int a); hàm
Tự định nghĩa một hàm
Các nguyên tắc thực thi khi gọi
hàm
Tổ chức mã nguồn
Hàm inline
Function (P.1).14
Function (P.1)
Quá tải hàm (Function overloading)
ThS.
Trần Ngọc Bảo Duy
• C/C++ cho phép nhiều hàm cùng tên được định nghĩa,
miễn là các hàm này phải khác nhau về danh sách tham Khái niệm về hàm
Hàm là gì?
số (về số lượng, về kiểu, về thứ tự của từng tham số). Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
• Một khi một hàm (được quá tải) được gọi, trình biên
Tự định nghĩa một
dịch sẽ lựa chọn chính xác hàm cần thực thi bằng cách hàm
Tự định nghĩa một hàm
đánh giá số lượng, kiểu và thứ tự của các đối số trong Các nguyên tắc thực thi khi gọi
hàm
• Quá tải hàm thường được dùng để tạo ra các hàm có Truyền tham số cho
hàm
tên giống nhau để cùng thực hiện các tác vụ tương tự Truyền bằng trị
nhưng trên kiểu dữ liệu khác nhau. Truyền bằng tham chiếu
Function (P.1).14
Function (P.1)
Các nguyên tắc thực thi khi gọi hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).15
Function (P.1)
Các nguyên tắc thực thi khi gọi hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).15
Function (P.1)
Các nguyên tắc thực thi khi gọi hàm
ThS.
Trần Ngọc Bảo Duy
Function (P.1).15
Function (P.1)
Các nguyên tắc thực thi khi gọi hàm
ThS.
Trần Ngọc Bảo Duy
4 Chuyển điều khiển thực thi cho hàm được gọi để nó Hàm main và hàm thư viện
Function (P.1).15
Function (P.1)
Các nguyên tắc thực thi khi gọi hàm
ThS.
Trần Ngọc Bảo Duy
4 Chuyển điều khiển thực thi cho hàm được gọi để nó Hàm main và hàm thư viện
Function (P.1).15
Function (P.1)
Các nguyên tắc thực thi khi gọi hàm
ThS.
Trần Ngọc Bảo Duy
4 Chuyển điều khiển thực thi cho hàm được gọi để nó Hàm main và hàm thư viện
6 Khi hàm được gọi thực hiện lệnh return. Tổ chức mã nguồn
Hàm inline
• Giải phóng tất cả các biến cục bộ của nó. Truyền tham số cho
• Trả điều khiển về lệnh theo sau lệnh gọi hàm. hàm
Truyền bằng trị
Truyền bằng tham chiếu
Function (P.1).15
Function (P.1)
Các nguyên tắc thực thi khi gọi hàm
ThS.
Trần Ngọc Bảo Duy
4 Chuyển điều khiển thực thi cho hàm được gọi để nó Hàm main và hàm thư viện
6 Khi hàm được gọi thực hiện lệnh return. Tổ chức mã nguồn
Hàm inline
• Giải phóng tất cả các biến cục bộ của nó. Truyền tham số cho
• Trả điều khiển về lệnh theo sau lệnh gọi hàm. hàm
Truyền bằng trị
7 Hàm gọi giải phóng các thông số đã truyền và thực Truyền bằng tham chiếu
Function (P.1).15
Function (P.1)
Tổ chức mã nguồn
ThS.
Trần Ngọc Bảo Duy
int add ( int a , int b ) Phần mô tả (header)
{
int c ;
c = a + b; Phần thân hàm (body) Khái niệm về hàm
Hàm là gì?
return 0; Tại sao phải sử dụng hàm?
Function (P.1).16
Function (P.1)
Tổ chức mã nguồn
ThS.
Trần Ngọc Bảo Duy
int add ( int a , int b ) Phần mô tả (header)
{
int c ;
c = a + b; Phần thân hàm (body) Khái niệm về hàm
Hàm là gì?
return 0; Tại sao phải sử dụng hàm?
Phần mô tả nên được tách riêng khỏi toàn bộ phần định Các nguyên tắc thực thi khi gọi
hàm
Function (P.1).17
Function (P.1)
Hàm inline
ThS.
Trần Ngọc Bảo Duy
Function (P.1).18
Function (P.1)
Hàm inline
ThS.
Trần Ngọc Bảo Duy
Function (P.1).18
Function (P.1)
Hàm inline
ThS.
Trần Ngọc Bảo Duy
phí thực thi khi gọi hàm: thực thi của hàm inline được Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
• COPY các tham số. chèn trực tiếp tại vị trí gọi Tự định nghĩa một
hàm
• Lưu trữ các thanh ghi. hàm này: Tự định nghĩa một hàm
Các nguyên tắc thực thi khi gọi
• Phục hồi các thanh ghi. • Tiết kiệm chi phí gọi hàm hàm
Tổ chức mã nguồn
• Giải phóng các tham số. • Làm tăng kích thước tập Hàm inline
Function (P.1).19
Function (P.1)
ThS.
Trần Ngọc Bảo Duy
Function (P.1).20
Function (P.1)
Tham số và đối số
ThS.
Trần Ngọc Bảo Duy
Function (P.1).21
Function (P.1)
Hai kiểu truyền tham số cho hàm
ThS.
Trần Ngọc Bảo Duy
• Truyền bằng trị: Được sử dụng khi KHÔNG CHO Khái niệm về hàm
Hàm là gì?
PHÉP hàm được gọi thay đổi giá trị đối. Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
việc chuẩn bị tham số của hàm được gọi. Truyền tham số cho
hàm
Truyền bằng trị
Truyền bằng tham chiếu
Function (P.1).22
Function (P.1)
Các kiểu truyền tham số: Dấu hiệu
ThS.
Trần Ngọc Bảo Duy
Function (P.1).23
Function (P.1)
Các kiểu truyền tham số: Dấu hiệu
ThS.
Trần Ngọc Bảo Duy
Lúc đó, a và b sẽ được truyền bằng tham chiếu. Truyền tham số cho
hàm
Truyền bằng trị
Truyền bằng tham chiếu
Function (P.1).23
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
Function (P.1).24
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
Function (P.1).24
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
Function (P.1).24
Function (P.1)
Truyền bằng trị
ThS.
void swap ( int a , int b ) { Trần Ngọc Bảo Duy
int t = a ;
a = b;
b = t;
};
Khái niệm về hàm
Hàm là gì?
int main () { Tại sao phải sử dụng hàm?
int x = 10 , y = 100; Hàm main và hàm thư viện
cout << x << " ␣ " << y << endl ; Truyền tham số cho
hàm
Truyền bằng trị
return EXIT_SUCCESS ; Truyền bằng tham chiếu
a b
void swap ( int a , int b )
{
100
int t = a ; Khái niệm về hàm
Hàm là gì?
a = b; Tại sao phải sử dụng hàm?
Function (P.1).26
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
a b
void swap ( int a , int b )
{
10 100
int t = a ;
a = b; Khái niệm về hàm
Hàm là gì?
b = t; Tại sao phải sử dụng hàm?
} Hàm main và hàm thư viện
Function (P.1).26
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
a b
void swap ( int a , int b )
{
10 100
int t = a ; •
Khái niệm về hàm
a = b; Hàm là gì?
Function (P.1).26
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
a b
void swap ( int a , int b )
{
100 100
int t = a ;
Khái niệm về hàm
a = b; • Hàm là gì?
Function (P.1).26
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
a b
void swap ( int a , int b )
{
100 10
int t = a ;
Khái niệm về hàm
a = b; Hàm là gì?
Function (P.1).26
Function (P.1)
Truyền bằng trị
ThS.
Trần Ngọc Bảo Duy
a b
void swap ( int a , int b )
{
100 10
int t = a ;
a = b;
Khái niệm về hàm
b = t; 10 Hàm là gì?
Function (P.1).26
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
số ở đó không tạo ra bản sao, hoạt động như một tên gọi Tự định nghĩa một
hàm
khác (bí danh) của đối số. Điều này làm cho hiệu suất tốt Tự định nghĩa một hàm
Các nguyên tắc thực thi khi gọi
hơn nếu đối số là kiểu dữ liệu có kích thước lớn. hàm
Tổ chức mã nguồn
Vì vậy, mọi thao tác trên tham số truyền bằng tham chiếu Hàm inline
cũng làm thay đổi giá trị của đối số. Truyền tham số cho
hàm
Truyền bằng trị
Truyền bằng tham chiếu
Function (P.1).27
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
int y = 100; y
Hàm inline
x
swap (x , y ); Truyền tham số cho
hàm
return EXIT_SUCCESS ; Truyền bằng trị
} Truyền bằng tham chiếu
Function (P.1).28
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
Cấp một bí danh (alias) cho vùng nhớ của x và y là tên của
hai tham số a và b.
Function (P.1).28
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
Biến t được tạo ra và chứa giá trị của a (cũng là của x),
nghĩa là 10.
Function (P.1).28
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
Function (P.1).28
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
Function (P.1).28
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
Hoàn tất hoán đổi giá trị a và b, đồng thời cũng là trao đổi
giữa x và y. Do đó, khi nó kết thúc hai biến x và y trong
main bị thay đổi giá trị.
Function (P.1).28
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
Do tên tham số chỉ là một bí danh của một ô nhớ cho trước
nên đối số KHÔNG THỂ LÀ biến và biểu thức mà CHỈ
CÓ THỂ LÀ biến.
Function (P.1).28
Function (P.1)
Truyền bằng tham chiếu
ThS.
Trần Ngọc Bảo Duy
int y = 100; x, a
Các nguyên tắc thực thi khi gọi
y, b hàm
Ví dụ:
swap(x, y);
swap(10, 15);
swap(x + 10, y * 2);
Function (P.1).28
Function (P.1)
Truyền mảng vào hàm
ThS.
Trần Ngọc Bảo Duy
1 Mảng giá trị: truyền địa chỉ của phần tử đầu tiên vào Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Function (P.1).29
Function (P.1)
Truyền mảng vào hàm
ThS.
Trần Ngọc Bảo Duy
1 Mảng giá trị: truyền địa chỉ của phần tử đầu tiên vào Tại sao phải sử dụng hàm?
Hàm main và hàm thư viện
Cú pháp: hàm
Tổ chức mã nguồn
Hàm inline
1 void print1 ( int arr [ MAX_SIZE ] , int size );
Truyền tham số cho
2 void print2 ( int arr [] , int size ); hàm
3 void print3 ( int * arr , int size ); Truyền bằng trị
Truyền bằng tham chiếu
Function (P.1).29