ΗΥ-252 Αντικειµενοστραφής Προγραµµατισµός Βασίλης Χριστοφίδης

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

public class ArrayStack implements Stack {

Mεταβλητές (variables) και Σταθερές (constants)

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

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

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

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

ΗΥ-252 Οντοκεντρικός Προγραµµατισµός Βασίλης Χριστοφίδης. Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 12 Σεπτεµβρίου 2002

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

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

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

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

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

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Έλεγχος ισότητας String Interning Αποαναφοροποίηση - dereferencing

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

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

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

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

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

Δομές Δεδομένων - Εργαστήριο 2. Λίστες

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

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

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

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

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

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

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

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

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

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

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

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

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

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

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

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

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

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

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

API: Applications Programming Interface

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

CSD Univ. of Crete Φθινόπωρο Άσκηση 1 Εκφώνηση

public class ArrayQueue implements Queue {

Διασυνδέσεις / Διεπαφές. Παναγιώτης Σφέτσος, PhD

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

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

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

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

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

Εργαστήριο 02: Προγραμματισμός με Γενικούς Τύπους (JAVA Generics) ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι

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

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

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

Εξαιρέσεις (στη Java)

Δομές Δεδομένων. Δημήτρης Μιχαήλ. Υλοποίηση Δυαδικού Σωρού σε γλώσσα Java. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Από τη UML στον Κώδικα. Μέρος Α

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

Εξαιρέσεις στη Java. Περιεχόμενα. Κάποιες προκαθορισμένες ρ εξαιρέσεις. Κωστής Σαγώνας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

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

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

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

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

Συλλογές, Στοίβες και Ουρές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Δομές Δεδομένων. Ιωάννης Γ. Τόλλης Τμήμα Επιστήμης Υπολογιστών Πανεπιστήμιο Κρήτης

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

ΗΥ-252 Αντικειμενοστρεφής Προγραμματισμός Βασίλης Χριστοφίδης

Τμήμα Πολιτικών Μηχανικών και Μηχανικών Περιβάλλοντος ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής, :00-10:00 π.μ.

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Week. 6: Java Collections

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

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

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

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

Διάλεξη 05: Αφηρημένοι Τύποι Δεδομένων

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

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 5. Αφηρημένοι Τύποι Δεδομένων / Στοίβες και Ουρές

Λογισµικό (Software SW) Γλώσσες

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

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

Ορισµός Νήµα (thread) είναι µια ακολουθιακή ροή ελέγχου (δηλ. κάτι που έχει αρχή, ακολουθία εντολών και τέλος) σ ένα

Transcript:

Πανεπιστήµιο Κρήτης Τµήµα Επιστήµης Υπολογιστών ΗΥ-252 Αντικειµενοστραφής Προγραµµατισµός Βασίλης Χριστοφίδης Ονοµατεπώνυµο: Αριθµός Μητρώου: Τελική Εξέταση (3 ώρες) Ηµεροµηνία: 28 Ιανουαρίου 2005 Άσκηση 1 (10 µονάδες) Τι τυπώνεται στην έξοδο του παρακάτω προγράµµατος Java; public class ExceptionQuestion { public static void main(string args[]) { m1(15); m1(123); m1(17); m1(110); // end main public static void m1(int n) { try { m2(n); catch (NullPointerException e) { System.out.println("C" + n); catch (NumberFormatException e) { System.out.println("D" + n); // end m1 public static void m2(int x) throws NullPointerException{ try { if (x % 5 == 0) throw new NullPointerException(); if (x > 100) throw new NumberFormatException(); System.out.println("A" + x); catch (NumberFormatException e) { throw new NullPointerException(); catch (NullPointerException e) { System.out.println("B" + x); // end m2 // end class ExceptionQuestion Σηµείωση: Οι εξαιρέσεις NullPointerException και NumberFormatException είναι και οι δύο υποκλάσεις της RuntimeException. Καµία από τις δύο δεν είναι υποκλάση της άλλης. B15 C123 A17 B110

Άσκηση 2 (15 µονάδες) Υποθέστε ότι έχετε µια στοίβα astack και µια βοηθητική κενή στοίβα auxstack. είξτε πώς µπορείτε να υλοποιήσετε σε µορφή ψευδοκώδικα κάθε µια από τις παρακάτω λειτουργίες χρησιµοποιώντας µόνο το συµβόλαιο (δηλ. τις µεθόδους) του ΑΤ (ADT) στοίβα, που σας έχει δοθεί στις διαλέξεις του µαθήµατος (push(), pull()): 1. (5 µονάδες) Τυπώστε τα στοιχεία της στοίβας astack σε αντίστροφη σειρά, δηλ. εµφανίστε τελευταία την οροφή (top) της στοίβας. 2. (5 µονάδες) Μετρήστε τον αριθµό των στοιχείων της στοίβας astack, αφήνοντας την κατάσταση της astack αµετάβλητη. 3. (5 µονάδες) ιαγράψτε όλες τις εµφανίσεις ενός συγκεκριµένου στοιχείου somevalue από την astack, αφήνοντας αµετάβλητη τη σειρά των υπόλοιπων στοιχείων της στοίβας. Σηµείωση: Μπορείτε να θεωρήσετε ότι τα στοιχεία της στοίβας είναι του τύπου StackItemType. 1 StackItemType val; while (!astack.isempty()) { if (astack.pop(val)) auxstack.push(val); while(!auxstack.isempty()) { if (auxstack.pop(val)) { System.out.println(val); astack.push(val); 2 StackItemType val; int count = 0; while (!astack.isempty()) { if (astack.pop(val)) { auxstack.push(val); count++; while (!auxstack.isempty()) { if (auxstack.pop(val)) astack.push(val); 3 StackItemType val, todelete = somevalue; while (!astack.isempty()) { if (astack.pop(val)) if (val!= todelete) auxstack.push(val); while (!auxstack.isempty()) { if (auxstack.pop(val)) astack.push(val);

Άσκηση 3 (15 µονάδες) Σας δίνεται η παρακάτω κλάση Date: class Date implements Comparable { public int month; public int day; public Date(int m, int d) { month = m; day = d; // end tostring public String tostring() { return month + "/" + day; // end tostring public int compareto(object obj) { Date otherdate = (Date) obj; if (month > otherdate.month) return 1; else if (month < otherdate.month) return -1; else if (day > otherdate.day) return 1; else if (day < otherdate.day) return -1; else return 0; // end compareto // end class Date Θέλουµε τώρα να χειριστούµε µία συλλογή από ηµεροµηνίες µέσω της ακόλουθης κλάσης CollectionDate: import java.util.*; public class CollectionDate { public static void main(string args[]) { TreeSet dates = new TreeSet(); dates.add(new Date(12, 25)); dates.add(new Date(6, 1)); dates.add(new Date(2, 14)); dates.add(new Date(6, 6)); dates.add(new Date(7, 4)); printset(dates); TreeSet newdates = change(dates); printset(dates); printset(newdates); // end class main public static TreeSet change(treeset dateset) { TreeSet newset = new TreeSet(); Iterator iter = dateset.iterator(); while (iter.hasnext()) { Date nextdate = (Date)iter.next(); if (nextdate.month > nextdate.day) { iter.remove(); newset.add(nextdate); // end if // end while return newset; // change public static void printset(set s) { // To be completed... // end printset // end class CollectionDate 1. (5 µονάδες) Υλοποιείστε την µέθοδο printset() της κλάσης CollectionDate ώστε να τυπώνονται οι ηµεροµηνίες σε µία γραµµή αφήνοντας ένα κενό µεταξύ τους.

public static void printset(set s) { Iterator iter = s.iterator(); while (iter.hasnext()) System.out.print(iter.next() + " "); System.out.println(); // end printset Common Errors: Not proper use of iterators Decaplutation of Date object Explicit use of the tostring() method 2. (10 µονάδες) Τι τυπώνεται στην έξοδο του προγράµµατος όταν εκτελεστούν οι τρεις εντολές printset() στην µέθοδο main() της κλάσης CollectionDate; Η µέθοδος τυπώνει τα αποτελέσµατα σε φθίνουσα διάταξη. Την πρώτη φορά τυπώνονται οι αρχικές ηµεροµηνίες, την δεύτερη οι ηµεροµηνίες που δεν έχουν αφαιρεθεί και την τρίτη οι ηµεροµηνίες που έχουν αφαιρεθεί. Output from first printset: 2/14 6/1 6/6 7/4 12/25 Output from second printset: 2/14 6/6 12/25 Output from third printset: 6/1 7/4 Common Errors: elements not properly sorted (remember a TreeSet is a SortedSet and the method compareto()of Date class will be used to sort the objects) dates not formatted according to tostring() in Date class many students had the 2nd or the 3rd printing equal to the 1st many students left out one of the dates consistently (usually 6/1 or 6/6) Άσκηση 4 (15 µονάδες) Ένα παλίνδροµο είναι µία συµβολοσειρά η οποία µπορεί να διαβαστεί ακριβώς µε τον ίδιο τρόπο είτε από αριστερά προς τα δεξιά είτε αντιστρόφως. Για παράδειγµα, η συµβολοσειρά radar είναι ένα παλίνδροµο. Τυπικά ένα παλίνδροµο ορίζεται ως εξής: η κενή συµβολοσειρά είναι ένα παλίνδροµο µια συµβολοσειρά µε το λιγότερο ένα χαρακτήρα, είναι ένα παλίνδροµο όταν ο πρώτος και ο τελευταίος της χαρακτήρας είναι ίσοι και η υπο-συµβολοσειρά που παράγεται αφαιρώντας τους δύο αυτούς χαρακτήρες είναι επίσης ένα παλίνδροµο. Υλοποιήστε µια στατική αναδροµική µέθοδο ispalindrome() η οποία ελέγχει εάν µία συµβολοσειρά είναι παλίνδροµη σύµφωνα µε τον παραπάνω τυπικό ορισµό. Η υπογραφή της µεθόδου σας δίνεται παρακάτω, και για να ελέγξετε εάν η συµβολοσειρά s είναι παλίνδροµη θα πρέπει να εκτελεστεί η µέθοδος ispalindrome(s, 0, s.length()-1) µε τις κατάλληλες παραµέτρους: public static boolean ispalindrome(string s, int first, int last){ //... ώστε επίσης τις εκ των προτέρων (pre) και εκ των υστέρων (post) συνθήκες που διέπουν το συµβόλαιο χρήσης της. Σηµείωση: Για την υλοποίηση της µεθόδου χρησιµοποιήστε την διεπαφή της κλάσης String.

// Determines whether a string is a palindrome. // PRE: s!= null, first >= 0, last < s.length() // POST: Returns true if the substring of s starting from // index first through to index last is a palindrome, // false otherwise public static boolean ispalindrome(string s, int first, int last) { // Base case: empty substring and single-char substring if (first >= last) return true; // Recursive step: compare first and last chars else return (s.charat(first) == s.charat(last) && ispalindrome(s, first+1, last-1)); // end ispalindrome Άσκηση 5 (10 µονάδες) Ποια είναι η πολυπλοκότητα του χρόνου εκτέλεσης των τριών µεθόδων που σας δίνονται ακολούθως; ικαιολογήστε σύντοµα την απάντηση σας. 1. (3 µονάδες) public static void method1(int n){ double x = Math.random(); // you may assume this method call // takes constant time if (x < 0.1) for (int i = 1; i <= n; i++) System.out.println( * ); else for (int i = 1; i <= 10; i++) System.out.println( * ); O(n) 2. (4 µονάδες) public static void method2(int n){ for (int i = n; i > 0; i = i/2) System.out.println( * ); O(log n) 3. (3 µονάδες) public static void method3(int n){ int m = 2*n; for (int i = 1; i <= m; i++) for (int j = i; j <= m; j++) System.out.println(i*j); O(n 2 ) Common Errors: Unnecessary constants (such as answering O(21*n) for part a)) resulted in 1 mark being subtracted for each instance. For part b), an answer of O(n) was given 2 marks, since this was the most difficult of the three parts. For part c), an answer of O(n) was given 1 mark, and an answer of O(n 3 ) was given 2 marks.

Άσκηση 6 (25 µονάδες) Πολλά παιχνίδια υπολογιστών κρατούν το ιστορικό των αποτελεσµάτων που οι παίκτες έχουν επιτύχει σε προηγούµενα παιχνίδια. Μια ταξινόµηση των αποτελεσµάτων βασίζεται συνήθως σε µια διάταξη όπου τα "καλύτερα" αποτελέσµατα εµφανίζονται πριν από τα "λιγότερo καλά" αποτελέσµατα. Όταν τα αποτελέσµατα εµφανίζονται σε µια οθόνη (π.χ.µε το System.out), αυτό σηµαίνει ότι τα καλύτερα αποτελέσµατα τυπώνονται πρώτα ενώ τα λιγότερο καλά αποτελέσµατα τυπώνονται αργότερα. Υποθέστε ότι έχουµε την κλάση Score και τη διεπαφή HighScoreRanking: public class Score { private String name ; private int points ; private String date ; public Score (String name, int points, String dateofgame) { this.name = name ; this.points = points ; date = dateofgame ; public String tostring() { return (points + " " + name + " ( " + date + " ) " ) ; import java.util.*; public interface HighScoreRanking { boolean add(comparable c) ; Iterator iterator() ; Ένα αντικείµενο HighScoreRanking προορίζεται να αποθηκεύσει όλες τις ταξινοµήσεις που προστέθηκαν χρησιµοποιώντας την µέθοδο add(). Το αντικείµενο Iterator που επιστρέφεται από την µέθοδο iterator() θα πρέπει να επιστρέφει αυτά τα αποτελέσµατα σε µια διάταξη τέτοια ώστε το καλύτερο αποτέλεσµα να βγαίνει πρώτο, έπειτα να βγαίνει το δεύτερο καλύτερο αποτέλεσµα, κλπ. Φυσικά, ένα αποτέλεσµα µε περισσότερους βαθµούς είναι καλύτερο από ένα αποτέλεσµα µε λιγότερους. Εάν οι βαθµοί είναι οι ίδιοι, το αποτέλεσµα του πιο πρόσφατου παιχνιδιού θεωρείται το καλύτερο. Εάν οι βαθµοί και οι ηµεροµηνίες είναι οι ίδιες, διατάζουµε τα αποτελέσµατα αλφαβητικά µετά από τα ονόµατα των παιχτών. Μια υλοποίηση της HighScoreRanking θα πρέπει λοιπόν να αποθηκευτεί σε µια ταξινοµηµένη συλλογή. Θυµηθείτε ότι τα τυποποιηµένα iterators της Java σε ταξινοµηµένες συλλογές επιστρέφουν αρχικά το µικρότερο στοιχείο, έπειτα το δεύτερο µικρότερο στοιχείο, κλπ. Εποµένως, για να εµφανίσουµε πρώτα το καλύτερο αποτέλεσµα, θα πρέπει να υλοποιήσουµε µια κατάλληλη µέθοδο διάταξης στα αποτελέσµατα των παιχνιδιών έτσι ώστε το καλύτερο αποτέλεσµα να βγαίνει και µικρότερο σύµφωνα µε αυτήν την διάταξη. 1 (10 µονάδες) Η µέθοδος add() της HighScoreRanking απαιτεί ορίσµατα του τύπου Comparable. Αλλά τα αντικείµενα της κλάσης Score δεν είναι (ακόµα) τύπου Comparable. Τροποποιήστε την κλάση Score έτσι ώστε τα αντικείµενα της να µπορούν να δοθούν σαν ορίσµατα της µεθόδου add(). εν επιτρέπεται φυσικά να αλλάξετε τη διεπαφή HighScoreRanking. Σηµείωση: εν απαιτείται η υλοποίηση της µεθόδου equals(). Μπορείτε να θεωρήσετε ηµεροµηνίες της µορφής: "YYMMDD", όπως "051207" ή "051130" έτσι ώστε να χρησιµοποιήσετε την αλφαβητική διάταξη των συµβολοσειρών και για την ταξινόµηση των ηµεροµηνιών.

public class Score implements Comparable {... public int compareto (Object o) { Score other = (Score) o ; if (points < other.points) return -1; else if (points > other.points) return 1; else { if (date.compareto(other.date)!=0) return (date.compareto(other.date)); else return name.copareto(other.name);... 2 (10 µονάδες) ώστε την κλάση MyScoreRanking η οποία υλοποιεί την διεπαφή HighScoreRanking σύµφωνα µε τις παρατηρήσεις που σας δόθηκαν προηγουµένως. import java. util.*; public class MyScoreRanking implements HighScoreRanking { private Set thescores = new TreeSet() ; public boolean add(comparable c) { return thescores.add (c); public Iterator iterator() { return thescores.iterator() ; 3 (5 µονάδες) Συµπληρώστε την παρακάτω κλάση (πελάτης) HighScoreTest σύµφωνα µε τις παρατηρήσεις που σας δόθηκαν προηγουµένως και γράψτε τι θα τυπωθεί στην έξοδο του προγράµµατος µετά την εκτέλεση της µεθόδου main(): import java.util.*; public class HighScoreTest { public static void main(string [ ] args) { HighScoreRanking ranking = new MyScoreRanking(); ranking.add (new Score ("Vassilis", 700, "041207")); ranking.add (new Score ("Dimitris", 900, "041208")); ranking.add (new Score ("Nikos", 900, "041209")); ranking.add (new Score ("Giorgos", 800, "041206")); ranking.add (new Score ("Nikos", 700, "041207")); System.out.println("Here comes the current ranking: "); // print all scores of ranking to System.out System.out.println( "Here comes the current ranking: "); Iterator it = ranking.iterator(); while (it.hasnext()) System.out.println(it.next()); 900 Nikos 041209 900 Dimitris 041208 800 Giorgos 041206 700 Nikos 041207 700 Vassilis 041207

Άσκηση 7 (10 µονάδες) Σας δίνεται ο παρακάτω κώδικας Java: public interface Mapper { public int f (int i); public class AMapper implements Mapper { public int f (int i) {return 2+i; public class MyObj { int state; MyObj (int i) {state = i; public class Test { static void map (Mapper m, int i) { i = m.f(i); public static void main(string [ ] args) { MyObj o = new MyObj(7); Mapper mm = new AMapper(); map (mm, o.state); System.out.println(o.state); 1. (3 µονάδες) Τι τυπώνεται µετά την εκτέλεση της µεθόδου main() της κλάσης Test; ικαιολογήστε σύντοµα την απάντησή σας. It prints 7. Since in Java parameters are call-by-value, the statement i = m.f(i) does not change the value stored in o.state. 2. (7 µονάδες) ιορθώστε τον παραπάνω κώδικα της κλάσης Test έτσι ώστε η µεταβλητή στιγµιοτύπων state του αντικειµένου o να αλλάζει πραγµατικά. Σηµείωση: Μην αλλάξετε τον κώδικα (προµηθευτή) της κλάσης MyObj. public class Test2 { static void map(mapper m, MyObj o) { o.state = m.f(o.state); public static void main(string[] argv) { MyObj o = new MyObj(7); Mapper mm = new AMapper(); map(mm, o); System.out.println(o.state); Εναλλακτικά public class Test3 { static int map(mapper m, int i) { return m.f(i); public static void main(string[] argv) { Mapper mm = new AMapper(); MyObj o = new MyObj(map(mm, 7)); System.out.println(o.state);