zoukankan      html  css  js  c++  java
  • 继承的综合运用《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"); }


    运行结果


  • 相关阅读:
    微软开源Counterfit,用于AI系统安全测试的自动化工具
    吴恩达教你如何读论文:绘制进度表格,论文至少看三遍,还要问自己问题
    前帝国理工金融数学PhD易聪先生的书单
    以机器学习的视角来看时序点过程的最新进展
    文献阅读第一利器:文献笔记法(Literature Notes)
    死磕论文前,不如先找齐一套好用的工具
    后悔没早点认识论文工具大盘点!
    写论文、搞科研、读大学必备的28款软件。
    2-1-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)-基础外设例程-工程模板使用说明
    1-HC32F460(华大)+BC260Y(NB-IOT)基本控制篇(自建物联网平台)--硬件使用说明
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6993796.html
Copyright © 2011-2022 走看看