找不到工作在家闲的无聊,重定义一些自己想用的类,就先从复数开始了
先定义一个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!
后面再看看加什么好了,或者重写一个矩阵类