Menu
Coddy logo textTech

Livro-caixa Bancário

Parte da seção Programação Orientada a Objetos do Journey de R da Coddy. Lição 57 de 57.

challenge icon

Desafio

Difícil

Construa um pequeno banco usando Reference Classes em quatro arquivos. Todas as definições são envolvidas por suppressMessages(); use call. = FALSE em cada stop().

  • Account.R: campos id, owner, balance (0 no início). deposit(x) e withdraw(x) interrompem com invalid amount quando x está ausente ou é menor que 1; withdraw() interrompe com insufficient funds in 2 quando o saldo ficaria abaixo de lowest(), que é 0. month_end() não faz nada; line() retorna 1 ada checking: -20 usando kind().
  • Checking.R: tipo checking; o saldo pode chegar a -100.
  • Savings.R: tipo savings; no máximo 2 saques por mês (withdrawal limit on 2), contados somente quando são bem-sucedidos; month_end() adiciona juros de 1%, arredondados para baixo, e reinicia a contagem.
  • Bank.R: open_account(kind, id, owner) (account 2 exists), get_account(id) (no account 9), transfer(from, to, amount), que não altera nada quando o saque falha, month_end() para cada conta e statement(), as linhas de todas as contas ordenadas por id.

O código fornecido lê os comandos open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 ou month, imprime ok ou a mensagem de erro correspondente para cada um e, em seguida, o extrato.

Seu código deve ficar em Account.R, Checking.R, Savings.R e Bank.R. main.R contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

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

# Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação Orientada a Objetos

Pratique por conta própria: Compilador de R online