מה"ט מבני נתונים ותכנות מונחה עצמים — הנדסאי תוכנה — קיץ 2023 מועד ב' (97105)
תאריך הבחינה: לא ידוע
טופס המבחן המלא להורדה — ומפתח התשובות עם פתרון מפורט לכל שאלה, אונליין. פתחו שאלה למטה: בשאלה סגורה בוחרים תשובה, בשאלה פתוחה נפתח הפתרון המלא (כניסה מהירה וחינם).
למגמת הנדסת תוכנה — מבנה נתונים ותכנות מונחה עצמים. נבחנים ב-Java או ב-C#, ובוחרים שפה בכניסה למבחן.
✓ פתרון מלא לכל שאלה · ✓ הסברים מלאים וחומרי לימוד · ✓ ליווי מורה AI · ✓ התחלה חינם
פתרון מפורט לכל שאלה — לא רק התשובה: הסבר שלב-אחר-שלב וניתוח הטעויות הנפוצות.
שאלות לדוגמה מהמבחן — פתרו עכשיו
בשאלה סגורה בוחרים תשובה; בשאלה פתוחה פותחים את הפתרון המלא (כניסה מהירה וחינם). אלו 3 מתוך 10 שאלות המבחן — את כולן תוכלו לפתור אונליין.
שני מספרים שלמים וחיוביים num1 ו-num2 נקראים "זרים זה לזה" אם אין להם אף מחלק משותף פרט ל-1. סעיף א' בודק זרות בין שני מספרים; סעיף ב' משתמש בכך כדי לסדר תור לפי זרות למספר נתון.
תור q לדוגמה עבור סעיף ב', לפני הפעולה change (ראש התור בצד ימין של הציור, סוף התור בצד שמאל — שני החצים בציור מצביעים שמאלה, מציינים את כיוון הזרימה מסוף התור לראשו).
ראש (head)→ 2 | 10 | 12 | 3 | 7 | 4 | 1 ←סוף (tail, num=9 נבדק כאן)
דוגמה לתור אפשרי אחרי change(q, 9) — כל הזרים ל-9 (2,10,7,4,1) לפני כל הלא-זרים ל-9 (3,12); הסדר הפנימי בכל קבוצה אינו מחייב (הניסוח 'יכול להיות' בשאלון).
ראש→ 2 | 10 | 7 | 4 | 1 | 3 | 12 ←סוף
שני מספרים שלמים וחיוביים num1 ו-num2 נקראים "זרים זה לזה" אם אין להם אף מחלק משותף פרט ל-1. כתבו פעולה המקבלת שני מספרים שלמים חיוביים. הפעולה תבדוק אם הם "זרים". אם כן, הפעולה תחזיר ערך true, ולא — הפעולה תחזיר ערך false. כותרת הפעולה: public static boolean strangers(int num1, int num2)
כתבו פעולה change המקבלת תור q ומספר num. הפעולה משנה את סדר האיברים בתור כך שכל המספרים ה"זרים" ל-num יהיו בתחילת התור וכל האיברים אשר "לא זרים" ל-num, יהיו אחריהם. לדוגמה: עבור התור q הבא (ראה איור) והמספר num=9, התור שיתקבל יכול להיות (ראה איור). כותרת הפעולה: public static void change(Queue<Integer> q, int num)
מהי הסיבוכיות של הפעולות שכתבתם בסעיפים א' ו-ב'? הסבירו את תשובתכם.
כתבו פעולה המקבלת הפניה לחוליה הראשונה של שרשרת חוליות של מספרים שלמים, ומפצלת אותה לשתי שרשראות לפי זוגיות הערך הראשון: כל מה שתואם את זוגיות הראש נשאר ב-chain, וכל השאר עובר לשרשרת חדשה מוחזרת.
שרשרת החוליות chain לפני הפעולה.
chain → 10 → 20 → 5 → 7 → 8 → 4 → 6 → 11 → 7
שרשרת החוליות chain אחרי הפעולה (נשארו רק הערכים הזוגיים, כי הראשון 10 זוגי).
chain → 10 → 20 → 8 → 4 → 6
השרשרת החדשה newChain שהוחזרה (הערכים האי-זוגיים שהוצאו, בסדרם היחסי המקורי).
newChain → 5 → 7 → 11 → 7
כתבו פעולה המקבלת הפניה לחוליה הראשונה של שרשרת חוליות של מספרים שלמים. הפעולה תפצל את השרשרת לשניים לפי הכלל הבא: אם ערך הראשון בשרשרת הוא זוגי, יש ליצור שרשרת חדשה רק מהערכים האי-זוגיים תוך מחיקתם מהשרשרת המקורית (בשרשרת המקורית יישארו רק ערכים הזוגיים); אם ערך הראשון בשרשרת הוא אי-זוגי, יש ליצור שרשרת חדשה רק מהערכים הזוגיים תוך מחיקתם מהשרשרת המקורית (בשרשרת המקורית יישארו רק ערכים האי-זוגיים). הפעולה תחזיר הפניה לחוליה הראשונה של השרשרת החדשה. כותרת הפעולה: public static Node<Integer> split(Node<Integer> chain)
מהי סיבוכיות הפעולה split שכתבתם בסעיף א'? הסבירו את תשובתכם.
סעיף א' עוסק בכתיבת בנאים למחלקות First ו-Second כך שהרצת פעולה ראשית נתונה תיצור עצמים עם ערכי תכונות נתונים. סעיף ב' בודק תקינות (קומפילציה/זמן ריצה) של שמונה קטעי קוד המשתמשים בהמרות טיפוס על עץ ירושה נתון (Shape/Square/Triangle/Circle/Cylinder).
public class First
{
protected int num;
....
}
public class Second extends First
{
private double x;
private First f;
...
}
public class Test
{
public static void main(String[] args)
{
First[] arr = new First[5];
arr[0] = new First (13);
arr[1] = new First ();
arr[2] = new Second();
arr[3] = new Second(5, arr[0]);
arr[4] = new Second(2, 3.7, arr[2]);
}
}
חמשת העצמים שנוצרו בהרצת main (סעיף א') — הערכים המבוקשים בכל תא של arr.
arr[0]: First{num=13} | arr[1]: First{num=10} | arr[2]: Second{num=10,x=1.1,f=null} | arr[3]: Second{num=5,x=5.5,f→First{num=13}} | arr[4]: Second{num=5,x=5.5,f→(אותו עצם First{num=13} כמו arr[3])}
עץ הירושה לסעיף ב': Shape הוא השורש; Square, Triangle, Circle יורשות ישירות מ-Shape; Cylinder יורשת מ-Circle.
Shape
├── Square
├── Triangle
└── Circle
└── Cylinder
לפניכם כותרות המחלקות Second, First ותכונות שלהן ומחלקה Test הכוללת פעולה ראשית (ראו code_context). הרצת הפעולה יצרה את העצמים המתוארים (ראו איור). כתבו במחלקות First ו-Second את הפעולות הבונות (constructors) הנדרשות לשם הרצת הפעולה הראשית כך שיתקבלו העצמים המתוארים.
נתון עץ הירושה הבא (ראו איור). לפניכם קטע קוד מתוך פעולה ראשית: Shape s1 = new Shape(); Shape s2 = new Circle(); Shape s3 = new Cylinder(); Circle c = new Cylinder(); לפניכם שמונה קטעי קוד. עבור כל אחד מהסעיפים יש לציין אם הקוד תקין או לא. אם הקוד אינו תקין — יש להסביר למה הוא אינו תקין ולציין את סוג השגיאה (שגיאת קומפילציה/הידור או שגיאת זמן ריצה).
- Circle c0 = new Shape();
- Circle c1 = s1;
- Circle c2 = (Circle)s2;
- Circle c3 = (Circle)s3;
- Circle c4 = (Circle) s1;
- Triangle t = new Triangle(); Shape s5 = t; Circle c5 = (Circle)s5;
- Shape s = (Circle)(new Cylinder());
- Circle c = (Shape)(new Cylinder());
הנושאים הרשמיים בבחינה 97105
לפי תוכנית הלימודים הרשמית של מה"ט (מבנה נתונים ותכנות מונחה עצמים) — אלו הנושאים שהבחינה נשענת עליהם:
- חזרה ותרגול בתמ"ע, דגש על שימוש במחלקה נתונה על בסיס ממשק הפעולות · 6 ש'
- פעולות על מערך - טיפוס נתונים סדרתי · 10 ש'
- מחלקה גנרית · 4 ש'
- רקורסיה · 12 ש'
- יעילות · 11 ש'
- מחסנית – Stack · 11 ש'
- תור – Queue · 11 ש'
- המחלקה הגנרית Node – מחלקה גנרית ייצוג חוליה בסיסית · 8 ש'
- חוליה בינארית - רשימות מקושרות דו כיווניות, עץ בינארי · 17 ש'
- OOP · 8 ש'
- שימוש ב-UML לשם מידול ופישוט OOP · 11 ש'
- הורשה · 8 ש'
- פולימורפיזם · 8 ש'
- פולימורפיזם מופשט · 13 ש'
- מבני נתונים וחבילות · 8 ש'
- Design Patterns · 28 ש'
- פרויקט סיכום הנחיות · 4 ש'
המקור: תוכנית הלימודים הרשמית של מה"ט (משרד העבודה).
פתרו את המבחן המלא — עם משוב על כל תשובה
כל שאלות המבחן, פתרון מפורט, משוב אישי ומעקב התקדמות. בדיוק מה שצריך כדי לעבור.
התחילו לתרגל — חינם ←