Menu
Coddy logo textTech

Повторение — расчёт зарплаты сотрудников

Часть раздела Объектно-ориентированное программирование путешествия по 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.

Предоставленный код считывает строки 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 находится предоставленный код ввода/вывода, и его нельзя редактировать.

Попробуйте сами

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