Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
מבוא למדעי המחשב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תרגילון •
סיכום ומשימות