![]() ![]() |
|
C++习题与解析(模板-03) | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:40:53 文章录入:杜斌 责任编辑:杜斌 | |
|
|
解: 本题程序如下: #include<iostream.h> template <class T> class Sample { T n; public: Sample(T i){n=i;} int operator==(Sample &); }; template <class T> int Sample<T>::operator==(Sample &s) { if(n==s.n) return 1; else return 0; } void main() { Sample<int> s1(2),s2(3); cout<<"s1与s2的数据成员"<<(s1==s2?"相等":"不相等")<<endl; Sample<double>s3(2.5),s4(2.5); cout<<"s3与s4的数据成员"<<(s3==s4?"相等":"不相等")<<endl; } 本程序的运行结果如下: s1与s2的数据成员不相等 s3与S4的数据成员相等
题 6. 对第3章的例3.5进行修改,只设计一个Sample类,其数据和方法均包含在该类中,而且使用类模板的方式实现。 #include<iostream.h> #define Max 100 template <class T> class Sample { T A[Max]; int n; void qsort(int l,int h); // 私有成员,由quicksort()成员调用 public: Sample(){n=0;} void getdata(); // 获取数据 void insertsort(); // 插入排序 void Shellsort(); // 希尔排序 void bubblesort(); // 冒泡排序 void quicksort(); // 快速排序 void selectsort(); // 选择排序 void disp(); }; template <class T> void Sample<T>::getdata() { cout<<"元素个数:"; cin>>n; for(int i=0;i<n;i++) { cout<<"输入第"<<i+1<<"个数据:"; cin>>A[i]; } } template <class T> void Sample<T>::insertsort() // 插入排序 { int i,j; T temp; for(i=1;i<n;i++) { temp=A[i]; j=i-1; while(temp<A[j]) { A[j+1]=A[j]; j--; } A[j+1]=temp; } } template <class T> void Sample<T>::Shellsort() // 希尔排序 { int i,j,gap; T temp; gap=n/2; while(gap>0) { for(i=gap;i<n;i++) { j=i-gap; while(j>=gap) if(A[j]>A[j+gap]) { temp=A[j]; A[j]=A[j+gap]; A[j+gap]=temp; j=j-gap; } else j=0; } gap=gap/2; } } template <class T> void Sample<T>::bubblesort() // 冒泡排序 { int i,j; T temp; for(i=0;i<n;i++) for(j=n-1;j>=i+1;j--) if(A[j]<A[j-1]) { temp=A[j]; A[j]=A[j-1]; A[j-1]=temp; } } template <class T> void Sample<T>::quicksort() // 快速排序 { qsort(0,n-1); } template<class T> void Sample<T>::qsort(int l,int h) { int i=l,j=h; T temp; if(l<h) { temp=A[l]; do{ while(j>i&&A[j]>=temp) j--; if(i<j) { A[i]=A[j]; i++; } while(i<j&&A[i]<=temp) i++; if(i<j) { A[j]=A[i]; j--; } }while(i<j); A[i]=temp; qsort(1,j-1); qsort(j+1,h); } } template <class T> void Sample<T>::selectsort() // 选择排序 { int i,j,k; T temp; for(i=0;i<n;i++) { k=i; for(j=i+1;j<=n-1;j++) if(A[j]<A[k]) k=j; temp=A[i]; A[i]=A[k]; A[k]=temp; } } template <class T> void Sample<T>::disp() { for(int i=0;i<n;i++) cout<<A[i]<<" "; cout<<endl; } void main() { int sel=0; Sample<char> s; // 由类模板产生char型的模板类 s.getdata(); cout<<"原来序列:"; s.disp(); cout<<"0:插入排序 1:希尔排序 2:冒泡排序 3:快速排序\n 4:选择排序 其它退出"<<endl; cout<<"选择排序方法:"; cin>>sel; switch(sel) { case 0: s.insertsort(); cout<<"插入排序结果"; break; case 1: s.Shellsort(); cout<<"希尔排序结果:"; break; case 2: s.bubblesort(); cout<<"冒泡排序结果:"; break; case 3: s.quicksort(); cout<<"快速排序结果:"; break; case 4: s.selectsort(); cout<<"选择排序结果:"; break; } s.disp(); } 程序运行结果如下:
题 7. 设计一个模板类Sample,用于对一个有序数组采用二分法查找元素下标。 解: #include<iostream.h> #define Max 100 template <class T> class Sample { T A[Max]; int n; public: Sample(){} Sample(T a[],int i); int seek(T c); void disp() { for(int i=0;i<n;i++) cout<<A[i]<<" "; cout<<endl; } }; template <class T> Sample<T>::Sample(T a[],int i) { n=i; for(int j=0;j<i;j++) A[j]=a[j]; } template <class T> int Sample<T>::seek(T c) { int low=0,high=n-1,mid; while(low<=high) { mid=(low+high)/2; if(A[mid]==c) return mid; else if(A[mid]<c) low=mid+1; else high=mid-1; } return -1; } void main() { char a[]="acegkmpwxz"; Sample<char>s(a,10); cout<<"元素序列:"; s.disp(); cout<<"’g’的下标:"<<s.seek(’g’)<<endl; } 程序运行结果如下: 元素序列:a c e g k m p w x z 元素’g’的下标: 3 |
|
![]() ![]() |