35
1 מבוא למדעי המחשב תרגול7 תכנות מונחה עצמים מבוא למדעי המחשב2020

2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

מבוא למדעי המחשב1

7תרגול תכנות מונחה עצמים

2020מבוא למדעי המחשב

Page 2: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

ראינו בהרצאה

:תכנות מונחה עצמים•מחלקה ואובייקט•

בנאים ושיטות, שדות•

מערך דינאמי•

מערך של ראשוניים: שימוש-

רשימות מקושרות•

Page 3: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

הוספת שיטות–מערך דינאמי •

הוספת שיטות–רשימה מקושרת •

בתרגול היום

©2020מבוא למדעי המחשב 3

Page 4: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

.בהגדרת מחלקה אנו מגדירים טיפוס מסוג חדש בשפה•

י המילה "ונוצר ע, instanceנקרא ( כלשהי)מופע של מחלקה •.newהשמורה

.בנאים ושיטות, קוד המחלקה כולל שדות•

Class-מחלקה

Page 5: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

DynamicArrayמימוש

בנאים

public class DynamicArray {// -------------------- constants --------------------private static final int DEFAULT_CAPACITY = 16;// -------------------- fields --------------------private Object[] data;private int size;private int incrementSize;// -------------------- constructors ------------------public DynamicArray(int initialCapacity){ ... }

//constructs an empty DynamicArraypublic DynamicArray(){

this(DEFAULT_CAPACITY);}// -------------------- methods --------------------public int size(){

return size; }public void add(Object element){ ... }

public Object get(int index){ ... }...

}

שיטות

ניזכר במערך הדינאמי •שראינו בשיעור

שדות

Page 6: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

לבדיקת חוקיותעזר-שיטות

// ensures that data has the capacity to hold additional elementsprivate void ensureCapacity(){ . . .}

// returns true iff the given index is in rangeprivate boolean rangeCheck(int index) {. . .}

.המשתמשאתלא,בלבדהמתכנתאתמעניינות–פרטיותשיטות

Page 7: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

public static void main(String[] args) {DynamicArray myArray = new DynamicArray(10);

}

?מה יקרה לאחר ביצוע השורה הבאה •

האובייקטמבנה

Type Name Value

DynamicArray myArray

טיפוס י הפעלת הבנאי"יצירת מופע ע

size() get(int)add(Object)

DynamicArraymainטבלת המשתנים של הפונקציה

myArrayשדות המחלקה של האובייקט

שיטות המחלקה myArrayשל האובייקט

שם

datasize = 0incrementSize = 10

Page 8: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

public class Test {

}

.מאפשר גישה לשדות ושיטות של האובייקט–' .'אופרטור השייכות •

:לדוגמא•

'.'אופרטור

public static void main(String[] args) {DynamicArray myArray = new DynamicArray(10);System.out.println(myArray.size());

}

//0

myArray.add(8);myArray.add(5);System.out.println(myArray.size()); //2

Object[] a = myArray.data; //compilation error

int a = myArray.size; //compilation error

public class DynamicArray {// -------constants-------private static final int DEFAULT_CAPACITY = 16;// -------fields-------private Object[] data;private int size;private int incrementSize;

// -------constructors-------... ... ...// -------methods-------public int size(){ return size; }

public void add(Object element){ ... } ... ... ...

Page 9: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:הראשונה. נוסיף שיטות עבור מערך דינאמי•

•set(int i, Object element)–השמת איברelement במקוםi.קודם לכןi-במערך והחזרת הערך שהיה במקום ה

שיטות נוספות

Page 10: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

set–שיטות נוספות

76284

710284

int x = myArray.set(3, 10);

myArray:הבא( Integersשל מערך דינאמי)נתון האובייקט •

?mainבפונקציית מה יקרה לאחר ביצוע הפקודה הבא •

// x = 6

myArray

Page 11: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

set–שיטות נוספות //replace element in the array with element//return the previous element.public Object set(int index, Object element){

}

Object prev = data[index];data[index] = element;return prev;

// throws an exception if the given index is not in rangif(!rangeCheck(index))

throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size());if(element == null)

throw new IllegalArgumentException(“…”);

Page 12: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:שיטה נוספת עבור מערך דינאמי•

•insert(int i, Object element)–הכנסת איבר במיקום ה-i תוך.i-הזזה ימינה של כל אברי המערך החל מ

שיטות נוספות

Page 13: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

insert–שיטות נוספות

myArray.insert(3, 10);

7610284

?mainבפונקציית מה יקרה לאחר ביצוע הפקודה הבאה •

myArray

76284 myArray:הבא( Integersשל מערך דינאמי)נתון האובייקט •

Page 14: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

insert–שיטות נוספות //insert an element in the array, size increase by 1public void insert(int index, Object element){

}

// throws an exception if the given index is not in rangeif(!rangeCheck(index))

throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size());if(element == null)

throw new IllegalArgumentException(“…”);

for (int i = size(); i >= index + 1; i = i - 1){data[i] = data[i-1];

}data[index] = element;

size = size + 1;ensureCapacity();

Page 15: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:עוד שיטה עבור מערך דינאמי•

•isTheSame(DynamicArray other)– השוואה בין שני מופעים של.המחלקה

שיטות נוספות

Page 16: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

isTheSame–שיטות נוספות

public static void main(String[] args) {

DynamicArray a1 = new DynamicArray(5);

DynamicArray a2 = new DynamicArray(8);

}

System.out.println(a1.isTheSame(a2)); // true

a2.add(2);

System.out.println(a1.isTheSame(a2)); // false

System.out.println(a1.isTheSame(a2)); // true

a1.add(56);

a2.add(56);

Page 17: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

isTheSame-שיטות נוספות

public boolean isTheSame(DynamicArray other) {

}

boolean isEqual = (other != null && size() == other.size()); for (int i = 0; isEqual & i < size(); i = i + 1){

}

return isEqual;

isEqual = get(i).equals(other.get(i));

Page 18: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל
Page 19: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

רשימות מקושרות

©2020מבוא למדעי המחשב 19

Page 20: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

?איך נראית רשימה מקושרת

nullfirst

datanext

link

Object

datanext

link

Object

datanext

link

Object

datanext

link

Object

nullfirst ?איך נראית רשימה מקושרת ריקה

Linkהשדות שלLinkedListהשדות של

LinkedList, Linkהמחלקות –תזכורת

Page 21: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

Public class Link {

// ------------- fields -----------

private Object data;

private Link next;

// ------------- constructors -----------

public Link (Object data) {

this(data, null);

}

public Link (Object data, Link next) {

this.data = data;

this.next = next;

}

Linkהמחלקה –תזכורת // ------------- methods -----------

public Object getData() {

return data;

}

public Link getNext() {

return next;

}

public void setNext(Link next) {

this.next = next;

}

public void setData(Object data) {

this.data = data;

}

public String toString(){

return data.toString();

}

} //end class Link

שדות

בנאים

שיטות

Page 22: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

public class LinkedList {

// ------------- field -----------

private Link first;

// ------------- constructor ----------

public LinkedList () { first = null;}

// ------------- methods -----------

public boolean isEmpty(){

return first == null;

}

public void addFirst(Object element) {

if(element == null)

throw new IllegalArgumentException(“…”);

if (isEmpty())

first = new Link(element);

else

first = new Link(element, first);

}

LinkedListהמחלקה –תזכורת

public String toString(){…}

public Object get(int index){…}

public boolean contains(Object element){…}

public boolean remove(Object element){…}

private boolean rangeCheck(int index){…}

} //end class LinkedList

שדה

בנאי

שיטות

שיטות

Page 23: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:הראשונה. LinkedListנוסיף שיטות למחלקה •

• set(int index, Object element)

.indexבתוך חוליה מספר elementהשיטה ממקמת את האובייקט

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

שיטות נוספות

23

Page 24: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

set–שיטות נוספות

24

4 8 6 5 7 2 null

4 8 6 1 7 2 null

// this line appears in some main function// assume the linkedlist is named myListmyList.set(3, 1);

Returns 5

set(int index, Object element);

.index-והחזרת הערך הקודם שהיה במקום ה, ברשימהindex-למקום ה elementהכנסת האיבר

Page 25: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

set–שיטות נוספות // replaces the element at the specified position in this list with the specified element// throws IllegalArgumentException - if the specified element is null// throws IndexOutOfBoundsException if the index is out of range // (index < 0 || index >= size())public Object set(int index, Object element){

if(!(rangeCheck(index)))throw new IndexOutOfBoundsException("Index: " + index + ", Size: " + size());

if(element == null)

throw new IllegalArgumentException(“…”);

Link current = first;while (index > 0) {

index = index - 1;current = current.getNext();

}Object prev = current.getData();current.setData(element);return prev;

}

public class Link {// -------fields-------private Object data;private Link next;// -------constructors-------... ... ...// -------methods-------public Object getData() {…}public Link getNext() {…}public void setNext(Link next) {…}public void setData(Object data) {…}...

public class LinkedList {// -------fields-------private Link first;// -------constructor-------... ... ...// -------methods-------public boolean isEmpty(){…}public void addFirst(Object element) {…}

public void remove(Object toRemove){…}public String toString(){…}public Object get(int index){…}public boolean contains(Object element){…}public Object remove(Object element){…}private boolean rangeCheck(int index){…}...

Page 26: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:LinkedListעוד שיטה שנוסיף למחלקה •

• indexOf(Object element)

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

.-1השיטה תחזיר , ל"אם אין אובייקט כנ

שיטות נוספות

26

Page 27: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

indexOf–שיטות נוספות

27

4 5 6 5 7 2 null

myList.indexOf(5);

indexOf(Object element);.אם הוא לא נמצא ברשימה1-או elementהחזרת האינדקס בו נמצא המופע הראשון של

//1

myList.indexOf(8); //-1

// these lines appear in some main function// assume the linkedlist is named myList

Page 28: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

indexOf–שיטות נוספות

28

// returns the index of the first occurrence of the specified element in this list, // or -1 if// this list does not contain the element.public int indexOf(Object element){

if(element == null)throw new IllegalArgumentException(“…”);

int output = -1;int index = 0;for(Link curr = first; curr != null & output == -1; curr = curr.getNext()) {

if( curr.getData().equals(element) )output = index;

elseindex = index + 1;

}return output;

}

public class Link {// -------fields-------private Object data;private Link next;// -------constructors-------... ... ...// -------methods-------public Object getData() {…}public Link getNext() {…}public void setNext(Link next) {…}public void setData(Object data) {…}...

public class LinkedList {// -------fields-------private Link first;// -------constructor-------... ... ...// -------methods-------public boolean isEmpty(){…}public void addFirst(Object element) {…}

public void remove(Object toRemove){…}public String toString(){…}public Object get(int index){…}public boolean contains(Object element){…}public Object remove(Object element){…}private boolean rangeCheck(int index){…}...

Page 29: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:LinkedListעוד שיטה שנוסיף למחלקה •

• add(int index, Object element)

.index השיטה מוסיפה איבר לרשימה למקום

שיטות נוספות

29

Page 30: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

add1–שיטות נוספות

30

4 8 6 5 7 2 null

myList.add(3, 1);

4 8 6 5 7 2 null1

add(int index, Object element);.index-תוך הזזה ימינה של כל אברי הרשימה החל מindex-למקום הelementהכנסת האיבר

// this line appears in some main function// assume the linkedlist is named myList

Page 31: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

// inserts the specified element at the specified position in this list// throws IllegalArgumentException - if the specified element is null// throws IndexOutOfBoundsException if the index is out of range (index < 0 || index >= size())

public void add(int index, Object element) {if(!(rangeCheck(index)))

throw new IndexOutOfBoundsException("Index: “+ index + ", Size: " + size());

if(element == null)throw new IllegalArgumentException(“…”);

if(index == 0)addFirst(element);

else {Link prev = null ;Link curr = first ;for(int i = 0; i < index; i = i + 1) {

prev = curr;curr = curr.getNext();

}Link toAdd = new Link(element, curr);prev.setNext(toAdd);

}}

add1–שיטות נוספות

31

public class Link {// -------fields-------private Object data;private Link next;// -------constructors-------... ... ...// -------methods-------public Object getData() {…}public Link getNext() {…}public void setNext(Link next) {…}public void setData(Object data) {…}...

public class LinkedList {// -------fields-------private Link first;// -------constructor-------... ... ...// -------methods-------public boolean isEmpty(){…}public void addFirst(Object element) {…}

public void remove(Object toRemove){…}public String toString(){…}public Object get(int index){…}public boolean contains(Object element){…}public Object remove(Object element){…}private boolean rangeCheck(int index){…}...

Page 32: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:LinkedListעוד שיטה שנוסיף למחלקה •

• add(Object element)

.השיטה מוסיפה איבר לסוף הרשימה

שיטות נוספות

32

Page 33: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

add2–שיטות נוספות

33

4 8 6 5 7 2 null

add(2);

4 8 6 5 7 2 null2

add(Object element);.הוספת איבר לסוף הרשימה

// this line appears in some main function// assume the linkedlist is named myList

Page 34: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

add2–שיטות נוספות // appends the specified element to the end of this list// throws IllegalArgumentException - if the specified element is null

public boolean add(Object element) {if(element == null)

throw new IllegalArgumentException(“…”);if(isEmpty())

first = new Link(element);else {

Link current = first;while(current.getNext() != null){

current = current.getNext(); {

current.setNext(new Link(element));}return true;

}

34

public class Link {// -------fields-------private Object data;private Link next;// -------constructors-------... ... ...// -------methods-------public Object getData() {…}public Link getNext() {…}public void setNext(Link next) {…}public void setData(Object data) {…}...

public class LinkedList {// -------fields-------private Link first;// -------constructor-------... ... ...// -------methods-------public boolean isEmpty(){…}public void addFirst(Object element) {…}

public void remove(Object toRemove){…}public String toString(){…}public Object get(int index){…}public boolean contains(Object element){…}public Object remove(Object element){…}private boolean rangeCheck(int index){…}...

Page 35: 2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה יעדמל אובמ 7 לוגרת םימצע החנומ תונכת 2020 בשחמה יעדמל

:ראינו היום בתרגול•תכנות מונחה עצמים•

שיטות נוספות עבור מערך דינאמי•

רשימות מקושרות•

:משימות•20.12להגשה עד 3עבודה •

7תרגילון •

סיכום ומשימות