© המרכז להוראת המדעים האוניברסיטה העברית בירושלים

Slides:



Advertisements
Similar presentations
תוכנה 1 סמסטר א ' תשע " ב תרגול מס ' 7 * מנשקים, דיאגרמות וביטים * לא בהכרח בסדר הזה.
Advertisements

מבוא למדעי המחשב לתעשייה וניהול
1 Formal Specifications for Complex Systems (236368) Tutorial #4 Refinement in Z: data refinement; operations refinement; their combinations.
האוניברסיטה העברית בירושלים
1 Formal Specifications for Complex Systems (236368) Tutorial #2 Z introduction and notation (contd.); Birthday book example (Chapter 1 in the book); Z.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב'
חורף - תשס " ג DBMS, Design1 שימור תלויות אינטואיציה : כל תלות פונקציונלית שהתקיימה בסכמה המקורית מתקיימת גם בסכמה המפורקת. מטרה : כאשר מעדכנים.
תרגול 5 רקורסיות. רקורסיה קריאה של פונקציה לעצמה –באופן ישיר או באופן עקיף היתרון : תכנות של דברים מסובכים נעשה ברור ונוח יותר, מכיוון שזו למעשה צורת.
שאלות חזרה לבחינה. שאלה דיסקים אופטיים מסוג WORM (write-once-read-many) משמשים חברות לצורך איחסון כמויות גדולות של מידע באופן קבוע ומבלי שניתן לשנותו.
תכנות תרגול 4 שבוע : לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
מבוא לשפת C חידות ונקודות חשובות נכתב על-ידי יורי פקלני. © כל הזכויות שמורות לטכניון – מכון טכנולוגי לישראל.
מבוא למדעי המחשב תרגול 8 - מחרוזות שעת קבלה : יום שני 11:00-12:00 דוא " ל :
חורף - תשס " ג DBMS, צורות נורמליות 1 צורה נורמלית שלישית - 3NF הגדרה : תהי R סכמה רלציונית ותהי F קבוצת תלויות פונקציונליות מעל R. R היא ב -3NF.
1 Formal Specifications for Complex Systems (236368) Tutorial #5 Refinement in Z: data refinement; operations refinement; their combinations.
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
הוראת המדעים האוניברסיטה העברית1 רקורסיה. הוראת המדעים האוניברסיטה העברית2 חלק א: רקורסיה עם מספרים.
Formal Specifications for Complex Systems (236368) Tutorial #6 appendix Statecharts vs. Raphsody 7 (theory vs. practice)
תכנות תרגול 6 שבוע : תרגיל שורש של מספר מחושב לפי הסדרה הבאה : root 0 = 1 root n = root n-1 + a / root n-1 2 כאשר האיבר ה n של הסדרה הוא קירוב.
Backpatching 1. תזכורת מתרגול קודם קוד ביניים - שפת הרביעיות שיטות לייצור קוד ביניים –שימוש בתכונת code –כתיבה ישירה ל-buffer של פקודות שיטות לתרגום מבני.
תכנות תרגול 10 שבוע : הקשר בין מערכים למצביעים נרצה לעמוד על הקשר בין מערך למצביע מאחר ומערכים הם הכללה של משתנים הרי שברור שלמערך ולכל אחד מאיבריו.
מבוא כללי למדעי המחשב תרגול 3. לולאות while לולאות while while (condition) { loop body } במקרה של קיום התנאי מתבצע גוף הלולאה ברגע שהתנאי לא מתקיים נצא.
קורס תכנות – סימסטר ב ' תשס " ח שיעור שישי: מערכים
תחשיב הפסוקים חלק ד'. תורת ההיסק של תחשיב הפסוקים.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים 1 הפניות.
משטר דינמי – © Dima Elenbogen :14. הגדרת cd ו -pd cd - הזמן שעובר בין הרגע שראשון אותות הכניסה יוצא מתחום לוגי עד אשר אות המוצא יוצא מתחום.
מערכים עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר עד היום כדי לייצג 20 סטודנטים נאלצנו להגדיר int grade1, grade2, …, grade20; int grade1, grade2, …, grade20;
עקרון ההכלה וההדחה.
יחס סדר חלקי.
תכנות מונחה עצמים Object Oriented Programming (OOP) אתגר מחזור ב' Templates תבניות.
מבוא למדעי המחשב תרגול 3 שעת קבלה : יום שני 11:00-12:00 דוא " ל :
מבוא למדעי המחשב, סמסטר א ', תשע " א תרגול מס ' 1 נושאים  הכרת הקורס  פסאודו - קוד / אלגוריתם 1.
© המרכז להוראת המדעים האוניברסיטה העברית בירושלים
1 מבוא למדעי המחשב סיבוכיות. 2 סיבוכיות - מוטיבציה סידרת פיבונאצ'י: long fibonacci (int n) { if (n == 1 || n == 2) return 1; else return (fibonacci(n-1)
11 Introduction to Programming in C - Fall 2010 – Erez Sharvit, Amir Menczel 1 Introduction to Programming in C תרגול
פיתוח מערכות מידע Class diagrams Aggregation, Composition and Generalization.
Methods public class Demonstrate { public static void main (String argv[]) { public static void main (String argv[]) { int script = 6, acting = 9, directing.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים עוברים לג ' אווה.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 7. סברוטינות subroutines.
1 המרכז להוראת המדעים © האוניברסיטה העברית בירושלים פולימורפיזם מתקדם ממשקים בג ' אווה 1.
תכנות מכוון עצמים ושפת ++C וויסאם חלילי. TODAY TOPICS: 1. Function Overloading & Default Parameters 2. Arguments By Reference 3. Multiple #include’s 4.
מבוא למדעי המחשב לתעשייה וניהול הרצאה 12. ספריות.
מבנים קרן כליף. ביחידה זו נלמד :  מהו מבנה (struct)  איתחול מבנה  השמת מבנים  השוואת מבנים  העברת מבנה לפונקציה  מבנה בתוך מבנה  מערך של מבנים.
1 תרגול 11: Design Patterns ומחלקות פנימיות אסף זריצקי ומתי שמרת 1 תוכנה 1.
1 Formal Specifications for Complex Systems (236368) Tutorial #1 Course site:
מחרוזות – הטיפוס String
האוניברסיטה העברית בירושלים
מספרים אקראיים ניתן לייצר מספרים אקראיים ע"י הפונקציה int rand(void);
Programming Arrays.
Object Oriented Programming
Tirgul 12 Trees 1.
Object Oriented Programming
Computer Architecture and Assembly Language
מבוא למדעי המחשב סיבוכיות.
באר-שבע 2015 יום עיון
תכנות מונחה עצמים.
מצביעים קרן כליף.
SQL בסיסי – הגדרה אינדוקטיבית
תכנות מכוון עצמים ושפת JAVA
Static and enum קרן כליף.
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים בשפת JAVA
פרוקטוז, C6H12O6 , חד-סוכר מיוחד
ממשקים - interfaces איך לאפשר "הורשה מרובה".
בניית מחסנית סטטית Static Stack Implementation מורים מובילים תשע"ה
תכנות מכוון עצמים ושפת JAVA
תכנות מכוון עצמים ושפת JAVA
תזכורת על מה דיברנו שיעור שעבר? בנינו אתר אינטרנט עם כותרות
תוכנה 1 תרגול 13 – סיכום.
Engineering Programming A
פולימורפיזם מתקדם ממשקים בC# עריכה ועיצוב: קרן הרדי
Presentation transcript:

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים פרק 6 הפניות ועצמים מורכבים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

אתחול של משתנה מטיפוס מחלקה Bucket b1 = new Bucket (8); קודם מתבצעת יצירת העצם והקצאת משתנה מטיפוס המחלקה. לאחר מכן, מתבצעת השמת ההפניה לעצם, במשתנה b1. b1 Bucket capacity currentAmount 8 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים השימוש בהפניה נניח שהשורה הבאה בקוד תהיה: b1.Fill (5); הנקודה אחרי שמו של המשתנה מתפרשת במערכת כהוראה לגשת אל העצם שההפניה מפנה אליו, ולהשתמש בו. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

אתחול על ידי הצבה של הפניות נסתכל על שורות הקוד האלה: Bucket b1 = new Bucket (10); Bucket b2 = b1; בשורה הראשונה מוצבת במשתנה b1 הפניה למופע חדש של דלי. בשורה השנייה, מוגדר משתנה בשם b2, שאליו מועתקת ההפניה הקיימת ב-b1. כלומר כעת קיימות שתי הפניות לאותו העצם. b1 Bucket capacity currentAmount 10 b2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים העתקת עצמים על מנת ליצור שני עצמים שונים בעלי אותם ערכי תכונות, יש להשתמש בפעולה בונה מעתיקה: Bucket b1 = new Bucket (10); Bucket b2 = new Bucket (b1); במקרה זה נוצר העתק נוסף של העצם אליו מפנה b1. b2 מפנה אל העצם החדש: b2 Bucket capacity currentAmount 10 b1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

אתחול על ידי null Bucket b1 = null; ניסיון לפנות אל עצם דרך משתנה יגרום לשגיאה בזמן הריצה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

משתנה מטיפוס מחלקה שאינו מאותחל Bucket b1; b1.Fill (5); מכיוון שהעצם לא אותחל, הקומפילציה תיעצר אנו נקבל שגיאת הידור © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

? חשבו באיזה מקרה ההשוואה תסתיים בהדפסה השנייה. השוואת הפניות נסתכל על קטע הקוד Bucket b1 = new Bucket (10); Bucket b2 = new Bucket (b1); if (b1 == b2) Console.WriteLine ("שני המשתנים מפנים לאותו עצם"); else Console.WriteLine ("שני המשתנים מפנים לשני עצמים שונים"); ההשוואה בודקת: האם שתי ההפניות פונות לאותו העצם במקרה שלפנינו ההדפסה תהיה: "שני המשתנים מפנים לשני עצמים שונים" ? חשבו באיזה מקרה ההשוואה תסתיים בהדפסה השנייה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים שאלה ? כתבו קטע קוד המחזיר: true אם b1 ו-b2 שווים בערכי תכונותיהם אחרת, הוא מחזיר false © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים מערך של עצמים כדי ליצור מערך של חמש קופסאות, נכתוב: Box[] arr = new Box[5]; arr null 1 2 3 4 Box[] Length 5 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים אתחול המערך arr [0] = new Box (1, 2, 5); arr [1] = new Box (3, 2, 1); arr [2] = new Box (2, 2.5, 2); arr 1 null 2 3 4 Box[] Length 5 Box length width height 2.5 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

עצם מורכב כאשר תכונה אחת או יותר של מחלקה היא מטיפוס מחלקה כלשהי, אנו קוראים לעצם הנוצר מהמחלקה עצם מורכב (composite object) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים מערכת בית ספרית הנחה: קיים מאגר הורים © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים המחלקה תלמיד © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

ייצוג המחלקה (מגדירה עצם מורכב) public class Student { private string name; private string phoneNum; private Parent parent; … } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים פעולה בונה public Student (string name, string phoneNum, Parent parent) { this.name = name; this.phoneNum = phoneNum; this.parent = parent; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים רישום התלמיד ההורה נרשם במאגר ההורים: Parent p1 = new Parent ("Katz Meir", "054-2345678"); התלמיד נרשם : Student st1 = new Student ("Katz Oren", "02-8765432", p1); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים הפעולה GetParent() public Parent GetParent() { return this.parent; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

שימוש בפעולה GetParent() Parent p = st1.GetParent(); string parentName = p.GetName(); או בשורה אחת: string parentName = st1.GetParent().GetName(); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים תכונה מטיפוס מחלקה עד כה ראינו את הקוד של המחלקה באופן כללי. עתה ננסה להבין, מה המשמעות של הקוד מבחינת ההתרחשות בזיכרון. נתמקד בתכונה מטיפוס מחלקה: © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים פעולה בונה זימון: Parent p1 = new Parent ("Katz Meir", "054-2345678"); Student st1 = new Student ("Katz Oren", "02-8765432", p1); גוף הפעולה: public Student (string name, string phoneNum, Parent parent) { ... this.parent = parent; } Parent name cellNum Student phoneNum parent st1 p1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים הפניה כערך החזרה גוף הפעולה GetParent(): public Parent GetParent() { return this.parent; } שימוש בפעולה : Parent p1 = new Parent ("Katz Meir", "054-2345678"); Student st1 = new Student ("Katz Oren", "02-8765432", p1); Parent p2 = st1.GetParent(); p2.SetCellNum ("052-6782345"); ? ציירו תרשים עצמים המתאר את העצמים הקיימים בקטע הקוד המופיע למעלה ואת מצבם בסוף הקטע. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

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

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים ממשק המחלקה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים שימוש ב-StudentList StudentList studentList = new StudentList(); Student st1 = new Student ("Potter Harry","02-9965187", p1); Student st2 = new Student ("Scofield Michael","03-6742201", p2); // להלן הוספת שלושת התלמידים לרשימה הכיתתית: studentList.Add (st1); studentList.Add (st2); Console.WriteLine (studentList); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים ייצוג של StudentList לפי כללי בית ספר אין אפשרות שמספר התלמידים בכיתה יעלה על 35. public class StudentList { public const int MAX_STUDENTS = 35; private Student[] list; … } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

הפעולה הבונה של StudentList public StudentList () { this.list = new Student[MAX_STUDENTS]; } פעולה זו מייצרת מערך ריק (שבכל תאיו יש null ( על מנת לאתחל את התאים - יש להשתמש בפעולת ההוספה לרשימה כיתתית © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים פעולת ההוספה ישנן שתי אפשרויות למציאת מקום ההוספה: לסרוק את המערך עד שמגיעים ל-null. להוסיף תכונה lastPosition. תכונה זו תשמור את האינדקס של המקום הפנוי הראשון ברשימה. אנו נשתמש באפשרות השנייה. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים פעולת ההוספה public class StudentList { public const int MAX_STUDENTS = 35; private Student[] list; private int lastPosition; public void Add (Student st) this.list[this.lastPosition] = st; this.lastPosition++; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים שאלות ? כתבו את פעולת ההוספה ללא הגדרת התכונה lastPosition. נתחו את זמן הריצה של פעולת ההוספה עם התכונה ובלעדיה, ונסחו את מסקנותיכם. ? נניח כי הרשימה הכיתתית lst קיימת. במהלך תוכנית כלשהי, הוצבה במשתנה student1 הפניה לתלמיד ואז ביצעה התוכנית את הזימון הזה: lst.Insert (student1); א. התבוננו בפקודה זו: this.list [this.lastPosition] = st; כמה הפניות אל התלמיד החדש קיימות לפני ביצוע שורת הקוד הבאה שבגוף פעולת ההוספה, וכמה קיימות אחריה. הסבירו את תשובתכם בפירוט. ב. כמה הפניות לתלמיד יישארו עם תום פעולת ההוספה? © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

תכונה המציינת את המקום הפנוי הראשון פעולת המחיקה (הוצאה) public Student Del (string name) { Student st = null; int i = 0; while (i < this.lastPosition && this.list[i].GetName().CompareTo (name) != 0) i++; if (i < this.lastPosition) st = this.list[i]; for (int k = i+1; k < this.lastPosition; k++) this.list[k-1] = this.list[k]; this.lastPosition--; this.list[this.lastPosition] = null; } return st; תכונה המציינת את המקום הפנוי הראשון סגירת "חור" במערך © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

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

פעולת הוספה השומרת על המיון פעולת הוספה השומרת על המיון public void Add (Student student) { int i = 0; while (i < this.lastPosition && this.list[i].GetName().CompareTo (student.GetName()) < 0) i++; if (i < this.lastPosition) MoveOthers(i); this.list[i] = student; this.lastPosition++; } פעולת עזר. פעולה זו אחראית על הזזה ימינה של כל האיברים מהמקום i ועד סוף המערך © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

שאלות ? ממשו את הפעולה void MoveOthers (int place) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים יעילות הפעולות המערך ממוין המערך אינו ממוין הפעולה ToString() O(n) O(nlogn) פעולת ההוספה O(1) © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים שאלה ? מכיוון שהמערך ממוין עולה השאלה האם ניתן להיעזר בחיפוש בינרי ולהקטין את סדר הגודל של פעולת המחיקה ל-O(logn)? הסבירו ונמקו את תשובתכם. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים העתקה נניח כי קיים עצם מורכב a, שתכונתו היא הפניה לעצם אחר b. אנו רוצים ליצור עותק של a . לגבי העתקה של התכונה b קיימות שתי אפשרויות: 1. בעותק של a ליצור הפניה שתפנה ל-b. כך יהיו שתי הפניות לאותו עצם b. 2. בעותק של a ליצור עצם חדש c שהוא העתק של b. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים העתקה של StudentList אפשרות 1 : העתקה של הפניות public StudentList (StudentList stList) { this.list = new Student[MAX_STUDENTS]; for (int i=0; i<stList.lastPosition; i++) this.list[i] = stList.list[i]; this.lastPosition = stList.lastPosition; } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים העתקה של StudentList אפשרות 2 : העתקה של עצמים public StudentList (StudentList stList) { this.list = new Student[MAX_STUDENTS]; for (int i=0; i<stList.lastPosition; i++) this.list[i] = new Student (stList.list[i]); this.lastPosition = stList.lastPosition; } פעולה בונה מעתיקה © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

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

עצם שתכונתו מטיפוס עצמו תכונתו של עצם יכולה להיות מטיפוס המחלקה שלו עצמו: אין פעולה המשנה את הצבע © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

מימוש הפעולות Get ו-Set public Bead GetNextBead() { return this.nextBead; } public void SetNextBead (Bead nextBead) this.nextBead = nextBead; © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

יצירת שרשרת – דרך ראשונה ניצור שני חרוזים בודדים בעזרת הפעולה הבונה המתאימה: Bead b1 = new Bead ("red"); Bead b2 = new Bead (“green"); עתה נחרוז את החרוזים לשרשרת: b2.SetNext (b1); Bead color nextBead "red" null b1 "green" b2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

יצירת שרשרת – דרכים נוספות דרך 2 : Bead b1 = new Bead ("red"); Bead b2 = new Bead ("green", b1); דרך 3: Bead b2 = new Bead ("green", new Bead ("red")); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים יצירת שרשרת מעגלית Bead b1 = new Bead ("red"); Bead b2 = new Bead ("blue", b1); Bead b3 = new Bead ("gray", b2); Bead b4 = new Bead ("green", b3); b1.SetNext (b4); © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

משתנה מטיפוס מחלקה המשמש לסריקה ניתן לסרוק את השרשרת באמצעות הפניה מטיפוס Bead: קיימת השרשרת הבאה: נגדיר משתנה שיפנה לחרוז הראשון ונקדם אותו: Bead p = b4; p = p.GetNextBead(); p p b4 Bead color nextBead "red" null b1 "gray" b3 "green" "blue" b2 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים שאלות ? כתבו קטעי קוד עבור שרשרות החרוזים המתוארות להלן: א. הרכיבו שתי מחרוזות שונות, הזהות הן בצבעי החרוזים והן בסדר הופעת הצבעים במחרוזת. כל מחרוזת תהיה מורכבת מחמישה חרוזים, שצבעיהם (משמאל לימין) הם: ירוק, צהוב, אדום, ירוק, צהוב. המשתנים b1 ו-b2 יכילו הפניות לחרוזים הראשונים שבשתי המחרוזות. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים שאלות ב. חברו את שתי המחרוזות שיצרתם על ידי שינוי הפניה במחרוזת השנייה, כך שיתקבל מבנה כמתואר באיור הבא. (שימו לב שאחרי ביצוע המשימה, אין בתוכניתכם אף הפניה לשלושת החרוזים האחרונים שבמחרוזת השנייה). ג. הרכיבו מחרוזת ארוכה המורכבת משתי המחרוזות המקוריות (מסעיף א), הראשונה תחילה ואחריה השנייה, וסגרו אותה למעגל. b1 Bead color nextBead "yellow" "green" b2 "red" null © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

שרשור היררכי – Employee © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

שרשור היררכי – Employee יצירת מבנה ארגוני: public static void Main(string[] args) { Employee emp1 = new Employee("Moshe", null); Employee emp2 = new Employee("Sara", emp1); Employee emp3 = new Employee("Yossi", emp1); Employee emp4 = new Employee("Yoram", emp1); Employee emp5 = new Employee("Yair", emp2); } © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים התוצאה Employee name supervisor "Yair" emp5 "Sara" emp2 "Yossi" emp3 "Yoram" emp4 "Moshe" null emp1 © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים מחרוזת – עצם קבוע מחרוזות אינן ניתנות לשינוי (immutable). כל שינוי של מחרוזת יוצר מחרוזת חדשה המכילה את השינוי הרצוי. למשל אם קיימת מחרוזת: string str1 = "Moshe"; ונרצה לשרשר לה שם משפחה כהן: str1+= “Cohen”; יווצר מקום חדש בזיכרון שתוכנו “Moshe Cohen”, ותוכן המקום הקודם לא ישתנה ויהיה עדיין “Moshe”. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים מחרוזת – עצם קבוע מדוע ישנה חשיבות לכך שהמחרוזת אינה משתנה? כיוון שכאשר משתמשים במחרוזות, אין סכנה במספר הפניות שפונות לעצם אחד. נבחן את הקוד הבא: string str1 = "Moshe"; string str2 = str1; str1 += " Cohen"; Console.WriteLine (str1 + ", " + str2); הפלט שיתקבל יהיה: Moshe Cohen, Moshe . חשבו מדוע ? כאשר עובדים עם מחרוזות, ניתן להתייחס אליהן כאל טיפוס בסיסי ולא להיות מוטרדים ממספר הפניות הפונות לאותו העצם. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

אספן זבל בסישרפ קיים מנגנון מיוחד בשם אספן זבל (garbage collector). אספן הזבל דואג למחוק מהזיכרון עצמים שאין אף משתנה הפונה אליהם. לדוגמה, אם לאחר ההקצאה: Bucket b1 = new Bucket(10); מציבים: b1 = null; ההפניה היחידה מהתוכנית אל המופע של הדלי נמחקה מנגנון איסוף הזבל ישחרר את העצםb1 מהזיכרון. © המרכז להוראת המדעים האוניברסיטה העברית בירושלים

© המרכז להוראת המדעים האוניברסיטה העברית בירושלים סוף © המרכז להוראת המדעים האוניברסיטה העברית בירושלים