Chương 6

Hàm (Function)

Presenter:

Nhập môn về lập trình (C6) Slide 1

Learning 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ó.

Nhập môn về lập trình (C6) Slide 2

Cấu trúc module

Tổ chức chương trình C

Mô tả module

 Tiền xử lý: • #include • #define

#

 Khai báo / định nghĩa:

Khai báo / định nghĩa

• Hằng • Biến • Hàm/biến extern • Mô tả hàm

 Các hàm:

Hàm 1

Hàm 2

• 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.

Hàm 3

Nhập môn về lập trình (C6) Slide 3

Project/solution : chương trình

Tổ chức chương trình C

Mô tả module #

Khai báo / định nghĩa

Hàm 1

 Lập trình theo module

Hàm 2

Hàm 3

Mô tả module # Khai báo / định nghĩa

Hàm 1

Hàm 2

Hàm 3

Mô tả module # Khai báo / định nghĩa

Hàm 1

Hàm 2

Hàm 3

Chia ra nhiều .cpp

Mô tả module # Khai báo / định nghĩa

Hàm 1

Hàm 2

Hàm 3

Source file

Nhập môn về lập trình (C6) Slide 4

Hà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 dự án/giải pháp/chương trình = tập hợp N module

 Một Module = tập hợp N hàm

Nhập môn về lập trình (C6) Slide 5

Các vấn đề của hàm

Khai báo hàm

 extern  Mô tả trước

Hàm

Định nghĩa hàm

 Định nghĩa biến  Lệnh thực thi

Gọi hàm

 Trực tiếp  Gián tiếp

Truyền tham số hàm

 Trị  Tham khảo

Nhập môn về lập trình (C6) Slide 6

Khai báo/định nghĩa hàm

 Cú pháp :

[statements]* [return expr;] [statements]* [return expr;]

extern | static Name( ) Ret_type arglist

[extern|static] [ret_type] name ([arglist]) { }

{

Định nghĩa biến

[statements]* [return expr;] [statements]* [return expr;]

}

Nhập môn về lập trình (C6) Slide 7

Cú pháp

Khai báo/định nghĩa hàm

 Cú pháp :

[statements]* [return expr;] [statements]* [return expr;]

[extern|static] [ret_type] name ([arglist]) { }

 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.

Nhập môn về lập trình (C6) Slide 8

Trị trả về, tham số, gọi hàm

Khai báo/định nghĩa 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();

Nhập môn về lập trình (C6) Slide 9

Ví dụ khai báo, định nghĩa

Khai báo/định nghĩa hàm

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:

Tên hàm

Định nghĩa hàm:

Tham số hình thức

Kiểu trả về

Trị trả về

Nhập môn về lập trình (C6) Slide 10

Ví dụ gọi hàm

Khai báo/định nghĩa 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ụ :

Tham số thực

Nhập môn về lập trình (C6) Slide 11

Truyề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.

 Tham số hình thức :  Tham số thực :

(kiểu tên) (biểu thức)

• Truyền địa chỉ bằng biến con trỏ (kiểu*).

 Tham số hình thức :  Tham số thực :

(kiểu* tên) (&tên)

• Truyền địa chỉ bằng biến tham khảo (kiểu&).

 Tham số hình thức :  Tham số thực :

(kiểu& tên) (tên)

Nhập môn về lập trình (C6) Slide 12

Hà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++

Nhập môn về lập trình (C6) Slide 13

Định nghĩa

Hàm đệ qui

 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))

n! = n * (n-1)! S(n) = n + S(n-1) Fibo(n) = Fibo(n-1) + Fibo(n-2)

Ví dụ :  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ổ.

Chương 5 : Lặp & đệ qui

Nhập môn về lập trình (C6) Slide 14

Ví dụ tính ex

Hàm đệ qui

 Hàm ex tính theo triển khai Maclaurin:

ex = 1 + x1/1! + x2/2! + ... + xn-1/(n-1)! + xn/n! có thể viết lại thành: ex(n) = ex(n-1) + xn/n!

 Ngoài ra, các hàm xn và n! cũng có thể tính đệ qui

xn = xn-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 • ex(0) = 1 : khi n=0 thì trả về trị 1. • x0 = 1 : khi n=0 thì trả về trị 1. : khi n=1 thì trả về trị 1. • 1! = 1

Chương 5 : Lặp & đệ qui

Nhập môn về lập trình (C6) Slide 15

Các hàm đệ qui

Hàm đệ qui

Nhập môn về lập trình (C6) Slide 16

Bà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.

A B C

Nhập môn về lập trình (C6) Slide 17

Phâ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 trung gian) được phân tích ra thành các hành động sau : • 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).

Nhập môn về lập trình (C6) Slide 18

Hà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ụ

Nhập môn về lập trình (C6) Slide 19