美文网首页C语言C++
Complex类,运算符重载

Complex类,运算符重载

作者: 一书and一世界 | 来源:发表于2016-12-16 16:30 被阅读65次

题目描述

复数形式是a+bi,其中a和b是实数,i是。a和b分别被称为复数的实部和虚部。可以使用下列公式实现复数的加、减、乘、除:

a + bi + c + di = (a + c) + (b + d) i

a + bi - (c + di) = (a - c) + (b - d) i

(a + bi) * (c + di) = (ac - bd) + (bc + ad) i

(a + bi) / (c + di) = (ac + bd) / (c2 + d2) + (bc - ad) i /
(c2 + d2)

使用下面公式也可以获得复数的绝对值:

|a+bi|=√(a2+b2)

设计一个名为Complex的复数类,它可以用函数add、subtract、multiply、divide和abs实现复数的加、减、乘、除和取绝对值。toString函数实现以字符串形式表示的复数a+bi。如果b是0,只返回a。

该类有三个构造函数Complex (a, b)、Complex (a)和Complex ( )。Complex ( )生成一个表示原点的复数对象,Complex (a)生成一个b值为0的复数对象。函数getRealPart ( )和getImaginaryPart ( )分别返回复数的实部和虚部。

重载运算符+,-,,/,+=,-=,=,/=,[ ],一元+和-,前缀++和--,后缀++和--,<<,>>。

以非成员函数形式重载+,-,*,/。重载[ ],使得[0]返回a,[1]返回b。
编写一个测试程序:当用户输入两个复数后,程序显示它们的加、减、乘、除操作的结果。样例输出如下:

Enter the first complex number:  3.5  5.5  ~Enter
Enter the second complex number: -3.5  1  ~Enter
(3.5 + 5.5i) + (-3.5 + 1.0i) = 0.0 + 6.5i
(3.5 + 5.5i) - (-3.5 + 1.0i) = 7.0 + 4.5i
(3.5 + 5.5i) * (-3.5 + 1.0i) = -17.75 + -15.75i
(3.5 + 5.5i) / (-3.5 + 1.0i) = -0.5094 + -1.7i
|3.5 + 5.5i| = 6.519202405202649

C++代码

Complex.h

//
// Created by blue on 16-12-9.
//

#ifndef COMPLEXCLASS_COMPLEX_H
#define COMPLEXCLASS_COMPLEX_H

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

class Complex {
private:
    double realPart;
    double virtualPart;

public:
    Complex add(const Complex &c);
    Complex subtract(const Complex &c);
    Complex multiply(const Complex &c);
    Complex divide(const Complex &c);
    double abs();
    std::string toString();

public:
    Complex operator+(const Complex &c);
    Complex operator-(const Complex &c);
    Complex operator*(const Complex &c);
    Complex operator/(const Complex &c);
    Complex operator+=(const Complex &c);
    Complex operator-=(const Complex &c);
    Complex operator*=(const Complex &c);
    Complex operator/=(const Complex &c);
    double operator[](const int &index);
    Complex operator+();
    Complex operator-();
    Complex operator++(); //前置版本
    Complex operator--(); //前置版本
    Complex operator++(int t); //后置版本
    Complex operator--(int t); //后置版本
    friend std::ostream& operator<<(std::ostream &os,const Complex &c); //输出运算附
    friend std::istream& operator>>(std::istream &is,Complex c); //输入运算符

public:
    Complex();
    Complex(double realPart);

    Complex(double realPart, double virtualPart);

    double getRealPart() const;

    void setRealPart(double realPart);

    double getVirtualPart() const;

    void setVirtualPart(double virtualPart);

};


#endif //COMPLEXCLASS_COMPLEX_H

Complex.cpp

//
// Created by blue on 16-12-9.
//

#include "iostream"
#include "sstream"
#include "Complex.h"
#include <math.h>

/*方法*/
Complex Complex:: add(const Complex &c){
    Complex temp;
    temp.setRealPart(Complex::getRealPart()+c.getRealPart());
    temp.setVirtualPart(Complex::getVirtualPart()+c.getVirtualPart());
    return temp;
}
Complex Complex::subtract(const Complex &c){
    Complex temp;
    temp.setRealPart(Complex::getRealPart()-c.getRealPart());
    temp.setVirtualPart(Complex::getVirtualPart()-c.getVirtualPart());
    return temp;
}
Complex Complex::multiply(const Complex &c){
    Complex temp;
    temp.setRealPart(Complex::getRealPart()*c.getRealPart()-Complex::getVirtualPart()*c.getVirtualPart());
    temp.setVirtualPart(Complex::getVirtualPart()*c.getRealPart()+Complex::getRealPart()*c.getVirtualPart());
    return temp;
}
Complex Complex::divide(const Complex &c){
    Complex temp;
    temp.setRealPart((Complex::getRealPart()*c.getRealPart()+Complex::getVirtualPart()*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    temp.setVirtualPart((Complex::getVirtualPart()*c.getRealPart()-Complex::getRealPart()*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    return temp;
}
double Complex::abs(){
    return sqrt(pow(Complex::getRealPart(),2)+pow(Complex::getVirtualPart(),2));
}
std::string Complex::toString(){
    std::ostringstream ostring;

    if (Complex::getVirtualPart() == 0){
        ostring << Complex::getRealPart();
    }else if (Complex::getVirtualPart() < 0){
        ostring << Complex::getRealPart() << "-" << fabs(Complex::getVirtualPart()) << "i";
    }else{
        ostring << Complex::getRealPart() << "+" << Complex::getVirtualPart() << "i";
    }

    return ostring.str();
}

/*运算符重载*/
Complex Complex::operator+(const Complex &c){
    Complex tmp;
    tmp.setRealPart(Complex::getRealPart()+c.getRealPart());
    tmp.setVirtualPart(Complex::getVirtualPart()+c.getVirtualPart());
    return tmp;
}
Complex Complex::operator-(const Complex &c){
    Complex tmp;
    tmp.setRealPart(Complex::getRealPart()-c.getRealPart());
    tmp.setVirtualPart(Complex::getVirtualPart()-c.getVirtualPart());
    return tmp;
}
Complex Complex::operator*(const Complex &c){
    Complex tmp(Complex::getRealPart(),Complex::getVirtualPart());
    tmp.setRealPart(Complex::getRealPart()*c.getRealPart()-Complex::getVirtualPart()*c.getVirtualPart());
    tmp.setVirtualPart(Complex::getVirtualPart()*c.getRealPart()+Complex::getRealPart()*c.getVirtualPart());
    return tmp;
}
Complex Complex::operator/(const Complex &c){
    Complex temp;
    temp.setRealPart((Complex::getRealPart()*c.getRealPart()+Complex::getVirtualPart()*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    temp.setVirtualPart((Complex::getVirtualPart()*c.getRealPart()-Complex::getRealPart()*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    return temp;
}
Complex Complex::operator+=(const Complex &c){
    double a = Complex::getRealPart();
    double b = Complex::getVirtualPart();
    Complex::setRealPart((a*c.getRealPart()+b*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    Complex::setVirtualPart((b*c.getRealPart()-a*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    return *this;
}
Complex Complex::operator-=(const Complex &c){
    double a = Complex::getRealPart();
    double b = Complex::getVirtualPart();
    Complex::setRealPart(a-c.getRealPart());
    Complex::setVirtualPart(b-c.getVirtualPart());
    return *this;
}
Complex Complex::operator*=(const Complex &c){
    double a = Complex::getRealPart();
    double b = Complex::getVirtualPart();
    Complex::setRealPart(a*c.getRealPart()-b*c.getVirtualPart());
    Complex::setVirtualPart(b*c.getRealPart()+a*c.getVirtualPart());
    return *this;
}
Complex Complex::operator/=(const Complex &c){
    double a = Complex::getRealPart();
    double b = Complex::getVirtualPart();
    Complex::setRealPart((a*c.getRealPart()+b*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    Complex::setVirtualPart((a*c.getRealPart()-b*c.getVirtualPart())/(pow(c.getRealPart(),2)+pow(c.getVirtualPart(),2)));
    return *this;
}
double Complex::operator[](const int &index){
    if (index == 0){
        return Complex::getRealPart();
    }else if(index == 1){
        return Complex::getVirtualPart();
    }else{
        std::cout << "Invalid Index." << std::endl;
    }
}
Complex Complex::operator+(){
    Complex::setRealPart(fabs(Complex::getRealPart()));
    Complex::setVirtualPart(fabs(Complex::getVirtualPart()));
    return *this;
}
Complex Complex::operator-(){
    Complex::setRealPart(-Complex::getRealPart());
    Complex::setVirtualPart(-Complex::getVirtualPart());
    return *this;
}
Complex Complex::operator++(){ //前置版本
    Complex::setRealPart(Complex::getRealPart()+1);
    Complex::setVirtualPart(Complex::getRealPart()+1);
    return *this;
}
Complex Complex::operator--(){ //前置版本
    Complex::setRealPart(Complex::getRealPart()-1);
    Complex::setVirtualPart(Complex::getRealPart()-1);
    return *this;
}
Complex Complex::operator++(int t){ //后置版本
    Complex tmp(Complex::getRealPart(),Complex::getVirtualPart());
    this->setRealPart(this->getRealPart()+1);
    this->setVirtualPart(this->getVirtualPart()+1);
    return tmp;
}
Complex Complex::operator--(int t){ //后置版本
    Complex tmp(Complex::getRealPart(),Complex::getVirtualPart());
    this->setRealPart(this->getRealPart()-1);
    this->setVirtualPart(this->getVirtualPart()-1);
    return tmp;
}

/*输入输出重载*/
std::ostream& operator<<(std::ostream &os,const Complex &c){ //输出运算符
    if (c.getVirtualPart() > 0){
        os << c.getRealPart() << "+" << c.getVirtualPart() << "i";
    }else if(c.getVirtualPart() == 0){
        os << c.getRealPart();
    }else{
        os << c.getRealPart() << "-" << fabs(c.getVirtualPart()) << "i";
    }
    return os;
}
std::istream& operator>>(std::istream &is,Complex c){ //输入运算符
    double t1,t2;
    is >> t1 >> t2;
    c.setRealPart(t1);
    c.setVirtualPart(t2);
    return is;
}

/*构造函数,getter,setter*/
Complex::Complex() {
    Complex::realPart = 0;
    Complex::virtualPart = 0;
}

Complex::Complex(double realPart) : realPart(realPart) {
    Complex::realPart = realPart;
    Complex::virtualPart = 0;
}

Complex::Complex(double realPart, double virtualPart) : realPart(realPart), virtualPart(virtualPart) {
    Complex::realPart = realPart;
    Complex::virtualPart = virtualPart;
}


double Complex::getRealPart() const {
    return realPart;
}

void Complex::setRealPart(double realPart) {
    Complex::realPart = realPart;
}

double Complex::getVirtualPart() const {
    return virtualPart;
}

void Complex::setVirtualPart(double virtualPart) {
    Complex::virtualPart = virtualPart;
}

main.cpp

#include <iostream>
#include "Complex.h"

using namespace std;

int main(){

    double a0,a1;
    double b0,b1;
    cout << "Enter the first complex number: " << endl;
    cin >> a0 >> a1;
    cout << "Enter the second complex number:" << endl;
    cin >> b0 >> b1;

    Complex a(a0,a1);
    Complex b(b0,b1);


    cout << "(" << a.toString() << ")" << " + " << "(" << b.toString() << ")" << " = " << (a+b).toString() << endl;
    cout << "(" << a.toString() << ")" << " - " << "(" << b.toString() << ")" << " = " << (a-b).toString() << endl;
    cout << "(" << a.toString() << ")" << " * " << "(" << b.toString() << ")" << " = " << (a*b).toString() << endl;
    cout << "(" << a.toString() << ")" << " / " << "(" << b.toString() << ")" << " = " << (a/b).toString() << endl;
    cout << "|" << a.toString() << "|" << " = " << a.abs() << endl;

    return 0;
}

相关文章

  • Complex类,运算符重载

    题目描述 复数形式是a+bi,其中a和b是实数,i是。a和b分别被称为复数的实部和虚部。可以使用下列公式实现复数的...

  • 【GeekBand】Week02

    一、关于流运算符(<<、>>)的重载问题### 首先考察一个实部虚部为double类型的复数complex类: 对...

  • Python全栈之路系列之面向对象运算符重载

    运算符重载的概念如下: 运算符重载让类拦截常规的Python运算; 类可重载所有Python表达式运算符; 类也可...

  • C++ 部分运算符重载

    可重载的运算符 不可重载的运算符和符号 重载运算符为类的成员函数 重载运算符为友元函数 重载赋值运算符 重载流插入...

  • 如何为类和结构体自定义运算符实现

    运算符重载 类和结构体可以为现有的运算符提供自定义的实现,称为运算符重载。 一元运算符重载 类与结构体也能提供标准...

  • 为类和结构体自定义运算符实现

    运算符重载 类和结构体可以为现有的运算符提供自定义的视线,称为运算符重载 一元运算符重载 类与结构体也能提供标准一...

  • 1.2.21_C++ 类成员访问运算符 -> 重载

    C++ 重载运算符和重载函数 类成员访问运算符( -> )可以被重载,但它较为麻烦。它被定义用于为一个类赋予"指针...

  • c++——函数符号重载2-15

    一般情况下,单目运算符最好重载为类的成员函数;双目运算符则最好重载为类的友元函数。以下一些双目运算符不能重载为类的...

  • 【C++】面向对象之类和对象(下篇)-004

    第四章 类和对象 4.6 运算符重载 4.6.1 运算符重载基本概念 运算符重载,就是对已有的运算符重新进行定义,...

  • 运算符重载

    对于内置的数据类,编译器直到如何进行运算 对于自定义数据类型,需要运算符重载 加号运算符重载 左移运算符重载 重载...

网友评论

    本文标题:Complex类,运算符重载

    本文链接:https://www.haomeiwen.com/subject/clgnmttx.html