![]() ![]() |
|
C++习题与解析(重载-04) | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/4/18 14:40:52 文章录入:杜斌 责任编辑:杜斌 | |
|
|
解: 在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; if(hh>24) hh=24; static Time result(hh,mm,ss); return result; } Time Time::operator-(Time t) { int borrow,hh,mm,ss; ss=getsecond()-t.getsecond(); if(ss<0) { ss+=60; borrow=1; // 借位标记 } else borrow=1; mm=getminute()-t.getminute()-borrow; if(mm<0) { mm+=60; borrow=1; } else borrow=0; hh=gethour()-t.gethour()-borrow; if(hh<0) hh+=24; static Time result(hh,mm,ss); return result; } void main() { Time now(2,24,39); Time start(17,55); Time t1=now-start,t2=now+start; cout<<"输出结果:"<<endl; cout<<" now: "; now.disp(); cout<<" start:"; start.disp(); cout<<" 相差: "; t1.disp(); cout<<" 相加: "; t2.disp(); } 本程序的执行结果如下: 输出结果: now:2:24:39 start:17:55:0 相差:8:28:39 相加:20:19:39 |
|
![]() ![]() |