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

مراجعة - رواتب الموظفين

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

challenge icon

التحدي

متوسط

أنشئ نظام رواتب باستخدام الوراثة. Employee.new(name, rate) لديه pay(hours) (معدل الأجر مضروبًا في الساعات، مع دفع الساعات التي تتجاوز 40 بمعدل يساوي 1.5 من الأجر) وline(hours) التي تُرجع Ada (employee): 800.00، مبنيةً من pay(hours) وrole، حيث تُرجع role القيمة employee. يمرّر Manager.new(name, rate, bonus) الاسم والأجر إلى super، ويضيف المكافأة إلى أجر super، ويكون دوره manager. يحصل Contractor < Employee على أجر يساوي معدل الأجر مضروبًا في الساعات دون أجر إضافي، ويكون دوره contractor.

يقرأ الكود المُ provided الأسطر employee Ada 20 40 أو manager Bo 30 45 500 أو contractor Cy 50 50 (الاسم، ومعدل الأجر، والساعات، ومكافأة للمديرين)، ويطبع line(hours) لكل منها، ثم staff: 3, managers: 1, employees: 3 (يُحصى كلاهما باستخدام is_a?، لذا فإن المديرين والمتعاقدين موظفون أيضًا) وإجمالي الأجر.

ضع الكود في employee.rb وmanager.rb وcontractor.rb. يحتوي main.rb على كود الإدخال/الإخراج المُ provided ولا يمكن تعديله.

جرّب بنفسك

require_relative 'employee'
require_relative 'manager'
require_relative 'contractor'

# كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
input = []
while (line = gets)
  input << line.chomp
end
staff = input.map do |line|
  kind, name, rate, hours, bonus = line.split
  worker = case kind
           when "manager" then Manager.new(name, rate.to_f, bonus.to_f)
           when "contractor" then Contractor.new(name, rate.to_f)
           else Employee.new(name, rate.to_f)
           end
  [worker, hours.to_i]
end
staff.each { |worker, hours| puts worker.line(hours) }
managers = staff.count { |w, _| w.is_a?(Manager) }
employees = staff.count { |w, _| w.is_a?(Employee) }
puts "staff: #{staff.size}, managers: #{managers}, employees: #{employees}"
puts format("total: %.2f", staff.sum { |w, h| w.pay(h) })

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

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