簡體   English   中英

如何在 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> ,這兩個部分被組合在一起。

但是在您的類Complex ,您有Complex::iComplex::realpartComplex::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)

(注意:如果傳遞值,則realimag是 setter,如果不傳遞則是 getter)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM