簡體   English   中英

如何使用負值或零值格式化復數輸出

[英]How to format complex number output with negative or zero values

請我編寫一個程序,該程序需要用戶輸入兩個復數並輸出它們的差。 復數是a + bi形式的那些數字,其中a和b是分別稱為實部和虛部的實數。 因此,兩個復數a1 + b1i和a2 + b2i之差為(a1-a2)+(b1-b2)i。 我寫的代碼是

#include<iostream>
using namespace std;

class cmp {
    private:
        double re, im;
    public:
        cmp(double a, double b) {re=a; im=b;}
        friend cmp operator+(cmp&, cmp&);
        void show() {cout<<re<<" + "<<im<<"i"<<endl;}
};

cmp operator+(cmp& p, cmp& q) {return cmp (p.re-q.re, p.im-q.im);}

main() {
    double m1, n1, m2, n2;
    cout<<"Give two complex numbers: "; cin>>m1>>n1; cout<<endl;
    cout<<"Give another two complex numbers: "; cin>>m2>>n2; cout<<endl;
    cmp c1(m1,n1);
    cmp c2(m2,n2);
    cmp c3=c1+c2;
    c3.show();

    system("PAUSE");
}

但是,當您查看差異(a1-a2)+(b1-b2)i時,如果

  1. b2> b1,則差分中的虛部將為負。 例如(10.5 + 2i)-(5 + 4i)= 5.5-2i。 但是,該程序無法顯示該內容,而是顯示5 + -2i。 我的程序如何采用常規數學格式?

  2. a1 = a2和/或b1 = b2,程序中顯示的0與數學中的常用格式不同。 例如,數學上,(4 + 7i)-(4 + 5i)=(4-4)+(7-5)i = 2i。 但是此程序將顯示0 + 2i。 我也該如何解決這個問題?

請我提供有關如何克服這些困難的線索。 謝謝。

您只需要對這些特殊情況進行show()方法測試,並進行顯式處理即可。

  • 如果組件之一為零,則僅顯示另一組件(不顯示+ )。
  • 如果兩者均為零,則顯示零。
  • 如果虛部為負,則不顯示+
  • 正如Jan Hudec所提到的 ,如果某個東西足夠接近零以至於將其打印為零,那么您可能還要確保將其視為零。

沒有捷徑可走。 只是在其中放一些if語句。

(我假設您這樣做是出於教育目的,但如果不是,則應注意, 復數是C ++標准庫的一部分 。)

您可以像這樣重寫show函數

void show() {cout<<"("<<re<<") + ("<<im<<"i"<<")"<<endl;}

(以便顯示括號以使結果清晰可見)

或者你可以這樣

    void show()
    {
        if (re==0 && im>0)
            cout<<re<<" + "<<im<<"i"<<endl;
        else if (re==0 && im<0)
            cout<<re<<" "<<im<<"i"<<endl;
        else if(im==0 && re>0)
            cout<<re<<" + "<<im<<"i"<<endl;
        else if(im==0 && re<0)
            cout<<re<<" + "<<im<<"i"<<endl;
        else
            cout<<re<<" + "<<im<<"i"<<endl;
    }

這樣,所有正值將以“ +”號開頭,而負號將始終以“-”號開頭。 祝好運! :)

在C語言中,您可以使用+標志來強制+或-登錄數字。 對於流,您需要自己處理情況。 使簡單的功能更容易實現:

這是模板版本,可用於實現<運算符和<<運算符的任何東西:

template <typename T>
std::string forceSign(T number){
 std::string ret;
 std::stringstream helper;
 ret=(number<0)?'-':((0<number)?'+':'\0');
 helper<<number;
 helper>>ret;
 return ret
}

然后,您可以使用:

void show() {cout<<re<<" "<<forceSign(im)<<"i"<<endl;}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM