十二周任务四

/* (程序头部注释开始)
* 程序的版权和版本声明部分
* Copyright (c) 2011, 烟台大学计算机学院学生 
* All rights reserved.
* 文件名称:类的组合与继承

* 作    者:         张艳明                  
* 完成日期:     2012    年 05  月  08 日
* 版 本 号:       V1.0   
* 对任务及求解方法的描述部分
* 输入描述:由下面派生类Student1对基类Student的继承…… 
* 问题描述:(1)先建立一个Point(点)类,包含数据成员x,y(坐标点);(2)以Point为基类,派生出一个Circle(圆)类,增加数据成员(半径),基类的成员表示圆心;(3)编写上述两类中的构造、析构函数及必要的输入输出函数(4)定义友元函数int locate,判断点p在圆c上、圆c内或圆c外,返回值<0圆内,==0圆上,>0 圆外;(5)重载关系运算符(6种)运算符,使之能够按圆的面积比较两个圆的大小;(6)给定一点p,求出该点与圆心相连成的直线与圆的两个交点并输出//自行定义类


* 程序输出:

* 程序头部的注释结束

*/

public:  
    Circle(double x=0,double y=0,double r=0); //构造函数  
    double area ( ) const; //计算圆面积  
    friend ostream &operator<<(ostream &,const Circle &);//重载运算符“<<”  
    friend int locate(const Point &p, const Circle &c); //判断点p在圆上、圆内或圆外,返回值:<0圆内,==0圆上,>0 圆外  
    //重载关系运算符(种)运算符,使之能够按圆的面积比较两个圆的大小;  
    bool operator>(const Circle &);  
    bool operator<(const Circle &);  
    bool operator>=(const Circle &);  
    bool operator<=(const Circle &);  
    bool operator==(const Circle &);  
    bool operator!=(const Circle &);  
    //给定一点p,求出该点与圆c的圆心相连成的直线与圆的两个交点p1和p2(为了带回计算结果,p1和p2需要声明为引用)  
    friend void crossover_point(Point &p,Circle &c, Point &p1,Point &p2 ) ;  
protected:  
    double radius;  
};  
  
//定义构造函数,对圆心坐标和半径初始化  
Circle::Circle(double a,double b,double r):Point(a,b),radius(r){ }  
  
//计算圆面积  
double Circle::area( ) const  
{  
    return 3.14159*radius*radius;  
}  
  
//重载运算符“<<”,使之按规定的形式输出圆的信息  
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;  //圆外  
}  
  
//重载关系运算符(种)运算符,使之能够按圆的面积比较两个圆的大小;  
bool Circle::operator>(const Circle &c)  
{  
    return (this->radius - c.radius) > 1e-7;  
}  
  
bool Circle::operator<(const Circle &c)  
{  
    return (c.radius - this->radius) > 1e-7;  
}  
  
bool Circle::operator>=(const Circle &c)  
{  
    return !(*this < c);  
}  
  
bool Circle::operator<=(const Circle &c)  
{  
    return !(*this > c);  
}  
  
bool Circle::operator==(const Circle &c)  
{  
    return abs(this->radius - c.radius) < 1e-7;  
}  
  
bool Circle::operator!=(const Circle &c)  
{  
    return abs(this->radius - c.radius) > 1e-7;  
}  
  
//给定一点p,求出该点与圆c的圆心相连成的直线与圆的两个交点p1和p2(为了带回计算结果,p1和p2需要声明为引用)  
void crossover_point(Point &p, Circle &c, Point &p1,Point &p2 )  
{  
    p1.setx (c.getx() + sqrt(c.radius*c.radius/(1+((c.gety()-p.gety())/(c.getx()-p.getx()))*((c.gety()-p.gety())/(c.getx()-p.getx())))));  
    p2.setx (c.getx() - sqrt(c.radius*c.radius/(1+((c.gety()-p.gety())/(c.getx()-p.getx()))*((c.gety()-p.gety())/(c.getx()-p.getx())))));  
    p1.sety (p.gety() + (p1.getx() -p.getx())*(c.gety()-p.gety())/(c.getx()-p.getx()));  
    p2.sety (p.gety() + (p2.getx() -p.getx())*(c.gety()-p.gety())/(c.getx()-p.getx()));  
}  
  
int 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: "<<c1;  
    cout<<endl;   
  
    Point p4,p5;  
    crossover_point(p1,c1, p4, p5);  
  
    cout<<"点p1: "<<p1;  
    cout<<"与圆c1: "<<c1;  
    cout<<"的圆心相连,与圆交于两点,分别是:"<<endl;  
    cout<<"交点: "<<p4;  
    cout<<"交点: "<<p5;  
    cout<<endl;   
  
    system("pause");  
    return 0;  
}  

运行结果:


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值