/* ** Name: complex.cxx ** Author: Leo Liberti ** Purpose: implementation of a complex numbers class ** Source: GNU C++ ** History: 061019 work started 120124 revision - presented to X09 students */ #include #include #include #include #include #include "complex.h" const char charPlusOp = '+'; const char charMinusOp = '-'; const char charIValue = 'i'; Complex::Complex() : real(0.0), imag(0.0) { } Complex::Complex(double re, double im) : real(re), imag(im) { } Complex::~Complex() { } double Complex::getReal(void) { return real; } double Complex::getImaginary(void) { return imag; } void Complex::setReal(double re) { real = re; } void Complex::setImaginary(double im) { imag = im; } void Complex::fromString(const std::string& complexString) { using namespace std; string realString; string imagString; stringstream stringBufReal; stringstream stringBufImag; int opPos = complexString.find(charPlusOp); int iPos; if (opPos != complexString.npos) { // deal with cases re + im i realString = complexString.substr(0, opPos); stringBufReal.str(realString); stringBufReal >> real; imagString = complexString.substr(opPos + 1); stringBufImag.str(imagString); stringBufImag >> imag; if (imag == 0) { // case re + i; imag = 1; } } else { opPos = complexString.find(charMinusOp); if (opPos != complexString.npos && opPos > 0) { // deal with cases re - im i realString = complexString.substr(0, opPos); stringBufReal.str(realString); stringBufReal >> real; imagString = complexString.substr(opPos + 1); stringBufImag.str(imagString); stringBufImag >> imag; if (imag == 0) { // case re - i; imag = 1; } imag = -imag; } else { opPos = complexString.find(charIValue); if (opPos != complexString.npos) { // deal with case im i imagString = complexString.substr(0, opPos); stringBufImag.str(imagString); stringBufImag >> imag; } else { // deal with case re stringBufReal.str(complexString); stringBufReal >> real; } } } } Complex Complex::operator+(Complex& theComplex) { return Complex(real + theComplex.getReal(), imag + theComplex.getImaginary()); } Complex Complex::operator-(Complex& theComplex) { return Complex(real - theComplex.getReal(), imag - theComplex.getImaginary()); } Complex Complex::operator*(Complex& theComplex) { double re = real * theComplex.getReal() - imag * theComplex.getImaginary(); double im = imag * theComplex.getReal() + real * theComplex.getImaginary(); return Complex(re, im); } Complex Complex::operator/(Complex& theComplex) { double c = theComplex.getReal(); double d = theComplex.getImaginary(); double denom = c*c + d*d; double re; double im; if (denom == 0) { re = 1e100; im = 1e100; } else { re = (real*c + imag*d) / denom; im = (imag*c - real*d) / denom; } return Complex(re, im); } std::ostream& operator<<(std::ostream& out, Complex& theComplex) { using namespace std; double re = theComplex.getReal(); double im = theComplex.getImaginary(); if (im > 0 && re != 0) { if (im != 1) { out << re << " + " << im << "i"; } else { out << re << " +i"; } } else if (im < 0 && re != 0) { if (im != -1) { out << re << " - " << fabs(im) << "i"; } else { out << re << " -i"; } } else if (re == 0) { out << im << "i"; } else if (im == 0) { out << re; } return out; }