לצורך התרגילים במטלה זו (11y1 במערכת ההגשות) הנוכחי יש לצרף לפרוייקט שתפתחו את המחלקות הבאות:
- Bucket.cs - המחלקה דלי
- Point.cs - המחלקה נקודה
- Drawing.cs - מחלקת עזר לציור דליים, מערכת צירים ונקודות.
את המחלקות ניתן להוסיף ==באחת משתי הדרכים== הבאות:
- הוספת קבצי המחלקות לפרויקט
- יצירת מחלקה בשם הרצוי והעתקת תוכן המחלקה מהקובץ בקלאסרום
דרך 1: הורידו את הקישורים המצורפים והוסיפו לפרוייקט
לאחר ההורדה יש להוסיף אותם לפרוייקט באמצעות
- קליק ימני על הפרוייקט (עליכם להיות ב-solution explorer)
- ==Add ⟶ Existing item==
- בחירת 3 הקבצים (ניתן בבת אחת) מתיקיית הורדות
דרך 2: (לאלו המעדיפים ליצור את המחלקות)
- קליק על הפרוייטק (עליכם להיות ב-solution explorer)
- Ctrl + Shift + A (עם הזרת של יד שמאל), או מתפריט קליק ימני
Add ⟶ New item - כתיבת שם המחלקה (לדוגמא Bucket.cs)
המטלה ותיאור המחלקות
המחלקה דלי
להלן תיאור המחלקה דלי (Bucket).
| הגדרה | תיאור | |
|---|---|---|
| תכונות | string name | שם הדלי |
| int capacity | קיבולת (נפח) הדלי | |
| int currentAmount | כמות המים בדלי | |
| פעולה בונה | Bucket(int capacity, string name) | בונה דלי ריק ששמו name בקיבולת capacity |
| פעולות (מאחזרות) | int GetCapacity() | מוחזר הערך של התכונה capacity |
| int GetCurrentAmount() | מוחזר הערך של התכונה currentAmount | |
| פעולות נוספות | void Empty(int amountToRemove) | הפעולה מרוקנת את הקלט מהכמות הנוכחית בדלי. אם הקלט גדול מהכמות הנוכחית, הפעולה תרוקן את כל הדלי. הנחה: הקלט איננו שלילי. |
| void EmptyAll() | הפעולה מרוקנת את כל הדלי. | |
| bool IsEmpty() | מחזירה true אם הדלי ריק, false אחרת. | |
| void Fill(int amountToAdd) | הפעולה מוסיפה את הקלט לכמות הנוכחית בדלי. הפעולה לא תוסיף לדלי מעבר לקיבולת שלו. הנחה: הקלט איננו שלילי. | |
| void PourInto(Bucket bucketInto) | פעולה המעבירה את כמות המים המרבית האפשרית מהדלי הנוכחי לדלי ששמו bucketInto | |
| string ToString() | מחזירה מחרוזת ובתוכה תיאור מצבו הנוכחי של הדלי (שם, קיבולת וכמות) | |
| void Draw() | פעולה המציירת על המסך דלי עם התכולה הנוכחית |
תרגיל 1
כתבו פעולה שתיצור 2 דליים (first, second) בעלי קיבולת 100 כל אחד.
לאחר מכן, הפעולה תקלוט שלוש כמויות למילוי, ותמלא את first בכמות הגדולה ואת second בכמות הקטנה.
לסיום, הפעולה תציג את התכונות והערכים של הדליים.
תרגיל 2
כתבו פעולה שתבצע:
- תקלוט מהמשתמש קיבולת של דלי ותיצור דלי עם הקיבולת שנקלטה.
- תקלוט מהמשתמש כמות למילוי ותמלא את הדלי בכמות שנקלטה.
- תרוקן את הדלי “לאט לאט”. כל פעם תרוקן ליטר אחד ותציג את מצב הדלי (כלומר, לאחר ריקון של כל ליטר, הפעולה תציג את תכונות הדלי ואת ערכיהן).
התהליך ימשך עד שהדלי יהיה ריק לגמרי.
הקלידו, שמרו, הריצו ובדקו שהתקבל הפלט הרצוי.
תרגיל 3
כתבו פעולה שתבצע:
- תקלוט מהמשתמש קיבולת של דלי ותיצור דלי עם הקיבולת שנקלטה.
- תשאל את המשתמש האם ברצונו להוסיף כמות לדלי או להחסיר ממנה כמות.
- תקלוט מהמשתמש כמות למילוי או לריקון.
- תוסיף או תרוקן את הכמות מהדלי בהתאם לתשובת המשתמש בסעיף 2.
- תחזור על סעיפים 2-4 עד שהדלי יהיה ריק או שהכמות הנוכחית תהייה שווה לקיבולת של הדלי.
- תציג את המצב של הדלי.
הקלידו, שמרו, הריצו ובדקו שהתקבל הפלט הרצוי.
תרגיל 4
נתונים 3 דליים:
- דלי 1 בקיבולת 7 מלא
- דלי 2 בקיבולת 4 ריק
- דלי 3 בקיבולת 3 ריק
עליכם לכתוב תוכנית המשתמשת במחלקה Bucket ומעבירה מים בין הדליים (מרוקנת דלי וממלאה דלי באותה הכמות) כך שבסיום התכנית יהיו 2 דליים עם 2 ליטר ודלי אחד עם 3 ליטר.
תרגיל 5 – שוליית הקוסם
רקע
לרוע המזל, הצליח שוליית הקוסם להציף את חדר העבודה של הקוסם במים.
למרבה המזל, עומדים לרשותו של השולייה שני דליי קסם בהם יש להשתמש על פי החוקיות הבאה:
- הדלי הראשון, בכל פעם שהוא ריק לגמרי, יכול למלא את עצמו מהמים שבחדר.
- הדלי השני, אינו יכול לגרוף ישירות מים מהחדר, אולם הוא יכול להתמלא מהדלי הראשון, לצאת לחצר ולרוקן את עצמו.
מה עליכם לעשות
לכתוב תכנית שתפתור את בעייתו של שוליית הקוסם, תוך שימוש במחלקה דלי Bucket.
קליטת הנתונים ובניית העצמים
כדי לפתור את הבעיה יש לקלוט מספר נתונים:
- כמות המים ההתחלתית בחדר. את החדר מייצג דלי מהמחלקה Bucket שגם הקיבולת שלו וגם כמות המים בו היא כמות המים ההתחלתית שנקלטה. מומלץ לתת לדלי זה את השם roomB.
- קיבולת הדלי הראשון. ניתן לדלי זה שם משמעותי שיזכיר לנו שהוא יכול רק להתמלא אך לא לצאת מהחדר, למשל inB.
- קיבולת הדלי השני. זהו הדלי שיודע לצאת מהחדר ולהתרוקן, לכן גם לו ניתן משמעותי שיזכיר את תפקידו, למשל outB.
לאחר קליטת הנתונים מהמשתמש, יש ליצור את שלושת הדליים.
תזכורת: יצירת דלי חדש:
Bucket משתנה לדלי = new Bucket( קיבולת, שם הדלי)
לדוגמה:
Bucket roomB = new Bucket (25, “room”);
לאחר יצירת הדליים – כתבו את התוכנית שתרוקן את החדר (את הדלי roomB) בעזרת שני הדליים הנוספים. יש צורך להשתמש בלולאת while לצורך ריקון החדר.
יש להשתמש בפעולה PourInto המעבירה מים בין דליים.
המחלקה נקודה
תכונות המחלקה Point המייצגת נקודה במישור הם שני מספרים שלמים x, y המהווים את שיעורי הנקודה (הקואורדינטות) במישור. במחלקה קיימות הפעולות הבאות, ע”פ תיאורן:
| תיאור הפעולה | חתימת הפעולה |
|---|---|
| פעולה בונה היוצרת עצם מטיפוס Point עבור הנקודה (0,0) | public Point() |
| פעולה בונה היוצרת עצם מטיפוס Point, עבור הנקודה (x,y) | public Point(double x, double y) |
| קובעת את ערך ה-x של הנקודה להיות newX | public void SetX(double newX) |
| קובעת את ערך ה-y של הנקודה להיות newY | public void SetY(double newY) |
| אחזור ערך ה-x | public double GetX() |
| אחזור ערך ה-y | public double GetY() |
| מחזירה את מספר הרביע בו נמצאת הנקודה | public int Quadrant() |
| מחזירה את המרחק בין הנקודה הנוכחית לנקודה other | public double Distance(Point other) |
| מחזירה נקודה חדשה הנמצאת באמצע בין הנקודה הנוכחית לנקודה שהועברה כפרמטר. | public Point Middle(Point p) |
| מחזירה מחרוזת המייצגת נתוני הנקודה על פי הפורמט: (x,y) למשל 5,3)) | public string ToString () |
| פעולה המציירת את הנקודה במערכת צירים | public void Draw() |
תרגיל 6
כתבו בפעולה הראשית Main את הפקודות הבאות:
- בנו נקודה p1 בעלת הקואורדינטות (0,0)
- קילטו מהמשתמש ערכי הקואורדינטות (x ו-y) ולבנות נקודה בשם p2 בעלת הקואורדינטות שנקלטו.
- הדפיסו את שתי הנקודות ואת הרביע בו הן נמצאות.
- הדפיסו את המרחק בין שתי הנקודות.
- החליפו את ערך ה-x בין שתי הנקודות ואז הדפיסו אותן שוב.
- הניחו שהנקודות מציינות שתי פינות נגדיות של מלבן שצלעותיו מקבילות לצירים, חשבו והדפיסו את אורך הצלעות, היקף ושטח המלבן.
תוספות רשות לשאלה 1
רשות: הוסיפו לפעולה בדיקת קלט שתוודא כי כל הכמויות למילוי קטנות או שוות ל- 100. במידה והתקבלה כמות למילוי הגדולה מ- 100, יש לבקש מהמשתמש כמות אחרת למילוי.
הקלידו, שמרו, הריצו ובדקו שהתקבל הפלט הרצוי.
רשות: אם הייתם מקבלים 3 ערכים (לקיבולת דלי) האם תוכלו להדפיס את הערכים מן הקטן לגדול?