C++友元习题.docx
《C++友元习题.docx》由会员分享,可在线阅读,更多相关《C++友元习题.docx(10页珍藏版)》请在冰豆网上搜索。
![C++友元习题.docx](https://file1.bdocx.com/fileroot1/2022-11/21/795759b1-ae11-46fa-ab8b-89b784d185b0/795759b1-ae11-46fa-ab8b-89b784d185b01.gif)
C++友元习题
01.分析以下程序的执行结果
#include
classSample
{
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);
cout<}
解:
本题说明了友元函数的使用方法。
add()是一个友元函数,它返回两个引用对象的n值之和。
所以输出为:
30
注意:
友元函数不是类的成元函数
----------------------------------------------------
02.分析以下程序的执行结果
#include
classB;
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);
cout<a.set(b);
cout<}
解:
本题说明友元类的使用方法。
这里将类A设置为类B的友元类,因此,类A的所有成员函数均为类B的友元函数。
通过调用a.set(b)将b对象的i值赋给a对象的i值。
所以输出为:
1,2
-------------------------------------------------
03.有一个学生类student,包括学生XX、成绩,设计一个友元函数,比较两个学生成绩的高低,并求出最高分和最低分的学生。
解:
#include
#include
classstudent
{
charname[10];
intdeg;
public:
student(charna[],intd)
{
strcpy(name,na);
deg=d;
}
char*getname(){returnname;}
friendintpare(student&s1,student&s2)
{
if(s1.deg>s2.deg)
return1;
elseif(s1.deg==s2.deg)
return0;
elsereturn-1;
}
};
voidmain()
{
studentst[]={student("王华",78),student("李明",92),student("X伟",62),student("孙强",88)};
inti,min=0,max=0;
for(i=1;i<4;i++)
{
if(pare(st[max],st[i])==-1)
max=i;
elseif(pare(st[i],st[min])==1)
min=i;
}
cout<<"输出结果:
"<cout<<"最高分:
"<cout<<"最低分:
"<}
本程序的执行结果如下:
输出结果:
最高分者:
李明
最低分者:
X伟
-------------------------------------------------------------
04.有一个学生类student,包括学生XX、成绩,设计一个友元函数,输出成绩对应的等级:
大于等于90:
优;80~90:
良;70~79:
中;60!
69:
及格;小于60:
不及格。
解:
#include
#include
#include
classstudent
{
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,"及格");
else
strcpy(s.level,"不及格");
}
voiddisp()
{
cout<}
};
voidmain()
{
studentst[]={student("王华",78),student("李明",92),student("X伟",62),student("孙强",88)};
cout<<"输出结果:
"<cout<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
#defineMax100
classSample
{
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<<"元素个数:
";
cin>>s.n;
for(i=0;i
{
cout<<"输入第"<
";
cin>>s.A[i];
}
}
voidprocess:
:
insertsort(Sample&s)//插入排序
{
inti,j,temp;
for(i=1;i{
temp=s.A[i];
j=i-1;
while(temp{
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(gap>0)
{
for(i=gap;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;ifor(j=s.n-1;j>=i+1;j--)
if(s.A[j]{
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(l{temp=s.A[l];
do
{
while(j>i&&s.A[j]>=temp)
j--;
if(i{
s.A[i]=s.A[j];
i++;
}
while(ii++;
if(i{
s.A[j]=s.A[i];
j--;
}
}while(is.A[i]=temp;
qsort(s,l,j-1);
qsort(s,j+1,h);
}
}
voidprocess:
:
selectsort(Sample&s)//选择排序
{
inti,j,k,temp;
for(i=0;i{
k=i;
for(j=i+1;j<=s.n-1;j++)
if(s.A[j]k=j;
temp=s.A[i];
s.A[i]=s.A[k];
s.A[k]=temp;
}
}
voidprocess:
:
disp(Sample&s)
{
for(inti=0;icout<cout<}
voidmain()
{
intsel;
Samples;
processp;
p.getdata(s);
cout<<"原来序列:
";
p.disp(s);
cout<<"0:
插入排序1:
希尔排序2:
冒泡排序3:
快速排序4:
选择排序其它退出"<cout<<"选择排序方法:
";
cin>>sel;
switch(sel)
{
case0:
p.insertsort(s);
cout<<"插入排序结果:
";
03.题1.分析以下程序的执行结果
#include
classSample
{
intn;
public:
Sample(){}
Sample(intm){n=m;}
friendvoidsquare(Sample&s)
{
s.n=s.n*s.n;
}
voiddisp()
{
cout<<"n="<}
};
voidmain()
{
Samplea(10);
square(a);
a.disp();
}
解:
本题应用友元函数修改对象的数据成员。
square()是一个友元函数,它将引用对象的n值进行平方计算。
所以输出为:
100
-----------------------------------------------------------
题2.分析以下程序的执行结果
#include
classB;
classA
{
inti;
friendB;
voiddisp(){cout<
};
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.分析以下程序的执行结果
#include
classteacher;
classstudent
{
char*name;
public:
student(char*s){name=s;}
friendvoidprint(student&,teacher&);
};
classteacher
{
char*name;
public:
teacher(char*s){name=s;}
friendvoidprint(student&,teacher&);
};
voidprint(student&a,teacher&b)
{
cout<<"thestudentis:
"<cout<<"theteacheris:
"<}
voidmain()
{
students("LiHu");
teachert("WangPing");
print(s,t);
}
解:
student和teacher类共用一个友元函数的实现。
所以输出为:
thestudentisLiHu
theteacherisWanPing
--------------------------------------------------------------
题4.有一个学生类student,包括学生XX、成绩,设计一个友元类,输出成绩大于等于80分以上者。
解:
学生类student的disp()函数设计成友元函数。
本题程序如下:
#include
#include
#include
classstudent
{
charname[10];
intdeg;
public:
student(charna[],intd)
{
strcpy(name,na);
deg=d;
}
char*getname(){returnname;}
friendvoiddisp(student&s)
{
if(s.deg>=80)
cout<}
};
voidmain()
{
studentst[]={student("王华",78),student("李明",92),student("X伟",62),student("孙强",88)};
cout<<"输出结果:
"<cout<for(inti=0;i<4;i++)
disp(st[i]);
}
本程序的执行结果如下:
输出结果:
成绩
李明92
孙强88
--------------------------------------------------------------
题5.有一个向量类Vector,包括一个点的坐标位置x和y,设计两个友元函数,实现两个向量的加法和减法的运算
解:
本题程序如下:
#include
classVector
{
intx,y;
public:
Vector(){}
Vector(inti,intj){x=i;y=j;}
voiddisp()
{
cout<<"("<}
friendVectoradd(Vector&v1,Vector&v2)
{
Vectorv;
v.x=v1.x+v2.x;
v.y=v1.y+v2.y;
returnv;
}