第十三週專案二圓的比較
阿新 • • 發佈:2019-01-11
/* * Copyright (c) 2014, 煙臺大學計算機學院 * All rights reserved. * 作 者:紀麗娜 * 完成日期:2014 年05月25日 * 版 本 號:v1.0 * 問題描述: * 在專案1的基礎上, 在圓類上過載關係運算符(6種), 使之能夠按圓的面積比較兩個圓的大小。 自編main函式完成測試。 */ #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 ( ) 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 &); protected: double radius; }; //計算圓面積 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) { double ds; Point p2(c.x,c.y); ds=p2.distance(p)-c.radius; if(ds==0) { return 0; } else if(ds<0) { return -1; } else { return 1; } } //過載關係運算符(種)運算子,使之能夠按圓的面積比較兩個圓的大小; bool Circle::operator>(const Circle &c) { return (this->radius - c.radius) > 0; } bool Circle::operator<(const Circle &c) { return (c.radius - this->radius) > 0; } 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 (this->radius-c.radius)==0; } bool Circle::operator!=(const Circle &c) { return !(*this==c); } 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; cout<<"圓c2: "<<c2<<endl; cout<<"c1與c2的關係是:\n"; 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; return 0; }