דילוג לתוכן הראשי

חוף 19.12 ה' ShapesProjectPro

בכיתה
התרגיל ShapesProjectPro
    חלק א'
    א. יצירת הפרויקט
        צרו פרויקט בשם ShapesProjectPro.
    ב. הוסיפו המחלקות הבאות
       1) Point
       2) Shape
       3) Rectangle
       4) Circle
       5) Line 
    ג. מחלקת Point
       1) תכונות
           תכיל x, y מטיפוס int עבור הקואורדינטות של הנקודות על ציר המספרים.
       2) בנאים
           * בנאי שלא מקבל פרמטרים ובנאי שמקבל שני שלמים.
           * הבנאי שלא מקבל פרמטרים יאתחל ערך התכונות ל- 0.
       3) Set/Get
           על 2 תכונות הנקודה.
       4) פעולות
           ToString.
    ד. מחלקת Shape
       1) תכונות
           תכונה אחת בשם p1 מטיפוס Point.
           הערה: שימו לב שמחלקת Shape לא יורשת את מחלקת Point, אלא מכילה
                     תכונה מטיפוס Point.
                     כדי שהפרויקט שלכם יכיר את מחלקת Point, התבקשתם ליצור אותה בפרויקט.
       2) בנאים
           בנאי אחד, יאתחל את הנקודה p1 להיות בעלת הערכים (0, 0).
       3) פעולות
           הוסיפו פעולה בשם ()GetKingName המחזירה את שם מלך אנגליה ג'ורג'.
    ה. מחלקת Rectangle: יורשת מ- Shape
        1) תכונות
            * p2 מטיפוס נקודה.
               (הערה נכונה של עודד: אין חובה לשבץ תכונה זו במח' מלבן, כיוון שבבנאי ניתן
                 לאחזר את x ואת y של הנקודה / הנקודות שהתקבלו כפרמטר/ים).

            * length מטיפוס ממשי.
            * width מטיפוס ממשי.
        2) בנאים
             * בנאי המקבל נקודה, אורך ורוחב.
             * בנאי המקבל שתי נקודות.
        3) Get/Set
            * עבור כל תכונות המחלקה.
        4) פעולות
            * ToString
               הפעולה תחזיר מחרוזת הכוללת את פרטי המידע הבאים:
               * אם המלבן נוצר באמצעות הבנאי הראשון, המחרוזת תכיל את פרטי נקודת האמצע,
                  את האורך ואת הרוחב.
               * אם המלבן נוצא באמצעות הבנאי השני, המחרוזת תכיל את פרטי שתי הנקודות.
    ו. מחלקת Circle: יורשת מ- Shape
       1) תכונות
           * נקודה.
           * רדיוס, ממשי.
       2) בנאים
           * בנאי אחד, מקבל נקודה ורדיוס.
       3) Get/Set
           עבור כל תכונות המחלקה.
       4) פעולות
           ToString.
    ז. מחלקת Line: יורשת מ- Shape
       1) תכונות
           * תכיל תכונה מטיפוס Point.
           * תכיל תכונת אורך, ממשי.
       2) בנאים
           * בנאי אחד: מקבל שתי נקודות.
       3) Set/Get
           Get עבור כל תכונות המחלקה.
           Set עבור כל אחת משתי הנקודות, אך לא לאורך הקו (כי הוא נגזר משתי הנקודות).
       4) פעולות עזר
           GetLineLength תחזיר את אורך הקו, בהתבסס על שתי הנקודות אשר ביניהן הוא נמתח.
           GetMiddlePoint תחזיר את נקודת האמצע של הקו.
           הערה: פעולות עזר אלו נועדו עבור השגת נתונים ש- ToString אמורה להשיג.
                     פעולות אלו אינן מהוות ממשק עבור המשתמש, ולכן נעדיף לתת להן את
                     הרשאת הגישה private.
       5) פעולות
           ToString תחזיר את נקודות האמצע של הקו ואת אורכו.
    חלק ב' - Interface
    א. צרו ממשק בשם IMath המכיל את כותרות הפעולות שלהלן:
        * ()double GetArea             פעולה זו מחזירה את שטח הצורה.
        * ()double GetPerimeter    פעולה זו מחזירה את היקף הצורה.
    ב. על המחלקות Circle ו- Rectangle בלבד, לממש את הממשק IMath.
    חלק ג' - Program
    א. צרו נקודה בשם myPoint באמצעות מחלקת Point, שערכיה הם (10, 10).
    ב. צרו מלבן בשם r שערכיו הם הנקודה myPoint, האורך 400 והרוחב 300.
        שרטטו מה קורה בזיכרונות StackMemory ו- HeapMemory לאחר פקודה זו.
    ג. צרו מלבן בשם r2 שערכיו הם הנקודה myPoint, האורך 400 והרוחב 301.
        שרטטו מה קורה בזיכרונות StackMemory ו- HeapMemory לאחר פקודה זו.
    ד. הדפיסו את r ו- r2.
    ה. הדפיסו את תוצאת ההשוואה בין r ל- r2 השתמשו בפעולה Equale הנמצאת במחלקת Object.
        1) הסבירו מדוע זאת התוצאה?
        2) הסבירו מה עושה הפעולה Equals הנמצאת במחלקת Object?
    ו. בצעו השמה של r2 לתוך r.
    ז. הדפיסו את תוצאת ההשוואה בין r ל- r2 השתמשו בפעולה Equale הנמצאת במחלקת Object.
    ח. הדפיסו את האורך של המלבן r.
    ט. צרו עיגול עיגול בשם c1 שנקודת האמצע שלו נמצאת ב- myPoint וברדיוס 5.
    י. צרו ייחוס בשם s1 מטיפוס Shape המפנה ל- c1.
       הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
    יא. 1) צרו ייחוס בשם i1 מטיפוס IMath המפנה ל- r.
             הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
         2) שמרו ב- s1 את הערך r.
             הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
         3) צרו ייחוס בשם i2 מטיפוס IMath ובצעו בתוכו השמה של IMath חדש, ככתוב להלן:
IMath i2 = new IMath;
             הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
    יב. צרו ייחוס בשם i3 מטיפוס IMath  המפנה למלבן חדש שנקודת המרכז שלו היא myPoint,
         אורכו 40 ורוחבו 30.
         הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.        
    יג. הדפיסו את שטחו של i3.
         הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
    יד. הדפיסו את i3.
         הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
    טו. זמנו את הפעולה GetKingName על אובייקט המלבן r.
         הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
    טז. זמנו את הפעולה GetKingName על i3.
         הסבירו האם שורת קוד זו חוקית או לא. אם לא, הסבירו מדוע.
    יז. כתבו פעולה חיצונית סטטית המקבלת שני מלבנים ומחזירה תשובה בוליאנית האם הם שווים.
        שני מלבנים נחשבים שווים אם אורכם שווה (אין משמעות לרוחב של כל אחד מהם).
        חתימת הפעולה:
public static bool Equals (Rectangle r1, Rectangle r2) { ... }
   יח. צרו קו בשם l1 מטיפוס Line ושלחו אליו כפרמטר את הנקודות (0, 0) ו- (10, 10).
        הדפיסו את l1. האם התוצאות נכונות?

לבית
שלטו בתרגיל ShapesProjectsPro לקראת בוחן לאחר חנוכה.
אין שיעורי בית נוספים, מה שאומר שמצופה מכם לשלוט בתרגיל ובכל רציונל הנמצא בו.
לאחר חנוכה - בוחן
נושאי הבוחן (הפרויקט העיקרי שישמש כבסיס הבוחן: ShapesProjectPro)
נר 1. השוואה בין אובייקטים.
נר 2. השוואה בין משתנים פרימיטיביים.
נר 3. מצב האובייקט (ערכי כל התכונות זהים בין שני אובייקטים שונים שנוצרו מאותו טיפוס).
נר 4. כמיסות (Encapsulation)       - תכונות המחלקה נגישות רק מתוך המחלקה, כמו כל אלמנט private.
נר 5. הורשה (Inharitance)            - מחלקה יורשת מקבלת את כל חברי המחלקה שירשה, כולל תכונות ופעולות.
נר 6. פולימורפיזם (Polymrphism) - ייחוס ממחלקת על יכול להפנות לאובייקטים ממחלקות יורשות, ובכל זאת
                                                 לבצע זימון לפעולה הנכונה, זו הכתובה במחלקה היורשת.
נר 7. ממשק (Interface)                 - הגדרת הפונקציונליות שחובה על המחלקה לממש. הממשק לא מכיל תכונות.
                                                  הממשק יכול להכיל חתימות של פעולות, ללא אלגוריתם וללא הרשאת-גישה.
נר 8. ההכנה הטובה ביותר לבוחן: סיום כל המטלות שניתנו בנושא AnimalsZoo ו- ShapesProjectPro.
שאלות לדוגמה (מבוססות בעיקרן על הפרויקט ShapesProjectPro שנוצר בהתאם להנחיות שבתחילת הדף)
נר א. יצירת אובייקט מלבן חדש בשם r שנקודת האמצע שלו היא (0, 0), האורך 400 והרוחב 300.
נר ב. יצירת אובייקט מלבן חדש בשם rr שנקודת האמצע שלו היא (0, 0), האורך 400 והרוחב 300.
נר ג. השוואה בין שני האובייקטים r ו- rr באמצעות הפעולה Equals בגרסתה כפי שנמצאת במחלקת Object.
    יוחזר true או false? מדוע?
נר ד. המשך הקוד: השמת הערך של rr ב- r.
נר ה. השוואה בין שני האובייקטים r ו- rr באמצעות הפעולה Equals בגרסתה כפי שנמצאת במחלקת Object.
    יוחזר true או false? מדוע?
נר ו. יצירת מלבן שלישי בשם rrr שנקודת האמצע שלו היא (0, 0), האורך 400 והרוחב 300.
    בצעו השמה של הייחוס rrr לתוך הייחוס rr.
    1) מה קרה ל- rr המקורי?
    2) מי יטפל בו?
    3) מה סוג הטיפול?
נר ז. צרו שני אובייקטים חדשים, כל אחד מהם מטיפוס מלבן.
   שמותיהם: r10 ו- r20. ערכי התכונות שלהם זהים.
    1) האם מדובר למעשה באובייקט אחד בלבד הנמצא כרגע בזיכרון ה- Heap?
    2) האם מדובר למעשה בשני אובייקטים ב- Heap, כאשר המצב שלהם זהה?
    הגדרת 'מצב זהה': 
    שני אובייקטים שונים, שנוצרו מאותו טיפוס, והערכים בכל אחת מתכונותיהם הם ערכים זהים.
נר ח. הגדירו מלבן חדש בשם r100, תזכורת: מחלקת מלבן מממשת ממשק בשם IMath.
        1) האם ניתן לזמן מ- r100 את הפעולה GetArea (שהוגדרה בממשק IMath) ?
        2) האם ניתן לזמן מ- r100 את הפעולה GetKingName (שהוגדרה במחלקת Shape) ?
        3) האם ניתן לזמן מ- r100 את הפעולה GetLength (שהוגדרה במחלקת Rectangle) ?
        צרו ייחוס חדש בשם i100, מטיפוס IMath, המפנה ל- r100.
        1) האם i100 יכול לזמן את הפעולה GetPerimeter (שהוגדרה בממשק IMath) ?
        2) האם i100 יכול לזמן את הפעולה GetKingName ?
        3) האם i100 יכול לזמן את הפעולה GetLength ?
שמש. האם ניתן ליצור ייחוס חדש בשם i200 המפנה לאובייקט חדש מטיפוס IMath?
    נמקו.
חג שמח!