Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 31 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
31
Dung lượng
485,29 KB
Nội dung
Notes Tin håc cì sð Ch÷ìng 03: H m v trọ C Biản soÔn: PhÔm Vôn Sỹ Bở mổn Xỷ lỵ tẵn hiằu v TruyÃn thổng Khoa K thuêt iằn tỷ I Hồc viằn Cổng nghằ Bữu chẵnh Viạn thổng ver.18a Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin håc cì sð ver.18a / 62 Notes Ph¦n 01: Hm C Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin håc cì sð ver.18a / 62 H m C Notes Kh¡i ni»m h m con, nguy¶n mău, thỹc thi hm Mởt chữỡng trẳnh mĂy tẵnh thữớng ÷đc chia th nh c¡c mỉ-un, ÷đc gåi l h m I I I Méi h m thüc hi»n mët t¡c vử nhĐt nh Ơy l mởt k thuêt lêp trẳnh "Chia tr" (Divide and Conquer) Mởt chữỡng trẳnh l sỹ kát hủp giỳa cĂc hm cĂc cƠu lằnh Viằc "hm hõa" mởt chữỡng trẳnh: I I I Vợi k thuêt "Chia tr", viằc phĂt trin chữỡng trẳnh dng quÊn lỵ v bÊo trẳ hỡn Tông khÊ nông tĂi sỷ dửng mÂ: Viát mởt lƯn, ữủc gồi nhiÃu lƯn TrĂnh sỹ lp lÔi m chữỡng trẳnh Chú ỵ: Mởt hm nản thỹc hiằn mởt tĂc vử riảng l Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin håc cì sð ver.18a / 62 H m C Notes Tờ chực hm chữỡng trẳnh CĐu trúc chung tờng quĂt cừa mởt chữỡng trẳnh C PhƯn 1: C¡c khai b¡o ch¿ Ph¦n 2: C¡c khai bĂo, nh nghắa dỳ liằu mợi PhƯn 3: CĂc khai bĂo bián ton cửc sỷ dửng chữỡng trẳnh PhƯn 4: CĂc khai bĂo nguyản mău cĂc hm PhƯn 5: C¡c mỉ t£ (thüc thi) chi ti¸t c¡c h m PhƯn 6: Hm main Chú ỵ: PhƯn v cõ th ữủc gởp lÔi: vứa khai bĂo vứa nh nghắa Hoc phƯn cõ th t sau phƯn Hoc phƯn v t tữỡng ựng cĂc file riảng (header *.h v thỹc thi *.c), rỗi sỷ dửng ch th tiÃn xỷ lỵ #include thảm vo chữỡng trẳnh chẵnh Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin håc cì sð ver.18a / 62 H m C Notes Nguyản mău hm Cú phĂp khai bĂo nguyản mău hm: Kiu_dỳ_liằu_trÊ_vÃ: I L mởt cĂc kiºu dú li»u cì b£n, ho°c kiºu dú li»u ng÷íi sû dưng ành ngh¾a, ho°c kiºu void (khỉng tr£ v· giĂ tr, khổng kiu) Tản_hm: I L bĐt cự nh danh hủp lằ no lêp trẳnh viản t F Nản ngưn gồn, cõ ỵ nghắa, khổng trũng vợi cĂc hm thữ viằn cừa C Danh_sĂch_kiu_dỳ_liằu_tham_số: I Liằt kả tĐt c£ c¡c kiºu dú li»u cõa c¡c tham sè s³ gûi ¸n h m F F F I C¡c kiºu dú liằu ữủc cĂch bi dĐu phây Mội tham số phÊi ữủc liằt kả kiu dỳ liằu tữỡng ựng riảng r Theo sau cõ th cõ tản bián quan sĂt v ồc m chữỡng trẳnh L void, hoc trống trữớng hủp hm khổng nhên tham số no Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin håc cì sð ver.18a / 62 H m C Notes Nguyản mău hm: Vẵ dử minh hồa // Khai bao nguyen mau ham dung int mySquare ( int y); int myTriangle ( int , int , int ); double myArea () ; float mySqr ( void ); int myMax ( int x , int y , int z); void printMessage ( void ) ; // Khai bao nguyen mau ham sai mySquareRoot ( float x); float myWage ( int hour , int day , float nRate ); int isDiamond ( int , int , int ) char isDigits ( int x , y ); void printMessage ( void , void , void ); Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin hồc cỡ s ver.18a / 62 H m C Notes Lới gồi hm gồi hm: cƯn biát kiu dỳ liằu m hm trÊ vÃ, tản hm, v cung cĐp cho h m danh s¡ch c¡c tham bi¸n m h m mong mn I Vỵi h m khỉng tr£ v· gi¡ trà (kiºu tr£ v· l void), líi gåi h m l T¶n_h m(Danh_s¡ch_tham_sè) I Vợi hm trÊ và giĂ tr Bián_nhên_giĂ_tr_trÊ_và = Tản_hm(Danh_sĂch_tham_số) hoc T¶n_h m(Danh_s¡ch_tham_sè) °t biºu thùc hay líi gåi mët hm khĂc Chú ỵ: I Tản hm danh sĂch tham số phÊi thống nhĐt vợi khai bĂo nguyản mău h m F F F F Danh s¡ch c¡c tham sè khæng câ tø khâa kiºu dú li»u C¡c tham sè cõ th l hơng số, bián, biu thực, hay lới gồi mởt hm khĂc; miạn chúng thọa mÂn kiu dỳ li»u m h m mong muèn C¡c tham sè công ph£i cõ thự tỹ úng vợi khai bĂo nguyản mău hm Trong trữớng hủp danh sĂch tham bián khổng kiu khai bĂo nguyản mău: C s cố gưng tỹ ởng p kiu náu cõ th Trong trữớng hủp khổng th p kiu dỳ liằu Trẳnh biản dch s bĂo lội Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin hồc cì sð ver.18a / 62 H m C Notes Líi gåi h m: V½ dư 10 11 12 13 10 11 12 13 void printMessage () ; void printAnswer ( char ); void printCircleArea ( float ); char myResponse = 'Y '; float myRadius = 2.1; printf (" Goi ham printMessage ( void ) \ n"); printMessage () ; printf (" Goi ham printAnswer ( char x) \ n") ; printAnswer ( myResponse ); printf (" Goi ham printCircleArea ( float ) \ n"); printCircleArea ( myRadius ); void printMessage () ; void printAnswer ( char ); void printCircleArea ( float ); char myResponse = 'Y '; float myRadius = 2.1; printf (" Goi ham printMessage ( void ) \ n"); printMessage () ; printf (" Goi ham printAnswer ( char x) \ n") ; printAnswer ( myResponse +1) ; Biản soÔn: PhÔm Vôn Sü (PTIT) Tin håc cì sð printf (" Goi ham printCircleArea ( float ) \ n"); printCircleArea ( myRadius -0.5) ; ver.18a / 62 H m C Notes Mởt số vẵ dử ựng dửng xƠy dỹng v sỷ dửng hm Viát cĂc hm thỹc hiằn tẵnh diằn tẵch cĂc hẳnh hẳnh hồc cỡ bÊn, trÊ và giĂ tr tẵnh toĂn ữủc Diằn tẵch hẳnh chỳ nhêt chiÃu di a v chiÃu rởng b Diằn tẵch hẳnh vuổng cÔnh a Diằn tẵch hẳnh thang Ăy lợn a, ¡y nhä b, chi·u cao h Di»n t½ch tam gi¡c cÔnh Ăy a, chiÃu cao h 10 11 12 13 20 21 22 float RectArea ( float , float ); float RectArea ( float a , float b) { return a*b; } float a = 1.2 , b = 1.5 , nArea ; nArea = RectArea (a ,b ); printf (" Hinh chu nhat dai %.3 f rong %.3 f dien tich la %.3 f\ n" ,b ,a , nArea ) ; Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin håc cì sð ver.18a / 62 Truy·n tham số cho hm, phÔm vi cừa bián Notes TruyÃn tham sè cho h m Câ hai c¡ch truy·n tham sè cho h m: Truy·n tham sè theo kiºu tham trà (pass-by-value); Truy·n tham sè theo kiºu tham chi¸u (pass-by-reference) Truy·n tham sè cho h m theo kiºu tham trà I Mët b£n gi¡ trà cõa tham sè ÷đc truy·n cho h m ÷đc gåi ⇒ Sü thay êi (n¸u câ) cõa b£n khổng Ênh hững án bián gốc v khổng ữủc giỳ lÔi sau hm ữủc gồi kát thúc F Trong C, tĐt cÊ cĂc tham số ữủc truyÃn theo kiu tham trà Truy·n tham sè cho h m theo kiºu tham chiáu: I a ch tham chiáu cừa bián số ữủc truy·n cho h m ÷đc gåi F F F Måi thay ời (náu cõ) vợi bián tham số hm gồi tữỡng ựng l sỹ thay ời tÔi vũng ổ nhợ tữỡng ựng Sỹ thay ời ny dăn án thay ời bián gốc Sỹ thay ời ny ữủc giỳ lÔi sau hm ữủc gồi  kát thúc Tham sè m£ng ÷đc m°c ành truy·n cho h m theo kiºu tham chi¸u Kiºu dú li»u trä cho ph²p mỉ phọng viằc truyÃn theo kiu tham chiáu Biản soÔn: PhÔm V«n Sü (PTIT) Tin håc cì sð ver.18a 10 / 62 TruyÃn tham số cho hm, phÔm vi cừa bi¸n Notes Truy·n tham sè cho h m: Minh håa truy·n theo tham trà 10 11 12 13 14 15 16 17 20 21 22 23 int myDecrement ( int ); int myDecrement ( int x ) { // Co gang thay doi gia tri tham so x; // In than ham de quan sat printf (" Gia tri tham so ham la %d\ n" ,x) ; return x; } int a = 10; printf (" Gia tri tham so truoc goi ham la %d\n " ,a); printf (" %d giam mot la : %d \n" ,a , myDecrement (a)); printf (" Gia tri tham so sau goi ham la % d\n" ,a); Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin hồc cỡ s ver.18a 11 / 62 TruyÃn tham số cho hm, phÔm vi cõa bi¸n Notes Truy·n tham sè cho h m: Minh håa truy·n theo tham chi¸u 2 6 void myRaised4 ( float *) ; void myRaised4 ( float * x) { *x += 4.0; printf (" Gia tri bien so ham myRaised4 ( float *) : %.3 f\ n" ,*x); } float x = 0.2; printf (" Gia tri truoc goi ham myRaised4 ( float *) : %.3 f\n " ,x); printf (" Goi ham myRaised4 ( float *) \ n"); myRaised4 (& x ); printf (" Gia tri sau goi ham myRaised4 ( float *) : %.3 f\n" ,x); Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin hồc cỡ s ver.18a 12 / 62 TruyÃn tham số cho hm, phÔm vi cõa bi¸n Notes Truy·n tham sè cho h m: Truy·n m£ng cho hm Trong khai bĂo nguyản mău v thỹc thi hm: Kẵch thữợc Ưu tiản [] cừa mÊng cõ th trống; cĂc kẵch thữợc chiÃu khĂc (náu cõ) bưt buởc phÊi cõ I Nản cung cĐp kẵch thữợc m£ng nh÷ mët tham sè cho h m Trong líi gåi h m: câ thº (1) sû dưng t¶n m£ng; ho°c (2) sû döng àa ch¿ cõa m£ng; ho°c (3) sû döng a ch cừa phƯn tỷ Ưu tiản cừa mÊng 2 void printArray ( int a [] , int ); void printArray ( int a [] , int nSize ) { int i; for (i =0; i < nSize ;i ++) printf (" %d " ,a[i ]) ; printf (" \n"); } int a [10] = {0 , 1, 2, , 4, 5, 6, 7, 8, 9}; printArray (a ,10) ; Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin hồc cỡ s ver.18a 13 / 62 Truy·n tham sè cho h m, phÔm vi cừa bián Notes TruyÃn tham số cho hm: Truy·n m£ng cho h m - V½ dư 2 10 11 void print2DArray ( int a [][3] , int nRow , int nCol ); void print2DArray ( int a [][3] , int nRow , int nCol ) { int i , j; for (i =0; i < nRow ;i ++) { for (j =0; j < nCol ;j ++) printf (" %d " , a[i ][ j ]) ; printf (" \n"); } } int a [2][3] = {{0 , 1, 2} , {3 , 4, 5}}; print2DArray (a ,2 ,3) ; Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin hồc cì sð ver.18a 14 / 62 Truy·n tham sè cho hm, phÔm vi cừa bián Notes TruyÃn tham số cho h m: Truy·n m£ng cho h m - V½ dư 2 3 void printArray ( int a [] , int ); int a [10] = {0 , 1, 2, , 4, 5, 6, 7, 8, 9}; printArray (a ,10) ; int a [10] = {0 , 1, 2, , 4, 5, 6, 7, 8, 9}; printArray (&a ,10) ; int a [10] = {0 , 1, 2, , 4, 5, 6, 7, 8, 9}; printArray (& a [0] ,10) ; Biản soÔn: PhÔm V«n Sü (PTIT) Tin håc cì sð ver.18a 15 / 62 TruyÃn tham số cho hm, phÔm vi cừa bián Notes PhÔm vi cừa bián Mởt nh danh l bián chữỡng trẳnh C cõ cĂc c tẵnh: tản (name), kiu dỳ liằu (type), kẵch thữợc ổ nhợ tữỡng ùng (size), v gi¡ trà (value) Mët ành danh nâi chung cỏn cõ cĂc c tẵnh khĂc: lợp lữu trỳ, thới gian lữu trỳ, phÔm vi v tẵnh liản kát I I C cung c§p c¡c tø khâa x¡c ành lợp lữu trỳ (storage class specifiers): auto, v static c tẵnh lợp lữu trỳ cừa mởt nh danh quyát nh thới gian lữu trỳ (storage duration), phÔm vi (scope) v tẵnh liản kát (linkage) cừa nh danh õ register, extern, Theo thới thới gian lữu trỳ, lợp lữu trỳ gỗm nhõm: I Lợp lữu trỳ tỹ ởng (automatic storage duration): Ch¿ l bi¸n; Sû dưng tø khâa auto F F I Bián thuởc lợp lữu trỳ ny ữủc tÔo khèi l»nh t÷ìng ùng m nâ ÷đc ành nghắa ữủc bưt Ưu thỹc thi, tỗn tÔi khối lằnh õ ang hoÔt ởng, v b hừy khối lằnh õ kát thúc CĂc bián ữủc nh nghắa mët khèi l»nh, th¥n mët h m ho°c l c¡c tham số cừa hm mc nh thuởc lợp lữu trỳ ny Vợi chúng, khổng cƯn tứ khõa auto Lợp lữu trỳ tắnh (static storage duration): cõ th l bián ho°c h m; Sû döng tø khâa static ho°c extern F CĂc nh danh thuởc lợp lữu trỳ ny s tỗn tÔi tứ thới im chữỡng trẳnh bưt Ưu cho án chữỡng trẳnh kát thúc Mc dũ tỗn tÔi suốt thới gian chữỡng trẳnh hoÔt ởng, viằc cõ th Biản soÔn: PhÔm Vôn Sỹ (PTIT) F Tin hồc cì sð ver.18a 16 / 62 Truy·n tham sè cho hm, phÔm vi cừa bián Notes PhÔm vi cừa bián Bián cửc bở: l cĂc bián ữủc khai bĂo mët h m, mët khèi l»nh, ho°c danh s¡ch tham sè cõa mët thüc thi h m Bi¸n to n cửc: l cĂc bián ữủc khai bĂo ngoi tĐt cÊ cĂc hm Cõ phÔm vi cho mởt nh danh: phÔm vi mởt file (file scope), phÔm vi mởt hm (function scope), phÔm vi mởt khối lằnh (block scope), v phÔm vi khai bĂo nguyản mău hm (function-prototype scope) I I I I Mởt nh danh ữủc khai bĂo ngoi tĐt cÊ cĂc hm cõ phÔm vi file NhÂn v bián cửc bở ữủc khai bĂo phƯn Ưu cừa mởt hm cõ phÔm vi mởt hm CĂc nh danh ữủc khai b¡o mët khèi l»nh (trong { v }) câ phÔm vi khối lằnh nh danh viát khai bĂo nguyản mău hm (khổng cƯn thiát) cõ phÔm vi khai bĂo nguyản mău Biản soÔn: PhÔm Vôn Sỹ (PTIT) Tin håc cì sð ver.18a 17 / 62 TruyÃn tham số cho hm, phÔm vi cừa bián Notes PhÔm vi cừa bián: Minh hồa lợp lữu trỳ tỹ ëng v t¾nh 2 void printValue01 ( void ) ; void printValue01 ( void ) { int x = 0; printf (" Inside printValue01 ( int ) \ n"); printf (" Start with value = %d\n" ,x); x += 5; printf (" Finish with value = %d\n " ,x); } int i; for (i =0; i