Ch

ng 8. Hàm trong C

ươ

I. Khai báo hàm II. Đ nh nghĩa hàm ị III. S d ng hàm ử ụ IV. Con tr tr t i hàm ỏ ỏ ớ

1

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

I. Khai báo hàm

1. Gi i thi u v hàm ệ 2. Cú pháp khai báo hàm 3. Các tham s trong khai báo hàm

2

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

ư ẵ

i l p trình có i l p ườ ậ ể ạ

1. Gi i thi u v hàm ệ  Trong C t t c các ch ng trình con đ u g i là hàm. ọ ề ươ ấ  Ngoài các hàm th vi n có s n, ng ườ ậ ệ th t t o ra các hàm. Đ t o ra m t hàm ng ộ trình ph i khai báo và đ nh nghĩa nó. ị

 Khai báo hàm (function declaration or prototype) là ng ể

ể ự ạ ả

ả ề ố ượ ủ ị

xác đ nh tên c a hàm, ki u d li u tr v , s l ữ ệ tham s và ki u c a t ng tham s . ố ủ ừ ố ể

 Đ nh nghĩa hàm (function definition) là xác đ nh công vi c mà hàm s th c hi n thông qua các l nh ự ệ c a hàm. ủ

 Các hàm trong C không l ng nhau, t c là trong m t ộ ồ

ị ệ ẽ ệ

3

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

hàm ta không th đ nh nghĩa m t hàm khác. ể ị ộ

2. Cú pháp khai báo hàm

ế

Tên_tham_s _2,…);

Ki u_2 ể

Cú pháp khai báo hàm n m trên m t dòng, k t ằ thúc b ng d u ch m ph y. ấ ấ ằ ẩ Ki u_tr _v ề Tên_hàm(Ki u_1 Tên_tham_s _1, ể Ví d :ụ float inchtomet(float x); float tong(float a, float b);

ế

ố ượ

ế

M t khai báo hàm không cho bi t nh ng gì có trong thân hàm. Nó ch báo cho trình biên d ch ị ỉ bi t v tên hàm, ki u c a hàm, s l ng các tham s và ki u c a các tham s . ố

ề ố

4

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

2. Cú pháp khai báo hàm (ti p)ế

ọ ướ

 Khai báo hàm có th đ t ấ

ố ươ

ể ứ

ể ườ ị

 N u hàm đ

ư ể ặ ệ

c đ nh nghĩa đâu đó tr c khi g i b t kỳ đâu tr ể ặ ở ấ đ u t p ch a ch ng trình chính hàm. T t nh t là đ ể ở ầ ứ ệ c m t hàm s g i nó. (ch a hàm main) ho c đ tr ẽ ọ ộ ướ ặ ng trình nhi u file thì các khai báo hàm Trong các ch ề ươ th ng đ trong các file header có đuôi .h, còn các đ nh nghĩa hàm đ trong các file th vi n có đuôi obj ho c lib. ế ướ ượ ị

ể ầ

5

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

c khi g i hàm ọ ở thì có th không c n khai báo hàm. Tuy nhiên v n nên ẫ ng trình có có khai báo hàm nh t là trong các ch ươ nhi u hàm l n hay các ch ng trình n m trên nhi u file. ề ớ ươ ề ằ

3. Các tham s trong khai báo hàm

ế

ố ể ố

N u hàm không có tham s thì trong d u ấ ngo c đ n c a khai báo hàm đ tr ng. Ví d : ụ ơ ặ int xoa();

Tên c a các tham s trong khai báo hàm có

ố ị

th không c n xác đ nh. Ví d : ụ float inchtomet(float, float);

6

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

II. Đ nh nghĩa hàm

1. Cú pháp đ nh nghĩa hàm ị 2. L nh return 3. Hàm không tr v giá tr ị

ả ề

7

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

1. Cú pháp đ nh nghĩa hàm ị

Ki u_tr _v

Tên_tham_s _1,

Tên_tham_s _2,…)

ề Tên_hàm(Ki u_1

Ki u_2 ể

ể {

//Các l nh c a hàm đ đây ủ

Thân hàm

Không có d u ch m ấ ấ ph yẩ

} Ví d :ụ int cong(int a, int b)

{ int z; z = a + b; return z; }

8

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

1. Cú pháp đ nh nghĩa hàm (ti p)

ế

ố ắ

Dòng đ u tiên trong đ nh nghĩa hàm gi ng ị trong khai báo hàm, ch khác là không có d u ỉ ch m ph y và các tham s b t bu c ph i có ấ tên.

ườ

ể ệ

ặ ớ

ế

ươ

ế

Khi đã có khai báo hàm thì đ nh nghĩa hàm ng đ sau hàm main ho c đ trong m t th t p obj (lib). Đ quen d n v i vi c vi t các ầ ệ ng trình l n, khi th c hành chúng ta vi t ch ự các khai báo hàm trong t p .h, còn các đ nh ệ nghĩa hàm đ trong t p .obj (lib).

9

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

2. L nh return

c s d ng trong m t hàm. L nh ệ ệ ụ ử ộ

ươ

ượ

 L nh return đ ượ return th c hi n hai ch c năng: ệ ng trình g i nó.  Làm cho m t hàm tr v ch ộ  Đ c dùng đ tr v m t giá tr . ị ể ả ề  Cú pháp dùng l nh return nh sau: ư ệ

ứ ở ề ộ

ả ị

return Giá_tr _tr _v ; ề return;

b t kỳ v trí nào trong ị ho c ặ ệ

 L nh return có th dùng ở ấ cu i hàm. ố  V i các hàm có tr v giá tr thì l nh return b t bu c

hàm nh ng th ư ườ

ể ng ở ả ề ộ ệ ắ ị

10

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

ớ ph i có. ả

3. Hàm không tr v giá tr ị

ả ề

ả ề

V i các hàm không tr v giá tr thì khi khai ả ề báo và đ nh nghĩa hàm ta ph i khai báo ki u ị tr v là void. Ví d : ụ void chao();

N u s d ng l nh return trong hàm không tr ả

ử ụ ị

ệ ỉ

ượ

c d ng: ạ

ế v giá tr thì ch dùng đ ề return;

11

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

III. S d ng hàm ử ụ

ế

1. L i g i hàm ờ ọ 2. Truy n đ i s theo giá tr ị ố ố ề 3. Truy n đ i s theo tham chi u ố ố ề 4. Truy n con tr t i hàm ề 5. Truy n m ng t i hàm ả ề

ỏ ớ ớ

12

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

 M t hàm, sau khi đ

1. L i g i hàm ờ ọ ượ ị ằ

 Cú pháp g i hàm nh sau: ọ

c đ nh nghĩa và khai báo, có ộ c th c hi n b ng m t l nh g i hàm (l i g i th đ ọ ờ ọ ộ ệ ệ ể ượ ng trình. Có th g i t đâu đó trong ch hàm) ể ọ ừ ươ ở hàm main, có th g i t m t hàm khác ho c có th ộ ể ặ ể ọ ừ g i t m t hàm thành viên c a l p. ủ ớ ọ ừ ộ

 N u hàm đ

ư Tên_hàm(Danh sách các đ i s , n u có); ố ố

ế ượ

ọ ố ề ị

ị ả ị ọ ề

ố ố ố ố ố ể ằ ế ả

13

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

ế c khai báo và đ nh nghĩa là có các tham s thì khi g i hàm ta ph i truy n giá tr cho hàm qua các tham s . Các giá tr truy n cho hàm g i là các đ i s . Các đ i s có th là h ng, bi n, m ng, con tr ,…ỏ

1. L i g i hàm (ti p)

ờ ọ

ế

 Ví d : gi s ta khai báo m t hàm c ng hai giá tr ị

ả ử ụ ộ ộ

ư

float float cong(float a, float b); Ta g i hàm này nh sau: ọ cong(7,8);

ộ ọ ờ ể ử ụ

ứ ị ộ ọ

ứ ấ ứ ể ấ ẩ

 L i g i m t hàm có tr v giá tr có th s d ng ả ề trong các bi u th c, còn l i g i m t hàm không tr ả ờ ể c trong bi u th c. Khi v giá tr không dùng đ ể ượ ề dùng trong bi u th c thì không có d u ch m ph y sau l i g i hàm. Ví d : ụ a = cong(7,8) +2; cout<

14

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

ờ ọ

1. L i g i hàm (ti p)

ế

Ho t đ ng c a l i g i hàm

ờ ọ ủ ờ ọ

Cùng m t mã đ ộ t c các l cho t ấ ả

c dùng ượ i g i hàm ờ ọ

Ch

ng trình

L i g i hàm

ờ ọ

void func1() { sdfghjkl sdfghjkl sdfghjkl }

ươ g i hàmọ sdfghjkl sdfghjkl func1(); sdfghjkl sdfghjkl func1(); sdfghjkl sdfghjkl func1(); sdfghjkl

15

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

Ví d v hàm ụ ề

ợ ừ ậ

Vi t ch ươ ế ph n t . Ch ử ầ th a.ừ

ng trình tính s các ch nh h p ch p k t n ỉ ng trình ph i s d ng hàm đ tính giai ươ ử ụ ố ả ể

Ak n

n !  kn

(

)!

16

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

2. Truy n đ i s theo giá tr ị ố ố

Khi khai báo và đ nh nghĩa hàm ta có hai

ố ủ

cách khai báo các tham s c a hàm:  Khai báo đ khi g i hàm truy n đ i s cho hàm

ố ọ ố ể ề

 Khai báo đ khi g i hàm truy n đ i s cho hàm

theo giá tr .ị

ố ọ ố ể ề

Khai báo đ truy n đ i s theo giá tr gi ng ố

ng:

ế

ư ể

ố nh khai báo bi n thông th ườ Ki u Tên_tham_s Ví d : ụ void hoandoi(int a, int b);

17

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

theo tham chi u.ế

2. Truy n đ i s theo giá tr (ti p)

ố ố

ế

ế ị ủ

ề ẽ ạ ủ

ế ở

ố ế ố

Khi truy n đ i s cho hàm theo giá tr thì hàm s t o ra các bi n m i (tên các bi n này ế là tên c a các tham s ), copy giá tr c a các ố đ i s vào các bi n m i và thao tác trên các ớ bi n m i này. B i v y sau khi g i hàm các đ i s không b thay đ i giá tr m c dù bên ổ trong hàm giá tr c a đ i s b thay đ i. ố ố ị ị

ị ị ủ ỗ

ổ ế

ế

Ví d : Đ đ i ch giá tr trong hai bi n ta vi t (Xem trang sau)

ể ổ hàm nh sau: ư

18

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

2. Truy n đ i s theo giá tr (ti p)

ố ố

ế

#include #include void DoiCho(int,int); void main() { int x=12,y=15; clrscr(); cout<<"Truoc khi doi cho: x= "<

26

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

ầ ế ả ử ủ

IV. Con tr tr t i hàm

ỏ ỏ ớ

ộ ặ

ư

ế

ỉ ủ ể ử ụ

M t đ c đi m r t m nh c a C là con tr hàm. M c dù hàm không ph i là bi n nh ng nó v n ả có đ a ch trong b nh . Đ a ch này có th ể ớ ch a trong m t con tr . Vì đ a ch c a hàm ỏ ch a trong con tr nên ta có th s d ng con tr thay cho tên hàm.

ứ ứ ỏ ể

ỉ ủ ố

ư

ế

Đ có đ a ch c a hàm ta dùng tên hàm không ị có đ i s (gi ng nh tên bi n m ng là đ a ch ỉ ố ố c a m ng). ả ủ

27

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

IV. Con tr tr t i hàm (ti p) ỏ ỏ ớ

ế

ị ể ể

ể ỉ ủ ể ỏ ỏ ỏ ớ

ả ề ủ ặ

ả ử ặ ể ố

ỏ ỏ ớ ư

 Đ có con tr có th ch a đ a ch c a hàm ta khai ứ báo con tr tr t i ki u gi ng ki u tr v c a hàm, ố theo sau là các tham s c a hàm đ t trong ngo c ố ủ đ n. Ví d : gi s hàm Tong có hai tham s ki u ụ ơ int, ki u tr v cũng là int. Khi đó ta khai báo con ả ề tr tr t i hàm này nh sau: int Tong(int a, int b); //Khai bao hàm int (*p) (int a, int b); //Khai báo con tr hàmỏ p = Tong; //Gán đ a ch c a hàm Tong cho p ị (*p)(10,15); //G i hàm Tong qua con tr

ỉ ủ

28

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ

ọ ỏ

IV. Con tr tr t i hàm (ti p) ỏ ỏ ớ

ế

ế

ươ

Ví d : Vi t ch ng trình tính t ng, hi u, tích ổ ụ ng c a hai s nguyên nh p vào t bàn và th ừ ậ ủ ươ i s d ng ng trình yêu c u ng phím. Ch ử ụ ườ ầ ươ l a ch n m t trong các cách tính. ộ ự

29

Bài gi ng Ngôn ng C - Ch

ng 8 GV. Ngô Công Th ng

ươ