您好,欢迎访问三七文档
01.分析以下程序的执行结果#includeiostream.hclassSample{intn;public:Sample(inti){n=i;}friendintadd(Sample&s1,Sample&s2);};intadd(Sample&s1,Sample&s2){returns1.n+s2.n;}voidmain(){Samples1(10),s2(20);coutadd(s1,s2)endl;}解:本题说明了友元函数的使用方法。add()是一个友元函数,它返回两个引用对象的n值之和。所以输出为:30注意:友元函数不是类的成元函数----------------------------------------------------02.分析以下程序的执行结果#includeiostream.hclassB;classA{inti;public:intset(B&);intget(){returni;}A(intx){i=x;}};classB{inti;public:B(intx){i=x;}friendA;};intA::set(B&b)//由于使用了类B的定义,故本函数的定义应放在类B定义之后{returni=b.i;}voidmain(){Aa(1);Bb(2);couta.get(),;a.set(b);couta.get()endl;}解:本题说明友元类的使用方法。这里将类A设置为类B的友元类,因此,类A的所有成员函数均为类B的友元函数。通过调用a.set(b)将b对象的i值赋给a对象的i值。所以输出为:1,2-------------------------------------------------03.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,比较两个学生成绩的高低,并求出最高分和最低分的学生。解:#includeiostream.h#includestring.hclassstudent{charname[10];intdeg;public:student(charna[],intd){strcpy(name,na);deg=d;}char*getname(){returnname;}friendintcompare(student&s1,student&s2){if(s1.degs2.deg)return1;elseif(s1.deg==s2.deg)return0;elsereturn-1;}};voidmain(){studentst[]={student(王华,78),student(李明,92),student(张伟,62),student(孙强,88)};inti,min=0,max=0;for(i=1;i4;i++){if(compare(st[max],st[i])==-1)max=i;elseif(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:不及格。解:#includeiostream.h#includestring.h#includeiomanip.hclassstudent{charname[10];intdeg;charlevel[7];public:student(charna[],intd){strcpy(name,na);deg=d;}char*getname(){returnname;}friendvoidtrans(student&s){if(s.deg=90)strcpy(s.level,优);elseif(s.deg=80)strcpy(s.level,良);elseif(s.deg=70)strcpy(s.level,中);elseif(s.deg=60)strcpy(s.level,及格);elsestrcpy(s.level,不及格);}voiddisp(){coutsetw(10)namesetw(6)degsetw(8)levelendl;}};voidmain(){studentst[]={student(王华,78),student(李明,92),student(张伟,62),student(孙强,88)};cout输出结果:endl;coutsetw(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);用于输出数据本题程序如下:#includeiostream.h#defineMax100classSample{intA[Max];intn;friendclassprocess;public:Sample(){n=0;}};classprocess{voidqsort(Sample&s,intl,inth);//私有成员,由quicksort()成员调用public:voidgetdata(Sample&s);voidinsertsort(Sample&s);voidshellsort(Sample&s);voidbubblesort(Sample&s);voidquicksort(Sample&s);voidselectsort(Sample&s);voiddisp(Sample&s);};voidprocess::getdata(Sample&s){inti;cout元素个数:;cins.n;for(i=0;is;i++){cout输入第i+1个数据:;cins.A[i];}}voidprocess::insertsort(Sample&s)//插入排序{inti,j,temp;for(i=1;is.n;i++){temp=s.A[i];j=i-1;while(temps.A[j]){s.A[j+1]=s.A[j];j--;}s.A[j+1]=temp;}}voidprocess::shellsort(Sample&s)//希尔排序{inti,j,gap,temp;gap=s.n/2;while(gap0){for(i=gap;is;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;}elsej=0;}gap=gap/2;}}voidprocess::bubblesort(Sample&s)//冒泡排序{inti,j,temp;for(i=0;is.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;}}voidprocess::quicksort(Sample&s)//快速排序{qsort(s,0,s.n-1);}voidprocess::qsort(Sample&s,intl,inth){inti=l,j=h,temp;if(lh){temp=s.A[l];do{while(ji&&s.A[j]=temp)j--;if(ij){s.A[i]=s.A[j];i++;}while(ij&&s.A[i]=temp)i++;if(ij){s.A[j]=s.A[i];j--;}}while(ij);s.A[i]=temp;qsort(s,l,j-1);qsort(s,j+1,h);}}voidprocess::selectsort(Sample&s)//选择排序{inti,j,k,temp;for(i=0;is.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;}}voidprocess::disp(Sample&s){for(inti=0;is.n;i++)couts.A[i];coutendl;}voidmain(){intsel;Samples;processp;p.getdata(s);cout原来序列:;p.disp(s);cout0:插入排序1:希尔排序2:冒泡排序3:快速排序4:选择排序其它退出endl;cout选择排序方法:;cinsel;switch(sel){case0:p.insertsort(s);cout插入排序结果:;03.题1.分析以下程序的执行结果#includeiostream.hclassSample{intn;public:Sample(){}Sample(intm){n=m;}friendvoidsquare(Sample&s){s.n=s.n*s.n;}voiddisp(){coutn=nendl;}};voidmain(){Samplea(10);square(a);a.disp();}解:本题应用友元函数修改对象的数据成员。square()是一个友元函数,它将引用对象的n值进行平方计算。所以输出为:100-----------------------------------------------------------题2.分析以下程序的执行结果#includeiostream.hclassB;classA{inti;friendB;voiddisp(){coutiendl;}};classB{public:voidset(intn){Aa;a.i=n;//i是对象a的私有数据成员,在友元类可以使用a.disp();//disp()是对象a的私有成员函数,在友元类可以使用}};voidmain(){Bb;b.set(2);}解:本题说明友元类的设计方法。这里将类B设置为类A的友元类,因此,在设计类B时可以直接使用类A的私有数据成员和成员函数。所以输出为:2-------------------------------------------------------------题3.分析以下程序的执行结果#includeiostream.hclassteacher;classstudent{char*name;public:student(char*s){name=s;}friendvoidprint(student&,teacher&);};classteacher{char*name;public:teacher(char*s){name=s;}friendvoid
本文标题:C++友元习题
链接地址:https://www.777doc.com/doc-5831400 .html