Menu
CoddyTech

Sistem Perbankan

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan GDScript di Coddy. Pelajaran 63 dari 65.

challenge icon

Tantangan

Sulit

Buat sebuah bank dengan dua jenis rekening. Setiap operasi mengembalikan dictionary hasil {"ok": bool, "message": String}; kode yang disediakan mencetaknya sebagai OK: MESSAGE atau Failed: MESSAGE. Semua jumlah bertipe float dan setiap jumlah dalam pesan memiliki dua angka desimal setelah $.

Transaction dalam transaction.gd: constructor menerima kind ("deposit", "withdrawal" atau "interest") dan amount. _to_string() mengembalikan kind dengan huruf pertama kapital, lalu jumlahnya: Deposit - $200.00. Sebuah transaksi tidak menyimpan rekeningnya.

Account dalam account.gd adalah class @abstract:

  • Constructor menerima account_number, owner_name dan initial_balance. Uang disimpan dalam _balance privat; balance adalah property hanya-baca yang getter-nya mengembalikan _balance. _history adalah Array[Transaction], dan get_history() mengembalikannya.
  • Dua method abstrak: account_type() -> String dan withdrawal_error(amount: float) -> String, yang mengembalikan alasan penarikan ditolak, atau "".
  • deposit(amount): jumlah sebesar 0 atau kurang akan gagal dengan Deposit amount must be positive. Jika tidak, fungsi ini menambahkan uang, mencatat transaksi deposit dan mengembalikan Deposited $A. New balance: $B.
  • withdraw(amount): jumlah sebesar 0 atau kurang akan gagal dengan Withdrawal amount must be positive; withdrawal_error() yang tidak kosong akan gagal dengan teks tersebut. Jika tidak, fungsi ini mengambil uang, mencatat transaksi withdrawal dan mengembalikan Withdrew $A. New balance: $B, diikuti (Overdraft) jika saldo kini kurang dari 0.
  • _to_string() mengembalikan TYPE NUMBER (OWNER): $BALANCE.

SavingsAccount dalam savings_account.gd mewarisi Account, dengan konstanta INTEREST_RATE = 0.02 dan MIN_BALANCE = 100.0. Jenisnya adalah Savings. Penarikan yang akan menyisakan saldo kurang dari MIN_BALANCE ditolak dengan Cannot withdraw below minimum balance of $100.00. apply_interest() menambahkan balance * INTEREST_RATE, mencatat transaksi interest dan mengembalikan Applied interest: $I. New balance: $B.

CheckingAccount dalam checking_account.gd mewarisi Account, dengan konstanta OVERDRAFT_LIMIT = 200.0. Jenisnya adalah Checking. Saldo boleh turun hingga -200.00; penarikan yang akan membuat saldo lebih rendah akan ditolak dengan Cannot exceed overdraft limit of $200.00.

Bank dalam bank.gd menyimpan rekening dalam dictionary privat dengan nomor rekening sebagai kunci:

  • Constructor menerima bank_name.
  • create_account(kind, account_number, owner_name, initial_balance) adalah factory: kind berupa savings atau checking, tanpa membedakan huruf besar-kecil. Fungsi ini gagal dengan Account number already exists atau Invalid account type, dan jika berhasil mengembalikan Savings account created successfully (atau Checking).
  • get_account(account_number) -> Account mengembalikan rekening, atau null.
  • transfer(from_number, to_number, amount): gagal dengan One or both accounts not found; menarik uang dari rekening pertama dan, jika penarikan gagal, mengembalikan kegagalan dengan Transfer failed: diikuti pesan penarikan. Jika tidak, fungsi ini menyetorkan uang ke rekening kedua dan mengembalikan Transferred $A from FROM to TO.
  • total_holdings() -> float mengembalikan jumlah semua saldo.

Kode yang disediakan membaca nama bank, lalu perintah. Untuk input ini:

First Bank
open savings|S1|Alice|1000
open checking|C1|Bob|50
withdraw S1|950
transfer S1|C1|300
withdraw C1|400
history C1
total

output-nya adalah:

OK: Savings account created successfully
OK: Checking account created successfully
Failed: Cannot withdraw below minimum balance of $100.00
OK: Transferred $300.00 from S1 to C1
OK: Withdrew $400.00. New balance: $-50.00 (Overdraft)
History of C1:
1. Deposit - $300.00
2. Withdrawal - $400.00
Total held by First Bank: $650.00

Tulis kodemu di transaction.gd, account.gd, savings_account.gd, checking_account.gd dan bank.gd. main.gd berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

extends Node

func _ready():
	# Kode input/output yang disediakan: biarkan apa adanya

	var bank := Bank.new(OS.read_string_from_stdin())

	var line := OS.read_string_from_stdin()
	while line != "":
		var parts := line.split(" ", true, 1)
		var f: PackedStringArray = parts[1].split("|") if parts.size() > 1 else PackedStringArray()
		match parts[0]:
			"open":
				show_result(bank.create_account(f[0], f[1], f[2], float(f[3])))
			"deposit":
				show_result(bank.get_account(f[0]).deposit(float(f[1])))
			"withdraw":
				show_result(bank.get_account(f[0]).withdraw(float(f[1])))
			"interest":
				var account: Account = bank.get_account(f[0])
				if account is SavingsAccount:
					var savings := account as SavingsAccount
					show_result(savings.apply_interest())
				else:
					print("Failed: ", f[0], " is not a savings account")
			"transfer":
				show_result(bank.transfer(f[0], f[1], float(f[2])))
			"history":
				var history: Array = bank.get_account(f[0]).get_history()
				print("History of ", f[0], ":")
				for i in history.size():
					print(i + 1, ". ", history[i])
			"account":
				print(bank.get_account(f[0]))
			"total":
				print("Total held by %s: $%.2f" % [bank.bank_name, bank.total_holdings()])

		line = OS.read_string_from_stdin()

func show_result(result: Dictionary) -> void:
	print(("OK: " if result["ok"] else "Failed: ") + result["message"])

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler GDScript online