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

منطق السحب

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 25 من 61.

challenge icon

التحدي

سهل

حسابك المصرفي ينمو! لنضف الآن إمكانية سحب الأموال. بخلاف الإيداعات، تفرض عمليات السحب قيدًا إضافيًا. لا يمكنك سحب أموال أكثر مما لديك. يجب أن تتحقق withdraw function من balance قبل السماح بالمعاملة.

بالاعتماد على مشروع Bank Account الحالي، ستوسّع الوحدة بإضافة وظيفة السحب. هنا تتألق آلية التغليف حقًا. يمكن لـ function الوصول إلى balance المخفي للتحقق من كفاية الأموال، وهو أمر لا يمكن للكود الخارجي القيام به مباشرةً.

ستعمل باستخدام ثلاثة ملفات:

  • account.h: أضف prototype جديدًا لـ withdraw. تأخذ هذه function مؤشرًا إلى Account ومبلغًا من نوع double، وتُرجع int (القيمة 1 في حالة success، والقيمة 0 إذا فشلت عملية السحب). أبقِ جميع التصريحات الحالية الخاصة بـ create_account وdestroy_account وdeposit.
  • account.c: Implement function withdraw. يجب أن تنجح عملية السحب only عند تحقق شرطين: يجب أن يكون المبلغ موجبًا (أكبر من الصفر)، AND يجب أن يمتلك الحساب أموالًا كافية (balance >= amount). إذا تحقق الشرطان، اطرح المبلغ من balance وأرجع 1. وإلا، أرجع 0 without modifying balance.
  • main.c: اعرض سير العمل الكامل للإيداع وwithdraw. أنشئ حسابًا، ونفّذ إيداعًا لإنشاء balance، ثم اختبر عمليات السحب: الناجحة وغير الناجحة.

ستتلقى أربع مُدخلات: account ID (عدد صحيح)، وdeposit amount (لإنشاء الأموال الأولية)، وsuccessful withdrawal amount (أقل من أو يساوي المبلغ المُودَع)، وfailed withdrawal amount (أكبر من balance المتبقي).

في ملفك الرئيسي، أنشئ حسابًا واطبع تأكيدًا. أودِع الأموال الأولية واطبع النتيجة. ثم نفّذ عملية السحب الناجحة واطبع ما إذا كانت قد نجحت. وأخيرًا، حاول تنفيذ عملية السحب التي يُفترض أن تفشل (بسبب عدم كفاية الأموال) واطبع النتيجة. أتلف الحساب وأكّد اكتمال التنظيف.

اطبع الناتج بهذا التنسيق:

Account 1001 created
Deposit 500.00: 1
Withdraw 200.00: 1
Withdraw 400.00: 0
Account destroyed

حيث إن 1001 هو account ID، و500.00 هو مبلغ الإيداع، و200.00 هو successful withdrawal، و400.00 هو failed withdrawal (لأنه لا يتبقى سوى 300.00 بعد عملية السحب الأولى). نسّق جميع المبالغ باستخدام منزلتين عشريتين عبر %.2f.

تُظهر withdraw function قوة التغليف. إذ يمكنها التحقق من balance المخفي داخليًا لاتخاذ القرارات، في حين لا يملك الكود الخارجي أي وسيلة لتجاوز عملية التحقق هذه أو الاطلاع على balance مباشرةً.

جرّب بنفسك

#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;
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت