Menu
Coddy logo textTech

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

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

challenge icon

אתגר

קשה

בנו בנק קטן.

  • BankError(message) היא מחלקה חתומה שמרחיבה את Exception, עם תת-המחלקות InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) ו-NoAccount(id) (no account 9).
  • Account(id, owner) היא מחלקה מופשטת. אפשר לקרוא את balance מכל מקום, ולשנות אותו רק מתוך מחלקות החשבון. deposit(amount) ו-withdraw(amount) זורקות InvalidAmount עבור סכומים קטנים מ-1, ו-withdraw זורקת Insufficient כאשר היתרה תרד מתחת ל-lowestBalance של החשבון. היא מצהירה על kind מופשטת ועל monthEnd() פתוחה שאינה עושה דבר.
  • Checking מאפשרת משיכת יתר עד ‎-100. Savings לעולם אינה יורדת מתחת ל-0, מאפשרת לכל היותר 2 משיכות בחודש (WithdrawalLimit) וב-monthEnd() מוסיפה ריבית של 1% (בעיגול כלפי מטה) ומאפסת את מונה המשיכות.
  • ל-Bank יש את open(kind, id, owner), את account(id) (זורקת NoAccount), את transfer(from, to, amount), שמאתרת תחילה את שני החשבונות ואז מבצעת משיכה והפקדה, את monthEnd() עבור כל חשבון ואת accounts(), שמחזירה את החשבונות ממוינים לפי id.

הקוד שסופק קורא פקודות open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 או month, מדפיס ok או את הודעת השגיאה, ולבסוף את כל החשבונות בפורמט 1 ada checking: -20.

הקוד שלך ייכתב בקבצים BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt ו-Bank.kt. הקובץ Main.kt מכיל את קוד הקלט/פלט שסופק ואי אפשר לערוך אותו.

נסו בעצמכם

fun main() {
    // קוד הקלט/פלט שסופק: יש להשאיר אותו כפי שהוא
    val input = generateSequence(::readLine).toList()
    val bank = Bank()
    for (cmd in input) {
        val p = cmd.split(" ")
        try {
            when (p[0]) {
                "open" -> bank.open(p[1], p[2].toInt(), p[3])
                "dep" -> bank.account(p[1].toInt()).deposit(p[2].toInt())
                "wd" -> bank.account(p[1].toInt()).withdraw(p[2].toInt())
                "tr" -> bank.transfer(p[1].toInt(), p[2].toInt(), p[3].toInt())
                else -> bank.monthEnd()
            }
            println("ok")
        } catch (e: BankError) {
            println(e.message)
        }
    }
    for (a in bank.accounts()) println("${a.id} ${a.owner} ${a.kind}: ${a.balance}")
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: Kotlin אונליין