C 习题和解析(重载-04)
2008-02-23 05:34:33来源:互联网 阅读 ()
解:
在Triangle类中设计一个友元函数operator (Triangle t1,Triangle t2),他重载运算符" ",返回t1和t2两个三角形的面积之和。
本题程式如下:
#include<iostream.h>
#include<math.h>
class Triangle
{
int x,y,z;
double area;
public:
Triangle(int i,int j,int k)
{
double s;
x=i;y=j;z=k;
s=(x y z)/2.0;
area=sqrt(s*(s-x)*(s-y)*(s-z));
}
void disparea()
{
cout<<"Area="<<area<<endl;
}
friend double operator (Triangle t1,Triangle t2)
{
return t1.area t2.area;
}
};
void main()
{
Triangle t1(3,4,5),t2(4,5,6);
double s;
cout<<"t1:"; t1.disparea();
cout<<"t2:"; t2.disparea();
s=t1 t2;
cout<<"总面积="<<s<<endl;
}
本程式执行结果如下:
t1:Area=6
t2:Area=9.92157
总面积=15.9216
-----------------------------------------------------------
题7.习题6的重载运算符“ ”友元函数只能返回两个三角形的面积之和,不能计算三个三角形的面积之和,改进一下,使之能计算任意多个三角形的面积之和。
解:
习题6的重载运算符为什么不能计算3个三角形的面积之和呢?对于式子:s=t1 t2 t3,先计算t1 t2,返回一个double数然后再进行该double数 t3的计算,显然没有这样的重载运算符“ ”友元函数,只需要添加这样重载运算符“ ”友元函数即可。
本题程式如下:
#include<iostream.h>
#include<math.h>
class Triangle
{
int x,y,z;
double area;
public:
Triangle(int i,int j,int k)
{
double s;
x=i;y=j;z=k;
s=(x y z)/2.0;
area=sqrt(s*(s-x)*(s-y)*(s-z));
}
void disparea()
{
cout<<"Area="<<area<<endl;
}
friend double operator (Triangle t1,Triangle t2)
{
return t1.area t2.area;
}
friend double operator (double d,Triangle t)
{
return d t.area;
}
};
void main()
{
Triangle t1(3,4,5),t2(4,5,6),t3(5,6,7),t4(6,7,8);
double s;
cout<<"t1:"; t1.disparea();
cout<<"t2:"; t2.disparea();
cout<<"t3:"; t3.disparea();
cout<<"t4:"; t4.disparea();
s=t1 t2 t3 t4;
cout<<"总面积="<<s<<endl;
}
本程式的执行结果如下:
t1:Area=6
t2:Area=9.92157
t3:Area=14.6969
t4:Area=20.3332
总面积=50.9517
-------------------------------------------------------
题8.设计一个学生类student,包括姓名和三门课程成绩,利用重载运算符” “将任何学生的成绩相加放在一个对象中,再对该对象求各门课程的平均分。
解:
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
class student
{
char name[10];
int deg1,deg2,deg3;
public:
student(){}
student(char na[],int d1,int d2,int d3)
{
strcpy(name,na);
deg1=d1;deg2=d2;deg3=d3;
}
friend student operator (student s1,student s2)
{
static student st;
st.deg1=s1.deg1 s2.deg1;
st.deg2=s1.deg2 s2.deg2;
st.deg3=s1.deg3 s2.deg3;
return st;
}
void disp()
{
cout<<setw(10)<<name<<setw(5)<<deg1<<setw(5)<<deg2<<setw(5)<<deg3<<endl;
}
friend void avg(student &s,int n)
{
cout<<setw(10)<<"平均分"<<setw(5)<<s.deg1/n<<setw(5)<<s.deg2/n<<setw(5)<<s.deg3/n<<endl;
}
};
void main()
{
student s1("Li",78,82,86),s2("Zheng",75,62,89);
student s3("Ma",89,87,95),s4("Xu",54,78,66),s;
cout<<"输出结果"<<endl;
s1.disp();
s2.disp();
s3.disp();
s4.disp();
s=s1 s2 s3 s4; // 调用重载运算符
avg(s,4); // 友元函数求平均分
}
本程式的执行结果如下:
输出结果:
Li 78 82 86
Zheng 75 62 89
Ma 89 87 95
Xu 54 78 66
平均分 74 77 84
------------------------------------------------------------
题9.在Time类中设计如下重载运算符函数:
Time operator (Time); 返回一时间加上另一时间得到的新时间
Time operator-(Time); 返回一时间减去另一时间得到的新时间
本题程式如下:
#include<iostream.h>
class Time
{
int hour,minute,second;
public:
Time(){}
Time(int h,int m,int s)
{
hour=h;minute=m;second=s;
}
Time(int h,int m)
{
hour=h;minute=m;second=0;
}
void sethour(int h){hour=h;}
void setminute(int m){minute=m;}
void setsecond(int s){second=s;}
int gethour(){return hour;}
int getminute(){return minute;}
int getsecond(){return second;}
Time operator (Time);
Time operator-(Time);
void disp()
{
cout<<hour<<":"<<minute<<":"<<second<<endl;
}
};
Time Time::operator (Time t)
{
int carry,hh,mm,ss;
ss=getsecond() t.getsecond();
if(ss>60)
{
ss-=60;
carry=1; // 进位标记
}
else carry=0;
mm=getminute() t.getminute() carry;
if(mm>60)
{
mm-=60;
carry=1;
}
else carry=0;
hh=gethour() t.gethour() carry;
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇: C 习题和解析(重载-03)
下一篇: C 习题和解析(模板-02)
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash