שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2024 - ממשקים
נתונה רשימה מקושרת בה כל חולייה מכילה data מטיפוס Integer והפנייה לחולייה הבאה. הניחו שקיים
יש לממש comparator אשר מקבל שתי רשימות כאילו ו- ועובד באופן הבא:
• אם סכום הערכים ב- גדול מסכום הערכים ב-, נחזיר ערך חיובי כלשהו
• אם סכום הערכים ב- קטן מסכום הערכים ב-, נחזיר ערך שלילי כלשהו
• אם סכום הערכים ב- שווה לסכום הערכים ב-, נחזיר 0
עידו, סטודנט בקורס תכנות מונחה עצמים, הציע שלושה מימושים עבור comparator זה.
מימוש 1:
מימוש 2:
מימוש 3:
בחרו בטענה הנכונה ביותר:
א. אף מימוש מתוך שלושה אינו מבצע את הנדרש
ב. רק מימוש יחיד מתוך שלושה הינו נכון
ג. רק שני מימושים מתוך שלושה הינם נכונים
ד. כל שלושת המימושים הינם נכונים
MyLinkedList class אשר מממש רשימה כזו.יש לממש comparator אשר מקבל שתי רשימות כאילו ו- ועובד באופן הבא:
• אם סכום הערכים ב- גדול מסכום הערכים ב-, נחזיר ערך חיובי כלשהו
• אם סכום הערכים ב- קטן מסכום הערכים ב-, נחזיר ערך שלילי כלשהו
• אם סכום הערכים ב- שווה לסכום הערכים ב-, נחזיר 0
עידו, סטודנט בקורס תכנות מונחה עצמים, הציע שלושה מימושים עבור comparator זה.
מימוש 1:
מימוש 2:
מימוש 3:
בחרו בטענה הנכונה ביותר:
א. אף מימוש מתוך שלושה אינו מבצע את הנדרש
ב. רק מימוש יחיד מתוך שלושה הינו נכון
ג. רק שני מימושים מתוך שלושה הינם נכונים
ד. כל שלושת המימושים הינם נכונים
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א · 2024 · סמסטר ב
★★★★★
ממשקיםגנריותמעקב אחר קודרשימות מקושרות
שימו לב להגדרת המחלקה ולממשק שהיא מממשת בכל אחד מהמימושים. האם הטיפוס הגנרי של הממשק Comparator תואם את הפרמטרים של מתודת compare?
בחינת שלושת המימושים:
מימוש 1:
מימוש 2:
מימוש 3:
סיכום:
מימושים 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.
לכן, ישנם שני מימושים נכונים מתוך השלושה.
התשובה הנכונה היא ג.