Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - الكسور

جزء من قسم البرمجة كائنية التوجه في رحلة Ruby على Coddy. الدرس 41 من 57.

challenge icon

التحدي

صعب

أكمل فئة القيمة Frac. تقوم initialize(num, den) باختزال الكسر والإبقاء على الإشارة في البسط، وتطرح ZeroDivisionError مع zero denominator عندما تكون قيمة den هي 0. عرّف + و- و* و/ بحيث تُرجع كسورًا جديدة (القسمة / على كسر صفري تطرح ZeroDivisionError مع division by zero)، و-@ و== وeql? وhash بحيث تكون الكسور المتساوية مفتاح Hash نفسه، و<=> مع Comparable. تُرجع to_s القيمة 3/4، أو 2 عندما يكون المقام 1.

يقرأ الكود المزوَّد الأوامر: 1/2 + 1/3 (أيًّا من المعاملات الأربعة)، وneg 3/4، وsort 1/2 1/3 3/4، وmax 1/2 2/3، وuniq 1/2 2/4 1/3 (مع طباعة العدد والكسور المميّزة)، وcmp 1/2 2/4 (مع طباعة = أو < أو >). تُطبع رسالة الأخطاء.

ضع الكود في frac.rb. يحتوي main.rb على كود الإدخال/الإخراج المزوَّد، ولا يمكن تعديله.

جرّب بنفسك

require_relative 'frac'

# كود الإدخال/الإخراج المُزوَّد: اتركه كما هو
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

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم Ruby عبر الإنترنت