在 E08 圆形类的基础上,完成如下功能:
a) 定义加法运算,规则:两圆之和为一个新的圆,圆心是第一个操作数的圆心(如a+b,则 a 的圆心为 a+b 的圆心),半径为两圆半径之和。加法运算不改变操作数。
b) 定义减法运算,规则:两圆之差为一个新的圆,圆心是第一个操作数的圆心,面积为两圆面积之差的绝对值。减法运算不改变操作数。
c) 定义自增、自减运算(含前、后自增),对半径进行自增、自减运算。
d) 定义输出流运算,输出圆心坐标、半径、周长、面积。
e) 定义>、<运算,比较两圆的面积之间的大小关系。
f) 定义==、!=运算,比较两圆是否是完全相同的圆。
g) 定义&运算,确定两圆是否同心。
h) 定义|运算,确定两圆的位置关系(相交、相切、相离、包含)。
i) 编写主函数,任意生成若干圆,分别测试上述功能。
j) 提示:可自行决定是否需要增加圆的属性。但是,不提倡为了简化函数的计算而无原则地增加属性。这样做在给某些计算带来方便的同时,也可能会使另外一些计算变复杂。如:在记录半径的情况下,再记录周长和面积,可以简化某些运算符重载函数的代码。但是,半径与周长、面积之间有确定的约束关系需要遵守。所以,增加了面积和周长属性后,改变其中任意一项的值都意味着需要重新计算另外两项的值,否则就会产生数据的不一致
/*==================================================================================
*学号:1527403059
*作业:E10
*功能:在E08 圆形类的基础上,完成如下功能:
a) 定义加法运算,规则:两圆之和为一个新的圆,圆心是第一个操作数的圆心(如
a+b,则a 的圆心为a+b 的圆心),半径为两圆半径之和。加法运算不改变操作
数。
b) 定义减法运算,规则:两圆之差为一个新的圆,圆心是第一个操作数的圆心,
面积为两圆面积之差的绝对值。减法运算不改变操作数。
c) 定义自增、自减运算(含前、后自增),对半径进行自增、自减运算。
d) 定义输出流运算,输出圆心坐标、半径、周长、面积。
e) 定义>、<运算,比较两圆的面积之间的大小关系。
f) 定义==、!=运算,比较两圆是否是完全相同的圆。
g) 定义&运算,确定两圆是否同心。
h) 定义|运算,确定两圆的位置关系(相交、相切、相离、包含)。
i) 编写主函数,任意生成若干圆,分别测试上述功能。
*作者:陆胤任
*日期:2016.4.18
*==============================================================================*/
#include<iostream>
#include<math.h>
#define Pi 3.14159f;
using namespace std;
class Circle //定义类
{
private:
float x,y,r;
public:
void set(float a,float b,float c){x=a,y=b,r=c;}
float cal_s()const;
float cal_c()const;
Circle& operator+(Circle &rhs);
Circle& operator-(Circle &rhs);
Circle &operator++();
Circle operator++(int);
Circle &operator--();
Circle operator--(int);
friend bool operator<(const Circle& a,const Circle& b);
friend bool operator>(const Circle& a,const Circle& b);
friend bool operator==(const Circle& a,const Circle& b);
friend bool operator!=(const Circle& a,const Circle& b);
friend bool operator&(const Circle& a,const Circle& b);
friend bool operator|(const Circle& a,const Circle& b);
friend ostream &operator<<(ostream &o,const Circle &t);
};
float Circle::cal_s()const //计算圆面积的成员函数
{
float C=this->r;
return C*C*Pi
}
float Circle::cal_c()const //计算圆周长的成员函数
{
float C=this->r;
return C*2*Pi;
}
Circle& Circle::operator+(Circle &rhs) //两圆相加
{
r+=rhs.r;
return *this;
}
Circle& Circle::operator-(Circle &rhs) //两圆相减
{
r=sqrt(fabs(r*r-rhs.r*rhs.r));
return *this;
}
Circle& Circle::operator++() //圆自增(前)
{
++r;
return *this;
}
Circle Circle::operator++(int) //圆自增(后)
{
Circle ret=*this;
++r;
return ret;
}
Circle& Circle::operator--() //圆自减(前)
{
--r;
return *this;
}
Circle Circle::operator--(int) //圆自减(后)
{
Circle ret=*this;
--r;
return ret;
}
bool operator<(const Circle& a,const Circle& b) //判断两圆面积的大小
{
return a.r<b.r;
}
bool operator>(const Circle& a,const Circle& b) //判断两圆面积的大小
{
return a.r>b.r;
}
bool operator==(const Circle& a,const Circle& b) //判断两圆是否是相同的圆
{
if((a.x!=b.x)||(a.y!=b.y)||(a.r!=b.r))
{
return false;
}
else
{
return true;
}
}
bool operator!=(const Circle& a,const Circle& b) //判断两圆是否是相同的圆
{
return !(a==b);
}
bool operator&(const Circle& a,const Circle& b) //判断两圆是否同心
{
if((a.x==b.x)&&(a.y==b.y))
{
return true;
}
else
{
return false;
}
}
bool operator|(const Circle& a,const Circle& b) //判断两圆的位置关系
{
float d1=sqrt((a.x-b.x)*(a.x-b.x)-(a.y-b.y)*(a.y-b.y));
float d2=fabs(a.r-b.r);
float d3=a.r+b.r;
if(a&b)
{
cout<<"两圆包含"<<endl;
}
if(d1==d3)
{
cout<<"两圆相外切"<<endl;
}
if((d1>d2)&&(d1<d3))
{
cout<<"两圆相交"<<endl;
}
if(d1==d2)
{
cout<<"两圆相内切"<<endl;
}
if(d1>d3)
{
cout<<"两圆相离"<<endl;
}
return true;
}
ostream &operator<<(ostream &o,const Circle &t) //定义输出流运算
{
o<<"圆心为:"<<t.x<<" "<<t.y<<" "<<"圆半径为:"<<t.r<<" "<<"圆周长为:"<<t.cal_c()<<" "<<"圆面积为:"<<t.cal_s()<<endl;
return o;
}
int main()
{
float x1,y1,r1,x2,y2,r2;
Circle a,b;
//输入两圆的数据,包括圆心和半径
cout<<"请输入第一个圆的圆心和半径"<<endl;
cin>>x1>>y1>>r1;
a.set(x1,y1,r1);
cout<<"请输入第二个圆的圆心和半径"<<endl;
cin>>x2>>y2>>r2;
b.set(x2,y2,r2);
//两圆相加
cout<<"两圆相加:"<<endl;
cout<<a+b;
//两圆相减
cout<<"两圆相减:"<<endl;
cout<<a-b;
//前自增
cout<<"圆递增(前置):"<<endl;
cout<<++a;
//后自增
cout<<"圆递增(后置):"<<endl;
cout<<a++;
//前自减
cout<<"圆递减(前置):"<<endl;
cout<<--a;
//后自减
cout<<"圆递减(后置):"<<endl;
cout<<a--;
//判断两圆面积的大小
if(a>b)
{
cout<<"第一个圆比第二个圆大"<<endl;
}
else if(a<b)
{
cout<<"第一个圆比第二个圆小"<<endl;
}
else
{
cout<<"两个圆一样大"<<endl;
}
//判断两圆是否相同
if(a==b)
{
cout<<"两圆相同"<<endl;
}
else
{
cout<<"两圆不相同"<<endl;
}
//判断两圆是否同心
if(a&b)
{
cout<<"两圆同心"<<endl;
}
else
{
cout<<"两圆不同心"<<endl;
}
//判断两圆的位置关系
a|b;
return 0;
}