Riepilogo - Frazioni
Fa parte della sezione Programmazione orientata agli oggetti del percorso Ruby di Coddy. Lezione 41 di 57.
Sfida
DifficileCompleta la classe valore Frac. initialize(num, den) riduce la frazione e mantiene il segno al numeratore, sollevando ZeroDivisionError con zero denominator quando den è 0. Definisci +, -, * e / che restituiscono nuove frazioni (/ per una frazione nulla solleva ZeroDivisionError con division by zero), -@, ==, eql? e hash, in modo che le frazioni uguali siano la stessa chiave Hash, e <=> con Comparable. to_s restituisce 3/4, oppure 2 quando il denominatore è 1.
Il codice fornito legge i comandi: 1/2 + 1/3 (uno qualsiasi dei quattro operatori), neg 3/4, sort 1/2 1/3 3/4, max 1/2 2/3, uniq 1/2 2/4 1/3 (stampa il conteggio e le frazioni distinte) e cmp 1/2 2/4 (stampa =, < oppure >). Gli errori stampano il loro messaggio.
Il tuo codice va in frac.rb. main.rb contiene il codice di input/output fornito e non può essere modificato.
Provalo tu
require_relative 'frac'
# Codice di input/output fornito: lascialo così com'è
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
Tutte le lezioni di Programmazione orientata agli oggetti
1Classi e oggetti
Lavorare con i fileDefinire le classiVariabili d'istanzaMetodi e selfto_s e inspectRipasso - Tessera della biblioteca4Incapsulamento
Metodi privatiMetodi protettiSetter privatiProteggere lo statoRiepilogo - Distributore automatico7Polimorfismo e Duck Typing
PolimorfismoDuck TypingMetodi astratticase e classiRiepilogo - Metodi di pagamento10Pattern di progettazione Parte 2
Delegazione con ForwardablePattern DecoratorPattern BuilderPattern State2Metodi di accesso e self
Metodi di lettura e scritturaSetter personalizzatiself nei metodiIdentità e uguaglianzaRiepilogo - Elenco contatti5Ereditarietà
SottoclassiRidefinizione dei metodiChiamare superis_a? e antenatiRiepilogo - Paghe del personale8Metodi speciali
Uguaglianza e hashMetodi degli operatoriIndicizzazione e appendCollezioni personalizzateRiepilogo - Frazioni11Progetto: Gestione della biblioteca
Libri e iscrittiPrendere in prestito i libriEsercitati da solo: Compilatore Ruby online