Revisão - Frações
Parte da seção Programação orientada a objetos do Journey de Ruby da Coddy. Lição 41 de 57.
Desafio
DifícilComplete a classe de valor Frac. initialize(num, den) reduz a fração e mantém o sinal no numerador, gerando ZeroDivisionError com zero denominator quando den é 0. Defina +, -, * e / para retornar novas frações (/ por uma fração zero gera ZeroDivisionError com division by zero), -@, ==, eql? e hash para que frações iguais sejam a mesma chave de Hash, e <=> com Comparable. to_s retorna 3/4 ou 2 quando o denominador é 1.
O código fornecido lê comandos: 1/2 + 1/3 (qualquer um dos quatro operadores), neg 3/4, sort 1/2 1/3 3/4, max 1/2 2/3, uniq 1/2 2/4 1/3 (imprimindo a contagem e as frações distintas) e cmp 1/2 2/4 (imprimindo =, < ou >). Os erros imprimem sua mensagem.
Seu código deve ficar em frac.rb. main.rb contém o código fornecido de entrada/saída e não pode ser editado.
Experimente você mesmo
require_relative 'frac'
# Código de entrada/saída fornecido: mantenha-o como está
input = []
while (line = gets)
input << line.chomp
end
def frac(text)
n, d = text.split("/").map(&:to_i)
Frac.new(n, d || 1)
end
input.each do |line|
parts = line.split
begin
case parts[0]
when "neg" then puts(-frac(parts[1]))
when "sort" then puts parts[1..].map { |t| frac(t) }.sort.join(" ")
when "max" then puts parts[1..].map { |t| frac(t) }.max
when "uniq"
distinct = parts[1..].map { |t| frac(t) }.uniq
puts "#{distinct.size}: #{distinct.join(" ")}"
when "cmp"
order = frac(parts[1]) <=> frac(parts[2])
puts ["<", "=", ">"][order + 1]
else
a = frac(parts[0])
b = frac(parts[2])
puts a.public_send(parts[1], b)
end
rescue ZeroDivisionError => e
puts e.message
end
end
Todas as lições de Programação orientada a objetos
1Classes e Objetos
Trabalhando com ArquivosDefinindo ClassesVariáveis de InstânciaMétodos e selfto_s e inspectRevisão - Cartão da Biblioteca4Encapsulamento
Métodos privadosMétodos protegidosSetters privadosProtegendo o estadoRevisão - Máquina de venda automática7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMétodos Abstratoscase e ClassesRevisão - Métodos de Pagamento2Acessores e self
Leitores e GravadoresSetters Personalizadosself nos MétodosIdentidade e IgualdadeRecapitulação - Lista de Contatos5Herança
SubclassesSobrescrita de métodosChamando superis_a? e ancestraisRevisão - Folha de pagamento da equipe8Métodos Especiais
Igualdade e hashMétodos de OperadoresIndexação e AdiçãoColeções PersonalizadasRevisão - Frações11Projeto: Gerenciamento de Biblioteca
Livros e MembrosEmpréstimo de LivrosPratique por conta própria: Compilador de Ruby online