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

חוף אשכול ב', יום ה' 31.3.22 - הפעולה Add להוספת ציון למערך ציונים, מעבר על תר' עצים, מענה לשאלות, מח' האוסף Diary

 בכיתה

1. בדיקת שיעורי בית שניתנו להיום
    א. 14 הפעולות בנושא תבניות עצים.
    ב. 4 התרגילים בנושא עצים מעמ' 176 בספר.
    ג. 3 התרגילים בנושא עצים מעמ' 176-177 בספר.
    ד. בגרות 2019 שאלה 16.

2. עבודה נכונה עם אוסף - האם עליו להיווצר מחוץ למחלקה או בתוך המחלקה?
    א. תכונת אוסף ציונים של תלמיד במחלקת Student תנוהל מתוך המחלקה.
    ב. תכונת אוסף של תלמידים במחלקת Students תנוהל מתוך המחלקה.
    ג. מה הכוונה שהאוסף ינוהל מתוך המחלקה?
        * האוסף ייווצר בתוך המחלקה, למשל ע"י הבנאי.
        * ניהול האוסף (הוספה, עריכה, מחיקה של פריט) ייתבצע מתוך המחלקה.
        * הסבר: כאשר בנאי מקבל כפרמטר אוסף מבחוץ, הרי שקיימת חלילה האפשרות
           שאוסף זה יוכל להיות מנוהל גם מחוץ למחלקה! ולכן מסיבה זו, נעדיף ברוב המקרים,
           שהאוסף ייבנה וינוהל מתוך המחלקה.
    ד. הפעולה הפנימית AddGrade שבמחלקת Student (מחלקה ליצירת עצמים מטיפוס סטודנט)
        הפעולה מקבלת ציון ומוסיפה אותו למערך הציונים של התלמיד עליו בוצע זימון הפעולה.
        במחלקת Student קיימת תכונה המייצגת את ציוני התלמיד.
        מדובר באוסף מסוג מערך שלמים בגודל 3. נתון בשאלה כי לכל תלמיד יכולים להיות
        עד 3 ציונים, ולא יותר. גם אם לתלמיד מסוים לא קיימים 3 ציונים, גודל המערך נשאר קבוע: 3.
        למשל, בעת הזימון הראשון של פעולה זו על התלמיד הבא:  s1.AddGrade(100),
        מערך 
הציונים שלו ייראה כך: 0 ,0 ,100 <--

public void AddGrade(int grade)
{
         if(idx < this.grades.Length)
         {
                  this.grades[idx] = grade ;
                  idx++ ;
         }           
         else
         {
                   Console.WriteLine("Sorry, the array of grades is full.") ;
         }
}

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

public void AddStudent(Student st)
{

         //הנמצאת במחלקה, מחזירה את האינדקס הפנוי הבא במערך הסטודנטים CountStudents הפעולה
         int idx = this.CountStudents() ;     //משתנה לשמירת האינדקס של התא הפנוי הבא במערך
         if(idx < 40)                                    //אם עדיין נותר מקום בכיתה
         {
                this.students[idx] = st ;
                Console.WriteLine("student added successfully.") ;
         }
         else
         {
                Console.WriteLine("Sorry, the class is full.") ;
         }
}

    ו. הפעולה הפנימית AddStudent1 הנמצאת במחלקת Students
       הפעולה מקבלת עצם מטיפוס סטודנט, ומוסיפה אותו למערך הסטודנטים של המחלקה.
       נתון בשאלה שמערך הסטודנטים הוא בגודל 40,
       אבל 
       אם לא נותר מקום פנוי במערך לצורך הוספת סטודנט חדש,
       יש להגדיל את מספר המקומות ב- 10 ואז לבצע את הוספת התלמיד החדש למערך:

public void AddStudent2(Student s)
{
           //אם לא נותר מקום פנוי במערך הסטודנטים
           if (count >= students.Length)        
           {
                   //יצירת מערך סטודנטים חדש, גדול יותר מהמערך המקורי
                   Student[] tmp = new Student[students.Length + 10] ;
                   //לולאה להעברת כל הסטודנטים מהמערך המקורי למערך החדש
                   for (int i = 0; i < tmp.Length; i++)
                   {
                            tmp[i] = students[i] ;
                   }

           }
           //קביעה כי הייחוס שהפנה למערך המקורי, יפה למערך החדש
           students = tmp;
           //(השמת סטודנט הפרמטר במיקום הפנוי הבא במערך (החדש
           students[count] = s;
           //עדכון האינדקס על-מנת לשמור את מיקום התא הפנוי לצורך ההוספה הבאה
           //הוגדר באזור התכונות של המחלקה count שימו לב: המשתנה

           count++;
}

3. פעולות לדוגמה מתוך מחלקת השורש Object
    א. הפעולה ToString נמצאת במחלקת השורש Object.
        לכן בכל מחלקה שניצור, בה נרצה פעולה זו כך תחזיר מחרוזת המייצגת עצם מהמחלקה
        הספציפית שלנו, נשתמש ישירות ב- override.
        (אין צורך להשתמש ב- virtual כיוון שהפעולה כבר הוגדרה כ- virtual במחלקת Object).
    ב. הפעולה Equals נמצאת במחלקת השורש Object.
        הפעולה מקבלת עצם מטיפוס Object (כל העצמים הם גם מטיפוס Object)
        ומחזירה true אם העצם שקיבלה כפרמטר זהה לעצם שזימן את הפעולה, אחרת - false.
    ג. הפעולה CompareTo נמצאת במחלקת השורש Object. הפעולה מקבלת עצם ומחזירה:
        מספר שלם חיובי (בד"כ 1): אם העצם המזמן גדול מעצם הפרמטר.
        את הערך 0: אם העצם המזמן שווה לעצם הפרמטר.
        מספר שלם שלילי (בד"כ 1-): אם העצם המזמן קטן מעצם הפרמטר.
        אם במחלקת Box קיימת הפעולה CompareTo עם חתימה זהה לזו שבמחלקת Object,
        ברור שנגדיר את הפעולה כ- override, על-מנת שתבצע השווה בין שתי קופסאות,
        בהתאם לקריטריונים אותם קבע המתכנן של מחלקת Box.
        למשל: קופסה אחת גדולה מהשנייה אם הנפח שלה גדול יותר.

    כך תיראה הפעולה CompareTo במחלקת Box (קראו משמאל לימין):

public override int CompareTo(Object obj)
{
        int volume = this.length * this.width * this.height ;
        if ( this.volume > obj.volume)
       {
                return 1 ;
        }
        else if (this.volume == obj.volume) 
       {
                return 0 ;
        }
        return -1 ;
}

    כך תיראה הפעולה Equals במחלקת Box:

public override int Equals(Object obj)
{
        int volume = this.length * this.width * this.height ;
        if ( this.volume == obj.volume) 
        {
                 return true ;
        }
        return false ;
}    

לבית
1. ענו על "אוסף תרגילי תשע"ז בנושא עצים - חלק א'" כאן.
    מתוך בלוג מבני-נתונים (kirzon-ds.blogspot.com), דף 'קישורים', סעיף 730.

2. ענו על "אוסף תרגילי תזע"ז בנושא עצים - חלק ב'" כאן
    מתוך בלוג מבני-נתונים (kirzon-ds.blogspot.com), דף 'קישורים', סעיף 740.

בשיעורים הבאים
1. הערות לגבי ממשק המחלקה BinNode.
2. תרגול על עץ חיפוש בינארי.
3. תרגול בגרות נוסף.