HàmHàm

ươ

Ch

ng 9

1

ụ ụ

ể ể ấ

ọ ủ ọ ủ M c tiêu c a bài h c M c tiêu c a bài h c ử ụ ủ

ẫ ủ

ể ạ

ủ ề ậ  Tìm hi u cách s  d ng hàm  Tìm hi u c u trúc c a hàm  Khai báo hàm và các nguyên m u hàm  Tìm hi u các ki u khác nhau c a bi n ể ế ể  Hàm đ ư ế ượ ọ c g i nh  th  nào  Truy n b ng giá tr ị ằ ề  Truy n b ng tham chi u ế ằ ề  Tìm hi u v  các qui t c v  ph m vi c a hàm ắ ề ề  Các hàm trong các ch ươ ng trình có nhi u t p

tin

ớ ư ữ

Elementary Programming with C/Session 9/ Slide 2 of 20

 Các l p l u tr  Con tr  hàmỏ

ạ ệ ự ộ ng trình th c hi n m t tác

ộ ỗ

ươ ụ ể c đ nh nghĩa c  th   ể ọ c s  d ng đ  rút g n cho m t chu i  ề ầ c th c hi n nhi u l n

ơ ở

Hàm Hàm   Hàm là m t đo n ch ộ ụ ượ ị v  đ  Các hàm đ ượ ử ụ ỉ ự ệ ị ượ các ch  th  đ  Hàm d  vi ễ ế ễ ể t và d  hi u  Vi c g  l ươ ễ ệ ỡ ỗ ng trình tr  nên d  dàng h n khi  i ch ứ ậ ớ ươ ủ ấ ng trình rõ ràng v i hình th c l p  c u trúc c a ch trình theo module

 Ch

ươ ở ng trình c u t o t ự ử ổ ầ ượ ả  các hàm cũng d  dàng b o  ớ ạ i h n ễ c gi

Elementary Programming with C/Session 9/ Slide 3 of 20

ươ ừ ấ ạ ừ trì, b i vì s  s a đ i khi có yêu c u đ ủ trong t ng hàm c a ch ng trình

ấ ấC u trúc  C u trúc  hàmhàm ổ

 Cú  pháp  t ng  quát  c a  m t  hàm  trong  C  nh   ư ủ

sau:

 type_specifier  xác đ nh ki u d  li u c a giá tr  mà  ể

ữ ệ ủ ị ị

ủ ộ ị c  gán  cho  đ nh  danh  c a

ượ ệ ấ ặ ặ ố ố ẽ ả ề hàm s  tr  v .  M t  tên  hàm  h p  l ợ ệ ượ   đ hàm Các đ i s  xu t hi n trong c p d u ngo c () đ c

Elementary Programming with C/Session 9/ Slide 4 of 20

ứ ố ấ ọ g i là các tham s  hình th c.

ố ố ủ ố ố ủ Các đ i s  c a hàm Các đ i s  c a hàm

Formal Arguments

Actual Arguments

ố ừ

ươ

ng trình tính bình ph

ng c a các s  t

ế  1 đ n 10 ế  hàm main() đ n hàm squarer()

c truy n t

Ch ươ D  li u đ ề ừ ữ ệ ượ Hàm thao tác trên d  li u s  d ng các đ i s ố ố ữ ệ ử ụ

Elementary Programming with C/Session 9/ Slide 5 of 20

ự ở ề ừ ộ ự ở ề ừ ộ S  tr  v  t S  tr  v  t

m t hàm  m t hàm

ở ề ươ

ệ ừ t  hàm tr  v  ch ị ặ

ặ ươ

ượ

 L nh  return  ngay  l p  t c  chuy n  đi u  khi n  ậ ứ ng trình g i.  Giá  tr   đ t  trong  c p  d u  ngo c  ()  theo  sau  ấ ặ ả ề ng trình g i. c tr  v  cho ch

ệ l nh return đ

Elementary Programming with C/Session 9/ Slide 6 of 20

ể ữ ệ ủ ể ữ ệ ủ

Ki u d  li u c a hàm Ki u d  li u c a hàm

ệ tr type_specifier  không  xu t  hi n

ướ ị ể ấ ả ề ộ

ể ủ

ộ ố ộ ặ ế ế

Elementary Programming with C/Session 9/ Slide 7 of 20

ể ấ ộ

  c  hàm  ố squarer(),  vì  squarer()  tr   v   m t  giá  tr   ki u  s   nguyên int  type_specifier là không b t bu c n u ki u c a giá  ắ ị ả ề tr  tr  v  là m t s  nguyên ho c n u không có giá  ị ả ề tr  tr  v    Tuy nhiên, đ  tránh s  không nh t quán, m t ki u  ữ ệ d  li u nên đ

ể ượ ự ị c xác đ nh.

ẩ ượ ặ ệ ọ c đ t cu i câu l nh khi g i

G i hàmọG i hàmọ  D u ch m ph y đ ấ ấ ư

ố ị

ấ ặ ặ ộ hàm, nh ng không dùng cho đ nh nghĩa hàm  C p d u ngo c () là b t bu c theo sau tên hàm,  ắ

ố ố cho dù hàm có đ i s  hay không

ả ề ộ ề ị ượ c tr  v

ộ ơ ươ ể ng trình có th  có nhi u h n m t hàm

ộ ượ ọ hàm g iọ c g i là

 Nhi u nh t m t giá tr  đ ấ  Ch ề  Hàm g i đ n m t hàm khác đ ọ ế  Hàm đang đ

ượ ọ ế ượ ọ hàm đ c ượ c g i đ n đ c g i là

Elementary Programming with C/Session 9/ Slide 8 of 20

g iọ

Khai báo hàm Khai báo hàm

 Vi c khai báo hàm là b t bu c khi hàm đ

ượ ử c s

c khi nó đ

ệ ụ ướ d ng tr  Hàm address() đ

#include Main(){

ượ ị

ộ ắ ượ ị c đ nh nghĩa ượ ọ c g i  c đ nh

c khi nó đ

ướ tr nghĩa

… address() …

 M t s  trình biên d ch C  i n u hàm

} address(){ …

ị ỗ ế ượ c khai báo  ọ c khi g i

ượ ọ

ườ

} ự

 Đi u này còn đ

c g i là s  khai báo không t

ng

ộ ố ẽ s  thông báo l không đ ướ tr ề minh

Elementary Programming with C/Session 9/ Slide 9 of 20

ẫ ẫ

Nguyên m u hàm Nguyên m u hàm ể ữ ệ ủ

ố ố

 Xác đ nh ki u d  li u c a các đ i s

char abc(int x, nt y);

ể ể ọ

ậ ợ i : ấ ỳ ự ố ố ượ ị

c dùng đ  g i hàm và ki u  đã đ ẽ ượ ố ủ

gi a các  ượ c  c

Thu n l ợ ệ ữ B t k  s  chuy n ki u không h p l ể đ i s  đ đ nh nghĩa cho các tham s  c a hàm s  đ thông báo.

char noparam (void);

Elementary Programming with C/Session 9/ Slide 10 of 20

Các bi nế Các bi nế

 Bi n c c b

ế ụ ộ

ị ủ ạ ủ ố ộ i đi m vào c a m t kh i và b  h y t i

ượ  Đ c khai báo bên trong m t hàm  ể ượ ạ ạ  Đ c t o t ố ỏ ể đi m ra kh i kh i đó

ứ ố  Tham s  hình th c

ư ị  Đ c khai báo trong đ nh nghĩa hàm nh  là các

 Ho t đ ng nh  m t bi n c c b  bên trong m t hàm

ế ụ ộ ư ộ ộ ượ tham số ạ ộ

ế

ị ồ ạ ấ ả ờ t c  các hàm ự ủ i su t th i gian th c thi c a

 Đ c khai báo bên ngoài t ố  L u các giá tr  t n t ng trình

Elementary Programming with C/Session 9/ Slide 11 of 20

ụ  Bi n toàn c c ượ ư ươ ch

ớ ư ớ ư

ữ ữ L p l u tr   L p l u tr

ấ ượ ọ

 M i bi n trong C có m t tính ch t đ

c g i là

ế ỗ ớ ư l p l u tr

ớ ư

ữ ị

ế

 L p l u tr  đ nh nghĩa hai đ c tính c a bi n:

ế ố  c a m t bi n là kho ng th i

 Th i gian s ng

ủ ộ gian nó duy trì m t giá tr  xác đ nh

ầ ủ

ế

ế

 T m v c ự  c a m t bi n xác đ nh các ph n c a  ầ ậ ươ ộ m t ch

ng trình có th  nh n ra bi n đó

Elementary Programming with C/Session 9/ Slide 12 of 20

ớ ư ớ ư

ữ ữ

L p l u tr  ­ tt L p l u tr  ­ tt

 auto

 extern

 static

 register

Elementary Programming with C/Session 9/ Slide 13 of 20

ủ ủ

ậ ậ

ạ ạ

Các qui lu t ph m vi c a  Các qui lu t ph m vi c a  hàmhàm

ế ị ấ ế

ể ữ ệ

 Các qui lu t ph m vi – là nh ng qui lu t  ạ quy t đ nh m t đo n mã l nh có th  truy  xu t đ n m t đo n mã l nh hay d  li u  khác hay không

ụ ộ ớ

 Mã l nh bên trong m t hàm là c c b  v i

ệ hàm đó

ạ c đ nh nghĩa bên

ứ  Hai hàm có cùng m c ph m vi ể ượ ị  M t hàm không th  đ trong m t hàm khác

Elementary Programming with C/Session 9/ Slide 14 of 20

G i hàmọG i hàmọ

 Truy n tham tr   ị ề  Truy n tham chi u ế

Elementary Programming with C/Session 9/ Slide 15 of 20

ề ề

ị ằ ị ằ Truy n b ng giá tr Truy n b ng giá tr

ấ ả

ố ố ượ

 M c nhiên trong C, t

t c  các đ i s  đ

c truy n

ặ ằ

c g i,

ố ố ượ ị ượ

b ng giá tr  Khi các đ i s  đ các giá tr  đ

ọ ự

ỉ ượ

ế

c th c hi n trên các bi n

ằ ề c g i là truy n b ng giá tr  khi giá  ấ ế c truy n đ n hàm đ

c g i và b t

ưở

ng

ị ủ ỳ ự ế

ượ ọ ế c truy n đ n hàm đ ế ạ ề c truy n thông qua các bi n t m   M i s  thao tác ch  đ t mạ  Các đ i s  đ ị ố ố ượ ọ ượ ọ ế ượ tr  c a bi n đ ả ị ổ k  s  thay đ i trên giá tr  này không  nh h ế ượ ị ố ủ đ n giá tr  g c c a bi n đ c truy n

Elementary Programming with C/Session 9/ Slide 16 of 20

ằ ằ

ề ề

ề ấ ế

ế ỉ ự

ộ ổ

ế ế Truy n b ng tham chi u Truy n b ng tham chi u  V i  truy n  tham  chi u,  hàm  cho  phép  ớ truy xu t đ n đ a ch  th c trong b  nh   ủ ố ố ậ c a đ i s  và vì v y có th  thay đ i giá  ọ ố ố ủ ị ủ tr  c a các đ i s  c a hàm g i  Đ nh nghĩa ị

getstr(char *ptr_str, int *ptr_int);

 G iọ

getstr(pstr, &var);

Elementary Programming with C/Session 9/ Slide 17 of 20

ự ồ ự ồ

ủ ờ ọ ủ ờ ọ

S  l ng nhau c a l S  l ng nhau c a l

i g i hàm i g i hàm

palindrome()

main()

{

{

palindrome();

}

… getstr(); reverse(); cmp(); …

}

Elementary Programming with C/Session 9/ Slide 18 of 20

ươ ươ

ng trình  ng trình

Các hàm trong ch Các hàm trong ch ề ậ ề ậ có nhi u t p tin có nhi u t p tin

ể ượ ị

 Các hàm cũng có th  đ

c đ nh nghĩa là

static

ho c ặ external

ế

t bên trong

ậ c nh n bi ủ

ươ

 Các hàm tĩnh (static) ch  đ ươ ỏ ậ t ra kh i t p tin ch

ỉ ượ ạ ng trình và ph m vi c a nó không  ng trình

ậ t p tin ch ượ v static fn _type fn_name (argument list);

ậ c nh n bi

ế ở ấ ả t c

t b i t

ươ

ượ ng trình

 Hàm ngo i (external) đ ạ các t p tin c a ch extern fn_type fn_name (argument list);

Elementary Programming with C/Session 9/ Slide 19 of 20

ư ị

ớ ị

Con tr  hàmỏ Con tr  hàmỏ  L u đ a ch  b t đ u c a hàm ỉ ắ ầ ủ  Hàm có m t v  trí v t lý trong b  nh , v  trí  ậ ộ ị ộ ể

này có th  gán cho m t con tr

#include #include void check(char *a, char *b, int (*cmp)()); main() {

void check(char *a, char *b, int (*cmp)()) { printf(“testing for equality \n”); if (!(*cmp)(a,b))

printf(“Equal”);

else

printf(“Not Equal”);

}

char sl[80]; int (*p)(); p = strcmp; gets(s1); gets(s2); check(s1, s2, p);

Elementary Programming with C/Session 9/ Slide 20 of 20

}