منطق السحب
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 25 من 61.
التحدي
سهلحسابك البنكي ينمو! الآن دعنا نضيف القدرة على سحب الأموال. على عكس الإيداعات، للسحوبات قيد إضافي—لا يمكنك سحب أموال أكثر مما تملك. تحتاج دالة withdraw الخاصة بك إلى التحقق من الرصيد قبل السماح بالعملية.
بناءً على مشروع حسابك البنكي الحالي، ستقوم بتوسيع الوحدة البرمجية بميزة السحب. هذا هو المكان الذي يتألق فيه التغليف (encapsulation) حقاً—يمكن لدالتك الوصول إلى الرصيد المخفي للتحقق من كفاية الأموال، وهو أمر لا يمكن للكود الخارجي القيام به مباشرة أبداً.
ستعمل على ثلاثة ملفات:
account.h: أضف نموذجاً أولياً لدالة جديدة:withdraw. تأخذ هذه الدالة مؤشراً من نوع Account ومبلغاً من نوعdoubleوتُرجعint(1 للنجاح، 0 إذا فشل السحب). احتفظ بجميع التصريحات الحالية لـcreate_accountوdestroy_accountوdeposit.account.c: قم بتنفيذ دالةwithdraw. يجب أن ينجح السحب فقط إذا تم استيفاء شرطين: يجب أن يكون المبلغ موجباً (أكبر من الصفر)، ويجب أن يمتلك الحساب أموالاً كافية (balance >= amount). إذا تحقق الشرطان، اطرح المبلغ من الرصيد وأرجع 1. خلاف ذلك، أرجع 0 دون تعديل الرصيد.main.c: استعرض سير عمل الإيداع والسحب الكامل. أنشئ حساباً، وقم بإجراء إيداع لإنشاء رصيد، ثم اختبر السحوبات—الناجحة منها والفاشلة.
ستتلقى أربعة مدخلات: **معرف الحساب** (عدد صحيح)، و**مبلغ الإيداع** (لإنشاء أموال أولية)، و**مبلغ سحب ناجح** (أقل من أو يساوي المبلغ المودع)، و**مبلغ سحب فاشل** (أكثر من الرصيد المتبقي).
في ملفك الرئيسي، أنشئ حساباً واطبع تأكيداً. قم بإيداع الأموال الأولية واطبع النتيجة. ثم قم بإجراء السحب الناجح واطبع ما إذا كان قد نجح. أخيراً، حاول إجراء السحب الذي يجب أن يفشل (بسبب عدم كفاية الأموال) واطبع تلك النتيجة. قم بتدمير الحساب وتأكيد عملية التنظيف.
اطبع المخرجات بهذا التنسيق:
Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyedحيث 1001 هو معرف الحساب، و 500.00 هو الإيداع، و 200.00 هو السحب الناجح، و 400.00 هو السحب الفاشل (لأنه يتبقى 300.00 فقط بعد السحب الأول). قم بتنسيق جميع المبالغ بمنزلتين عشريتين باستخدام %.2f.
توضح دالة withdraw الخاصة بك قوة التغليف—حيث يمكنها التحقق من الرصيد المخفي داخلياً لاتخاذ القرارات، بينما لا يملك الكود الخارجي أي وسيلة لتجاوز هذا التحقق أو إلقاء نظرة خاطفة على الرصيد مباشرة.
جرّب بنفسك
#include <stdio.h>
#include "account.h"
int main() {
int account_id;
scanf("%d", &account_id);
double valid_amount;
scanf("%lf", &valid_amount);
double invalid_amount;
scanf("%lf", &invalid_amount);
Account* account = create_account(account_id);
printf("Account %d created\n", account_id);
int result_invalid = deposit(account, invalid_amount);
printf("Deposit %.2f: %d\n", invalid_amount, result_invalid);
int result_valid = deposit(account, valid_amount);
printf("Deposit %.2f: %d\n", valid_amount, result_valid);
destroy_account(account);
printf("Account destroyed\n");
return 0;
}جميع دروس Object Oriented Programming
1أساسيات البرمجة التركيبية
ملفات الترويسةحواجز التضمينملفات المصدرالدوال الساكنةمراجعة: آلة حاسبة تركيبية4التغليف (Encapsulation)
مفهوم الـ Opaque Pointersتعريف الـ Opaque Structsالـ Getters والـ Settersالتحقق من البيانات في الـ Settersملخص: الصندوق السري2الكائنات والأساليب
الـ Structs ككائناتمؤشر 'Self'صحة استخدام Constالمؤشر مقابل القيمةالأساليب المساعدةملخص: Point Manager5مشروع: حساب بنكي بسيط
إعداد المشروعتنفيذ الحساب3دورة حياة الكائن
نمط المنشئ (Constructor Pattern)نمط الهادم (Destructor Pattern)تهيئة الـ Stackالنسخ العميق (Deep Copy)مراجعة: String Wrapper6الوراثة عبر التركيب
تضمين الـ Structقاعدة العضو الأولالوصول إلى أعضاء الأبعملية الـ Upcastingمراجعة: هرمية الأشكال9مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة