Csharp/C Sharp/Data Types/Complex

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

A Complex Number Class

<source lang="csharp"> /* A Programmer"s Introduction to C# (Second Edition) by Eric Gunnerson Publisher: Apress L.P. ISBN: 1-893115-62-3

  • /

// 25 - Operator Overloading\A Complex Number Class // copyright 2000 Eric Gunnerson using System; struct Complex {

   float real;
   float imaginary;
   
   public Complex(float real, float imaginary)
   {
       this.real = real;
       this.imaginary = imaginary;
   }
   
   public float Real
   {
       get
       {
           return(real);
       }
       set
       {
           real = value;
       }
   }
   
   public float Imaginary
   {
       get
       {
           return(imaginary);
       }
       set
       {
           imaginary = value;
       }
   }
   
   public override string ToString()
   {
       return(String.Format("({0}, {1}i)", real, imaginary));
   }
   
   public static bool operator==(Complex c1, Complex c2)
   {
       if ((c1.real == c2.real) &&
       (c1.imaginary == c2.imaginary))
       return(true);
       else
       return(false);
   }
   
   public static bool operator!=(Complex c1, Complex c2)
   {
       return(!(c1 == c2));
   }
   
   public override bool Equals(object o2)
   {
       Complex c2 = (Complex) o2;
       
       return(this == c2);
   }
   
   public override int GetHashCode()
   {
       return(real.GetHashCode() ^ imaginary.GetHashCode());
   }
   
   public static Complex operator+(Complex c1, Complex c2)
   {
       return(new Complex(c1.real + c2.real, c1.imaginary + c2.imaginary));
   }
   
   public static Complex operator-(Complex c1, Complex c2)
   {
       return(new Complex(c1.real - c2.real, c1.imaginary - c2.imaginary));
   }
   
   // product of two complex numbers
   public static Complex operator*(Complex c1, Complex c2)
   {
       return(new Complex(c1.real * c2.real - c1.imaginary * c2.imaginary,
       c1.real * c2.imaginary + c2.real * c1.imaginary));
   }
   
   // quotient of two complex numbers
   public static Complex operator/(Complex c1, Complex c2)
   {
       if ((c2.real == 0.0f) &&
       (c2.imaginary == 0.0f))
       throw new DivideByZeroException("Can"t divide by zero Complex number");
       
       float newReal = 
       (c1.real * c2.real + c1.imaginary * c2.imaginary) /
       (c2.real * c2.real + c2.imaginary * c2.imaginary);
       float newImaginary = 
       (c2.real * c1.imaginary - c1.real * c2.imaginary) /
       (c2.real * c2.real + c2.imaginary * c2.imaginary);
       
       return(new Complex(newReal, newImaginary));
   }
   
   // non-operator versions for other languages
   public static Complex Add(Complex c1, Complex c2)
   {
       return(c1 + c2);
   }
   
   public static Complex Subtract(Complex c1, Complex c2)
   {
       return(c1 - c2);
   }
   
   public static Complex Multiply(Complex c1, Complex c2)
   {
       return(c1 * c2);
   }
   
   public static Complex Divide(Complex c1, Complex c2)
   {
       return(c1 / c2);
   }

} public class AComplexNumberClass {

   public static void Main()
   {
       Complex c1 = new Complex(3, 1);
       Complex c2 = new Complex(1, 2);
       
       Console.WriteLine("c1 == c2: {0}", c1 == c2);
       Console.WriteLine("c1 != c2: {0}", c1 != c2);
       Console.WriteLine("c1 + c2 = {0}", c1 + c2);
       Console.WriteLine("c1 - c2 = {0}", c1 - c2);
       Console.WriteLine("c1 * c2 = {0}", c1 * c2);
       Console.WriteLine("c1 / c2 = {0}", c1 / c2);
   }

}

      </source>