Rejestr bankowy
Część sekcji Programowanie obiektowe ścieżki R w Coddy. Lekcja 57 z 57.
Wyzwanie
TrudnyZbuduj 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: polaid,owner,balance(na początku 0).deposit(x)iwithdraw(x)zatrzymują działanie z komunikateminvalid amount, gdyxnie ma wartości lub jest mniejsze niż 1;withdraw()zatrzymuje działanie z komunikateminsufficient funds in 2, gdy saldo spadłoby poniżej wartościlowest(), która wynosi 0.month_end()nic nie robi;line()zwraca1 ada checking: -20, używająckind().Checking.R: rodzajchecking; saldo może spaść do -100.Savings.R: rodzajsavings; 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 orazstatement(), 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
1Podstawy S3
Praca z plikamiListy z klasąFunkcje konstruktoraMetody print i formatWalidatory i funkcje pomocniczePowtórzenie — temperatury4Enkapsulacja w R
Domknięcia jako obiektyŚrodowiska jako obiektyFunkcje dostępoweOchrona stanuPodsumowanie – parkometr2Generics i metody S3
Generics i UseMethodMetody domyślneMetody dla podstawowych genericsPodstawy NextMethodPowtórzenie — pola figur5Klasy S4
Definiowanie klas S4Sloty i dostępSprawdzanie poprawnościMetody wyświetlaniaPodsumowanie – katalog produktów8Klasy referencyjne
Definiowanie klas referencyjnychMetody i aktualizacja pólSemantyka kopiowaniaDziedziczenie i callSuperPodsumowanie – kolejka zadań11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książek3Dziedziczenie S3
Wektory klasKolejność wyszukiwania metodRozszerzanie za pomocą NextMethodSprawdzanie za pomocą inherits()Powtórzenie — lista płac pracownikówPoćwicz samodzielnie: Kompilator R online