divicidivici·איזיפס·פשוט להצליח

מה"ט מבני נתונים ותכנות מונחה עצמים — הנדסאי תוכנה — קיץ 2023 מועד ב' (97105)

תאריך הבחינה: לא ידוע

טופס המבחן המלא להורדה — ומפתח התשובות עם פתרון מפורט לכל שאלה, אונליין. פתחו שאלה למטה: בשאלה סגורה בוחרים תשובה, בשאלה פתוחה נפתח הפתרון המלא (כניסה מהירה וחינם).

פתרו את המבחן אונליין — בשפה שלכם:JavaC#

למגמת הנדסת תוכנה — מבנה נתונים ותכנות מונחה עצמים. נבחנים ב-Java או ב-C#, ובוחרים שפה בכניסה למבחן.

✓ פתרון מלא לכל שאלה · ✓ הסברים מלאים וחומרי לימוד · ✓ ליווי מורה AI · ✓ התחלה חינם

פתרון מפורט לכל שאלה — לא רק התשובה: הסבר שלב-אחר-שלב וניתוח הטעויות הנפוצות.

שאלות לדוגמה מהמבחן — פתרו עכשיו

בשאלה סגורה בוחרים תשובה; בשאלה פתוחה פותחים את הפתרון המלא (כניסה מהירה וחינם). אלו 3 מתוך 10 שאלות המבחן — את כולן תוכלו לפתור אונליין.

שאלה 1

שני מספרים שלמים וחיוביים 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)

סעיף ג

מהי הסיבוכיות של הפעולות שכתבתם בסעיפים א' ו-ב'? הסבירו את תשובתכם.

שאלה 2

כתבו פעולה המקבלת הפניה לחוליה הראשונה של שרשרת חוליות של מספרים שלמים, ומפצלת אותה לשתי שרשראות לפי זוגיות הערך הראשון: כל מה שתואם את זוגיות הראש נשאר ב-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 שכתבתם בסעיף א'? הסבירו את תשובתכם.

שאלה 3

סעיף א' עוסק בכתיבת בנאים למחלקות 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(); לפניכם שמונה קטעי קוד. עבור כל אחד מהסעיפים יש לציין אם הקוד תקין או לא. אם הקוד אינו תקין — יש להסביר למה הוא אינו תקין ולציין את סוג השגיאה (שגיאת קומפילציה/הידור או שגיאת זמן ריצה).

  1. Circle c0 = new Shape();
  2. Circle c1 = s1;
  3. Circle c2 = (Circle)s2;
  4. Circle c3 = (Circle)s3;
  5. Circle c4 = (Circle) s1;
  6. Triangle t = new Triangle(); Shape s5 = t; Circle c5 = (Circle)s5;
  7. Shape s = (Circle)(new Cylinder());
  8. Circle c = (Shape)(new Cylinder());

הנושאים הרשמיים בבחינה 97105

לפי תוכנית הלימודים הרשמית של מה"ט (מבנה נתונים ותכנות מונחה עצמים) — אלו הנושאים שהבחינה נשענת עליהם:

המקור: תוכנית הלימודים הרשמית של מה"ט (משרד העבודה).

פתרו את המבחן המלא — עם משוב על כל תשובה

כל שאלות המבחן, פתרון מפורט, משוב אישי ומעקב התקדמות. בדיוק מה שצריך כדי לעבור.

התחילו לתרגל — חינם ←