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

ملخص: الصندوق السري

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

challenge icon

التحدي

سهل

لنقم ببناء وحدة Box توضح مفهوم التغليف (encapsulation) الكامل. سيكون لصندوقك ثلاثة أبعاد مخفية — العرض (width)، والارتفاع (height)، والعمق (depth) — والتي لا يمكن الوصول إليها إلا من خلال الدوال التي توفرها. هذا هو نمط المؤشر غير الشفاف (opaque pointer pattern) الكامل قيد التنفيذ!

ستقوم بإنشاء ثلاثة ملفات:

  • box.h: واجهتك العامة. صرّح عن نوع Box غير شفاف باستخدام إعلان مسبق (forward declaration) فقط — يظل جسم الهيكل (struct) مخفيًا. صرّح عن هذه الدوال:
    • create_box — تأخذ ثلاثة أعداد صحيحة (width، height، depth) وتعيد مؤشر Box.
    • destroy_box — تحرر الذاكرة المخصصة.
    • get_volume — تأخذ const Box * وتعيد الحجم (width × height × depth).
    • set_dimensions — تأخذ مؤشر Box وثلاث قيم أبعاد جديدة، وتعيد int (1 للنجاح، 0 إذا كان أي بُعد سالبًا أو صفرًا).
    استخدم حراس التضمين (include guards) مع الرمز BOX_H.
  • box.c: عرّف struct Box الفعلي مع ثلاثة أعضاء مخفيين: int width، و int height، و int depth. قم بتنفيذ الدوال الأربع جميعها. يجب أن يقوم منشئ الكائن (constructor) بتخصيص الذاكرة وتهيئة الصندوق. يجب أن تتحقق دالة set_dimensions من أن القيم الثلاث جميعها موجبة (أكبر من الصفر) قبل تطبيق التغييرات — إذا فشلت أي قيمة في التحقق، فارفض التحديث بالكامل وأعد 0.
  • main.c: استعرض صندوقك المغلف عن طريق إنشاء واحد، والتحقق من حجمه، ومحاولة تغيير الأبعاد (سواء كانت صالحة أو غير صالحة)، والتنظيف بشكل صحيح.

ستتلقى خمسة مدخلات: العرض الأولي، الارتفاع الأولي، العمق الأولي، تليها ثلاثة أبعاد جديدة لمحاولة تعيينها (والتي قد تتضمن قيمًا غير صالحة).

في ملفك الرئيسي، أنشئ Box بالأبعاد الأولية واطبع حجمه. ثم حاول تعيين الأبعاد الجديدة — اطبع ما إذا كان التحديث قد نجح والحجم الناتج. أخيرًا، قم بتحرير الصندوق وأكد عملية التنظيف.

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

Volume: {volume}
Set: {0 or 1}
Volume: {volume}
Destroyed

على سبيل المثال، مع المدخلات 2، 3، 4، 5، 5، 5، ستكون المخرجات:

Volume: 24
Set: 1
Volume: 125
Destroyed

مع المدخلات 2، 3، 4، -1، 5، 5، ستكون المخرجات:

Volume: 24
Set: 0
Volume: 24
Destroyed

لاحظ كيف يحمي التحقق في set_dimensions صندوقك من الحالات غير الصالحة — لا يمكن للكود الخارجي تجاوز قواعدك لأن الأبعاد مخفية تمامًا خلف واجهتك.

جرّب بنفسك

#include <stdio.h>
#include "box.h"

int main() {
    // قراءة الأبعاد الأولية
    int width, height, depth;
    scanf("%d", &width);
    scanf("%d", &height);
    scanf("%d", &depth);
    
    // قراءة الأبعاد الجديدة للمحاولة
    int new_w, new_h, new_d;
    scanf("%d", &new_w);
    scanf("%d", &new_h);
    scanf("%d", &new_d);
    
    // TODO: إنشاء صندوق بالأبعاد الأولية
    
    
    // TODO: طباعة الحجم الأولي بالتنسيق: "Volume: {volume}"
    
    
    // TODO: محاولة تعيين أبعاد جديدة وتخزين النتيجة
    
    
    // TODO: طباعة ما إذا كان التعيين قد نجح بالتنسيق: "Set: {0 or 1}"
    
    
    // TODO: طباعة الحجم الناتج بالتنسيق: "Volume: {volume}"
    
    
    // TODO: تدمير الصندوق وطباعة "Destroyed"
    
    
    return 0;
}

جميع دروس Object Oriented Programming