مراجعة - مدير الحساب البنكي
جزء من قسم البرمجة كائنية التوجه في رحلة C++ على Coddy. الدرس 33 من 104.
التحدي
سهللننشئ مدير حسابات مصرفية متكاملًا يجمع كل مفاهيم خصائص الأصناف التي تعلمتها في هذا الفصل: الأعضاء الخاصة مع دوال الوصول والتعيين، ودوال الأعضاء الثابتة، والأعضاء القابلة للتغيير، والمتغيرات والدوال الساكنة، ودوال الصداقة.
ستنشئ ملفين لتنظيم شفرتك:
BankAccount.h: عرّف صنفًاBankAccountيدير بيانات الحساب مع تطبيق التغليف المناسب. ينبغي أن يحتوي صنفك على:- أعضاء خاصة:
accountNumber(سلسلة نصية)، وownerName(سلسلة نصية)، وbalance(عدد عشري مزدوج الدقة)، وmutable int queryCountلتتبع عدد مرات التحقق من الرصيد - عضو ساكن خاص
totalAccountsلتتبع عدد الحسابات الموجودة - مُنشئًا يأخذ رقم الحساب واسم المالك والرصيد الأولي. ينبغي أن يهيّئ
queryCountإلى0ويزيدtotalAccounts - دوال وصول ثابتة:
getAccountNumber()وgetOwnerName()وgetBalance(): ينبغي لدالة الوصول إلى الرصيد أن تزيدqueryCountفي كل مرة تُستدعى فيها - دالة وصول ثابتة
getQueryCount()تعيد عدد مرات التحقق من الرصيد - دالة
deposit(double amount)تضيف إلى الرصيد فقط إذا كان المبلغ موجبًا - دالة
withdraw(double amount)تخصم من الرصيد فقط إذا كان المبلغ موجبًا ولا يتجاوز الرصيد الحالي - دالة ساكنة
getTotalAccounts()تعيد العدد الإجمالي للحسابات التي أُنشئت - صرّح عن دالة صداقة
transfer(BankAccount& from, BankAccount& to, double amount)تنقل الأموال بين الحسابات. ينبغي أن تنفّذ التحويل فقط إذا كان المبلغ موجبًا وكان في الحساب المصدر رصيد كافٍ
عرّف العضو الساكن ودالة الصداقة بعد تعريف الصنف.
- أعضاء خاصة:
main.cpp: وضّح عمل جميع هذه الميزات معًا. اقرأ اسمي مالكين ورصيدي البداية من الإدخال (أربعة أسطر إجمالًا: name1 وbalance1 وname2 وbalance2)، ثم:- أنشئ كائنين من
BankAccountبرقمَي الحساب"ACC001"و"ACC002" - اطبع
"Total accounts: <count>" - اطبع
"<name>: $<balance>"للحساب الأول - اطبع
"<name>: $<balance>"للحساب الثاني - أودِع
500.0في الحساب الأول - اطبع
"After deposit - <name>: $<balance>"للحساب الأول - حوّل
300.0من الحساب الأول إلى الحساب الثاني باستخدام دالة الصداقة - اطبع
"After transfer:" - اطبع
" <name>: $<balance>"للحساب الأول - اطبع
" <name>: $<balance>"للحساب الثاني - اطبع
"Query count for <name>: <count>"للحساب الأول
- أنشئ كائنين من
نسّق جميع قيم الأرصدة بمنزلتين عشريتين باستخدام std::fixed وstd::setprecision(2) من <iomanip>. حوّل مدخلات الأرصدة من سلاسل نصية إلى أعداد عشرية مزدوجة الدقة باستخدام std::stod().
لا تنسَ تضمين حواجز الترويسة في ملف الترويسة، وتضمين <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
// TODO: اطبع "After transfer:"
// TODO: اطبع " <name>: $<balance>" للحساب الأول (لاحظ المسافتين البادئتين)
// TODO: اطبع " <name>: $<balance>" للحساب الثاني (لاحظ المسافتين البادئتين)
// TODO: اطبع "Query count for <name>: <count>" للحساب الأول
return 0;
}
جميع دروس البرمجة كائنية التوجه
1أساسيات الـ OOP
الملفات الخارجيةبناء وتجميع (Compilation) لغة C++ملفات الـ Header وملفات الـ Sourceالـ Namespaces والـ Scopeمقدمة في الـ OOP في C++الـ Classes مقابل الـ Objectsالمؤشر 'this'الـ Methods (الدوال الأعضاء)الـ Attributes (بيانات الأعضاء)أساسيات الـ Ctors والـ Dtorsمراجعة - آلة حاسبة بسيطة4خصائص الـ Class
أعضاء الـ Instance مقابل الـ Staticدوال الـ Getters والـ Settersدوال الأعضاء الثابتة (Const)الكلمة المفتاحية Mutableالدوال والمتغيرات الساكنة (Static)الدوال والفئات الصديقة (Friend)مراجعة - مدير الحساب البنكي7الوراثة
الوراثة الأساسيةمستويات الوصول في الوراثةترتيب استدعاء الـ Ctor والـ Dtorإعادة تعريف الدوال (Method Overriding)الدوال الافتراضية والـ VTableالوراثة المتعددةالوراثة الافتراضيةمراجعة - هيكلية الموظفين10نظرة عامة على STL
نظرة عامة وفلسفة STLحاويات STLالـ Iteratorsخوارزميات STLالـ Functors وتعبيرات Lambdaمراجعة - تكرار الكلمات13أنماط التصميم - الجزء الأول
مقدمة في أنماط التصميمنمط Singletonنمط Factory و Abstract Factoryنمط Builderنمط Observerنمط Strategy2إدارة الذاكرة
ذاكرة Stack مقابل Heapالمؤشرات والمراجعالذاكرة الديناميكية (new/delete)المؤشرات الذكية في C++RAII في C++مراجعة - مدير المصفوفات الديناميكية5التغليف (Encapsulation)
محددات الوصول في C++محددات الوصول بشكل متعمقإخفاء المعلوماتStruct مقابل Classالأصناف المتداخلة والداخليةمراجعة - نظام سجلات الطلاب8تعدد الأشكال (Polymorphism)
تعدد الأشكال: وقت التجميع مقابل وقت التشغيلالتحميل الزائد للدوال (Function Overloading)مراجعة الدوال الافتراضية (Virtual Functions)الدوال الافتراضية البحتة (Pure Virtual Functions)الأصناف المجردة (Abstract Classes)تصميم الواجهات (Interface) في C++التحويل الديناميكي (Dynamic Casting) و RTTIملخص - حاسبة الأشكال11مفاهيم OOP المتقدمة
التركيب مقابل الوراثةالـ Mixins عبر CRTPنمط Pimplمحو النوع (Type Erasure)أصناف Enum والأنواع القويةمعالجة الاستثناءات في OOPتسلسلات الاستثناءات المخصصة14أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط قالب الطريقةنمط الحالةنمط التركيبRAII كنمط3المنشئات والموادم
المنشئ الافتراضيالمنشئ ذو المعاملاتمنشئ النسخمنشئ النقلقوائم تهيئة المنشئالمنشئات المفوضةتعمق في الموادمقاعدة الثلاثة / الخمسة / الصفرمراجعة - فئة String6تحميل العوامل (Operator Overloading)
مقدمة في تحميل العواملتحميل العوامل الحسابيةتحميل عوامل المقارنةعوامل Streamتحميل عامل التعيينتحميل العوامل [] و ()عوامل تحويل النوعمراجعة - Matrix Class9القوالب
قوالب الدوالقوالب الأصنافتخصيص القوالبالقوالب المتغيرةأساسيات SFINAE و Type Traitsمراجعة - الحاويات العامةتدرّب بنفسك: مترجم C++ عبر الإنترنت