Complex.java

Below is the syntax highlighted version of Complex.java from §3.3 Designing Data Types.

```/******************************************************************************
*  Compilation:  javac Complex.java
*  Execution:    java Complex
*
*  ADT for complex numbers using polar representation.
*
*  % java Complex
*  a = 5.0 + 6.0i
*  b = -2.0000000000000004 + 2.9999999999999996i
*  c = -27.999999999999996 + 2.9999999999999876i
*
******************************************************************************/

public final class Complex {
private double r;        // distance
private double theta;    // angle

// constructor that takes in rectangular coordinates
public Complex(double re, double im) {
r     = Math.sqrt(re*re + im*im);
theta = Math.atan2(im, re);
}

// accessor methods
public double re() { return r * Math.cos(theta); }
public double im() { return r * Math.sin(theta); }

// return a string representation of this complex number
public String toString()  {
return re() + " + " + im() + "i";
}

// return this Complex number plus b
public Complex plus(Complex b) {
Complex a = this;
double re = a.r * Math.cos(a.theta) + b.r * Math.cos(b.theta);
double im = a.r * Math.sin(a.theta) + b.r * Math.sin(b.theta);
return new Complex(re, im);
}

// return this Complex number times b
public Complex times(Complex b) {
Complex a = this;
Complex c = new Complex(0, 0);
c.r = a.r * b.r;                // can't make r and theta final
c.theta = a.theta + b.theta;    // because of these two statements
return c;
}

// return the magnitude / absolute value of this complex number
public double abs() { return r; }

// sample client for testing - calculates roots of unity
public static void main(String[] args) {
Complex a = new Complex(5.0, 6.0);
StdOut.println("a = " + a);

Complex b = new Complex(-2.0, 3.0);
StdOut.println("b = " + b);

Complex c = b.times(a);
StdOut.println("c = " + c);
}

}
```