סיכום: מערך גנרי
חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 53 מתוך 61.
אתגר
קלבוא נבנה מכל GenericArray: מבנה נתונים גמיש שיכול להכיל שילוב של מספרים שלמים ומחרוזות באותו אוסף באמצעות מצביעי void*.
תארגן את הקוד שלך בשלושה קבצים:
generic_array.h: הגדר את המבנהGenericArrayעם שלושה איברים: מערךvoid**לאחסון מצביעים,intעבור הכמות הנוכחית, ו-intעבור הקיבולת. הכרז על אבות הטיפוס של הפונקציות ליצירת המערך, להוספת איברים, לאחזור איברים לפי אינדקס ולשחרור המערך.generic_array.c: ממש את הפונקציונליות של המכל:create_array: מקצה GenericArray עם קיבולת התחלתית נתונה ומאתחל את הכמות ל-0add_element: מאחסנת מצביעvoid*במקום הפנוי הבא ומגדילה את הכמות (נניח שהקיבולת מספיקה)get_element: מחזירה את ה-void*באינדקס שצויןfree_array: משחררת את מערך הפריטים ואת מבנה ה-GenericArray עצמו
main.c: הדגם את המערך הגנרי שלך באמצעות אחסון מספרים שלמים ומחרוזות. קרא את מספר האיברים להוספה, ולאחר מכן קרא עבור כל איבר סימון סוג (iעבור מספר שלם,sעבור מחרוזת) ולאחריו את הערך. לאחר הוספת כל האיברים, עבור על המערך והדפס כל ערך. עבור מספרים שלמים, הדפס את המספר ישירות. עבור מחרוזות, הדפס את הטקסט ישירות.
התוכנית שלך תקבל:
- את מספר האיברים להוספה
- עבור כל איבר: סימון סוג (
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;
}
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין