Menu
Coddy logo textTech

ספר חשבונות בנק

חלק מהיחידה תכנות מונחה עצמים במסלול ה-R של Coddy. שיעור 57 מתוך 57.

challenge icon

אתגר

קשה

בנו בנק קטן באמצעות מחלקות Reference בארבעה קבצים. עטפו את כל ההגדרות ב-suppressMessages(); השתמשו ב-call. = FALSE בכל קריאה ל-stop().

  • Account.R: השדות id, owner, balance (0 בתחילת הדרך). הקריאות deposit(x) ו-withdraw(x) יעצרו עם invalid amount כאשר x חסר או קטן מ-1; withdraw() תיעצר עם insufficient funds in 2 אם היתרה תרד מתחת ל-lowest(), שערכו 0. month_end() לא עושה דבר; line() מחזירה 1 ada checking: -20 באמצעות kind().
  • Checking.R: הסוג הוא checking; היתרה יכולה לרדת עד ‎-100.
  • Savings.R: הסוג הוא savings; אפשר לבצע לכל היותר 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() עבור כל חשבון, ו-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 אונליין