Menu
Coddy logo textTech

Récapitulatif - Fractions

Fait partie de la section Programmation orientée objet du Journey Ruby de Coddy. Leçon 41 sur 57.

challenge icon

Défi

Difficile

Complétez la classe de valeur Frac. initialize(num, den) réduit la fraction et conserve le signe au numérateur, en levant ZeroDivisionError avec zero denominator lorsque den vaut 0. Définissez +, -, * et / pour retourner de nouvelles fractions (/ avec une fraction nulle lève ZeroDivisionError avec division by zero), ainsi que -@, ==, eql? et hash, afin que les fractions égales soient la même clé de Hash, et <=> avec Comparable. to_s retourne 3/4, ou 2 lorsque le dénominateur vaut 1.

Le code fourni lit des commandes : 1/2 + 1/3 (n’importe lequel des quatre opérateurs), neg 3/4, sort 1/2 1/3 3/4, max 1/2 2/3, uniq 1/2 2/4 1/3 (en affichant le nombre et les fractions distinctes) et cmp 1/2 2/4 (en affichant =, < ou >). Les erreurs affichent leur message.

Votre code doit être placé dans frac.rb. main.rb contient le code fourni d’entrée/sortie et ne peut pas être modifié.

Essayez vous-même

require_relative 'frac'

# Code d'entrée/sortie fourni : le garder tel quel
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

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur Ruby en ligne