首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用负值或零值格式化复数输出

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

Stack Overflow用户
提问于 2013-04-19 04:56:47
回答 3查看 1.6K关注 0票数 2

请,我需要写一个程序,从用户接受两个复杂的数字,并输出他们的差异。复数是以a+bi的形式表示的数字,其中a和b分别是实数和虚部。因此,两个复数a1+b1i和a2+b2i的区别是(a1-a2)+(b1-b2)i。

代码语言:javascript
复制
#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而不是。我怎样才能解决这个问题呢?

拜托,我需要一个如何克服这些问题的线索。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2013-04-19 06:00:39

您只需要对这些特殊情况进行show()方法测试,并显式地处理它们。

  • 如果其中一个组件为零,则只显示另一个组件(而不显示+)。
  • 如果两者都为零,则显示零。
  • 如果假想部分为负值,不要显示+
  • 正如Jan所提到的,如果某物接近于零,它将打印为零,那么您可能也希望确保将其视为零。

这是没有捷径的;只需在其中放置一些if语句。

(我认为您这样做是为了教育目的,但如果不是,您应该注意到复数是C++标准库的一部分。。)

票数 4
EN

Stack Overflow用户

发布于 2013-04-19 06:10:00

要么您可以像这样重写显示函数

代码语言:javascript
复制
void show() {cout<<"("<<re<<") + ("<<im<<"i"<<")"<<endl;}

(以便显示括号以明确结果)

或者你可以这样做,

代码语言:javascript
复制
    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;
    }

这样,所有的正值都会用前导“+”符号显示,而负值也会用“-”符号显示。祝你好运!)

票数 0
EN

Stack Overflow用户

发布于 2013-04-19 08:26:12

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

下面是模板化的版本,用于实现< operator和<<运算符的任何操作:

代码语言:javascript
复制
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
}

然后,您可以使用:

代码语言:javascript
复制
void show() {cout<<re<<" "<<forceSign(im)<<"i"<<endl;}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16099027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档