HTMT Va NNC Chapter 9
HTMT Va NNC Chapter 9
HAØM
CHÖÔNG 9
HAØM
Chöông trình con laø ñoaïn chöông trình ñaûm nhaän thöïc
hieän moät thao taùc nhaát ñònh.
Ñoái vôùi C, chöông trình con chæ ôû moät daïng laø haøm
(function), khoâng coù khaùi nieäm thuû tuïc (procedure).
CHÖÔNG 9
HAØM
Haøm main () laø haøm ñaëc bieät cuûa C, noù laø moät haøm maø
trong ñoù caùc thao taùc leänh (bao goàm caùc bieåu thöùc tính
toaùn, goïi haøm, ...) ñöôïc C thöïc hieän theo moät trình töï hôïp
logic ñeå giaûi quyeát baøi toaùn ñöôïc ñaët ra.
Vieäc söû duïng haøm trong C seõ laøm cho chöông trình trôû
neân raát deã quaûn lyù, deã söûa sai.
CHÖÔNG 9
HAØM
Taát caû caùc haøm trong C ñeàu ngang caáp nhau. Caùc haøm ñeàu
coù theå goïi laãn nhau, dó nhieân haøm ñöôïc goïi phaûi ñöôïc khai
baùo tröôùc haøm goïi.
CHÖÔNG 9
HAØM
Caùc haøm trong moät chöông trình coù theå naèm treân caùc taäp
tin khaùc nhau vaø khaùc vôùi taäp tin chính (chöùa haøm main
()), moãi taäp tin ñöôïc goïi laø moät module chöông trình,
Caùc module chöông trình seõ ñöôïc dòch rieâng reõ vaø sau ñoù
ñöôïc lieân keát (link) laïi vôùi nhau ñeå taïo ra ñöôïc moät taäp tin
thöïc thi duy nhaát.
Caùch taïo chöông trình theo kieåu nhieàu module nhö vaäy
trong C laø project
CHÖÔNG 9
HAØM
}
else /* a != 0 */
{
printf ("Phuong trinh bac hai va ");
delta = b*b - 4*a*c;
CHÖÔNG 9
HAØM
Khai baùo moät haøm laø chæ ra roõ raèng traû veà vò trí kieåu gì,
ñoái soá ñöa vaøo cho haøm coù bao nhieâu ñoái soá, moãi ñoái soá coù
kieåu nhö theá naøo vaø caùc leänh beân trong thaân haøm xaùc
ñònh thao taùc cuûa haøm.
Coù hai loaïi haøm: haøm trong thö vieän cuûa C vaø haøm do laäp
trình vieân töï ñònh nghóa.
CHÖÔNG 9
HAØM
- Neáu haøm söû duïng laø haøm chuaån trong thö vieän thì vieäc
khai baùo haøm chæ ñôn giaûn laø khai baùo prototype cuûa haøm,
caùc prototype naøy ñaõ ñöôïc phaân loaïi vaø ôû trong caùc file .h,
laäp trình vieân caàn ra leänh #include bao haøm caùc file naøy
vaøo chöông trình hoaëc module chöông trình söû duïng noù.
CHÖÔNG 9
HAØM
- Neáu caùc haøm söû duïng laø do laäp trình vieân töï ñònh nghóa
thì vieäc khai baùo haøm bao goàm hai vieäc: khai baùo
prototype cuûa haøm ñaàu chöông trình vaø ñònh nghóa caùc
leänh beân trong thaân haøm (hay thöôøng ñöôïc goïi taét laø ñònh
nghóa haøm).
CHÖÔNG 9
HAØM
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
Khi goïi haøm thì ñoái soá thaät caàn gôûi cho haøm chæ ñöôïc gôûi
döôùi daïng tham soá trò, coù nghóa laø caùc bieán, trò hoaëc bieåu
thöùc ñöôïc gôûi ñeán cho moät haøm, qua ñoái soá cuûa noù, seõ ñöôïc
laáy trò ñeå tính toaùn trong thaân haøm.
Coù theå noùi trò cuûa bieán thaät beân ngoaøi khi goïi haøm ñaõ
ñöôïc cheùp sang ñoái soá giaû, ta coù theå xem nhö laø bieán cuïc
boä cuûa haøm, vaø moïi vieäc tính toaùn chæ ñöôïc thöïc hieän treân
bieán cuïc boä naøy maø thoâi.
CHÖÔNG 9
HAØM
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
printf ("Moi nhap so luy thua: ");
scanf ("%d", &n);
xn =luy_thua (x, n);
printf("Ket qua: %5.2f luy thua %d bang: %7.2f\n",
x,n,xn);
printf ("Tri cua so mu la %d", n);
getch();}
double luy_thua(double x, int n)
{ double t = 1;
for ( ; n > 0; n--)
t *= x;
return t; }
CHÖÔNG 9
HAØM
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
Khi goïi haøm luõy thöøa, trò cuûa bieán x vaø n seõ ñöôïc cheùp vaøo
cho hai ñoái soá giaû x vaø n, do ñoù ta coù ñoàng thôøi caùc hoäp
bieán nhö sau khi vaøo trong haøm luy_thua():
n 3 3 n
CHÖÔNG 9
HAØM
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
Ví duï:
Ta coù theå goïi haøm luy_thua() vaø truyeàn cho haøm naøy moät
bieåu thöùc:
xn = luy_thua( 3*a + x , 5);
Tuy nhieân, caùch truyeàn tham soá nhö treân khoâng theå thay
ñoåi trò cuûa bieán, maø ñieàu naøy ñoâi khi laïi caàn thieát.
CHÖÔNG 9
HAØM
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
Ví duï: Vieát chöông trình duøng haøm nhaäp soá lieäu
#include <stdio.h>
#include <conio.h>
void nhap_tri (int a, int b);
main()
{ int a = 0, b = 0;
clrscr();
printf ("Truoc khi goi ham nhap_tri: a = %d, b = %d\n",
a, b);
nhap_tri (a, b);
printf("Sau khi goi ham nhap_tri a = %d, b = %d\n", a,
b);
getch();
}
CHÖÔNG 9
HAØM
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
Ví duï:
Thieát keá chöông trình duøng haøm nhaäp maûng, tính toång caùc
phaàn töû vaø in ra maøn hình keát quaû.
#include <stdio.h>
#include <conio.h>
void nhap_tri (int a[], int n);
int tong (int a[], int n);
CHÖÔNG 9
HAØM
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ
Ñoái vôùi C khoâng coù söï phaân bieät giöõa thuû tuïc (procedure)
vaø haøm (function), maø thuû tuïc cuõng ñöôïc xem laø moät haøm
maø khoâng traû veà giaù trò naøo caû. Ñeå khai baùo kieåu traû veà töø
haøm nhö vaäy C ñöa ra kieåu void, taïm goïi laø kieåu khoâng
hieåu.
Ví duï: so saùnh 2 tröôøng hôïp söû duïng haøm
c = getch(); vaø getch();
hoaëc
c = getche(); vaø getche();
CHÖÔNG 9
HAØM
main()
{
int so1, so2;
clrscr();
printf("Moi nhap hai so: ");
scanf ("%d %d", &so1, &so2);
so_sanh (so1, so2);
getch();
}
CHÖÔNG 9
HAØM
main()
{
int so1, so2;
int kq;
clrscr();
printf ("Moi nhap hai so: ");
scanf ("%d %d", &so1, &so2);
kq = so_sanh (so1, so2);
CHÖÔNG 9
HAØM
Khi khai baùo haøm maø ta khoâng neâu cuï theå kieåu traû veà cuûa
haøm, C maëc nhieân xem nhö haøm traû veà keát quaû laø int. Ví
duï:
so_sanh (int a, int b)
{ if (a > b)
return 1;
else if (a == b)
return 0;
else /* a < b */
return -1; }
CHÖÔNG 9
HAØM
Ñoái vôùi caùc haøm coù kieåu traû veà trò khaùc int, khi khai baùo
caàn phaûi trình baøy ñaày ñuû caùc thaønh phaàn cuûa haøm.
Khi goïi söû duïng haøm thì trong haøm goïi caàn phaûi coù neâu
keát quaû traû veà cuûa caùc haøm ñöôïc goïi trong ñoù.
Kieåu khai baùo keát quaû naøy coù theå ñöôïc ñaët beân ngoaøi taát
caû caùc haøm ñeå thoâng baùo cho taát caû caùc haøm veà trò traû veà
cuûa noù, hoaëc coù theå ñöôïc ñaët trong haøm maø haøm söû duïng
ñöôïc goïi: kieåu teân_haøm();
CHÖÔNG 9
HAØM
Ví duï:
main()
{ int so_sanh ();
int so1, so2;
clrscr();
printf ("Moi nhap hai so: ");
scanf ("%d %d", &so1, &so2);
so_sanh (so1, so2);
getch(); }
CHÖÔNG 9
HAØM
Nhö vaäy ñeå moät haøm coù theå söû duïng trong moät haøm khaùc
thì trong haøm söû duïng phaûi coù khai baùo haøm caàn söû duïng.
Tuy nhieân khai baùo naøy raát haïn cheá ôû choã khoâng cho pheùp
kieåm tra soá ñoái soá thaät ñöa vaøo haøm cuõng nhö kieåu cuûa ñoái
soá coù phuø hôïp khoâng
CHÖÔNG 9
HAØM
Ñeå khaéc phuïc nhöõng loãi treân, trong nhöõng phaùt trieån sau
naøy cuûa C theo ANSI, ngöôøi ta ñöa ra khaùi nieäm prototype
cuûa moät haøm, ñaây thaät söï laø moät daïng khai baùo haøm môû
roäng hôn, coù daïng toång quaùt nhö sau
kieåu teân_haøm (danh_saùch_khai_baùo_ñoái_soá);
Ví duï : int so_sanh (int a, int b);
void gptb1 (double a, double b, doubbe c);
char kiem_tra (double n);
CHÖÔNG 9
HAØM
C cho pheùp khai baùo prototype cuûa haøm trong phaàn khai
baùo ñoái soá chæ caàn coù kieåu maø khoâng caàn coù teân cuûa ñoái soá
giaû.
Ví duï :
int so_sanh (int, int);
CHÖÔNG 9
HAØM
Coâng duïng cuûa prototype cuûa haøm: prototype cuûa moät haøm
ngoaøi vieäc duøng ñeå khai baùo kieåu cuûa keát quaû traû veà töø
moät haøm, noù coøn ñöôïc duøng ñeå kieåm tra soá ñoái soá.
Ví duï :Neáu ñaõ khai baùo prototype
int so_sanh (int a, int b);
maø khi goïi haøm ta chæ göûi moät ñoái soá nhö sau:
so_sanh (so2);
thì seõ bò C phaùt hieän vaø baùo loãi
CHÖÔNG 9
HAØM
Chuyeån kieåu cuûa ñoái soá: khi moät haøm ñöôïc goïi, maø
haøm ñoù coù prototype, caùc ñoái soá ñöôïc gôûi cho haøm seõ ñöôïc
chuyeån kieåu baét buoäc theo kieåu cuûa caùc ñoái soá ñöôïc khai
baùo trong prototype, söï chuyeån kieåu naøy laøm cho caùc ñoái soá
ñöôïc söû duïng phuø hôïp vôùi caùc pheùp toaùn trong thaân haøm.
CHÖÔNG 9
HAØM
Chuyeån kieåu cuûa ñoái soá: khi moät haøm ñöôïc goïi, maø
haøm ñoù coù prototype, caùc ñoái soá ñöôïc gôûi cho haøm seõ ñöôïc
chuyeån kieåu baét buoäc theo kieåu cuûa caùc ñoái soá ñöôïc khai
baùo trong prototype, söï chuyeån kieåu naøy laøm cho caùc ñoái soá
ñöôïc söû duïng phuø hôïp vôùi caùc pheùp toaùn trong thaân haøm.
Tröôøng hôïp maø söï chuyeån kieåu khoâng cho pheùp
thöïc hieän thì C seõ ñöa ra caùc thoâng baùo loãi, hoaëc moät lôøi
caûnh baùo (warning.
CHÖÔNG 9
HAØM
Ñoái vôùi caùc haøm chuaån trong thö vieän C, prototype cuûa
chuùng ñaõ ñöôïc C vieát saün vaø ñeå trong caùc file coù phaàn môû
roäng laø .h, muoán laáy caùc prototype naøy vaøo chöông trình ta
caàn ra chæ thò bao haøm file .h chöùa prototype cuûa caùc haøm
caàn söû duïng vaøo ñaàu chöông trình baèng leänh tieàn xöû lyù
#include theo cuù phaùp sau:
# include <file. h>
Ví duï 3: #include <stdio.h>
CHÖÔNG 9
HAØM
Một quy ước quan trọng mà chúng ta quy định cho cơ chế
gọi là hàm được gọi nên độc lập với nơi gọi.
CHÖÔNG 9
HAØM
6. Vieát chöông trình thieát keá hai haøm max() vaø min() cho
pheùp tìm soá lôùn nhaát vaø nhoû nhaát trong loaït soá ñaõ nhaäp.
Loaït soá nhaäp naøy seõ keát thuùc vieäc nhaäp baèng vieäc nhaán
phím <F6>
7. Vieát moät chöông trình cho pheùp nhaäp moät chuoãi. Haõy
thieát keá moät haøm cho pheùp caét chuoãi ñoù ra laøm nhieàu töø
vaø in ra maøn hình moãi töø treân moät haøng.
CHÖÔNG 9
HAØM
8. Vieát moät haøm nhaän moät chuoãi vaø cho pheùp ñaûo chuoãi
ñoù, in ra keát quaû.
9. Vieát moät haøm cho pheùp nhaän moät soá nguyeân döông. In
ra maøn hình kyù soá thöù n tính töø beân phaûi qua cuûa soá ñoù.
Ví duï:
Nhaäp: 12345 4
Xuaát: 2
CHÖÔNG 9
HAØM
10. Thieát keá moät haøm ñeä quy cho pheùp nhaän moät soá
nguyeân döông, in ra maøn hình soá ñoù ôû daïng nhò phaân.
11. Vieát haøm ñeä quy tính xn.
12. Vieát moät haøm nhaän moät soá döông coù phaàn leû vaø in ra
maøn hình phaàn nguyeân vaø phaàn leû rieâng bieät.
13. Vieát chöông trình vôùi haøm tính toång sau:
S=1 - x2/2! + x4/4! - … ± xn/n!
14. Töông töï nhö baøi 10.13, nhöng tính toång sau:
S=1 - x3/3! + x5/5! - … ± xn/n!
CHÖÔNG 9
HAØM