Tải bản đầy đủ (.pdf) (35 trang)

Hàm, mảng và con trỏ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (267.24 KB, 35 trang )

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
Chổồng VI : Haỡm, maớng vaỡ con troớ


Trang 61
Caùc phỏửn tổớ cuớa maớng õổồỹc truy cỏỷp bỗnh thổồỡng thọng qua chố sọỳ cuớa phỏửn tổớ õoù. óứ
truy cỏỷp õóỳn phỏửn tổớ thổù i cuớa maớng M ta duỡng cuù phaùp nhổ sau : M[i]
Chổồng trỗnh khọng kióứm tra lióỷu ta coù truy cỏỷp ra ngoaỡi maớng hay khọng.
Vờ duỷ : Nhỏỷp vaỡ hióứn thở caùc giaù trở cuớa maớng tổỡ baỡn phờm :
#include <stdio.h>
#define n 5
void main()
{
int i,mang[n];
for(i=0;i<n;i++)
{
printf(\nx[%d]=,i);
scanf(%d,&mang[i]);
}
printf(\nMang gom cac phan tu :\n);
for(i=0;i<n;i++)
printf(\nx[%d]=%d,i,mang[i]);
}
II.4.
Tỗm kióỳm vaỡ sừp xóỳp :
Tỗm kióỳm:
Lỏửn lổồỹt duyóỷt qua caùc phỏửn tổớ cuớa maớng õóỳn khi tỗm õổồỹc giaù trở mong muọỳn.
Vờ duỷ : tỗm xem trong xỏu kờ tổỷ coù bao nhióu kờ tổỷ a :
int timkiem( char mang[], char a)

{ int i,count=0;
for(i=0;mang[i] != \0;i++)
{ if(mang[i]==a)
count++;
}
return count;
}
Ngoaỡi ra coỡn coù phổồng phaùp tỗm kióỳm kióứu lờnh gaùc:
Vờ duỷ : Tỗm xem trong maớng a gọửm n phỏửn tổớ nguyón coù sọỳ nguyón d khọng.
Ta khai baùo maớng a gọửm n+1 phỏửn tổớ, õỷt a[n]=d.
i=0;
while (a[i] != d)
i++;
if(i==n)
printf(\n Maớng a khọng coù phỏửn tổớ %d ,d);
else printf(\n Phỏửn tổớ %d ồớ vở trờ %d,d,i);
Trong trổồỡng hồỹp xỏỳu nhỏỳt, phổồng phaùp trổồùc so saùnh 2*n lỏửn trong khi phổồng phaùp
sau so saùnh nhióửu nhỏỳt n+1 lỏửn.
Chổồng VI : Haỡm, maớng vaỡ con troớ


Trang 62
Sừp xóỳp :
Thay õọứi vở trờ cuớa caùc phỏửn tổớ trong maớng õóứ chuùng tuỏn theo mọỹt trỏỷt tổỷ naỡo õoù.
Phổồng phaùp sừp xóỳp nọứi boỹt:
Sừp xóỳp theo thổù tổỷ tng dỏửn: ỏửu tión õem phỏửn tổớ thổù nhỏỳt lỏửn lổồỹt so saùnh vồùi caùc
phỏửn tổớ tióỳp theo, nóỳu noù lồùn hồn thỗ õọứi chọự 2 phỏửn tổớ õổồỹc so saùnh. Sau lổồỹt õỏửu, phỏửn tổớ thổù
nhỏỳt giổợ giaù trở nhoớ nhỏỳt. Tióỳp tuỷc voỡng hai, õem phỏửn tổớ thổù 2 so saùnh vồùi caùc phỏửn tổớ sau
noù.....
Vờ duỷ : Sừp xóỳp caùc phỏửn tổớ cuớa maớng tổỡ nhoớ õóỳn lồùn

#include <stdio.h>
#include <conio.h>
#define n 5
void main()
{
int i,j,mang[n],tam;
for(i=0;i<n;i++)
{
printf(\nx[%d]=,i);
scanf(%d,&mang[i]);
}
printf(\nMang chua sap xep:\n);
for(i=0;i<n;i++)
printf( x[%d]=%3d,i,mang[i]);
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if (mang[i]>mang[j])
{
tam=mang[i];
mang[i]=mang[j];
mang[j]=tam;
}
printf(\nMang da sap xep:\n);
for(i=0;i<n;i++)
printf( x[%d]=%3d,i,mang[i]);
getch();
}
II.5.
Maớng nhióửu chióửu :
Maớng 2 chióửu laỡ loaỷi maớng quen thuọỹc nhỏỳt : ma trỏỷn.

Mỏựu : kióứu_maớng tón_maớng[sọỳ_haỡng][sọỳ_cọỹt];
Vờ duỷ : int x[5][7]; // khai baùo naỡy cho ta mọỹt maớng sọỳ nguyón 5 haỡng 7 cọỹt.
Caùc phỏửn tổớ cuợng õổồỹc õaùnh caùc chố sọỳ haỡng vaỡ cọỹt tổỡ 0.

Chổồng VI : Haỡm, maớng vaỡ con troớ


Trang 63
Vióỷc gaùn caùc giaù trở vaỡo caùc phỏửn tổớ cuớa maớng cuợng nhổ maớng mọỹt chióửu:
x[3][4]=6;
Khồới taỷo maớng 2 chióửu :
int x[5][3]= { { 1,2,3 },
{ 2,3,4 },
......
};
Ta coù thóứ taỷo ra caùc maớng 3 chióửu, 4 chióửu,...... :
int x[5][3][7];
int y[5][6][8][3];
óứ truy cỏỷp õóỳn phỏửn tổớ coù chố sọỳ (i,j) cuớa ma trỏỷn M ta duỡng M[i][j].
Vờ duỷ : chổồng trỗnh nhỏn hai ma trỏỷn A
m*n
vaỡ B
n*p
:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
main()

{
int i,j,k,m,n,p;
int a[MAX][MAX],b[MAX][MAX],c[MAX][MAX];
printf("\nNhap vao 3 so m,n,p:");
scanf("%d%d%d",&m,&n,&p);
printf("\n");
randomize();
for (i=0;i<m;i++)
for (j=0;j<n;j++)
a[i][j]=random(100);
for (i=0;i<n;i++)
for (j=0;j<p;j++)
b[i][j]=random(100);
for (i=0;i<m;i++)
for (j=0;j<p;j++)
{ c[i][j]=0;
for (k=0;k<n;k++)
c[i][j]=c[i][j]+a[i][k]*b[k][j];
}
for (i=0;i<m;i++)
{ for (j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
Chổồng VI : Haỡm, maớng vaỡ con troớ


Trang 64
printf("\n\n");
for (i=0;i<n;i++)

{ for (j=0;j<p;j++)
printf("%4d",b[i][j]);
printf("\n");
}
printf("\n\n");
for (i=0;i<m;i++)
{ for (j=0;j<p;j++)
printf("%6d",c[i][j]);
printf("\n");
}
getch();
return 0;
}
Trong chổồng trỗnh trón, ta khọng sổớ duỷng haỡm vỗ õọỳi vồùi maớng nhióửu chióửu, ta khọng
truyóửn nhổ maớng mọỹt chióửu õổồỹc. óứ coù thóứ sổớ duỷng haỡm, ta phaới duỡng con troớ.
III.
Con troớ:
III.1.

Khaùi nióỷm con troớ :
Khi ta khai baùo mọỹt bióỳn trong C, trỗnh bión dởch seợ daỡnh rióng 1 ọ nhồù vồùi õởa chố duy
nhỏỳt õóứ lổu bióỳn õoù.
Vờ duỷ : int b=5;

Con troớ laỡ bióỳn duỡng õóứ chổùa õởa chố cuớa 1 bióỳn khaùc. Nóỳu con troớ p chổùa õởa chố cuớa
bióỳn b thỗ ta noùi : con troớ p õang troớ tồùi bióỳn b.
Coù nhióửu kióứu bióỳn nón coù 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ớ duỡng õóứ troớ tồùi bióỳn kióứu nguyón
// b laỡ bióỳn nguyón
Ta coù thóứ vióỳt khai baùo int* p; . Tuy nhión, khi vióỳt int* p,b; ta seợ dóự nhỏửm lỏựn khi
cho rũng p vaỡ b laỡ 2 bióỳn con troớ. Thổỷc ra, p laỡ bióỳn con troớ, b laỡ bióỳn int thổồỡng.
Khồới taỷo con troớ :
tón_con_troớ=&tón_bióỳn

trong õoù & laỡ toaùn tổớ lỏỳy õởa chố
Vờ duỷ : p=&b; // con troớ p troớ õóỳn bióỳn b
Hoỷc int *p=&b; // vổỡa khai baùo con troớ vổỡa khồới taỷo con troớ
5
b
F0F4
Ta noùi bióỳn b coù nọỹi dung
laỡ 5, coù õởa chố laỡ F0F4

Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×