mình đang hoàn thiện dần nhưng bị khúc mắt một chỗ chưa thể đi tiếp bạn nào có ý gì thi post lên nha!!!!
mình muốn xây dựng một hàm có dang sau:(chỗ mình đánh dấu chấm hỏi).hàm này bạn có thể truyền bao nhiêu bộ lọc tùy thích,bộ lọc này gồm lọc ra những số chẳn,lẻ,dương....Mình có ý tưởng sử dụng ham không xác định số tham số truyền vào, nhưng ngặc nỗi,mình chỉ thực hiện nó với những đối tượng, chứ chưa bao giờ thử với con trỏ hàm và cũng chả biết phải làm sao!!!!!!
C++ Code:
#include<iostream.h> #include<stdarg.h> #include<math.h> int *a; int na; void Permute(int &x,int &y); void Permute(int &x,int &y) { int t; t=x; x=y; y=t; } //************************************************ // CAC BO LOC int Positive(int a)//so duong { return (a>0); } int Negative(int a)//so am { return (a<0); } int Even(int a)//so chan { return (a%2==0); } int Odd(int a)//so le { return (a%2!=0); } int Prime(int a)//so ngyen to { int b; b=a/2; for(int i=1;i<=b;i++) if(a%i==0) return 0; else 1; } //************************************************ //************************************************ // CAC KIEU SAP XEP int Increase(int x,int y) { return x>=y; } int Decrease(int x,int y) { return x<=y; } //*********************************************** class Sort { public: void virtual sort(int *b,int &nb,int(*Compare)(int,int))=0; }; class SelectSort:public Sort { public: void sort(int *b,int &nb,int(*Compare)(int,int)) { int t; for(int i=1;i<nb;i++) { t=i; for(int j=i+1;j<=nb;j++) if(Compare(b[i],b[j])) t=j; if(t!=i) Permute(b[i],b[t]); } } }; class InterchangeSort:public Sort { public: void sort(int *b,int &nb,int(*Compare)(int ,int )) { for(int i=1;i<nb;i++) for(int j=i+1;j<=nb;j++) if(Compare(b[i],b[j])) Permute(b[i],b[j]); } }; class ToolSort { public: Sort *t; public: ToolSort() { t=NULL; } ToolSort(Sort *a) { t=a; } void ChangeTool(Sort *b) { t=b; } //Su dung ham khong xac dinh so luong tham so truyen vao void ThucThi(int *b,int &nb,int(*Compare)(int,int),int(*Filter)(int ),...)??????? { //BE TAC //BE TAC //BE TAC } void Import() { a=new int[na+1]; for(int i=1;i<=na;i++) { } } void Export(int *b,int nb) { for(int i=1;i<=nb;i++) } }; void main() { int *b; int nb=0; b=new int[na]; ToolSort *t; t=new ToolSort; t->Import(); t=new ToolSort(new InterchangeSort); t->ThucThi(b,nb,Decrease,Positive,Prime); ///???????????????? t->Export(b,nb); /* t->ChangeTool(new SelectSort); t->ThucThi(,Increase); t->Export();*/ }
Một hàm bắt buộc các thông số phải cụ thể. Tại sao không nghĩ cách khác mà cứ cố làm một cách khó khăn này? (Posted by Dreaminess)
bạn à, vậy là bạn chưa hiểu ý mình rồi, nếu giả sử ta có một dãy các số :gồm nhiều kiểu:chẳn lẻ âm,dương, người sử dụng thư viện có thể sẻ truyền vào rất nhiều bộ lọc để lọc ra những số họ muốn, chẳng hạn như xắp sếp các số chẳn dương,chia hết cho 4, va chia hết cho 5 nói chung là mình không thể xác định số lượng bộ lộc là bao nhiêu thì làm theo cách của bạn là không thể!thanhk
đại khái protype như vậy là được rồi
bây giờ cậu cần làm điều gì, cách hiện thực ThucThi()? trước tiên cần đả thông ý tưởng đã
ví dụ
dãy 1 2 1 6 7 8 3 4
sắp xếp số chẵn tăng dần
thì kết quả cậu mong muốn ra sao?
ok!!bây giờ giả sử mình 1 2 1 6 7 8 3 4
thi t->ThucThi(b,nb,Prime,Increase).Mang b la mang chứa các phần tử mảng a đã được lọc, như vậy mảng a sau khi qua bộ lọc số chẳng thi mảng b se nhận các phần tử 2 6 8 4, tiếp đó nó sẻ gọi tiếp con trỏ hàm xắp sếp tăng để sắp tiếp các phần tử đó, rồi in gi mảng b(chắc bạn đã hiểu ý mình)
cho thêm ví dụ nữa nha: cho các phần tử:
1 5 2 8 4 10 14 27 33 48 90 48 ......
sắp sếp giam các phần tử chia hết cho 3 và chia hết cho 5 và la sỗ chẳn và là số dương (có thể thêm yêu cầu).Thì đầu tiên ta phải chuẩn bị tất cả các bộ lọc trước như bộ lọc số chia hết cho 3, bộ lọc sôd chia hết cho 5,....
thì lúc đó t->ThucThi(b,nb,bolocchiahetcho3,bolocchiahetcho5,bo locsochan,bolocsoduoong,decrease).thì các phần tử mảng a sẻ đi qua từng bộ lọc.Khi đi qua từng bộ lọc những số thỏa yêu cầu sẻ được chuyển qua sang mảng trung gian rồi chép lại vào mảng b,rồi cứ thực hiện vòng lặp đến bộ lọc cuối cùng ,kết quả cuối sẻ được lưu trên mảng b,rồi sắp xếp giảm trên b.Vấn để ở đây là cách viết hàm không xác định số tham số, với đối tượng bình thướng thì mình biết cách viết:
giả sử ví dụ ta có một lớp hình là lớp cơ sở cho lớp chữ nhật,vuông,tròn...
thì ta có thể viet hàm không xác định số lượng tham số để tính tổng diện tích các hình truyền vào sao(phương thức tính diện tích là phương thức ảo chắc cái này ai cũng biết)sau:
C++ Code:
float Sum(Hinh *frst,...) { float S=0; va_list paralist;//khai báo biến kiểu va_list cái này trong thư viện stdarg.h va_start(paralist,first); Hinh* ptrHinh=first; While(ptrHinh!=NULL) { S+=ptrHinh->Area(); ptrHinh=va_arg(paralist,Hinh*); } va_end(paralist); return S; } void main() { ChuNhat cn1(1,4),cn2(3,7); Vuong v1(3),v2(5); tron t1(8); float S=Sum(&cn1,&cn2,&v1,&v2,NULL); }
các bạn có thể dựa trên hàm mình mới viết để áp dụng với con trỏ hàm, cái này mình bí>>>>giúp giùm nha!!!
------------
Yêu cầu bạn chấp hành nội quy.
ht961711
Đã được chỉnh sửa lần cuối bởi Forlorn_hope : 27-10-2007 lúc 06:25 PM.