Menu
Coddy logo textTech

Grand livre bancaire

Fait partie de la section Programmation orientée objet du Journey R de Coddy. Leçon 57 sur 57.

challenge icon

Défi

Difficile

Construisez une petite banque à partir de classes de référence dans quatre fichiers. Toutes les définitions sont encapsulées dans suppressMessages() ; utilisez call. = FALSE dans chaque stop().

  • Account.R : champs id, owner, balance (0 au départ). deposit(x) et withdraw(x) s'arrêtent avec invalid amount lorsque x est manquant ou inférieur à 1 ; withdraw() s'arrête avec insufficient funds in 2 lorsque le solde passerait sous lowest(), qui vaut 0. month_end() ne fait rien ; line() renvoie 1 ada checking: -20 en utilisant kind().
  • Checking.R : type checking ; le solde peut descendre jusqu'à -100.
  • Savings.R : type savings ; au plus 2 retraits par mois (withdrawal limit on 2), comptabilisés uniquement lorsqu'ils réussissent ; month_end() ajoute 1 % d'intérêts, arrondi à l'entier inférieur, et réinitialise le compteur.
  • Bank.R : open_account(kind, id, owner) (account 2 exists), get_account(id) (no account 9), transfer(from, to, amount), qui ne modifie rien lorsque le retrait échoue, month_end() pour chaque compte, et statement(), les lignes de tous les comptes triées par identifiant.

Le code fourni lit les commandes open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 ou month, affiche ok ou le message d'erreur pour chacune, puis l'état des comptes.

Votre code doit se trouver dans Account.R, Checking.R, Savings.R et Bank.R. main.R contient le code fourni pour les entrées et sorties et ne peut pas être modifié.

Essayez vous-même

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

# Code d'entrée/sortie fourni : le garder tel quel
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 = "")

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Compilateur R en ligne