Clase de números racionales (Parte 3)

En las partes 1 y 2 de este desafío de 3 partes, se te pidió desarrollar una estructura de número racional struct. Un número racional, como su nombre indica, es una razón entre dos números naturales y normalmente se representa como una fracción con la forma 1/2, 5/4, -79/13, etc.

En la parte 1, la tarea consistía en crear una struct de C# con:

  • Un constructor que recibe dos parámetros enteros,
  • dos propiedades de solo lectura Numerator y Denominator que devuelven el numerador y el denominador de la fracción, respectivamente, reducidos a su forma irreducible.
  • Una redefinición del método ToString() que proporciona una representación de cadena del número racional, como se describió en el párrafo anterior.

En la parte 2, el código se amplió para:

  • Permitir operaciones aritméticas +, -, * y / entre números racionales (incluido el operador unario -)
  • Una propiedad Sign que devuelve el signo de la fracción.

Antes de completar esta parte, asegúrate de que tu clase cumpla las condiciones descritas en las partes 1 y 2. La mejor manera de hacerlo es completar primero esos desafíos y usar el código para comenzar este desafío.

Tarea

Tu tarea ahora es agregar operadores de comparación a tu clase para que los números racionales puedan compararse entre sí mediante los operadores de comparación ==, !=, <, <=, > y >=. Otro requisito es implementar la conversión implícita y explícita hacia y desde el tipo de valor C# decimal. Para obtener información sobre cómo implementar estas funcionalidades, consulta la pestaña Resources.

Ejemplos

var r1 = new Rational(1, 2);
var r2 = new Rational(10, 8);
var r3 = new Rational(2, -1);

// Comparison operations
r1 == r2 ➞ false
r2 >= r1 ➞ true
r2 != r3 ➞ true
r1 == new Rational(17/34) ➞ true

// Type conversion
var r4 = (Rational)6.5572m; ➞ explicit conversion from decimal
var d = (decimal)r2;  ➞ explicit conversion to decimal
r4 == 6.5572m ➞ true (implicit conversion to decimal)
r4.ToString() ➞ "16393/2500"

Notas

Al sobrecargar los operadores de comparación == y !=, también se espera que redefinas los métodos Equals() y GetHashCode() (consulta la pestaña Resources para obtener más información).