Menu
Coddy logo textTech

Rejestr bankowy

Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 57 z 57.

challenge icon

Wyzwanie

Trudny

Zbuduj mały bank przy użyciu klas referencyjnych w czterech plikach. Wszystkie definicje są opakowane w suppressMessages(); użyj call. = FALSE w każdym wywołaniu stop().

  • Account.R: pola id, owner, balance (na początku 0). deposit(x) i withdraw(x) zatrzymują działanie z komunikatem invalid amount, gdy x nie ma wartości lub jest mniejsze niż 1; withdraw() zatrzymuje działanie z komunikatem insufficient funds in 2, gdy saldo spadłoby poniżej wartości lowest(), która wynosi 0. month_end() nic nie robi; line() zwraca 1 ada checking: -20, używając kind().
  • Checking.R: rodzaj checking; saldo może spaść do -100.
  • Savings.R: rodzaj savings; najwyżej 2 wypłaty w miesiącu (withdrawal limit on 2), liczone tylko wtedy, gdy się powiodą; month_end() dodaje odsetki w wysokości 1%, zaokrąglone w dół, i zeruje licznik.
  • Bank.R: open_account(kind, id, owner) (account 2 exists), get_account(id) (no account 9), transfer(from, to, amount), które nie zmienia niczego, jeśli wypłata się nie powiedzie, month_end() dla każdego konta oraz statement(), czyli wiersze wszystkich kont posortowane według identyfikatora.

Dostarczony kod odczytuje polecenia open checking 1 ada, dep 1 100, wd 2 30, tr 1 2 50 lub month, wypisuje dla każdego ok albo komunikat o błędzie, a następnie zestawienie.

Twój kod umieść w plikach Account.R, Checking.R, Savings.R i Bank.R. Plik main.R zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

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

# Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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 = "")

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Kompilator R online