مراجعة - الكسور
جزء من قسم البرمجة كائنية التوجه في رحلة 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
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتمتغيرات النسخةالأساليب و selfto_s و inspectمراجعة - بطاقة المكتبة7تعدد الأشكال والكتابة بأسلوب البطة
تعدد الأشكالالكتابة بأسلوب البطةالأساليب المجردةالحالات والفئاتمراجعة - طرق الدفع3أساليب ومتغيرات الأصناف
أساليب الأصنافمتغيرات كائنات الأصنافالثوابتأساليب الإنشاءمراجعة - رموز القسائمتدرّب بنفسك: مترجم Ruby عبر الإنترنت