Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

دفتر الأستاذ المصرفي

جزء من قسم البرمجة كائنية التوجه في رحلة 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، وتسمح بحد أقصى بعمليتي سحب شهريًا (WithdrawalLimit)، وتضيف في monthEnd() فائدة بنسبة 1% (مع التقريب إلى الأسفل) وتعيد ضبط عدد عمليات السحب.
  • تحتوي Bank على open(kind, id, owner)، وaccount(id) (التي ترمي NoAccount)، وtransfer(from, to, amount) التي تبحث عن الحسابين أولًا ثم تنفذ السحب والإيداع، وmonthEnd() لكل حساب، وaccounts() المرتبة حسب المعرّف.

يقرأ الكود المقدم الأوامر 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}")
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Kotlin