Menu
CoddyTech

Sổ cái ngân hàng

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 57 trên 57.

challenge icon

Thử thách

Khó

Tạo một ngân hàng nhỏ bằng các lớp tham chiếu trong bốn tệp. Tất cả định nghĩa đều được bọc trong suppressMessages(); dùng call. = FALSE trong mọi stop().

  • Account.R: các trường id, owner, balance (bằng 0 lúc bắt đầu). deposit(x) và withdraw(x) dừng với thông báo invalid amount khi x bị thiếu hoặc nhỏ hơn 1; withdraw() dừng với thông báo insufficient funds in 2 nếu số dư giảm xuống dưới lowest(), giá trị này là 0. month_end() không làm gì; line() trả về 1 ada checking: -20 bằng cách dùng kind().
  • Checking.R: loại checking; số dư có thể giảm xuống -100.
  • Savings.R: loại savings; mỗi tháng được rút tối đa 2 lần (withdrawal limit on 2), chỉ tính những lần rút thành công; month_end() cộng lãi suất 1%, làm tròn xuống, rồi đặt lại số lần rút.
  • Bank.R: open_account(kind, id, owner) (account 2 exists), get_account(id) (no account 9), transfer(from, to, amount), không thay đổi gì nếu rút tiền thất bại, month_end() áp dụng cho mọi tài khoản và statement() trả về các dòng của tất cả tài khoản, được sắp xếp theo id.

Code được cung cấp đọc các lệnh open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 hoặc month, in ra ok hoặc thông báo lỗi tương ứng cho mỗi lệnh, rồi in bảng kê.

Code của bạn nằm trong Account.R, Checking.R, Savings.R và Bank.R. 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("Account.R")
source("Checking.R")
source("Savings.R")
source("Bank.R")

# Đoạn code đầu vào/đầu ra đã được cung cấp: giữ nguyên
input <- suppressWarnings(readLines(file("stdin")))
bank <- Bank$new()
for (line in input) {
  p <- strsplit(line, " ")[[1]]
  n <- suppressWarnings(as.numeric(p[-1]))
  msg <- tryCatch({
    switch(p[1],
      open = bank$open_account(p[2], as.numeric(p[3]), p[4]),
      dep = bank$get_account(n[1])$deposit(n[2]),
      wd = bank$get_account(n[1])$withdraw(n[2]),
      tr = bank$transfer(n[1], n[2], n[3]),
      month = bank$month_end())
    "ok"
  }, error = function(e) conditionMessage(e))
  cat(line, ": ", msg, "\n", sep = "")
}
for (l in bank$statement()) cat(l, "\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