}
解:
本题说明友元类的使用方法。
这里将类A设置为类B的友元类,因此,类A的所有成员函数均为类B的友元函数。
通过调用a.set(b)将b对象的i值赋给a对象的i值。
所以输出为:
1,2
—-—-—-——----——--————-———--——---—————---—--—-—-—--
03.有一个学生类student,包括学生姓名、成绩,设计一个友元函数,比较两个学生成绩的高低,并求出最高分和最低分的学生。
解:
#include
#includeclassstudent
{
charname[10];
intdeg;
public:
student(charna[],intd)
{
strcpy(name,na);
deg=d;
}
char*getname(){returnname;}
friendintcompare(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(”张伟",62),student("孙强",88)};
inti,min=0,max=0;
for(i=1;i〈4;i++)
{
if(compare(st[max],st[i])==—1)
max=i;
elseif(compare(st[i],st[min])==1)
min=i;
}
cout<<"输出结果:
”<cout〈<”最高分:
"〈cout〈〈"最低分:
"<〈st[min]。
getname()〈}
本程序的执行结果如下:
输出结果:
最高分者:
李明
最低分者:
张伟
--——--———-—-———----——----—---—---——----—----—-—-———--——-——---
04。
有一个学生类student,包括学生姓名、成绩,设计一个友元函数,输出成绩对应的等级:
大于等于90:
优;80~90:
良;70~79:
中;60!
69:
及格;小于60:
不及格.
解:
#include
#include〈string。
h>
#includeclassstudent
{
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〈〈setw(10)〈〈name<〈setw(6)〈〈deg〈}
};
voidmain()
{
studentst[]={student(”王华",78),student("李明”,92),student("张伟",62),student("孙强",88)};
cout<<"输出结果:
"〈〈endl;
cout〈〈setw(10)<〈"姓名”〈〈setw(6)<〈”成绩”〈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);用于输出数据
本题程序如下:
#includeh>
#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〈s;i++)
{
cout〈<"输入第"〈
”;
cin〉〉s。
A[i];
}
}
voidprocess:
:
insertsort(Sample&s)//插入排序
{
inti,j,temp;
for(i=1;i〈s.n;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]〈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(l{temp=s。
A[l];
do
{
while(j>i&&s。
A[j]〉=temp)
j--;
if(i〈j)
{
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〈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;
}
}
voidprocess:
:
disp(Sample&s)
{
for(inti=0;i〈s.n;i++)
cout〈〈s。
A[i]〈<””;
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〈iostream。
h>
classSample
{
intn;
public:
Sample(){}
Sample(intm){n=m;}
friendvoidsquare(Sample&s)
{
s。
n=s.n*s.n;
}
voiddisp()
{
cout〈〈”n="<〈n<〈endl;
}
};
voidmain()
{
Samplea(10);
square(a);
a。
disp();
}
解:
本题应用友元函数修改对象的数据成员.square()是一个友元函数,它将引用对象的n值进行平方计算。
所以输出为:
100
--—-—--—-------——-———————-------——--—---—--—----—-——--——--—
题2。
分析以下程序的执行结果
#include〈iostream.h〉
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〈iostream。
h>
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,包括学生姓名、成绩,设计一个友元类,输出成绩大于等于80分以上者。
解:
学生类student的disp()函数设计成友元函数.
本题程序如下:
#include〈iostream.h>
#include
#include〈iomanip.h〉
classstudent
{
charname[10];
intdeg;
public:
student(charna[],intd)
{
strcpy(name,na);
deg=d;
}
char*getname(){returnname;}
friendvoiddisp(student&s)
{
if(s.deg〉=80)
cout〈〈setw(10)〈
name〈〈setw(6)<
deg<}
};
voidmain()
{
studentst[]={student(”王华",78),student("李明”,92),student(”张伟”,62),student(”孙强",88)};
cout<<”输出结果:
”<〈endl;
cout<〈setw(10)<〈"姓名"〈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;
}