Menu
CoddyTech

Ulasan, Mesin Penjual Otomatis

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 21 dari 57.

challenge icon

Tantangan

Sedang

Buat mesin penjual otomatis dengan class error UnknownProduct, SoldOut dan NotEnoughCredit, semuanya merupakan subclass StandardError. VendingMachine.new(stock) menerima hash { "cola" => [150, 2] } (harga dalam sen, jumlah). credit bisa dibaca, tetapi hanya dapat diatur melalui setter private. insert(cents) menambahkan kredit. buy(name) memunculkan UnknownProduct (no such product: tea), SoldOut (cola is sold out) atau NotEnoughCredit (cola costs 1.50, credit 1.00) sesuai urutan tersebut. Jika tidak, fungsi ini mengambil satu barang dari stok, mengurangi harga dan mengembalikan namanya. refund mengembalikan kredit dan mengaturnya ke 0. Helper private money(cents) memformat 1.50.

Kode yang disediakan membaca stok dari baris pertama (cola:150:2,chips:90:1), lalu perintah insert n, buy name atau refund. Kode ini mencetak credit 2.00, bought cola, refund 0.50 atau pesan error, lalu mencoba mengatur credit dari luar, dan mencetak credit is protected.

Kodemu ditulis di unknown_product.rb, sold_out.rb, not_enough_credit.rb dan vending_machine.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'unknown_product'
require_relative 'sold_out'
require_relative 'not_enough_credit'
require_relative 'vending_machine'

# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
  input << line.chomp
end
stock = input[0].split(",").to_h do |entry|
  name, price, count = entry.split(":")
  [name, [price.to_i, count.to_i]]
end
machine = VendingMachine.new(stock)
input.drop(1).each do |line|
  command, arg = line.split
  begin
    case command
    when "insert"
      machine.insert(arg.to_i)
      puts format("credit %.2f", machine.credit / 100.0)
    when "buy"
      puts "bought #{machine.buy(arg)}"
    else
      puts format("refund %.2f", machine.refund / 100.0)
    end
  rescue UnknownProduct, SoldOut, NotEnoughCredit => e
    puts e.message
  end
end
begin
  machine.credit = 500
  puts "credit changed"
rescue NoMethodError
  puts "credit is protected"
end

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online