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

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

جزء من قسم البرمجة كائنية التوجه في رحلة C على Coddy. الدرس 53 من 61.

challenge icon

التحدي

سهل

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

ستنظّم التعليمات البرمجية عبر ثلاثة ملفات:

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

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

  1. عدد العناصر المراد إضافتها
  2. لكل عنصر: مؤشر نوع (i أو s) متبوعًا بالقيمة

عند إضافة أعداد صحيحة، خصّص ذاكرة للعدد الصحيح وخزّن المؤشر. وعند إضافة سلاسل نصية، خصّص ذاكرة وانسخ السلسلة. وعند الاسترداد، أعد Cast إلى النوع appropriate للطباعة.

مهم: لتتبّع الأنواع بغرض الطباعة، يمكنك استخدام array متوازية بسيطة من مؤشرات النوع في 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;
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: مترجم C عبر الإنترنت