مراجعة: المصفوفة العامة
جزء من قسم Object Oriented Programming في رحلة C على Coddy — الدرس 53 من 61.
التحدي
سهللنقم ببناء حاوية GenericArray — وهي هيكل بيانات مرن يمكنه الاحتفاظ بمزيج من الأعداد الصحيحة والسلاسل النصية في نفس المجموعة باستخدام مؤشرات void*.
ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:
generic_array.h: قم بتعريف هيكلGenericArrayبثلاثة أعضاء: مصفوفةvoid**للاحتفاظ بالمؤشرات، وintللعدد الحالي (count)، وintللسعة (capacity). صرّح عن النماذج الأولية للدوال (function prototypes) لإنشاء المصفوفة، إضافة العناصر، استرجاع العناصر حسب الفهرس، وتحرير المصفوفة.generic_array.c: قم بتنفيذ وظائف الحاوية الخاصة بك:create_array— يخصصGenericArrayبسعة أولية معطاة ويقوم بتهيئة count إلى 0add_element— يخزن مؤشرvoid*في الفتحة المتاحة التالية ويزيد count (افترض أن السعة كافية)get_element— يعيدvoid*الموجود في الفهرس المحددfree_array— يحرر مصفوفة العناصر وهيكلGenericArrayنفسه
main.c: قم باستعراض المصفوفة العامة الخاصة بك عن طريق تخزين كل من الأعداد الصحيحة والسلاسل النصية. اقرأ عدد العناصر المراد إضافتها، ثم اقرأ لكل عنصر مؤشر نوع (iللعدد الصحيح،sللسلسلة النصية) متبوعاً بالقيمة. بعد إضافة جميع العناصر، قم بالمرور عبر المصفوفة واطبع كل قيمة. بالنسبة للأعداد الصحيحة، اطبع الرقم مباشرة. بالنسبة للسلاسل النصية، اطبع النص مباشرة.
سيتلقى برنامجك:
- عدد العناصر المراد إضافتها
- لكل عنصر: مؤشر نوع (
iأوs) متبوعاً بالقيمة
عند إضافة أعداد صحيحة، قم بتخصيص ذاكرة لـ int وقم بتخزين المؤشر. عند إضافة سلاسل نصية، قم بتخصيص ذاكرة ونسخ السلسلة. عند الاسترجاع، قم بالتحويل العكسي (cast) إلى النوع المناسب للطباعة.
هام: لتتبع الأنواع من أجل الطباعة، يمكنك استخدام مصفوفة موازية بسيطة لمؤشرات النوع في main، أو تخزين حرف مؤشر النوع بجانب كل عنصر.
مثال للمخرجات عندما تكون المدخلات 3، ثم i 42، s Hello، i 100:
42
Hello
100مثال للمخرجات عندما تكون المدخلات 4، ثم s World، s Generic، i -5، s Arrays:
World
Generic
-5
Arraysتذكر استخدام حراس التضمين (include guards) في ملف الرأس الخاص بك. الحاوية نفسها لا تحتاج إلى معرفة أنواع البيانات التي تخزنها — فهي تحتفظ فقط بمؤشرات void*. تقع مسؤولية معرفة النوع على الكود الذي يقوم بإضافة واسترجاع العناصر.
جرّب بنفسك
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "generic_array.h"
int main() {
int n;
scanf("%d", &n);
// TODO: أنشئ GenericArray بسعة n
// TODO: أنشئ مصفوفة موازية لتتبع الأنواع (مصفوفة char بحجم n)
// TODO: لكل عنصر:
// - اقرأ مؤشر النوع (i أو s)
// - اقرأ القيمة
// - إذا كان عدداً صحيحاً: خصص ذاكرة لـ int، وخزن القيمة، وأضفها إلى المصفوفة
// - إذا كانت سلسلة نصية: خصص ذاكرة للسلسلة، وانسخ القيمة، وأضفها إلى المصفوفة
// - خزن مؤشر النوع في مصفوفتك الموازية
// TODO: قم بالمرور عبر المصفوفة واطبع كل عنصر
// - تحقق من النوع من مصفوفتك الموازية
// - قم بتحويل void* مرة أخرى إلى النوع المناسب واطبع
// 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مشروع: رسّام الأشكال
نظرة عامة على المشروعتنفيذ الدائرة