Перегрузка операторов 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 ко второму значению каждой строки? Это кажется слишком простым. Любое направление было бы очень ценно. (Только для того, чтобы кстати, я не ищу никого, кто бы делал за меня домашнее задание... мог бы просто использовать некоторые входные данные)
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