Menu
Coddy logo textTech

Libro mayor bancario

Parte de la sección Programación orientada a objetos del Journey de R de Coddy. Lección 57 de 57.

challenge icon

Desafío

Difícil

Construye un banco pequeño a partir de Reference Classes en cuatro archivos. Todas las definiciones están envueltas en suppressMessages(); usa call. = FALSE en cada stop().

  • Account.R: campos id, owner, balance (0 al inicio). deposit(x) y withdraw(x) se detienen con invalid amount cuando x falta o es menor que 1; withdraw() se detiene con insufficient funds in 2 cuando el saldo bajaría de lowest(), que es 0. month_end() no hace nada; line() devuelve 1 ada checking: -20 usando kind().
  • Checking.R: tipo checking; el saldo puede bajar hasta -100.
  • Savings.R: tipo savings; como máximo 2 retiros por mes (withdrawal limit on 2), contados solo cuando tienen éxito; month_end() añade un 1% de interés, redondeado hacia abajo, y reinicia el contador.
  • Bank.R: open_account(kind, id, owner) (account 2 exists), get_account(id) (no account 9), transfer(from, to, amount), que no cambia nada cuando el retiro falla, month_end() para cada cuenta y statement(), las líneas de todas las cuentas ordenadas por id.

El código proporcionado lee los comandos open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 o month, imprime ok o el mensaje de error correspondiente para cada uno y, después, el extracto.

Tu código va en Account.R, Checking.R, Savings.R y Bank.R. main.R contiene el código proporcionado de entrada/salida y no se puede editar.

Pruébalo tú mismo

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

# Código de entrada/salida suministrado: déjalo tal como está
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 = "")

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Compilador de R online