Menu
CoddyTech

Ôn tập: đồng hồ tính phí đỗ xe

Thuộc phần Lập trình hướng đối tượng trong hành trình R của Coddy. Bài học 21 trên 57.

challenge icon

Thử thách

Trung bình

Hoàn thiện nhà máy make_meter(rate) trong Meter.R. rate là số phút mà mỗi xu mua được; hãy khóa nó bằng lockBinding() bên trong nhà máy để giá trị này không thể thay đổi. Đồng hồ tính số phút còn lại và số xu đã trả bằng các biến riêng tư, rồi trả về bốn hàm:

  • insert(cents) chỉ chấp nhận 10, 20, 50 hoặc 100, nếu không sẽ dừng với thông báo coin not accepted; mỗi đồng xu cộng thêm cents * rate phút và được tính vào số tiền đã trả.
  • wait(minutes) cho thời gian trôi qua: số phút còn lại giảm xuống nhưng không bao giờ thấp hơn 0. Nếu thời gian chờ là số âm, hàm sẽ dừng với thông báo time cannot go back.
  • status() trả về 12 min left, hoặc expired khi không còn thời gian.
  • paid() trả về số xu đã trả.

Dùng call. = FALSE. Code được cung cấp đọc giá trị rate, sau đó đọc các dòng coin 20 hoặc wait 5, rồi in trạng thái hoặc error: cùng thông báo sau mỗi dòng. Cuối cùng, code in số tiền đã trả và thử thay đổi rate trong môi trường của nhà máy.

Viết code của bạn trong Meter.R. Tệp main.R chứa code đầu vào/đầu ra được cung cấp và bạn không thể chỉnh sửa tệp này.

Tự làm thử

source("Meter.R")

# Đoạn code đầu vào/đầu ra đã có sẵn: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
meter <- make_meter(as.numeric(input[1]))
for (line in input[-1]) {
  p <- strsplit(line, " ")[[1]]
  msg <- tryCatch({
    if (p[1] == "coin") meter$insert(as.numeric(p[2]))
    if (p[1] == "wait") meter$wait(as.numeric(p[2]))
    meter$status()
  }, error = function(e) paste("error:", conditionMessage(e)))
  cat(line, ": ", msg, "\n", sep = "")
}
cat("paid: ", meter$paid(), " cents\n", sep = "")
r <- tryCatch({ environment(meter$insert)$rate <- 0; "rate changed" }, error = function(e) "rate is locked")
cat(r, "\n", sep = "")

Tất cả bài học trong Lập trình hướng đối tượng

Tự luyện tập: Trình biên dịch R online