国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

C++習(xí)題與解析-友元

2019-11-17 05:21:25
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
01.分析以下程序的執(zhí)行結(jié)果
#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;
}

解:
本題說(shuō)明了友元函數(shù)的使用方法。add()是一個(gè)友元函數(shù),它返回兩個(gè)引用對(duì)象的n值之和。
所以輸出為: 30

注重:友元函數(shù)不是類的成元函數(shù)

----------------------------------------------------

02.分析以下程序的執(zhí)行結(jié)果
#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的定義,故本函數(shù)的定義應(yīng)放在類B定義之后
{
return i=b.i;
}
void main()
{
A a(1);
B b(2);
cout<<a.get()<<",";
a.set(b);
cout<<a.get()<<endl;
}

解:
本題說(shuō)明友元類的使用方法。這里將類A設(shè)置為類B的友元類,因此,類A的所有成員函數(shù)均為類B的友元函數(shù)。通過(guò)調(diào)用a.set(b)將b對(duì)象的i值賦給a對(duì)象的i值。
所以輸出為:1,2

-------------------------------------------------

03.有一個(gè)學(xué)生類student,包括學(xué)生姓名、成績(jī),設(shè)計(jì)一個(gè)友元函數(shù),比較兩個(gè)學(xué)生成績(jī)的高低,并求出最高分和最低分的學(xué)生。
解:
#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("孫強(qiáng)",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<<"輸出結(jié)果:"<<endl;
cout<<" 最高分:"<<st[max].getname()<<endl;
cout<<" 最低分:"<<st[min].getname()<<endl;
}

本程序的執(zhí)行結(jié)果如下:
輸出結(jié)果:
最高分者:李明
最低分者:張偉

-------------------------------------------------------------

04.有一個(gè)學(xué)生類student,包括學(xué)生姓名、成績(jī),設(shè)計(jì)一個(gè)友元函數(shù),輸出成績(jī)對(duì)應(yīng)的等級(jí):大于等于90:優(yōu);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,"優(yōu)");
else if(s.deg>=80)
strcpy(s.level,"良");
else if(s.deg>=70)
strcpy(s.level,"中");
else if(s.deg>=60)
strcpy(s.level,"及格");
else
strcpy(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("孫強(qiáng)",88)};
cout<<"輸出結(jié)果:"<<endl;
cout<<setw(10)<<"姓名"<<setw(6)<<"成績(jī)"<<setw(8)<<"等級(jí)"<<endl;
for(int i=0;i<4;i++)
{
trans(st[i]);
st[i].disp();
}
}

本程序執(zhí)行結(jié)果如下:
輸出結(jié)果:
姓名 成績(jī) 等級(jí)
王華 78 中
李明 92 優(yōu)
張偉 62 及格
孫強(qiáng) 88 良

05.設(shè)計(jì)一個(gè)類Sample,它有兩個(gè)私有成員A[]和n(A中元素個(gè)數(shù)),將對(duì)A[]中數(shù)據(jù)進(jìn)行各種排序的函數(shù)放入到一個(gè)友元類PRocess中。
解:
process類不包含任何數(shù)據(jù)成員,包含的公共成員函數(shù)如下:
getdata(Sample &s); 用于獲取對(duì)象s的數(shù)據(jù)
insertsort(Sample &s); 用于進(jìn)行插入排序
shellsort(Sample &s); 用于進(jìn)行希爾排序
bubblesort(Sample &s); 用于進(jìn)行冒泡排序
quicksort(Sample &s); 用于進(jìn)行快速排序
selectsort(Sample &s); 用于進(jìn)行選擇排序
disp(Sample &s); 用于輸出數(shù)據(jù)

本題程序如下:
#include<iostream.h>
#define Max 100
class Sample
{
int A[Max];
int n;
friend class process;
public:
Sample(){n=0;}
};
class process
{
void qsort(Sample &s,int l,int h);
// 私有成員,由quicksort()成員調(diào)用
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<<"元素個(gè)數(shù):";
cin>>s.n;
for(i=0;i<s;i++)
{
cout<<"輸入第"<<i+1<<"個(gè)數(shù)據(jù):";
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<<"原來(lái)序列:";
p.disp(s);
cout<<"0:插入排序 1:希爾排序 2:冒泡排序 3:快速排序 4:選擇排序 其它退出"<<endl;
cout<<"選擇排序方法:";
cin>>sel;
switch(sel)
{
case 0:
p.insertsort(s);
cout<<"插入排序結(jié)果:";
break;
case 1:
p.shellsort(s);
cout<<"希爾排序結(jié)果:";
break;
case 2:
p.bubblesort(s);
cout<<"冒泡排序結(jié)果:";
break;
case 3:
p.quicksort(s);
cout<<"快速排序結(jié)果:";
break;
case 4:
p.selectsort(s);
cout<<"選擇排序結(jié)果:";
break;
}
p.disp(s);
}

本程序的執(zhí)行結(jié)果如下:
元素個(gè)數(shù):8
輸入第1個(gè)數(shù)據(jù): 1
輸入第2個(gè)數(shù)據(jù): 6
輸入第3個(gè)數(shù)據(jù): 5
輸入第4個(gè)數(shù)據(jù): 3
輸入第5個(gè)數(shù)據(jù): 4
輸入第6個(gè)數(shù)據(jù): 8
輸入第7個(gè)數(shù)據(jù): 2
輸入第8個(gè)數(shù)據(jù): 7
原來(lái)序列: 1 6 5 3 4 8 2 7
0:插入排序 1:希爾排序 2:冒泡排序 3:快速排序 4:選擇排序 其它退出
選擇排序方法: 1
希爾排序結(jié)果: 1 2 3 4 5 6 7 8

題1.分析以下程序的執(zhí)行結(jié)果
#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();
}

解:
本題應(yīng)用友元函數(shù)修改對(duì)象的數(shù)據(jù)成員。square()是一個(gè)友元函數(shù),它將引用對(duì)象的n值進(jìn)行平方計(jì)算。
所以輸出為:100
-----------------------------------------------------------

題2.分析以下程序的執(zhí)行結(jié)果
#include<iostream.h>
class B;
class A
{
int i;
friend B;
void disp(){cout<<i<<endl;}
};
class B
{
public:
void set(int n)
{
A a;
a.i=n; // i是對(duì)象a的私有數(shù)據(jù)成員,在友元類可以使用
a.disp(); // disp()是對(duì)象a的私有成員函數(shù),在友元類可以使用
}
};
void main()
{
B b;
b.set(2);
}
解:
本題說(shuō)明友元類的設(shè)計(jì)方法。這里將類B設(shè)置為類A的友元類,因此,在設(shè)計(jì)類B時(shí)可以直接使用類A的私有數(shù)據(jù)成員和成員函數(shù)。
所以輸出為: 2

-------------------------------------------------------------

題3.分析以下程序的執(zhí)行結(jié)果
#include<iostream.h>
class teacher;
class student
{
char *name;
public:
student(char *s){name=s;}
friend void print(student &,teacher &);
};
class teacher
{
char *name;
public:
teacher(char *s){name=s;}
friend void print(student &,teacher &);
};
void print(student &a,teacher &b)
{
cout<<"the student is:"<<a.name<<endl;
cout<<"the teacher is:"<<b.name<<endl;
}
void main()
{
student s("Li Hu");
teacher t("Wang Ping");
print(s,t);
}

解:
student和teacher類共用一個(gè)友元函數(shù)的實(shí)現(xiàn)。
所以輸出為:
the student is Li Hu
the teacher is Wan Ping

--------------------------------------------------------------

題4.有一個(gè)學(xué)生類student,包括學(xué)生姓名、成績(jī),設(shè)計(jì)一個(gè)友元類,輸出成績(jī)大于等于80分以上者。
解:
學(xué)生類student的disp()函數(shù)設(shè)計(jì)成友元函數(shù)。
本題程序如下:
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
class student
{
char name[10];
int deg;
public:
student(char na[],int d)
{
strcpy(name,na);
deg=d;
}
char *getname(){ return name;}
friend void disp(student &s)
{
if(s.deg>=80)
cout<<setw(10)<<s.name<<setw(6)<<s.deg<<endl;
}
};
void main()
{
student st[]={student("王華",78),student("李明",92),student("張偉",62),student("孫強(qiáng)",88)};
cout<<"輸出結(jié)果:"<<endl;
cout<<setw(10)<<"姓名"<<setw(6)<<"成績(jī)"<<endl;
for(int i=0;i<4;i++)
disp(st[i]);
}

本程序的執(zhí)行結(jié)果如下:
輸出結(jié)果:
姓名 成績(jī)
李明 92
孫強(qiáng) 88


--------------------------------------------------------------

題5.有一個(gè)向量類Vector,包括一個(gè)點(diǎn)的坐標(biāo)位置x和y,設(shè)計(jì)兩個(gè)友元函數(shù),實(shí)現(xiàn)兩個(gè)向量的加法和減法的運(yùn)算
解:
本題程序如下:
#include<iostream.h>
class Vector
{
int x,y;
public:
Vector(){}
Vector(int i,int j){x=i;y=j;}
void disp()
{
cout<<"("<<x<<","<<y<<")";
}
friend Vector add(Vector &v1,Vector &v2)
{
Vector v;
v.x=v1.x+v2.x;
v.y=v1.y+v2.y;
return v;
}
friend Vector sub(Vector &v1,Vector &v2)
{
Vector v;
v.x=v1.x-v2.x;
v.y=v1.y-v2.y;
return v;
}
};
void main()
{
Vector v1(10,20),v2(4,5),v3;
v3=add(v1,v2);
cout<<"輸出結(jié)果:"<<endl;
cout<<" "; v1.disp();cout<<"+";v2.disp();
cout<<"="; v3.disp(); cout<<endl;
v3=sub(v1,v2);
cout<<" "; v1.disp(); cout<<"-";v2.disp();
cout<<"=";v3.disp(); cout<<endl;
}

本程序的執(zhí)行結(jié)果如下:
輸出結(jié)果:
(10,20)+(4,5)=(14,25)
(10,20)-(4,5)=(6,15)

題6.采用友元函數(shù)的方法重新設(shè)計(jì)“引用<題8>”中的類Point,并求兩個(gè)點(diǎn)之間的距離。
解:
將原來(lái)求兩個(gè)點(diǎn)的距離的普通函數(shù)distance()改寫為友元函數(shù)即可,可以看到采用友元函數(shù)方法使得代碼更簡(jiǎn)潔。
本題程序如下:
#include<iostream.h>
#include<math.h>
class Point
{
int x,y;
public:
Point(int i,int j){x=i;y=j;}
friend float distance(Point &p1,Point &p2);
void disp()
{
cout<<"("<<x<<","<<y<<")";
}
};
float distance(Point &p1,Point &p2) // 友元函數(shù)的實(shí)現(xiàn)
{
float d;
d=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
return d;
}
void main()
{
Point p1(2,2),p2(5,5);
p1.disp(); cout<<"與"; p2.disp();
cout<<"之間距離="<<distance(p1,p2)<<endl;
}

本程序執(zhí)行結(jié)果如下:
(2,2)與(5,5)之間距離=4.24264

-------------------------------------------------------

題7.設(shè)計(jì)一個(gè)日期類Date,包括日期的年份、月份和日號(hào),編寫一個(gè)友元函數(shù),求兩個(gè)日期之間相差的天數(shù)。
解:
該類中設(shè)計(jì)有3個(gè)友元函數(shù);count_day()函數(shù),它有兩個(gè)參數(shù),第2個(gè)參數(shù)是一個(gè)標(biāo)志,當(dāng)其值等于1 時(shí),計(jì)算一年的開始到某日期的天數(shù);否則計(jì)算某日期到年尾的天數(shù)。leap()函數(shù)用于判定指定的年份是否為閏年。subs()函數(shù)用于計(jì)算兩個(gè)日期之間的天數(shù)。
本題程序如下:
#include<iostream.h>
#include<stdio.h>
class Date
{
int year;
int month;
int day;
public:
Date(int y,int m,int d)
{
year=y;month=m;day=d;
}
void disp()
{
printf("%d.%d.%d",year,month,day);
}
friend int count_day(Date &d,int);
friend int leap(int year);
friend int subs(Date &d1,Date &d2);
};
int count_day(Date &d,int flag)
{
static int day_tab[2][12]={{31,28,31,30,31,30,31,31,30,31,30,31},
{31,29,31,30,31,30,31,31,30,31,30,31}};
// 使用二維數(shù)組存放各月天數(shù),第一行對(duì)應(yīng)非閏年,第二行對(duì)應(yīng)閏年
int p,i,s;
if(leap(d.year))
p=1;
else p=0;
if(flag)
{
s=d.day;
for(i=1;i<d.month;i++)
s+=day_tab[p][i-1];
}
else
{
s=day_tab[p][d.month]-d.day;
for(i=d.month+1; i<=12; i++)
s+=day_tab[p][i-1];
}
return s;
}
int leap(int year)
{
if(year%4==0&&year%100!=0year%400==0) // 是閏年
return 1;
else // 不是閏年
return 0;
}
int subs(Date &d1,Date &d2)
{
int days,day1,day2,y;
if(d1.year<d2.year)
{
days=count_day(d1,0);
for(y=d1.year+1; y<d2.year ;y++)
if(leap(y))
days+=366L;
else
days+=365L;
days+=count_day(d2,1);
}
else if(d1.year==d2.year)
{
day1=count_day(d1,1);
day2=count_day(d2,1);
days=day2-day1;
}
else
days=-1;
return days;
}
void main()
{
Date d1(2000,1,1),d2(2002,10,1);
int ds=subs(d1,d2);
printf("輸出結(jié)果:/n ");
if(ds>=0)
{
d1.disp(); printf("與");
d2.disp(); printf("之間有%d天/n/n",ds);
}
else
printf("時(shí)間錯(cuò)誤!/n");
}

本程序的執(zhí)行結(jié)果如下:
輸出結(jié)果:
2000.1.1與2002.10.1之間有1002天


-------------------------------------------------------

題8.編寫一個(gè)程序,設(shè)計(jì)一個(gè)Point類,包括學(xué)號(hào)、姓名和成績(jī)等私有數(shù)據(jù)成員,不含任何成員函數(shù),只將main()設(shè)置為該類的友元函數(shù)。
解:
main()函數(shù)與其它的函數(shù)一樣可以設(shè)置為類的友元函數(shù),這樣就可以在其中使用類對(duì)象的私有數(shù)據(jù)成員。
本題的程序如下:
#include<iostream.h>
class Person
{
int no;
char name[10];
int deg;
public:
friend void main();
};
void main()
{
Person obj;
cout<<"輸入學(xué)號(hào):";
cin>>obj.no;
cout<<"姓名:";
cin>>obj.name;
cout<<"成績(jī):";
cin>>obj.deg;
cout<<"輸出結(jié)果"<<endl;
cout<<"學(xué)生"<<obj.name<<"(學(xué)號(hào)"<<obj.no<<")成績(jī)?yōu)?<<obj.deg<<endl;
}

本程序執(zhí)行結(jié)果如下:
輸入學(xué)號(hào): 10
姓名: Zhengming
成績(jī):88
輸出結(jié)果
學(xué)生Zhengming(學(xué)號(hào)10)成績(jī)?yōu)?8

-------------------------------------------------------

題9.采用友元類的方式重新編寫“友元第04題“的程序。
解:
將原student類中的disp()成員函數(shù)和trans()友元函數(shù)作為友元類process的成員函數(shù)。其執(zhí)行結(jié)果與第4題的結(jié)果完全相同。
本題程序如下:
#include<iostream.h>
#include<string.h>
#include<iomanip.h>
class student
{
char name[10];
int deg;
char level[7];
friend class process; // 說(shuō)明友元類
public:
student(char na[],int d)
{
strcpy(name,na);
deg=d;
}
};
class process
{
public:
void trans(student &s)
{
if(s.deg>=90)
strcpy(s.level,"優(yōu)");
else if(s.deg>=80)
strcpy(s.level,"良");
else if(s.deg>=70)
strcpy(s.level,"中");
else if(s.deg>=60)
strcpy(s.level,"及格");
else
strcpy(s.level,"不及格");
}
void disp(student &s)
{
cout<<setw(10)<<s.name<<setw(6)<<s.deg<<setw(8)<<s.level<<endl;
}
};
void main()
{
student st[]={student("王華",78),student("李明",92),student("張偉",62),student("孫強(qiáng)",88)};
process p;
cout<<"輸出結(jié)果:"<<"姓名"<<setw(6)<<"成績(jī)"<<setw(8)<<"等級(jí)"<<endl;
for(int i=0;i<4;i++)
{
p.trans(st[i]);
p.disp(st[i]);
}
}

*本程序執(zhí)行結(jié)果為:

C++習(xí)題與解析-友元

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 克山县| 呼和浩特市| 饶河县| 云阳县| 忻州市| 丰原市| 老河口市| 寿光市| 盈江县| 张掖市| 泰宁县| 固安县| 呼伦贝尔市| 德化县| 台中市| 凤冈县| 高州市| 塘沽区| 宣恩县| 奎屯市| 平武县| 手游| 蒙城县| 通化市| 启东市| 湖北省| 得荣县| 呼伦贝尔市| 无为县| 衡水市| 炉霍县| 永福县| 邵东县| 闸北区| 金塔县| 武清区| 太仓市| 依安县| 新绛县| 六盘水市| 岳普湖县|