Menu
Coddy logo textTech

חזרה – שברים

חלק מהיחידה תכנות מונחה עצמים במסלול ה-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 אונליין