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

0 comentarios:
Publicar un comentario