1. Trang chủ
  2. » Công Nghệ Thông Tin

Giáo trình C++ - Đại Học Bách Khoa (phần 8) potx

33 545 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

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

Ngày đăng: 05/07/2014, 19:20

TỪ KHÓA LIÊN QUAN