Menu
Coddy logo textTech

Bankacılık Sistemi

Coddy'nin C++ Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası — ders 104 / 104.

challenge icon

Görev

Kolay

State 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 AccountState temel sınıfı oluşturun:

    • deposit(double amount) — para yatırmaya izin veriliyorsa true, aksi takdirde false döner
    • withdraw(double amount) — para çekmeye izin veriliyorsa true, aksi takdirde false döner
    • getStateName() — 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öner
    • FrozenState: Para yatırmaya izin verir ancak para çekmeyi reddeder, "Frozen" döner
    • ClosedState: 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 Account sı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ır
    • withdraw(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ır
    • freeze(), activate() ve close() — hesap durumunu değiştirir
    • getInfo()"[accountNumber] ([ownerName]): $[balance] - [stateName]" döner
    • "Basic" dönen sanal bir getAccountType()

    İ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 Transaction sı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 bir getDescription() metodu ekleyin

  • Customer.h: Birden fazla hesabı olan bir müşteri oluşturun.

    Bir Customer nesnesinin adı, ID'si ve bir std::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öner
    • getTotalBalance() — tüm hesaplardaki bakiyeleri toplar
    • listAccounts() — her hesabın bilgisini yazdırır
  • Bank.h: Bankacılık operasyonlarını koordine edin.

    Bank sı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 arar
    • processDeposit(const std::string& accountNumber, double amount) — hesabı bulur, para yatırma işlemini gerçekleştirir, işlemi kaydeder
    • processWithdrawal(const std::string& accountNumber, double amount) — hesabı bulur, para çekme işlemini gerçekleştirir, işlemi kaydeder
    • getTransactionCount() — işlenen toplam işlem sayısını döner
  • main.cpp: Bankacılık sisteminizi gösterin.

    Dört girdi okuyun:

    1. Müşteri detayları (format: name,customerId)
    2. Tasarruf hesabı detayları (format: accountNumber,minBalance)
    3. İşlem 1 (format: action,accountNumber,amount; burada action deposit veya withdraw şeklindedir)
    4. İşlem 2 (format: action,accountNumber,amount veya freeze,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.

Ö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: 2

Bob,C002, SAV002,50, deposit,SAV002,100 ve freeze,SAV002 girdileriyle:

Deposited 100 to SAV002
Withdrawal rejected: account is Frozen
SAV002 (Bob): $100 - Frozen
Transactions: 2

Carol,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: 2

Bu 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