חזרה – שברים
חלק מהיחידה תכנות מונחה עצמים במסלול ה-Ruby של Coddy. שיעור 41 מתוך 57.
אתגר
קשההשלימו את מחלקת הערכים 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
כל השיעורים ביחידה תכנות מונחה עצמים
3מתודות ומשתנים של מחלקה
מתודות של מחלקהמשתני מופע של מחלקהקבועיםמתודות ליצירת מופעיםסיכום – קודי קופוןתרגלו בעצמכם: קומפיילר Ruby אונליין