Conversores, Operadores y Delegados en C#

by 8:39 0 comentarios
En el último seminario de LP a Laila, Carlos y a mí nos tocó hablar sobre conversores, operadores y delegados en C#. Este es el problema que teníamos que resolver:

[Operadores y conversores] Implemente en C# una clase Complex que represente a los números complejos. Dicha clase debe cumplir que:
  •  Console.WriteLine(c) debe imprimir el número complejo en formato a + bi
  •  Complex c = 35; debe compilar y representa el número  35 + 0i.
  • Dos números complejos deben poder sumarse: Complex result = c1 + c2;
  • Un array de números complejos tiene que poder ordenarse con Array.Sort()
  •  int real = (int)complex; debe asignar a la variable “real” la parte real del número complejo, pero int real = complex; debe dar error en compilación.
  •  La inicialización de un número complejo debe ser var c = new Complex(1,2). No obstante, quizás haya una forma adicional más elegante y cómoda de inicializar un número complejo. ¿Es posible hacer algo como Complex result = C(2,4) + C(4,0)? ¿se pudiera explícitamente definir la parte real y la imaginaria como C(i:8, r:3)?
La solución que propusimos fue la siguiente:
using System;
namespace Seminario_LP_Csharp
{
    public delegate Complex BuildFunctionDelegate(int r = 0, int i = 0);

    public class Complex : IComparable<Complex>
    {
        #region Static Members

        public static BuildFunctionDelegate BuildFunction = (r, i) => new Complex(r, i);

        public static Complex i = new Complex(i: 1);

        #endregion

        #region Private Members and Constructors

        private readonly int real, imag;

        public Complex(int r = 0, int i = 0)
        {
            real = r;
            imag = i;
        }

        #endregion

        #region Operators

        public static Complex operator +(Complex c1, Complex c2)
        {
            return new Complex(c1.real + c2.real, c1.imag + c2.imag);
        }

        public static Complex operator +(Complex c1, int c2)
        {
            return new Complex(c1.real + c2, c1.imag);
        }

        public static Complex operator *(Complex c1, int c2)
        {
            return new Complex(c1.real * c2, c1.imag * c2);
        }
        public static Complex operator *(int c1, Complex c2)
        {
            return c2 * c1;
        }

        #region Converters

        public static implicit operator Complex(int n)
        {
            return new Complex(n);
        }

        public static explicit operator int(Complex n)
        {
            return n.real;
        }

        #endregion

        #endregion

        #region IComparable Implementation

        public int CompareTo(Complex other)
        {
            int c = real.CompareTo(other.real);
            if (c != 0) return c;
            return imag.CompareTo(other.imag);
        }

        #endregion

        #region Overrides

        public override string ToString()
        {
            return string.Format("{0} + {1}i", real, imag);
        }

        #endregion
    }
}

abeagomez

Developer

No se que poner aqui todavia. Pero ya algo se me ocurrira....

0 comentarios:

Publicar un comentario