שאלת מבחן בתכנות מונחה עצמים - אוניברסיטת בר-אילן 2024 - static

נתון קטע קוד הבא.



סמנו את כל התשובות הנכונות.


א. קריאה ל- printA תדפיס תמיד את מספר האובייקטים מסוג A class שהגדרנו עד כה בתוכנית שלנו
ב. קריאה ל- printA תדפיס תמיד את מספר האובייקטים מסוג A class שהגדרנו עד כה בתוכנית שלנו, פחות מספר הקריאות שהרצנו את הפונקציה f() עד כה בתוכנית שלנו

ג. לא ניתן לדעת מה תדפיס printA בתוכנית שלנו, אך בכל מקרה היא תדפיס מספר אי שלילי

ד. לא ניתן לדעת מה תדפיס printA בתוכנית שלנו


נמקו את כל התשובות סימנתםן.
העתק שאלה
שתף שאלה
סמן כחשוב
סמן כבוצע
אוניברסיטת בר-אילןמועד א2024סמסטר א
staticמעקב אחר קודמחלקותאובייקטיםקונסטרוקטור
שימו לב שהמשתנה counter הוא static ולכן משותף לכל האובייקטים. בנוסף, בחנו היטב את התנאי בתוך המתודה f והבינו מתי ערכו של counter יורד ומתי לא.
התשובה הנכונה היא ג'.

נימוק לבחירה בג':
החלק הראשון של הטענה, "לא ניתן לדעת מה תדפיס printA", נכון מכיוון שערכו של המשתנה counter תלוי לחלוטין ברצף הפעולות שיתבצעו בתוכנית המשתמשת במחלקה A. מספר האובייקטים שייווצרו (קריאות לבנאי) ומספר הקריאות למתודה f() ישפיעו על ערכו הסופי.

החלק השני של הטענה, "בכל מקרה היא תדפיס מספר אי שלילי", נכון גם הוא. ננתח את השינויים בערך של counter:

1. אתחול: המשתנה counter הוא `static`, כלומר משותף לכל האובייקטים מהמחלקה, והוא מאותחל לערך 0.

2. הגדלה: הבנאי A() מגדיל את counter ב-1 בכל פעם שנוצר אובייקט חדש.

3. הקטנה: המתודה f() מקטינה את counter ב-1 רק אם מתקיים התנאי counter > 0.

התנאי הזה מבטיח שערכו של counter לעולם לא ירד מתחת ל-0. במקרה הגרוע ביותר, הוא יגיע ל-0 וכל קריאה נוספת ל-f() לא תשפיע עליו. לכן, הערך שיודפס יהיה תמיד מספר שלם אי-שלילי (
).

נימוק לשלילת שאר התשובות:
* א' אינה נכונה: טענה זו מתעלמת מהאפשרות לקרוא למתודה f(), אשר מקטינה את counter. לדוגמה, אם ניצור שני אובייקטים (new A(); new A();) ואז נפעיל את f() פעם אחת, counter יהיה 1, בעוד שמספר האובייקטים שנוצרו הוא 2.

* ב' אינה נכונה: טענה זו מתעלמת מהתנאי במתודה f(). לדוגמה, אם ניצור אובייקט אחד (new A();) ואז נקרא ל-f() פעמיים. מספר האובייקטים הוא 1, ומספר הקריאות ל-f הוא 2. לפי הטענה, התוצאה צריכה להיות
. בפועל, הקריאה הראשונה ל-f תקטין את counter ל-0, והקריאה השנייה לא תשנה אותו כלל כי התנאי counter > 0 לא יתקיים. לכן יודפס 0.
* ד' אינה נכונה (או פחות מדויקת): למרות שנכון שלא ניתן לדעת את הערך המדויק, אנחנו כן יכולים לדעת תכונה חשובה של הערך – שהוא אי-שלילי. תשובה ג' מספקת את המידע המלא והמדויק ביותר.