參考連結: C++程式使用運算符重載減去複數
使用重載運算符實作一個複數類
實驗目的: 1.掌握用成員函數重載運算符的方法 2.掌握用友元函數重載運算符的方法
實驗要求:
定義一個複數類,描述一些必須的成員函數,如:構造函數,析構函數,指派函數,傳回資料成員值的函數等。定義運算符重載函數,通過重載運算符:+,-,,/,直接實作二個複數之間的加減乘除運算。編寫一個完整的程式,測試重載運算符的正确性。要求乘法“+”,“”用友元函數實作重載,除法“-”,“/”用成員函數實作重載,參數是複數或實數。通過重載運算符:>>,<<,=,直接實作複數的輸入、輸出及指派運算,通過重載運算符:= =,!=直接實作複數的比較運算,編寫一個完整的程式,測試重載運算符的正确性。
操作菜單可參考如下格式: 1.輸入複數 2.檢視輸入的複數 3.複數相加 4.複數相減 5.複數相乘 6.複數相除 7.輸出結果 0.退出
#include <iostream>
using namespace std;
class Complex{//複數類
public:
Complex(double r=0,double i=0){//構造函數
re=r;
im=i;
}
//~Complex();//析構函數
friend Complex operator+(Complex &c1,Complex &c2);//用友元函數實作重載
friend Complex operator*(Complex &c1,Complex &c2);//用友元函數實作重載
Complex operator-(Complex &c);//用成員函數實作重載
Complex operator/(Complex &c);//用成員函數實作重載
friend istream& operator>>(istream &in, Complex &c);
//需要通路private成員變量,是以聲明為complex類的友元函數
friend ostream& operator<<(ostream &out, Complex &c);
friend bool operator==(Complex &c1,Complex &c2);
friend bool operator!=(Complex &c1,Complex &c2);
private:
double re;//複數實部
double im;//複數虛部
};
//重載+運算符
Complex operator+(Complex &c1,Complex &c2)
{
Complex c;
c.re=c1.re+c2.re;
c.im=c1.im+c2.im;
return Complex(c.re,c.im);
}
//重載*運算符 (a+bi) * (c+di) = (ac-bd) + (bc+ad)i
Complex operator*(Complex &c1,Complex &c2)
{
Complex c;
c.re=c1.re*c2.re-c1.im*c2.im;
c.im=c1.im*c2.re+c1.re*c2.im;
return Complex(c.re,c.im);
}
//重載-運算符
Complex Complex::operator-(Complex &c)
{
return Complex(re-c.re,im-c.im);
}
//重載/運算符
//(a+bi)/(c+di)=((ac+bd)/(c*c+d*d))+((bc-ad)/(c*c+d*d))i
Complex Complex::operator/(Complex &c)
{
double r,i;
r=(re*c.re+im*c.im)/(c.re*c.re+c.im*c.im);
i=(im*c.re-re*c.im)/(c.re*c.re+c.im*c.im);
return Complex(r,i);
}
//重載輸入運算符
istream & operator>>(istream &in,Complex &c)
{
cout<<"請輸入實部:"<<endl;
in>>c.re;
cout<<"請輸入虛部:"<<endl;
in>>c.im;
return in;
}
//重載輸出運算符
ostream & operator<<(ostream & out,Complex &c)
{
if(c.re==0&&c.im!=0)
{
if(c.im==1)
{
out<<"i"<<endl;
}
else if(c.im==-1)
{
out<<"-i"<<endl;
}
else
{
out<<c.im<<"i"<<endl;
}
}
else if(c.re!=0&&c.im==0)
{
out<<c.re<<endl;
}
else if(c.re==0&&c.im==0)
{
out<<"0"<<endl;
}
else if(c.re!=0&&c.im!=0)
{
if(c.im<0)
{
if(c.im==-1)
{
out<<c.re<<"-i"<<endl;
}
else
{
out<<c.re<<c.im<<"i"<<endl;
}
}
else if(c.im>0)
{
if(c.im==1)
{
out<<c.re<<"+"<<"i"<<endl;
}
else
{
out<<c.re<<"+"<<c.im<<"i"<<endl;
}
}
}
return out;
}
//重載==運算符
bool operator ==(Complex &c1,Complex &c2)
{
if(c1.re==c2.re&&c1.im==c2.im)
{
return true;
}
else
{
return false;
}
}
//重載!=運算符
bool operator !=(Complex &c1,Complex &c2)
{
if(c1.re!=c2.re||c1.im!=c2.im)
{
return true;
}
else
{
return false;
}
}
//菜單
int Menu()
{
int t;
cout<<"==================================="<<endl;
cout<<" 1.輸入複數"<<endl;
cout<<" 2.檢視輸入的複數"<<endl;
cout<<" 3.複數相加"<<endl;
cout<<" 4.複數相減"<<endl;
cout<<" 5.複數相乘"<<endl;
cout<<" 6.複數相除"<<endl;
cout<<" 7.輸出結果"<<endl;
cout<<" 0.退出"<<endl;
cout<<"=================================="<<endl;
cout<<"請選擇(0-7):";
while(1)
{
cin >> t;
if(t >= 0 && t <= 7)
break;
else
{
cout << "該選項不在目錄中,請重新輸入!" << endl;
continue;
}
}
return t;
}
int main()
{
Complex c1,c2,c3;
int i=1;
while(i!=0)
{
i=Menu();
if(i==1)
{
cout<<"請輸入一個複數:"<<endl;
cin>>c1;
}
else if(i==2)
{
cout<<c1;
}
else if(i==3)
{
cout<<"第一個複數為:"<<endl;
cout<<c1;
cout<<"輸入一個複數與之相加:"<<endl;
cin>>c2;
cout<<"第二個複數為:"<<endl;
cout<<c2;
c3=c1+c2;
}
else if(i==4)
{
cout<<"第一個複數為:"<<endl;
cout<<c1;
cout<<"輸入一個複數與之相減:"<<endl;
cin>>c2;
cout<<"第二個複數為:"<<endl;
cout<<c2;
c3=c1-c2;
}
else if(i==5)
{
cout<<"第一個複數為:"<<endl;
cout<<c1;
cout<<"輸入一個複數與之相乘:"<<endl;
cin>>c2;
cout<<"第二個複數為:"<<endl;
cout<<c2;
c3=c1*c2;
}
else if(i==6)
{
cout<<"第一個複數為:"<<endl;
cout<<c1;
cout<<"輸入一個複數與之相除:"<<endl;
cin>>c2;
cout<<"第二個複數為:"<<endl;
cout<<c2;
c3=c1/c2;
}
else if(i==7)
{
cout<<"運算結果為:"<<endl;
cout<<c3;
}
else if(i==0)
break;
}
return 0;
}