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

05.设计一个类Sample,它有两个私有成员A[]和n(A中元素个数),将对A[]中数据进行各种排序的函数放入到一个友元类process中。 
解: 
process类不包含任何数据成员,包含的公共成员函数如下: 
getdata(Sample &s); 用于获取对象s的数据 
insertsort(Sample &s); 用于进行插入排序 
shellsort(Sample &s); 用于进行希尔排序 
bubblesort(Sample &s); 用于进行冒泡排序 
quicksort(Sample &s); 用于进行快速排序 
selectsort(Sample &s); 用于进行选择排序 
disp(Sample &s); 用于输出数据 

本题程序如下: 
#include<iostream.h> 
#define Max 100 
class Sample 

int A[Max]; 
int n; 
friend class process; 
public: 
Sample(){n=0;} 
}; 
class process 

void qsort(Sample &s,int l,int h); 
// 私有成员,由quicksort()成员调用 
public: 
void getdata(Sample &s); 
void insertsort(Sample &s); 
void shellsort(Sample &s); 
void bubblesort(Sample &s); 
void quicksort(Sample &s); 
void selectsort(Sample &s); 
void disp(Sample &s); 
}; 
void process::getdata(Sample &s) 

int i; 
cout<<"元素个数:"; 
cin>>s.n; 
for(i=0;i<s;i++) 

cout<<"输入第"<<i+1<<"个数据:"; 
cin>>s.A[i]; 


void process::insertsort(Sample &s) // 插入排序 

int i,j,temp; 
for(i=1;i<s.n;i++) 

temp=s.A[i]; 
j=i-1; 
while(temp<s.A[j]) 

s.A[j+1]=s.A[j]; 
j--; 

s.A[j+1]=temp; 


void process::shellsort(Sample &s) // 希尔排序 

int i,j,gap,temp; 
gap=s.n/2; 
while(gap>0) 

for(i=gap;i<s;i++) 

j=i-gap; 
while(j>=gap) 
if(s.A[j]>s.A[j+gap]) 

temp=s.A[j]; 
s.A[j]=s.A[j+gap]; 
s.A[j+gap]=temp; 
j=j-gap; 

else j=0; 

gap=gap/2; 


void process::bubblesort(Sample &s) // 冒泡排序 

int i,j,temp; 
for(i=0;i<s.n;i++) 
for(j=s.n-1;j>=i+1;j--) 
if(s.A[j]<s.A[j-1]) 

temp=s.A[j]; 
s.a[j]=s.A[j-1]; 
s.A[j-1]=temp; 


void process::quicksort(Sample &s) // 快速排序 

qsort(s,0,s.n-1); 

void process::qsort(Sample &s,int l,int h) 

int i=l,j=h,temp; 
if(l<h) 
{ temp=s.A[l]; 
do 

while(j>i&&s.A[j]>=temp) 
j--; 
if(i<j) 

s.A[i]=s.A[j]; 
i++; 

while(i<j&&s.A[i]<=temp) 
i++; 
if(i<j) 

s.A[j]=s.A[i]; 
j--; 

}while(i<j); 
s.A[i]=temp; 
qsort(s,l,j-1); 
qsort(s,j+1,h); 



void process::selectsort(Sample &s) // 选择排序 

int i,j,k,temp; 
for(i=0;i<s.n;i++) 

k=i; 
for(j=i+1;j<=s.n-1;j++) 
if(s.A[j]<s.A[k]) 
k=j; 
temp=s.A[i]; 
s.A[i]=s.A[k]; 
s.A[k]=temp; 


void process::disp(Sample &s) 

for(int i=0;i<s.n;i++) 
cout<<s.A[i]<<" "; 
cout<<endl; 

void main() 

int sel; 
Sample s; 
process p; 
p.getdata(s); 
cout<<"原来序列:"; 
p.disp(s); 
cout<<"0:插入排序 1:希尔排序 2:冒泡排序 3:快速排序 4:选择排序 其它退出"<<endl; 
cout<<"选择排序方法:"; 
cin>>sel; 
switch(sel) 

case 0: 
p.insertsort(s); 
cout<<"插入排序结果:"; 
break; 
case 1: 
p.shellsort(s); 
cout<<"希尔排序结果:"; 
break; 
case 2: 
p.bubblesort(s); 
cout<<"冒泡排序结果:"; 
break; 
case 3: 
p.quicksort(s); 
cout<<"快速排序结果:"; 
break; 
case 4: 
p.selectsort(s); 
cout<<"选择排序结果:"; 
break; 

p.disp(s); 


本程序的执行结果如下: 
元素个数:8 
输入第1个数据: 1 
输入第2个数据: 6 
输入第3个数据: 5 
输入第4个数据: 3 
输入第5个数据: 4 
输入第6个数据: 8 
输入第7个数据: 2 
输入第8个数据: 7 
原来序列: 1 6 5 3 4 8 2 7 
0:插入排序 1:希尔排序 2:冒泡排序 3:快速排序 4:选择排序 其它退出 
选择排序方法: 1 
希尔排序结果: 1 2 3 4 5 6 7 8 
打印本文 打印本文  关闭窗口 关闭窗口