// Arup Guha
// 10/25/00
// Program Description: The complexno class provides an abstract data type
//                      to deal with complex numbers. The program I have
//                      written simply demonstrates the functionality of
//                      the class. The class allows the user to add, subtract,
//                      multiply and divide complex numbers, as well as
//                      compute the value of a complex number to the power
//                      of a positive integer.
#include "complexno.h"

// Default constructor sets the complex number object to 0.
Complexno::Complexno() {
  real = 0.0;
  complex = 0.0;
}

// Constructor for a complex number with a real number value.
Complexno::Complexno(double r) {
  real = r;
  complex = 0.0;
}

// Standard constructor that allows the user to initialize both components.
Complexno::Complexno(double r, double c) {
  real = r;
  complex = c;
}

// Reads in a complex number from the user.
void Complexno::enternum() {

  cout << "Enter the real part of the complex number : ";
  cin >> real;
  cout << "Enter the imaginary part of the complex number : ";
  cin >> complex;
}

// Adds two complex numbers
Complexno operator +(Complexno num1, Complexno num2) {
  Complexno answer;
  answer.real = num1.real + num2.real;
  answer.complex = num1.complex + num2.complex;
  return answer;
}

// Subtracts two complex numbers
Complexno operator -(Complexno num1, Complexno num2) {
  Complexno answer;
  answer.real = num1.real - num2.real;
  answer.complex = num1.complex - num2.complex;
  return answer;
}

// Multiplies two complex numbers
Complexno operator *(Complexno num1, Complexno num2) {
  Complexno answer;
  answer.real = num1.real*num2.real - num1.complex*num2.complex;
  answer.complex = num1.real*num2.complex + num1.complex*num2.real;
  return answer;
}

// Divides two complex numbers
Complexno operator /(Complexno num1, Complexno num2) {
  Complexno answer;
  double den = pow(num2.real,2) + pow(num2.complex,2); 
  answer.real = (num1.real*num2.real + num1.complex*num2.complex)/den;
  answer.complex = (num1.complex*num2.real - num1.real*num2.complex)/den;
  return answer;
}

// Negates a single complex number 
Complexno operator -(Complexno num) {
  Complexno answer;
  answer.real = -num.real;
  answer.complex = -num.complex;
  return answer;
}

// Returns the magnitude of a complex number.
double Complexno::magnitude() {
  return sqrt(pow(real,2)+pow(complex,2));
}


// Exponentiates a complex number.
Complexno operator ^(Complexno base, int num2) {

  Complexno answer(1,0);

  if (num2==0)
    return answer;
  if (num2==1)
    return base;
  else 
    return base*(base^(num2-1));
  
}

// Provides a reasonable way to print out a complex number.
ostream& operator <<(ostream& rite, Complexno x) {
  
  rite << "(" << x.real;
  if (x.complex>0.0)
    rite << " + " << x.complex << "i";
  else if (x.complex<0.0)
    rite << " - " << fabs(x.complex) << "i";
  rite << ")";
  return rite;
}







