using System;
using System.Runtime.Serialization;
using System.Collections;
public class ComplexOverflowException : ApplicationException {
public ComplexOverflowException() :
base() {
}
public ComplexOverflowException(string msg) :
base(msg) {
}
public ComplexOverflowException(SerializationInfo info, StreamingContext cxt) :
base(info, cxt) {
}
public ComplexOverflowException(string msg, Exception inner) :
base(msg, inner) {
}
}
public class Complex : ICloneable, IComparable {
private double realPart = 0.0;
private double imagPart = 0.0;
public Complex() {
}
public Complex(double r) : this(r, 0) {
}
public Complex(double r, double i) {
realPart = r;
imagPart = i;
}
public Complex(Complex l) {
realPart = l.realPart;
imagPart = l.imagPart;
}
public double Imaginary {
get {
return imagPart;
}
set {
imagPart = value;
}
}
public double Real {
get {
return realPart;
}
set {
realPart = value;
}
}
public void Scale(double val) {
double tempImaginary = val * imagPart;
realPart *= val;
imagPart = tempImaginary;
}
static public Complex operator +(Complex l, Complex r) {
Complex result = new Complex(l);
result.realPart += r.realPart;
result.imagPart += r.imagPart;
return result;
}
static public Complex operator *(Complex l, Complex r) {
Complex result = new Complex();
checked {
result.Real = l.Real * r.Real - l.Imaginary * r.Imaginary;
result.Imaginary = l.Real * r.Imaginary + l.Imaginary * r.Real;
}
return result;
}
static public bool operator ==(Complex l, Complex r) {
return ((l.Real == r.Real) &&
(l.Imaginary == r.Imaginary));
}
static public bool operator !=(Complex l, Complex r) {
return !(l == r);
}
static public bool operator >(Complex l, Complex r) {
double normL = l.imagPart * l.imagPart + l.realPart * l.realPart;
double normR = r.imagPart * r.imagPart + r.realPart * r.realPart;
return normL > normR;
}
static public bool operator <(Complex l, Complex r) {
return r > l;
}
public override bool Equals(object o) {
if (!(o is Complex))
return false;
Complex c = (Complex)o;
return ((c.Real == Real) && (c.Imaginary == Imaginary));
}
public override int GetHashCode() {
return (int)(Real + Imaginary);
}
object ICloneable.Clone() {
return new Complex(this);
}
int IComparable.CompareTo(object o) {
if (!(o is Complex))
throw new ArgumentException("Object is not a complex number");
Complex c = (Complex)o;
double norm = imagPart * imagPart + realPart * realPart;
double normO = c.imagPart * c.imagPart + c.realPart * c.realPart;
if (norm > normO)
return 1;
else if (normO > norm)
return -1;
else
return 0;
}
}
class MainClass {
public static IComparable theMax(IComparable seed, IEnumerable coll) {
foreach (IComparable c in coll) {
if (c.CompareTo(seed) > 0) {
seed = c;
}
}
return seed;
}
static void Main(string[] args) {
Complex[] cArray = new Complex[100];
Complex max = new Complex(0, 0);
max = (Complex)theMax(max, cArray);
}
}
|