【问题标题】:How to print complex numbers in C++如何在 C++ 中打印复数
【发布时间】:2019-10-21 14:23:02
【问题描述】:

我正在玩 C++ 中的类。目前我正在研究一个复数类,并希望能够以以下格式打印它们:-2+3i1-4i。这意味着,如果它是负数,我希望实部只有一个符号。相反,无论是正数还是负数,虚部都应该有一个符号。

我尝试了以下方法,但没有按预期工作:

inline void Complex::print() const {
    std::cout << x;
    std::cout << std::showpos << y << "i" << std::endl;
}

如果符号为正,此方法也会为实部打印符号。为什么std::showpos会影响第一行?

有没有更好的方法来做到这一点?

【问题讨论】:

  • 使用几个 if 语句。 if (real &lt; 0) 等旁注:与其调用组件xy,不如将​​它们称为realimaginary 更有意义,特别是因为这就是你在说话时所做的
  • 我假设您这样做是为了锻炼或由于缺乏所需的功能,如果不是,请注意 std::complex 存在。
  • 顺便说一句,已经有一个standard library for complex numbers
  • 我建议更改标题。问题似乎是关于打印符号而不是复数。如果是后者,则使用std::complex 将是可行的方法,并且当前的标题肯定会吸引寻求如何打印std::complex 的用户

标签: c++


【解决方案1】:

showpos 是“粘性的”,适用于后面的每个数字,直到它改回 noshowpos

您可以将showpos 与本地流一起使用,以避免与std::cout 混淆:

inline void Complex::print() const {
    std::ostringstream y_stream;
    y_stream << showpos << y;
    std::cout << x 
              << y_stream.str() << 'i'
              << std::endl;
}

【讨论】:

  • 但是如果虚部是负数,这种方法会打印出1--2i,对吧?
  • @Samuel 是的,我太快了,虽然太少了。
【解决方案2】:

当设置了 showpos 格式标志时,一个加号 (+) 在插入到流中的每个非负数值之前(包括零)。可以使用 noshowpos 操纵器取消设置此标志。

代码中的微小变化:

inline void Complex::print() const {
    std::cout << std::noshowpos << x;
    std::cout << std::showpos << y << "i" << std::endl;
}

【讨论】:

    【解决方案3】:

    这是因为std::showpos 标志会影响插入到流中的每个数字。 (http://www.cplusplus.com/reference/ios/showpos/)

    您是否尝试过使用if 语句?

    if (x > 0)
    {
        std::cout << "+";
    }
    

    【讨论】:

      【解决方案4】:

      如果您从不使用 std::noshowposstd::cout 将保留 showpos 标志,以便下次您调用 print() 时,它会影响 x(以及您在您的程序)。

      所以要么在打印y后直接使用std::noshowpos

      std::cout << std::showpos << y << std::noshowpos << "i" << std::endl;
      

      或直接在打印之前x:

      std::cout << std::noshowpos << x;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-23
        • 1970-01-01
        • 2018-08-27
        相关资源
        最近更新 更多