Перегрузка оператора C ++ для операций с комплексными числами - PullRequest
6 голосов
/ 03 декабря 2010

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

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

Входной пример:2,5 -2,21,0 1,0

Образец OutPut:A = (2,5) + (-2,2) iB = (1,0) + (1,0) iA + B = (3,5) + (-1,2) iA - B = ..............A * B = ..............A / B = ..............

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

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

Ответы [ 5 ]

7 голосов
/ 03 декабря 2010

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

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

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

2 голосов
/ 03 декабря 2010

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

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

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

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

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

2 голосов
/ 03 декабря 2010

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

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.
1 голос
/ 03 декабря 2010

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

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

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

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;
}
0 голосов
/ 12 июня 2018

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

#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;
}
...