מה"ט מבני נתונים ותכנות מונחה עצמים — הנדסאי תוכנה — קיץ 2023 מועד א' (97105)
תאריך הבחינה: לא ידוע
טופס המבחן המלא להורדה — ומפתח התשובות עם פתרון מפורט לכל שאלה, אונליין. פתחו שאלה למטה: בשאלה סגורה בוחרים תשובה, בשאלה פתוחה נפתח הפתרון המלא (כניסה מהירה וחינם).
למגמת הנדסת תוכנה — מבנה נתונים ותכנות מונחה עצמים. נבחנים ב-Java או ב-C#, ובוחרים שפה בכניסה למבחן.
✓ פתרון מלא לכל שאלה · ✓ הסברים מלאים וחומרי לימוד · ✓ ליווי מורה AI · ✓ התחלה חינם
פתרון מפורט לכל שאלה — לא רק התשובה: הסבר שלב-אחר-שלב וניתוח הטעויות הנפוצות.
שאלות לדוגמה מהמבחן — פתרו עכשיו
בשאלה סגורה בוחרים תשובה; בשאלה פתוחה פותחים את הפתרון המלא (כניסה מהירה וחינם). אלו 3 מתוך 10 שאלות המבחן — את כולן תוכלו לפתור אונליין.
שתי פעולות עצמאיות על תור מספרים שלמים: putInPlace ממקמת מספר נתון כך שכל הקטנים ממנו לפניו וכל השווים/גדולים ממנו אחריו; moveToFront מעבירה את k האיברים האחרונים בתור אל ראשו. בשני הסעיפים פותרים אך ורק עם פעולות התור (insert/remove/head/isEmpty), בעזרת תורי עזר.
putInPlace: עבור q=[2,10,12,3,7,4,1] (ראש→סוף) ו-num=9, תוצאה אפשרית: [2,3,7,4,1,9,10,12], והפעולה מחזירה 6 (המיקום הסידורי של 9, החל מ-1).
q (ראש→סוף): 2,10,12,3,7,4,1 num=9
תוצאה אפשרית (ראש→סוף): 2,3,7,4,1,9,10,12 (הפעולה מחזירה 6)
moveToFront: עבור q=[7,2,5,4,6,8,10,12] (ראש→סוף) ו-k=5, מעבירים את 5 האיברים האחרונים (4,6,8,10,12) אל ראש התור: תוצאה [4,6,8,10,12,7,2,5].
q (ראש→סוף): 7,2,5,4,6,8,10,12 k=5
תוצאה (ראש→סוף): 4,6,8,10,12,7,2,5
כתבו פעולה בשם putInPlace המקבלת תור q ומספר num, וממקמת את המספר num במיקומו, כך שכל האיברים הקטנים ממנו נמצאים לפניו וכל האיברים השווים לו או הגדולים ממנו נמצאים אחריו (אין משמעות לסדר של האיברים הקטנים או הגדולים ממנו). הפעולה תחזיר את מיקומו הסידורי של num בתוך התור אחרי הכנסתו.
public static int putInPlace(Queue<Integer> q, int num)
כתבו פעולה חיצונית המקבלת תור q של מספרים שלמים ומספר שלם וחיובי k, ומעבירה את k האיברים האחרונים בתור אל ראש התור. אפשר להניח ש-k קטן מאורך התור.
public static void moveToFront(Queue<Integer> q, int k)
מהי הסיבוכיות של הפעולות שכתבתם בסעיפים א' ו-ב'? הסבירו את תשובתכם.
בעזרת המחלקה BinNode אפשר לממש שרשרת חוליות דו-כיוונית (getLeft = 'קודם', getRight = 'הבא'). מבקשים לסדר מחדש כך שהזוגיים יופיעו לפני האי-זוגיים, בלי מבנה נתונים נוסף ובלי לשנות את זהות החוליה הראשונה שהקורא מחזיק.
לפני הפעולה: chain -> 1 <-> 11 <-> 4 <-> 6 <-> 3 (null בשני הקצוות). אחרי הפעולה יכולה להיות: chain -> 6 <-> 4 <-> 11 <-> 1 <-> 3 (הזוגיים 6,4 בתחילת השרשרת, האי-זוגיים 11,1,3 בסופה; סדר האיברים בתוך כל קבוצה אינו חשוב).
לפני: null <- 1 <-> 11 <-> 4 <-> 6 <-> 3 -> null (chain מצביע על 1)
אחרי (יכולה להיות): null <- 6 <-> 4 <-> 11 <-> 1 <-> 3 -> null (chain מצביע על 6)
כתבו פעולה המקבלת הפנייה לחוליה הראשונה (הכי שמאלית) של שרשרת חוליות דו-כיוונית ומסדרת אותה כך שכל הערכים הזוגיים יהיו בתחילת השרשרת וכל הערכים האי-זוגיים יהיו בסופה. סדר האיברים לא חשוב. שימו לב: אין להשתמש במבנה נתונים נוסף.
public static void order(BinNode<Integer> chain)
מהי סיבוכיות הפעולה order שכתבתם בסעיף א'? הסבירו את תשובתכם.
Flower מחלקת-על עם תכונה מוגנת height ותכונה פרטית price; Rose יורשת ממנה, מוסיפה color פרטית ופעולת validHeight. שלושה סעיפים: זיהוי היגדי ירושה נכונים/שגויים, בדיקת תקינות שורות קוד (קומפילציה/ריצה), וכתיבת פעולת מיון-סוגים.
public class Flower {
protected int height;
private int price;
public Flower(int val) { this.height = val; this.price = 10; }
public int getHeight() { return this.height; }
public int getPrice() { return this.price; }
}
public class Rose extends Flower {
private String color;
public Rose(int val, String col) {
super(val);
this.color = col;
}
public boolean validHeight() {
return this.height > 10 && this.height < 30;
}
}
לפניכם חמישה היגדים. קבעו לכל אחד מהם אם הוא נכון או אינו נכון, ונמקו את קביעתכם:
- המחלקה Flower יורשת את הפעולה validHeight()/ValidHeight() מהמחלקה Rose.
- המחלקה Rose יורשת את כל התכונות ואת כל הפעולות של המחלקה Flower.
- המחלקה Rose יכולה לגשת ישירות לתכונה height של המחלקה Flower.
- המחלקה Flower יכולה לגשת לתכונה color של המחלקה Rose.
- לעצמים מטיפוס Rose אין תכונה price.
לפניכם קטע קוד מהתוכנית הראשית: Flower first = new Rose(20, "RED"); Flower second = new Flower(93); בעבור כל אחת מההוראות שלפניכם קבעו אם היא תקינה או אינה תקינה. אם היא אינה תקינה, נמקו את קביעתכם וכתבו אם זו שגיאת ריצה או שגיאת הידור (קומפילציה):
- boolean b = first.validHeight();
- boolean b = second.validHeight();
- boolean b = ((Rose)first).validHeight();
- boolean b = ((Rose)second).validHeight();
- boolean b = first.getPrice() == second.price;
כתבו פעולה המקבלת מערך עצמים מטיפוס Object. הפעולה תדפיס כמה עצמים הם מטיפוס Rose, כמה עצמים מטיפוס Flower ואינם מטיפוס Rose, וכמה עצמים הם לא מטיפוס Flower.
public static void countTypes(Object[] arr)
הנושאים הרשמיים בבחינה 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 ש'
המקור: תוכנית הלימודים הרשמית של מה"ט (משרד העבודה).
פתרו את המבחן המלא — עם משוב על כל תשובה
כל שאלות המבחן, פתרון מפורט, משוב אישי ומעקב התקדמות. בדיוק מה שצריך כדי לעבור.
התחילו לתרגל — חינם ←