שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2024 - ממשקים
נתונה רשימה מקושרת בה כל חולייה מכילה data מטיפוס Integer והפנייה לחולייה הבאה. הניחו שקיים
יש לממש comparator אשר מקבל שתי רשימות כאילו ו- ועובד באופן הבא:
• אם סכום הערכים ב- גדול מסכום הערכים ב-, נחזיר ערך חיובי כלשהו
• אם סכום הערכים ב- קטן מסכום הערכים ב-, נחזיר ערך שלילי כלשהו
• אם סכום הערכים ב- שווה לסכום הערכים ב-, נחזיר 0
עידו, סטודנט בקורס תכנות מונחה עצמים, הציע שלושה מימושים עבור comparator זה.
מימוש 1:
מימוש 2:
מימוש 3:
בחרו בטענה הנכונה ביותר:
א. אף מימוש מתוך שלושה אינו מבצע את הנדרש
ב. רק מימוש יחיד מתוך שלושה הינו נכון
ג. רק שני מימושים מתוך שלושה הינם נכונים
ד. כל שלושת המימושים הינם נכונים
MyLinkedList class אשר מממש רשימה כזו.יש לממש comparator אשר מקבל שתי רשימות כאילו ו- ועובד באופן הבא:
• אם סכום הערכים ב- גדול מסכום הערכים ב-, נחזיר ערך חיובי כלשהו
• אם סכום הערכים ב- קטן מסכום הערכים ב-, נחזיר ערך שלילי כלשהו
• אם סכום הערכים ב- שווה לסכום הערכים ב-, נחזיר 0
עידו, סטודנט בקורס תכנות מונחה עצמים, הציע שלושה מימושים עבור comparator זה.
מימוש 1:
מימוש 2:
מימוש 3:
בחרו בטענה הנכונה ביותר:
א. אף מימוש מתוך שלושה אינו מבצע את הנדרש
ב. רק מימוש יחיד מתוך שלושה הינו נכון
ג. רק שני מימושים מתוך שלושה הינם נכונים
ד. כל שלושת המימושים הינם נכונים
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2024סמסטר ב
★★★★★
ממשקיםגנריותמעקב אחר קודרשימות מקושרות
שימו לב להגדרת המחלקה ולממשק שהיא מממשת בכל אחד מהמימושים. האם הטיפוס הגנרי של הממשק Comparator תואם את הפרמטרים של מתודת compare?
בחינת שלושת המימושים:
מימוש 1:
- המימוש מגדיר מחלקה
- חתימת המתודה
- המתודה
- בהנחה שהקוד
מימוש 2:
- המימוש מגדיר מחלקה המממשת את הממשק `Comparator<Integer>`. זוהי שגיאה. המטרה היא להשוות בין רשימות (
- הממשק
- המחלקה הנתונה מממשת מתודה עם חתימה אחרת:
- כתוצאה מכך, הקוד לא יתקמפל מכיוון שהמחלקה
מימוש 3:
- בדומה למימוש 1, מימוש זה מממש את הממשק הנכון `Comparator<MyLinkedList>` עם חתימת מתודה
- המתודה
- בהנחה שהקוד
סיכום:
מימושים 1 ו-3 נכונים מבחינה לוגית ומבנית (תחת ההנחה לגבי הפסאודו-קוד), בעוד מימוש 2 שגוי בשל שימוש בטיפוס גנרי לא נכון בממשק ה-Comparator.
לכן, ישנם שני מימושים נכונים מתוך השלושה.
התשובה הנכונה היא ג.
מימוש 1:
- המימוש מגדיר מחלקה
MyComparator אשר מממשת את הממשק `Comparator<MyLinkedList>`. זהו הטיפוס הגנרי הנכון, שכן אנו רוצים להשוות בין שני אובייקטים מסוג MyLinkedList.- חתימת המתודה
compare(MyLinkedList L1, MyLinkedList L2) תואמת את הנדרש מהממשק.- המתודה
sum מחשבת נכונה את סכום איברי הרשימה. למרות שהקוד משנה את הפרמטר L שקיבלה, ב-Java פרמטרים מטיפוס אובייקט מועברים by value (ערך ההפניה מועתק), ולכן שינוי ההפניה L בתוך המתודה sum אינו משפיע על המשתנים L1 ו-L2 במתודה compare.- בהנחה שהקוד
while(L) הוא פסאודו-קוד תקין עבור while(L != null), מימוש זה הוא נכון.מימוש 2:
- המימוש מגדיר מחלקה המממשת את הממשק `Comparator<Integer>`. זוהי שגיאה. המטרה היא להשוות בין רשימות (
MyLinkedList), לא בין מספרים שלמים (Integer).- הממשק
Comparator<Integer> מחייב מימוש של מתודה עם החתימה int compare(Integer o1, Integer o2).- המחלקה הנתונה מממשת מתודה עם חתימה אחרת:
int compare(MyLinkedList L1, MyLinkedList L2).- כתוצאה מכך, הקוד לא יתקמפל מכיוון שהמחלקה
MyComparator אינה מממשת את המתודה המופשטת הנדרשת מהממשק Comparator<Integer>. לכן, מימוש זה אינו נכון.מימוש 3:
- בדומה למימוש 1, מימוש זה מממש את הממשק הנכון `Comparator<MyLinkedList>` עם חתימת מתודה
compare נכונה.- המתודה
sum מחשבת נכונה את סכום האיברים. מימוש זה אף כתוב בסגנון טוב יותר ממימוש 1, בכך שהוא משתמש במשתנה עזר מקומי (curr) כדי לעבור על הרשימה, מבלי לשנות את ההפניה המקורית שהתקבלה כפרמטר.- בהנחה שהקוד
while(curr) הוא פסאודו-קוד תקין, מימוש זה הוא נכון.סיכום:
מימושים 1 ו-3 נכונים מבחינה לוגית ומבנית (תחת ההנחה לגבי הפסאודו-קוד), בעוד מימוש 2 שגוי בשל שימוש בטיפוס גנרי לא נכון בממשק ה-Comparator.
לכן, ישנם שני מימושים נכונים מתוך השלושה.
התשובה הנכונה היא ג.