حاوية الأشكال
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 48 من 61.
التحدي
سهلدعنا نصل بمشروع "رسم الأشكال" (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*يمكنها حمل أي نوع من الأشكال. املأها بمزيج من الدوائر والمستطيلات، ثم قم بالمرور عبر المصفوفة لحساب وعرض المساحة الإجمالية لجميع الأشكال مجتمعة.
سيتلقى برنامجك المدخلات التالية:
- عدد الأشكال المراد إنشاؤها
- لكل شكل: مؤشر النوع (
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
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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة