复数错误输出

Posted

技术标签:

【中文标题】复数错误输出【英文标题】:complex number wrong output 【发布时间】:2021-03-25 10:06:43 【问题描述】:

我用一个名为 Complex 的类使用以下方法编写此代码:

一个。 Complex() // 默认构造函数返回 0

b.复数(float im, float real)

c。 float getImaginary() 常量

d。 float getReal() 常量

e。复数 add(const Complex& rhs) const

f。复数减法(const Complex& rhs) const

g.复数乘法(const Complex& rhs) const

#include <iostream>
using namespace std;

class Complex 
    private:
        float real;
        float imaginary;
    public:
        Complex();
        Complex(float real=0, float im=0);
        float GetReal() const;
        float GetImaginary() const;
        Complex Add(const Complex &rhs) const;
        Complex Subtract(const Complex &rhs) const;
        Complex Multiply(const Complex &rhs) const;
        void SetReal(float r);
        void SetImaginary(float i);
;
    Complex::Complex()
    
        real=imaginary=0;
    

    Complex::Complex(float realpart, float imaginarypart) 
    
    SetReal(real);
    SetImaginary(imaginarypart);
    

    void Complex::SetReal(float r) 
    
    real = r;
    

    void Complex::SetImaginary(float i) 
    
        imaginary = i;
    

    float Complex::GetReal() const
    
        return real;
    

    float Complex::GetImaginary() const 
        return imaginary;
    

    Complex Complex::Add(const Complex &rhs) const 
    return Complex(GetReal() + rhs.GetReal(), GetImaginary() + rhs.GetImaginary());
    

    Complex operator+(const Complex &rhs1, const Complex &rhs2) 
    return rhs1.Add(rhs2);
    

    Complex Complex::Subtract(const Complex &rhs) const 
     
    return Complex(GetReal() - rhs.GetReal(), GetImaginary() - rhs.GetImaginary());
    

    Complex operator-(const Complex &rhs1, const Complex &rhs2) 
    
    return rhs1.Subtract(rhs2); 
    

    Complex Complex::Multiply(const Complex &rhs) const
    
    return Complex(GetReal() * rhs.GetReal(), GetImaginary() * rhs.GetImaginary());
    
Complex operator*(const Complex &rhs1, const Complex &rhs2) 
    
    return rhs1.Multiply(rhs2);
    

int main() 

    Complex c();
    Complex x(-2,4);
    Complex y(5,6);
    Complex z = x + y;
    cout << z.GetReal() << '+' << z.GetImaginary() << 'i' << endl;

       Complex e = x - y;
    cout << e.GetReal() << '+' << e.GetImaginary() << 'i' << endl;

    Complex r = x * y;
    cout << r.GetReal() << '*' << r.GetImaginary() << 'i' << endl;
    return 0;

但我把这些输出

8.99944e-039+10i

8.99944e-039+-2i

8.99944e-039*24i

有人可以帮我解决这个错误吗?

【问题讨论】:

int main() int x; int x; 出现同样的错误。同一范围内只能声明一个同名变量。你不明白错误在说什么吗? 是的,我听不懂,也无法修复,你能重写吗? 为什么你不能修复它?错误是关于具有相同名称的不同对象,您可以给它们不同的名称。或者,如果你真的想使用相同的 z 声明一次 那是一个不同的问题。您在此处提出的问题与您的 Complex 课程无关(正如我所写的,您会遇到与 int 相同的错误)。当您的 Complex 课程被破坏时,这是一个不同的问题。当你得到意想不到的输出时,你应该在问题中包括输入、输出和预期输出。 2 个复数相乘不是 real1*real2 + i * imag1*imag2。 【参考方案1】:

您的代码中有 3 个问题:

Complex::Complex(float realpart, float imaginarypart) 

    SetReal(realpart);
    SetImaginary(imaginarypart);

导致警告:

<source>:24:28: warning: unused parameter 'realpart' [-Wunused-parameter]
   24 |     Complex::Complex(float realpart, float imaginarypart)
      |    

通过将realpart 传递给SetReal 或者使用成员初始化列表来修复它:

Complex::Complex(float realpart, float imaginarypart) : real(realpart),imaginary(imaginarypart)

接下来,这个:

Complex c();

是最令人头疼的解析。它声明了一个名为c 的函数,不带参数并重新调整Complex。它没有声明Complex 类型的变量c。写

 Complex c;
 Complex c;

调用默认构造函数。但是,您的类有两个默认构造函数:

    Complex();  
    Complex(float real=0, float im=0);

默认构造函数是可以在没有参数的情况下调用的构造函数,这两种情况都是如此。因此,您目前不能默认构造 Complex,构造函数是模棱两可的。我读到您的作业要求您提供两个构造函数:

    Complex();  
    Complex(float real, float im);  // no defaults !!

然后您将能够通过Complex c;Complex c; 默认构造一个Complex(但不能通过Complex c();,因为那是一个函数声明)。

修复这些后,我得到了几乎合理的输出:https://godbolt.org/z/x4xG8xzTf

最后,您将两个复数相乘的公式是错误的。我会留给你解决它。

【讨论】:

我无法理解复杂 c;复杂的 c;并且将两个复数相乘是错误的。我的输出好吗?你能帮我更详细的吗? @MertEmreÖnen google:最令人头疼的解析。并尝试将ii 相乘,结果应该是-1,但你的结果是i 好吧,我用使用过的cout &lt;&lt; r.GetReal() &lt;&lt; '*' &lt;&lt; "-" &lt;&lt; r.GetImaginary() &lt;&lt; endl; 修复了 -1 @largest_prime_is_463035818,我用谷歌搜索了最令人头疼的解析,我认为对我来说并不重要,我只是 C++ 的初学者。 @MertEmreÖnen 请务必了解Complex c(); 是错误的,因为它没有按照您的想法进行操作。你并没有真正修复它,你只是通过打印不同的输出来作弊,即使这样输出也是错误的。 0+1i * 0+1i-1+0i 不是 0+-1i 如果我使用Complex cc(); 是真的吗?是的,你说得对,我找不到好的多路复用解决方案。

以上是关于复数错误输出的主要内容,如果未能解决你的问题,请参考以下文章

复数的反三角函数计算程序(复数以通用书写格式输入输出)

如何将波形数据转换为复数

c++简单复数计算器

蓝桥杯 算法提高 6-17复数四则运算

算法提高 6-17复数四则运算

1051. 复数乘法 (15)