Chỉång VI : Hm, mng v con tr Trang 51 Ch−¬ng VI. HM, MNG V CON TR I. Hm: I.1. Khại niãûm : Khi viãút chỉång trçnh nãúu gàûp cạc bi toạn tỉång âäúi låïn thç viãûc täø chỉïc chỉång trçnh cng nhỉ qun l lưng dỉỵ liãûu trong chỉång trçnh âọ gàûp ráút nhiãưu khọ khàn. Vç váûy trong k thût láûp trçnh ngỉåìi ta thỉåìng täø chỉïc chỉång trçnh låïn thnh nhỉỵng âån vë chỉång trçnh nh hån v mäùi âån vë chỉång trçnh nhỉ váûy cọ nhiãûm vủ riãng nháút âënh. “Chia âãø trë” (divide and conquer) : chia nh váún âãư ra thnh nhiãưu bi toạn nh hån, mäùi bi toạn nàòm trong mäüt hm. Khi sỉí dủng hm, viãûc tçm läùi s dãù dng hån vç ta cọ thãø khoanh vng läùi åí mäüt hm củ thãø no âọ, chỉï khäng phi åí âáu âọ trong chỉång trçnh. Màût khạc, trong chỉång trçnh, cọ khi ta gàûp nhỉỵng âoản chỉång trçnh làûp âi làûp lải nhiãưu láưn. Âãø trạnh sỉû rỉåìm r, ta sỉí dủng nhỉỵng chỉång trçnh con âãø cọ thãø gi nhiãưu láưn m khäng phi viãút lải âoản chỉång trçnh âọ. Nhỉ váûy khi sỉí dủng chỉång trçnh con, chỉång trçnh s cọ âoản m ngàõn hån, hiãûu qu hån, thûn tiãûn trong viãûc gåỵ räúi, hiãûu chènh, ÅÍ chỉång trçnh chênh, ta chè cáưn quan tám âãún kãút qu lm viãûc ca hm m khäng cáưn quan tám âãún viãûc hm lm nhỉ thãú no. Khi xáy dỉûng chỉång trçnh con ta phi chụ âãún mủc âêch sau : + Cho phẹp phán nh bi toạn thnh nhiãưu âån vë chỉång trçnh + Cho phẹp dãù dng viãút chỉång trçnh + Dãù dng trong viãûc qun l cạc biãún nhåï + Dãù dng kiãøm soạt cạc läùi phạt sinh trong chỉång trçnh Chỉång trçnh con cọ thãø l th tủc, hm v macro. Trong C chè cọ hm v macro. Cạc hm thỉ viãûn (hm chøn) âỉåüc chỉïa trong cạc file header *.h. Âãø sỉí dủng mäüt hm thỉ viãûn ta cáưn khai bạo bàòng chè thë tiãưn xỉí lê : #include <*.h> Âäúi våïi nhỉỵng hm do ngỉåìi sỉí dủng tỉû láûp, ta cáưn khai bạo v âënh nghéa trỉåïc khi sỉí dủng. I.2. Hm : Hm l mäüt âoản m âäüc láûp thỉûc hiãûn mäüt cäng viãûc nháút âënh khi âỉåüc gi âãún. Hm cọ thãø cọ hồûc khäng tr vãư mäüt giạ trë åí tãn ca nọ (giạ trë tr vãư). Ta cọ thãø xem hm nhỉ l mäüt häüp âen : nọ cọ thãø nháûn mäüt/nhiãưu giạ trë âáưu vo v cọ thãø cho ra mäüt giạ trë thüc kiãøu no âọ. Nãúu hm khäng nháûn giạ trë âáưu vo hồûc khäng cọ giạ trë âáưu ra thç ta sỉí dủng tỉì khọa void. Cạc biãún hồûc biãøu thỉïc cung cáúp giạ trë vo cho hm gi l âäúi säú. Hm cọ thãø thay âäøi cạc âäúi säú ca nọ. Cạc hm khäng âỉåüc läưng vo nhau (khäng khai bạo 1 hm bãn trong hm khạc) nhỉng mäüt hm cọ thãø gi mäüt hm khạc. Chỉång trçnh cọ thãø cọ nhiãưu hm. Hm main âỉåüc gi âáưu tiãn Vê dủ : tênh diãûn têch hçnh chỉỵ nháût biãút chiãưu di v chiãưu räüng cọ sỉí dủng hm : #include <stdio.h> #include <conio.h> Chổồng VI : Haỡm, maớng vaỡ con troớ Trang 52 int tich(int a,int b); // khai baùo nguyón mỏựu haỡm main() { int x,y,dientich; // khai baùo bióỳn printf(\nNhap chieu dai:);scanf(%d,&x); // haỡm õoỹc tổỡ baỡn phờm printf(\nNhap chieu rong:);scanf(%d,&y); dientich=tich(x,y); // lồỡi goỹi haỡm printf(\nDien tich hinh chu nhat: %d,dientich); // haỡm õổa ra maỡn hỗnh getch(); // õoỹc mọỹt kờ tổỷ õóứ chồỡ return 0; } int tich(int a,int b) // õởnh nghộa haỡm { return (a*b); // giaù trở traớ vóử } chổồng trỗnh trón, haỡm õổồỹc õởnh nghộa sau haỡm main(). Trong vờ duỷ sau haỡm õổồỹc õởnh nghộa trổồùc haỡm main(): #include <stdio.h> #include <conio.h> int tich(int x,int y) // õởnh nghộa haỡm { return (x*y); } main() { int x,y,dientich; // khai baùo bióỳn printf(\nNhap chieu dai:);scanf(%d,&x); // haỡm õoỹc tổỡ baỡn phờm printf(\nNhap chieu rong:);scanf(%d,&y); dientich=tich(x,y); // lồỡi goỹi haỡm printf(\nDien tich hinh chu nhat: %d,dientich); getch(); return 0; } I.3. Khai baùo nguyón mỏựu haỡm : Nóỳu ta õởnh nghộa haỡm sau haỡm main() thỗ trổồùc haỡm main() cỏửn phaới thổỷc hióỷn vióỷc khai baùo nguyón mỏựu haỡm (function prototype). kióứu_ giaù_trở_traớ_vóử tón_haỡm(danh saùch tham sọỳ vaỡ kióứu cuớa chuùng); Nóỳu coù giaù trở traớ vóử thỗ ta sổớ duỷng cỏu lóỷnh return. Nóỳu haỡm khọng coù giaù trở traớ vóử thỗ sổớ duỷng tổỡ khoùa void õóứ chố kióứu cuớa giaù trở traớ vóử (khi õoù haỡm giọỳng nhổ thuớ tuỷc cuớa Pascal). Nóỳu khọng duỡng void thỗ kióứu ngỏửm õởnh seợ laỡ int. Tổỡ khoùa void coỡn õổồỹc duỡng õóứ chố caùc haỡm khọng coù tham sọỳ (do õoù khi goỹi haỡm seợ khọng cỏửn õọỳi sọỳ). Chổồng VI : Haỡm, maớng vaỡ con troớ Trang 53 Tón haỡm õổồỹc õỷt theo caùc quy từc õỷt tón cuớa bióỳn. Trong phỏửn khai baùo nguyón mỏựu haỡm khọng cỏửn phaới õỷt tón cho tham sọỳ. Theo vờ duỷ trón ta coù thóứ vióỳt : int tich(int, int); I.4. Lóỷnh return: Lóỷnh return duỡng õóứ traớ laỷi giaù trở cho haỡm. Lóỷnh return coù thóứ traớ laỷi giaù trở cuớa bióứu thổùc. Trong 1 haỡm coù thóứ coù nhióửu lóỷnh return, tuy nhión chố lóỷnh return õổồỹc bừt gỷp õỏửu tión õổồỹc thổỷc hióỷn. Vờ duỷ : int tuyet_doi(int x) { if (x>=0) return(x); else return(-x); } Nóỳu kióứu traớ vóử laỡ void (khọng coù giaù trở traớ vóử) thỗ duỡng lóỷnh return; hoỷc boớ qua. I.5. Hoaỷt õọỹng cuớa haỡm : Khi gỷp mọỹt lồỡi goỹi haỡm thỗ maùy seợ rồỡi chọự õoù cuớa chổồng trỗnh vaỡ chuyóứn õóỳn haỡm tổồng ổùng õóứ thổỷc hióỷn. Quaù trỗnh õoù dióựn ra theo 4 bổồùc sau: + Cỏỳp phaùt bọỹ nhồù + Gaùn giaù trở cuớa caùc õọỳi sọỳ cho caùc tham sọỳ tổồng ổùng + Thổỷc hióỷn caùc lóỷnh trong thỏn haỡm + Khi gỷp cỏu lóỷnh return hoỷc } ồớ cuọỳi cuớa thỏn haỡm thỗ maùy seợ giaới phoùng vuỡng nhồù vổỡa cỏỳp phaùt vaỡ thoaùt khoới haỡm. I.6. Lồỡi goỹi haỡm : Haỡm chố laỡm vióỷc trón caùc baớn sao maỡ thọi. Nóỳu haỡm coù giaù trở traớ vóử thỗ ta coù thóứ sổớ duỷng haỡm naỡy nhổ mọỹt bióứu thổùc bỗnh thổồỡng vồùi caùc õọỳi sọỳ thờch hồỹp. Vờ duỷ : int lapphuong(int x); main() { int m,x=5; . m=lapphuong(x); } Nóỳu haỡm khọng coù giaù trở traớ vóử hoỷc ta khọng sổớ duỷng giaù trở traớ vóử thỗ ta goỹi haỡm vồùi caùc õọỳi sọỳ thờch hồỹp nhổ sau : Vờ duỷ : haỡm printf() coù giaù trở traớ vóử kióứu int nhổng ta muọỳn boớ qua giaù trở traớ vóử : printf( .); Nóỳu ta õởnh nghộa caùc haỡm trổồùc haỡm main() thỗ haỡm trổồùc khọng õổồỹc goỹi haỡm sau. Nóỳu ta õởnh nghộa caùc haỡm sau haỡm main() thỗ caùc haỡm coù thóứ goỹi nhau õổồỹc. Chổồng VI : Haỡm, maớng vaỡ con troớ Trang 54 I.7. Truyóửn õọỳi sọỳ cho haỡm : Truyóửn õọỳi sọỳ cho haỡm tổùc laỡ cung cỏỳp caùc giaù trở õỏửu vaỡo thổỷc sổỷ cho haỡm phuỡ hồỹp vồùi kióứu vaỡ trỏỷt tổỷ cuớa caùc tham sọỳ õaợ khai baùo. ọỳi sọỳ coù thóứ laỡ bióỳn,hũng,bióứu thổùc. Vióỷc truyóửn õọỳi sọỳ cho haỡm õổồỹc thổỷc hióỷn theo mọỹt kióứu duy nhỏỳt : truyóửn theo giaù trở: haỡm khọng laỡm thay õọứi giaù trở cuớa caùc bióỳn duỡng laỡm õọỳi sọỳ vỗ haỡm chố laỡm vióỷc trón caùc baớn sao cuớa caùc õọỳi sọỳ maỡ thọi. Vờ duỷ : #include <stdio.h> #include <conio.h> void hoanvi(int a,int b); main() { int x=2; int y=3; printf(\nTruoc khi goi ham : x = %d , y = %d ,x,y); hoanvi(x,y); printf(\nSau khi goi ham : x = %d , y = %d ,x,y); getch(); return 0; } void hoanvi(int a,int b) { int tam; printf(\nTruoc khi hoan vi: a = %d , b = %d ,a,b); tam=a; a=b; b=tam; printf(\nSau khi hoan vi: a = %d , b = %d ,a,b); } Kóỳt quaớ : Truoc khi goi ham : x = 2 , y = 3 Truoc khi hoan vi : a = 2 , b = 3 Sau khi hoan vi : a = 3 , b = 2 Sau khi goi ham : x = 2 , y = 3 Nhổ vỏỷy haỡm hoanvi õaợ hoaùn vở 2 sọỳ x vaỡ y, nhổng khi quay trồớ laỷi chổồng trỗnh chờnh thỗ giaù trở cuớa x vaỡ y vỏựn khọng thay õọứi. óứ traùnh õióửu naỡy ta coù thóứ sổớ duỷng caùch truyóửn õởa chố hoỷc sổớ duỷng bióỳn toaỡn cuỷc, nhổng sổớ duỷng bióỳn toaỡn cuỷc gỷp mọỹt sọỳ vỏỳn õóử nhổ bọỹ nhồù, giaù trở cuớa noù coù thóứ bở thay õọứi ồớ moỹi nồi trong chổồng trỗnh. Chổồng trỗnh sổớ duỷng caùch truyóửn õởa chố : #include <stdio.h> #include <conio.h> void hoanvi(int *px,int *py); main() Chổồng VI : Haỡm, maớng vaỡ con troớ Trang 55 { int x=2; int y=3; hoanvi(&x,&y); printf(\nx=%d,y=%d,x,y); getch(); return 0; } void hoanvi(int *px,int *py) { int tam; tam=*px; *px=*py; *py=tam; } I.8. Phaỷm vi bióỳn: Phaỷm vi bióỳn laỡ khaớ nng truy xuỏỳt bióỳn õoù ồớ caùc phỏửn khaùc nhau trong chổồng trỗnh. Caùc bióỳn chố õổồỹc sổớ duỷng kóứ tổỡ vở trờ bióỳn õổồỹc khai baùo trồớ xuọỳng. Bióỳn toaỡn cuỷc : bióỳn õổồỹc khai baùo ồớ ngoaỡi caùc haỡm (kóứ caớ haỡm main), õổồỹc sổớ duỷng ồớ moỹi nồi trong chổồng trỗnh. Trỗnh bión dởch seợ tổỷ õọỹng gaùn cho bióỳn naỡy giaù trở 0 nóỳu ta khọng khồới taỷo giaù trở cho noù. Thổỷc ra õọỳi vồùi chổồng trỗnh traới trón nhióửu tỏỷp tin, õóứ sổớ duỷng caùc bióỳn toaỡn cuỷc trong caùc modul khaùc ta phaới sổớ duỷng tổỡ khoùa extern. Khi õoù trỗnh bión dởch khọng cỏỳp phaùt ọ nhồù naỡo cho bióỳn õoù, lóỷnh naỡy chố nhũm muỷc õờch baùo rũng bióỳn õoù õổồỹc khai baùo õỏu õoù trong chổồng trỗnh (trong modul naỡo õoù cuớa chổồng trỗnh). Bióỳn õởa phổồng : bióỳn õổồỹc khai baùo bón trong haỡm vaỡ chố sổớ duỷng bón trong haỡm trong thồỡi gian haỡm õoù hoaỷt õọỹng (haỡm õổồỹc goỹi). Nóỳu bióỳn õởa phổồng truỡng tón vồùi bióỳn toaỡn cuỷc thỗ trong phaỷm vi haỡm õoù, bióỳn toaỡn cuỷc khọng coù taùc duỷng. Caùc bióỳn toaỡn cuỷc coù thóứ õổồỹc thay õọứi trong bỏỳt kỗ haỡm naỡo, õỏy cuợng chờnh laỡ nhổồỹc õióứm cuớa chuùng: ta khoù kióứm soaùt hồn, nhỏỳt laỡ trong chổồng trỗnh lồùn. Vỗ vỏỷy cỏửn haỷn chóỳ sổớ duỷng bióỳn toaỡn cuỷc khi noù khọng cỏửn thióỳt cho hỏửu hóỳt caùc haỡm. Ta thổồỡng duỡng bióỳn toaỡn cuỷc õóứ giaới quyóỳt vióỷc phaới truyóửn caùc bióỳn õoù cho nhióửu haỡm khaùc nhau. Vờ duỷ : int x; main() { int y; } int z; ham1() { . } Chỉång VI : Hm, mng v con tr Trang 56 ham2() { . } biãún z cọ tạc dủng âäúi våïi ham1 v ham2, biãún x cọ tạc dng âäúi våïi c 3 hm, biãún y chè cọ tạc dủng âäúi våïi hm main(). Cạc biãún củc bäü trong khäúi lãûnh: Ta cọ thãø khai bạo cạc biãún åí ngay âáưu khäúi lãûnh, cạc biãún ny l biãún củc bäü. Khi mạy bàõt âáưu lm viãûc våïi 1 khäúi lãûnh thç cạc biãún v cạc mng khai bạo bãn trong khäúi lãûnh âọ måïi âỉåüc hçnh thnh v âỉåüc cáúp phạt bäü nhåï. Cạc biãún ny chè täưn tải trong thåìi gian mạy lm viãûc våïi khäúi lãûnh v chụng s âỉåüc gii phọng khi kãút thục khäúi lãûnh. Vç váûy : • Giạ trë ca biãún hồûc mng khai bạo bãn trong khäúi lãûnh khäng thãø âỉa ra sỉí dủng bãn ngoi khäúi lãûnh âọ. • ÅÍ ngoi khäúi lãûnh khäng thãø can thiãûp cạc biãún v mng khai bạo trong khäúi lãûnh. • ÅÍ trong khäúi lãûnh cọ thãø sỉí dủng biãún khai bạo ngoi khäúi lãûnh nãúu biãún âọ khäng trng tãn våïi cạc biãún khai bạo trong khäúi lãûnh. I.9. Cáúp phạt bäü nhåï : Biãún ton củc âỉåüc cáúp phạt bäü nhåï ténh nãn gi l biãún ténh v cáúp phạt ténh. Biãún âëa phỉång cọ cạc loải : • Cáúp phạt âäüng : khi kãút thục hm biãún âỉåüc gii phọng, khäng lỉu kãút qu cho láưn sau. • Cáúp phạt ténh : khi kãút thục hm khäng gii phọng biãún, lỉu kãút qu cho láưn sau ( dng tỉì khọa static trỉåïc dng khai bạo) . Cạc biãún âëa phỉång âỉåüc ngáưm âënh l cáúp phạt âäüng. Nãúu thêch, ta cọ thãø thãm vo tỉì khọa auto vo âáưu dng khai bạo : auto int x; Cạc biãún auto âỉåüc cáúp phạt åí stack. Vê dủ : sỉû khạc nhau giỉỵa biãún cáúp phạt âäüng v biãún cáúp phạt ténh. #include <stdio.h> #include <conio.h> void ham(void); main() { int dem; for(dem=0;dem<=3;dem++) { printf(“\nLan goi thu %d”,dem); ham(); } getch(); return 0; } void ham(void) { static int x; // cọ thãø thay bàòng static int x=0; int y=0; printf(“ x = %d , y = %d “,x++,y++); } Chổồng VI : Haỡm, maớng vaỡ con troớ Trang 57 Kóỳt quaớ : Lan goi thu 0 : x = 0 , y = 0 Lan goi thu 1 : x = 1 , y = 0 Lan goi thu 2 : x = 2 , y = 0 Lan goi thu 3 : x = 3 , y = 0 Cỏu lóỷnh static int x; chố õổồỹc thổỷc hióỷn khi bión dởch, khi ham() õổồỹc goỹi lỏửn õỏửu tión noù cuợng khọng õổồỹc thổỷc hióỷn. Cỏu lóỷnh int y=0 luọn õổồỹc thổỷc hióỷn mọựi khi goỹi haỡm. Vaỡ theo vờ duỷ trón ta thỏỳy caùc bióỳn õởa phổồng tộnh õổồỹc khồới taỷo giaù trở õỏửu bũng 0 khi duỡng lỏửn õỏửu (nóỳu ta khọng khồới taỷo). Nóỳu chổồng trỗnh õổồỹc vióỳt trón nhióửu file vaỡ bióỳn a õổồỹc khai baùo ồớ ngoaỡi caùc haỡm nhổ sau: static int a; thỗ bióỳn a chố õổồỹc bióỳt õóỳn trong modul hióỷn taỷi, khọng õổồỹc bióỳt õóỳn trong caùc modul khaùc. Bióỳn õởa phổồng thanh ghi : register int x; Duỡng õóứ yóu cỏửu trỗnh bión dởch nóỳu coù thóứ thỗ õỷt bióỳn õoù vaỡo thanh ghi thay vỗ õỷt vaỡo mọỹt ọ nhồù thọng thổồỡng. Khi õoù ta coù thóứ truy xuỏỳt õóỳn bióỳn naỡy rỏỳt nhanh choùng. Ta thổồỡng sổớ duỷng caùch khai baùo naỡy vồùi caùc bióỳn õóỳm cuớa voỡng lỷp. Nóỳu trỗnh bión dởch khọng thóứ cỏỳp phaùt ồớ register thỗ bióỳn õoù laỡ auto. Tổỡ khoùa register khọng õổồỹc duỡng vồùi caùc bióỳn tộnh hay bióỳn ngoaỡi. Ta khọng thóứ õởnh nghộa mọỹt con troớ tồùi bióỳn thanh ghi. I.10. óỷ qui : óỷ qui laỡ mọỹt haỡm goỹi laỷi chờnh noù. Vờ duỷ : n! = 1.2.3 .(n-1).n hay > = = 0 n nóỳu 0 nnóỳu nn n )!.1( 1 ! #include <stdio.h> #include <conio.h> long giaithua(int n); void main() { int n; printf(\nNhap n:);scanf(%d,&n); printf(%d!=%ld,n,giaithua(n)); getch(); } long giaithua(int n) { if (n==0) return 1; else return(giaithua(n-1)*n); } Chổồng VI : Haỡm, maớng vaỡ con troớ Trang 58 Vờ duỷ : Tờnh ổồùc sọỳ chung lồùn nhỏỳt cuớa 2 sọỳ : #include <stdio.h> #include <conio.h> int uscln(int x,int y) { if (y==0) return x; else return uscln(y,x%y); } main() { int x,y; do { printf("\nNhap 2 so nguyen duong :"); scanf("%d%d",&x,&y); } while ((x<=0)||(y<=0)); printf("\nx=%d\ny=%d",x,y); printf("\nUSCLN=%d",uscln(x,y)); getch(); return 0; } Tuy nhión, ta cỏửn haỷn chóỳ sổớ duỷng õóỷ qui õóỳn mổùc tọỳi õa do sổớ duỷng nhióửu bọỹ nhồù dóự dỏựn õóỳn traỡn ngn xóỳp. Mỷt khaùc, thồỡi gian thổỷc hióỷn chổồng trỗnh duỡng õóỷ quy cuợng lồùn hồn. Nóỳu coù thóứ ta nón sổớ duỷng caùc voỡng lỷp õóứ thay thóỳ. Tuy nhión coù nhổợng baỡi toaùn chố coù thóứ giaới quyóỳt bũng õóỷ qui. Vờ duỷ : ta õởnh nghộa laỷi haỡm giaithua(): long giaithua(int n) { long i=1,k=1; while (i<=n) k=k*i++; return k; } Baỡi tỏỷp : tỗm USCLN khọng cỏửn duỡng õóỷ qui I.11. Macro: Macro laỡ mọỹt tỏỷp hồỹp lóỷnh vaỡ bióứu thổùc õổồỹc õaỷi dióỷn bũng mọỹt tón goỹi laỡ tón_macro. Bọỹ tióửn xổớ lờ khi gỷp caùc tón_macro seợ thay thóỳ noù bũng tỏỷp lóỷnh tổồng ổùng. Nóỳu gỷp tón_macro trong caùc xỏu kờ tổỷ thỗ bọỹ tióửn xổớ lờ seợ khọng thay thóỳ. Mỏựu : #define tón_macro daợy_vn_baớn Vờ duỷ : #define cube(y) ((y)*(y)*(y)) Khọng õổồỹc vióỳt #define cube (y) ((y)*(y)*(y)) Chỉång VI : Hm, mng v con tr Trang 59 z=cube(x); s âỉåüc thay thãú bàòng z=((x)*(x)*(x)); Ta phi viãút mäùi toạn hảng trong ngồûc âån, nãúu khäng khi thay thãú s sai: Vê dủ : #define cube(y) (y*y*y) z=cube(x+y); s âỉåüc thay thãú bàòng : z=(x+y*x+y*x+y); (kãút qu khäng mong mún) Ngay c khi ta dng #define cube(y) ((y)*(y)*(y)) Kãút qu cng sai khi : x=cube(++y) -> x=((++y)*(++y)*(++y))=(y+3) 3 x=cube(y++) -> x=y 3 , y=y+3 Vê dủ : #define tong(x,y) ((x)+(y)) z=tong(x,y); So våïi viãûc sỉí dủng hm, chỉång trçnh sỉí dủng macro s cọ âoản m di hån, chảy nhanh hån do khäng máút th tủc gi hm. Tuy nhiãn macro khäng cọ âãû quy, khäng cọ tênh modul v macro cọ nhiãưu hiãûu ỉïng xáúu. #define Do(var,begin,end) for(var=begin;var<=end;var++) Do(i,1,10) -> for(i=1;i<=10;i++) : âụng Do(*ptr,1,10) -> for(*ptr=1;*ptr<=10;*ptr++) : sai vç *ptr++ : ++ trỉåïc, * sau : khäng giäúng mong mún ca ta Macro läưng nhau: #define ONE 1 #define TWO (ONE + ONE) #define THREE (ONE + TWO) result = TWO * THREE; Ta s cọ: result = (1 + 1) * (1 + (1 + 1)); I.12. Mäüt säú hm v macro thäng dủng trong stdlib.h v time.h: Macro random(n) cho mäüt säú ngun ngáùu nhiãn trong khong tỉì 0 âãún (n-1) Hm rand() cho säú ngun ngáùu nhiãn trong khong tỉì 0 âãún 32767 Macro randomize() khåíi âäüng bäü tảo säú ngáùu nhiãn cáưn âỉåüc gi âãún khi mún sỉí dủng random() v rand() Vê dủ : #include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h> void main() { int i; printf(“\nChon mot so tu 0 den 99: “); scanf(“%d”,&i); randomize(); Chỉång VI : Hm, mng v con tr Trang 60 if(i==random(100)) printf(“\nBan da trung doc dac!!!”); getch(); } II. Mng: Mäüt mng dỉỵ liãûu gäưm mäüt säú hỉỵu hản cạc pháưn tỉí cng kiãøu. Säú lỉåüng cạc pháưn tỉí ca mng âỉåüc xạc âënh khi khai bạo. Mäùi pháưn tỉí ca mng âỉåüc truy cáûp trỉûc tiãúp qua tãn mng v chè säú vë trê âàût giỉỵa càûp ngồûc vng []. Cạc pháưn tỉí ca mng âỉåüc âạnh chè säú vë trê tỉì 0 tråí âi. Khi chè säú vỉåüt ra ngoi kêch thỉåïc ca mng, C váùn khäng bạo läùi nhỉng s truy cáûp âãún vng nhåï bãn ngoi v cọ thãø lm hng chỉång trçnh. II.1. Khai bạo mng : Máùu : kiãøu_dỉỵ_liãûu tãn_mng[kêch_thỉåïc_ca_mng]; Vê dủ : int mang[10]; char ten[20]; float day[100]; Cạc pháưn tỉí âỉåüc phán biãût nhåì chè säú : tỉì 0 âãún kêch_thỉåïc_ca_mng - 1. Vê dủ : #define MAX 10 int mang[MAX]; tỉång âỉång våïi int mang[10]; Vê dủ sai : const int MAX=10; int mang[MAX]; II.2. Khai bạo xáu kê tỉû : Trong C, mäüt mng kê tỉû âỉåüc gi l mäüt xáu kê tỉû Vê dủ : 3 vê dủ sau tỉång âỉång nhau : char text[5]={‘a’,’b’,’c’,’d’,’\0’}; char text[5]=”abcd”; char text[]=”abcd”; Xáu kê tỉû trong C âỉåüc kãút thục båíi kê tỉû NULL (\0). II.3. Khåíi tảo giạ trë mng : Ta cọ thãø khåíi tảo mng ngay sau khi khai bạo : Vê dủ : int x[3]={5,6,7}; Tỉïc l : x[0]=5, x[1]=6, x[2]=7. Nãúu ta khäng khåíi tảo ton bäü mng thç pháưn cn lải ca mng s tỉû âäüng âỉåüc âàût vãư 0 (âäúi våïi mng ngun v thỉûc) v vãư NULL (âäúi våïi mng kê tỉû) Vê dủ : int a[10]={1,2,3}; Khi âọ : a[0]=1, a[1]=2, a[2]=3, tỉì a[3] âãún a[9] nháûn giạ trë 0 int d[]={2,5,9,7}; // d[0]=2, d[1]=5, d[2]=9, d[3]=7 [...]... *nghiem2=(-b-sqrt(delta))/(2*a); return 2; } } } Trang 67 Chỉång VI : Hm, mng v con tr const int *p; : int* const p; : const int* const p; con tr âãún 1 biãún ngun hàòng : khäng thãø thay âäøi giạ trë ca biãún âọ con tr hàòng âãún 1 biãún ngun : khäng thãø gạn con tr âãún biãún khạc : con tr hàòng âãún 1 biãún ngun hàòng III.3 Con tr v cạc kiãøu biãún : ÅÍ trãn ta â b qua váún âãư cạc biãún cọ kiãøu khạc... Khai bạo con tr : kiãøu_dỉỵ_liãûu *tãn _con_ tr Vê dủ : int *p,b; // p l con tr dng âãø tr tåïi biãún kiãøu ngun // b l biãún ngun Ta cọ thãø viãút khai bạo int* p; Tuy nhiãn, khi viãút int* p,b; ta s dãù nháưm láùn khi cho ràòng p v b l 2 biãún con tr Thỉûc ra, p l biãún con tr, b l biãún int thỉåìng • Khåíi tảo con tr : tãn _con_ tr=&tãn_biãún trong âọ & l toạn tỉí láúy âëa chè Vê dủ : p=&b; // con tr... cạc khong tràõng v in ra mn hçnh 33 Nháûp vo 1 chùi, sau âọ thay thãú cạc khong tràõng bàòng 1 khong tràõng v in ra mn hçnh 34 Âo ngỉåüc thỉï tỉû cạc tỉì trong chùi Vê dủ : con chọ con càõn con mo con thnh con mo con càõn con chọ con Vê dủ : “ngäü ại në” thnh “në ại ngäü” 35 Nháûp chùi, âäøi kê tỉû âáưu mäùi tỉì thnh chỉỵ hoa, cạc tỉì cn lải ca tỉì thnh chỉỵ thỉåìng 36 Dng hm âãø tênh : Z = A + B... } Mng con tr: char *x[]= { "Hop", "Tac", "Xa" }; x l mng con tr tr tåïi cạc xáu kê tỉû x[0] chỉïa âëa chè ca vng nhåï åí âọ chỉïa xáu “Hop” x[1] chỉïa âëa chè ca vng nhåï åí âọ chỉïa xáu “Tac” x[2] chỉïa âëa chè ca vng nhåï åí âọ chỉïa xáu “Xa” x l hàòng con tr chỉïa âëa chè ca x[0] Ta thỉåìng dng mng con tr khi xỉí l cạc xáu kê tỉû III.8 Con tr kiãøu void: Khai bạo : void *tãn _con_ tr; Âáy l con tr... tri cua con tro pointer : %p”,pointer); printf(“\nGia tri duoc tro toi boi con tro pointer : %d”,*pointer); printf(“\nDia chi cua con tro pointer : %p”,&pointer); getch(); } %p : dng âãø in ra giạ trë ca con tr (pointer value) Cạc vê dủ trãn r rng ta cọ thãø sỉí dủng trỉûc tiãúp biãún m khäng cáưn âãún con tr Tuy nhiãn cạc vê dủ sau s cho tháúy låüi êch ca con tr Trang 65 Chỉång VI : Hm, mng v con tr... heap III.10 Con tr tr tåïi hm: Khi chỉång trçnh âỉåüc thỉûc hiãûn, cạc lãûnh trong hm âỉåüc nảp vo bäü nhåï tỉì mäüt âëa chè xạc âënh Con tr tr tåïi hm chỉïa âëa chè bàõt âáưu ny ca hm Trang 81 Chỉång VI : Hm, mng v con tr Khai bạo : kiãøu_dỉỵ_liãûu ( *con_ tr)(danh sạch tham säú); Vê dủ: int (*p1)(int a); // con tr tr âãún hm nháûn 1 âäúi säú int v tr vãư kiãøu int void (*p2)(char z); // con tr tr âãún... tr vãư con tr kiãøu int Khåíi tảo: Con tr tr tåïi hm cáưn phi khåíi tảo âãø chè âãún 1 hm no âọ, hm v con tr phi cọ kiãøu tr vãư v danh sạch tham säú giäúng nhau Vê dủ : int binhphuong(int a); int (*p)(int a); p=binhphuong; // khåíi tảo con tr p Sỉí dủng : Sau khi khai bạo v khåíi tảo nhỉ trãn ta cọ thãø gi hm binhphuong() bàòng cạch dng con tr p : t = p(x); Tãn hm khäng cọ dáúu () l hàòng con tr tr... con tr : Khi ta khai bạo mäüt biãún trong C, trçnh biãn dëch s dnh riãng 1 ä nhåï våïi âëa chè duy nháút âãø lỉu biãún âọ Vê dủ : int b=5; F0F4 5 Ta nọi biãún b cọ näüi dung l 5, cọ âëa chè l F0F4 b Con tr l biãún dng âãø chỉïa âëa chè ca 1 biãún khạc Nãúu con tr p chỉïa âëa chè ca biãún b thç ta nọi : con tr p âang tr tåïi biãún b Cọ nhiãưu kiãøu biãún nãn cọ nhiãưu kiãøu con tr tỉång ỉïng III.2 Con. .. biãún l âëa chè byte tháúp nháút ca biãún âọ III.4 Con tr v mng: Tãn mng khäng cọ càûp ngồûc vng l hàòng con tr Âáy l con tr khäng thãø thay âäøi giạ trë âỉåüc, nọ ln tr âãún pháưn tỉí âáưu tiãn ca mng Khi ta khai bạo 1 mng, cạc pháưn tỉí ca mng âỉåüc sàõp xãúp tưn tỉû nhau, pháưn tỉí âáưu tiãn cọ âëa chè tháúp nháút Säú hc con tr: phẹp tàng / gim con tr lm cho giạ trë ca nọ tàng / gim mäüt lỉåüng... tàng / gim con tr p thç p s tr âãún pháưn tỉí sau / trỉåïc so våïi pháưn tỉí ban âáưu Nãúu ptr1 v ptr2 l 2 con tr tr âãún 2 pháưn tỉí ca cng 1 mng thç hiãûu ptr1 - ptr2 cho ta biãút khong cạch giỉỵa 2 pháưn tỉí âọ trong mng Phẹp trỉì giỉỵa 2 con tr chè cọ nghéa khi 2 con tr cng tr âãún 2 pháưn tỉí trong mäüt mng Ngoi viãûc truy cáûp pháưn tỉí mng bàòng chè säú, viãûc truy cáûp giạn tiãúp qua con tr thç . nhióửu kióứu con troớ tổồng ổùng. III.2. Con troớ vaỡ bióỳn õồn : Khai baùo con troớ : kióứu_dổợ_lióỷu *tón _con_ troớ Vờ duỷ : int *p,b; // p laỡ con troớ. VI : Hm, mng v con tr Trang 68 const int *p; : con tr âãún 1 biãún ngun hàòng : khäng thãø thay âäøi giạ trë ca biãún âọ. int* const p; : con tr hàòng âãún