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); } }