Menu
Coddy logo textTech

Powtórka – ułamki

Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 41 z 57.

challenge icon

Wyzwanie

Trudny

Uzupełnij klasę wartości Frac. initialize(num, den) skraca ułamek i umieszcza znak w liczniku, zgłaszając ZeroDivisionError z komunikatem zero denominator, gdy den wynosi 0. Zdefiniuj +, -, * i /, które zwracają nowe ułamki (/ przez ułamek o wartości 0 zgłasza ZeroDivisionError z komunikatem division by zero), a także -@, ==, eql? i hash, tak aby równe ułamki były tym samym kluczem w Hash, oraz <=> z modułem Comparable. to_s zwraca 3/4 lub 2, gdy mianownik wynosi 1.

Dostarczony kod odczytuje polecenia: 1/2 + 1/3 (dowolny z czterech operatorów), neg 3/4, sort 1/2 1/3 3/4, max 1/2 2/3, uniq 1/2 2/4 1/3 (wypisując liczbę i różne ułamki) oraz cmp 1/2 2/4 (wypisując =, < lub >). Błędy wypisują swój komunikat.

Twój kod umieść w pliku frac.rb. Plik main.rb zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

require_relative 'frac'

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator Ruby online