Перегрузка операторов C++ для операций с комплексными числами



У меня есть задание на C++, и у меня возникли проблемы с началом работы. Цель состоит в том, чтобы " создать класс, который использует следующие перегруженные операторы для комплексных чисел: >>


Мой вопрос не о синтаксисе этого, а больше о логике. Я мог бы использовать некоторую помощь "мозгового штурма".



Входной Образец:

2.5 -2.2

1.0 1.0



Выходной Образец:

A = (2.5) + (-2.2)i

B = (1.0) + (1.0)i


A + B = (3.5) + (-1.2)i

А-В = ..............

A * B = ..............

A / B = ..............



Итак, как мне начать это? Класс "Complex" перегружает эти операторы, так значит ли это, что я могу использовать эти операторы только в классе (т. е. внутри публичных функций)? Если да, то захочу ли я сделать это таким образом? Или я хотел бы сделать это в моем клиенте / коде водителя?



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

1045   5  

5 ответов:

Мне кажется, что смысл в том, чтобы продемонстрировать перегруженность операций класса, поэтому я думаю, что идея состоит в том, чтобы вы создали комплекс классов, который содержит информацию о действительном числе и мнимом числе (i означает, что оно мнимое). Обрабатывать различные операции между комплексными числами в операторных переопределениях вы будете сами.

Как только у вас это есть, и вы видите, что это работает (сделайте статический метод тестирования, который выполняет различные операции и выводит результаты на экран), то беспокоиться о использование этого класса для работы с входными данными, так как разбор входных данных сам по себе будет другой задачей. Иногда проще разделить проблемы на более мелкие, чем пытаться делать то и другое одновременно.

Надеюсь, это поможет. Удачи вам!

Вам нужно создать класс под названием Complex, который включает по крайней мере:

  • Конструктор, позволяющий построить сложный объект из действительных и мнимых значений компонентов, например Complex(1, 5)

  • Переопределяет оператор+, так что вы можете добавить два сложных объекта, возвращая новый сложный объект, например, Complex(1, 5) + Complex(3, 7) является сложным(4, 12)

  • Аналогично для других операторов

Но сначала вы должны понять основные математика позади комплексных чисел, так что вы можете написать методы перегрузки оператора.

Им нравятся пары значений:

A = N1 + I1i
B = N2 + I2i


A + B = (N1 + I1i) + (N2 + I2i)
      = N1 + I1i + N2 + I2i
      = (N1 + N2) + (I1i + I2i)
      = (N1 + N2) + (I1 + I2)i
A - B = (N1 + I1i) - (N2 + I2i)
      = N1 + I1i - N2 - I2i
      = (N1 - N2) + (I1i - I2i)
      = (N1 - N2) + (I1 - I2)i

// N1, N2, I1, I2 are all just normal numbers.
// You can multiply them like normal. You just have to keep track of the `i`
// Also not that i = sqrt(-1)
// Therefore  i * i = sqrt(-1) * sqrt(-1)
//                  = sqrt(-1)^2
//                  = -1
A * B = (N1 + I1i) * (N2 + I2i)
      = (N1 * N2) + (N1 * I2i) + (I1i * N2) + (I1i * I2i)
      = (N1 * N2) + (N1 * I2)i + (N2 * I1)i + (i * i * I1 * I2)
      = (N1 * N2) + i((N1 * I2) + (N2 * I1)) + (-1 * I1 * I2)

      // Simplest form
      = ((N1 * N2) - (I1 * I2)) + ((N1 * I2) + (N2 * I1))i


A / B = Repeat as above.

Есть несколько вещей, которые вы должны сделать, чтобы выполнить эту задачу:

Определите класс (например, комплекс), который может содержать данные для действительной и мнимой части комплексного числа.

Перегрузка соответствующих операторов (например):

class Complex
{
public:
    // other declarations here
    Complex operator+ (const Complex& rhs) const;
    // other stuff here
};

Реализуют соответствующие операторы для фактического выполнения математической операции (например):

Complex Complex::operator+ (const Complex& rhs) const
{
    Complex result = *this;
    result.Real += rhs.Real;
    result.Imaginary += rhs.Imaginary;
    return result;
}

Надеюсь, вы уже закончили с домашним заданием:) вот мое решение, если кто-то все еще нуждается в помощи.

#include <string>
#include <sstream>
#include <iostream>

using namespace std;


class Complex {
    float real_, imaginary_;
  public:
    Complex (float, float);
    Complex operator= (const Complex& rhs);
    Complex operator+ (const Complex& rhs) const;
    Complex operator- (const Complex& rhs) const;
    Complex operator* (const Complex& rhs) const;
    string toString() const;
};

Complex::Complex (float r, float i){
  real_ = r;
  imaginary_ = i;
}

Complex Complex::operator= (const Complex& rhs){
    real_ = rhs.real_;
    imaginary_ = rhs.imaginary_;
    return *this;
}

Complex Complex::operator+ (const Complex& rhs) const{
    Complex result = *this;
    result.real_ += rhs.real_;
    result.imaginary_ += rhs.imaginary_;
    return result;
}

Complex Complex::operator- (const Complex& rhs) const{
    Complex result = *this;
    result.real_ -= rhs.real_;
    result.imaginary_ -= rhs.imaginary_;
    return result;
}

Complex Complex::operator* (const Complex& rhs) const{
    Complex result = *this; // this-> == *this == (*this)
    result.real_ = real_ * rhs.real_ - imaginary_ * rhs.imaginary_;
    //cout << result.real_ << "R " << result.imaginary_ << "I "<< "|" << rhs.real_ << "R " << rhs.imaginary_ << "I\n";
    result.imaginary_ = (real_ * rhs.imaginary_) + (rhs.real_ * imaginary_);
    //cout << result.real_ << "R " << result.imaginary_ << "I "<< "|" << rhs.real_ << "R " << rhs.imaginary_ << "I\n";
    return result;
}

string Complex::toString() const {
  stringstream ss;
  if (imaginary_ > 0){
    ss << real_ << " + " << imaginary_ << "i";
  }
  else {
    ss << real_ << " " << imaginary_ << "i";
  }
  return ss.str();
}

int main () {
  Complex a(5, 6);
  Complex b(1, 4);

  Complex sum = a + b;
  Complex dif = a - b;
  Complex pro = a * b;

  cout << "sum: " << sum.toString() << "\n";
  cout << "difference: " << dif.toString() << "\n";
  cout << "product: " << pro.toString() << "\n";

  return 0;
}

Comments

    Ничего не найдено.