#include #include #include #include using namespace std; class Complex { private: double real, imag; double mag, theta; bool cartesian, polar; void calculateCartesian (); void calculatePolar (); public: Complex () { cartesian = false; polar = false; } Complex (double r, double i) { real = r; imag = i; cartesian = true; polar = false; } double getReal (); double getImag (); void printCartesian (); double getMag (); double getTheta (); void printPolar (); void setPolar (double m, double t); }; void Complex::calculateCartesian () { if (polar == false) { cout << "calculateCartesian failed because the polar representation is invalid" << endl; exit (1); } real = mag * cos (theta); imag = mag * sin (theta); cartesian = true; } void Complex::calculatePolar () { assert (cartesian); // precondition for calculatePolar mag = sqrt ( real*real + imag*imag); theta = atan2 (imag, real); polar = true; assert (polar && cartesian); // postcondition } double Complex::getReal () { if (cartesian == false) calculateCartesian (); return real; } double Complex::getImag () { if (cartesian == false) calculateCartesian (); return imag; } void Complex::printCartesian () { cout << getReal() << " + " << getImag() << "i" << endl; } double Complex::getMag () { if (polar == false) calculatePolar (); return mag; } double Complex::getTheta () { if (polar == false) calculatePolar (); return theta; } void Complex::printPolar () { cout << getMag() << " e^ " << getTheta() << "i" << endl; } Complex add (Complex& a, Complex& b) { double real = a.getReal() + b.getReal(); double imag = a.getImag() + b.getImag(); Complex sum (real, imag); return sum; } void Complex::setPolar (double m, double t) { mag = m; theta = t; cartesian = false; polar = true; } Complex mult (Complex& a, Complex& b) { double mag = a.getMag() * b.getMag(); double theta = a.getTheta() + b.getTheta(); Complex product; product.setPolar (mag, theta); return product; } int main () { Complex c1 (2.0, 3.0); c1.printCartesian(); c1.printPolar(); c1.setPolar(1, 3.14159/2); c1.printCartesian(); c1.printPolar(); Complex c2 (3.0, 4.0); Complex sum = add (c1, c2); sum.printCartesian(); Complex product = mult (c1, c2); product.printCartesian(); Complex cBad; cBad.printPolar(); return 0; }