[英]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>
,這兩個部分被組合在一起。
但是在您的類Complex
,您有Complex::i
、 Complex::realpart
、 Complex::imaginarypart::real()
和Complex::imaginarypart::imag()
。 這是4個部分!
此外, complex<double> imaginarypart = i*sqrt(1);
表示Complex::imaginarypart
在創建Complex
對象時設置為i*sqrt(1)
。 但當時, i
還沒有初始化! 所以這也行不通。 這就是為什么你會得到隨機數(或崩潰,取決於你的運氣)。
簡單的解決方案是刪除整個類Complex
。 std::complex<double>
已經有設置實部和虛部的函數,即std::complex<double>::real(double)
和std::complex<double>::imag(double)
(注意:如果傳遞值,則real
和imag
是 setter,如果不傳遞則是 getter)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.