Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
1,45 MB
Nội dung
-233- Ch Ch Ch Ch ơ ơ ơ ơ ng ng ng ng 6 6 6 6 khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh (Template) (Template) (Template) (Template) Mụcđíchchơngnày: 1. Hiểuđợclợiíchcủaviệcsửdụngkhuônhìnhhàmvàkhuônhìnhlớpđể viếtchơngtrình. 2.Biếtcáchtạovàsửdụngmộtkhuônhìnhhàmvàkhuônhìnhlớp. 3.Kháiniệmcácthamsốkiểuvàcácthamsốbiểuthứctrongkhuônhình hàm,khuônhìnhlớp. 4. Địnhnghĩachồngkhuônhìnhhàm. 5.Cụthểhoámộtkhuônhìnhhàm,mộthàmthànhphầncủakhuônhìnhlớp. 6.Thuậttoánsảnsinhmộtthểhiệnhàm(hàmthểhiện)củamộtkhuônhình hàm 7. Cácvấnđềkháccủalậptrìnhhớngđốitợngliênquanđếnkhuônhình lớp. Khu Khu Khu Khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Khu Khu Khu Khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m l l l l à à à à g g g g ì ì ì ì ? ? ? ? Tađãbiếtđịnhnghĩachồnghàmchophépdùngmộttênduynhấtchonhiều hàmthựchiệncáccôngviệckhácnhau.Kháiniệmkhuônhìnhhàmcũngchophép sửdụngcùngmộttênduynhấtđểthựchiệncáccôngviệckhácnhau,tuynhiênso vớiđịnhnghĩachồnghàm,nócóphầnmạnhhơnvàchặtchẽhơn;mạnhhơnvìchỉ cầnviếtđịnhnghĩakhuônhìnhhàmmộtlần,rồisauđóchơngtrìnhbiêndịchlàm chonóthíchứngvớicáckiểudữliệukhácnhau;chặtchẽhơnbởivìdựatheo khuônhìnhhàm,tấtcảcáchàmthểhiệnđợcsinhrabởitrìnhbiêndịchsẽtơng ứngvớicùngmộtđịnhnghĩavànhvậysẽcócùngmộtgiảithuật. T T T T ạ ạ ạ ạ o o o o m m m m ộ ộ ộ ộ t t t t khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Giảthiếtrằngchúngtacầnviếtmộthàm m in đaragiátrịnhỏnhấttronghai giátrịcócùngkiểu.Tacóthểviếtmộtđịnhnghĩanhthếđốivớikiểu int nhsau: intmin(int a, int b) { if(a < b) return a; Khuônh ì nh -234- elsereturn b; } Giảsử,talạiphảiviếtđịnhnghĩahàm min() chokiểu double double double double , float float float float , char,char char,char char,char char,char * float min(float a, float b){ if(a<b) return a; else b;} Nếutiếptụcnhvậy,sẽcókhuynhhớngphảiviếtrấtnhiềuđịnhnghĩahàm hoàntoàntơngtựnhau;chỉcókiểudữliệucácthamsốlàthayđổi.Cácchơng trìnhbiêndịchC++hiệncóchophépgiảiquyếtđơngiảnvấnđềtrênbằngcách địnhnghĩamộtkhuônhìnhhàmduynhấttheocáchnhsau: #include <iostream.h> //tạomộtkhuônhìnhhàm template <class T> T min(T a, T b) { if(a < b) return a; elsereturn b; } Sosánhvớiđịnhnghĩahàmthôngthờng,tathấychỉcódòngđầutiênbịthay đổi: template <class T>T min (Ta,Tb) trong đó template<class T> xácđịnhrằngđólàmộtkhuônhìnhvớimộtthamsốkiểuT; Phầncònlại T min(T a,Tb) nóirằng, m in() làmộthàmvớihaithamsốhìnhthứckiểu T vàcógiátrịtrảvề cũnglàkiểu T . Khuônh ì nh -235- S S S S ử ử ử ử d d d d ụ ụ ụ ụ ng ng ng ng khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Khu Khu Khu Khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m cho cho cho cho ki ki ki ki ể ể ể ể u u u u d d d d ữ ữ ữ ữ li li li li ệ ệ ệ ệ u u u u c c c c ơ ơ ơ ơ s s s s ở ở ở ở Đểsửdụngkhuônhìnhhàm min() vừatạora,chỉcầnsửdụnghàm min() trongnhữngđiềukiệnphùhợp(ởđâycónghĩalàhaithamsốcủahàmcócùng kiểudữliệu).Nhvậy,nếutrongmộtchơngtrìnhcóhaithamsốnguyên n và p , vớilờigọi min(n,p) chơngtrìnhbiêndịchsẽtựđộngsảnsinhrahàm min() (ta gọilàmộthàmthểhiện)tơngứngvớihaithamsốkiểunguyên int int int int .Nếuchúngta gọi min() vớihaithamsốkiểu float float float float ,chơngtrìnhbiêndịchcũngsẽtựđộngsản sinhmộthàmthểhiện min kháctơngứngvớicácthamsốkiểu float float float float vàcứthế. Sauđâylàmộtvídụhoànchỉnh: V V V V í í í í d d d d ụ ụ ụ ụ 6.1 6.1 6.1 6.1 /*template1.cpp*/ /*template1.cpp*/ /*template1.cpp*/ /*template1.cpp*/ #include <iostream.h> #include<conio.h> //tạomộtkhuônhìnhhàm template <class T> T min(T a, T b) { if (a< b) return a; elsereturn b; } //vídụsửdụngkhuônh ì nhhàmmin voidmain() { clrscr(); int n= 4, p= 12; float x= 2.5, y= 3.25; cout<<"min (n, p) = "<<min(n, p)<<"\n"; //intmin(int,int) cout<<"min (x, y) = "<<min(x, y)<<"\n"; //floatmin(float,float) getch(); } min(n,p)=4 min(x,y)=2.5 Khuônh ì nh -236- Khu Khu Khu Khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m min min min min cho cho cho cho ki ki ki ki ể ể ể ể u u u u char char char char * * * * /*template2.cpp*/ /*template2.cpp*/ /*template2.cpp*/ /*template2.cpp*/ #include <iostream.h> #include<conio.h> template <class T> T min (Ta, T b) { if(a < b) return a; elsereturn b; } voidmain() { clrscr(); char * adr1 = "DHBK"; char * adr2 = "CDSD"; cout << "min(adr1,adr2)="<<min(adr1,adr2); getch(); } min(adr1,adr2)=DHBK Kếtquảkháthúvịvìtahyvọnghàm m in() trảvềxâu"CDSD".Thựctế,với biểuthức min(adr1, adr2) ,chơngtrìnhbiêndịchđãsinhrahàmthểhiệnsau đây: char * min(char * a, char * b) { if(a < b) return a; elsereturn b; } Việcsosánh a<b thựchiệntrêncácgiátrịbiếntrỏ(ởđâytrongcáckhuôn hìnhmáyPCtaluônluôncó a<b ).Ngợclạiviệchiểnthịthựchiệnbởitoántử <<sẽđaraxâukýtựtrỏbởicontrỏkýtự. K K K K hu hu hu hu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m min min min min v v v v ớ ớ ớ ớ i i i i ki ki ki ki ể ể ể ể u u u u d d d d ữ ữ ữ ữ li li li li ệ ệ ệ ệ u u u u l l l l ớ ớ ớ ớ p p p p Đểápdụngkhuônhìnhhàm min() ởtrênvớikiểulớp,cầnphảiđịnhnghĩalớp saochocóthểápdụngphéptoánsosánh < vớicácđốitợngcủalớpnày,nghĩa làtaphảiđịnhnghĩamộthàmtoántử operator < cholớp.Sauđâylàmộtvídụ minhhoạ: Khuônh ì nh -237- V V V V í í í í d d d d ụ ụ ụ ụ 6.2 6.2 6.2 6.2 /*template3.cpp*/ /*template3.cpp*/ /*template3.cpp*/ /*template3.cpp*/ #include <iostream.h> #include<conio.h> //khuônhìnhhàmmin template <class T> T min( T a, T b) { if(a < b) return a; elsereturn b; } //lớpvect classvect { int x,y; public: vect(int abs=0,intord = 0) { x= abs, y= ord;} void display() { cout<<x<<" "<<y<<"\n"; } friendint operator < (vect , vect); }; int operator < (vect a, vect b) { returna.x*a.x + a.y*a.y < b.x*b.x + b.y*b.y; } voidmain() { clrscr(); vect u(3,2),v(4,1); cout<<"min (u, v) = "; min(u,v).display(); getch(); } min(u,v)=32 Nếutaápdụngkhuônhìnhhàm min() đốivớimộtlớpmàchađịnhnghĩa toántử<,chơngtrìnhbiêndịchsẽđaramộtthôngbáolỗitơngtựnhviệc địnhnghĩamộthàm min() chokiểulớpđó. Khuônh ì nh -238- C C C C á á á á c c c c tham tham tham tham s s s s ố ố ố ố ki ki ki ki ể ể ể ể u u u u c c c c ủ ủ ủ ủ a a a a khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Phầnnàytrìnhbàycáchđavàocácthamsốkiểutrongmộtkhuônhìnhhàm, đểchơngtrìnhbiêndịchsảnsinhmộthàmthểhiện. C C C C á á á á c c c c tham tham tham tham s s s s ố ố ố ố ki ki ki ki ể ể ể ể u u u u trong trong trong trong đị đị đị đị nh nh nh nh ngh ngh ngh ngh ĩ ĩ ĩ ĩ a a a a khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Mộtcáchtổngquát,khuônhìnhhàmcóthểcómộthaynhiềuthamsốkiểu, vớimỗithamsốnàycótừkhoáclass class class class điliềntrớc,chẳnghạnnh: template <class T, class U> intfct (Ta,T *b, Uc) { } Cácthamsốnàycóthểđểởbấtkỳđâutrongđịnhnghĩacủakhuônhìnhhàm, nghĩalà: Trongdòngtiêuđề(nhđãchỉratrongvídụtrên). Trongcáckhaibáocácbiếncụcbộ. (i) Trongcácchỉthịthựchiện. Chẳnghạn: template <class T, class U> intfct (Ta, T *b, U c) { T x; //biếncụcbộxkiểuT U *adr; //biếncụcbộadrkiểuU* adr = new T [10]; //cấpphá t mộtmảng10thànhphầnkiểuT n=sizeof(T); } Taxemchơngtrìnhsau: V V V V í í í í d d d d ụ ụ ụ ụ 6.3 6.3 6.3 6.3 /*templat4.cpp*/ /*templat4.cpp*/ /*templat4.cpp*/ /*templat4.cpp*/ #include <iostream.h> #include<conio.h> template <class T, class U> T fct(T x, U y, T z) { return x+y+ z; } voidmain() { clrscr(); int n=1, p= 2, q= 3; Khuônh ì nh -239- float x =2.5, y= 5.0; cout<<fct( n,x, p)<<"\n"; //(int)5 cout <<fct(x, n, y)<<"\n"; //(float)8.5 cout <<fct(n, p, q)<<"\n"; //(int)6 //cout<<fct(n,p,x)<<"\n";//lỗ i getch(); } Trongmọitrờnghợp,mỗithamsốkiểuphảixuấthiệnítnhấtmộtlầntrong khaibáodanhsáchcácthamsốhìnhthứccủakhuônhìnhhàm.Điềuđóhoàntoàn logicbờivìnhờcácthamsốnày,chơngtrìnhdịchmớicóthểsảnsinhrahàmthể hiệncầnthiết.Điềugìsẽxảyranếutrongdanhsáchcácthamsốcủakhuônhình hàmkhôngcóđủcácthamsốkiểu?Hiểnnhiênkhiđóchơngtrìnhdịchkhôngthể xácđịnhcácthamsốkiểudữliệuthựcứngvớicácthamsốkiểuhìnhthứctrong template< > . Khuônhìnhhàmsauđâythựchiệntraođổinộidungcủahaibiến. V V V V í í í í d d d d ụ ụ ụ ụ 6.4 6.4 6.4 6.4 /*templat5.cpp*/ /*templat5.cpp*/ /*templat5.cpp*/ /*templat5.cpp*/ #include <iostream.h> #include<conio.h> //địnhnghĩakhuônh ì nhhàmđổichỗnộidunghaibiếnvớikiểubấtkỳ template <class X> voidswap(X&a, X &b) { X temp; temp=a; a=b; b=temp; } voidmain() { clrscr(); inti=10,j=20; floatx=10.1,y=23.1; cout<<"I J bandau:"<<i<<" "<<j<<endl; cout<<"X Y bandau:"<<x<<" "<<y<<endl; swap(i,j); //đổ i chỗhaisốnguyên Khuônh ì nh -240- swap(x,y); //đổ i chỗhaisốnguyên cout<<"I J saukhidoicho:"<<i<<" "<<j<<endl; cout<<"X Y saukhidoicho:"<<x<<" "<<y<<endl; getch(); } IJbandau:1020 XYbandau:10.123.1 IJsaukhidoicho:2010 XYsaukhidoicho:23.110.1 Gi Gi Gi Gi ả ả ả ả i i i i thu thu thu thu ậ ậ ậ ậ t t t t s s s s ả ả ả ả n n n n sinh sinh sinh sinh m m m m ộ ộ ộ ộ t t t t h h h h à à à à m m m m th th th th ể ể ể ể hi hi hi hi ệ ệ ệ ệ n n n n Trởlạikhuônhìnhhàm m in() : template <class T> T min(T a, T b) { if(a < b) return a; elsereturn b; } Vớicáckhaibáo: int n; char c; câuhỏiđặtralà:chơngtrìnhdịchsẽlàmgìkhigặplờigọikiểunhlà min(n,c) ?Câutrảlờidựatrênhainguyêntắcsauđây: (ii) C++quyđịnhphảicómộtsựtơngứngchínhxácgiữakiểucủathamsố hìnhthứcvàkiểuthamsốthựcsựđợctruyềnchohàm,tắclàtachỉcóthểsử dụngkhuônhìnhhàm min() trongcáclờigọivớihaithamsốcócùngkiểu. Lờigọi min(n, c) khôngđợcchấpnhậnvàsẽgâyralỗibiêndịch. (iii) C++thậmchícònkhôngchophépcácchuyểnkiểuthôngthờngnhlà: T thànhconst T hay T[] thành T* ,nhữngtrờnghợphoàntoànđợcphéptrong địnhnghĩachồnghàm. Tathamkhảođoạnchơngtrìnhsauđây: int n; char c; unsigned int q; Khuônh ì nh -241- constint r= 10; intt[10]; int*adi; min(n, c) //lỗi min(n, q) //lỗi min(n, r) //lỗi min(t,adi) //lỗi Kh Kh Kh Kh ở ở ở ở i i i i t t t t ạ ạ ạ ạ o o o o c c c c á á á á c c c c bi bi bi bi ế ế ế ế n n n n c c c c ó ó ó ó ki ki ki ki ể ể ể ể u u u u d d d d ữ ữ ữ ữ li li li li ệ ệ ệ ệ u u u u chu chu chu chu ẩ ẩ ẩ ẩ n n n n Trongkhuônhìnhhàm,thamsốkiểucóthểtơngứngkhithìmộtkiểudữliệu chuẩn,khithìmộtkiểudữliệulớp.Sẽlàmgìkhitacầnphảikhaibáobêntrong khuônhìnhhàmmộtđốitợngvàtruyềnmộthaynhiềuthamsốchohàmthiếtlập củalớp.Xemvídụsauđây: template <class T> fct(T a) { T x(3); //x l àmộtđối t ợngcụcbộkiểuTmàchúngtaxâydựngbằngcách //truyềngiátr ị 3chohàmthiếtlập } Khisửdụnghàm fct() chomộtkiểudữliệulớp,mọiviệcđềutốtđẹp.Ngợc lại,nếuchúngtacốgắngápdụngchomộtkiểudữliệuchuẩn,chẳnghạnnhint int int int , khiđóchơngtrìnhdịchsảnsinhrahàmsauđây: fct(int a) { intx(3); } Đểchochỉthị intx(3) ; khônggâyralỗi,C++đãngầmhiểucâulệnhđónhlàphépkhởitạobiếnx vớigiátrị3,nghĩalà: int x=3; Mộtcáchtơngtự: doublex(3.5); //thayvìdoublex=3.5; charc('e'); //thayvìcharc='e'; Khuônh ì nh -242- C C C C á á á á c c c c h h h h ạ ạ ạ ạ n n n n ch ch ch ch ế ế ế ế c c c c ủ ủ ủ ủ a a a a khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Vềnguyêntắc,khiđịnhnghĩamộtkhuônhìnhhàm,mộtthamsốkiểucóthể tơngứngvớibấtkỳkiểudữliệunào,chodùđólàmộtkiểuchuẩnhaymộtkiểu lớpdongờidùngđịnhnghĩa.Dovậykhôngthểhạnchếviệcthểhiệnđốivớimột sốkiểudữliệucụthểnàođó.Chẳnghạn,nếumộtkhuônhìnhhàmcódòngđầu tiên: template <class T> voidfct(T) chúngtacóthểgọi fct() vớimộtthamsốvớikiểubấtkỳ:int int int int , float float float float , int int int int * , int int int int **, t * ( t làmộtkiểudữliệunàođấy) Tuynhiên,chínhđịnhnghĩabêntrongkhuônhìnhhàmlạichứamộtsốyếutố cóthểlàmchoviệcsảnsinhhàmthểhiệnkhôngđúngnhmongmuốn.Tagọiđó làcáchạnchếcủacáckhuônhìnhhàm. Đầutiên,chúngtacóthểchorằngmộtthamsốkiểucóthểtơngứngvớimột contrỏ.Dođó,vớidòngtiêuđề: template <class T> voidfct(T *) tachỉcóthểgọi fct() vớimộtcontrỏđếnmộtkiểunàođó:int int int int *, int int int int **, t *,t** . Trongcáctrờnghợpkhác,sẽgâyracáclỗibiêndịch.Ngoàira,trongđịnh nghĩacủamộtkhuônhìnhhàm,cóthểcócácchỉthịkhôngthíchhợpđốivớimột sốkiểudữliệunhấtđịnh.Chẳnghạn,khuônhìnhhàm: template <class T> T min(T a, T b) { if(a < b) return a; elsereturn b; } khôngthểdùngđợcnếu T tơngứngvớimộtkiểulớptrongđóphéptoán< khôngđợcđịnhnghĩachồng.Mộtcáchtơngtựvớimộtkhuônhìnhhàmkiểu: template <class T> voidfct(T) { T x(2,5); /*đốitợngcụcbộđợckhở i tạobằngmộthàmthiếtlậpvới haithamsố*/ } khôngthểápdụngchocáckiểudữliệulớpkhôngcóhàmthiếtlậpvớihai thamsố. Tómlại,mặcdùkhôngtồntạimộtcơchếhìnhthứcđểhạnchếkhảnăngáp dụngcủacáckhuônhìnhhàm,nhngbêntrongmỗimộtkhuônhìnhhàmđềucó [...]... table::table(int init = 0) { int i; for (i = 0; i < n; i++) tab[i] = init; limit = n - 1; cout . in() trảvềxâu"CDSD".Thựctế,với biểuthức min(adr1, adr2) ,chơngtrìnhbiêndịchđãsinhrahàmthểhiệnsau đây: char * min(char * a, char * b) { if(a < b) return a; elsereturn b; } Việcsosánh a<b thựchiệntrêncácgiátrịbiếntrỏ(ởđâytrongcáckhuôn hìnhmáyPCtaluônluôncó a<b ).Ngợclạiviệchiểnthịthựchiệnbởitoántử <<sẽđaraxâukýtựtrỏbởicontrỏkýtự. K K K K hu hu hu hu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m min min min min v v v v ớ ớ ớ ớ i i i i ki ki ki ki ể ể ể ể u u u u d d d d ữ ữ ữ ữ li li li li ệ ệ ệ ệ u u u u l l l l ớ ớ ớ ớ p p p p Đểápdụngkhuônhìnhhàm min() ởtrênvớikiểulớp,cầnphảiđịnhnghĩalớp saochocóthểápdụngphéptoánsosánh < vớicácđốitợngcủalớpnày,nghĩa làtaphảiđịnhnghĩamộthàmtoántử operator < cholớp.Sauđâylàmộtvídụ minhhoạ: Khuônh ì nh -2 3 7- V V V V í í í í d d d d ụ ụ ụ ụ 6.2 6.2 6.2 6.2 /*template3.cpp*/ /*template3.cpp*/ /*template3.cpp*/ /*template3.cpp*/ #include <iostream.h> #include<conio.h> //khuônhìnhhàmmin template <class T> T min( T a, T b) { if(a < b) return a; elsereturn b; } //lớpvect classvect { int x,y; public: vect(int abs=0,intord = 0) { x= abs, y= ord;} void display() { cout<<x<<" "<<y<<"
"; } friendint operator < (vect , vect); }; int operator < (vect a, vect b) { returna.x*a.x + a.y*a.y < b.x*b.x + b.y*b.y; } voidmain() { clrscr(); vect u(3,2),v(4,1); cout<<"min (u, v) = "; min(u,v).display(); getch(); } min(u,v)=32 Nếutaápdụngkhuônhìnhhàm min() đốivớimộtlớpmàchađịnhnghĩa toántử<,chơngtrìnhbiêndịchsẽđaramộtthôngbáolỗitơngtựnhviệc địnhnghĩamộthàm min() chokiểulớpđó. Khuônh ì nh -2 3 8- C C C C á á á á c c c c tham tham tham tham s s s s ố ố ố ố ki ki ki ki ể ể ể ể u u u u c c c c ủ ủ ủ ủ a a a a khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Phầnnàytrìnhbàycáchđavàocácthamsốkiểutrongmộtkhuônhìnhhàm, đểchơngtrìnhbiêndịchsảnsinhmộthàmthểhiện. C C C C á á á á c c c c tham tham tham tham s s s s ố ố ố ố ki ki ki ki ể ể ể ể u u u u trong trong trong trong đị đị đị đị nh nh nh nh ngh ngh ngh ngh ĩ ĩ ĩ ĩ a a a a khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Mộtcáchtổngquát,khuônhìnhhàmcóthểcómộthaynhiềuthamsốkiểu, vớimỗithamsốnàycótừkhoáclass class class class điliềntrớc,chẳnghạnnh: template <class T, class U> intfct (Ta,T *b, Uc) {. T x(2,5); /*đốitợngcụcbộđợckhở i tạobằngmộthàmthiếtlậpvới haithamsố*/ } khôngthểápdụngchocáckiểudữliệulớpkhôngcóhàmthiếtlậpvớihai thamsố. Tómlại,mặcdùkhôngtồntạimộtcơchếhìnhthứcđểhạnchếkhảnăngáp dụngcủacáckhuônhìnhhàm,nhngbêntrongmỗimộtkhuônhìnhhàmđềucó Khuônh ì nh -2 4 3- chứanhữngnhântốđểngờitacóthểbiếtđợckhuônhìnhhàmđócóthểđợcáp dụngđếnmứcnào. C C C C á á á á c c c c tham tham tham tham s s s s ố ố ố ố bi bi bi bi ể ể ể ể u u u u th th th th ứ ứ ứ ứ c c c c c c c c ủ ủ ủ ủ a a a a m m m m ộ ộ ộ ộ t t t t khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Trongđịnhnghĩacủamộtkhuônhìnhhàmcóthểkhaibáocácthamsốhình thứcvớikiểuxácđịnh.Tagọichúnglàcácthamsốbiểuthức.Chơngtrình templat6.cpp sauđâyđịnhnghĩamộtkhuônhìnhhàmchophépđếmsốlợng cácphầntửnul(0đốivớicácgiátrịsốhoặcNULLnếulàcontrỏ)trongmộtbảng vớikiểubấtkỳvàkíchthớcnàođó: V V V V í í í í d d d d ụ ụ ụ ụ 6.5 6.5 6.5 6.5 /*templat6.cpp*/ /*templat6.cpp*/ /*templat6.cpp*/ /*templat6.cpp*/ #include <iostream.h> #include<conio.h> template <class T> int compte(T * tab,int n) { int i,nz = 0; for(i=0;i<n;i++) if (!tab[i]) nz++; returnnz; } voidmain() { clrscr(); intt[5] = {5, 2,0,2, 0}; charc[6] ={ 0, 12, 0,0, 0}; cout<<"compte(t) = "<<compte(t, 5)<<"
"; cout<<"compte(c) = "<<compte(c,6)<<"
"; getch(); } compte(t)=2 compte(c)=4 Tacóthểnóirằngkhuônhìnhhàm compte địnhnghĩamộthọcáchàm compte trongđókiểucủathamsốđầutiênlàtuỳý(đợcxácđịnhbởilờigọi),còn kiểucủathamsốthứhaiđãxácđịnh(kiểu int int int int ). Khuônh ì nh -2 4 4- Đị Đị Đị Đị nh nh nh nh ngh ngh ngh ngh ĩ ĩ ĩ ĩ a a a a ch ch ch ch ồ ồ ồ ồ ng ng ng ng c c c c á á á á c c c c khu khu khu khu ô ô ô ô n n n n h h h h ì ì ì ì nh nh nh nh h h h h à à à à m m m m Giốngnhviệcđịnhnghĩachồngcáchàmthôngthờng,C++chophépđịnh nghĩachồngcáckhuônhìnhhàm,tứclàcóthểđịnhnghĩamộthaynhiềukhuôn hìnhhàmcócùngtênnhngvớicácthamsốkhácnhau.Điềuđósẽtạoranhiềuhọ cáchàm(mỗikhuônhìnhhàmtơngứngvớimộthọcáchàm).Vídụcóbahọhàm m. in : (iv) Họthứnhấtbaogồmcáchàmtìmgiátrịnhỏnhấttronghaigiátrị, (v)Họthứhaitìmsốnhỏnhấttrongbasố, (vi) Họthứbatìmsốnhỏnhấttrongmộtmảng. V V V V í í í í d d d d ụ ụ ụ ụ 6.6 6.6 6.6 6.6 /*templat7.cpp*/ /*templat7.cpp*/ /*templat7.cpp*/ /*templat7.cpp*/ #include <iostream.h> #include<conio.h> //khuônhình1 template <class T> T min(T a, T b) { if(a < b) return a; elsereturn b; } //khuônhình2 template <class T> T min(T a, T b, T c) { returnmin(min(a,b),c); } //khuônhình3 template <class T> T min (T *t,int n) { T res = t[0]; for(int i= 1; i< n; i++) if (res > t[i]) res = t[i]; returnres; } voidmain() { clrscr(); int n= 12, p= 15, q= 2; Khuônh ì nh -2 4 5- float x= 3.5, y= 4.25, z= 0.25; intt[6] = {2, 3, 4 ,-1 ,21}; charc[4] = {'w','q','a','Q'}; cout<< min(n,p) = <<min(n,p)<<"
"; // khu ônh ì nh 1 int min(int, int) cout<< min(n,p,q) = <<min(n,p,q)<<"
"; //khuônhình2intmin(int,int,int) cout<< min(x,y) = <<min(x,y)<<"
"; // khu ônh ì nh 1 float min(float, float) cout<< min(x,y,z) = <<min(x,y,z)<<"
"; // khu ônh ì nh 2 floatm