Menu
Coddy logo textTech

Банковская книга

Часть раздела Объектно-ориентированное программирование путешествия по R на Coddy. Урок 57 из 57.

challenge icon

Задание

Сложно

Создайте небольшой банк с использованием Reference Classes в четырёх файлах. Все определения обёрнуты в suppressMessages(); используйте call. = FALSE в каждом вызове stop().

  • Account.R: поля id, owner, balance (в начале равен 0). deposit(x) и withdraw(x) завершаются с ошибкой invalid amount, когда x отсутствует или меньше 1; withdraw() завершается с ошибкой insufficient funds in 2, если баланс станет ниже lowest(), равного 0. month_end() ничего не делает; line() возвращает 1 ada checking: -20, используя kind().
  • Checking.R: вид checking; баланс может опускаться до -100.
  • Savings.R: вид savings; не более 2 снятий в месяц (withdrawal limit on 2), учитываются только успешные операции; month_end() добавляет 1% процентов, округляя вниз, и сбрасывает счётчик.
  • Bank.R: open_account(kind, id, owner) (account 2 exists), get_account(id) (no account 9), transfer(from, to, amount), который ничего не меняет, если снятие не удалось, month_end() для каждого счёта и statement() — строки всех счетов, отсортированные по идентификатору.

Предоставленный код считывает команды open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 или month, выводит ok или сообщение об ошибке для каждой команды, а затем выписку.

Ваш код должен находиться в файлах Account.R, Checking.R, Savings.R и Bank.R. В main.R находится предоставленный код ввода/вывода, и его нельзя редактировать.

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

source("Account.R")
source("Checking.R")
source("Savings.R")
source("Bank.R")

# Предоставленный код ввода/вывода: оставьте его как есть
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 = "")

Все уроки раздела Объектно-ориентированное программирование

Потренируйтесь самостоятельно: Онлайн-компилятор R