Как использовать Комплексные числа в Классе / Объекте C ++ - PullRequest
1 голос
/ 10 марта 2020

Я изо всех сил пытаюсь внедрить комплексные числа в мой код. Когда я компилирую, это дает мне случайные числа. Следует использовать мнимое число i = sqrt (-1). Он должен вывести realPart + imaaryPart * 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();
}

Ответы [ 2 ]

2 голосов
/ 10 марта 2020

Дело в том, что тип 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, чтобы узнать, что он предлагает.

0 голосов
/ 10 марта 2020

Как вы поняли, комплексные числа имеют действительную и мнимую части. И в std::complex<double> эти две части объединены.

Но в вашем классе Complex у вас есть Complex::i, Complex::realpart, Complex::imaginarypart::real() и Complex::imaginarypart::imag(). Это 4 части!

Кроме того, complex<double> imaginarypart = i*sqrt(1); означает, что Complex::imaginarypart устанавливается на i*sqrt(1) при создании объекта Complex. Но в то время i все еще не инициализирован! Так что это тоже не сработает. Вот почему вы получаете случайные числа (или cra * sh, в зависимости от вашей удачи).

Простое решение - отбросить весь класс Complex. std::complex<double> уже имеет функции для установки действительной и мнимой частей, а именно std::complex<double>::real(double) и std::complex<double>::imag(double)

(Примечание: real и imag являются установщиками, если вы передаете значение, получателями, если вы не «т).

...