类的基本操作,运算符重载01(C++)

在 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;
}

猜你喜欢

转载自blog.csdn.net/ukco_well/article/details/82219215