Menu
Coddy logo textTech

סיכום: מערך גנרי

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 53 מתוך 61.

challenge icon

אתגר

קל

בוא נבנה מכל GenericArray: מבנה נתונים גמיש שיכול להכיל שילוב של מספרים שלמים ומחרוזות באותו אוסף באמצעות מצביעי void*.

תארגן את הקוד שלך בשלושה קבצים:

  • generic_array.h: הגדר את המבנה GenericArray עם שלושה איברים: מערך void** לאחסון מצביעים, int עבור הכמות הנוכחית, ו-int עבור הקיבולת. הכרז על אבות הטיפוס של הפונקציות ליצירת המערך, להוספת איברים, לאחזור איברים לפי אינדקס ולשחרור המערך.
  • generic_array.c: ממש את הפונקציונליות של המכל:
    • create_array: מקצה GenericArray עם קיבולת התחלתית נתונה ומאתחל את הכמות ל-0
    • add_element: מאחסנת מצביע void* במקום הפנוי הבא ומגדילה את הכמות (נניח שהקיבולת מספיקה)
    • get_element: מחזירה את ה-void* באינדקס שצוין
    • free_array: משחררת את מערך הפריטים ואת מבנה ה-GenericArray עצמו
  • main.c: הדגם את המערך הגנרי שלך באמצעות אחסון מספרים שלמים ומחרוזות. קרא את מספר האיברים להוספה, ולאחר מכן קרא עבור כל איבר סימון סוג (i עבור מספר שלם, s עבור מחרוזת) ולאחריו את הערך. לאחר הוספת כל האיברים, עבור על המערך והדפס כל ערך. עבור מספרים שלמים, הדפס את המספר ישירות. עבור מחרוזות, הדפס את הטקסט ישירות.

התוכנית שלך תקבל:

  1. את מספר האיברים להוספה
  2. עבור כל איבר: סימון סוג (i או s) ולאחריו הערך

בעת הוספת מספרים שלמים, הקצה זיכרון עבור ה-int ואחסן את המצביע. בעת הוספת מחרוזות, הקצה זיכרון והעתק את המחרוזת. בעת אחזור, המר בחזרה לסוג המתאים כדי להדפיס.

חשוב: כדי לעקוב אחר הסוגים לצורך הדפסה, אפשר להשתמש ב-main במערך מקביל ופשוט של סימוני סוג, או לאחסן את תו סימון הסוג לצד כל איבר.

פלט לדוגמה כאשר הקלט הוא 3, ואחריו i 42, s Hello, i 100:

42
Hello
100

פלט לדוגמה כאשר הקלט הוא 4, ואחריו s World, s Generic, i -5, s Arrays:

World
Generic
-5
Arrays

זכור להשתמש בשומרי הכללה בקובץ הכותרת שלך. המכל עצמו לא צריך לדעת אילו סוגים הוא מאחסן. הוא רק מחזיק מצביעי 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 אונליין