Menu
Coddy logo textTech

Rejestr bankowy

Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 57 z 57.

challenge icon

Wyzwanie

Trudny

Zbuduj mały bank.

  • BankError(message) jest zapieczętowaną klasą rozszerzającą Exception, z podklasami InvalidAmount (invalid amount), Insufficient(id) (insufficient funds in 2), WithdrawalLimit(id) (withdrawal limit on 2) i NoAccount(id) (no account 9).
  • Account(id, owner) jest klasą abstrakcyjną. Wartość balance można odczytać z dowolnego miejsca, a zmieniać tylko w klasach kont. deposit(amount) i withdraw(amount) zgłaszają InvalidAmount dla kwot mniejszych niż 1, a withdraw zgłasza Insufficient, gdy saldo spadłoby poniżej wartości lowestBalance danego konta. Deklaruje abstrakcyjną właściwość kind oraz otwartą funkcję monthEnd(), która nic nie robi.
  • Checking pozwala na debet do -100. Saldo konta Savings nigdy nie spada poniżej 0, pozwala na najwyżej 2 wypłaty miesięcznie (WithdrawalLimit) i w funkcji monthEnd() nalicza 1% odsetek (zaokrąglając w dół) oraz zeruje licznik wypłat.
  • Bank ma funkcje open(kind, id, owner), account(id) (zgłasza NoAccount), transfer(from, to, amount), która najpierw wyszukuje oba konta, a następnie wykonuje wypłatę i wpłatę, monthEnd() dla każdego konta oraz accounts(), która zwraca konta posortowane według id.

Dostarczony kod odczytuje polecenia open checking 1 ada, open savings 2 bo, dep 1 100, wd 2 30, tr 1 2 50 lub month, wypisuje ok albo treść błędu, a na końcu wypisuje każde konto jako 1 ada checking: -20.

Twój kod umieść w plikach BankError.kt, InvalidAmount.kt, Insufficient.kt, WithdrawalLimit.kt, NoAccount.kt, Account.kt, Checking.kt, Savings.kt i Bank.kt. Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.

Spróbuj swoich sił

fun main() {
    // Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
    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}")
}

Wszystkie lekcje w sekcji Programowanie obiektowe

Poćwicz samodzielnie: Edytor online Kotlin