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

مراجعة: المصفوفة العامة

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

challenge icon

التحدي

سهل

لنقم ببناء حاوية GenericArray — وهي هيكل بيانات مرن يمكنه الاحتفاظ بمزيج من الأعداد الصحيحة والسلاسل النصية في نفس المجموعة باستخدام مؤشرات void*.

ستقوم بتنظيم الكود الخاص بك عبر ثلاثة ملفات:

  • generic_array.h: قم بتعريف هيكل GenericArray بثلاثة أعضاء: مصفوفة void** للاحتفاظ بالمؤشرات، و int للعدد الحالي (count)، و int للسعة (capacity). صرّح عن النماذج الأولية للدوال (function prototypes) لإنشاء المصفوفة، إضافة العناصر، استرجاع العناصر حسب الفهرس، وتحرير المصفوفة.
  • generic_array.c: قم بتنفيذ وظائف الحاوية الخاصة بك:
    • create_array — يخصص GenericArray بسعة أولية معطاة ويقوم بتهيئة count إلى 0
    • add_element — يخزن مؤشر void* في الفتحة المتاحة التالية ويزيد count (افترض أن السعة كافية)
    • get_element — يعيد void* الموجود في الفهرس المحدد
    • free_array — يحرر مصفوفة العناصر وهيكل GenericArray نفسه
  • main.c: قم باستعراض المصفوفة العامة الخاصة بك عن طريق تخزين كل من الأعداد الصحيحة والسلاسل النصية. اقرأ عدد العناصر المراد إضافتها، ثم اقرأ لكل عنصر مؤشر نوع (i للعدد الصحيح، s للسلسلة النصية) متبوعاً بالقيمة. بعد إضافة جميع العناصر، قم بالمرور عبر المصفوفة واطبع كل قيمة. بالنسبة للأعداد الصحيحة، اطبع الرقم مباشرة. بالنسبة للسلاسل النصية، اطبع النص مباشرة.

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

  1. عدد العناصر المراد إضافتها
  2. لكل عنصر: مؤشر نوع (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