Листинг 4. Пользовательский тип для комплексных чисел
using System;
/// <summary> /// Реализация комплексного числа одинарной точности /// </summary> public struct Complex {
// Вещественная и мнимая части комплексного числа private float real, 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 static implicit operator float ( Complex c ) { return c. Real; }
// Явное преобразование числа с плавающей точкой в комплексное // (требует явного приведения) public static explicit operator Complex ( float f ) { return new Complex ( f, 0 ); }
////////////////////////////////////////////// // // Перегруженные арифметические операторы: // +, -, *, /, ==,!= //
public static Complex operator +( Complex c ) { return c; }
public static Complex operator -( Complex c ) { return new Complex (- c. Real, - c. Imaginary ); }
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, float num ) { return new Complex ( c1. Real + num, c1. Imaginary ); }
public static Complex operator +( float num, Complex c1 ) { return new Complex ( c1. Real + num, c1. Imaginary ); }
public static Complex operator -( Complex c1, float num ) { return new Complex ( c1. Real - num, c1. Imaginary ); }
public static Complex operator -( float num, Complex c1 ) { return new Complex ( c1. Real - num, c1. Imaginary ); }
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 ), ( c1. Real * c2. Imaginary ) + ( c1. Imaginary * c2. Real )); }
public static Complex operator *( Complex c1, float num ) { return new Complex ( c1. Real * num, c1. Imaginary * num ); }
public static Complex operator *( float num, Complex c1 ) {return new Complex ( c1. Real * num, c1. Imaginary * num );}
public static Complex operator /( Complex c1, Complex c2 ) { float div = c2. Real * c2. Real + c2. Imaginary * c2. Imaginary; if ( div == 0 ) throw new DivideByZeroException ();
return new Complex (( c1. Real * c2. Real + c1. Imaginary * c2. Imaginary )/ div, ( c1. Imaginary * c2. Real – c1. Real * c2. Imaginary )/ div ); }
public static bool operator ==( Complex c1, Complex c2 ) { return ( c1. Real == c2. Real ) && ( c2. Imaginary == c2. Imaginary ); }
public static bool operator!=( Complex c1, Complex c2 ) { return ( c1. Real != c2. Real ) || ( c2. Imaginary != c2. Imaginary ); }
public override int GetHashCode () { return ( Real. GetHashCode () ^ Imaginary. GetHashCode ()); }
public override bool Equals (object o ) { return ( o is Complex )? (this == ( Complex ) o ): false; }
// Отображение комплексного числа в натуральном виде // ------------------------------------------------------------ // Обратите внимание: вызов этого метода упакует значение // в строковый объект и тем самым приведет к его созданию // в куче с размером в 24 байта public override string ToString () { return( String. Format ( "{0} + {1}i", real, imaginary )); } }
/// <summary> /// Класс для тестирования типа комплексного числа /// </summary> public class ComplexNumbersTest { public static void Main () {
// Создаем два комплексных числа Complex c1 = new Complex ( 2,3 ); Complex c2 = new Complex ( 3,4 );
// Выполняем арифметические операции Complex eq1 = c1 + c2 * - c1; Complex eq2 = ( c1 == c2 )? 4 * c1: 4 * c2; Complex eq3 = 73 - ( c1 - c2 ) / ( c2 - 4 );
// Неявное преобразование комплексного числа // в число с плавающей точкой float real = c1;
// Явное преобразование числа с плавающей точкой в комплексное // (требует явного приведения) Complex c3 = ( Complex ) 34;
// Выводим комплексные числа c1 и c2 Console. WriteLine ( "Complex number 1: {0}", c1 ); Console. WriteLine ( "Complex number 2: {0}\n", c2 );
// Выводим результаты арифметических операций Console. WriteLine ( "Result of equation 1: {0}", eq1 ); Console. WriteLine ( "Result of equation 2: {0}", eq2 ); Console. WriteLine ( "Result of equation 3: {0}", eq3 ); Console. WriteLine ();
// Выводим результаты преобразований Console. WriteLine ( "Complex-to-float conversion: {0}", real ); Console. WriteLine ( "float-to-Complex conversion: {0}", c3 ); Console. ReadLine (); } }
Если бы оно было записано с помощью вызовов методов, получилось бы нечто вроде этого:
|