Menu
Coddy logo textTech

Bankbuch

Teil des Abschnitts Objektorientierte Programmierung der R-Journey von Coddy. Lektion 57 von 57.

challenge icon

Aufgabe

Schwer

Erstelle aus Reference Classes in vier Dateien eine kleine Bank. Alle Definitionen sind in suppressMessages() eingeschlossen; verwende in jedem stop() call. = FALSE.

  • Account.R: Felder id, owner, balance (zu Beginn 0). deposit(x) und withdraw(x) brechen mit invalid amount ab, wenn x fehlt oder kleiner als 1 ist; withdraw() bricht mit insufficient funds in 2 ab, wenn das Guthaben unter lowest() sinken würde, das 0 ist. month_end() tut nichts; line() gibt mithilfe von kind() 1 ada checking: -20 zurück.
  • Checking.R: Art checking; das Guthaben darf bis auf -100 sinken.
  • Savings.R: Art savings; höchstens 2 Abhebungen pro Monat (withdrawal limit on 2), die nur gezählt werden, wenn sie erfolgreich sind; month_end() fügt 1 % Zinsen hinzu, abgerundet, und setzt den Zähler zurück.
  • Bank.R: open_account(kind, id, owner) (account 2 exists), get_account(id) (no account 9), transfer(from, to, amount), das bei fehlgeschlagener Abhebung nichts verändert, month_end() für jedes Konto sowie statement(), die nach id sortierten Zeilen aller Konten.

Der bereitgestellte Code liest die Befehle open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 oder month, gibt für jeden Befehl ok oder die Fehlermeldung aus und anschließend die Kontoübersicht.

Dein Code gehört in Account.R, Checking.R, Savings.R und Bank.R. main.R enthält den bereitgestellten Ein-/Ausgabecode und darf nicht bearbeitet werden.

Probier es selbst

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

# Bereitgestellter Ein-/Ausgabecode: belasse ihn wie er ist
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 = "")

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Online-R-Compiler