打印本文 打印本文  关闭窗口 关闭窗口  
C++习题与解析(模板-03)
作者:佚名  文章来源:不详  点击数  更新时间:2008/4/18 14:40:53  文章录入:杜斌  责任编辑:杜斌

题 5. 一个Sample类模板的私有数据成员为T n,在该类模板中设计一个operator==重载运算符函数 ,用于比较各对象的n数据是否相等。 
解: 
本题程序如下: 
#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 
打印本文 打印本文  关闭窗口 关闭窗口