C ++运算符重载用于复数运算

时间:2010-12-03 17:14:57

标签: c++ operator-overloading complex-numbers

我在C ++中有一个作业,但我很难入门。目标是“为复数设计一个使用以下重载运算符的类:>><< + - * /”

我的问题不是关于这个的语法,而是关于逻辑的更多信息。我可以使用一些帮助头脑风暴。

输入样本:
2.5 -2.2 1.0 1.0

OutPut示例:
A =(2.5)+(-2.2)i
B =(1.0)+(1.0)i

A + B =(3.5)+( - 1.2)i
A - B = ..............
A * B = ..............
A / B = ..............

那么我该怎么做呢? “Complex”类重载了这些运算符,这是否意味着我只能在类中使用这些运算符(即在公共函数内部)?如果是这样,我想这样做吗?或者我想在我的客户端/驱动程序代码中执行此操作?

第二,它只是将i添加到每行的第二个值吗?这似乎太容易了。任何方向都会非常感激。 (仅供记录,我不是要找任何人为我做功课......可以只使用一些输入)

5 个答案:

答案 0 :(得分:7)

在我看来,重点是演示类操作重载,所以我认为这个想法是你创建一个类Complex,它包含有关实数和虚数的信息(i表示它是虚构的)。在您自己做的操作符覆盖中处理复杂数字之间的各种操作。

一旦你有了它并且你看到它有效(做一个静态测试方法,它做各种操作并将结果打印到屏幕上),然后担心使用该类来处理输入,因为解析输入将是另一个任务本身。有时将问题划分为较小的问题比尝试同时进行两者更简单。

希望有所帮助。祝你好运!

答案 1 :(得分:2)

他们喜欢成对的价值观:

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.

答案 2 :(得分:2)

您需要设计一个名为Complex的类,至少包含:

  • 一个构造函数,允许您根据实部和虚部组件值构造一个Complex对象,例如:复杂(1,5)

  • 覆盖+运算符,以便您可以添加两个Complex对象,返回一个新的Complex对象,例如:络合物(1,5)+络合物(3,7)是络合物(4,12)

  • 类似于其他运营商

但首先,您需要了解复数背后的基本数学,以便您可以编写运算符重载方法。

答案 3 :(得分:1)

要完成此任务,您需要做一些事情:

定义一个类(例如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;
}

答案 4 :(得分:0)

希望你现在完成家庭作业:)如果有人还需要帮助,这是我的解决方案。

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