CHÖÔNG 9 HAØM CHÖÔNG 9 HAØM 9.1 Khaùi nieäm haøm 9.2 Khai baùo haøm 9.3 Ñoái soá cuûa haøm - ñoái soá laø tham trò 9.4 Keát quaû traû veà cuûa haøm - leänh RETURN 9.5 PROTOTYPE cuûa moät haøm 9.6 Haøm ñeä quy Baøi taäp cuoái chöông CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM 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 9.1 KHAÙI NIEÄM 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 9.1 KHAÙI NIEÄM 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 9.1 KHAÙI NIEÄM 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 9.1 KHAÙI NIEÄM HAØM Ví duï: Chöông trình 1 #include <stdio.h> main () { double a, b, c, delta, n1, n2; clrscr(); printf ("Nhap 3 he so phuong trinh bac hai; "); scanf ("%lf %lf %lf", &a, &b, &c); CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM if (a ==0)/* phuong trinh suy bien ve bac nhat */ { printf ("Phuong trinh suy bien ve bac nhat va "); if (b == 0) if (c == 0) printf ("vo so nghiem\n"); else /* c != 0 */ printf ("vo nghiem\n"); else / * b != 0 */ CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM { n1 = -c/b; printf ("co 1 nghiem: = %5.2f \n", n1); } } else /* a != 0 */ { printf ("Phuong trinh bac hai va "); delta = b*b - 4*a*c; CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM if (delta < 0) printf ("vo nghiem thuc\n"); else if (delta == 0) { n1 = n2 = -b/2/a; printf ("co nghiem kep x1 = x2 = %5.2f \n" ,n1); } CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM else /* delta > 0 */ { n1 = (-b + sqrt(delta))/2/a; n2 = (-b - sqrt(delta))/2/a; printf ("co hai nghiem phan biet; \n"); printf ("x1 = %5.2f \n", n2); } } getch(); } CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM Ví duï: Chöông trình 2 #include <stdio.h> void gptb1 (double a, double b); void gptb2 (double a, double b, double c); CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM void gptb1 (double a, double b) { printf ("Phuong trinh suy bien ve bac nhat va "); if (a == 0) if (b == 0) printf ("vo so nghiem\n"); else /* b != 0 */ printf ("vo nghiem\n"); else printf ("co 1 nghiem: x = %5.2f \n",-b/a); } CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM void gptb2 (double a,double b,double c) { double delta, x1, x2; printf ("Phuong trinh bac hai va "); delta = b*b - 4*a*c; if (delta < 0) printf ("vo nghiem thuc\n"); else if (delta == 0) printf ("co nghiem kep x1 = x2 = %5.2f \n", - b/2/a); CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM else /* delta > 0 */ { x1 = (-b + sqrt(delta))/2/a; x2 = (-b - sqrt(delta))/2/a; printf ("co hai nghiem phan biet: \n"); printf ("x1 = %5.2f \n" , x2); } } CHÖÔNG 9 HAØM 9.1 KHAÙI NIEÄM HAØM main() { double a, b, c; clrscr(); printf ("Nhap 3 he so phuong trinh bac hai: "); scant ("%lf %lf %lf", &a, &b, &c); if (a == 0) /* phuong trinh suy bien ve bac nhat */ gptb1 (b, c); else /* a != 0 */ gptb2 (a, b, c); getch(); } CHÖÔNG 9 HAØM 9.2 KHAI BAÙO 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 9.2 KHAI BAÙO 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 9.2 KHAI BAÙO 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.2 KHAI BAÙO HAØM Daïng 1: Daïng 2: (Laïc haäu) kieåu teân_haøm kieåu teân_haøm (danh_saùch_ñoái_soá) (danh_saùch_khai_baùo_ñoái_soá) khai_baùo_ñoái_soá { { khai_baùo_bieán_cuïc_boä khai_baùo_bieán_cuïc_boä leänh leänh } } CHÖÔNG 9 HAØM 9.2 KHAI BAÙO HAØM Daïng 1: Daïng 2: int so_sanh (int a, int b) int so_sanh (a, b) { int a, b; int ket_qua; { if (a >b) int ket_qua: ket_qua = 1: if (a >b) else if (a == b) ket_qua = 1; else if (a == b) ket_qua = 0; ket_qua = 0; else if (a < b) else if (a < b) ket_qua = -1; ket_qua = -1; return ket_qua; return ket_qua; } } CHÖÔNG 9 HAØM 9.2 KHAI BAÙO HAØM Ví duï: #include <stdio.h> int so_sanh (int a, int b); prototype cuûa haøm so_sanh main() { int a, b, ket_qua; clrscr(); printf ("Moi nhap hai so "); scanf ("%d %d" , &a, &b); ket_qua = so_sanh (a, b); goïi haøm CHÖÔNG 9 HAØM 9.2 KHAI BAÙO HAØM switch (ket_qua) { case -1: printf ("So %d nho hon so %d \n" , a, b); break; case 0: printf ("So %d bang so %d \n", a, b); break; case 1: printf ("So %d lon hon so %d \n" , a, b); break; } getch(); } CHÖÔNG 9 HAØM 9.2 KHAI BAÙO HAØM int so_sanh (int a, int b) { int ket_qua: if (a >b) ket_qua = 1; else if (a == b) ket_qua = 0; else if (a < b) ket_qua = -1; return ket_qua; } 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Ò Ví duï:Vieát chöông trình tính luõy thöøa n cuûa x(xn), vôùi n nguyeân vaø thöïc.h> double luy_thua(double x, int n); main() { int n; double x, xn; clrscr(); printf ("Moi nhap so tinh luy thua: "); scant ("%lf", &x); CHÖÔNG 9 HAØM 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(): Bieán cuûa haøm main() Bieán cuûa haøm luy_thua() x 3.45 x 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> 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Ò void nhap_tri (int a, int b) { printf ("Moi nhap hai so: "); scanf ("%d %d", &a, &b); } CHÖÔNG 9 HAØM 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û.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Ò main() Giaù trò cuûa maûng { int a[100], n; coù theå bò thay ñoåi int sum; trong haøm clrscr(); printf ("Moi nhap so phan tu cua mang: "); scanf (%d , &n); nhap_tri (a, n); sum = tong (a, n); printf ("Tong cac phan tu cua mang la: %d \n", sum); getch(); } CHÖÔNG 9 HAØM 9.3 ÑOÁI SOÁ CUÛA HAØM - ÑOÁI SOÁ LAØ THAM TRÒ void nhap_tri (int a[], int n) { int i; printf ("Moi nhap cac phan tu cua mang: "); for (i = 0; i <n; i++) scanf ("%d", &a[i]); } int tong (int a[], int n) Giaù trò cuûa maûng { int i, s = 0; coù theå bò thay ñoåi for (i = 0; i < n; s += a[i++]) trong haøm ; return s;} CHÖÔNG 9 HAØM 9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM - LEÄNH RETURN Ñ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 9.4 KEÁT QUAÛ TRAÛ VEÀ CUÛA HAØM - LEÄNH RETURN Trong chöông trình, ta cuõng bieát leänh return duøng ñeå thöïc hieän vieäc traû trò cuûa haøm veà cho nôi goïi noù, duø trò naøy coù ñöôïc söû duïng hay khoâng tuøy nôi goïi. Ví duï: Thieát keá haøm so saùnh hai soá. CHÖÔNG 9 HAØM 9.