Nguyen Dinh Phuong
Bài 15 Hàm
M c tiêu:
K t thúc bài h c này, b n có th :ế
Tìm hi u v cách s d ng các hàm
Tìm hi u v c u trúc c a m t hàm
Khai báo hàm và các nguyên m u hàm
Th o lu n các ki u khác nhau c a bi n ế
Tìm hi u cách g i các hàm:
G i b ng giá tr
G i b ng tham chi u ế
Tìm hi u v các qui t c v ph m vi c a hàm
Tìm hi u các hàm trong các ch ng trình có nhi u t p tin ươ
Tìm hi u v các l p l u tr ư
Tìm hi u v con tr hàm.
Gi i thi u
M t hàmm t đo n ch ng trình th c hi n m t tác v đ c đ nh nghĩa c th . Chúng th c ch t ươ ượ
là nh ng đo n ch ng trình nh giúp gi i quy t m t v n đ l n. ươ ế
15.1 S d ng các hàm
Nói chung, các hàm đ c s d ng trong C đ th c thi m t chu i các l nh liên ti p. Tuy nhiên, cáchượ ế
s d ng các hàm thì không gi ng v i các vòng l p. Các vòng l p th l p l i m t chu i các ch
th v i các l n l p liên ti p nhau. Nh ng vi c g i m t hàm s sinh ra m t chu i các ch th đ c ế ư ượ
th c thi t i v trí b t kỳ trong ch ng trình. Các hàm có th đ c g i nhi u l n khi có yêu c u. Gi ươ ượ
s m t ph n c a mã l nh trong m t ch ng trình dùng đ tính t l ph n trăm cho m t vài con s . ươ
N u sau đó, trong cùng ch ng trình, vi c tính toán nh v y c n ph i th c hi n trên nh ng con sế ươ ư
khác, thay vì ph i vi t l i các ch th gi ng nh trên, m t hàm có th đ c vi t ra đ tính t l ph n ế ư ượ ế
trăm c a b t kỳ các con s . Sau đó ch ng trình th nh y đ n hàm đó, đ th c hi n vi c tính ươ ế
toán (trong hàm) tr v n i đã đ c g i. Đi u này s đ c gi i thích ràng h n khi th o ơ ượ ượ ơ
lu n v cách ho t đ ng c a các hàm.
M t đi m quan tr ng khác các hàm thì d vi t d hi u. Các hàm đ n gi n th đ c vi t ế ơ ượ ế
đ th c hi n các tác v xác đ nh. Vi c g r i ch ng trình cũng d dàng h n khi c u trúc ch ng ươ ơ ươ
trình d đ c, nh vào s đ n gi n hóa hình th c c a nó. M i hàm th đ c ki m tra m t cách ơ ượ
đ c l p v i các d li u đ u vào, v i d li u h p l cũng nh không h p l . Các ch ng trình ch a ư ươ
các hàm cũng d b o th n, b i nh ng s a đ i, n u yêu c u, th đ c gi i h n trong các ơ ế ượ
hàm c a ch ng trình. M t hàm không ch đ c g i t các v trí bên trong ch ng trình, các ươ ượ ươ
hàm còn th đ t vào m t th vi n đ c s d ng b i nhi u ch ng trình khác, v y ti t ư ượ ươ ế
ki m đ c th i gian vi t ch ng trình. ượ ế ươ
15.2 C u trúc hàm
Hàm 209
Cú pháp t ng quát c a m t hàm trong C là:
type_specifier function_name (arguments)
{
body of the function
return statement
}
type_specifier xác đ nh ki u d li u c a giá tr s đ c tr v b i hàm. N u không ki u đ c ượ ế ượ
đ a ra, hàm cho r ng tr v m t k t qu s nguyên. Các đ i s đ c phân cách b i d u ph y. M tư ế ượ
c p d u ngo c r ng () v n ph i xu t hi n sau tên hàm ngay c khi n u hàm không ch a b t kỳ đ i ế
s nào. Các tham s xu t hi n trong c p d u ngo c () đ c g i là ượ tham s hình th c ho c đ i s
hình th c. Ph n thân c a hàm th ch a m t ho c nhi u câu l nh. M t hàm nên tr v m t giá
tr vì v y ít nh t m t l nh return ph i có trong hàm.
15.2.1 Các đ i s c a m t hàm
Tr c khi th o lu n chi ti t v các đ i s , xem ví d sau,ướ ế
#include <stdio.h>
main()
{
int i;
for(i =1; i <=10; i++)
printf(“\nSquare of %d is %d “, i,squarer (i));
}
squarer(int x)
/* int x; */
{
int j;
j = x * x;
return(j);
}
Ch ng trình trên tính tính bình ph ng các s t 1 đ n 10. Đi u này đ c th c hi n b ng vi cươ ươ ế ượ
g i hàm squarer. D li u đ c truy n t th t c g i (trong tr ng h p trên hàm main()) đ n ượ ườ ế
hàm đ c g i ượ squarer thông qua các đ i s . Trong th t c g i, các đ i s đ c bi t nh ượ ế ư các
đ i s th c trong đ nh nghĩa c a hàm đ c g i (squarer()) các đ i s đ c g i các ượ ượ đ i s
hình th c. Ki u d li u c a các đ i s th c ph i cùng ki u v i các đ i s hình th c. H n n a, s ơ
l ng và th t c a các tham s th c ph i gi ng nh c a các tham s hình th c.ượ ư
Khi m t hàm đ c g i, quy n đi u khi n s đ c chuy n đ n cho nó, đó các đ i s hình th c ượ ượ ế
đ c thay th b i các đ i s th c. Sau đó hàm đ c th c thi khi b t g p câu l nh return, sượ ế ượ
chuy n quy n đi u khi n cho ch ng trình g i nó. ươ
Hàm squarer() đ c g i b ng cách truy n s c n đ c tính bình ph ng. Đ i s ượ ượ ươ x th đ c ượ
khai báo theo m t trong các cách sau khi đ nh nghĩa hàm.
Ph ng pháp 1ươ
squarer(int x)
/* x đ c đ nh nghĩa cùng v i ki u d li u trong c p d u ngo c ()*/ượ
Ph ng pháp 2ươ
210 L p trình c b n C ơ
Nguyen Dinh Phuong
squarer(x)
int x;
/* x đ c đ t trong c p d u ngo c (), ki u c a đ c khai oượ ượ
ngay saun hàm */
Chú ý, trong tr ng h p sau, ườ x ph i đ c đ nh nghĩa ngay sau tên hàm, tr c kh i l nh. Đi u này ượ ướ
th t ti n l i khi nhi u tham s cùng ki u d li u đ c truy n. Trong tr ng h p nh v y, ượ ườ ư
ch ph i ch rõ ki u đ m t l n duy nh t t i đi m b t đ u.
Khi các đ i s đ c khai báo trong c p d u ngo c (), m i đ i s ph i đ c đ nh nghĩa riêng l , ư ượ
cho chúng cùng ki u d li u. d , n u x y hai đ i s c a m t hàm abc(), t ế
abc(char x, char y) là m t khai báo đúng và abc(char x, y) là sai.
15.2.2 S tr v t hàm
L nh return có hai m c đích:
Ngay l p t c tr đi u khi n t hàm v ch ng trình g i ươ
B t kỳ cái bên trong c p d u ngo c () theo sau return đ c tr v nh m t giá tr choượ ư
ch ng trình g i.ươ
Trong hàm squarer(), m t bi n ế j ki u int đ c đ nh nghĩa đ l u giá tr bình ph ng c a đ i s ượ ư ươ
truy n vào. Giá tr c a bi n này đ c tr v cho hàm g i thông qua l nh ế ượ return. M t hàm th
th c hi n m t tác v xác đ nh và tr quy n đi u khi n v cho th t c g ikhông c n tr v
b t kỳ giá tr nào. Trong tr ng h p nh v y, l nh ườ ư return th đ c vi t d ng ượ ế return(0) ho c
return. Chú ý r ng, n u m t hàm cung c p m t giá tr tr v và nó không làm đi u đó thì nó s tr ế
v giá tr không thích h p.
Trong ch ng trình tính bình ph ng c a các s , ch ng trình truy n d li u t i hàm ươ ươ ươ squarer
thông qua các đ i s . th các hàm đ c g i không c n b t kỳ đ i s nào. đây, hàm ượ
th c hi n m t chu i các l nh và tr v giá tr , n u đ c yêu c u ế ượ
Chú ý r ng, hàm squarer() cũng có th đ c vi t nh sau ượ ế ư
squarer(int x)
{
return(x*x);
}
đây m t bi u th c h p l đ c xem nh m t đ i s trong câu l nh return. Trong th c t , l nh ượ ư ế
return có th đ c s d ng theo m t trong các cách sau đây: ượ
return;
return(h ng);
return(bi n);ế
return(bi u th c);
return(câu l nh đánh giá); ví d : return(a>b?a:b);
Tuy nhiên, gi i h n c a l nh return là nó ch có th tr v m t giá tr duy nh t.
15.2.3 Ki u c a m t hàm
type-specifier đ c s d ng đ xác đ nh ki u d li u tr v c a m t hàm. Trong d trên, ượ type-
specifier không đ c vi t bên c nh hàm ượ ế squarer(), squarer() tr v m t giá tr ki u int. type-
Hàm 211
specifier không b t bu c n u m t giá tr ki u s nguyên đ c tr v ho c n u không giá tr ế ượ ế
nào đ c tr v . . Tuy nhiên, t t h n nên ch ra ki u d li u tr v là int n u m t giá tr s nguyênượ ơ ế
đ c tr v và t ng t dùng void n u hàm không tr v giá tr nào. ượ ươ ế
15.3 G i hàm
th g i m t hàm t ch ng trình chính b ng cách s d ng tên c a hàm, theo sau c p d u ươ
ngo c (). C p d u ngo c c n thi t đ nói v i trình biên d ch đây m t l i g i hàm. Khi m t ế
tên hàm đ c s d ng trong ch ng trình g i, tên hàm có th m t ph n c a m t m t l nh ho cượ ươ
chính nó là m t câu l nh. Mà ta đã bi t m t câu l nh luôn k t thúc v i m t d u ch m ph y ( ế ế ;). Tuy
nhiên, khi đ nh nghĩa hàm, không đ c dùng d u ch m ph y cu i ph n đ nh nghĩa. S v ng m t ượ
c a d u ch m ph y nói v i trình biên d ch đây là ph n đ nh nghĩa c a hàm và không đ c g i hàm. ượ
M t s đi m c n nh :
M t d u ch m ph y đ c dùng cu i câu l nh khi m t hàm đ c g i, nh ng nó không đ c ượ ượ ư ượ
dùng sau m t s đ 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.
Hàm g i đ n m t hàm khác đ c g i ế ượ hàm g i hay th t c g i . hàm đ c g i đ n cònượ ế
đ c g iượ hàm đ c g i ượ hay th t c đ c g i ượ .
Các hàm không tr v m t giá tr s nguyên c n ph i xác đ nh ki u c a giá tr đ c tr v . ượ
Ch m t giá tr có th đ c tr v b i m t hàm. ượ
M t ch ng trình có th có m t ho c nhi u hàm. ươ
15.4 Khai báo hàm
N u mếMt hàm nên đ c ượ g ikhai báo trong hàm main() tr c khi đ c đ nh nghĩa ướ ượ ho c s
d ng. Đi u này ph i đ c ượ th c hi n trong tr ng h p hàm đ c g i tr c khi đ c ườ ượ ướ ượ đ nh
nghĩa.thi hàm ph i đ c khai báo trong hàm ượ main() tr c khi nó đ c s d ng.ướ ượ
Xem ví d ,
#include <stdio.h>
main()
{
.
.
address();
.
.
}
address()
{
.
.
.
}
Hàm main() g i hàm address() hàm address() đ c g i tr c khi nó đ c đ nh nghĩa. M c dù,ượ ư ượ
không đ c khai báo trong hàm ượ main() thì đi u này th th c hi n đ c trong m t s trình ượ
biên d ch C, hàm address() đ c g i không c n khai báo thêm c . Đâys ượ khai báo không
t ng minh ườ c a m t hàm.
212 L p trình c b n C ơ
Nguyen Dinh Phuong
15.5 Các nguyên m u hàm
M t nguyên m u hàm m t khai báo hàm trong đó xác đ nh ki u d li u c a các đ i s tr
tr v . Thông th ng, các hàm đ c khai báo b ng cách xác đ nh ki u c a giá tr đ c tr v b i ườ ượ ượ
hàm, và tên hàm. Tuy nhiên, chu n ANSI C cho phép s l ng ki u d li u c a các đ i s hàm ượ
đ c khai báo. M t hàm abc() hai đ i s ki u int x y, tr v m t giá tr ki u char, ượ
th đ c khai báo nh sau: ượ ư
char abc();
ho c
char abc(int x, nt y);
Cách đ nh nghĩa sau đ c g i ượ nguyên m u hàm. Khi các nguyên m u đ c s d ng, C th ượ
tìm thông báo b t kỳ ki u d li u không h p l khi chuy n đ i gi a các đ i s đ c dùng đ ượ
g i m t hàm v i s đ nh nghĩa ki u c a các tham s . M t l i s đ c thông báo ngay khi s ượ
khác nhau gi a s l ng các đ i s đ c s d ng đ g i hàm s l ng các tham s khi đ nh ượ ượ ượ
nghĩa hàm.
Cú pháp t ng quát c a m t nguyên m u hàm:
type function_name(type parm_namel,type parm_name2,..type
parm_nameN);
Khi hàm đ c khai báo không có các thông tin nguyên m u, trình biên d ch cho r ng không có thôngượ
tin v các tham s đ c đ a ra. M t hàm không đ i s th gây ra l i khi khai báo không ượ ư
thông tin nguyên m u. Đ tránh đi u này, khi m t hàm không tham s , nguyên m u c a s
d ng void trong c p d u ngo c (). Nh đã nói trên, ư void cũng đ c s d ng đ khai báo t ngượ ườ
minh m t hàm không có giá tr tr v .
d , n u m t hàm noparam() tr v ki u d li u char không các tham s đ c g i, th ế ượ
đ c khai báo nh sauượ ư
char noparam(void);
Khai báo trên ch ra r ng hàm không có tham s ,b t kỳ l i g itruy n tham s đ n hàm đó là ế
không đúng.
Khi m t hàm không nguyên m u đ c g i t t c các ki u ượ char đ c đ i thành ki u ượ int t t c
ki u float đ c đ i thành ki u ượ double. Tuy nhiên, n u m t ế hànghàm nguyên m u, thì các ki u
đã đ a ra trong nguyên m u đ c gi nguyên và không có s tăng c p ki u x y ra.ư ượ
15.6 Các bi nế
Nh đã th o lu n, các bi n là nh ng v trí đ c đ t tên trong b nh , đ c s d ng đ ch a giá trư ế ượ ượ
có th ho c không th đ c s a đ i b i m t ch ng trình ho c m t hàm. Có ba lo i bi n c b n: ượ ươ ế ơ
bi n c c b , tham s hình th c,ế bi n toàn c cế .
1. Bi n c c b ế là nh ng bi n đ c khai báo bên trong m t hàm. ế ượ
2. Tham s hình th c đ c khai báo trong m t đ nh nghĩa hàm nh là các tham s . ượ ư
3. Bi n toàn c c ế đ c khai báo bên ngoài các hàm. ượ
15.6.1 Bi n c c b ế
Hàm 213