Microsoft Word a_moed_a_solution.doc

מסמכים קשורים
אוניברסיטת בן גוריון בנגב תאריך המבחן: שקולניק אלכסנדר שם המרצה: מר בשפת JAVA מבוא לתכנות מבחן ב: מס' הקורס : הנדסת תעשיה וניהול מ

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

מבוא למדעי המחשב

Slide 1

Slide 1

PowerPoint Presentation

סדנת תכנות ב C/C++

מבוא לתכנות ב- JAVA תרגול 11

מבוא למדעי המחשב

מהוא לתכנות ב- JAVA מעבדה 3

מבוא למדעי המחשב

Slide 1

PowerPoint Presentation

מבוא למדעי המחשב

מבוא למדעי המחשב

PowerPoint Presentation

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

מספר זהות: סמסטר ב' מועד א' תאריך: 11102/4// שעה: 9:22 משך הבחינה: 3 שעות חומר עזר: אין מותר השימוש במחשבון פשוט בחינה בקורס: מבני נתונים מרצה: הדר בי

מבוא לתכנות ב- JAVA תרגול 7

תרגול 1

PowerPoint Presentation

מבוא למדעי המחשב

פתרון מוצע לבחינת מה"ט ב_שפת c מועד ב אביב תשע"ט, אפריל 2019 מחברת: גב' זהבה לביא, מכללת אורט רחובות שאלה מספר 1 מוגדרת מחרוזת המורכבת מהספרות 0 עד 9.

Slide 1

מבחן 7002 פרטים כלליים מועד הבחינה: בכל זמן מספר השאלון: 1 משך הבחינה: 3 שעות חומר עזר בשימוש: הכל )ספרים ומחברות( המלצות: קרא המלצות לפני הבחינה ובדי

Slide 1

שאלהIgal : מערכים דו מימדיים רקורסיה:

מבוא למדעי המחשב - חובלים

מבחן סוף סמסטר מועד ב 28/10/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, גדי אלכסנדרוביץ הוראות: א. בטופס המבחן 6 עמודים (כולל דף זה) ו

Microsoft Word - c_SimA_MoedB2005.doc

מבחן סוף סמסטר מועד א 15/02/08 מרצה אחראית: דר שירלי הלוי גינסברג מתרגלים: גלעד קותיאל, דניאל גנקין הוראות: א. בטופס המבחן 7 עמודים ו 4 דפי נוסחאות. ב

PowerPoint Presentation

תוכן העניינים

תרגול 1

PowerPoint Presentation

Slide 1

הגשה תוך שבוע בשעת התרגול

Microsoft Word B

מס' סידורי: ת.ז.: עמוד 1 מתוך 20 בחינה בתוכנה 1 סמסטר ב', מועד א',תשס"ט 5/7/2009 וולף, ליאור ליאור שפירא, נעמה מאיר, מתי שמרת הוראות )נא לקרוא!( משך ה

לנץ קרן מרצה: תכנותמונחהעצמים) ( יוםשישי 15 אוקטובר 0202 ב מועד 0202, אביב סמסטר סמסטר סוף מבחן גוטמן אייל רביב, אריאל משנה, אלון מתרגלים: הנחי

תרגול 1

שאלהIgal : מערכים דו מימדיים רקורסיה:

תוכן העניינים

Microsoft Word - pitaron222Java_2007.doc

תורת הקומפילציה

Microsoft PowerPoint - rec3.ppt

תרגול מס' 4: המתרגם שימוש במחלקות קיימות מחרוזות, קבצים, וקבלת קלט מהמשתמש

פקולטה: מחלקה: שם הקורס: קוד הקורס: מדעי הטבע מדעי המחשב ומתמטיקה מתמטיקה בדידה תאריך בחינה: _ 07/07/2015 משך הבחינה: 3 שעות סמ' _ב' מועד

יוםראשון, 02 ליולי 2014 סמסטר סוף מבחן )236703( עצמים מונחה תכנות - א' מועד 2014, אביב סמסטר קמחי יחיאל ד"ר מרצה: מסינג מיטל עבדאלקאדר, כרם גלעד, ערן

תכנון אלגוריתמים עבודת בית 4: תכנון אלגוריתמים תאריך הגשה: 02: , בצהריים,תא מספר 66 בקומת כניסה של בניין 003 מתרגל אחראי: אורי 0

מבוא למדעי המחשב - חובלים

מבוא למדעי המחשב

מבחן בפיתוח מערכות תוכנה בשפת Java ( )

תרגול 3 - מערכים

PowerPoint Presentation

1 תוכנה 1 תרגיל מספר 7 מנשקים Interfaces הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגשת התרגיל תעשה במערכת ה- moodle ב

איטרטורים: 1 תוכנה 1 סתיו תשע"ג תרגיל מספר 9 הנחיות כלליות: קראו בעיון את קובץ נהלי הגשת התרגילים אשר נמצא באתר הקורס. הגשת התרגיל תעשה במערכת ה moodl

PowerPoint Presentation

מספר מחברת: עמוד 1 מתוך 11 ת"ז: תשע"א מועד ב סמסטר א' תאריך: 00:11 שעה: 0 שעות הבחינה: משך כל חומר עזר אסור בשימוש בחינה בקורס: מבוא למדעי ה

Microsoft Word - Ass1Bgu2019b_java docx

PowerPoint Presentation

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

אוניברסיטת חיפה החוג למדעי המחשב.5.6 מבוא למדעי המחשב סמסטר א' תשע"ז בחינה סופית מועד א', מרצה: שולי וינטנר מתרגלים: סמאח אידריס, ראמי עילבו

עוצמת ההורשה מה הופך את ההורשה לכלי כל כך עוצמתי? מעבר לכך שהוא מקל בהגדרת מחלקות חדשות על סמך מחלקות קיימות, יש לנו אפשרות להתייחס לאובייקט מסויים בכ

Microsoft PowerPoint - rec1.ppt

Microsoft PowerPoint - lec10.ppt

שבוע 4 סינטקס של HACK ASSEMBLY ניתן להשתמש בשלושה אוגרים בלבד:,A,D,M כולם בעלי 16 ביטים. M אינו אוגר ישיר- הוא מסמן את האוגר של ה RAM שאנחנו מצביעים ע

תכנות מונחה עצמים א' – תש"ע

מצגת של PowerPoint

Microsoft Word - ExamA_Final_Solution.docx

פתרון 2000 א. טבלת מעקב אחר ביצוע האלגוריתם הנתון עבור הערכים : פלט num = 37, sif = 7 r האם ספרת האחדות של sif שווה ל- num num 37 sif 7 שורה (1)-(2) (

תרגול 1

אוניברסיטת חיפה החוג למדעי המחשב מרצה: שולי וינטנר מתרגלים: נעמה טוויטו, מחמוד שריף מבוא למדעי המחשב סמסטר א' תשע"ב בחינת סיום, מועד א', הנחי

משימה תכנית המתרגמת קטעי טקסט לשפה אחרת הקלט: קובץ המכיל את קטעי הטקסט וכן את השפה אליה רוצים לתרגם תרגול מס' 4: המתרגם שימוש במחלקות קיימות תכנות מתק

שיעור 1

תוכנה 1 בשפת Java שיעור מספר 3: "חתיכת טיפוס"

תשובות מלאות לבחינת הבגרות במתמטיקה מועד ג' תשע"ד, מיום 0/8/0610 שאלונים: 313, מוצע על ידי בית הספר לבגרות ולפסיכומטרי של אבירם פלדמן שאלה מספר

Slide 1

rizufim answers

תוכנה 1 תרגול מספר 12: GUI כתיבת מחלקות גנריות בית הספר למדעי המחשב אוניברסיטת תל אביב 1

Microsoft Word - tutorial Dynamic Programming _Jun_-05.doc

עבודת בית מספר 5: מבני נתונים מבוא למדעי המחשב, סמסטר א' תשע"ט מבוא למדעי המחשב סמסטר א' תשע"ט צוות העבודה: מרצה אחראי: יוחאי טוויטו מתרגלים אחראים: א

Homework Dry 3

Tutorial 11

תוכן העניינים: פרק צמצומים ומימושים של פונקציות בוליאניות... 2 צמצומים של פונקציות באמצעות מפת קרנו:...2 שאלות:... 2 תשובות סופיות:... 4 צמצום

מקביליות

מבוא למדעי המחשב, סמסטר א', תשס"ח תרגול מס' 2

הגשה תוך שבוע בשעת התרגול

1

תרגול מס' 1

Microsoft PowerPoint - 10_threads.ppt

Data Structure Assignment no.3 תאריך הגשה: p.m. 11/09/16, 23:59 את העבודה יש להגיש בזוגות במערכת ההגשות.submission system על העבודה להיות מוגשות כקובץ

Microsoft PowerPoint - lec2.ppt

PowerPoint Presentation

Microsoft Word - solutions.doc

תמליל:

עמוד 1 מתוך 18 פתרון הבחינה בתוכנה 1 אוהד ברזילי, סיון טולדו, מיכל עוזרי-פלאטו, ליאור שפירא מועד א' סמסטר א' תשס"ז, 11 בפברואר 2007 משך הבחינה שלוש שעות. יש לענות על כל השאלות. בשאלות שבהן יש צורך לנמק, תשובה ללא נימוק לא תזכה באף נקודה. יש לענות על כל השאלות בגוף הבחינה במקום המיועד לכך. המקום המיועד מספיק לתשובות מלאות. יש לצרף את טופס המבחן למחברת הבחינה. מחברת ללא טופס עזר תפסל. תשובות במחברת הבחינה לא תיבדקנה. יש למלא מספר סידורי (מספר מחברת) ומספר ת"ז על כל דף של טופס הבחינה. אסור השימוש בחומר עזר כלשהו, כולל מחשבונים או כל מכשיר אחר פרט לעט. בהצלחה! לשימוש הבודקים 2 6 5 3 2 1 1 20 5 5 5 ד ג ב א 5 2 28 ו ה ד ג ב א 3 28 ו ה ד ג ב א סה"כ 100

עמוד 2 מתוך 18 שאלה 1 להלן הקוד של מחלקה D (במידת הצורך קיימת פקודת import מתאימה למחלקה B). public class D{ public static void main (String[] args){ new B(); בכל חלק של שאלה זו, יש להסביר האם הקוד של שלושת המחלקות B A, ו- D מתקמפל או שהקומפיילר מדווח על שגיאה. אם לדעתך הקוד לא מתקמפל, יש להסביר מדוע. אם לדעתך הקוד מתקמפל, תאר/י מה קורה שמחלקה D מורצת. 1. public abstract class A{ private int[] arr = {1,2,3; protected A(){ f(arr); protected abstract void f(int[] arr); public class B extends A{ public B(){ System.out.println("B"); public void f(int[] kuki){ System.out.println(); System.out.println(kuki[3]); יזרק חריג בזמן ריצה ArrayIndexOutOfBoundsException in System.out.println(kuki[3]); 2. package aaa; class A{ package bbb; import aaa.a; public class B extends A{ public B(){ System.out.println("B"); שגיאת קומפילציה: aaa.a is not visible to bbb.b

עמוד 3 מתוך 18 3. public class A{ public final String s = "1"; public A() { System.out.println(g()+s); public static String g(){ return "A"; public class B extends A{ public String s= "2"; public static String g(){ return "B"; A1 (static methods and variables depend on static type). public class B{ private int i; private class BB{ private void f(){ System.out.println(i); public B(){ (new BB()).f(); 0 (full visibility between a class and its nested class, default initialization of fields) 5. public class A{ public A(){ f( 1 ); public void f(integer i){system.out.println("a"+i/2); public class B extends A{ public void f(int i){ System.out.println("B"+i/2); A0 (overloading, "/" operator returns an integer) 6. public class A{ private String s = "1"; public String f(a a){ a.s ="2"; a = new A(); return a.s; public String tostring(){return s; public class B{ public B(){ final A a = new A(); System.out.println(a.f(a)+a); 12 (arguments are passed by value, reference arguments)

עמוד מתוך 18 שאלה 2 בשאלה הזו יש לענות על הסעיפים מילולית, לא לספק קוד. א. בהינתן קוד SWT המצורף, מה צריך להוסיף כדי שיתבצע קטע קוד בכל פעם שהמשתמש ילחץ על הפקודה בתפריט? MenuItem newitem = new MenuItem(fileMenu,SWT.PUSH); newitem.settext("new &Address Book\tCtrl+N"); יש צורך לקרוא ל- addselectionlistener ולהעביר לו מופע של מחלקה אנונימית המממשת את.SelectionListener הקוד בשירות widgetselected יתבצע בכל פעם שבוחרים את התפריט. ב. המטלה האחרונה בתרגיל 'עולם פראי' הייתה להחליף קבצי חיות עם תלמיד אחר. אילו קבצים הייתם צריכים לקחת מן התלמיד האחר כדי להיות מסוגלים להשתמש בחיות שלו ואילו שינויים בקוד שלכם נדרשו? קבצי ה- Class של מחלקות Animal ו- Species היו דרושות בכדי להחליף חיות בין הסטודנטים. השינוי היחיד שהיה אמור להידרש בקוד היה יצירת מופע ה- Species. כל השאר לא היה אמור להשתנות. public interface IIPAddress { public String tostring(); public boolean equals(iipaddress ip); public short getoctet(int index); public boolean isprivatenetwork(); public void mask(iipaddress mask); ג. בתרגיל 5 מימשתם את המנשק IIPAddress במספר צורות (עם מחרוזות, מערך של,short ו- int ). עליכם להגדיר מחלקת אב מופשטת משותפת לכל המימושים. אילו מן השירותים הבאים (שבתיבה משמאל) ניתן לממש במחלקה המשותפת כדי למנוע שכפול קוד? נמקו. במחלקה המופשטת המשותפת ניתן להשתמש בשירות getoctet כדי לממש את.isPrivateNetowrk,equals,toString את getoctet עצמו יש לממש בכל מימוש מוחשי של המנשק, בהתאם למימוש. מאחר והפקודה mask הינה פקודה המשנה את כתובת ה- IP, גם אותה יש לממש בכל מימוש מוחשי. על התשובה שבעזרת tostring ניתן לממש את שאר השאילתות הורדה נקודה ד. בתרגיל 9 היה עליכם לממש את המנשק,SortedSet אוסף של עצמים ממוינים ושונים אחד מן השני. בהינתן מימוש פשוט SimpleSortedSet תארו כיצד עובד האיטרטור של MergedSortedSet (המכיל את החיתוך של שני אוספים A ו- B אותם הוא מקבל בבנאי). בהינתן שני איטרטורים של סטים ממוינים נבצע את האלגוריתם הבא: בתחילה שני האיטרטורים מצביעים לתחילת הרשימות הממוינות של A ו- B. בכל קריאה ל- next נחפש את האבר הבא המשותף (ז"א נבדוק אם האבר הבא ב- A ו- B זהה, אם לא נקדם את הקטן מביניהם ונשווה שוב, נחזור על כך עד שנמצא אבר משותף).

עמוד 5 מתוך 18 תשובה שבה לכל איבר בקבוצה A מחפשים אם הוא קיים בקבוצה, Bלא קיבלה ניקוד כלל, משום שאלגוריתם הבניה הזה אינו משתמש כלל בתכונות האיטרטורים או מיון האברים. תשובה שבה בונים רשימה חדשה ממוינת של החיתוך ומחזירים איטרטור פשוט שלה קיבלה ניקוד חלקי רק אם בנית הרשימה החדשה השתמשה באלגוריתם המיזוג לעיל.

עמוד 6 מתוך 18 שאלה 3 בחבילה מסויימת נתונה המחלקה Point שמייצגת נקודות במישור. // Abstract state: a point in the plane public class Point { public Point(double x, double y) {... public double getx() {... public double gety() {... כמו כן נתון מנשק Mesh שמייצג חלוקה של תחום במישור למשולשים, בדומה לחלוקה שבאיור. המשולשים של Mesh יכולים לשתף קודקודים וצלעות, אבל אסור לשני משולשים לכסות שטח משותף. // Abstract state: a set of triangles T1, T2,...,Tn // such that no point belongs to the interior of two // triangles Public interface Mesh { // return the number of triangles in the mesh public int size(); // returns a 3-element array of points that are // the nodes of triangle Ti public Point[] get(int i); א. הגדר/הגדירי מימוש של המנשק הזה. המימוש חייב להשתמש במחלקה פנימית פרטית Triangle שמייצגת משולש בודד. פרט לכך, המימוש חייב להיות פשוט ככל האפשר. יש להגדיר את השדות, ואת השירותים size ו- get, אבל אין צורך להגדיר בנאים או שירותים אחרים. public class SimpleMesh Implements Mesh { private static class Triangle { private Point[] nodes; private Triangle(Point[] nodes) { this.nodes = nodes; private List<Triangle> triangles = new List<triangle>;... // constructors public int size() { return triangle.size(); public Point[] get(int i) { return triangles.get(i).nodes;

עמוד 7 מתוך 18 ב. מהי פונקצית ההפשטה function) (abstraction של המחלקה שלך? התשובה צריכה להיות פורמאלית, לא תיאור מילולי. AF: SimpleMesh (T1, T2,..., Tn) AF(this) = (triangles.get(1), triangles.get(2),..., triangles.get(triangles.size()-1)) where AF: Triangle (P1, P2, P3) AF(this) = (nodes[0], nodes[1], nodes[2]) where AF: Point <x,y> AF(this) = < getx(), gety() > ג. נתון מנשק שמגדיר איטרטור של משולשים. הגדר/הגדירי שירות שמחזיר איטרטור כזה עבור המחלקה שהגדרת בסעיפים הקודמים. בתשובה הזו מותר להגדיר קוד אך ורק בתוך השירות החדש. public interface TriangleIterator () // returns the next triangle in a set of triangles, or // null if there are no more triangles. public Point[] next(); public class SimpleMesh... {... public TriangleIterator triangleiterator { return new TriangleIterator() { private int i = 0; public Point[] next() { if (i==triangles.size()) return null; return triangles.get(i++).nodes; ; ד. נניח שהשירות triangleiterator מוגדר במנשק.Mesh ממש מחלקה ששירות מחלקה שלה מחשב את השטח שמכוסה על ידי.Mesh מותר להגדיר במחלקה הזו שירות עזר שיחשב את השטח של משולש נתון, אבל אין צורך לקודד את הנוסחה לחישוב שטח משולש (כלומר את/ה יכול/ה לממש את גוף שירות העזר כ-";."return public class MeshAreaCalculator { private static trianglearea(triangle) { return...; public static double area(mesh m) { double a = 0; TriangleIterator i = m.triangleiterator(); for (Point[] triangle = i.next(); triangle!= null; triangle = i.next())

עמוד 8 מתוך 18 a += trianglearea(triangle); return a;

עמוד 9 מתוך 18 ה. הוכח/הוכיחי שהשירות שהגדרת בסעיף הקודם נכון. ציין/צייני בבירור את ההנחות שעליהן ההוכחה מסתמכת. הוכחה: המשתנה triangle מקבל את כל הערכים האפשריים שהאיטרטור מחזיר עד שהוא מחזיר.null כמו כן, איננו משנים את ה- Mesh במהלך השימוש באיטרטור, מה שמבטיח שהאיטרטור פועל נכון. (אנו משתמשים כאן בהנחה שהאיטרטור מחזיר את כל המשולשים ב- Mesh ואז null אם לא משנים את ה- Mesh מרגע שהאיטרטור נוצר ועד שמפסיקים להשתמש בו). מכיון שהפנים של המשולשים זר, השטח של כל ה- Mesh הוא סכום השטחים של המשולשים, והמשתנה a אכן מכיל בסוף השגרה את סכום השטחים הללו. אנו גם מניחים כמובן ששגרת העזר מחשבת שטח משולש בצורה נכונה. ו. כעת אנו מעוניינים לממש את Mesh בצורה יעילה וחסכונית בזיכרון ככל האפשר. במחלקה הבאה הגדרנו את השדות. תאר/י פונקציית הפשטה function) (abstraction שממפה את השדות הללו למצב המופשט של.Mesh יש גם להשלים את ההכרזה של המחלקה. בסעיף הבא תתבקש/י להגדיר את השירותים של המחלקה הזו. לסעיף הזה יש יותר מפתרון אחד אפשרי. public class EfficientMesh Implements Mesh { private double[] a ; private int[] b ;... פונקציית ההפשטה היא: AF: EfficientMesh (T1, T2,, Tn) AF(this) = ( [<a[b[0]], a[b[0]+1]>, // one point (X and Y coordinates) <a[b[1]], a[b[1]+1]>, <a[b[2]], a[b[2]+1]> // first triangle T1 ends here, [<a[b[3]], a[b[3]+1]>, <a[b[]], a[b[]+1]>, <a[b[5]], a[b[5]+1]> // T2 ends here... [<a[b[3n-3]], a[b[3n-3]+1]>, <a[b[3n-2]], a[b[3n-2]+1]>, <a[b[3n-1]], a[b[3n-1]+1]> // Tn ends here ) b.length == 3*n אפשר גם לשמור את הקודקודים של כל משולש בשישיית מספרים עוקבים ב- a ולא להשתמש ב- b בכלל. זה גורם לשכפול קודקודים ב- a. ז. הגדר/הגדירי את השירותים size ו- get עבור המחלקה מהסעיף הקודם. הגדרת השירותים צריכה להתאים לפונקציית ההפשטה שנתת. public class EfficientMesh implements Mesh { private double[] a ; private int[] b ; public int size() { return b.length / 3;

עמוד 10 מתוך 18 public Point[] get(int i) { Point[] nodes = new Point[3]; nodes[0] = new Point(a[b[3*i]], a[b[3*i]+1]); nodes[1] = new Point(a[b[3*i+1]], a[b[3*i+1]+1]); nodes[2] = new Point(a[b[3*i+2]], a[b[3*i+2]+1]); return nodes;

עמוד 11 מתוך 18 שאלה נתונים המנשקים הבאים המתארים קורס וסטודנט במערכת מרשם קורסים: public interface Course { public int units(); public int level(); public int numofstudents(); public int maxnumstudents(); מספר נקודות (שעות) (שלם בין 1 ל 5) רמת הקורס (שלם בין 1 ל ( 3 מספר הסטודנטים הרשומים כרגע לקורס המספר המירבי המותר של סטודנטים רשומים לקורס public boolean registered(student s); s החזר true אם ורק אם הסטודנט רשום לקורס. public void register(student s); רשום את הסטודנט s לקורס. הפעולה חוקית רק אם s לא רשום לקורס, והקורס לא מלא public void drop(student s); בטל את הרישום של s לקורס. הפעולה חוקית רק אם s רשום לקורס public interface Student { public void register(course c); הרשם לקורס. c הפעולה חוקית אם הסטודנט לא רשום לקורס, c הקורס לא מלא, ומספר הנקודות הכולל של הסטודנט לאחר הרישום יהיה לכל היותר 10. public void drop(course c); בטל את הרישום לקורס. c הפעולה חוקית אם הסטודנט רשום לקורס. c public int totalunits(); public String name(); מספר הנקודות הכולל של הקורסים שהסטודנט רשום להם שם הסטודנט

עמוד 12 מתוך 18 להלן דוגמת שימוש במנשקים: Course c1 = new... ; // a course of 3 units, and max number of students 0 Course c2 = new... ; // a course with units, and max number of students 0 Student s1 = new... ; Student s2 = new... ; System.out.println(s1.totalUnits()); s1.register(c1); s2.register(c1); s1.register(c2); System.out.println(s1.totalUnits()); s1.drop(c1); System.out.println(s1.totalUnits()); הפלט של סדרת הפעולות יהיה: 0 7 המנשקים האלה וכל שאר המחלקות והמנשקים בשאלה הזו הם חלק מהחבילה.com.university.studentsהחבילה אינה מכילה מנשקים וחבילות אחרים פרט לאלה המוזכרים בשאלה (בפרט, שאר הקוד של מערכת המחשב של האוניברסיטה נמצא בחבילות אחרות). א. כתבו את החוזה של המנשק :Course לכל שרות כתבו תנאי קדם ( (preconditionותנאי אחר (postcondition) באופן המקובל (ביטויים בוליאניים שיכולים להשתמש בשאילתות). במידת הצורך, הוסיפו במילים תנאים שלא ניתנים לביטוי בצורה הרגילה. @post 1 $ret 5 public int units() @post 1 $ret 3 public int level() @post 0 $ret maxnumstudents() public int numofstudents()

עמוד 13 מתוך 18 @post 0 $ret public int maxnumstudents() הערה: אם צוין תנאי קדם s!=null אזי אסור לאף מימוש עתידי לבדוק תנאי זה public boolean registered(student s) @pre numstudents() < maxnumstudents() @pre!registered(s) @post registered(s) @post numofstudents() == $prev(numofstudents()) + 1 public void register(student s) @pre registered(s) @post!registered(s) @post numofstudents() == $prev(numofstudents()) - 1 public void drop(student s) ב. כתבו את החוזה של המנשק Student (ההנחיות זהות לסעיף הקודם). @pre!c.registered(this) @pre c.numstudents() < c.maxnumstudents() @pre totalunits() + c.units() 10 @post c.registered(this) @post totalunits() == $prev(totalunits()) + c.units() public void register(course c) @pre c.registered(this) @post!c.registered(this) @post $prev(c.registered(this)) $implies totalunits() == $prev(totalunits()) - c.units() @post $prev(c.registered(this)) $implies c.numstudents() < c.maxnumstudents() public void drop(course c) @post 0 $ret public int totalunits() public String name()

עמוד 1 מתוך 18 המחלקה SimpleCourse אמורה לממש את המנשק Course בצורה פשוטה, תוך שימוש במערך לייצוג הסטודנטים הרשומים לקורס. נתון חלק מהקוד כל השדות, הבנאי, ומימוש של שרות אחד. public class SimpleCourse implements Course { private int MaxNumStudents; private int top; private int units; private int level; private Student[] students; public SimpleCourse(int MaxNumStudents, int units, int level) { this.maxnumstudents = MaxNumStudents; students = new Student [MaxNumStudents]; this.units = units; this.level = level; top = -1; public void register(student s) { students[++top] = s; // more code omitted ג. הגדירו את משתמר הייצוג invariant) (representationשל המחלקהSimpleCourse 1 level == level() 3 1 units == units() 5 top+1 == numofstudents() maxnumofstudents() MaxNumStudents == maxnumofstudents() == students.length foreach 1=0..top : students[i]!= null השלימו את הקוד של המחלקהSimpleCourse. public int units() { return units; public int level(){ return level; public int numofstudents(){ return top+1 ; public int maxnumstudents(){ return maxnumstudents; public boolean registered(student s) { for (Student ss : students) if (ss == s) return true; return false;

עמוד 15 מתוך 18 public void drop(student s) { for (int i=0; i<top+1; i++) if (students[i] == s){ students[i] = students[top]; top--; return;

עמוד 16 מתוך 18 נתונה מחלקה SimpleStudent שמממשת את המנשקStudent בצורה פשוטה: public class SimpleStudent implements Student { private String name; private int totalunits = 0; public SimpleStudent(String name) { this.name = name; public void register(course c) { c.register(this); totalunits += c.units(); public void drop(course c) { c.drop(this); totalunits -= c.units(); public int totalunits() { return totalunits; public String name() { return name; ד. מפתחי התוכנה רוצים להקל על כותבי קוד הלקוח, ומציעים להגדיר מחלקה OtherStudent שתממש גם היא את המנשק Student אבל מותר יהיה לקרוא לפעולה drop גם אם הסטודנט לא רשום לקורס (ובמקרה זה השרות dropלא יגרום לכל שינוי). האם זה תקין מבחינת כללי תיכון בעזרת חוזה? יש לנמק בקיצור. תלוי בצורה שבה ניסחנו את תנאי האחר. השרות במחלקה המוצעת מחליש את תנאי הקדם וזה תקין. אם תנאי האחר נוסחו כך: @post!c.registered(this) @post totalunits() == $prev(totalunits()) - c.units() @post c.numstudents() < c.maxnumstudents() אזי השרות במחלקה המוצעת סותר את התנאים השני והשלישי וזה אינו תקין.

עמוד 17 מתוך 18 אולם, אם תנאי האחר נוסחו כך: @post!c.registered(this) @post $prev(c.registered(this)) $implies totalunits() == $prev(totalunits()) - c.units() @post $prev(c.registered(this)) $implies c.numstudents() < c.maxnumstudents() אזי הם ממשיכים להתקיים גם עבור המימוש החדש.

עמוד 18 מתוך 18 ה. ו. מוצע להגדיר מחלקה UndergraduateStudent שתייצג סטודנטים לתואר ראשון, תירש מהמחלקה,SimpleStudent ותוסיף את הדרישה שפעולת registerחוקית רק אם רמת הקורס (level) אליו הסטודנט נרשם קטנה מ.3 האם זה תקין מבחינת כללי תיכון בעזרת חוזה? יש לנמק בקיצור. לא. השרות במחלקה המוצעת מחזק את תנאי הקדם וזה אינו תקין. מהנדס התוכנה שגיא טוען שבמערכת שהוגדרה יש ליקוי חמור. לטענתו, אם קוד הלקוח מכיל קריאה כמוc.register(s) אוc.drop(s) כאשר הטיפוס הדינמי של c הואSimpleCourse ושל s הוא SimpleStudent בהתאמה, תתעורר בעיה. הסבירו מהי הבעיה, ואיך ניתן לפתור אותה. הפתרון יכול לכלול שינויים במנשקים ו/או במחלקות המממשות. אין צורך לכתוב קוד, אלא להסביר במילים את השינויים הנדרשים. הבעיה: פעולות ה register וה drop דורשות את עדכון מחלקת הסטודנט ועדכון מחלקת הקורס. שרותי ה register וה drop של המחלקה SimpleStudent כוללים גם את עדכון הקורס המתאים, אולם אם מתבצעת קריאה ישירות לשרותי register ו- drop של המחלקה SimpleCourse לא מובטח כי עצם הסטודנט המתאים יתעדכן (הדבר פוגע, למשל, בעדכון היחידות של הסטודנט). פתרונות אפשריים: א. הסתרת השרותים register ו drop של אחת מהמחלקות ע"י הסרתם מהמנשק ומתן נראות חבילה לשרותים במחלקה המתאימה. כך מובטח שרק שרותים מאותה החבילה יגשו אליהם, ונוכל לאכוף את עקביות העדכון בקורס. בשאלה צוין במפורש כי רק שתי המחלקות האלה נמצאות בחבילה com.university.students כך שנראות החבילה אינה פומבית מדי. ב. ג. ד. ניתן להסיר את השרותים משני המנשקים ולהוסיף מחלקה חדשה באותה חבילה עם שרותי מחלקה (סטטיים) מתאימים. אפשרות פחות טובה היא קינון המחלקות זו בזו (הפיכת אחת המחלקות למחלקה פנימית של האחרת). על אף שהדבר פותר את הבעיה, היחס בין המחלקות אינו יחס של מחלקה פנימית-חיצונית. בפרט לכל אחד מהעצמים של שתי המחלקות יש זכות קיום עצמאית ולא רק כמחלקת עזר של המחלקה האחרת. פתרון בעייתי נוסף הוא להוסיף קריאה בגוף השרותים register ו drop של המחלקה SimpleCourse לשרותים המתאימים של המחלקה.SimpleStudent הפתרון עלול ליצור לולאות אינסופיות. הסרת הקריאות מהמחלקה SimpleStudent תחזיר אותנו לבעיה דואלית לבעיה המקורית. ניתן לפתור את בעיית הלולאות ע"י הוספת דגלים (משתני עזר) שיאותחלו בראשית פעולת register ו drop בין אם של SimpleCourse ובין אם של.SimpleStudent ושוב, בהצלחה!