继承的综合运用《Point类派生出Circle类而且进行各种操作》

类的组合与继承
(1)先建立一个Point(点)类。包括数据成员x,y(坐标点)。
(2)以Point为基类。派生出一个Circle(圆)类,添加数据成员(半径),基类的成员表示圆心;
(3)编写上述两类中的构造、析构函数及必要的输入输出函数
(4)定义友元函数int locate。推断点p在圆c上、圆c内或圆c外。返回值<0圆内,==0圆上,>0 圆外;
(5)重载关系运算符(6种)运算符,使之可以按圆的面积比較两个圆的大小;

程序代码

#include <iostream>
#include <cmath>

using namespace std;

class Point//点类
{
public:
    //构造函数
    Point(double a = 0, double b = 0);

    //得到点的x坐标
    double GetX();

    //得到点的y坐标
    double GetY();

    //重载<<运算符实现输出点的坐标
    friend ostream& operator<<(ostream &output, Point &p);

protected:
    double x;
    double y;
};

 //构造函数
Point::Point(double a, double b):x(a), y(b){}

//得到点的x坐标
double Point::GetX()
{
    return x;
}

//得到点的y坐标
double Point::GetY()
{
    return y;
}

//重载<<运算符实现输出点的坐标
ostream& operator<<(ostream &output, Point &p)
{
    output<<"("<<p.x<<","<<p.y<<")"<<endl;

    return output;
}

//Point类派生出Circle类
class Circle : public Point
{
public:
    //构造函数
    Circle(double a = 0, double b = 0, double r = 0);

    //得到圆的半径
    double GetR();

    //推断点p与圆c的位置
    friend int locate(Point p, Circle c);

    //计算圆的面积
    double GetArea();

    //输出圆的信息
    friend ostream& operator<<(ostream &output, Circle &c);

    //重载>运算符,用于比較两个圆的面积的大小
    friend bool operator>(Circle &c1, Circle &c2);

    //重载<运算符,用于比較两个圆的面积的大小
    friend bool operator<(Circle &c1, Circle &c2);

    //重载==运算符,用于比較两个圆的面积的大小
    friend bool operator==(Circle &c1, Circle &c2);

    //重载!=运算符,用于比較两个圆的面积的大小
    friend bool operator!=(Circle &c1, Circle &c2);

    //重载>=运算符,用于比較两个圆的面积的大小
    friend bool operator>=(Circle &c1, Circle &c2);

    //重载<=运算符,用于比較两个圆的面积的大小
    friend bool operator<=(Circle &c1, Circle &c2);

protected:
    double r;//半径
};

//构造函数
Circle::Circle(double a, double b, double r):
    Point(a, b), r(r){}

//得到圆的半径
double Circle::GetR()
{
    return r;
}

//得到圆的面积
double Circle::GetArea()
{
    return 3.14 * r * r;
}

//推断点p与圆c的位置
int locate(Point p, Circle c)
{
    double d;//保存点到圆心的距离
    double r;//保存圆的半径
    double flag;//标示位

    //计算点到圆心的距离
    d = sqrt((p.GetX() - c.GetX()) * (p.GetX() - c.GetX()) + 
        (p.GetY() - c.GetY()) * (p.GetY() - c.GetY()));

    //得到圆的半径
    r = c.GetR();

    if(d > r )//点在圆外
    {
        flag = 1;
    }
    else if(d == r)//点在圆上
    {
        flag = 0;
    }
    else//点在圆内
    {
        flag = -1;
    }

    return flag;
}

//输出圆的信息
ostream& operator<<(ostream &output, Circle &c)
{
    output<<"("<<c.GetX()<<","<<c.GetY()<<")"<<" r = "<<c.GetR()<<endl;

    return output;
}

//重载>运算符,用于比較两个圆的面积的大小
bool operator>(Circle &c1, Circle &c2)
{
    if(c1.GetArea() > c2.GetArea())
    {
        return true;
    }
    else 
    {
        return false;
    }
}

//重载<运算符,用于比較两个圆的面积的大小
bool operator<(Circle &c1, Circle &c2)
{
    if(c1.GetArea() < c2.GetArea())
    {
        return true;
    }
    else 
    {
        return false;
    }
}

//重载==运算符,用于比較两个圆的面积的大小
bool operator==(Circle &c1, Circle &c2)
{
     if(!(c1 > c2) && !(c1 < c2))
    {
        return true;
    }
    else 
    {
        return false;
    }
}


//重载!=运算符,用于比較两个圆的面积的大小
bool operator!=(Circle &c1, Circle &c2)
{
    if( !(c1 == c2))
    {
        return true;
    }
    else
    {
        return false;
    }
}

//重载>=运算符,用于比較两个圆的面积的大小
bool operator>=(Circle &c1, Circle &c2)
{
    if( (c1 == c2) || (c1 > c2))
    {
        return true;
    }
    else
    {
        return false;
    }
}

//重载<=运算符,用于比較两个圆的面积的大小
bool operator<=(Circle &c1, Circle &c2)
{
     if( (c1 == c2) || (c1 < c2))
    {
        return true;
    }
    else
    {
        return false;
    }
}

void main( )
{
	Circle c1(3,2,4),c2(4,5,5);      //c2应该大于c1
	Point p1(1,1),p2(3,-2),p3(7,3);  //分别位于c1内、上、外


	cout<<"圆c1: "<<c1;
	cout<<"点p1: "<<p1;
	cout<<"点p1在圆c1之"<<((locate(p1, c1)>0)?

"外":((locate(p1, c1)<0)?"内":"上"))<<endl; cout<<"点p2: "<<p2; cout<<"点p2在圆c1之"<<((locate(p2, c1)>0)?"外":((locate(p2, c1)<0)?"内":"上"))<<endl; cout<<"点p3: "<<p3; cout<<"点p3在圆c1之"<<((locate(p3, c1)>0)?

"外":((locate(p3, c1)<0)?

"内":"上"))<<endl; cout<<endl; cout<<"圆c1: "<<c1; if(c1>c2) cout<<"大于"<<endl; if(c1<c2) cout<<"小于"<<endl; if(c1>=c2) cout<<"大于等于"<<endl; if(c1<=c2) cout<<"小于等于"<<endl; if(c1==c2) cout<<"等于"<<endl; if(c1!=c2) cout<<"不等于"<<endl; cout<<"圆c2: "<<c2; cout<<endl; system("pause"); }


运行结果


原文地址:https://www.cnblogs.com/lytwajue/p/6993796.html