2

请我需要编写一个程序,从用户那里获取两个复数并输出它们的差。复数是 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。我该如何解决这个问题?

请我需要一个关于如何克服这些的线索。谢谢。

4

3 回答 3

4

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

  • 如果其中一个组件为零,则仅显示另一个(并且不显示+)。
  • 如果两者都为零,则显示为零。
  • +如果虚部为负,则不显示。
  • 正如 Jan Hudec 所提到的,如果某些东西足够接近于零以至于它将打印为零,那么您可能还想确保将其视为零。

没有捷径可走;只是在那里放一些if陈述。

(我假设您这样做是出于教育目的,但如果不是,您应该知道复数是 C++ 标准库的一部分。)

于 2013-04-19T06:00:39.503 回答
0

在 C 语言中,您可以使用+flag 强制 + 或 - 登录数字。对于流,您需要自己处理这种情况。制作简单的功能没有什么比这更容易的了:

这是适用于任何实现 < 运算符和 << 运算符的模板版本:

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;}
于 2013-04-19T08:26:12.237 回答
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;
    }

这样,所有正值都将显示为前导“+”号,而负值将显示为“-”号。祝你好运!:)

于 2013-04-19T06:10:00.693 回答