1. 程式人生 > >類的基本操作,運算子過載01(C++)

類的基本操作,運算子過載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;
}