銀行台帳
CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 57/57。
チャレンジ
難しい4つのファイルでReference Classesを使った小さな銀行を構築します。すべての定義はsuppressMessages()でラップし、すべてのstop()でcall. = FALSEを使用してください。
Account.R: フィールドはid、owner、balance(開始時は0)。deposit(x)とwithdraw(x)は、xが指定されていないか1未満の場合、invalid amountで停止します。残高がlowest()(0)を下回る場合、withdraw()はinsufficient funds in 2で停止します。month_end()は何もせず、line()はkind()を使って1 ada checking: -20を返します。Checking.R: 種類はcheckingです。残高は-100まで下げることができます。Savings.R: 種類はsavingsです。1か月あたりの引き出しは最大2回(withdrawal limit on 2)で、成功した場合のみ回数に加算します。month_end()は1%の利息を加算し、端数を切り捨てて、回数をリセットします。Bank.R:open_account(kind, id, owner)(account 2 exists)、get_account(id)(no account 9)、引き出しに失敗した場合は何も変更しないtransfer(from, to, amount)、すべての口座に対するmonth_end()、およびID順に並べたすべての口座の行を返すstatement()を実装します。
提供されているコードは、open checking 1 ada、dep 1 100、wd 2 30、tr 1 2 50、またはmonthのコマンドを読み取り、それぞれについてokまたはエラーメッセージを出力し、その後に明細を出力します。
コードはAccount.R、Checking.R、Savings.R、Bank.Rに記述します。main.Rには提供された入出力コードが含まれており、編集できません。
自分で試してみよう
source("Account.R")
source("Checking.R")
source("Savings.R")
source("Bank.R")
# 提供された入出力コード: そのままにしておく
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 = "")
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ