מבחן סיכום לקורס " עקרונות תכנות מונחה עצמים " תאריך הבחינה: 23.07.2017 4 שמות המרצים: ד"ר עזאם מרעי שם הקורס: עקרונות תכנות מונחה עצמים מספר הקורס: 202-15181 שנה: 2017 סמסטר: ב' מועד: ב' משך הבחינה: שלוש שעות חומר עזר: אסור הנחיות כלליות: ההוראות במבחן מנוסחות בלשון זכר, אך מכוונות לנבחנים ולנבחנות כאחד. נא לוודא כי בשאלון זה 12 עמודים. יש לענות על כל השאלות בגוף המבחן בלבד. אין לחרוג מהמקום המוקצה )במקרים חריגים יש לבקש אישור ממרצה\מתרגל(. מומלץ להשתמש במחברת הבחינה כטיוטא. בשאלות רב-ברירה )"אמריקאיות"( יש לסמן תשובה אחת, אלא אם צוין אחרת בגוף השאלה. בשאלות רב-ברירה בהן לא נידרש לנמק, ניתן לסמן תשובה ללא נימוק, אך ניתן גם לספק נימוק קצר, אם רצונכם בכך )חובה לתת נימוק רק בשאלות בהן זה מצוין מפורשות בשאלה(. במידה ואין ניקוד על הסעיפים, כל סעיף מקבל מספר שווה של נקודות )הניקוד לכל השאלה מחולק למספר הסעיפים(. הקוד כתוב בשפת,Java פרט לשאלות בהן מצוין אחרת. אם אינך יודע את התשובה, ניתן לכתוב "לא יודע" ולקבל 20% מהניקוד על הסעיף\השאלה. )1 )2 )3 )4 )5 )6 )7 )8
שאלה ]5 1 נק'[ זוג מחלקות בית עסק, מסעדה רכב, מנוע לקוח, לקוח עסקי הזמנה, מוצר מחשב, מעבד קשר הרכבה / היררכיה הרכבה / היררכיה הרכבה / היררכיה הרכבה / היררכיה הרכבה / היררכיה שאלה ]12 2 נק'[ בשאלה זו אתם מתבקשים להשלים תרשים מחלקות Diagram( )Class עבור הסיפור הבא שמתאר מערכת עבור אוניברסיטה. אוניברסיטה מורכבת מכמה פקולטות המורכבות ממחלקות שונות. כל פקולטה מנוהלת על ידי דיקן שהוא סגל אקדמי. כל מחלקה מנוהלת על ידי עובד אוניברסיטה שהוא גם סגל אקדמי. כל מחלקה יש שלושה עובדים לפחות, שהם גם עובדי אדמיניסטרציה. ויש לפחות שלושה מרצים. כל פקולטה יש ארבעה עובדים לפחות. 2
שאלה ]6 3 נק'[ הגדר כל אחד מן המושגים הבאים שקשורים לדריסה.Overriding ציין והסבר איזה מושג קשור לבנאי constructor א. החלפה Replacement ב. עידון Refinement שאלה ]10 4 נק'[ public class Desert { public void eat(){ Person.eat(new Cake()); Person.eat(new Chocolate()); Object ob = new Desert(); Person.eat(ob); public class Cake extends Desert { נתון הקוד הבא public class Chocolate extends Desert { public class Person { public static void eat(cake cake){ System.out.println("eating cake"); public static void eat(chocolate chocolate){ System.out.println("eating chocolate"); public static void eat(desert desert){ System.out.println("eating desert"); public static void eat(object obj){ Cake cake = new Cake(); eat(cake); System.out.println("Enjoy:"); ((Desert) obj).eat(); לכל אחת משורות הקוד הבאות, כתבו מה יודפס. אם קיימת שגיאה, רשמו איזה סוג שגיאה זו: קומפילציה או ריצה והסבירו את השגיאה )אין קשר בין הסעיפים( 1. Desert desert = new Cake(); Person.eat(desert); 3
2. Chocolate chocolate = new Chocolate(); Person.eat(chocolate); 3. Object ob = new Cake(); Person.eat(ob); 4. Cake cake = null; Person.eat(cake); 5. Person.eat(null); public class Person { public class Student extends Person { public class UnderGraduate extends Student{ שאלה ]9 5 נק'[ נתון המחלקות הבאות עיין בקוד הבא וענה על השאלות 1 UnderGraduate[] ustdgroup = new UnderGraduate[10]; 2 Student[] studentgroup = ustdgroup; 3 Student pr = new Student(); 4 if ( A ) 5 pr=new UnderGraduate(); 6 studentgroup[3]=pr; 4
א. אם תנאי A חוקי, האם הקוד יעבור קומפילציה? אם כן הסבר מדוע )התייחס לשורות 5 ו- 6 (, אחרת תקן את הקוד שיעבור קומפילציה ב. נניח שהקוד עובר קומפילציה או תוקן. השלם את התנאי A, כך שתגרם שגיאת זמן ריצה בשורה האחרונה. הסבר את השגיאה ג. נתונה הפונקציה הבאה, ושורת ההרצה אחריה public static void swapstudents(person[] array){ if (array.length > 1){ Person temp = array[0]; array[0] = array[1]; array[1] = temp; swapstudents(ustdgroup); האם תגרם שגיאת קומפילציה, שגיאת זמן ריצה. הסבר את תשובתך שאלה ]10 6 נק'[ עיין בקוד הבא ב- ++C, וחמשת שורות ההרצה שבאות אחריו class Base { public: int x; virtual void foo(){ cout<<"i am in Base"<<"\n"; cout<<x<<"\n";; virtual void goo(int z){ 5
cout<<"i am in Base"<<"\n"; int x=z; cout<<x+z<<"\n";; ; class Derived : public Base { public: int x; virtual void foo(){ cout<<"i am in Derived"<<"\n"; cout<<x*2<<"\n"; virtual void goo(){ cout<<"i am in Base"<<"\n"; int x=3*x; cout<<x<<"\n";; ; 1 Derived d; 2 d.x=12; 3 Base b; 4 b.x=1; 5 b= d; א. לכל אחת משורות הקוד הבאות, כתוב מה יודפס. אם קיימת שגיאה, רשום איזה סוג שגיאה זו: קומפילציה או ריצה, והסבר. )אין קשר בין הסעיפים( cout<<b.y; ב. cout<<b.x; 6
ג. b.foo(); ד. Base * b1 = & b; b1->foo(); ה. Derived * d1 = & d; d1->goo(1); שאלה ]5 7 נק'[ עבור כל סעיף ציין נכון או לא נכון קוראת כאשר החתימה של המתודה בתת המחלקה שונה מן החתימה של מחלקת הצללה Shadowing א. העל לא נכון \ נכון כדי שדריסה תתבצע צריך שהחתימה במחלקת העל ותת המחלקה תהיה אותו דבר. זה נכון בכל שפת ב. לא נכון \ נכון תכנות אי אפשר לתרגם תכנית מ ++C ל,Java שכן ב ++C יש הורשה מרובה. בעוד ב Java אין ג. לא נכון \ נכון כאשר יש redefinition לפונקציה, ++C ו Java יכולות להתנהג באופן שונה ד. לא נכון \ נכון אין יתרון למנשק על מחלקה אבסטרקטית ה. לא נכון \ נכון 7
שאלה ]5 8 נק'[ בהינתן התרשים למטה. כיצד הכנסת פונקציה totalarticleprice() למחלקה OrderLine תשפר את התכנון? א. ב. ג. ד. מגדיל את הצימוד )coupling( של המחלקה article מקטין את הצימוד )coupling( של המחלקה order מקטין את הצימוד )coupling( של המחלקה article מגדיל את הצימוד )coupling( של המחלקה OrderLine שאלה ]6 9 נק'[ רינה התחילה לתכנת בשפת התכנות.ProgLang היא הבינה ששפה זו לא דורשת הצמדת טיפוס למשתנה בזמן ההגדרה. היא כתבה את הקוד הבא: procedure foo(x) if x=1 then 1 else 1+ a ; הקוד התקמפל. אחר כך היא הריצה את שורות הקוד עם התוצאות הבאות < foo(1) 1 > foo(2) Error: contract violation expected: number? given: a רינה התחילה לתכנת בשפת התכנות.ML היא הבינה שגם שפה זו לא דורשת הצמדת טיפוס למשתנה בזמן ההגדרה. היא כתבה את הקוד הבא: val goo = fn(x)=> if x=1 then 1 else 1+"a"; Error: operator and operand don't agree: הקוד לא התקמפל, והודעת השגיאה הבאה התקבלה expected: number? given: a הסבר את ההבדל בין שתי השפות תוך התייחסות לדוגמאות 8
שאלה ]12 10 נק'[. במשחק מחשב יש שלושה סוגי חיות משק: פרה, סוס ותרנגולת. כל חיה עושה פעילות מסויימת באזור פעולה מסוים: במשק: התרנגולת מלקטת פירורים, הפרה אוכלת והסוס צוהל 1. בשדה: התרנגולת מטילה ביצים, הפרה משחקת והסוס רוקד 2. התרנגולת מקרקרת, הפרה גועה, והסוס צוהל בעיר: 3. ]9 נק'[ בנו תרשים מחלקות הכולל )לפחות( שמונה מחלקות: מחלקה,FarmAnimals מחלקה,Area מחלקה לכל סוג חיית משק ומחלקה לכל אזור פעולה. הימנעו משימוש ב- instanseof והשתמשו בPattern.Visitor א. 9
]3 נק'[ הצהר על השיטה startactivity שממוקמת במחלקה FarmAnimals או Area ומקבלת כפרמטר אובייקט של המחלקה השנייה ומתחילה את הפעילות. כתוב את המימוש שלה בבלון חיצוני )רק שורה אחת(. הסביר מי Visitor ומי,Visited ומה הרציונל בבחירה זו ב. שאלה ]5 11 נק'[ הוחלט לממש את המשחק שבשאלה 9 ב Java בעזרת הממשק הגרפי.Swing להלן קטע קוד מהתוכנית הנ"ל: public class Cow extends JButton{... public class Game { public void addcowtoframe(jframe frame){ 1 Cow cow= new Cow(); 2 frame.getcontentpane().add(cow); 3 cow.addactionlistener(this); 4 frame.setvisible(true); 5 frame.pack(); public void actionperformed(actionevent e) { //Do something special... הסבירו בקצרה מדוע הקוד אינו מתקמפל, ובאיזו שורה מבין השורות 1-5 השגיאה מתרחשת. :) C++ ב- class A : private B { שאלה ]5 12 נק'[ מהי הורשה פרטית ב ++C, ( למשל: ירושה שלא תומכת בכלל ההחלפה. א. ירושה שמאפשרת להחליט לגבי כל מתודה האם היא תעבור בירושה או לא. ב. מנגנון שמאפשר לשלוט על כמות המופעים של מחלקת הבסיס שעוברות בירושה במצב של ירושה מרובה ג. ירושה שגורמת לשיטות הציבוריות וגם ה protected של מחלקת העל להיות שיטות פרטיות בתת המחלקה. כלומר ד. השיטות של מחלקת העל לא הופכות להיות חלק מן הממשק הציבורי של תת המחלקה. 10
שאלה ]12 13 נק'[ א. ]8 נק'[: השלימו את החלקים החסרים בקטע הקוד הבא כך שקטע הקוד יעבור קומפילציה, וציינו מה יודפס אחרי הרצת הקוד, )יש 7 חלקים חסרים, כל אחד מהם שווה נקודה(: ]1 נק'[ לאחר השלמת החלקים החסרים והרצת הקוד הפלט יהיה: class SomeClass<T> { Collection<T> _elements; public SomeClass() { _elements = new Vector<T>(); public void add(collection< > c){ // q1 for ( e : c) _elements.add(e); // q2 public void add( e){ _elements.add(e); // q3 public void copytocollection(collection< > c){ // q4 for ( e : _elements) c.add(e); // q5 public class Shape{ /*... */ public class Rectangle extends Shape{ /*... */ public class Circle extends Shape{ /*... */ public class ClassA { public static void main(string[] args) { SomeClass<Shape> classofshapes = new SomeClass<Shape>(); SomeClass<Rectangle> classofrectangles = new SomeClass<Rectangle>(); Rectangle r = new Rectangle(); classofrectangles.add(r); Collection<Rectangle> rectangles = new Vector<Rectangle>(); classofrectangles.copytocollection(rectangles); classofshapes.add(rectangles); Vector<? Shape> shapes = new Vector<Shape>(); classofrectangles.copytocollection(shapes); // q6 e = shapes.get(0); // q7 System.out.println(e.getClass().getName()); // the dynamic class of 'e' /*חלק ב מתחיל בו */ 11
]4 נק'[: לכל שורות הקוד הבאות, הקיפו בעיגול האם השורות תקינות, יוצרות שגיאת קומפילציה או שגיאה בזמן ריצה. השורות הנ ל נמצאות בתוך המחלקה : ClassA ב. Vector <? extends Shape> v1 = new Vector<? extends Shape>();.1 1[ נק'[ נוצרת שגיאת קומפילציה. 2. נוצרת שגיאה בזמן ריצה. 3. השורות תקינות..1.2 1[ נק'[ Vector <? super Shape> v2 = (vector<shape>) new Vector<circle>(); v2.add(new Rectangle()); נוצרת שגיאת קומפילציה. 2. נוצרת שגיאה בזמן ריצה. 3. השורות תקינות..1 Vector <? super Shape> v3 = new Vector<Shape>(); Collection<? super Circle> v4 = (Vector<Object>) v3;.3 2[ נק'[ נוצרת שגיאת קומפילציה. נוצרת שגיאה בזמן ריצה. 3. השורות תקינות..2.1 בהצלחה!! 12