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

    • deposit(double amount): para yatırmaya izin veriliyorsa true, aksi halde false döndürür
    • withdraw(double amount): para çekmeye izin veriliyorsa true, aksi halde false döndürür
    • getStateName(): 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ür
    • FrozenState: Para yatırmaya izin verir ancak para çekme işlemlerini reddeder, "Frozen" döndürür
    • ClosedState: 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 Account temel 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ır
    • withdraw(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ır
    • freeze(), activate() ve close(): hesap durumunu değiştirir
    • getInfo(): "[accountNumber] ([ownerName]): $[balance] - [stateName]" döndürür
    • getAccountType() 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 Transaction sı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 ve std::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ür
    • getTotalBalance(): tüm hesapların bakiyelerini toplar
    • listAccounts(): her hesabın bilgilerini yazdırır
  • Bank.h: Bankacılık işlemlerini koordine et.

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

    Dört girdi oku:

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

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

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

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

Bu 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

Kendi başına pratik yap: Online C++ derleyicisi