01.分析以下程序的执行结果#include<iostream.h>class Sample{int n;public:Sample(int i){n=i;}friend int add(Sample &s1,Sample &s2);};int add(Sample &s1,Sample &s2){return s1.n+s2.n;}void main(){Sample s1(10),s2(20);cout<<add(s1,s2)<<endl;}解:本题说明了友元函数的使用方法。
add()是一个友元函数,它返回两个引用对象的n值之和。
所以输出为:30注意:友元函数不是类的成元函数----------------------------------------------------02.分析以下程序的执行结果#include<iostream.h>class B;class A{int i;public:int set(B&);int get(){return i;}A(int x){i=x;}};class B{int i;public:B(int x){i=x;}friend A;int A::set(B &b) // 由于使用了类B的定义,故本函数的定义应放在类B定义之后{return i=b.i;}void main(){A a(1);B b(2);cout<<a.get()<<",";a.set(b);cout<<a.get()<<endl;}解:本题说明友元类的使用方法。
这里将类A设置为类B的友元类,因此,类A的所有成员函数均为类B 的友元函数。
通过调用a.set(b)将b对象的i值赋给a对象的i值。
所以输出为:1,2-------------------------------------------------03.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,比较两个学生成绩的高低,并求出最高分和最低分的学生。
解:#include<iostream.h>#include<string.h>class student{char name[10];int deg;public:student(char na[],int d){strcpy(name,na);deg=d;}char *getname(){ return name;}friend int compare(student &s1,student &s2){if(s1.deg>s2.deg)return 1;else if(s1.deg==s2.deg)return 0;else return -1;};void main(){student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)};int i,min=0,max=0;for(i=1;i<4;i++){if(compare(st[max],st[i])==-1)max=i;else if(compare(st[i],st[min])==1)min=i;}cout<<"输出结果:"<<endl;cout<<" 最高分:"<<st[max].getname()<<endl;cout<<" 最低分:"<<st[min].getname()<<endl;}本程序的执行结果如下:输出结果:最高分者:李明最低分者:张伟-------------------------------------------------------------04.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,输出成绩对应的等级:大于等于90:优;80~90:良;70~79:中;60!69:及格;小于60:不及格。
解:#include<iostream.h>#include<string.h>#include<iomanip.h>class student{char name[10];int deg;char level[7];public:student(char na[],int d){strcpy(name,na);deg=d;}char *getname(){ return name;}friend void trans(student &s)if(s.deg>=90)strcpy(s.level,"优");else if(s.deg>=80)strcpy(s.level,"良");else if(s.deg>=70)strcpy(s.level,"中");else if(s.deg>=60)strcpy(s.level,"及格");elsestrcpy(s.level,"不及格");}void disp(){cout<<setw(10)<<name<<setw(6)<<deg<<setw(8)<<level<<endl;}};void main(){student st[]={student("王华",78),student("李明",92),student("张伟",62),student("孙强",88)};cout<<"输出结果:"<<endl;cout<<setw(10)<<"姓名"<<setw(6)<<"成绩"<<setw(8)<<"等级"<<endl;02.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 100class 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<<"插入排序结果:";03.题1.分析以下程序的执行结果#include<iostream.h>class Sample{int n;public:Sample(){}Sample (int m){n=m;}friend void square(Sample &s){s.n=s.n*s.n;}void disp(){cout<<"n="<<n<<endl;}};void main(){Sample a(10);square(a);a.disp();}解:本题应用友元函数修改对象的数据成员。