Sistem Perbankan
Termasuk bagian Pemrograman Berorientasi Object dalam perjalanan C++ di Coddy. Pelajaran 104 dari 104.
Tantangan
MudahMari kita bangun Sistem Perbankan yang menunjukkan pola State, pewarisan, dan pengelolaan smart pointer. Kamu akan membuat sistem yang memungkinkan rekening berada dalam status berbeda (Active, Frozen, Closed), masing-masing dengan perilaku tersendiri saat menangani transaksi.
Kamu akan mengatur kodemu dalam enam file:
AccountState.h: Tentukan infrastruktur pola State untuk status rekening.Buat class dasar abstrak
AccountStatedengan method virtual murni:deposit(double amount): mengembalikan true jika setoran diizinkan, dan false jika tidakwithdraw(double amount): mengembalikan true jika penarikan diizinkan, dan false jika tidakgetStateName(): mengembalikan nama status sebagai string
Buat tiga status konkret:
ActiveState: Mengizinkan setoran dan penarikan, mengembalikan"Active"FrozenState: Mengizinkan setoran tetapi menolak penarikan, mengembalikan"Frozen"ClosedState: Menolak setoran dan penarikan, mengembalikan"Closed"
Account.h: Bangun hierarki rekening dengan pengelolaan status.Buat class dasar
Accountdengan:- Nomor rekening (string), nama pemilik, dan saldo
std::unique_ptr<AccountState>untuk mengelola status saat inideposit(double amount): periksa status terlebih dahulu. Jika diizinkan, tambahkan ke saldo dan cetak"Deposited [amount] to [accountNumber]". Jika tidak, cetak"Deposit rejected: account is [stateName]"withdraw(double amount): periksa status. Jika diizinkan dan dana mencukupi, kurangi saldo dan cetak"Withdrew [amount] from [accountNumber]". Jika status menolak, cetak"Withdrawal rejected: account is [stateName]". Jika dana tidak mencukupi, cetak"Insufficient funds"freeze(),activate(), danclose(): mengubah status rekeninggetInfo(): mengembalikan"[accountNumber] ([ownerName]): $[balance] - [stateName]"getAccountType()virtual yang mengembalikan"Basic"
Buat dua jenis rekening turunan:
SavingsAccount: Memiliki persyaratan saldo minimum (diberikan ke constructor). Override withdraw untuk memeriksa apakah penarikan akan membuat saldo turun di bawah batas minimum. Jika ya, cetak"Cannot go below minimum balance of [minimum]". Mengembalikan"Savings"sebagai jenis rekening.CheckingAccount: Memiliki batas overdraft (diberikan ke constructor). Mengizinkan penarikan hingga sebesar (saldo + overdraftLimit). Mengembalikan"Checking"sebagai jenis rekening.
Transaction.h: Modelkan transaksi sebagai object.Buat class
Transactionyang mencatat:- Jenis transaksi (string: "Deposit", "Withdrawal", "Transfer")
- Jumlah
- Nomor rekening yang terlibat
- Status keberhasilan (bool)
Tambahkan method
getDescription()yang mengembalikan"[type]: $[amount] on [accountNumber] - [Success/Failed]"Customer.h: Buat pelanggan yang memiliki beberapa rekening.Customermemiliki nama, ID, dan vector berisistd::shared_ptr<Account>. Implementasikan:addAccount(std::shared_ptr<Account> account)getAccount(const std::string& accountNumber): mengembalikan rekening yang cocok atau nullptrgetTotalBalance(): menjumlahkan saldo dari semua rekeninglistAccounts(): mencetak info setiap rekening
Bank.h: Koordinasikan operasi perbankan.Class
Bankmenyimpan pelanggan dan mengelola riwayat transaksi. Implementasikan:addCustomer(std::shared_ptr<Customer> customer)findAccount(const std::string& accountNumber): mencari rekening milik semua pelangganprocessDeposit(const std::string& accountNumber, double amount): mencari rekening, melakukan setoran, lalu mencatat transaksiprocessWithdrawal(const std::string& accountNumber, double amount): mencari rekening, melakukan penarikan, lalu mencatat transaksigetTransactionCount(): mengembalikan jumlah total transaksi yang diproses
main.cpp: Tunjukkan sistem perbankanmu.Baca empat input:
- Detail pelanggan (format:
name,customerId) - Detail rekening tabungan (format:
accountNumber,minBalance) - Operasi 1 (format:
action,accountNumber,amount, dengan action berupadepositatauwithdraw) - Operasi 2 (format:
action,accountNumber,amountataufreeze,accountNumber)
Buat bank dan pelanggan. Buat rekening tabungan dengan pelanggan sebagai pemilik, lalu tambahkan rekening tersebut ke pelanggan. Tambahkan pelanggan ke bank. Proses kedua operasi (jika perintahnya freeze, bekukan rekening lalu coba lakukan penarikan kecil sebesar $10 untuk menunjukkan statusnya). Terakhir, cetak daftar rekening pelanggan dan jumlah total transaksi dengan format
"Transactions: [count]".- Detail pelanggan (format:
Sebagai contoh, dengan input Alice,C001, SAV001,100, deposit,SAV001,500, dan withdraw,SAV001,200:
Deposited 500 to SAV001
Withdrew 200 from SAV001
SAV001 (Alice): $300 - Active
Transactions: 2Dengan input Bob,C002, SAV002,50, deposit,SAV002,100, dan freeze,SAV002:
Deposited 100 to SAV002
Withdrawal rejected: account is Frozen
SAV002 (Bob): $100 - Frozen
Transactions: 2Dengan input Carol,C003, SAV003,200, deposit,SAV003,250, dan withdraw,SAV003,100:
Deposited 250 to SAV003
Cannot go below minimum balance of 200
SAV003 (Carol): $250 - Active
Transactions: 2Tantangan ini menggabungkan pola State untuk mengelola perilaku rekening, pewarisan untuk berbagai jenis rekening, smart pointer untuk hubungan kepemilikan, dan pencatatan transaksi. Semuanya merupakan konsep inti yang telah kamu kuasai sepanjang kursus ini.
Coba sendiri
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include "Bank.h"
int main() {
// Baca input 1: detail nasabah (format: name,customerId)
std::string customerInput;
std::getline(std::cin, customerInput);
// Baca input 2: detail rekening tabungan (format: accountNumber,minBalance)
std::string accountInput;
std::getline(std::cin, accountInput);
// Baca input 3: Operasi 1 (format: action,accountNumber,amount)
std::string op1Input;
std::getline(std::cin, op1Input);
// Baca input 4: Operasi 2 (format: action,accountNumber,amount atau freeze,accountNumber)
std::string op2Input;
std::getline(std::cin, op2Input);
// TODO: Uraikan detail nasabah dari customerInput
// Petunjuk: Gunakan find(',') untuk memisahkan string
// TODO: Uraikan detail rekening dari accountInput
// TODO: Buat bank
// TODO: Buat nasabah
// TODO: Buat rekening tabungan dengan nasabah sebagai pemiliknya
// TODO: Tambahkan rekening ke nasabah
// TODO: Tambahkan nasabah ke bank
// TODO: Uraikan dan proses operasi 1
// Format: action,accountNumber,amount (action adalah "deposit" atau "withdraw")
// TODO: Uraikan dan proses operasi 2
// Bisa berupa: action,accountNumber,amount ATAU freeze,accountNumber
// Jika freeze, bekukan rekening lalu coba tarik $10
// TODO: Tampilkan list rekening pelanggan
// TODO: Tampilkan jumlah transaksi sebagai "Transactions: [count]"
return 0;
}
Semua pelajaran di Pemrograman Berorientasi Object
1Dasar-Dasar OOP
File EksternalBuild dan Kompilasi C++File Header dan File SourceNamespace dan CakupanPengantar OOP dalam C++class vs objectPointer 'this'method (Fungsi Anggota)Atribut (Anggota Data)Dasar Ctor dan DtorRingkasan: Kalkulator Sederhana4Properti class
Anggota instance vs staticGetter dan setterFungsi anggota constKata kunci mutableMethod dan variabel staticFungsi dan class friendRangkuman, Pengelola Rekening Bank7Pewarisan
Pewarisan DasarTingkat Akses pada PewarisanUrutan Pemanggilan Ctor & DtorPenimpaan methodFungsi Virtual & VTablePewarisan BergandaPewarisan VirtualRangkuman: Hierarki Karyawan2Manajemen Memori
Memori Stack vs HeapPointer dan ReferenceMemori Dinamis (new/delete)Smart Pointer di C++RAII di C++Rangkuman: Pengelola Array Dinamis5Enkapsulasi
Penentu Akses dalam C++Penentu Akses secara MendalamPenyembunyian Informasistruct vs classNested dan Inner classRangkuman, Sistem Catatan Siswa8Polimorfisme
Polimorfisme saat Compile vs RuntimeOverloading FungsiMeninjau Kembali Fungsi VirtualFungsi Virtual MurniKelas AbstrakDesain Interface di C++Casting Dinamis & RTTIRangkuman: Kalkulator Bentuk3Konstruktor & Destruktor
Konstruktor DefaultKonstruktor BerparameterKonstruktor SalinKonstruktor PindahDaftar Inisialisasi KonstruktorKonstruktor DelegasiKupas Tuntas DestruktorAturan Tiga, Lima, dan NolRangkuman: class String6Overloading Operator
Pengantar Overloading OperatorOverloading Operator AritmetikaOverloading Operator PerbandinganOperator StreamOverloading Operator PenugasanOverloading Operator [] dan ()Operator Konversi TipeRingkasan, class Matrix9Template
Template FungsiTemplate classSpesialisasi TemplateTemplate VariadikDasar SFINAE & Type TraitsRangkuman, Container GenerikLatihan sendiri: Compiler C++ online