Bankacılık Sistemi
Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 104 / 104.
Görev
KolayState desenini, kalıtımı ve akıllı işaretçi (smart pointer) yönetimini gösteren bir Bankacılık Sistemi inşa edelim. Hesapların farklı durumlarda (Active, Frozen, Closed) olabildiği ve her durumun işlemleri işlemek için farklı davranışlara sahip olduğu bir sistem oluşturacaksınız.
Kodunuzu altı dosya halinde düzenleyeceksiniz:
AccountState.h: Hesap durumları için State deseni altyapısını tanımlayın.Saf sanal (pure virtual) metotlara sahip soyut bir
AccountStatetemel sınıfı oluşturun:deposit(double amount)— para yatırmaya izin veriliyorsa true, aksi takdirde false dönerwithdraw(double amount)— para çekmeye izin veriliyorsa true, aksi takdirde false dönergetStateName()— durum adını bir string olarak döner
Üç somut (concrete) durum uygulayın:
ActiveState: Hem para yatırmaya hem de çekmeye izin verir,"Active"dönerFrozenState: Para yatırmaya izin verir ancak para çekmeyi reddeder,"Frozen"dönerClosedState: Hem para yatırmayı hem de çekmeyi reddeder,"Closed"döner
Account.h: Durum yönetimi ile bir hesap hiyerarşisi oluşturun.Aşağıdakilere sahip bir temel
Accountsınıfı oluşturun:- Hesap numarası (string), sahip adı ve bakiye
- Mevcut durumu yönetmek için bir
std::unique_ptr<AccountState> deposit(double amount)— önce durumu kontrol eder, izin verilirse bakiyeye ekler ve"Deposited [amount] to [accountNumber]"yazdırır, aksi takdirde"Deposit rejected: account is [stateName]"yazdırırwithdraw(double amount)— durumu kontrol eder, izin verilirse ve yeterli bakiye varsa tutarı düşer ve"Withdrew [amount] from [accountNumber]"yazdırır. Durum reddederse"Withdrawal rejected: account is [stateName]"yazdırır. Bakiye yetersizse"Insufficient funds"yazdırırfreeze(),activate()veclose()— hesap durumunu değiştirirgetInfo()—"[accountNumber] ([ownerName]): $[balance] - [stateName]"döner"Basic"dönen sanal birgetAccountType()
İki türetilmiş hesap türü oluşturun:
SavingsAccount: Minimum bakiye gereksinimi vardır (yapıcıya iletilir). Para çekme işleminin minimum bakiyenin altına düşüp düşmeyeceğini de kontrol etmek için withdraw metodunu geçersiz kılın (override) — eğer düşüyorsa"Cannot go below minimum balance of [minimum]"yazdırın. Hesap türü için"Savings"döner.CheckingAccount: Bir fazla çekim (overdraft) limiti vardır (yapıcıya iletilir). (balance + overdraftLimit) tutarına kadar para çekmeye izin verir. Hesap türü için"Checking"döner.
Transaction.h: İşlemleri nesne olarak modelleyin.Aşağıdakileri kaydeden bir
Transactionsınıfı oluşturun:- İşlem türü (string: "Deposit", "Withdrawal", "Transfer")
- Tutar
- İlgili hesap numarası
- Başarı durumu (bool)
"[type]: $[amount] on [accountNumber] - [Success/Failed]"dönen birgetDescription()metodu ekleyinCustomer.h: Birden fazla hesabı olan bir müşteri oluşturun.Bir
Customernesnesinin adı, ID'si ve birstd::shared_ptr<Account>vektörü vardır. Şunları uygulayın:addAccount(std::shared_ptr<Account> account)getAccount(const std::string& accountNumber)— eşleşen hesabı veya nullptr dönergetTotalBalance()— tüm hesaplardaki bakiyeleri toplarlistAccounts()— her hesabın bilgisini yazdırır
Bank.h: Bankacılık operasyonlarını koordine edin.Banksınıfı müşterileri saklar ve bir işlem geçmişi tutar. Şunları uygulayın:addCustomer(std::shared_ptr<Customer> customer)findAccount(const std::string& accountNumber)— hesabı tüm müşteriler arasında ararprocessDeposit(const std::string& accountNumber, double amount)— hesabı bulur, para yatırma işlemini gerçekleştirir, işlemi kaydederprocessWithdrawal(const std::string& accountNumber, double amount)— hesabı bulur, para çekme işlemini gerçekleştirir, işlemi kaydedergetTransactionCount()— işlenen toplam işlem sayısını döner
main.cpp: Bankacılık sisteminizi gösterin.Dört girdi okuyun:
- Müşteri detayları (format:
name,customerId) - Tasarruf hesabı detayları (format:
accountNumber,minBalance) - İşlem 1 (format:
action,accountNumber,amount; burada actiondepositveyawithdrawşeklindedir) - İşlem 2 (format:
action,accountNumber,amountveyafreeze,accountNumber)
Bankayı ve müşteriyi oluşturun. Sahibi müşteri olan bir tasarruf hesabı oluşturun ve bunu müşteriye ekleyin. Müşteriyi bankaya ekleyin. Her iki işlemi de gerçekleştirin (eğer bir dondurma (freeze) komutuysa, hesabı dondurun ve ardından durumu göstermek için 10 dolarlık küçük bir para çekme işlemi deneyin). Son olarak, müşterinin hesap listesini ve toplam işlem sayısını
"Transactions: [count]"olarak yazdırın.- Müşteri detayları (format:
Örneğin, Alice,C001, SAV001,100, deposit,SAV001,500 ve withdraw,SAV001,200 girdileriyle:
Deposited 500 to SAV001
Withdrew 200 from SAV001
SAV001 (Alice): $300 - Active
Transactions: 2Bob,C002, SAV002,50, deposit,SAV002,100 ve freeze,SAV002 girdileriyle:
Deposited 100 to SAV002
Withdrawal rejected: account is Frozen
SAV002 (Bob): $100 - Frozen
Transactions: 2Carol,C003, SAV003,200, deposit,SAV003,250 ve withdraw,SAV003,100 girdileriyle:
Deposited 250 to SAV003
Cannot go below minimum balance of 200
SAV003 (Carol): $250 - Active
Transactions: 2Bu meydan okuma; hesap davranışlarını yönetmek için State desenini, farklı hesap türleri için kalıtımı, sahiplik ilişkileri için akıllı işaretçileri ve işlem takibini bir araya getiriyor — bunların hepsi bu kurs boyunca ustalaştığınız temel kavramlardır.
Kendin dene
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include "Bank.h"
int main() {
// Girdi 1'i oku: Müşteri detayları (format: name,customerId)
std::string customerInput;
std::getline(std::cin, customerInput);
// Girdi 2'yi oku: Tasarruf hesabı detayları (format: accountNumber,minBalance)
std::string accountInput;
std::getline(std::cin, accountInput);
// Girdi 3'ü oku: İşlem 1 (format: action,accountNumber,amount)
std::string op1Input;
std::getline(std::cin, op1Input);
// Girdi 4'ü oku: İşlem 2 (format: action,accountNumber,amount veya freeze,accountNumber)
std::string op2Input;
std::getline(std::cin, op2Input);
// TODO: customerInput içinden müşteri detaylarını ayrıştır
// Hint: Dizeyi bölmek için find(',') kullanın
// TODO: accountInput içinden hesap detaylarını ayrıştır
// TODO: Bankayı oluştur
// TODO: Müşteriyi oluştur
// TODO: Sahibi müşteri olan bir tasarruf hesabı oluştur
// TODO: Hesabı müşteriye ekle
// TODO: Müşteriyi bankaya ekle
// TODO: İşlem 1'i ayrıştır ve işle
// Format: action,accountNumber,amount (action "deposit" veya "withdraw" şeklindedir)
// TODO: İşlem 2'yi ayrıştır ve işle
// Şunlar olabilir: action,accountNumber,amount VEYA freeze,accountNumber
// Eğer freeze ise, hesabı dondur ve ardından $10 tutarında bir çekim dene
// TODO: Müşterinin hesap listesini yazdır
// TODO: İşlem sayısını "Transactions: [count]" olarak yazdır
return 0;
}
Nesne Yönelimli Programlama bölümündeki tüm dersler
1OOP Temelleri
Harici DosyalarC++ Build ve DerlemeBaşlık Dosyaları ve Kaynak DosyalarıAd Alanları ve KapsamC++'ta OOP'ye GirişSınıflar ve Nesneler'this' İşaretçisiMetotlar (Üye Fonksiyonlar)Öznitelikler (Veri Üyeleri)Ctor ve Dtor TemelleriÖzet - Basit Hesap Makinesi4Sınıf Özellikleri
Örnek ve Statik ÜyelerGetter ve Setter MetotlarıConst Üye FonksiyonlarMutable Anahtar KelimesiStatik Metotlar ve DeğişkenlerFriend Fonksiyonlar ve SınıflarÖzet - Banka Hesabı Yöneticisi7Kalıtım
Temel KalıtımKalıtım Erişim SeviyeleriCtor ve Dtor Çağrılma SırasıMetot Geçersiz KılmaSanal Fonksiyonlar ve VTableÇoklu KalıtımSanal KalıtımÖzet - Çalışan Hiyerarşisi10STL Genel Bakış
STL Genel Bakış ve FelsefesiSTL KonteynerleriİteratörlerSTL AlgoritmalarıFunctor'lar ve Lambda İfadeleriÖzet - Kelime Frekansı13Tasarım Kalıpları 1. Bölüm
Tasarım Kalıplarına GirişSingleton KalıbıFactory ve Abstract FactoryBuilder KalıbıObserver KalıbıStrategy Kalıbı2Bellek Yönetimi
Stack ve Heap Bellekİşaretçiler ve ReferanslarDinamik Bellek (new/delete)C++'ta Akıllı İşaretçilerC++'ta RAIIÖzet - Dinamik Dizi Yöneticisi5Kapsülleme
C++'da Erişim BelirleyicilerDerinlemesine Erişim BelirleyicilerBilgi GizlemeStruct vs Classİç İçe ve Dahili SınıflarÖzet - Öğrenci Kayıt Sistemi8Çok Biçimlilik
Derleme ve Çalışma Zamanı Çok BiçimliliğiFonksiyon Aşırı YüklemeSanal Fonksiyonlara Yeniden BakışSaf Sanal FonksiyonlarSoyut SınıflarC++'ta Arayüz TasarımıDynamic Casting ve RTTIÖzet - Şekil Hesaplayıcı3Yapıcılar ve Yıkıcılar
Varsayılan YapıcıParametreli YapıcıKopya YapıcıTaşıma YapıcısıYapıcı İlklendirme ListeleriTemsilci YapıcılarYıkıcılara Derinlemesine BakışÜç / Beş / Sıfır KuralıÖzet - String Sınıfı6Operatör Aşırı Yükleme
Operatör Aşırı Yüklemeye GirişAritmetik Operatör Aşırı YüklemeKarşılaştırma Operatörü Aşırı YüklemeStream OperatörleriAtama Operatörü Aşırı Yükleme[] ve () Operatör Aşırı YüklemeTip Dönüşüm OperatörleriÖzet - Matris Sınıfı9Şablonlar
Fonksiyon ŞablonlarıSınıf ŞablonlarıŞablon ÖzelleştirmeVariadic ŞablonlarSFINAE ve Type Traits TemelleriÖzet - Generic Konteyner