C++复数类定义

找不到工作在家闲的无聊,重定义一些自己想用的类,就先从复数开始了

先定义一个complex.h的头文件,这个头文件里定义了复数的实部,虚部以及复数的一些基本的加减乘除还有取模和共轭的运算

#ifndef COMPLEX_H_
#define COMPLEX_H_

#include <iostream>

namespace COMPLEX{
    class Complex{
        private:
            double re;
            double im;
        public:
            Complex();
            Complex(double x, double y = 0.0);
            ~Complex();
            double reval() const{return re;}
            double imval() const{return im;}
            double modval();

            Complex operator+(const Complex & a) const;
            Complex operator-(const Complex & a) const;
            Complex operator-() const;
            Complex operator*(double n) const;
            Complex operator*(const Complex & a) const;
            Complex operator~() const;
            Complex operator/(const Complex & a) const;
            Complex operator/(double n) const{return Complex(re/n, im/n);}
            friend Complex operator*(double n, const Complex & a){return Complex(n*a.re, n*a.im);}
            friend std::ostream & operator<<(std::ostream & os, const Complex & a);
            friend std::istream & operator>>(std::istream & is, Complex & a);
    };
}

#endif

因为除法复数作为除数和被除数运算不一样,就不用友元来写了,然后定义一个complex.cpp的文件,这里就是实现类的函数了

#include <iostream>
#include "complex.h"
#include <cmath>

using std::cin;
using std::cout;

namespace COMPLEX
{
    Complex::Complex()
    {
        re = im = 0.0;
    }

    Complex::Complex(double x, double y)
    {
        re = x;
        im = y;
    }

    Complex::~Complex() {}

    double Complex::modval(){
        return sqrt(re * re + im * im);
    }

    Complex Complex::operator+(const Complex &a) const
    {
        return Complex(re + a.re, im + a.im);
    }

    Complex Complex::operator-(const Complex &a) const
    {
        return Complex(re - a.re, im - a.im);
    }

    Complex Complex::operator-() const
    {
        return Complex(-re, -im);
    }

    Complex Complex::operator*(double n) const
    {
        return Complex(n * re, n * im);
    }

    Complex Complex::operator*(const Complex &a) const
    {
        return Complex(re * a.re - im * a.im, re * a.im + im * a.re);
    }

    Complex Complex::operator~() const
    {
        return Complex(re, -im);
    }

    Complex Complex::operator/(const Complex & a) const{
        double s = a.re * a.re - a.im * a.im;
        return Complex((re * a.re + im * a.im)/s, (im * a.re - re * a.im)/s);
    }

    std::ostream &operator<<(std::ostream &os, const Complex &a)
    {
        if (a.re == 0)
        {
            os << a.im << "i";
        }
        else
        {
            if (a.im > 0)
            {
                if (a.im == 1)
                {
                    os << a.re << " + " << "i";
                }
                else
                {
                    os << a.re << " + " << a.im << "i";
                }
            }
            else if (a.im < 0)
            {
                if (a.im == -1)
                {
                    os << a.re << " - " << "i";
                }
                else
                {
                    os << a.re << " - " << -a.im << "i";
                }
            }
            else
            {
                os << "0.0";
            }
        }
        return os;
    }

    std::istream &operator>>(std::istream &is, Complex &a)
    {
        is >> a.re >> a.im;
        return is;
    }
}

输出流做了一些比较麻烦的判断,然后就是主函数main.cpp的测试代码了

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

using namespace std;
using COMPLEX::Complex;

int main(){
    Complex a(3.0, 4.0);
    Complex c;
    cout << "Enter a complex number (q to quit):\n";
    while (cin >> c)
    {
        cout << "c is " << c << endl;
        cout << "complex conjugate is " << ~c << "\n";
        cout << "a is " << a << "\n";
        cout << "c.modval() is " << c.modval() << "\n";
        cout << "a + c is " << a + c << "\n";
        cout << "a - c is " << a - c << "\n";
        cout << "a * c is " << a * c << "\n";
        cout << "a / c is " << a / c << "\n";
        cout << "2 * c is " << 2 * c << "\n";
        cout << "c / 2 is " << c / 2 << "\n";
        cout << "2 / c is " << Complex(2) / c << "\n";
        cout << "Enter a complex number (q to quit):\n";
    }
    cout << "Done!\n";
    return 0;
}

输出结果如下:

Enter a complex number (q to quit):
2 1
c is 2 + i
complex conjugate is 2 - i
a is 3 + 4i
c.modval() is 2.23607
a + c is 5 + 5i
a - c is 1 + 3i
a * c is 2 + 11i
a / c is 3.33333 + 1.66667i
2 * c is 4 + 2i
c / 2 is 1 + 0.5i
2 / c is 1.33333 - 0.666667i
Enter a complex number (q to quit):
q
Done!

后面再看看加什么好了,或者重写一个矩阵类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值