Powtórka – ułamki
Część sekcji Programowanie obiektowe ścieżki Ruby w Coddy. Lekcja 41 z 57.
Wyzwanie
TrudnyUzupeł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
1Klasy i obiekty
Praca z plikamiDefiniowanie klasZmienne instancjiMetody i selfto_s i inspectPowtórzenie – karta biblioteczna4Hermetyzacja
Metody prywatneMetody chronionePrywatne setteryOchrona stanuPowtórzenie – automat vendingowy7Polimorfizm i typowanie kacze
PolimorfizmTypowanie kaczeMetody abstrakcyjnecase i klasyPowtórzenie – metody płatności10Wzorce projektowe, część 2
Delegowanie z ForwardableWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Metody dostępowe i self
Gettery i setteryWłasne setteryself w metodachTożsamość i równośćPowtórzenie – lista kontaktów5Dziedziczenie
PodklasyNadpisywanie metodWywoływanie superis_a? i przodkowiePowtórka – lista płac pracowników8Metody specjalne
Równość i hashMetody operatorówIndeksowanie i dodawanieWłasne kolekcjePowtórka – ułamki11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Kompilator Ruby online