.. (לתיקייה המכילה) | ||
| |
קודם כל, יש לוודא שבהגשה כל הקבצים הדרושים נמצאים בקובץ zip עצמו ולא בתוך תת תיקייה. במידה וזה לא המקרה, תוודאו שהקבצים main2.cpp ו-library2.h הם הקבצים שפרסמנו ושלא שיניתם אותם. אם בדקתם את זה ואתם סבורים כי נפלה טעות אנא שלחו מייל לרועי. אם בטעות הגשתם את הקבצים בתוך תת תיקייה או שהשתמשתם בקבצים לא מעודכנים בקמפול שלכם, ניתן לתקן את התרגיל ולהגיש אותו מחדש בהתאם לנהלים שפורסמו בהודעה. במקרה כזה, אין צורך לשלוח מייל אבל תוודאו שצירפתם להגשה קובץ טקסט ובו כתובים השינויים שביצעתם. |
בהגשת תיקון לתרגיל מה יש לעשות? | |
מספיק להגיש את התרגיל המתוקן באתר, אין צורך לשלוח מייל. יש לצרף להגשה את פירוט השינויים בקובץ נפרד ושיהיה ברור שזה הקובץ המכיל את השינויים. הפורמט שלו לא משנה (אפשר pdf,txt,doc וכו'). |
כמה נקודות ירדו? | |
כל מקרה יישקל לגופו כשנבדוק את כל ההגשות החוזרות לאחר שכולם יגישו. אנחנו רוצים לראות כמה נפוצות הטעויות לפני שאנו מחליטים להוריד עליהן. אבל באופן עקרוני ככל ששונה יותר בתיקון יורדו יותר נקודות. |
האם יש ליצור שני מימושים עבור library1.h? | |
כן, שימו לב שקובץ ה-cpp לא חייב להיות עם אותו השם כמו קובץ ה-h ולכן ניתן ליצור שני קבצים (אחד לכל מימוש) עם שמות שונים. |
כיצד ניתן לממש את המבנים בחלק הראשון באופן גנרי? | |
ניתן להשתמש ב-template של ++c וכשמממשים את library1.h לאתחל את המחלקה עם טיפוס *void. |
בחלק השני בפונקציה Init, מה עושים אם segments<=0? | |
במקרה זה יש להחזיר NULL. |
בפלט של הבדיקת מהירות קיבלתי הרבה מאוד אפסים עבור המימוש של העץ. האם זה תקין? | |
כן, הפוקנציה ()clock בה השתמשנו לצורך התזמון היא מאוד לא מדויקת ולכן לא ניתן למדוד איתה זמנים קצרים מאוד - היא מעגלת ל-0 או ל-10000 לרוב. עבור אותו גודל קלט לרשימה ייקח הרבה יותר זמן מאשר לעץ ולכן על מנת שהטסטים שלנו עבור רשימה לא ירוצו למשך זמן ארוך מדי עשינו אותם יחסית קטנים והמימוש של העץ מסיים אותם מאוד מהר. לכן, התוצאות שהתקבלו הן תקינות וניתן להשתמש בהן לצורך יצירת הטבלה והגרף. |
האם יש דרך למדוד זמנים בצורה יותר מדויקת? | |
יש שיטה המאפשרת זמנים יותר מדויקים כאשר מריצים על השרת. לא חייבים להשתמש בה אבל היא עוזרת מאוד להסביר את התוצאות. לצורך זאת יש לשנות את הקובץ main1.cpp. יש להוסיף את השורה: #include <chrono> ויש להחליף את השורה: #define GET_TIME clock() בשורה: #define GET_TIME std::chrono::steady_clock::now().time_since_epoch().count() |
מה הערכים האפשריים של segmentID? | |
segmentID הוא בין 0 (כולל) לבין segments (זה שקיבלנו ב-init, לא כולל). סה"כ יש segments אפשרויות. |
בחלק הראשון, כיצד יש לשמור את המידע אשר הכניס המשתמש? | |
מספיק לשמור את המצביע עצמו אשר המשתמש הכניס. כאשר מחזירים נחזיר גם כן את המצביע עצמו. בשום שלב אין צורך להעתיק את הערך עליו מצביעים או להתייחס אליו בכלל, גם לא לשחרר אותו. |
כיצד ניתן לכתוב שני מימושים שונים עבור הקובץ library1.h? | |
הדרך הכי פשוטה היא אני ממליץ ליצור 2 קבצים של המבנים עצמם (רשימה ועץ) אשר ישמשו אתכם עבור שני החלקים. בשביל החלק הראשון יש ליצור בנוסף קובץ cpp לכל מימוש (סה"כ 2) אשר מקשר בין המימוש לבין library1.h. בחלק השני, ניתן להשתמש ישירות בקבצים של המבנים עצמם. |
בחלק היבש, האם יש צורך לתאר את מבני הנתונים אשר מימשנו בחלק הראשון? | |
לא, אין צורך לתאר את המבנים מהחלק הראשון. יש לתאר את המבנה מהחלק השני בלבד. |
בחלק השני לא מצאתי צורך להשתמש בחלק מהפונקציות של החלק הראשון. האם זה תקין? | |
כן, כל עוד מבנה הנתונים שלכם בחלק השני תקין ועומד בדרישות הסיבוכיות זה בסדר. אין חובה להשתמש בכל הפונקציות מהחלק הראשון, הן באות אך ורק לעזור לכם בחלק השני. |
בחלק הראשון, האם המשתמש יכול לשנות ערכים בתוך המצביע ל-node שחזר אליו מ-Add או לשחרר אותו? | |
לא. ניתן להניח שהמשתמש לא יעשה זאת. השימוש היחיד של המשתמש במצביע זה תהיה להכניס אותו כארגומנט לפונקציה DeleteByPointer והוא יעשה את זה לכל היותר פעם אחת. |
בפונקציה GetAllUnLabeledSegments בחלק השני, במידה ומספר הסגמנטים הלא מתויגים הוא אפס מה יש להחזיר? | |
יש להחזיר NULL ב-segments ו-0 ב-numOfSegments. הפונקציה צריכה להחזיר Failure. |
בחלק היבש הראשון של התרגיל, מה העמודה של ה-n מייצגת בטבלאות? | |
הכוונה לגודל הממוצע של המבנה בזמן ביצוע הפעולה. כך יהיה ניתן להשתמש בשתי עמודות בטבלה ליצירת גרף (הגודל הממוצע של המבנה והזמן שלקח לפעולה). |
בחלק היבש הראשון של התרגיל, מה צריך לעשות בדיוק? | |
מתוך כל שורה בפלט של הטסטים תיקחו את שני הנתונים המעניינים אותנו: (גודל ממוצע, זמן). לצורך השוואה בין שני סוגי המימושים, ניצור טבלה אחת עבור כל טסט ועבור שני המימושים. כלומר, סה"כ תיצרו 3 טבלאות. בכל טבלה השורה תיראה (גודל ממוצע, זמן במימוש 1, זמן במימוש 2). מכל טבלה, יש ליצור גרף עם ציר X שהוא הגודל הממוצע וציר Y שהוא הזמן. יש לצייר בגרף את כל הנקודות (גודל ממוצע, זמן) מהטבלה. בכל שורה יש 2 נקודות כאלו (אחת לכל מימוש). יש לצייר את כל הנקודות של מימוש 1 בצבע אחד ואת כל הנקודות של מימוש 2 בצבע שני. כך יצרנו גרף המתאר את ההבדל בזמני ריצה של 2 המימושים לטסטים שלנו. לחילופין, ניתן ליצור גרף נפרד עבור כל מימוש בדרך דומה. |
כיצד יש לתעד את הקוד? | |
יש לתעד את הקוד בצורה נאותה וסבירה. כלומר: אין צורך לחזור ממש על מה שכתבתם בחלק היבש בתיעוד של הקוד. מספיק לתעד בקצרה כך שיהיה ברור מה קורה בגדול בכל חלק בקוד. אין צורך בהסברים לגבי למה עושים את הפעולות השונות אלא רק מה קורה. |
איזה קבצים צריך לשים איפה בהגשה? | |
בתיקיה הראשית צריכים להיות כל הקבצים הדרושים לצורך הרצה וקמפול של חלק 2 (חוץ מהקבצים שפרסמנו). בתת תיקייה יש לשים את כל הקבצים שקשורים לחלק 1 (חוץ מהקבצים שפרסמנו). אין בדיקה אוטומטית של חלק 1 ולכן לא משנה מה השמות של הקבצים או האם שמתם אותם בתיקייה עבור כל מימוש. |
בחלק הראשון האם צריך להגיש גם את הטבלאות זמנים של הטסטים? זה לא יוצא ארוך מדי ביחד? | |
צריך להגיש גם את הטבלאות של החלק הראשון. ההגבלה של ה-6 עמודים היא רק עבור החלק השני. |