65
1 "םםםםם םםםםם םםםםם םםםםם- "םםםםםםם ם םםם"ם –2008 םםם- םםם םםםםם םםםםם םםםםם םםםםם םםםםם םםםםםםם םםם"ם- םםםם םםם5.03.2008 םםם6 : םםםםםם םםםםםם םםםםםםם

עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח

  • Upload
    lily

  • View
    97

  • Download
    6

Embed Size (px)

DESCRIPTION

עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח. מפגש שני - 5.03.2008 פרק 6: הפניות ועצמים מורכבים. העמקה כבסיס לכל הרצף מכאן ואילך: הפניה עצם מורכב עצם מורכב המכיל הפניה מסוג עצמו. פרק 6 הפניות ועצמים מורכבים. . . מי היא השלישייה הפותחת?. העצם. ההפניה (כתובת). Bucket b1. - PowerPoint PPT Presentation

Citation preview

Page 1: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

1 "השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

עיצוב תוכנה מבוסס עצמים מורים מובילים תשס"ח

5.03.2008מפגש שני -

6פרק :

הפניות ועצמים מורכבים

Page 2: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

2

6פרק

הפניות ועצמים מורכבים

העמקה כבסיס לכל הרצף מכאן ואילך: הפניה עצם מורכב עצם מורכב המכיל הפניה מסוג עצמו

Page 3: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

3

מי היא השלישייה הפותחת?

המשתנה המחזיק את

ההפניה

העצם

ההפניה )כתובת(

Bucket b1

Page 4: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

4

ואיך נדבר בסוף?

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

מחזיק Bucketמשתנה מטיפוס המחלקה הפנייה למופע מטיפוס המחלקה ...

או: על ידי הפניה (מופנה) שמוצבע b1העצם

השמורה במשתנה...

מפנה אל b1 הוא העצם ובו זמנית ש-b1אנו נגיד ש-העצם...

Page 5: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

5

ההפניה הריקה שאינה מפנה nullלעצם נקראת

Bucket b=null; Turtle t=null; String s=null;

int[] a=null;

int iNum=null;

Error: incompatible typesfound : <nulltype<

required: int

אגב האיור המוכר – נעלם

ערך מיוחד: ההפניה הריקה

Page 6: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

6

אתחול משתנים

Box b1;

b1.setWidth(5);

משנה מצב לעצם שאינו קיים

Error: variable b1 might not have been initialized

משתנים שאינם מאותחלים גורמים לשגיאת הידור!

Page 7: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

7

אתחול סביר יהיה על ידי בניית מופע של המחלקה

והצבתו במשתנה.

Bucket b1 = new Bucket(4);

(1אתחול משתנים )

Page 8: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

8

אתחול אפשרי אחר: הצבת מופע קיים לתוך

המשתנה:

Bucket b1 = new Bucket(10);

Bucket b2 = b1;

זוהי העברת ערך של משתנה מטיפוס אותה מחלקה למשתנה "שלנו".

(2אתחול משתנים )

Page 9: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

9

שימוש בפעולה בונה מעתיקה (אם קיימת!!):

Bucket b1 = new Bucket(10);

Bucket b2 = new Bucket(b1);

(3אתחול משתנים )

Page 10: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

10

(4אתחול משתנים )

NullPointerException

גורמת nullהפעלת פעולה על משתנה שערכו לשגיאת זמן ריצה!

האתחול לערך ההפניה המיוחד - ההפניה הריקה:

Bucket b1 = null;האתחול חוקי לחלוטין

משתנה מטיפוס מחלקה שהוצהר ולא אותחל –

!!! nullלא מקבל

Page 11: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

11

השוואות - הפניות ועצמיםBucket b1=new Bucket)10(;Bucket b2=new Bucket)10(;

Bucket b1=new Bucket)10(;Bucket b2=new Bucket)b1(;

Bucket b1=new Bucket)10(;

Bucket b2= b1;

if )b1==b2( … עצםאותובדיקה האם יש שתי הפניות אל

Page 12: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

12

מערך של עצמים הכרזה על משתנה שבעתיד

)ולא יחזיק הפניה למערך מערך!(

Box[] arr;

יצירת עצם מערך והצבת הפניה לעצם בתוך המשתנה

arr=new Box[5];

בעת יצירת מופע של עצם מתבצע אתחול

שלו

תאים במערך מאותחלים על פי ברירת

המחדל

Page 13: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

13

מערך של עצמים - אתחול תאים

:אתחול תאי המערךarr[0] = new Box(1, 2, 5);arr[1] = new Box(3, 2, 1);arr[2] = new Box(2, 2.5, 2);

ובסלנג נאמר כך:

Page 14: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

14

עצם מורכב

כאשר תכונה אחת או יותר של מחלקה היא מטיפוס מחלקה כלשהי,

אנו קוראים לעצם הנוצר מהמחלקה

( composite object )עצם מורכב

כאשר תכונה אחת או יותר של מחלקה היא מטיפוס מחלקה כלשהי,

אנו קוראים לעצם הנוצר מהמחלקה

( composite object )עצם מורכב

Page 15: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

15

סדר הגדרת העצמים מגדיר תלות ביניהם

ראשון מוגדר הורה פשוט עצם שהוא

אחריו מוגדר תלמיד שהוא בעל תכונה "הורה"

עצם מורכב – בסוף נגדיר רשימה

כיתתיתמורכב "יותר" עצםשהיא

Page 16: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

16

מורכב עצםStudentList אוסף - המייצג

המחלקה מאפשרת:הוספת תלמיד לרשימה כיתתית.•מחיקת תלמיד מהרשימה.•קבלת פרטיו של תלמיד על פי שמו. •הדפסת דף קשר כיתתי ממוין בסדר אלפביתי. •

: יש מקום ברשימה הכיתתית.הנחההכנסת לפני ברשימה מקום קיים האם לבדוק צורך אין

תלמיד חדש.

המחלקה מאפשרת:הוספת תלמיד לרשימה כיתתית.•מחיקת תלמיד מהרשימה.•קבלת פרטיו של תלמיד על פי שמו. •הדפסת דף קשר כיתתי ממוין בסדר אלפביתי. •

: יש מקום ברשימה הכיתתית.הנחההכנסת לפני ברשימה מקום קיים האם לבדוק צורך אין

תלמיד חדש.

Page 17: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

17

הדוגמה המלווהצמצום עולם הבעיה:

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

ידועים תמיד (למזכירה)

ללא הגבלות סבירות הדוגמה הולכת ומסתבכת ללא הגבלות סבירות הדוגמה הולכת ומסתבכת לכיוונים שאינם נחוצים לנו בהוראהלכיוונים שאינם נחוצים לנו בהוראה

צמצום נוסף )הגיוני(: (שינוי שמות).לא מגדירים פעולות העלולות לפגוע באוסף

Page 18: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

18

המחלקה ממשק

Page 19: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

19

עצם מורכב המייצג אוסף:

(דוגמה מלווה)רשימה כיתתית

StudentList מגדירה קבוצת תלמידי כיתה כלומר, רשימה כיתתית.

.ההגבלות ידועות מעולם הבעיה של אוסףרשימה כיתתית היא עצם המכיל

. Studentעצמים מטיפוס ספציפיזהו אוסף .

Page 20: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

20

...אין לנו אלא מערך

ייצוג האוסף רשימה כיתתית:

public class StudentList

{

public static final int MAX_STUDENTS = 35 ;

private Student[] list;

}

איך מחזיקים את האוסף?

Page 21: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

21

משנים כיוון:

עוברים לרשימה כיתתית ממוינת

מה משתנה?

הייצוג לא משתנה• משתנה המימוש של פעולת ההכנסה:•

תכניס כל תלמיד למקומו הנכון ברשימה על פי סדר אלפביתי

מימוש וייצוג: יעילות מחושבת על פי מסקנה חשובהמסקנה חשובה לאותו ייצוג יכולים להיות מימושים שונים

בעלי יעילויות שונות!!

Page 22: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

22

.b, שתכונתו היא הפניה לעצם אחר aנניח כי קיים עצם מורכב . aאנו רוצים ליצור עותק של

העתקה

A

1020a

B

‘z’ ‘r’b

קיימות bלגבי העתקה של התכונה שתי אפשרויות:

ליצור הפניה שתפנה aבעותק של א-כך יהיו שתי הפניות לאותו .bל-

.bעצם

ליצור עצם חדש שהוא aבעותק של ב-.bהעתק של

Page 23: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

23

העתקה שטוחה

A

1020a

B

‘z’ ‘r’b

A

1020a1

העתקה של עצם מורכב שמבצעת העתקה של תכונות העצם רק על ידי העתקת ההפניות

).shallow copy (העתקה שטוחהנקראת

Page 24: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

24

העתקה עמוקה

A

1020a

B

‘z’ ‘r’b

A

1020a1

B

‘z’ ‘r’b1

העתקה של עצם מורכב – באופן שבו כל תכונותיו שהן עצמים אכן מועתקות לעצמים חדשים

(וכן עבור תכונות של עצמים אלו, בכל עומק) ). deep copy (העתקה עמוקהנקראת

Page 25: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

25

תכונתו של עצם יכולה להיות מטיפוסהמחלקה שלו עצמו:

עצמו מטיפוס שתכונתו עצם

String color

Bead nextBead

String color

Bead nextBead

Bead

Bead (String color)Bead (String color, Bead nextBead)String getColor()Bead getNextBead()void setNextBead (Bead nextBead)

Bead (String color)Bead (String color, Bead nextBead)String getColor()Bead getNextBead()void setNextBead (Bead nextBead)

אין פעולה המשנה את

הצבע

Page 26: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

26

public Bead getNextBead()

}

return this.nextBead;

{

public void setNextBead (Bead nextBead)

}

this.nextBead = nextBead;

{

set ו-get הפעולות מימוש

Page 27: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

27

ניצור שני חרוזים בודדים בעזרת הפעולה הבונה המתאימה:

Bead b1 = new Bead ("red");

Bead b2 = new Bead (“green");

לשרשרת החרוזים את נחרוז עתה :

b2.setNext (b1);

ראשונהשרשרת – דרך יצירת

Bead

color nextBead

"red" null

b1Bead

color nextBead

"green" null

b2

Page 28: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

28

2דרך : Bead b1 = new Bead ("red");

Bead b2 = new Bead ("green", b1);

3דרך :Bead b2 = new Bead ("green", new Bead ("red"));

נוספות דרכים – שרשרת יצירת

האם איור משתנה?

Page 29: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

29

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);

מעגלית יצירת שרשרת

Page 30: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

30

ניתן לסרוק את השרשרת באמצעות הפניה מטיפוס Bead:

קיימת השרשרת הבאה:

נגדיר משתנה שיפנה לחרוז הראשון ונקדם אותו:Bead p = b4;

p = p.getNextBead;()

משתנה מטיפוס מחלקה המשמש לסריקה

b4

Bead

colornextBead

"red"

null

b1

Bead

colornextBead

"gray"

b3

Bead

colornextBead

"green"

Bead

colornextBead

"blue"

b2

p p

איך נדע שהגענו לחרוז האחרון?

10כמה הפניות צריך כדאי ליצור שרשרת מ-חרוזים?

Page 31: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

31

Employeeהיררכי – שרשור

String name

Employee supervisor

String name

Employee supervisor

Employee

Employee (String name, Employee supervisor)

String getName()

Employee getSupervisor()

void setSupervisor (Employee supervisor)

Employee (String name, Employee supervisor)

String getName()

Employee getSupervisor()

void setSupervisor (Employee supervisor)

מגדירה עובד בחברה. לכל עובד Employeeהמחלקה בחברה, למעט מנהל החברה, יש אחראי שגם הוא עובד

בחברה:

מה מאפיין את המנהל החברה?

Page 32: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

32

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);

}

Page 33: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

33

התוצאה

Employee

name supervisor

"Yair"

emp5

Employee

name supervisor

"Sara"

emp2

Employee

name supervisor

"Yossi"

emp3

Employee

name supervisor"Yoram

"

emp4

Employee

name supervisor"Moshe

"null

emp1

Page 34: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

34

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

הופעת הצבעים במחרוזת. כל מחרוזת תהיה מורכבת מחמישה חרוזים,

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

המחרוזות. b1

Bead

color nextBead

"yellow"

Bead

color nextBead

"green"

Bead

color nextBead

"green"

Bead

nextBead

"red"

Bead

nextBead

"yellow" null

color color

Bead

color nextBead

"yellow"

Bead

color nextBead

"green"

Bead

color nextBead

"green"

Bead

nextBead

"red"

Bead

nextBead

"yellow" null

color color

b2

איך לבדוק שאכן יש שתי מחרוזות שונות?

איך לבדוק שהן זהות?

Page 35: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

35

שאלות ב. הרכיבו מחרוזת ארוכה המורכבת משתי המחרוזות המקוריות )מסעיף

א(, הראשונה תחילה ואחריה השנייה, וסגרו אותה למעגל.

b1Bead

color nextBead

"yellow"

Bead

color nextBead

"green"

Bead

color nextBead

"green"

Bead

nextBead

"red"

Bead

nextBead

"yellow"

color color

Bead

nextBead

“green"

color

Bead

nextBead

"yellow"

color

Bead

nextBead

“red"

color

Bead

nextBead

“green"

color

Bead

nextBead

"yellow"

color

איך לבדוק שאכן יש מחרוזת אחת מעגלית?

איך לספור כמות החרוזים?

איך להפוך סדר החרוזים?

Page 36: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

36

שאלות ג. חברו את שתי המחרוזות שיצרתם על ידי שינוי הפניה במחרוזת

השנייה, כך שיתקבל מבנה כמתואר באיור הבא. )שימו לב שאחרי ביצוע

המשימה, אין בתוכניתכם אף הפניה לשלושת החרוזים האחרונים שבמחרוזת

השנייה(.

b1Bead

color nextBead

"yellow"

Bead

color nextBead

"green"

b2Bead

color nextBead

"yellow"

Bead

color nextBead

"green"

Bead

color nextBead

"green"

Bead

nextBead

"red"

Bead

nextBead

"yellow" null

color color

איך לבדוק שאכן יש שתי מחרוזות מחוברות?

איך לשחזר מצב התחלתי?

איך למצוא צבע של חרוז המחבר?

כמה חרוזים יש?

Page 37: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

37

7פרק ייצוג אוספים

Page 38: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

38

מה בשיעור

(IntNode. חוליה המכילה ערך שלם )1. שרשרת חוליות: הוצאה, הכנסה, מעבר על 2

השרשרת,

פעולות על השרשרת. החוליה הגנרית3. שרשרת חוליות כמבנה רקורסיבי4. שרשרת חוליות לייצוג של אוסף5. מבנים נוספים מבוססי חוליות6

Page 39: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

39

אוספים – מבוא

אוספים ביישומים רבים יש צורך לשמור(collections)

אוספים אלו הם דינמיים )כמות הנתונים באוסףגדלה וקטנה(

– ראינו אוסף כזה: רשימה כיתתיתStudentList אתStudentList מערך ייצגנו בעזרת StudentListהיה מוגבל בגודלו

תלמידים(35 )כזכור לא ניתן היה להכניס יותר מ-אנו מעוניינים גם באוספים שלא מוגבלים בגודלם

Page 40: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

40

חסרונות המערך כאמצעי לאחסון אוספים

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

. סיבוך גבוה לפעולות הכנסה והוצאה2.הוספת נתון למקום שרירותי במערך או

הוצאת נתון ממנו הן פעולות יקרות המערך הוא מגבלת המבנה הסדרתי.3.

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

Page 41: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

41

החוליה

החוליה היא עצם ובו שתי תכונות: ערך נתון 1.הפניה לחוליה, בדרך כלל חוליה אחרת, 2.

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

העצם עצמו

Page 42: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

42

IntNode שלם מספר המכילה חוליה

UML:

int info

IntNode next

int info

IntNode next

IntNode

IntNode (int x)

IntNode (int x, IntNode next)

.

.

.

IntNode)int x(

IntNode) intx ,(IntNode next

.

.

.

הערך

הפניה לחוליה העוקבת

Page 43: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

43

IntNodeממשק המחלקה

Page 44: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

44

מימוש המחלקהprivate int info;private IntNode next;

public IntNode (int x)}

this.info = x;this.next = null;

{public IntNode (int x, IntNode next)}

this.info = x;this.next = next;

{

הפעולות הבונה

הפעולה הבונה

ייצוג המחלקה

Page 45: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

45

toString, get, setפעולות public IntNode getNext()}

return this.next;{public void setNext (IntNode next)}

this.next = next;{public int getInfo()}

return this.info;{public void setInfo (int x)}

this.info = x;{public String toString)({ return "" + this.info; }

Page 46: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

46

שרשרת חוליות – בנייה

IntNode n = new IntNode (5);

IntNode n1 = new IntNode (7, n);

IntNode n2 = new IntNode (4, n1);

nIntNode

5

info next

null

IntNoden1

IntNoden

7

info next

5

info next

null

IntNoden1

IntNoden

IntNoden2

4

info next

7

info next

5

info next

null

כמה הפניות חיצוניות יש

כרגע ?

האם נתן לצמצם?

Page 47: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

47

שרשרת חוליות – בנייה

ניתן ליצור שרשרת חוליות בכתיבה מקוצרת:IntNode n = new IntNode(4, new IntNode(7, new IntNode(5)));

במקרה זה קיימת רק הפניה אחת לאורך כל השרשרת:

n ההפניה לחוליה הראשונה חייבת להישמר -אם היא נמחקת, לא ניתן לגשת יותר לשרשרת החוליות

אספן הזבל ימחק את כול השרשרת

IntNode IntNodeIntNoden

4

info next

7

info next

5

info next

null

Page 48: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

48

שרשרת חוליות – הכנסה

IntNode temp = new IntNode (56);temp.setNext (n.getNext());n.setNext (temp);

IntNode IntNodeIntNode

n

4

info next

7

info next

5

info next

null

IntNodetemp

56

info next

null

Page 49: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

49

הכנסה – כתיבה מקוצרת

IntNode temp = new IntNode (56, n.getNext());

n.setNext (temp);

IntNodeIntNoden

4

info next

7

info next

IntNode

5

info next

null

temp

IntNode

56

info next

n.setNext )new IntNode (56, n.getNext()));

Page 50: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

50

פתרון למגבלות המערך

שתי המגבלות של המערך אינן קיימות בהכנסה לשרשרת החוליות:

– ניתן להכניס מספר לא מגבלת המקום1.

מוגבל של חוליות – לא נדרשות הזזות ימינה כדי לאפשר סיבוך2.

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

הסדר הרצוי

Page 51: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

51

הוצאת חוליה משרשרת חוליות

IntNode temp = n.getNext();

n.setNext (temp.getNext());

temp.setNext (null);

IntNode IntNodeIntNoden

4

info next

7

info next

null 5

info next

null

temp

Page 52: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

52

מעבר על שרשרת החוליות

תבנית של קטע קוד לסריקה מלאה של שרשרת חוליות:

IntNode pos = chain;

while (pos != null)

}

// pos.getInfo()

pos = pos.getNext();

{

ביצוע פעולה עם החוליה ערך

Page 53: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

53

סכום ערכי החוליות

int sum = 0;IntNode pos = chain;while (pos != null)}

sum = sum + pos.getInfo();pos = pos.getNext();

{

IntNode

7info next

IntNode

5info next

null

IntNode

4info next

chain

possum

0

sum

4

possum

11

possum

16

pos

null

Page 54: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

54

שרשרת חוליות כפרמטר לפעולות

public static int getChainSum (IntNode chain)}

int sum = chain.getInfo();while (chain.getNext() != null)}

chain = chain.getNext();sum = sum + chain.getInfo();

{

return sum;{

בסוף הלולאה ? chainמה קורה עם

האם איבדנו הפנייה לחוליה הראשונה?

Page 55: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

55

זימון הפעולה

נתונה שרשרת חוליות המוחזקת על ידי המשתנה myChain :

: )..(getChainSumנזמן את הפעולה

int totalSum = getChainSum )myChain( ;

נזכיר כי כותרת הפעולה היא:

public static int getChainSum )IntNode chain(

4 7 5 nullmyChain

chain אחרי זימון הפעולה נוצר chain משתנה מקומי

Page 56: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

56

public static IntNode getChainOf (IntNode chain, int x)} while (chain != null) } if(chain.getInfo()== x) return chain; chain = chain.getNext(); {return chain;{

שרשרת חוליות כפרמטר לפעולות

בסוף הפעולה ? chainמה קורה עם

מה מחזירה הפעולה – חוליה או הפניה?

Page 57: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

57

זימון הפעולה

: myChainנתונה שרשרת חוליות המוחזקת על ידי המשתנה : (..)getChainOfנזמן את הפעולה

נזכיר כי כותרת הפעולה היא: public static IntNode getChainOf (IntNode chain, int x)

IntNode newChain=getChainOf)myChain,10);

myChain=getChainOf)myChain,10);

myChain=new IntNode)getChainOf)myChain,10((;

ציינו האם ההוראה חוקית? אם כן מה היא מבצעת .

Page 58: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

58

שרשרת חוליות – מה זה בעצם?

שרשרת חוליות היא שרשור של עצמים מטיפוס חוליה

עצםאינהשרשרת חוליות של עצמיםמבנהשרשרת חוליות היא

ריקהיכולה להיות אינה שרשרת חוליותאת זה צריך להפנים ולעכל...

אבל ההפניה לשרשרת חוליות יכולה להיות שווהnull

וזה לא זהה לאמירה שהשרשרת ריקה! :ולכן – הנחה סמויה

nullשרשרת העוברת כפרמטר אינה שווה

Page 59: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

59

הכנסת ערך לשרשרת חוליות ממוינת

נתונה שרשרת ממוינת:

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

public static void insertIntoSortedChain (IntNode chain, int x)}

...{

נזמן את הפעולה: insertIntoSortedChain (myChain, 6)

4 5 7 nullmyChain

chain

Page 60: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

60

insertIntoSortedChain (myChain, 6)ביצוע הזימון

: הפעולה ביצוע בעת

chain

4 5 7 nullmyChain

4 5 7 nullmyChain

chain 6

לא עבר שינוי. myChainהמשתנה

האם זה טוב?

לאחר איתור מקום ההכנסה, הפעולה יוצרת חוליה חדשה , ומכניסה אותה למקום הנכון בשרשרת 6המכילה את הערך

החוליות:

Page 61: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

61

insertIntoSortedChain (myChain, 2)ביצוע הזימון

בעת ביצוע הפעולה:

לאחר איתור מקום ההכנסה, הפעולה יוצרת חוליה חדשה המכילה את בשרשרת החוליות:הראשון, ומכניסה אותו למקום 2הערך

chain

4 5 7 nullmyChain

4 5 7 nullmyChain

chain

2 גם עכשיו המשתנה myChain !לא עבר שינוי

Page 62: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

62

public static IntNode getMaxPosition (IntNode pos)}

IntNode maxPos = pos; pos = pos.getNext();while(pos != null)} if(pos.getInfo() > maxPos.getInfo())maxPos = pos; pos = pos.getNext();{return maxPos;

{

מציאת מקומו של ערך מקסימאלי בקטע של שרשרתחוליות:

במסגרת ההנחות המובנות מאליהן – בשרשרת החוליות!מקום הוא pos אין סיבה להגיד ש-

הנחות סמויות בשרשרת חוליות

Page 63: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

63

public static int getMaxPosition (IntNode pos)}

IntNode maxPos = pos; pos = pos.getNext();while (pos != null)}if (pos.getInfo() > maxPos.getInfo())maxPos =

pos;pos = pos.getNext();{return maxPos.getInfo();

{

ביותר החל במקום מסוים בשרשרת הערך הגדולמציאת חוליות:

הנחות סמויות בשרשרת חוליות

posגם כאן אין סיבה להגיד ש- בשרשרת החוליות!מקוםהוא

Page 64: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

64

public static int GetChainSum (IntNode chain)}

int sum = 0;while (chain != null)}

sum = sum + chain.getInfo();chain = chain.getNext();

{

return sum;{

האם אנחנו נסוגים מההנחות שלנו?

הנחות סמויות בשרשרת חוליות

Page 65: עיצוב תוכנה מבוסס עצמים  מורים מובילים תשס"ח

"השתלמות ב-"עיצוב תוכנה מבוסס עצמים2008תשמ"ח –

באר-שבע

65

שעורי בית

שעורי בית לשלוח ליבגני קנל :1.

[email protected]

.7קראו ביסודיות פרק 2.

ממשו את ספר הטלפונים בעזרת שרשרת 3.15.03.08חוליות. תאריך הגשה

לילה טוב ולהתראות במפגש הבא