операции с комплексными числами в C++


#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

class Complex {
private:
    double Rez, Imz, ro, fi;

public:
    Complex() {
        Rez = 0.;
        Imz = 0.;
        ro = 0.;
    fi = 0.;
}

Complex(double x, double y) {
    Rez = x;
    Imz = y;
    ro = sqrt(pow(x,2)+pow(y,2));
    fi = atan(y/x);
 }

~Complex() {}

double get_Rez() {return Rez;} 
double get_Imz() {return Imz;} 
double get_ro() {return ro;} 
double get_fi() {return fi;}

void set_Rez(double a) {Rez = a; ro = sqrt(pow(Rez,2)+pow(Imz,2)); fi = acos(Rez/ro);}
void set_Imz(double a) {Imz = a; ro = sqrt(pow(Rez,2)+pow(Imz,2)); fi = acos(Rez/ro);}
void set_ro(double a) {ro = a; Rez = ro*cos(fi); Imz = ro*sin(fi);}
void set_fi(double a) {fi = a; Rez = ro*cos(fi); Imz = ro*sin(fi);}

Complex & inverso() {       
    this->set_Rez(this->get_Rez()/pow(this->get_ro(),2));
    this->set_Imz(-this->get_Imz()/pow(this->get_ro(),2));
    return *this;
}

};

Эти две функции для работы с комплексными числами. Можно ли менять их, чтобы заставить их принять служит также в качестве входных? В таком случае, можно ли заставить их дать как выходной? Правильно ли говорить, что в мои функции нет побочных эффектов? Было бы лучше поставить функции в классе в качестве членов данных?

Complex somma(Complex a, Complex b) {
    Complex c;
    c.set_Rez(a.get_Rez()+b.get_Rez());
    c.set_Imz(a.get_Imz()+b.get_Imz());
    return c;
}

Complex prodotto(Complex a, Complex b) {
    Complex c;
    c.set_ro(a.get_ro()*b.get_ro());
    c.set_fi(a.get_fi()+b.get_fi());
    return c;
}


Комментарии
1 ответ

Комплекс класса количество очень полезной! Это довольно просто и легко понять,.

Класс

Во-первых, я должен отметить, что если вы еще не видели, есть complex класс В стандартную библиотеку шаблонов. Это здорово, чтобы сделать свой собственный, так что вы можете узнать, как это работает, но просто хотел упомянуть его в случае, если вы пропустили его.

Я думаю, имея 2 способа использования данных (реальных и мнимых частей и величина и угол) - это отличная идея. Тем не менее, я буду держать только одну пару вокруг и имеют функции для расчета других. Например, вы можете сохранить действительную и мнимую части и вычислить величину и угол только при необходимости. (Или наоборот, если вы обнаружите, что это больше распространено применение масштаба и угла.) Причина в том, что один набор данных может выйти из синхронизации с другими. Конструктор, который принимает аргументы устанавливает действительную и мнимую части, а затем вычисляет величину и угол. В set_* методы также должны пересчитать обе части. Если вы когда-нибудь расширить класс, вы будете иметь, чтобы гарантировать, что каждый метод всегда делает расчеты 2 способа - один раз за реальные/мнимые части, и опять для масштаба и угла. Это, вероятно, будет медленным. Если вы сохранили только одно представление, вы могли бы просто сделать преобразование в другие представительства только тогда, когда просили данные в этом формате.

Функции

Я предполагаю, что от названия, что 2 функции вычислить сумму и произведение 2 Complex цифры? Вы спросите:


Можно ли менять их, чтобы заставить их принять служит также в качестве входных?

Есть 2 способа, вы могли бы подойти, что. Вы могли бы просто сделать перегруженную версию:

double somma(double a, double b) {
double c;
c = a + b;
return c;
}

Или вы можете использовать шаблоны. Чтобы сделать это, вам нужно иметь operator+() для вашего Complex класс. Затем вы можете написать somma() как:

template <typename T>
T somma(T a, T b) {
T c;
c = a + b;
return c;
}

Компилятор будет потом поменять T по какой тип аргументов при ее вызове. Если вы называете это так:

Complex x(2, 5);
Complex y(3, 6);
Complex z = somma(x, y);

он будет делать то, что ваша функция делает. Если x, yи z являются float или doubleтогда он будет использовать float для типа и возвращает ожидаемый результат.


Правильно ли говорить, что в мои функции нет побочных эффектов?

Да, это так. Они не заявляют, что абонент не сможет увидеть. Они не вызывают ничего, чтобы быть выход, кроме возвращаемого значения функции.


Было бы лучше поставить функции в классе в качестве членов данных?

Это зависит от того, как вы собираетесь использовать их. В целом, для класса, который представляет собой тип число, имеющее operator+() и operator*() (и связанные, как operator+=() и т. д.) это, вероятно, хорошая идея.

5
ответ дан 16 марта 2018 в 05:03 Источник Поделиться