C++友元习题.docx
- 文档编号:3325054
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:10
- 大小:17.36KB
C++友元习题.docx
《C++友元习题.docx》由会员分享,可在线阅读,更多相关《C++友元习题.docx(10页珍藏版)》请在冰豆网上搜索。
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;i for(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(i i++; if(i { s.A[j]=s.A[i]; j--; } }while(i 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;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;i cout< 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; }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 习题