天天看點

使用重載運算符實作一個複數類(C++實驗十)

參考連結: 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;

}