2020 בשחמה יעדמל אובמintro201/wiki.files/ps7_201.pdf · 2019-12-11 · בשחמה...

Post on 18-Mar-2020

0 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

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

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

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

ראינו בהרצאה

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

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

מערך דינאמי•

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

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

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

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

בתרגול היום

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

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

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

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

Class-מחלקה

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){ ... }...

}

שיטות

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

שדות

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

// 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) {. . .}

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

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

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){ ... } ... ... ...

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

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

שיטות נוספות

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

76284

710284

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

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

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

// x = 6

myArray

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(“…”);

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

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

שיטות נוספות

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

myArray.insert(3, 10);

7610284

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

myArray

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

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

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

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

שיטות נוספות

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

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

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

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

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

nullfirst

datanext

link

Object

datanext

link

Object

datanext

link

Object

datanext

link

Object

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

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

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

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

שדות

בנאים

שיטות

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

שדה

בנאי

שיטות

שיטות

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

• set(int index, Object element)

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

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

שיטות נוספות

23

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הכנסת האיבר

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){…}...

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

• indexOf(Object element)

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

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

שיטות נוספות

26

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

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){…}...

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

• add(int index, Object element)

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

שיטות נוספות

29

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

// 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){…}...

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

• add(Object element)

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

שיטות נוספות

32

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

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){…}...

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

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

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

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

7תרגילון •

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

top related