ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 1 από 8. Βασίλης Χριστοφίδης

Σχετικά έγγραφα
Περιεχόµενα. 1 Εισαγωγή στις οµές εδοµένων 3. 2 Στοίβα (Stack) 5

Βασίλης Χριστοφίδης Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 21 Σεπτεµβρίου 2012

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

HY-252 Αντικειμενοστραφής Προγραμματισμός. Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης. Ημερομηνία Παράδοσης: 16/11/2012

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

ΕΞΑΙΡΕΣΕΙΣ. Εξαιρέσεις προκαλούνται. από το σύστηµα. από το πρόγραµµα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Βασικές Έννοιες Δοµών Δεδοµένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

Πρόγραµµα 9.1 Πέρασµα δεδοµένων στην µνήµη

Δομές Δεδομένων & Αλγόριθμοι

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Week. 6: Java Collections

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειµενοστρεφής Προγραµµατισµός

ΕΠΛ 012. JavaScripts

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

public class ArrayStack implements Stack {

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Μέθοδοι που επιστρέφουν αντικείμενα Deep and Shallow Copies

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Δομές Δεδομένων & Ανάλυση Αλγορίθμων. 3ο Εξάμηνο. Ουρά (Queue) Υλοποίηση της με τη βοήθεια πίνακα.

Διάλεξη 06: Συνδεδεμένες Λίστες & Εφαρμογές Στοιβών και Ουρών

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

Διάλεξη 07: Λίστες Ι Υλοποίηση & Εφαρμογές

Βασικά της γλώσσας JAVA

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής T.E.I. ΘΕΣΣΑΛΟΝΙΚΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 17/1/08

2.1 Αντικειµενοστρεφής προγραµµατισµός

Απλές Δοµές Δεδοµένων Στην ενότητα αυτή θα γνωρίσουµε ορισµένες απλές Δοµές Δεδοµένων και θα τις χρησιµοποιήσουµε για την αποδοτική επίλυση του προβλή

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι String Interning

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Αντικειμενοστρεφής Προγραμματισμός

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

Δομές ελέγχου ροής προγράμματος

Αντικειμενοστρεφής Προγραμματισμός

Oι βασικές πράξεις (λειτουργίες) που ορίζονται για τον τύπο στοίβα αναφέρονται παρακάτω:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

4 Συλλογές Αντικειμένων

public class ArrayQueue implements Queue {

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 18/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πολυμορφισμός Αφηρημένες κλάσεις Interfaces (διεπαφές)

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 7: Πίνακες (Arrays)

ΕΠΛ131 Αρχές Προγραμματισμού

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

Week 7: Java Collection Classes

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Δομές Δεδομένων (Data Structures)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εξαιρέσεις

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Εισαγωγή στον Προγραμματισμό

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα

Διάλεξη 20: Αναδρομή (Recursion) Διδάσκων: Παναγιώτης Ανδρέου

Κλάσεις στη Java. Παύλος Εφραιμίδης. Java Κλάσεις στη Java 1

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

Κλάσεις στη Java. Στοίβα - Stack. Δήλωση της κλάσης. ΗκλάσηVector της Java. Ηκλάση Stack

6. Εξαιρέσεις στη γλώσσα Java

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ. Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΠΛ 133: ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΕΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΕΡΓΑΣΤΗΡΙΟ 3 Javadoc Tutorial

ΗΥ-150. Πίνακες (Arrays)

Διδάσκων: Παναγιώτης Ανδρέου

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ & ΑΛΓΟΡΙΘΜΟΙ ΕΡΓΑΣΤΗΡΙΟ

Κατασκευαστές. Μέθοδοι Κατασκευής (Constructors).

Διάλεξη 14: Δομές Δεδομένων ΙΙI (Λίστες και Παραδείγματα)

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

Τύποι δεδομένων, τελεστές, μεταβλητές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

Ειδικά Θέματα Προγραμματισμού

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

Εισαγωγή στον Προγραμματισμό

υναµικές οµές εδοµένων (συν.) Στην ενότητα αυτή θα µελετηθούν τα εξής επιµέρους θέµατα:

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 19/5/2007

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Αντικειμενοστρεφής Προγραμματισμός

Χειρισµός Σφαλµάτων. Γρηγόρης Τσουµάκας. Τµήµα Πληροφορικής, Αριστοτέλειο Πανεπιστήµιο Θεσσαλονίκης. Έκδοση:

Βασικάχαρακτηριστικάτηςγλώσσας. Πίνακες, Έλεγχος Ροής και Βρόχοι

Transcript:

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 1 από 8 Πανεπιστήµιο Κρήτης Τµήµα Επιστήµης Υπολογιστών ΗΥ-252 Αντικειµενοστρεφής Προγραµµατισµός Βασίλης Χριστοφίδης Πρόοδος (3 ώρες) Ηµεροµηνία: 3 εκεµβρίου 2011 Άσκηση 1 Άσκηση 2 Άσκηση 3 Άσκηση 4 Άσκηση 5 Άσκηση 6 Σύνολο /12 /20 /10 /32 /12 /20 /106 Ονοµατεπώνυµο: Αριθµός Μητρώου: Άσκηση 1 (12 µονάδες) // Στατικοί και υναµικοί Τύποι Αντικειµένων Σας δίνονται οι ακόλουθοι ορισµοί κλάσεων: class S { class T extends S { class U extends S { class V extends U { Για κάθε µία από τις παρακάτω ερωτήσεις κυκλώστε την σωστή απάντηση: µπορεί να υπάρχει καµία, µία ή περισσότερες σωστές απαντήσεις. (α) (4 µονάδες) Ποιος είναι ο στατικός τύπος της µεταβλητής x στον παρακάτω κώδικα; S x = new V(); x = new U(); i) Object ii) S iii) T iv) U v) V ii (β) (4 µονάδες) Ποιος είναι ο δυναµικός τύπος της τιµής της µεταβλητής x µετά την εκτέλεση του παρακάτω κώδικα; S x = new V(); x = new U(); i) Object ii)s iii) T iv) U v) V iv (γ) (4 µονάδες) Ποιοι τύποι είναι υπερτύποι του δυναµικού τύπου µεταβλητής o; Object o = new U(); i) Object ii) S iii) T iv) U v) V i, ii and iv. We would also accept only i and ii, as the lecture notes don t specify that classes can be considered supertypes of themselves.

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 2 από 8 Άσκηση 2 (20 µονάδες) // Κατανόηση κώδικα Java Τι θα τυπωθεί στην στανταρ έξοδο µετά την εκτέλεση των παρακάτω προγραµµάτων Java; Αναφέρετε τυχόν λάθη. (α) (4 µονάδες) class A { int foo() { return 1; class B extends A { int foo() { return 2; class C extends B { int bar(a a) { return a.foo(); C x = new C(); System.out.println(x.bar(x)); 2 (β) (4 µονάδες) class A { int e = 1; class B extends A { int e = 2; class C extends B { int bar(a a) { return a.e; C x = new C(); System.out.println(x.bar(x)); 1 (γ) (12 µονάδες) class C { public void foo() { try { bar(); System.out.println("here in foo"); catch (RuntimeException e) { System.out.println("caught in foo"); public void bar() { try { baz(); catch (RuntimeException e) { System.out.println("caught in bar"); throw e; finally { System.out.println("here in bar"); System.out.println("there in bar"); public void baz() { try { if (true) throw new RuntimeException(); catch(runtimeexception e) { finally { System.out.println("here in baz"); System.out.println("there in baz"); public class Exn {

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 3 από 8 public static void main (String args[]) { (new C()).foo(); here in baz there in baz here in bar there in bar here in foo Άσκηση 3 (10 µονάδες) //Χειρισµός Συµβολοσειρών Οταν γράφουµε µια µαθηµατική έκφραση, ένα πρόγραµµα, ή ένα τεχνικό εγχειρίδιο, χρειαζόµαστε συχνά να ελέγχουµε εάν οι παρενθέσεις που χρησιµοποιούµε ταιριάζουν. Για παράδειγµα, θα θέλαµε να ελέγξουµε εάν στις παρακάτω συµβολοσειρές όλες οι παρενθέσεις που ανοίγουν επίσης κλείνουν (φυσικά και αντιστρόφως): ((3+5)-6)/2 int i = (temp + 2) / (j 6); γράφω µια πρόταση (η οποία περιέχει παρενθέσει ). (lambda (arg) (+ arg 1)) Κάτι τέτοιο δεν συµβαίνει στις παρακάτω συµβολοσειρές: (3 + 5) / (2 + 7 int i = (3 * (54 88); γράφω µια πρόταση µε µια µόνο παρένθεση (η οποία δεν κλείνει! (+ 3 (/ 5 8) (* 3 4) (3 + 5) / 4 ) ) 76 / 6 ( Υλοποιήστε µια µέθοδο Java η οποία παίρνει µια συµβολσειρά (String) σαν είσοδο και επιστρέφει αληθές (true) εάν όλες οι παρενθέσεις ταιριάζουν (δηλ για κάθε παρένθεση που ανοίγει υπάρχει µια παρένθεση που κλείνει), διαφορετικά ψευδές (false). public boolean parenthesesbalanced(string str) { int openparentheses = 0; for (int i = 0; i < str.length(); i++) { //for each character if (str.charat(i) == '(') { openparentheses++; //we just opened something new else if (str.charat(i) == ')') { if (openparentheses == 0) return false; //we closed without having anything open else openparentheses--; //we just closed an open parenthesis return openparentheses==0; //don't want parentheses not closed Άσκηση 4 (32 µονάδες) // Χειρισµός Πινάκων και Αναδροµικές Μέθοδοι Υλοποιήστε µια αναδροµική µέθοδο για την επίλυση του παρακάτω προβλήµατος διαµέρισης. εδοµένου ενός πολυ-συνόλου ακεραίων µας ενδιαφέρει η διαµέριση των στοιχείων του σε δύο πολυ-σύνολα έτσι ώστε το άθροισµα των ακεραίων σε κάθε µέρος να

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 4 από 8 είναι το ίδιο. Για παράδειγµα, το πολυ-σύνολο {3, 3, 5, 9, 2 µπορεί να διαµεριστεί στα {3, 3, 5 και {9, 2 (µε συνολικό άθροισµα 11 και για τα δύο µέρη), αλλά το πολυ-σύνολο {1, 5, 16 δεν µπορεί να διαµεριστεί. Σηµειώστε ότι τα δύο µέρη δεν χρειάζεται να έχουν το ίδιο πλήθος στοιχείων και ότι τόσο στο αρχικό όσο και στα παραγόµενα πολυ-σύνολα ακεραίων, ένα στοιχείο µπορεί να εµφανίζεται παραπάνω από µια φορές. α) (17 µονάδες) Υλοποιήστε την µέθοδο CanBePartitioned() η οποία παίρνει σαν παράµετρο έναν πίνακα ακεραίων προς διαµέριση και επιστρέφει αληθές ή ψευδές ανάλογα µε το εάν οι τιµές του πίνακα µπορούν να διαµεριστούν σύµφωνα µε την παραπάνω λογική. Θα χρειαστείτε για αυτό τον σκοπό να υλοποιήσετε και µια βοηθητική αναδροµική µέθοδο partition() η οποία διασχίζει τα στοιχεία του πίνακα ακεραίων που δίνεται σαν όρισµα και ελέγχει εάν η διαµέριση τους είναι δυνατή λαµβάνοντας υπόψη το τρέχον άθροισµα των ακεραίων της διαµέρισης σε κάθε βήµα της αναδροµής. boolean CanBePartitioned(int [] values) { return partition(values, 0, 0); //2 points boolean partition(int[] values, int pos, int sum) { if (pos >= values.length) return sum == 0; if (partition(values, pos+1, sum+values[pos])) return true; return partition(values, pos+1, sum-values[pos]); β) (5 µονάδες) Ποια είναι η ασυµπτωτική πολυπλοκότητα χείριστης περίπτωσης της µεθόδου partition() που υλοποιήσατε στο προηγούµενο ερώτηµα; O(2 n ) γ) (10 µονάδες) Σας δίνεται το παρακάτω πρόγραµµα: public static void main(string[] args) { int[] array = new int[]{1, 2, 3, 4; int[] clonearray = array.clone(); System.out.println(array == clonearray); System.out.println(array.equals(cloneArray)); System.out.println(myEquals(array, clonearray)); public static boolean myequals(int int[] array1, int[] array2) { for (int i = 0; i < array1.length; i++) { if (array1[i]!= array2[i]) { return false; return true; 1) (5 µονάδες) Τι θα εκτυπωθεί µετά την εκτέλεση του προγράµµατος; i) true true true, ii) false true true

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 5 από 8 iii) false false true iv) false false ArrayIndexOutOfBounds iii 2) (5 µονάδες) Σκοπός της µεθόδου myequals() είναι να συγκρίνει τα στοιχεία δύο πινάκων και να επιστρέφει αληθές (true) αν οι δύο πίνακες περιέχουν ακριβώς τα ίδια στοιχεία στις ίδιες θέσεις. Η µέθοδος αυτή δουλεύει σωστά για οποιουσδήποτε πίνακες ακεραίων; Αν όχι σε ποιες περιπτώσεις δε θα δούλευε σωστά; Πώς µπορεί να διορθωθεί το πρόβληµα αυτό; This method assumes that the two arrays have the same number of elements. A check about the length of the arrays should be added at the beginning of the method. if (array1.length!= array2.length) { return false; Άσκηση 5 (12 µονάδες) // Υλοποίηση Βασισµένη σε Συµβόλαια Σας δίνεται η ακόλουθη κλάση Java η οποία ικανοποιεί την αµετάβλητη συνθήκη (invariant condition): «Εάν ο πίνακας της µεταβλητής data είναι null ή ο πίνακας είναι κενός, η τιµή της µεταβλητής x θα πρέπει να είναι µηδέν. Στην αντίθετη περίπτωση η τιµή της µεταβλητής x θα πρέπει να ισούται µε την µεγαλύτερη τιµή του πίνακα.» 1 public class A { 2 private int x = 0; 3 private int[] data; 4 5 // update x to satisfy the invariant 6 private void updatex() { 7 if (data == null data.length == 0) { 8 x = 0; 9 else { 10 x = data[0]; 11 for (int i=1; i< data.length; i++) { 12 if (data[i] > x) { 13 x = data[i]; 14 15 16 17 18 19 public A(int[] d0) { 20 data = d0; 21 updatex(); 22 23 24 // increment all values in the array 25 public void incr() { 26 for (int i = 0; i < data.length; i++) { 27 data[i] = data[i] + 1; 28 29 updatex(); 30 31 32

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 6 από 8 (α) (4 µονάδες) Είναι δυνατό ένας κώδικας πελάτης να προκαλέσει την δηµιουργία µιας εξαίρεσης κατά την εκτέλεση του κώδικα αυτής της κλάσης; Σε ποιά γραµµή του κώδικα της κλάσης θα εγερθεί (throw) η εξαίρεση; Ποιες εντολές θα δηµιουργήσουν αυτή την εξαιρετική κατάσταση λειτουργίας του προγράµµατος; The problem is at line 26, at the use of data.length. A NullPointerException could be thrown with the call new A(null).incr(); (β) (8 µονάδες) Είναι δυνατό ένας κώδικας πελάτης να παραβιάσει την αµετάβλητη συνθήκη χωρίς να δηµιουργεί µια εξαίρεση; Ποια ακολουθία εντολών θα µπορούσε να προκαλέσει αυτό το πρόβληµα; The invariant could be violated by changing the data array after the object was created through an alias. int data[] = { 1 ; A a = new A(data); data[0] = 500; Άσκηση 6 (20 µονάδες) // Αφαιρετικοί Τύποι εδοµένων (ΑΤ ) Σχεδιάστε και υλοποιήστε τον Αφαιρετικό Τύπο εδοµένων (ΑΤ ) µιας αυτοδιοργανωµένης συνδεδεµένης λίστας (Self Self-Organizing List). Μία τέτοια λίστα έχει την ιδιότητα να αναδιοργανώνει τα στοιχεία της ανάλογα µε την συχνότητα αναζήτησης τους µεταθέτoντάς τα στην αρχή της λίστας. ώστε τις υπογραφές (signatures), το είδος ανάλογα µε την επίδραση που έχουν στην κατάσταση των αντικειµένων (constructors, accessors, transformers), και τις εκ των προτέρων, τις εκ των υστέρων και τις αµετάβλητες συνθήκες (preconditions, postconditions, invariants) που διέπουν τις παρακάτω λειτουργίες στο συµβόλαιο του ΑΤ Self-Organizing List: SelfOrganizedList(): ηµιουργία µιας κενής αυτό-διοργανωµένης συνδεδεµένης λίστας void add(object o): Εισαγωγή ενός αντικειµένου στην λίστα boolean remove(object o): ιαγραφή ενός αντικειµένου από την λίστα int size(): Επιστροφή του µεγέθους της λίστας Object find(object o): Αναζήτηση και επιστροφή ενός στοιχείου της λίστας Σηµασιολογία Η εισαγωγή ενός στοιχείου στην λίστα γίνεται µε το σύνηθες τρόπο, δηλαδή εισαγωγή στο τέλος της λίστας. Με το σύνηθες τρόπο γίνεται και η διαγραφή, δηλαδή αφαιρείται το στοιχείο και γίνονται οι απαραίτητες ανανεώσεις των δεικτών της λίστας. Η αναζήτηση ενός στοιχείου γίνεται ξεκινώντας από την κεφαλή της λίστας και ακολουθώντας τους δείκτες στα επόµενα στοιχεία µέχρι ωσότου βρεθεί αυτό που αναζητούµε. Σε µια αυτο-διοργανωµένη λίστα, κάθε φορά που γίνεται µια επιτυχής αναζήτηση ενός στοιχείου, το ανευρεθέν στοιχείο µεταφέρεται στην αρχή της λίστας. Αυτή η στρατηγική, µετά από πολλές επαναλήψεις της µεθόδου της αναζήτησης τείνει στο να φέρνει τα πιο δηµοφιλή στοιχεία στην κεφαλή της λίστας, ενώ τα µη-δηµοφιλή καταλήγουν στην ουρά της.

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 7 από 8 Βοήθεια: Η υλοποίηση του ΑΤ Self-Organizing List θα πρέπει να βασιστεί στην διεπαφή της κλάσης Vector που περιλαµβάνει µεθόδους όπως η add(), remove(),indexof() και size(). public class SelfOrganizedList { private java.util.vector vector; * Constructs a new SelfOrganizedList. * Method_signature: SelfOrganizedList<br> * -<br> * creates a new valid instance of SelfOrganizedList. */ // 1 point public SelfOrganizedList() { vector = new java.util.vector(); //2 points /* transformers - mutative */ * Inserts the specified object in this SelfOrganizedList. * Method_signature: void_add_object<br> * -<br> * the specified object is inserted to the SelfOrganizedList. * @param o object to be inserted. */ // 1 point public void add(object o) { vector.add(o); // 2 points * Removes the specified object of this SelfOrganizedList. * Method_signature: boolean_remove_object<br> * Object o is a valid instance<br> * the specified object is removed from the SelfOrganizedList. * @param o object to be removed. * @return true if the SelfOrganizedList contained the object */ // 1 point public boolean remove(object o) { return vector.remove(o); // 2 points /* accessors */ * Returns the size of this SelfOrganizedList. * Method_signature: int_size<br> * this is a valid instance of SelfOrganizedList<br> * returns the size of this SelfOrganizedList * @return the size of this SelfOrganizedList */ // 1 point public int size() {

ΗΥ252 Πρόοδος 3 εκεµβρίου 2011 Σελίδα 8 από 8 return vector.size(); // 2 points * Finds the specified object in this SelfOrganizedList. * If the specified object is found, it is moved to the * beginning of the SelfOrganizedList and returned.<br> * Method_signature: Object_find_Object<br> * this is a valid instance of SelfOrganizedList<br> * returns the specified object if found and moved to the * beggining of this SelfOrganizedList. * @param o the object to be founded. * @return the object if found, null otherwise */ public Object find(object o) { int index = vector.indexof(o); if (index == -1) { return null; Object foo = vector.remove(index); vector.add(0, foo); return foo; // 6 points