Menu
Coddy logo textTech

復習 - スタッフ給与計算

CoddyのRubyジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 26/57。

challenge icon

チャレンジ

中級

継承を使って給与計算を構築してください。Employee.new(name, rate) には pay(hours)(rate と hours の積。ただし 40 を超える hours には rate の 1.5 倍を支払う)と、pay(hours) および role から構成された Ada (employee): 800.00 を返す line(hours) があります。role は employee を返します。Manager.new(name, rate, bonus) は name と rate を super に渡し、super の pay に bonus を加え、role は manager です。Contractor < Employee は時間外労働なしで rate と hours の積が支払われ、role は contractor です。

提供されたコードは、employee Ada 20 40、manager Bo 30 45 500、または contractor Cy 50 50(name、rate、hours、および manager の場合は bonus)の行を読み取り、それぞれについて line(hours) を出力します。その後、staff: 3, managers: 1, employees: 3(いずれも is_a? で数えるため、manager と contractor も employee です)と合計給与を出力します。

コードは 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オンラインコンパイラ