复数错误输出
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:最令人头疼的解析。并尝试将i
与i
相乘,结果应该是-1
,但你的结果是i
好吧,我用使用过的cout << r.GetReal() << '*' << "-" << r.GetImaginary() << endl;
修复了 -1 @largest_prime_is_463035818,我用谷歌搜索了最令人头疼的解析,我认为对我来说并不重要,我只是 C++ 的初学者。
@MertEmreÖnen 请务必了解Complex c();
是错误的,因为它没有按照您的想法进行操作。你并没有真正修复它,你只是通过打印不同的输出来作弊,即使这样输出也是错误的。 0+1i * 0+1i
是 -1+0i
不是 0+-1i
如果我使用Complex cc();
是真的吗?是的,你说得对,我找不到好的多路复用解决方案。以上是关于复数错误输出的主要内容,如果未能解决你的问题,请参考以下文章