Menu
Coddy logo textTech

銀行台帳

CoddyのRジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 57/57。

challenge icon

チャレンジ

難しい

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オンラインコンパイラ