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

using namespace std;

Complex::Complex()
{
	real = 0.0;
	imaginary = 0.0;
}

Complex::Complex(double re, double im)
{
	real = re;
	imaginary = im;
}

double
Complex::re()
{
	return real;
}

double
Complex::im()
{
	return imaginary;
}

void
Complex::set_real(double re)
{
	real = re;
}

void
Complex::set_imaginary(double im)
{
	imaginary = im;
}

Complex
Complex::add_them(Complex &y)
{
	Complex sum;

	sum.real = real + y.real;
	sum.set_imaginary(imaginary + y.im());
	return sum;
}

Complex 
operator+(Complex &x, Complex &y)
{
	return x.add_them(y);
}

Complex
operator-(Complex  &x, Complex &y)
{
	Complex diff;

	diff.set_real(x.re() - y.re());
	diff.set_imaginary(x.im() - y.im());
	return diff;
}

Complex
Complex::operator*(Complex &y)
{
	Complex prod;

	prod.real = real * y.real - imaginary * y.imaginary;
	prod.imaginary = real * y.imaginary + imaginary * y.real;
	return prod;
}

ostream &
operator<<(ostream &os, Complex &x)
{
	double im;

	im = x.im();
	if(im >= 0)
		os << x.re() << "+" << im << "i";
	else
		os << x.re() << "-" << -im << "i";
	return os;
}

istream &
operator>>(istream &is, Complex &x)
{
	double temp;

	is >> temp;
	x.set_real(temp);
	is >> temp;
	x.set_imaginary(temp);
	return is;
}
