如何在 Class/Object C++ 中使用复数
How to use Complex numbers in Class/Object C++
我正在努力将复数实现到我的代码中。当我编译时,它会给我随机数。它应该使用虚数 i = sqrt(-1)。它应该输出 realPart + imaginaryPart * i.
#include <iostream>
#include <complex>
using namespace std;
class Complex
{
private:
double i;
complex<double> imaginarypart = i*sqrt(1);
double realpart;
public:
void seti(double a1) {
i = a1;
}
void setrealpart(double a2) {
realpart = a2;
}
void printwhole() {
cout << realpart + imaginarypart;
}
};
int main()
{
double a, b;
cout << "Enter your realpart" << endl;
cin >> a;
cout << "Enter your imaginarypart " << endl;
cin >> b;
Complex num1;
num1.seti(b);
num1.setrealpart(a);
cout << endl;
num1.printwhole();
}
关键是 double 类型不能存储虚数值。
但是您尝试这样做,例如与 sqrt(1);
(虽然你可能意味着 -1)。
complex<double>
确实能够存储虚数值,但一方面它不会通过将未初始化的 i
的乘积分配给 1 来工作,另一方面你似乎试图自己实现复数。使用提供的复杂标准类型在某种程度上破坏了这一点。如果你使用它,那么你只需要学会以你想要的格式输出它,而不是做所有的实现工作。
假设您更有兴趣先自己完成。
您需要做的是始终将复数表示为两个数字。
因此,我建议像这样更改您的代码。
#include <iostream>
using namespace std;
class Complex
{
private:
/* double i; Won't work, it cannot store imaginary values. */
double imaginarypart;
double realpart;
public:
void setimaginarypart(double a1) {
imaginarypart = a1;
}
void setrealpart(double a2) {
realpart = a2;
}
void printwhole() {
cout << realpart << '+' << imaginarypart << 'i'; // To get the output you want.
}
};
int main()
{
double a, b;
cout << "Enter your realpart" << endl;
cin >> a;
cout << "Enter your imaginarypart " << endl;
cin >> b;
Complex num1;
num1.setimaginarypart(b);
num1.setrealpart(a);
cout << endl;
num1.printwhole();
}
或者使用现有的解决方案(例如 std::complex),而不是尝试自己编写一个。以你想要的形状输出它们 (r+i*I) 不需要你自己实现整个事情。
查看 https://en.cppreference.com/w/cpp/numeric/complex 了解它提供的内容。
如您所知,复数具有实部和虚部。在 std::complex<double>
中,这两个部分合并在一起。
但是在您的 class Complex
中,您有 Complex::i
、Complex::realpart
、Complex::imaginarypart::real()
和 Complex::imaginarypart::imag()
。那是 4 个部分!
此外,complex<double> imaginarypart = i*sqrt(1);
表示在创建Complex
对象时将Complex::imaginarypart
设置为i*sqrt(1)
。但是那个时候,i
还没有初始化!所以那也行不通。这就是为什么你得到随机数(或崩溃,取决于你的运气)。
简单的解决方案是放弃整个 class Complex
。 std::complex<double>
已经有设置实部和虚部的函数,即std::complex<double>::real(double)
和std::complex<double>::imag(double)
(注意:real
和 imag
如果你传递一个值,则为 setter,否则为 getter。
我正在努力将复数实现到我的代码中。当我编译时,它会给我随机数。它应该使用虚数 i = sqrt(-1)。它应该输出 realPart + imaginaryPart * i.
#include <iostream>
#include <complex>
using namespace std;
class Complex
{
private:
double i;
complex<double> imaginarypart = i*sqrt(1);
double realpart;
public:
void seti(double a1) {
i = a1;
}
void setrealpart(double a2) {
realpart = a2;
}
void printwhole() {
cout << realpart + imaginarypart;
}
};
int main()
{
double a, b;
cout << "Enter your realpart" << endl;
cin >> a;
cout << "Enter your imaginarypart " << endl;
cin >> b;
Complex num1;
num1.seti(b);
num1.setrealpart(a);
cout << endl;
num1.printwhole();
}
关键是 double 类型不能存储虚数值。
但是您尝试这样做,例如与 sqrt(1);
(虽然你可能意味着 -1)。
complex<double>
确实能够存储虚数值,但一方面它不会通过将未初始化的 i
的乘积分配给 1 来工作,另一方面你似乎试图自己实现复数。使用提供的复杂标准类型在某种程度上破坏了这一点。如果你使用它,那么你只需要学会以你想要的格式输出它,而不是做所有的实现工作。
假设您更有兴趣先自己完成。
您需要做的是始终将复数表示为两个数字。
因此,我建议像这样更改您的代码。
#include <iostream>
using namespace std;
class Complex
{
private:
/* double i; Won't work, it cannot store imaginary values. */
double imaginarypart;
double realpart;
public:
void setimaginarypart(double a1) {
imaginarypart = a1;
}
void setrealpart(double a2) {
realpart = a2;
}
void printwhole() {
cout << realpart << '+' << imaginarypart << 'i'; // To get the output you want.
}
};
int main()
{
double a, b;
cout << "Enter your realpart" << endl;
cin >> a;
cout << "Enter your imaginarypart " << endl;
cin >> b;
Complex num1;
num1.setimaginarypart(b);
num1.setrealpart(a);
cout << endl;
num1.printwhole();
}
或者使用现有的解决方案(例如 std::complex),而不是尝试自己编写一个。以你想要的形状输出它们 (r+i*I) 不需要你自己实现整个事情。
查看 https://en.cppreference.com/w/cpp/numeric/complex 了解它提供的内容。
如您所知,复数具有实部和虚部。在 std::complex<double>
中,这两个部分合并在一起。
但是在您的 class Complex
中,您有 Complex::i
、Complex::realpart
、Complex::imaginarypart::real()
和 Complex::imaginarypart::imag()
。那是 4 个部分!
此外,complex<double> imaginarypart = i*sqrt(1);
表示在创建Complex
对象时将Complex::imaginarypart
设置为i*sqrt(1)
。但是那个时候,i
还没有初始化!所以那也行不通。这就是为什么你得到随机数(或崩溃,取决于你的运气)。
简单的解决方案是放弃整个 class Complex
。 std::complex<double>
已经有设置实部和虚部的函数,即std::complex<double>::real(double)
和std::complex<double>::imag(double)
(注意:real
和 imag
如果你传递一个值,则为 setter,否则为 getter。