Ãëàâíàÿ ñòðàíèöà Ñëó÷àéíàÿ ñòðàíèöà ÊÀÒÅÃÎÐÈÈ: ÀâòîìîáèëèÀñòðîíîìèÿÁèîëîãèÿÃåîãðàôèÿÄîì è ñàäÄðóãèå ÿçûêèÄðóãîåÈíôîðìàòèêàÈñòîðèÿÊóëüòóðàËèòåðàòóðàËîãèêàÌàòåìàòèêàÌåäèöèíàÌåòàëëóðãèÿÌåõàíèêàÎáðàçîâàíèåÎõðàíà òðóäàÏåäàãîãèêàÏîëèòèêàÏðàâîÏñèõîëîãèÿÐåëèãèÿÐèòîðèêàÑîöèîëîãèÿÑïîðòÑòðîèòåëüñòâîÒåõíîëîãèÿÒóðèçìÔèçèêàÔèëîñîôèÿÔèíàíñûÕèìèÿ×åð÷åíèåÝêîëîãèÿÝêîíîìèêàÝëåêòðîíèêà |
Chng 6
Hµm
Mé t chng tr× nh viÕ t trong ng«n ng÷ C lµ mé t d·y c¸ c hµm, trong ®ã cã mé t hµm chÝ nh (hµm main()). Hµm chia c¸ c bµi to¸ n lí n thµnh c¸ c c«ng viÖ c nhá hn, gió p thù c hiÖ n nh÷ ng c«ng viÖ c lÆ p l¹ i nµo ®ã mé t c¸ ch nhanh chã ng mµ kh«ng ph¶i viÕ t l¹ i ®o¹ n chng tr× nh. Thø tù c¸ c hµm trong chng tr× nh lµ bÊ t kú, song chng tr× nh bao giê cò ng ®i thù c hiÖ n tõ hµm main().
6.1. C së: Hµm cã thÓ xem lµ mé t ®n vÞ ®é c lË p cñ a chng tr× nh. C¸ c hµm cã vai trß ngang nhau, v× vË y kh«ng cã phÐ p x©y dù ng mé t hµm bª n trong c¸ c hµm kh¸ c. X©y dù ng mé t hµm bao gå m: khai b¸ o kiÓ u hµm, ®Æ t tª n hµm, khai b¸ o c¸ c ®è i vµ ®a ra c©u lÖ nh cÇ n thiÕ t ®Ó thù c hiÖ n yª u cÇ u ®Ò ra cho hµm. Mé t hµm ®î c viÕ t theo mÉ u sau: type tª n hµm (khai b¸ o c¸ c ®è i) { Khai b¸ o c¸ c biÕ n cô c bé C¸ c c©u lÖ nh [return[biÓ u thø c]; ] }
Dß ng tiª u ®Ò: Trong dß ng ®Ç u tiª n cñ a hµm chø a c¸ c th«ng tin vÒ: kiÓ u hµm, tª n hµm, kiÓ u vµ tª n mç i ®è i. VÝ dô: float max3s(float a, float b, float c) khai b¸ o c¸ c ®è i cã d¹ ng: KiÓ u ®è i 1 tª n ®è i 1, kiÓ u ®è i 2 tª n ®è i 2,..., kiÓ u ®è i n tª n ®è i n
Th©n hµm: Sau dß ng tiª u ®Ò lµ th©n hµm. Th©n hµm lµ né i dung chÝ nh cñ a hµm b¾ t ®Ç u vµ kÕ t thó c b»ng c¸ c dÊ u { }. Trong th©n hµm chø a c¸ c c©u lÖ nh cÇ n thiÕ t ®Ó thù c hiÖ n mé t yª u cÇ u nµo ®ã ®· ®Ò ra cho hµm. Th©n hµm cã thÓ sö dô ng mé t c©u lÖ nh return, cã thÓ dï ng nhiÒ u c©u lÖ nh return ë c¸ c chç kh¸ c nhau, vµ cò ng cã thÓ kh«ng sö dô ng c©u lÖ nh nµy. D¹ ng tæ ng qu¸ t cñ a nã lµ: return [biÓ u thø c]; Gi¸ trÞ cñ a biÓ u thø c trong c©u lÖ nh return sÏ ®î c g¸ n cho hµm. VÝ dô: XÐ t bµi to¸ n: T× m gi¸ trÞ lí n nhÊ t cñ a ba sè mµ gi¸ trÞ mµ gi¸ trÞ cñ a chó ng ®î c ®a vµo bµn phÝ m. X©y dù ng chng tr× nh vµ tæ chø c thµnh hai hµm: Hµm main() vµ hµm max3s. NhiÖ m vô cñ a hµm max3s lµ tÝ nh gi¸ trÞ lí n nhÊ t cñ a ba sè ®ä c vµo, gi¶ sö lµ a, b, c. NhiÖ m vô cñ a hµm main() lµ ®ä c ba gi¸ trÞ vµo tõ bµn phÝ m, rå i dï ng hµm max3s ®Ó tÝ nh nh trª n, rå i ®a kÕ t qu¶ ra mµn h× nh.
Chng tr× nh ®î c viÕ t nh sau: #include " stdio.h" float max3s(float a, float b, float c); /* Nguyª n mÉ u hµm*/ main() { float x, y, z; printf(" \n Vao ba so x, y, z: "); scanf(" %f%f%f", & x& y& z); printf(" \n Max cua ba so x=%8.2f y=%8.2f z=%8.2f la: %8.2f", x, y, z, max3s(x, y, z)); } /* KÕ t thó c hµm main*/
float max3s(float a, float b, float c) { float max; max=a; if (max< b) max=b; if (max< c) max=c; return(max); } /* KÕ t thó c hµm max3s*/
Quy t¾ c ho¹ t ®é ng cñ a hµm: Mé t c¸ ch tæ ng qu¸ t lê i gä i hµm cã d¹ ng sau: tª n hµm ([Danh s¸ ch c¸ c tham sè thù c]) Sè c¸ c tham sè thù c tÕ thay vµo trong danh s¸ ch c¸ c ®è i ph¶i b»ng sè tham sè h× nh thø c vµ lÇ n lî t chó ng cã kiÓ u tng ø ng ví i nhau. Khi gÆ p mé t lê i gä i hµm th× nã sÏ b¾ t ®Ç u ®î c thù c hiÖ n. Nã i c¸ ch kh¸ c, khi m¸ y gÆ p lê i gä i hµm ë mé t vÞ trÝ nµo ®ã trong chng tr× nh, m¸ y sÏ t¹ m dê i chç ®ã vµ chuyÓ n ®Õ n hµm tng ø ng. Qu¸ tr× nh ®ã diÔ n ra theo tr× nh tù sau: CÊ p ph¸ t bé nhí cho c¸ c biÕ n cô c bé. G¸ n gi¸ trÞ cñ a c¸ c tham sè thù c cho c¸ c ®è i tng ø ng. Thù c hiÖ n c¸ c c©u lÖ nh trong th©n hµm. Khi gÆ p c©u lÖ nh return hoÆ c dÊ u } cuè i cï ng cñ a th©n hµm th× m¸ y sÏ xo¸ c¸ c ®è i, biÕ n cô c bé vµ ra khá i hµm. NÕ u trë vÒ tõ mé t c©u lÖ nh return cã chø a biÓ u thø c th× gi¸ trÞ cñ a biÓ u thø c ®î c g¸ n cho hµm. Gi¸ trÞ cñ a hµm sÏ ®î c sö dô ng trong c¸ c biÓ u thø c chø a nã.
C¸ c tham sè thù c, c¸ c ®è i vµ biÕ n cô c bé: Do ®è i vµ biÕ n cô c bé ®Ò u cã ph¹ m vi ho¹ t ®é ng trong cï ng mé t hµm nª n ®è i vµ biÕ n cô c bé cÇ n cã tª n kh¸ c nhau. §è i vµ biÕ n cô c bé ®Ò u lµ c¸ c biÕ n tù ®é ng. Chó ng ®î c cÊ p ph¸ t bé nhí khi hµm ®î c xÐ t ®Õ n vµ bÞ xo¸ khi ra khá i hµm nª n ta kh«ng thÓ mang gi¸ trÞ cñ a ®è i ra khá i hµm. §è i vµ biÕ n cô c bé cã thÓ trï ng tª n ví i c¸ c ®¹ i lî ng ngoµi hµm mµ kh«ng g©y ra nhÇ m lÉ n nµo. Khi mé t hµm ®î c gä i tí i, viÖ c ®Ç u tiª n lµ gi¸ trÞ cñ a c¸ c tham sè thù c ®î c g¸ n cho c¸ c ®è i (trong vÝ dô trª n hµm max3s, c¸ c tham sè thù c lµ x, y, z, c¸ c ®è i tng ø ng lµ a, b, c). Nh vË y c¸ c ®è i chÝ nh lµ c¸ c b¶n sao cñ a c¸ c tham sè thù c. Hµm chØ lµm viÖ c trª n c¸ c ®è i. C¸ c ®è i cã thÓ bÞ biÕ n ®æ i trong th©n hµm, cß n c¸ c tham sè thù c th× kh«ng bÞ thay ®æ i.
Chó ý: Khi hµm khai b¸ o kh«ng cã kiÓ u ë trí c nã th× nã ®î c mÆ c ®Þ nh lµ kiÓ u int. Kh«ng nhÊ t thiÕ t ph¶i khai b¸ o nguyª n mÉ u hµm. Nhng nã i chung nª n cã v× nã cho phÐ p chng tr× nh biª n dÞ ch ph¸ t hiÖ n lç i khi gä i hµm hay tù ®é ng viÖ c chuyÓ n d¹ ng. Nguyª n mÉ u cñ a hµm thù c chÊ t lµ dß ng ®Ç u tiª n cñ a hµm thª m vµo dÊ u;. Tuy nhiª n trong nguyª n mÉ u cã thÓ bá tª n c¸ c ®è i. Hµm thê ng cã mé t vµi ®è i. VÝ dô nh hµm max3s cã ba ®è i lµ a, b, c. c¶ ba ®è i nµy ®Ò u cã gi¸ trÞ float. Tuy nhiª n, cò ng cã hµm kh«ng ®è i nh hµm main. Hµm thê ng cho ta mé t gi¸ trÞ nµo ®ã. LÏ dÜ nhiª n gi¸ trÞ cñ a hµm phô thué c vµo gi¸ trÞ c¸ c ®è i.
6.2. Hµm kh«ng cho c¸ c gi¸ trÞ: C ¸ c hµm kh«ng cho gi¸ trÞ giè ng nh thñ tô c (procedure) trong ng«n ng÷ lË p tr× nh PASCAL. Trong trê ng hî p nµy, kiÓ u cñ a nã lµ void. VÝ dô hµm t× m gi¸ trÞ max trong ba sè lµ max3s ë trª n cã thÓ ®î c viÕ t thµnh thñ tô c hiÓ n thÞ sè cù c ®¹ i trong ba sè nh sau: void htmax3s(float a, float b, float c) { float max; max=a; if (max< b) max=b; if (max< c) max=c; } Ló c nµy, trong hµm main ta gä i hµm htmax3s b»ng c©u lÖ nh: htmax3s(x, y, z);
6.3. Hµm ®Ö qui: 6.3.3. Më ®Ç u: C kh«ng nh÷ ng cho phÐ p tõ hµm nµy gä i tí i hµm kh¸ c, mµ nã cß n cho phÐ p tõ mé t ®iÓ m trong th©n cñ a mé t hµm gä i tí i chÝ nh hµm ®ã. Hµm nh vË y gä i lµ hµm ®Ö qui. Khi hµm gä i ®Ö qui ®Õ n chÝ nh nã, th× mç i lÇ n gä i m¸ y sÏ t¹ o ra mé t tË p c¸ c biÕ n cô c bé mí i hoµn toµn ®é c lË p ví i tË p c¸ c biÕ n cô c bé ®· ®î c t¹ o ra trong c¸ c lÇ n gä i trí c. §Ó minh ho¹ chi tiÕ t nh÷ ng ®iÒ u trª n, ta xÐ t mé t vÝ dô vÒ tÝ nh giai thõ a cñ a sè nguyª n dng n. Khi kh«ng dï ng phng ph¸ p ®Ö qui hµm cã thÓ ®î c viÕ t nh sau: long int gt(int n) /* TÝ nh n! ví i n> =0*/ { long int gtphu=1; int i; for (i=1; i< =n; ++i) gtphu*=i; return s; } Ta nhË n thÊ y r»ng n! cã thÓ tÝ nh theo c«ng thø c truy hå i sau:
n! =1 nÕ u n=0 n! =n*(n-1)! nÕ u n> 0 Hµm tÝ nh n! theo phng ph¸ p ®Ö qui cã thÓ ®î c viÕ t nh sau: long int gtdq(int n) { if (n==0 || n==1) return 1; else return(n*gtdq(n-1)); } Ta ®i gi¶i thÝ ch ho¹ t ®é ng cñ a hµm ®Ö qui khi sö dô ng trong hµm main dí i ®©y: #include " stdio.h" main() { printf(" \n 3! =%d", gtdq(3)); } LÇ n gä i ®Ç u tiª n tí i hµm gtdq ®î c thù c hiÖ n tõ hµm main(). M¸ y sÏ t¹ o ra mé t tË p c¸ c biÕ n tù ®é ng cñ a hµm gtdq. TË p nµy chØ gå m c¸ c ®è i n. Ta gä i ®è i n ®î c t¹ o ra lÇ n thø nhÊ t lµ n thø nhÊ t. Gi¸ trÞ cñ a tham sè thù c (sè 3) ®î c g¸ n cho n thø nhÊ t. Ló c nµy biÕ n n trong th©n hµm ®î c xem lµ n thø nhÊ t. Do n thø nhÊ t cã gi¸ trÞ b»ng 3 nª n ®iÒ u kiÖ n trong to¸ n tö if lµ sai vµ do ®ã m¸ y sÏ lù a chä n c©u lÖ nh else. Theo c©u lÖ nh nµy, m¸ y sÏ tÝ nh gi¸ trÞ biÓ u thø c: n*gtdq(n-1) (*) §Ó tÝ nh biÓ u thø c trª n, m¸ y cÇ n gä i chÝ nh hµm gtdq v× thÕ lÇ n gä i thø hai sÏ thù c hiÖ n. M¸ y sÏ t¹ o ra ®è i n mí i, ta gä i ®ã lµ n thø hai. Gi¸ trÞ cñ a n-1 ë ®©y l¹ i lµ ®è i cñ a hµm, ®î c truyÒ n cho hµm vµ hiÓ u lµ n thø hai, do vË y n thø hai cã gi¸ trÞ lµ 2. B©y giê, do n thø hai vÉ n cha tho¶ m·n ®iÒ u kiÖ n if nª n m¸ y l¹ i tiÕ p tô c tÝ nh biÓ u thø c: n*gtdq(n-1) (**) BiÓ u thø c trª n l¹ i gä i hµm gtdq lÇ n thø ba. M¸ y l¹ i t¹ o ra ®è i n lÇ n thø ba vµ ë ®©y n thø ba cã gi¸ trÞ b»ng 1. §è i n=1 thø ba l¹ i ®î c truyÒ n cho hµm, ló c nµy ®iÒ u kiÖ n trong lÖ nh if ®î c tho¶ m·n, m¸ y ®i thù c hiÖ n c©u lÖ nh: return 1=gtdq(1) (***) B¾ t ®Ç u tõ ®©y, m¸ y sÏ thù c hiÖ n ba lÇ n ra khá i hµm gtdq. LÇ n ra khá i hµm thø nhÊ t ø ng ví i lÇ n vµo thø ba. KÕ t qu¶ lµ ®è i n thø ba ®î c gi¶i phã ng, hµm gtdq(1) cho gi¸ trÞ lµ 1 vµ m¸ y trë vÒ xÐ t gi¸ trÞ biÓ u thø c n*gtdq(1) ®©y lµ kÕ t qu¶ cñ a (**)
ë ®©y, n lµ n thø hai vµ cã gi¸ trÞ b»ng 2. Theo c©u lÖ nh return, m¸ y sÏ thù c hiÖ n lÇ n ra khá i hµm lÇ n thø hai, ®è i n thø hai sÏ ®î c gi¶i phã ng, kÕ t qu¶ lµ biÓ u thø c trong (**) cã gi¸ trÞ lµ 2.1. Sau ®ã m¸ y trë vÒ biÓ u thø c (*) ló c nµy lµ: n*gtdq(2)=n*2*1 n l¹ i hiÓ u lµ thø nhÊ t, nã cã gi¸ trÞ b»ng 3, do vË y gi¸ trÞ cñ a biÓ u thø c trong (*) lµ 3.2.1=6. ChÝ nh gi¸ trÞ nµy ®î c sö dô ng trong c©u lÖ nh printf cñ a hµm main() nª n kÕ t qu¶ in ra trª n mµn h× nh lµ: 3! =6 Chó ý: Hµm ®Ö qui so ví i hµm cã thÓ dï ng vß ng lÆ p th× ®n gi¶n hn, tuy nhiª n ví i m¸ y tÝ nh khi dï ng hµm ®Ö qui sÏ dï ng nhiÒ u bé nhí trª n ng¨ n xÕ p vµ cã thÓ dÉ n ®Õ n trµn ng¨ n xÕ p. V× vË y khi gÆ p mé t bµi to¸ n mµ cã thÓ cã c¸ ch gi¶i lÆ p (kh«ng dï ng ®Ö qui) th× ta nª n dï ng c¸ ch lÆ p nµy. Song vÉ n tå n t¹ i nh÷ ng bµi to¸ n chØ cã thÓ gi¶i b»ng ®Ö qui.
6.3.2. C¸ c bµi to¸ n cã thÓ dï ng ®Ö qui: Phng ph¸ p ®Ö qui thê ng ¸ p dô ng cho c¸ c bµi to¸ n phô thué c tham sè cã hai ®Æ c ®iÓ m sau: Bµi to¸ n dÔ dµng gi¶i quyÕ t trong mé t sè trê ng hî p riª ng ø ng ví i c¸ c gi¸ trÞ ®Æ c biÖ t cñ a tham sè. Ngê i ta thê ng gä i lµ trê ng hî p suy biÕ n. Trong trê ng hî p tæ ng qu¸ t, bµi to¸ n cã thÓ qui vÒ mé t bµi to¸ n cï ng d¹ ng nhng gi¸ trÞ tham sè th× bÞ thay ®æ i. Sau mé t sè h÷ u h¹ n bí c biÕ n ®æ i dÖ qui nã sÏ dÉ n tí i trê ng hî p suy biÕ n. Bµi to¸ n tÝ nh n giai thõ a nª u trª n thÓ hiÖ n râ nÐ t ®Æ c ®iÓ u nµy.
6.3.3. C¸ ch x©y dù ng hµm ®Ö qui: Hµm ®Ö qui thê ng ®î c x©y dù ng theo thuË t to¸ n sau: if (trê ng hî p suy biÕ n) { Tr× nh bµy c¸ ch gi¶i bµi to¸ n khi suy biÕ n } else /* Trê ng hî p tæ ng qu¸ t */ { Gä i ®Ö qui tí i hµm (®ang viÕ t) ví i c¸ c gi¸ trÞ kh¸ c cñ a tham sè } 6.3.4. C¸ c vÝ dô vÒ dï ng hµm ®Ö qui: VÝ dô 1: Bµi to¸ n dï ng ®Ö qui t× m USCLN cñ a hai sè nguyª n dng a vµ b. Trong trê ng hî p suy biÕ n, khi a=b th× USCLN cñ a a vµ b chÝ nh lµ gi¸ trÞ cñ a chó ng. Trong trê ng hî p chung: uscln(a, b)=uscln(a-b, b) nÕ u a> b uscln(a, b)=uscln(a, b-a) nÕ u a< b
Ta cã thÓ viÕ t chng tr× nh nh sau: #include " stdio.h" int uscln(int a, int b); /* Nguyª n mÉ u hµm*/ main() { int m, n; printf(" \n Nhap cac gia tri cua a va b: "); scanf(" %d%d", & m, & n); printf(" \n USCLN cua a=%d va b=%d la: %d", m, m, uscln(m, n)) } int uscln(int a, int b) { if (a==b) return a; else if (a> b) return uscln(a-b, b);
else return uscln(a, b-a); }
VÝ dô 2: Chng tr× nh ®ä c vµo mé t sè rå i in nã ra dí i d¹ ng c¸ c ký tù liª n tiÕ p. # include " stdio.h" # include " conio.h" void prind(int n); main() { int a; clrscr(); printf(" n="); scanf(" %d", & a); prind(a); getch(); } void prind(int n) { int i; if (n< 0) { putchar('-'); n=-n; } if ((i=n/10)! =0) prind(i); putchar(n%10+'0'); } 6.4. Bé tiÒ n sö lý C: C ®a ra mé t sè c¸ ch më ré ng ng«n ng÷ b»ng c¸ c bé tiÒ n sö lý macro ®n gi¶n. Cã hai c¸ ch më ré ng chÝ nh lµ #define mµ ta ®· hä c vµ kh¶ n¨ ng bao hµm né i dung cñ a c¸ c file kh¸ c vµo file ®ang ®î c dÞ ch.
Bao hµm file: §Ó dÔ dµng xö lý mé t tË p c¸ c #define vµ khai b¸ o (trong c¸ c ®è i tî ng kh¸ c), C ®a ra c¸ ch bao hµm c¸ c file kh¸ c vµo file ®ang dÞ ch cã d¹ ng: #include " tª n file" Dß ng khai b¸ o trª n sÏ ®î c thay thÕ bë i né i dung cñ a file cã tª n lµ tª n file. Th«ng thê ng cã vµi dß ng nh vË y xuÊ t hiÖ n t¹ i ®Ç u mç i file gè c ®Ó gä i vµo c¸ c c©u lÖ nh #define chung vµ c¸ c khai b¸ o cho c¸ c biÕ n ngoµi. C¸ c #include ®î c phÐ p lå ng nhau. Thê ng th× c¸ c #include ®î c dï ng nhiÒ u trong c¸ c chng tr× nh lí n, nã ®¶m b¶o r»ng mä i file gè c ®Ò u ®î c cung cÊ p cï ng c¸ c ®Þ nh nghÜ a vµ khai b¸ o biÕ n, do vË y tr¸ nh ®î c c¸ c lç i khã chÞ u do viÖ c thiÕ u c¸ c khai b¸ o ®Þ nh nghÜ a. TÊ t nhiª n khi thay ®æ i file ®î c bao hµm vµo th× mä i file phô thué c vµo nã ®Ò u ph¶i dÞ ch l¹ i.
PhÐ p thÕ MACRO: §Þ nh nghÜ a cã d¹ ng: #define biÓ u thø c 1 [ biÓ u thø c 2 ] sÏ gä i tí i mé t macro ®Ó thay thÕ biÓ u thø c 2 (nÕ u cã) cho biÓ u thø c 1. VÝ dô: #define YES 1 Macro thay biÕ n YES bë i gi¸ trÞ 1 cã nghÜ a lµ hÔ cã chç nµo trong chng tr× nh cã xuÊ t hiÖ n biÕ n YES th× nã sÏ ®î c thay bë i gi¸ trÞ 1. Ph¹ m vi cho tª n ®î c ®Þ nh nghÜ a bë i #define lµ tõ ®iÓ m ®Þ nh nghÜ a ®Õ n cuè i file gè c. Cã thÓ ®Þ nh nghÜ a l¹ i tª n vµ mé t ®Þ nh nghÜ a cã thÓ sö dô ng c¸ c ®Þ nh nghÜ a kh¸ c trí c ®ã. PhÐ p thÕ kh«ng thù c hiÖ n cho c¸ c x©u dÊ u nh¸ y, vÝ dô nh YES lµ tª n ®î c ®Þ nh nghÜ a th× kh«ng cã viÖ c thay thÕ nµo ®î c thù c hiÖ n trong ®o¹ n lÖ nh cã " YES". V× viÖ c thiÕ t lË p #define lµ mé t bí c chuÈ n bÞ chø kh«ng ph¶i lµ mé t phÇ n cñ a chng tr× nh biª n dÞ ch nª n cã rÊ t Ý t h¹ n chÕ vÒ v¨ n ph¹ m vÒ viÖ c ph¶i ®Þ nh nghÜ a c¸ i g×. Ch¼ ng h¹ n nh nh÷ ng ngê i lË p tr× nh a thÝ ch PASCAL cã thÓ ®Þ nh nghÜ a: #define then #define begin { #define end; } sau ®ã viÕ t ®o¹ n chng tr× nh: if (i> 0) then begin a=i; ...... end; Ta cò ng cã thÓ ®Þ nh nghÜ a c¸ c macro cã ®è i, do vË y v¨ n b¶n thay thÕ sÏ phô thué c vµo c¸ ch gä i tí i macro.
VÝ dô: §Þ nh nghÜ a macro gä i max nh sau: #define max(a, b) ((a)> (b)? (a): (b)) ViÖ c sö dô ng: x=max(p+q, r+s);
tng ®ng ví i: x=((p+q)> (r+s)? (p+q): (r+s)); Nh vË y ta cã thÓ cã hµm tÝ nh cù c ®¹ i viÕ t trª n mé t dß ng. Chõ ng nµo c¸ c ®è i cß n gi÷ ®î c tÝ nh nhÊ t qu¸ n th× macro nµy vÉ n cã gi¸ trÞ ví i mä i kiÓ u d÷ liÖ u, kh«ng cÇ n ph¶i cã c¸ c lo¹ i hµm max kh¸ c cho c¸ c kiÓ u d÷ liÖ u kh¸ c nhng vÉ n ph¶i cã ®è i cho c¸ c hµm. TÊ t nhiª n nÕ u ta kiÓ m tra l¹ i viÖ c më ré ng cñ a hµm max trª n, ta sÏ thÊ y r»ng nã cã thÓ g©y ra sè bÉ y. BiÓ u thø c ®· ®î c tÝ nh l¹ i hai lÇ n vµ ®iÒ u nµy lµ kh«ng tè t nÕ u nã g©y ra hiÖ u qu¶ phô kiÓ u nh c¸ c lê i gä i hµm vµ to¸ n tö t¨ ng. CÇ n ph¶i thË n trä ng dï ng thª m dÊ u ngoÆ c ®Ó ®¶m b¶o trË t tù tÝ nh to¸ n. Tuy vË y, macro vÉ n rÊ t cã gi¸ trÞ.
Chó ý: Kh«ng ®î c viÕ t dÊ u c¸ ch gi÷ a tª n macro ví i dÊ u më ngoÆ c bao quanh danh s¸ ch ®è i.
VÝ dô: XÐ t chng tr× nh sau: main() { int x, y, z; x=5; y=10*5; z=x+y; z=x+y+6; z=5*x+y; z=5*(x+y); z=5*((x)+(y)); printf(" Z=%d", z); getch(); return; } Chng tr× nh sö dô ng MACRO sÏ nh sau: #define begin { #define END } #define INTEGER int #define NB 10 #define LIMIT NB*5 #define SUMXY x+y #define SUM1 (x+y) #define SUM2 ((x)+(y)) main() BEGIN INTEGER x, y, z; x=5; y=LIMIT; z=SUMXY; z=5*SUMXY; z=5*SUM1; z=5*SUM2; printf(" \n Z=%d", z); getch(); return; END
|