Lp trình căn bn
Chương 5
CHƯƠNG TRÌNH CON
Hc xong chương này, sinh viên s nm được các vn đề sau:
Khái nim v hàm (function) trong C.
Cách xây dng và cách s dng hàm trong C.
I. KHÁI NIM V HÀM TRONG C
Trong nhng chương trình ln, có th có nhng đon chương trình viết lp đi
lp li nhiu ln, để tránh rườm rà và mt thi gian khi viết chương trình; người ta
thường phân chia chương trình thành nhiu module, mi module gii quyết mt công
vic nào đó. Các module như vy gi là các chương trình con.
Mt tin li khác ca vic s dng chương trình con là ta có th d dàng kim
tra xác định tính đúng đắn ca nó trước khi ráp ni vào chương trình chính và do đó
vic xác định sai sót để tiến hành hiu đính trong chương trình chính s thun li hơn.
Trong C, chương trình con được gi là hàm. Hàm trong C có th tr v kết qu
thông qua tên hàm hay có th không tr v kết qu.
Hàm có hai loi: hàm chun và hàm t định nghĩa. Trong chương này, ta chú
trng đến cách định nghĩa hàm và cách s dng các hàm đó.
Mt hàm khi được định nghĩa thì có th s dng bt c đâu trong chương trình.
Trong C, mt chương trình bt đầu thc thi bng hàm main.
Ví d 1: Ta có hàm max để tìm s ln gia 2 s nguyên a, b như sau:
int max(int a, int b)
{
return (a>b) ? a:b;
}
Ví d 2: Ta có chương trình chính (hàm main) dùng để nhp vào 2 s nguyên
a,b và in ra màn hình s ln trong 2 s
#include <stdio.h>
#include <conio.h>
int max(int a, int b)
{
return (a>b) ? a:b;
}
int main()
{
int a, b, c;
printf("\n Nhap vao 3 so a, b,c ");
scanf("%d%d%d",&a,&b,&c);
printf("\n So lon la %d",max(a, max(b,c)));
getch();
return 0;
}
Trang 63
Lp trình căn bn
I.1. Hàm thư vin
Hàm thư vin là nhng hàm đã được định nghĩa sn trong mt thư vin nào đó,
mun s dng các hàm thư vin thì phi khai báo thư vin trước khi s dng bng lnh
#include <tên thư vin.h>
Mt s thư vin:
alloc.h assert.h bcd.h bios.h complex.h
conio.h ctype.h dir.h dirent.h dos.h
errno.h fcntl.h float.h fstream.h grneric.h
graphics.h io.h iomanip.h iostream.h limits.h
locale.h malloc.h math.h mem.h process.h
setjmp.h share.h signal.h stdarg.h stddef.h
stdio.h stdiostr.h stdlib.h stream.h string.h
strstrea.h sys\stat.h sys\timeb.h sys\types.h time.h
values.h
Ý nghĩa ca mt s thư vin thường dùng:
1. stdio.h : Thư vin cha các hàm vào/ ra chun (standard input/output). Gm
các hàm printf(), scanf(), getc(), putc(), gets(), puts(), fflush(), fopen(), fclose(),
fread(), fwrite(), getchar(), putchar(), getw(), putw()…
2. conio.h : Thư vin cha các hàm vào ra trong chế độ DOS (DOS console).
Gm các hàm clrscr(), getch(), getche(), getpass(), cgets(), cputs(), putch(),
clreol(),…
3. math.h: Thư vin cha các hàm tính toán gm các hàm abs(), sqrt(), log().
log10(), sin(), cos(), tan(), acos(), asin(), atan(), pow(), exp(),…
4. alloc.h: Thư vin cha các hàm liên quan đến vic qun lý b nhơ. Gm các
hàm calloc(), realloc(), malloc(), free(), farmalloc(), farcalloc(), farfree(), …
5. io.h: Thư vin cha các hàm vào ra cp thp. Gm các hàm open(), _open(),
read(), _read(), close(), _close(), creat(), _creat(), creatnew(), eof(), filelength(),
lock(),…
6. graphics.h: Thư vin cha các hàm liên quan đến đồ ha. Gm initgraph(),
line(), circle(), putpixel(), getpixel(), setcolor(), …
...
Mun s dng các hàm thư vin thì ta phi xem cú pháp ca các hàm và s
dng theo đúng cú pháp (xem trong phn tr giúp ca Turbo C).
I.2. Hàm người dùng
Hàm người dùng là nhng hàm do người lp trình t to ra nhm đáp ng nhu
cu x lý ca mình.
Trang 64
Lp trình căn bn
II. XÂY DNG MT HÀM
II.1 Định nghĩa hàm
Cu trúc ca mt hàm t thiết kế:
<kiu kết qu> Tên hàm ([<kiu t s> <tham s>][,<kiu t s><tham s>][…])
{
[Khai báo biến cc b và các câu lnh thc hin hàm]
[return [<Biu thc>];]
}
Gii thích:
- Kiu kết qu: là kiu d liu ca kết qu tr v, có th là : int, byte, char, float,
void… Mt hàm có th có hoc không có kết qu tr v. Trong trường hp hàm không
có kết qu tr v ta nên s dng kiu kết qu là void.
- Kiu t s: là kiu d liu ca tham s.
- Tham s: là tham s truyn d liu vào cho hàm, mt hàm có th có hoc
không có tham s. Tham s này gi là tham s hình thc, khi gi hàm chúng ta phi
truyn cho nó các tham s thc tế. Nếu có nhiu tham s, mi tham s phân cách
nhau du phy (,).
- Bên trong thân hàm (phn gii hn bi cp du {}) là các khai báo cùng các
câu lnh x lý. Các khai báo bên trong hàm được gi là các khai báo cc b trong hàm
và các khai báo này ch tn ti bên trong hàm mà thôi.
- Khi định nghĩa hàm, ta thường s dng câu lnh return để tr v kết qu thông
qua tên hàm.
Lnh return dùng để thoát khi mt hàm và có th tr v mt giá tr nào đó.
Cú pháp:
return ; /*không tr v giá tr*/
return <biu thc>; /*Tr v giá tr ca biu thc*/
return (<biu thc>); /*Tr v giá tr ca biu thc*/
Nếu hàm có kết qu tr v, ta bt buc phi s dng câu lnh return để tr v
kết qu cho hàm.
Ví d 1: Viết hàm tìm s ln gia 2 s nguyên a và b
int max(int a, int b)
{
return (a>b) ? a:b;
}
Ví d 2: Viết hàm tìm ước chung ln nht gia 2 s nguyên a, b. Cách tìm: đầu
tiên ta gi s UCLN ca hai s là s nh nht trong hai s đó. Nếu điu đó không đúng
thì ta gim đi mt đơn v và c gim như vy cho ti khi nào tìm thy UCLN
int ucln(int a, int b)
{
int u;
if (a<b)
Trang 65
Lp trình căn bn
u=a;
else
u=b;
while ((a%u !=0) || (b%u!=0))
u--;
return u;
}
II.2 S dng hàm
Mt hàm khi định nghĩa thì chúng vn chưa được thc thi tr khi ta có mt li
gi đến hàm đó.
Cú pháp gi hàm: <Tên hàm>([Danh sách các tham s])
Ví d: Viết chương trình cho phép tìm ước s chung ln nht ca hai s t
nhiên.
#include<stdio.h>
unsigned int ucln(unsigned int a, unsigned int b)
{
unsigned int u;
if (a<b)
u=a;
else
u=b;
while ((a%u !=0) || (b%u!=0))
u--;
return u;
}
int main()
{
unsigned int a, b, UC;
printf(“Nhap a,b: ”);scanf(“%d%d”,&a,&b);
UC = ucln(a,b);
printf(“Uoc chung lon nhat la: ”, UC);
return 0;
}
Lưu ý: Vic gi hàm là mt phép toán, không phi là mt phát biu.
II.3 Nguyên tc hot động ca hàm
Trong chương trình, khi gp mt li gi hàm thì hàm bt đầu thc hin bng
cách chuyn các lnh thi hành đến hàm được gi. Quá trình din ra như sau:
- Nếu hàm có tham s, trước tiên các tham s s được gán giá tr thc tương
ng.
- Chương trình s thc hin tiếp các câu lnh trong thân hàm bt đầu t lnh
đầu tiên đến câu lnh cui cùng.
Trang 66
Lp trình căn bn
- Khi gp lnh return hoc du } cui cùng trong thân hàm, chương trình s
thoát khi hàm để tr v chương trình gi nó và thc hin tiếp tc nhng câu lnh ca
chương trình này.
III. TRUYN THAM S CHO HÀM
Mc nhiên, vic truyn tham s cho hàm trong C là truyn theo giá tr; nghĩa là
các giá tr thc (tham s thc) không b thay đổi giá tr khi truyn cho các tham s
hình thc
Ví d 1: Gi s ta mun in ra nhiu dòng, mi dòng 50 ký t nào đó. Để đơn
gin ta viết mt hàm, nhim v ca hàm này là in ra trên mt dòng 50 ký t nào đó.
Hàm này có tên là InKT.
#include <stdio.h>
#include <conio.h>
void InKT(char ch)
{
int i;
for(i=1;i<=50;i++) printf(“%c”,ch);
printf(“\n”);
}
int main()
{
char c = ‘A’;
InKT(‘*’); /* In ra 50 dau * */
InKT(‘+’);
InKT(c);
return 0;
}
Lưu ý:
- Trong hàm InKT trên, biến ch gi là tham s hình thc được truyn bng giá
tr (gi là tham tr ca hàm). Các tham tr ca hàm coi như là mt biến cc b trong
hàm và chúng được s dng như là d liu đầu vào ca hàm.
- Khi chương trình con được gi để thi hành, tham tr được cp ô nh và nhn
giá tr là bn sao giá tr ca tham s thc. Do đó, mc dù tham tr cũng là biến, nhưng
vic thay đổi giá tr ca chúng không có ý nghĩa gì đối vi bên ngoài hàm, không nh
hưởng đến chương trình chính, nghĩa là không làm nh hưởng đến tham s thc tương
ng.
Ví d 2: Ta xét chương trình sau đây:
#include <stdio.h>
#include <conio.h>
int hoanvi(int a, int b)
{
int t;
t=a; /*Đon này hoán v giá tr ca 2 biến a, b*/
a=b;
b=t;
printf("\Ben trong ham a=%d , b=%d",a,b);
return 0;
}
Trang 67