如何使用负值或零值格式化复数输出

时间:2013-04-19 04:56:47

标签: c++ visual-c++

我需要编写一个程序,从用户那里获取两个复数并输出它们的区别。复数是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。我怎样才能解决这个问题?

  3. 请知道如何克服这些问题。感谢。

3 个答案:

答案 0 :(得分:4)

您只需针对这些特殊情况进行show()方法测试并明确处理它们。

  • 如果其中一个组件为零,则仅显示另一个组件(并且不显示+)。
  • 如果两者均为零,则显示零。
  • 如果虚部为负数,请勿显示+
  • 正如Jan Hudec提到,如果某些东西足够接近零,它将打印为零,你可能也想确保将它视为零。

这没有捷径;只需在其中添加一些if语句。

(我假设你这样做是出于教育目的,但如果没有,你应该知道complex numbers are part of the C++ standard library。)

答案 1 :(得分:0)

您可以像这样重写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;
    }

这样,所有正值都将以前导“+”符号显示,否则将以“ - ”符号显示。祝好运! :)

答案 2 :(得分:0)

在C中,您可以使用+标志强制+或 - 对数字进行签名。对于流,您需要自己处理这种情况。没有什么比简单的功能更容易了:

这是模板化版本,适用于任何实现&lt;运算符和&lt;&lt;操作者:

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;}