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 kalıbını, kalıtımı ve akıllı işaretçi yönetimini gösteren bir Bankacılık Sistemi oluşturalım. Hesapların, işlemleri ele alma konusunda her biri farklı davranışlara sahip farklı durumlarda (Active, Frozen, Closed) bulunabileceği bir sistem oluşturacaksın.
Kodunu altı dosyaya ayıracaksın:
AccountState.h: Hesap durumları için State kalıbı altyapısını tanımla.Saf sanal metotlara sahip soyut bir
AccountStatetemel sınıfı oluştur:deposit(double amount): para yatırmaya izin veriliyorsa true, aksi halde false döndürürwithdraw(double amount): para çekmeye izin veriliyorsa true, aksi halde false döndürürgetStateName(): durum adını bir string olarak döndürür
Üç somut durum uygula:
ActiveState: Hem para yatırmaya hem de para çekmeye izin verir,"Active"döndürürFrozenState: Para yatırmaya izin verir ancak para çekme işlemlerini reddeder,"Frozen"döndürürClosedState: Hem para yatırma hem de para çekme işlemlerini reddeder,"Closed"döndürür
Account.h: Durum yönetimine sahip bir hesap hiyerarşisi oluştur.Aşağıdakilere sahip bir
Accounttemel sınıfı oluştur:- Hesap numarası (string), hesap sahibinin adı ve bakiye
- Mevcut durumu yönetmek için bir
std::unique_ptr<AccountState> deposit(double amount): önce durumu kontrol eder; izin veriliyorsa bakiyeye ekler ve"Deposited [amount] to [accountNumber]"yazdırır, aksi halde"Deposit rejected: account is [stateName]"yazdırırwithdraw(double amount): durumu kontrol eder; izin veriliyor ve yeterli bakiye varsa bakiyeden düşer ve"Withdrew [amount] from [accountNumber]"yazdırır. Durum işlemi 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öndürürgetAccountType()döndüren sanal"Basic"
Türetilmiş iki hesap türü oluştur:
SavingsAccount: Bir minimum bakiye gereksinimine sahiptir (yapıcıya geçirilir). Para çekme işlemini, çekimin bakiyeyi minimumun altına düşürüp düşürmeyeceğini de kontrol edecek şekilde geçersiz kıl; düşürecekse"Cannot go below minimum balance of [minimum]"yazdır. Hesap türü olarak"Savings"döndürür.CheckingAccount: Bir kredili mevduat limitine sahiptir (yapıcıya geçirilir). (bakiye + overdraftLimit) değerine kadar para çekilmesine izin verir. Hesap türü olarak"Checking"döndürür.
Transaction.h: İşlemleri nesneler olarak modelle.Aşağıdaki bilgileri kaydeden bir
Transactionsınıfı oluştur:- İşlem türü (string: "Deposit", "Withdrawal", "Transfer")
- Tutar
- İşleme dahil olan hesap numarası
- Başarı durumu (bool)
getDescription()döndüren bir"[type]: $[amount] on [accountNumber] - [Success/Failed]"metodu ekle.Customer.h: Birden fazla hesaba sahip bir müşteri oluştur.Bir
Customer; bir ada, ID'ye vestd::shared_ptr<Account>vektörüne sahiptir. Aşağıdakileri uygula:addAccount(std::shared_ptr<Account> account)getAccount(const std::string& accountNumber): eşleşen hesabı veya nullptr döndürürgetTotalBalance(): tüm hesapların bakiyelerini toplarlistAccounts(): her hesabın bilgilerini yazdırır
Bank.h: Bankacılık işlemlerini koordine et.Banksınıfı müşterileri depolar ve bir işlem geçmişi tutar. Aşağıdakileri uygula:addCustomer(std::shared_ptr<Customer> customer)findAccount(const std::string& accountNumber): tüm müşterilerde hesabı ararprocessDeposit(const std::string& accountNumber, double amount): hesabı bulur, para yatırma işlemini gerçekleştirir ve işlemi kaydederprocessWithdrawal(const std::string& accountNumber, double amount): hesabı bulur, para çekme işlemini gerçekleştirir ve işlemi kaydedergetTransactionCount(): işlenen toplam işlem sayısını döndürür
main.cpp: Bankacılık sistemini göster.Dört girdi oku:
- Müşteri bilgileri (format:
name,customerId) - Tasarruf hesabı bilgileri (format:
accountNumber,minBalance) - İşlem 1 (format:
action,accountNumber,amount; burada action değeridepositveyawithdrawolur) - İşlem 2 (format:
action,accountNumber,amountveyafreeze,accountNumber)
Bankayı ve müşteriyi oluştur. Müşteriyi hesap sahibi olarak kullanarak bir tasarruf hesabı oluştur ve bunu müşteriye ekle. Müşteriyi bankaya ekle. Her iki işlemi gerçekleştir (freeze komutuysa hesabı dondur, ardından durumu göstermek için $10 tutarında küçük bir para çekme işlemi dene). Son olarak müşterinin hesap listesini ve işlem sayısını
"Transactions: [count]"olarak yazdır.- Müşteri bilgileri (format:
Örneğin, girdiler Alice,C001, SAV001,100, deposit,SAV001,500 ve withdraw,SAV001,200 olduğunda:
Deposited 500 to SAV001
Withdrew 200 from SAV001
SAV001 (Alice): $300 - Active
Transactions: 2Girdiler Bob,C002, SAV002,50, deposit,SAV002,100 ve freeze,SAV002 olduğunda:
Deposited 100 to SAV002
Withdrawal rejected: account is Frozen
SAV002 (Bob): $100 - Frozen
Transactions: 2Girdiler Carol,C003, SAV003,200, deposit,SAV003,250 ve withdraw,SAV003,100 olduğunda:
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 kalıbını, 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 getirir: bunların tümü bu kurs boyunca öğrendiğin temel kavramlardır.
Kendin dene
#include <iostream>
#include <string>
#include <sstream>
#include <memory>
#include "Bank.h"
int main() {
// Girdi 1'i oku: Müşteri bilgileri (format: name,customerId)
std::string customerInput;
std::getline(std::cin, customerInput);
// Girdi 2'yi oku: Tasarruf hesabı bilgileri (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'tan müşteri bilgilerini ayrıştır
// İpucu: Diziyi bölmek için find(',') kullan
// TODO: accountInput'tan hesap bilgilerini ayrıştır
// TODO: Bankayı oluştur
// TODO: Müşteriyi oluştur
// TODO: Müşteriyi sahip olarak 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
// Biçim: action,accountNumber,amount (action "deposit" veya "withdraw")
// TODO: İşlem 2'yi ayrıştır ve işle
// Şöyle olabilir: action,accountNumber,amount VEYA freeze,accountNumber
// freeze ise, hesabı dondur ardından $10 çekmeyi dene
// TODO: Müşterinin hesap listesini yazdır
// TODO: Print transaction count as "Transactions: [count]"
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 KonteynerKendi başına pratik yap: Online C++ derleyicisi