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