Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - مدير الحساب البنكي

جزء من قسم Object Oriented Programming في رحلة C++ على Coddy — الدرس 33 من 104.

challenge icon

التحدي

سهل

لنقم ببناء مدير حسابات بنكية كامل يجمع بين جميع مفاهيم خصائص الفئات التي تعلمتها في هذا الفصل: الأعضاء الخاصون (private members) مع دوال الوصول (getters) والتعديل (setters)، الدوال الأعضاء الثابتة (const member functions)، الأعضاء القابلون للتغيير (mutable members)، المتغيرات والدوال الساكنة (static variables and methods)، والدوال الصديقة (friend functions).

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • BankAccount.h: قم بتعريف فئة BankAccount التي تدير بيانات الحساب مع التغليف (encapsulation) المناسب. يجب أن تحتوي الفئة الخاصة بك على:
    • أعضاء خاصين (Private members): accountNumber (سلسلة نصية)، ownerName (سلسلة نصية)، balance (رقم عشري مزدوج)، و mutable int queryCount لتتبع عدد المرات التي تم فيها التحقق من الرصيد.
    • عضو ساكن خاص (private static member) باسم totalAccounts لتتبع عدد الحسابات الموجودة.
    • منشئ (constructor) يأخذ رقم الحساب، اسم المالك، والرصيد الأولي. يجب أن يقوم بتهيئة queryCount إلى 0 وزيادة totalAccounts.
    • دوال وصول ثابتة (Const getters): getAccountNumber()، و getOwnerName()، و getBalance() — يجب أن تقوم دالة الوصول للرصيد بزيادة queryCount في كل مرة يتم استدعاؤها.
    • دالة وصول ثابتة getQueryCount() تعيد عدد المرات التي تم فيها التحقق من الرصيد.
    • دالة deposit(double amount) تضيف إلى الرصيد فقط إذا كان المبلغ موجباً.
    • دالة withdraw(double amount) تطرح من الرصيد فقط إذا كان المبلغ موجباً ولا يتجاوز الرصيد الحالي.
    • دالة ساكنة (static method) باسم getTotalAccounts() تعيد إجمالي عدد الحسابات التي تم إنشاؤها.
    • التصريح عن دالة صديقة (friend function) باسم transfer(BankAccount& from, BankAccount& to, double amount) تقوم بنقل الأموال بين الحسابات — يجب أن يتم التحويل فقط إذا كان المبلغ موجباً وكان لدى المصدر أموال كافية.

    قم بتعريف العضو الساكن والدالة الصديقة بعد تعريف الفئة.

  • main.cpp: استعرض جميع هذه الميزات وهي تعمل معاً. اقرأ اسمين للمالكين ورصيدين أوليين من المدخلات (أربعة أسطر إجمالاً: name1، balance1، name2، balance2)، ثم:

    • قم بإنشاء كائنين من BankAccount بأرقام حسابات "ACC001" و "ACC002"
    • اطبع "Total accounts: <count>"
    • اطبع "<name>: "<name>: $<balance>"lt;balance>" للحساب الأول
    • اطبع "<name>: "<name>: $<balance>"lt;balance>" للحساب الثاني
    • أودع 500.0 في الحساب الأول
    • اطبع "After deposit - <name>: "After deposit - <name>: $<balance>"lt;balance>" للحساب الأول
    • حول 300.0 من الحساب الأول إلى الثاني باستخدام الدالة الصديقة
    • اطبع "After transfer:"
    • اطبع " <name>: " <name>: $<balance>"lt;balance>" للحساب الأول
    • اطبع " <name>: " <name>: $<balance>"lt;balance>" للحساب الثاني
    • اطبع "Query count for <name>: <count>" للحساب الأول

قم بتنسيق جميع قيم الرصيد بمنزلتين عشريتين باستخدام std::fixed و std::setprecision(2) من مكتبة <iomanip>. قم بتحويل مدخلات الرصيد من سلاسل نصية إلى أرقام عشرية مزدوجة باستخدام std::stod().

لا تنسَ حواجز التضمين (header guards) في ملف الترويسة الخاص بك وتضمين <string> و <iostream> حيثما لزم الأمر.

جرّب بنفسك

#include <iostream>
#include <string>
#include <iomanip>
#include "BankAccount.h"

int main() {
    // قراءة المدخلات
    std::string name1, name2;
    std::string balance1Str, balance2Str;
    
    std::getline(std::cin, name1);
    std::getline(std::cin, balance1Str);
    std::getline(std::cin, name2);
    std::getline(std::cin, balance2Str);
    
    double balance1 = std::stod(balance1Str);
    double balance2 = std::stod(balance2Str);
    
    // ضبط تنسيق المخرجات لمنزلتين عشريتين
    std::cout << std::fixed << std::setprecision(2);
    
    // TODO: إنشاء كائنين من BankAccount بأرقام حسابات "ACC001" و "ACC002"
    
    // TODO: طباعة "Total accounts: <count>"
    
    // TODO: طباعة "<name>: $<balance>" للحساب الأول
    
    // TODO: طباعة "<name>: $<balance>" للحساب الثاني
    
    // TODO: إيداع 500.0 في الحساب الأول
    
    // TODO: طباعة "After deposit - <name>: $<balance>" للحساب الأول
    
    // TODO: تحويل 300.0 من الحساب الأول إلى الثاني باستخدام الدالة الصديقة friend function
    
    // TODO: طباعة "After transfer:"
    
    // TODO: طباعة "  <name>: $<balance>" للحساب الأول (لاحظ المسافة البادئة بمقدار مسافتين)
    
    // TODO: طباعة "  <name>: $<balance>" للحساب الثاني (لاحظ المسافة البادئة بمقدار مسافتين)
    
    // TODO: طباعة "Query count for <name>: <count>" للحساب الأول
    
    return 0;
}

جميع دروس Object Oriented Programming