Classe de Números Racionais (Parte 3)

Nas partes 1 e 2 deste desafio de 3 partes, foi solicitado que você desenvolvesse uma estrutura de número racional struct. Um número racional, como o nome sugere, é uma razão entre dois números naturais e geralmente é representado como uma fração na forma 1/2, 5/4, -79/13, etc.

Na parte 1, a tarefa era criar uma struct de C# com:

  • Um construtor que recebe dois parâmetros inteiros,
  • duas propriedades somente leitura Numerator e Denominator que retornam o numerador e o denominador da fração, respectivamente, reduzidos à sua forma irredutível.
  • Uma sobrescrita do método ToString() que fornece uma representação em string do número racional, conforme descrito no parágrafo anterior.

Na parte 2, o código foi estendido para:

  • Permitir operações aritméticas +, -, * e / entre números racionais (incluindo o operador unário -)
  • Uma propriedade Sign que retorna o sinal da fração.

Antes de concluir esta parte, certifique-se de que sua classe atende às condições descritas nas partes 1 e 2. A melhor maneira de fazer isso é concluir esses desafios primeiro e usar o código para começar este desafio.

Tarefa

Sua tarefa agora é adicionar operadores de comparação à sua classe para que números racionais possam ser comparados entre si usando os operadores de comparação ==, !=, <, <=, > e >=. Outro requisito é implementar a conversão implícita e explícita de e para o tipo de valor C# decimal. Para obter informações sobre como implementar essas funcionalidades, consulte a aba Resources.

Exemplos

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

Ao sobrecarregar os operadores de comparação == e !=, também será esperado que você sobrescreva os métodos Equals() e GetHashCode() (consulte a aba Resources para obter mais informações).