Menu
Coddy logo textTech

סיכום – מנהל מערכים דינמיים

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

challenge icon

אתגר

קל

בואו נבנה מחלקה בשם DynamicArray שמנהלת את הזיכרון שלה בעצמה וגדלה אוטומטית בעת הצורך, בדיוק כמו std::vector מאחורי הקלעים!

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

  • DynamicArray.h: הגדירו מחלקה בשם DynamicArray שמנהלת מערך בגודל דינמי של מספרים שלמים. למחלקה שלכם צריכים להיות:
    • חברים פרטיים: מצביע למערך הנתונים, הגודל הנוכחי (מספר האיברים) והקיבולת (השטח שהוקצה)
    • בנאי שמקבל קיבולת התחלתית, מקצה את המערך בערימה ומאתחל את הגודל ל־0
    • הורס שמשחרר את הזיכרון שהוקצה ומדפיס "DynamicArray destroyed"
    • מתודה בשם push(int value) שמוסיפה איבר למערך. אם המערך מלא, עליה להכפיל את הקיבולת באמצעות הקצאת מערך חדש וגדול יותר, העתקת האיברים הקיימים ושחרור המערך הישן
    • מתודה בשם get(size_t index) שמחזירה את האיבר באינדקס הנתון
    • מתודה בשם getSize() שמחזירה את מספר האיברים הנוכחי
    • מתודה בשם getCapacity() שמחזירה את הקיבולת הנוכחית
  • main.cpp: קראו קיבולת התחלתית ואת מספר הערכים שיש להוסיף. לאחר מכן קראו את מספר הערכים הזה כמספרים שלמים והוסיפו כל אחד מהם ל־DynamicArray שלכם. לאחר הוספת כל הערכים, הדפיסו:
    • "Size: <size>"
    • "Capacity: <capacity>"
    • "Elements: <e1> <e2> ..." (כל האיברים מופרדים ברווחים)

פורמט הקלט יהיה:

  • שורה ראשונה: קיבולת התחלתית (מספר שלם)
  • שורה שנייה: מספר הערכים שיש להוסיף (מספר שלם)
  • השורות הבאות: ערך אחד מסוג מספר שלם בכל שורה

בעת שינוי הגודל, המערך שלכם צריך להכפיל את הקיבולת שלו. לדוגמה, אם מתחילים בקיבולת 2 ומוסיפים איבר שלישי, הקיבולת צריכה לגדול ל־4. כך מודגם עקרון RAII. המחלקה שלכם רוכשת זיכרון בבנאי ומשחררת אותו בהורס, וכך מוודאת שאין דליפות זיכרון.

כללו את קובץ הכותרת שלכם ב־main.cpp באמצעות #include "DynamicArray.h".

נסו בעצמכם

#include <iostream>
#include "DynamicArray.h"

using namespace std;

int main() {
    // קרא את הקיבולת ההתחלתית
    int initialCapacity;
    cin >> initialCapacity;

    // קרא את מספר הערכים שיש להוסיף
    int numValues;
    cin >> numValues;

    // TODO: צור DynamicArray עם הקיבולת ההתחלתית

    // TODO: קרא numValues מספרים שלמים והוסף כל אחד מהם למערך

    // TODO: הדפס "Size: <size>"

    // TODO: הדפס "Capacity: <capacity>"

    // TODO: הדפס "Elements: <e1> <e2> ..." (כל האיברים מופרדים ברווחים)

    return 0;
}

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C++ אונליין