類的基本操作,運算子過載01(C++)
阿新 • • 發佈:2019-01-06
在 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; }