תרגיל 10 – תוכנה 1 סמסטר ב' תשס"ז

יש לפתור את כל השאלות, את השאלות התיאורטיות יש לשים כהערות בקובץ ג'אווה ולצרף להגשה

 

1. שאלת המכוניות

המתכנתת אוּמָה כתבה זה עתה את המחלקה MyCar המציגה פרטים של מכוניות שונות. להלן המחלקה וכן דוגמא לשימוש במחלקה:

 

 

public class MyCar {

      

       public static final int LAMBORGHINI      = 2;

       public static final int SUSITA    = 4;

       public static final int RENAULT   = 5;

      

       private int type;

 

       public MyCar(int type) {

              this.type = type;

       }

      

       public String getManufacturerName(){

              switch (type) {

                     case LAMBORGHINI:

                           return "LAMBORGHINI";

                     case RENAULT:

                           return "RENAULT";

                     case SUSITA:

                           return "SUSITA";

              }

              return "Manufacturer Unknown";

       }

      

       public int getNumOfDoors(){

              switch (type) {

                     case LAMBORGHINI:

                           return LAMBORGHINI;

                     case RENAULT:

                           return RENAULT;

                     case SUSITA:

                           return SUSITA;

              }

              return -1;

       }

}

 

דוגמא לשימוש במחלקה:

 

public class MyCarDemo {

 

       public static void main(String[] args) {

              MyCar bimba = new MyCar(MyCar.LAMBORGHINI);

 

              System.out.println("bimba was manufactured by " +

bimba.getManufacturerName());

 

              System.out.println("bimba has " + bimba.getNumOfDoors() +

" door" + (bimba.getNumOfDoors() == 1 ? "" : "s"));

       }

}

 

 

 

השאלות הבאות מתייחסות למחלקה MyCar:

 

א.       

1)       צייני את הבעיה הגדולה ביותר לדעתך במחלקה. אם יש בעיות נוספות צייני גם אותן. מדוע לדעתך הקוד של אומה לוקה בבעיות שציינת?

 

2)       עזרי לאומה לשכתב את  המחלקה בעזרת ירושה בשני אופנים שונים כדי לפתור את הבעיות שציינת בסעיף הקודם. ממשי בקוד את כל רכיבי התוכנה.

 

                                                               i.      מימוש אחד צריך למזער את כמות הקוד

                                                             ii.      המימוש האחר צריך למזער את הזיכרון הדרוש למופעי המחלקה

ב.       

1)       צייני את הבעיה הגדולה ביותר העולה מפתרון הסעיף הקודם בעזרת ירושה. אם יש בעיות נוספות צייני גם אותן. מדוע ירושה במקרה זה גורמת לבעיות שציינת?

 

2)       עזרי לאומה לשכתב את  המחלקה ע"י שימוש במחלקה אחת בלבד (ללא ירושה) כדי לפתור את הבעיות שציינת בסעיף הקודם. ממשי בקוד את המחלקה במלואה.

 

ג.        שכתבי את  המחלקה ע"י הגדרתה כ enum.

ד.      (10 נקודות) האם קיימות נסיבות (כגון אילוצים על המחלקה, הקשרי שימוש, דרישות עיצוב של המערכת וכו') שבהן יש העדפה לאסטרטגיית מימוש מסוימת על פני אחרות (מבין 5 הגישות לעיל כפי שעולה מהמחלקה המקורית ו-4 החלופות)? דוני בקצרה במקרים השונים.

 


2. אוספים ממוינים

 

חשוב!! ניתן להוריד קבצי שלד כאן

 

ניתן לכם מנשק SortedSet המייצג אוסף של עצמים ממוינים ושונים אחד מן השני. מאחר והעצמים נשמרים בצורה ממוינת במימושים של מנשק זה, איטרטור על האוסף יחזיר אותם אחד-אחד בסדר עולה.

 

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

 

חשוב לשים לב כי כל ה-Sets שנתעסק איתם הינם בלתי ניתנים לשינוי, ז"א שהעצמים בתוכם נקבעים בעת היצירה. לא ניתן להוסיף/להוריד עצמים לאחר מכן מן האוספים. תכונה זו תאפשר לכם לשמור תוצאות של חישובים ארוכים יחסית (ערך מקס', ערך מינ', גודל) ולא לחשב אותם כל פעם מחדש.

 

שימו לב לאיטרטור SortedIterator, הרחבה ריקה של Iterator שמסמלת כי האיטרטור מחזיר ערכים ממוינים.

 

א. CompositeSortedSet – בשלב זה תתכננו ותממשו מחלקה מופשטת. בשלבים הבאים נרחיב מחלקה זו.

 

מחלקה מופשטת זו הינה אוסף שהוא תוצר של שני אוספים ממוינים (כפי שתראו בהמשך, תוצר כגון איחוד או חיתוך). יש להכניס במחלקה זו את כל הקוד המשותף שניתן. השירותים אותם יש לייצג במחלקה זו הינם:

·        size()

·        isEmpty()

·        getMinimum()

·        getMaximum()

 

ב. המחלקה MergedSortedSet שנבנית באמצעות SortedSet A ו-SortedSet B מכילה רק עצמים בחיתוך של A ו-B (ז"א עצמים הנמצאים בשניהם). עבור מחלקה זו עליכם לממש:

·        בנאי

·        contains()

·        iterator()

 

יצירת איטרטור צריכה להראות כך:

/**

 * Returns an Iterator for the elements of this set.

*/

public SortedIterator iterator() {

          return new MergedSortedIterator(setA.iterator(), setB.iterator());

}

כמובן שתצטרכו לממש גם את MergedSortedIterator המרחיב את SortedIterator

 

ג. המחלקה DifferenceSortedSet שנבנית באמצעות SortedSet A ו-SortedSet B מכילה רק עצמים שנמצאים ב-A אך לא נמצאים ב-B. ממשו מחלקה זו (ואת האיטרטור המתאים לה) כמחלקה מרחיבה ל-CompositeSortedSet.

 

ד. המחלקה UnifiedSortedSet מכילה את כל העצמים מ-A ומ-B. ממשו אותה בדומה לסעיפים הקודמים.

 

 

הוראות הגשה:

  1. קראו בעיון את קובץ נוהלי הגשת התרגילים אשר נמצא באתר הקורס.
  2. הגשת התרגיל (כקובץ zip המכיל את קבצי ה-.java של התכניות שהתבקשת לכתוב) תעשה ע"י המערכת VirtualTAU (http://virtual.tau.ac.il) עד ליום חמישי 24.05.2007 בחצות. הוראות שימוש במערכת ישנם ב-http://virtual2002.tau.ac.il/upload/misc/main1.html
  3. כמו כן, יש לשים תדפיס של קבצי ה-.java בתא הדואר של בודק התרגילים עד יום ראשון 27.05.2007  בחצות.  יש לציין שם מלא ות"ז.