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

حاوية الأشكال

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

challenge icon

التحدي

سهل

دعنا نصل بمشروع "رسم الأشكال" (Shape Drawer) إلى نهايته الكبرى! ستقوم بإنشاء حاوية أشكال تحتوي على مجموعة مختلطة من الدوائر (Circles) والمستطيلات (Rectangles)، ثم تمر عليها لحساب المساحة الإجمالية — مما يوضح القوة الحقيقية لتعدد الأشكال (polymorphism).

بناءً على كل ما أنشأته حتى الآن، سيتضمن مشروعك الكامل ما يلي:

  • shape.h و shape.c: واجهة الشكل (Shape) الأساسية ودالة process_shape.
  • circle.h و circle.c: تنفيذ الدائرة (Circle) مع المنشئ (constructor) الخاص بها وحساب المساحة.
  • rectangle.h و rectangle.c: تنفيذ المستطيل (Rectangle) مع المنشئ الخاص به وحساب المساحة.
  • main.c: هنا يحدث السحر. ستقوم بإنشاء مصفوفة من مؤشرات Shape* يمكنها حمل أي نوع من الأشكال. املأها بمزيج من الدوائر والمستطيلات، ثم قم بالمرور عبر المصفوفة لحساب وعرض المساحة الإجمالية لجميع الأشكال مجتمعة.

سيتلقى برنامجك المدخلات التالية:

  1. عدد الأشكال المراد إنشاؤها
  2. لكل شكل: مؤشر النوع (c للدائرة، r للمستطيل) متبوعاً بأبعاده

لكل شكل في الحاوية الخاصة بك، قم بطباعة مخرجات الرسم (draw) الخاصة به. بعد معالجة جميع الأشكال، اطبع المساحة الإجمالية بمنزلتين عشريتين بالتنسيق Total Area: X.XX.

مثال مع المدخلات 3، ثم c 5.0، r 4.0 3.0، c 2.0:

Drawing Circle with radius: 5.00
Drawing Rectangle with width: 4.00 and height: 3.00
Drawing Circle with radius: 2.00
Total Area: 103.11

مثال مع المدخلات 2، ثم r 6.0 4.0، r 3.0 2.0:

Drawing Rectangle with width: 6.00 and height: 4.00
Drawing Rectangle with width: 3.00 and height: 2.00
Total Area: 30.00

الفكرة الجوهرية هي أن مصفوفتك تخزن مؤشرات Shape* — فهي لا تهتم ما إذا كان كل عنصر هو في الواقع دائرة أو مستطيل. عندما تمر عبر المصفوفة وتستدعي draw و area من خلال كل مؤشر، يتم تنفيذ التنفيذ الصحيح تلقائياً بناءً على كيفية إنشاء كل شكل. هذا هو تعدد الأشكال (polymorphism) في أبهى صوره: حلقة واحدة، واجهة واحدة، وسلوكيات متعددة.

تذكر أنك ستحتاج إلى تخزين مؤشرات لأعضاء Shape المضمنة في أشكالك الملموسة داخل المصفوفة. استخدم 3.14159 للقيمة π في حسابات مساحة الدائرة.

هام — قراءة حرف نوع الشكل: بعد قراءة عدد الأشكال باستخدام scanf("%d", &n)، يجب أن تتخطى كل استدعاء لاحق لقراءة حرف النوع السطر الجديد المتبقي في مخزن الإدخال المؤقت. استخدم مسافة بادئة في سلسلة التنسيق للقيام بذلك:

scanf(" %c", &type);  // note the space before %c

بدون المسافة البادئة، سيقرأ scanf حرف السطر الجديد المتبقي من الإدخال السابق بدلاً من حرف c أو r المقصود، مما يتسبب في فشل التحقق من نوع الشكل بصمت وعدم إنتاج أي مخرجات.

جرّب بنفسك

#include <stdio.h>
#include <stdlib.h>
#include "shape.h"
#include "circle.h"
#include "rectangle.h"

int main() {
    // TODO: قراءة عدد الأشكال
    // TODO: تخصيص مصفوفات للدوائر (circles)، والمستطيلات (rectangles)، ومؤشرات من نوع *Shape
    // TODO: المرور عبر كل شكل، وقراءة نوعه وأبعاده،
    //       وإنشاء الشكل، وتخزين مؤشر لقاعدته في مصفوفة shapes
    // TODO: المرور عبر مصفوفة shapes، واستدعاء draw لكل شكل،
    //       وتجميع المساحة الإجمالية
    // TODO: طباعة المساحة الإجمالية بالتنسيق التالي: Total Area: X.XX
    // TODO: تحرير الذاكرة المخصصة
    return 0;
}

جميع دروس Object Oriented Programming