2015年第十二周项目四:点,圆类的关系

来源:互联网 发布:巨森网络 编辑:程序博客网 时间:2024/04/30 11:31
(5)在圆类上重载关系运算符(6种),使之能够按圆的面积比较两个圆的大小。自编main函数完成测试。
[参考解答]
[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include <iostream>  
  2. #include<Cmath>  
  3. using namespace std;  
  4. class Point  
  5. {  
  6. public:  
  7.     Point(double a=0,double b=0):x(a),y(b) {}       //构造函数  
  8. protected:                                       //受保护成员  
  9.     double x,y;  
  10. };  
  11.   
  12. class Circle:public Point //circle是Point类的公用派生类  
  13. {  
  14. public:  
  15.     Circle(double a=0,double b=0,double r=0): Point(a,b),radius(r) { }//构造函数  
  16.     double area ( ) const//计算圆面积  
  17.     friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<”  
  18.     //重载关系运算符运算符,使之能够按圆的面积比较两个圆的大小;  
  19.     bool operator>(const Circle &);  
  20.     bool operator<(const Circle &);  
  21.     bool operator>=(const Circle &);  
  22.     bool operator<=(const Circle &);  
  23.     bool operator==(const Circle &);  
  24.     bool operator!=(const Circle &);  
  25. protected:  
  26.     double radius;  
  27. };  
  28.   
  29. //计算圆面积  
  30. double Circle::area( ) const  
  31. {  
  32.     return 3.14159*radius*radius;  
  33. }  
  34.   
  35. //重载运算符“<<”,使之按规定的形式输出圆的信息  
  36. ostream &operator<<(ostream &output,const Circle &c)  
  37. {  
  38.     output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.radius;  
  39.     return output;  
  40. }  
  41.   
  42. //重载关系运算符(种)运算符,使之能够按圆的面积比较两个圆的大小;  
  43. bool Circle::operator>(const Circle &c)  
  44. {  
  45.     return (this->radius - c.radius) > 1e-7;  
  46. }  
  47.   
  48. bool Circle::operator<(const Circle &c)  
  49. {  
  50.     return (c.radius - this->radius) > 1e-7;  
  51. }  
  52.   
  53. bool Circle::operator>=(const Circle &c)  
  54. {  
  55.     return !(*this < c);  
  56. }  
  57.   
  58. bool Circle::operator<=(const Circle &c)  
  59. {  
  60.     return !(*this > c);  
  61. }  
  62.   
  63. bool Circle::operator==(const Circle &c)  
  64. {  
  65.     return abs(this->radius - c.radius) < 1e-7;  
  66. }  
  67.   
  68. bool Circle::operator!=(const Circle &c)  
  69. {  
  70.     return abs(this->radius - c.radius) > 1e-7;  
  71. }  
  72.   
  73. int main( )  
  74. {  
  75.     Circle c1(3,2,4),c2(4,5,5);      //c2应该大于c1  
  76.     cout<<"圆c1( "<<c1<<" )的面积是 "<<c1.area()<<endl;  
  77.     cout<<"圆c2( "<<c2<<" )的面积是 "<<c2.area()<<endl;  
  78.     cout<<"圆c1 ";  
  79.     if(c1>c2) cout<<"大于, ";  
  80.     if(c1<c2) cout<<"小于, ";  
  81.     if(c1>=c2) cout<<"大于等于, ";  
  82.     if(c1<=c2) cout<<"小于等于, ";  
  83.     if(c1==c2) cout<<"等于, ";  
  84.     if(c1!=c2) cout<<"不等于, ";  
  85.     cout<<"圆c2"<<endl;  
  86.   
  87.     return 0;  

  1. }  
  2. #include <iostream>#include<Cmath>using namespace std;class Point{public:    Point(double a=0,double b=0):x(a),y(b) {} //构造函数    double distance(const Point &p) const;//求距离    friend ostream & operator<<(ostream &,const Point &);//重载运算符“<<”protected:  //受保护成员    double x,y;};double Point::distance(const Point &p) const//求距离{    double dx = x-p.x;    double dy = y-p.y;    return sqrt(dx*dx+dy*dy);}ostream & operator<<(ostream &output,const Point &p){    output<<"["<<p.x<<","<<p.y<<"]"<<endl;    return output;}class Circle:public Point //circle是Point类的公用派生类{public:    Circle(double a=0,double b=0,double r=0) :Point(a,b),radius(r) { }; //构造函数    double area();    friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<”    friend int locate(const Point &p, const Circle &c); //判断点p在圆上、圆内或圆外,返回值:<0圆内,==0圆上,>0 圆外    bool operator>(Circle &c);    bool operator<(Circle &c);    bool operator==(Circle &c);    bool operator>=(Circle &c);    bool operator<=(Circle &c);    bool operator!=(Circle &c);protected:    double radius;};bool Circle::operator>(Circle &c){    if(this->area()>c.area())return true;    else return false;}bool Circle::operator==(Circle &c){    if(this->area()==c.area())return true;    else return false;}bool Circle::operator<(Circle &c){    if(this->area()<c.area())return true;    else return false;}bool Circle::operator>=(Circle &c){    if(this->area()>=c.area())return true;    else return false;}bool Circle::operator<=(Circle &c){    if(this->area()<=c.area())return true;    else return false;}bool Circle::operator!=(Circle &c){    if(this->area()!=c.area())return true;    else return false;}double Circle::area(){    double areas;    areas=3.14159*radius*radius;    return areas;}//重载运算符“<<”,使之按规定的形式输出圆的信息ostream &operator<<(ostream &output,const Circle &c){    output<<"Center=["<<c.x<<", "<<c.y<<"], r="<<c.radius<<endl;    return output;}//判断点p在圆内、圆c内或圆c外int locate(const Point &p, const Circle &c){    const Point cp(c.x,c.y); //圆心    double d = cp.distance(p);    if (abs(d - c.radius) < 1e-7)        return 0;  //相等    else if (d < c.radius)        return -1;  //圆内    else        return 1;  //圆外}int main( ){    Circle c1(3,2,4),c2(4,5,5);      //c2应该大于c1    cout<<"圆c1( "<<c1<<" )的面积是 "<<c1.area()<<endl;    cout<<"圆c2( "<<c2<<" )的面积是 "<<c2.area()<<endl;    cout<<"圆c1 ";    if(c1>c2) cout<<"大于, ";    if(c1<c2) cout<<"小于, ";    if(c1>=c2) cout<<"大于等于, ";    if(c1<=c2) cout<<"小于等于, ";    if(c1==c2) cout<<"等于, ";    if(c1!=c2) cout<<"不等于, ";    cout<<"圆c2"<<endl;    return 0;}


0 0