Learning outcomes L.O.4.1 – Xác định được thành phần của một hàm.. L.O.4.3 – Giải thích được các kiểu truyền tham số trong C.. static định nghĩa: hàm chỉ được gọi cục bộ trong module
Trang 1Chương 6
Hàm (Function)
Presenter:
Trang 2Learning outcomes
L.O.4.1 – Xác định được thành phần của một hàm
L.O.4.2 – Hiện thực được giải thuật dưới dạng hàm
L.O.4.3 – Giải thích được các kiểu truyền tham số trong C
L.O.4.4 – Tổ chức được các chương trình lớn, gồm nhiều
hàm
L.O.3.5 – Hiện thực được các giải thuật đệ quy bằng ngôn
ngữ C và hiểu được nguyên tắc hoạt động của nó
Trang 3Tổ chức chương trình C
Cấu trúc module
#<Tiền xử lý>
Mô tả module
Khai báo / định nghĩa
Hàm 1
Hàm 2
Hàm 3
Tiền xử lý:
• #include
• #define
Khai báo / định nghĩa:
• Hằng
• Biến
• Hàm/biến extern
• Mô tả hàm
Các hàm:
• main được chạy đầu tiên
• Định nghĩa ngang cấp, không lồng nhau
• Được gọi mới chạy
Trang 4Tổ chức chương trình C
Project/solution : chương trình
Lập trình theo module
Source file
#<Tiền xử lý>
Mô tả module Khai báo / định nghĩa
Hàm 1 Hàm 2 Hàm 3
#<Tiền xử lý>
Mô tả module Khai báo / định nghĩa
Hàm 1 Hàm 2 Hàm 3
#<Tiền xử lý>
Mô tả module Khai báo / định nghĩa
Hàm 1 Hàm 2 Hàm 3
#<Tiền xử lý>
Mô tả module Khai báo / định nghĩa
Hàm 1 Hàm 2 Hàm 3
Chia ra nhiều cpp
Trang 5Hàm là gì ?
Hàm là phương tiện phân chia code của module ra nhiều
đơn vị nhỏ hơn để dễ quản lý và sửa chữa
Một Module = tập hợp N hàm
Trang 6Các vấn đề của hàm
Hàm
Khai báo hàm
Định nghĩa hàm
Gọi hàm
Truyền tham số hàm
Trực tiếp
Gián tiếp
Trị
Tham khảo
Định nghĩa biến
Lệnh thực thi
extern
Mô tả trước
Trang 7Khai báo/định nghĩa hàm
Cú pháp :
[extern|static] [ret_type] name ([arglist])
{ [statements]*
[return expr;]
[statements]*
[return expr;]
Định nghĩa biến
[statements]*
[return expr;]
[statements]*
[return expr;]
{
Trang 8Khai báo/định nghĩa hàm
Cú pháp
Cú pháp :
[extern|static] [ret_type] name ([arglist])
{ [statements]*
[return expr;]
[statements]*
[return expr;]
}
extern (khai báo): hàm đã được định nghĩa trong module
khác
static (định nghĩa): hàm chỉ được gọi cục bộ trong module chứa hàm này, không thể là đối tượng của extern
Trang 9Khai báo/định nghĩa hàm
Trị trả về, tham số, gọi hàm
return expr; kết thúc hàm, trở về và trả trị là expr Giá trị của expr sẽ được gởi về nơi gọi hàm để sử dụng
arglist : là danh sách các tham số hình thức (hàm có thể không có tham số), mỗi tham số được cách nhau bởi dấu phẩy (,) và được mô tả theo cú pháp như sau :
type parameter_name [ =defaultvalue]
defaultvalue là giá trị gán mặc định cho tham số nếu không cung cấp lúc gọi hàm
Dạng thức gọi hàm:
tên_hàm(<danh sách tham số thực>);
Trang 10Khai báo/định nghĩa hàm
Ví dụ khai báo, định nghĩa
Trong phần định nghĩa hàm (function definition), ta phải
cung cấp đầy đủ tên hàm, kiểu trị trả về, số lượng tham số,
kiểu và tên các tham số
Ví dụ :
Khai báo hàm:
Tham số hình thức Kiểu trả về
Trị trả về
Trang 11Khai báo/định nghĩa hàm
Ví dụ gọi hàm
Nếu hàm được định nghĩa trong module khác, cần có khai
báo extern trước khi gọi hàm
Ví dụ :
Trang 12Truyền tham số
Trong VC++, có 3 cách truyền tham số cho hàm :
• Truyền trị dưới dạng một biểu thức
• Truyền địa chỉ bằng biến con trỏ (kiểu*)
• Truyền địa chỉ bằng biến tham khảo (kiểu&)
Tham số hình thức : (kiểu& tên)
Trang 13Hàm có sẳn
C hổ trợ rất nhiều hàm trong các thư viện hàm có sẳn:
• stdio.lib
• conio.lib
• string.lib
• math.lib
•
Tham khảo HELP của VC++
Trang 14Hàm đệ qui
Định nghĩa
Hàm mà trong thân hàm có gọi lại chính nó thì được gọi là
hàm đệ qui
Một bài toán muốn xử lý theo dạng hàm đệ qui phải đưa
được về dạng :
Fn(x) = G(Fn-1(x))
Ví dụ : n! = n * (n-1)!
S(n) = n + S(n-1) Fibo(n) = Fibo(n-1) + Fibo(n-2)
Nếu có 2 hàm A, B mà trong hàm A có gọi hàm B và trong
hàm B có gọi lại A thì được gọi là đệ qui tương hổ
Trang 15Hàm đệ qui
Ví dụ tính ex
Hàm ex tính theo triển khai Maclaurin:
e x = 1 + x 1 /1! + x 2 /2! + + x n-1 /(n-1)! + x n /n!
có thể viết lại thành:
e x (n) = e x (n-1) + x n /n!
Ngoài ra, các hàm xn và n! cũng có thể tính đệ qui
x n = x n-1 x
n! = (n-1)! n
Trong đó, n giảm dần mỗi lần gọi đệ qui cho nên ta cần kiểm soát sự trở về của hàm bằng điều kiện ban đầu
• e x (0) = 1 : khi n=0 thì trả về trị 1
• x 0 = 1 : khi n=0 thì trả về trị 1
Trang 16Hàm đệ qui
Các hàm đệ qui
Trang 17Bài toán tháp Hà nội
Chuyển chồng đĩa từ cột A sang cột C, cột B trung gian
• Mỗi lần chỉ chuyển một đĩa
• Đĩa nhỏ nằm trên đĩa lớn
Trang 18Phân tích và giải thuật
Hành động chuyển chồng n đĩa từ cột A sang cột C (cột B
• Chuyển chồng n-1 đĩa từ cột A sang cột B (cột C trung gian)
• Chuyển đĩa từ cột A sang cột C
• Chuyển chồng n-1 đĩa từ cột B sang cột C (cột A trung gian)
Trang 19Hàm inline
Hàm inline là hàm không dùng cách gọi thông thường mà chuơng trình dịch sẽ thay gọi hàm bằng chính thân hàm vào chỗ gọi
Ví dụ