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

Σχετικά έγγραφα
ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(C) 2010 Pearson Education, Inc. All rights reserved.

CHAPTER 25 SOLVING EQUATIONS BY ITERATIVE METHODS

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

Αρχές Τεχνολογίας Λογισμικού Εργαστήριο

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

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

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

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

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

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

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

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

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

The Simply Typed Lambda Calculus

Abstract classes, Interfaces ΦΡΟΝΤΙΣΤΗΡΙΟ JAVA

(Διαφάνειες Νίκου Βιδάκη)

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

EPL 603 TOPICS IN SOFTWARE ENGINEERING. Lab 5: Component Adaptation Environment (COPE)

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

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

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

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

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

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

Βασικά Στοιχεία της Java

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

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

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

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

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

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

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

Η λέξη κλειδί this. Γαβαλάς Δαμιανός

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

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

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

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

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

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

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

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

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

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

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

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

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

Finite Field Problems: Solutions

Phys460.nb Solution for the t-dependent Schrodinger s equation How did we find the solution? (not required)

EE512: Error Control Coding

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

Γενικοί Τύποι. 13 Ιανουαρίου 2011 Αντικειμενοστρεφής Προγραμματισμός στη Java 32

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

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

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

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

Εργαστήριο Java. Διδάσκουσα: Εργαστηριακοί Συνεργάτες:

Ανάλυση άσκησης. Employee. SalariedEmployee CommissionEmployee HourlyEmployee. BasePlusCommissionEmployee

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

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

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

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

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

class object Database Database Item Item [sub-typing and polymorphism] MusicCD Video MusicCD Video

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

Other Test Constructions: Likelihood Ratio & Bayes Tests

Βασικά Στοιχεία της Java

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

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

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

Σι θα δούμε σε αυτό το μάθημα;

public class ArrayStack implements Stack {

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

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

ST5224: Advanced Statistical Theory II

Προγραμματισμός Ι. Πίνακες, Δείκτες, Αναφορές και Δυναμική Μνήμη. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Προγραμματισμός ΙΙ (Java) 4. Διαχείριση εξαιρέσεων

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

Μηχανική Μάθηση Hypothesis Testing

Τµήµα Πληροφορικής. Δοµές Δεδοµένων - Εργασία 1. Φθινοπωρινό Εξάµηνο Διδάσκων: E. Μαρκάκης. Στοίβες και Ουρές. Οικονοµικό Πανεπιστήµιο Αθηνών

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

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

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

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

Every set of first-order formulas is equivalent to an independent set

Transcript:

Πανεπιστήµιο Κρήτης Τµήµα Επιστήµης Υπολογιστών ΗΥ-252 Οντοκεντρικός Προγραµµατισµός Βασίλης Χριστοφίδης Ονοµατεπώνυµο: Αριθµός Μητρώου: Επαναληπτική Εξέταση (3 ώρες) Ηµεροµηνία: 9 Σεπτεµβρίου 2004 Άσκηση 1 (17 µονάδες) Θεωρήστε τις παρακάτω δηλώσεις διεπαφών και κλάσεων Java. public interface ISong void setname(string n); String getname(); boolean equals(isong s); public class CSong implements ISong private String name; public CSong(String n) name= n; public void setname(string n) name= n; public String getname() return name; public boolean equals(isong s) return ((s instanceof CSong) && name.equals(s.name)); public class TimedSong extends CSong implements ISong private double duration; public TimedSong(String n, double d) super(n); duration= d; public double gettime() return duration; public boolean equals(isong s) return ( (s instanceof TimedSong) && name.equals(s.name) && duration==s.duration); 1.1 (3 µονάδες) Ποιες από τις παρακάτω εντολές της κυρίας µεθόδου της κλάσης SongApp θεωρούνται σαν λάθη από τον µεταφραστή της Java (compile-time errors); Υπογραµµίστε τις λάθος εντολές και δικαιολογήστε σύντοµα την απάντησή σας. public class SongApp public static void main(string[] pars) ISong s0, s1; CSong cs0, cs1; TimedSong t0, t1; s0= new ISong("Imagine"); s0= new TimedSong("Voodoo Child",4.0); s1= new CSong("A Long Walk",4.0); cs0= new TimedSong("Strange Fruit",6.0); t0= new TimedSong("Reasons to be Beautiful",5.0); t1= (TimedSong) s0; s1= t0; cs0= t0;

t1.setname(t1.getname()); double d= cs0.gettime(); // wrong, cannot instantiate an interface s0= new ISong("Imagine"); // 1 // wrong, CSong has no constructor with two parameters s1= new CSong("A Long Walk",4.0); // 1 // wrong, cannot assign TimedSong expression (t0) to // CSong variable (s1) s1= t0; // 1 1.2. (14 µονάδες) Τι θα τυπωθεί µετά την εκτέλεση της παρακάτω κυρίας µεθόδου της κλάσης SongApp; ικαιολογήστε σύντοµα την απάντησή σας. public static void main(string[] pars) ISong s0, s1, s2; s0= new TimedSong("Somewhat Damaged", 4.0); s1= new TimedSong("Somewhat Damaged", 4.0); if (s0==s1) System.out.println("equal"); else System.out.println("not equal"); if (s0.equals(s1)) System.out.println("EQUAL"); else System.out.println("not EQUAL"); s2= s1; s2.setname("felicidade"); System.out.println( s1.getname() + s2.getname() ); s0= new CSong("Felicidade"); if (s2.equals(s0)) System.out.println("same"); else System.out.println("not same"); if (s0.equals(s2)) System.out.println("SAME"); else System.out.println("not SAME"); public static void main(string[] pars) ISong s0, s1, s2; s0= new TimedSong("Somewhat Damaged", 4.0); // 1 s1= new TimedSong("Somewhat Damaged", 4.0); // 1 // s0 and s1 reference distinct TimedSong objects with // the same duration and name values if (s0==s1) System.out.println("equal"); // 1 else System.out.println("not equal"); // 1 // "not equal" has been printed, because the == // condition is false if (s0.equals(s1)) System.out.println("EQUAL"); // 1 else System.out.println("not EQUAL"); // 1 // "EQUAL" has been printed, because TimedSong.equals // compares fields s2= s1; // s2 and s1 reference the same object of type //TimedSong s2.setname("felicidade"); // 1 // s2 and s1 reference the same object and name field // == "Felicidade" System.out.println( s1.getname() + s2.getname() ); // 1 // "FelicidadeFelicidade" has been printed s0= new CSong("Felicidade"); // 1 // s0 references a CSong with name field "Felicidade"

if (s2.equals(s0)) System.out.println("same"); // 1 else System.out.println("not same"); // 1 // "not same" has been printed, because s2 has type // TimedSong and method TimedSong.equals requires the // argument (s0) to have same type if (s0.equals(s2)) System.out.println("SAME"); // 1 else System.out.println("not SAME"); // 1 // "SAME" has been printed, because s0 has type CSong // and method CSong.equals requires the argument (s2) // to have type Csong (which it does because TimedSong // is a subclass of CSong) and to have the same name // field Άσκηση 2 (30 µονάδες) Σας δίνεται το παρακάτω πρόγραµµα Java το οποίο διαµερίζει µία λίστα ακεραίων (list) σε υπολίστες έτσι ώστε µια από αυτές (smaller) να περιέχει πάντα τα k (curk) µικρότερα στοιχεία της αρχικής λίστας: List curlist = list; int curk = k; while (!curlist.isempty() ) int pivot = curlist.at(1); List smaller, larger; for ( int topartition = 2; topartition <= curlist.getlength();topartition++ ) if ( curlist.at(topartition) <= pivot ) smaller.insert(smaller.getlength()+1, curlist.at(topartition)); else if ( curlist.at(topartition) > pivot ) larger.insert(larger.getlength()+1, curlist.at(topartition)); if ( curk <= smaller.getlength() ) curlist = smaller; else if ( curk == smaller.getlength()+1 ) System.out.println(pivot); break; else curlist = larger; curk -= smaller.getlength()+1; 2.1 (10 µονάδες) Ποια είναι η πολυπλοκότητα (complexity) του χρόνου εκτέλεσης (στην καλύτερη περίπτωση) του προγράµµατος; In the best case, the outer loop exits as quickly as possible i.e. it hits the break the first time through. This happens if the first element in the list (the thing chosen as the pivot) happens to be the kth smallest element. The running time is O(n), because the inner loop repeats n-1 times and the outer loop repeats only once; all of the List methods called (at, getlength(), insert() at end) are O(1) for an array-based List.

2.2 (10 µονάδες) Ποια είναι η πολυπλοκότητα (complexity) του χρόνου εκτέλεσης (στην χειρότερη περίπτωση) του προγράµµατος; In the worst case, the outer loop executes until the current list is empty. Each time through the outer loop, the current list is updated to be one of the sublists smaller or larger; at most one element is not present in either of these lists (the pivot), so in the worst case, the list that replaces curlist is one smaller than the old list. This means that the outer loop executes with curlist of size n, n-1, n-2,..., down to 1 (when curlist has size 0, the test condition is false and the loop exits). The inner loop is executed O(curlist.size) times each time the outer loop is executed; the rest of the work in the outer loop is O(1) per outer loop iteration. The total work is the sum of the work done for each iteration of the outer loop: O(n)+ O(n-1)+ O(n-2)+...+ O(1) = O(n 2 ). 2.3 (10 µονάδες) Ποια είναι η πολυπλοκότητα (complexity) του χρόνου εκτέλεσης (στην µέση περίπτωση) του προγράµµατος; In the average case, one would expect the pivot chosen to be near the middle. This means that on successive iterations, curlist will have size n, n/2, n/4,..., 1, 0. Since O(curlist.size) work is done with each iteration, the total work is n+n/2+n/4+...+1 <= 2n = O(n). If this seems too optimistic, consider that with probability 1/2, the chosen pivot will lead to the larger of the "smaller" or "larger" lists containing at most 3/4 of the elements. If we end up searching the larger of the two, curlist will have size n, 3n/4, 9n/16,..., 1 on successive iterations - this sum again works out to be O(n). Άσκηση 3 (53 µονάδες) 3.1 (7 µονάδες) Θεωρήστε τον ακόλουθο ορισµό της κλάσης Time στηνjava: import java.text.decimalformat; public class Time implements Cloneable private int hour; private int minute; // The following method returns true if the receiver is // earlier than the parameter public bollean earlierthan(time t) /* implementation */ // other methods Υλοποιήστε τις παρακάτω µεθόδους της κλάσης Time: (a) (1 µονάδα) Έναν κατασκευαστή αντικειµένων (constructor), ο οποίος αρχικοποιεί όλες τις µεταβλητές στιγµιοτύπων του µέσω κατάλληλων παραµέτρων (για ευκολία υποθέτουµε ότι τιµές όλων των παραµέτρων της µεθόδου είναι µέσα στο επιτρεπτό πεδίο τιµών του ΑΤ Time). public Time(int h, int m) hour = h; minute = m;

(b) (2 µονάδες) Μια µέθοδο tostring() η οποία µετατρέπει ένα αντικείµενο Time σε µια συµβολοσειρά της µορφής "09:30", "11:05" ή "23:35" (για ευκολία µπορείτε να χρησιµοποιήσετε την κλάση java.text.decimalformat). You may use it, but you don't have to. public String tostring( ) // 0.5 DecimalFormat fmt = new DecimalFormat("00"); // 0.5 return (fmt.format(hour) + ":" + fmt.format(minute)); // 1 (c) (4 µονάδες) Μια µέθοδο equals() για να ελέγχουµε την ισότητα δύο αντικειµένων Time, η οποία υποσκελίζει (overrides) την µέθοδο equals() που ορίζεται στην κλάση Object. public boolean equals(object ob) // 1 boolean toreturn = false; // 0.5 if (ob instanceof Time) // 0.5 Time e = (Time)ob; // 0.5 toreturn = (hour == e.hour && minute == e.minute); // 1 return toreturn; // 0.5 3.2 (11 µονάδες) Θεωρήστε τον ακόλουθο ορισµό της κλάσης Event στηνjava: public class Event implements Cloneable private String category; private Time occurredat; public String getcategory( ) return category; public Time getoccurredat( ) returns occurredat; // other methods // Assume a method equals is also defined in this class. (a) (2 µονάδες) Υλοποιήστε έναν κατασκευαστή αντικειµένων (constructor) ο οποίος αρχικοποιεί την µεταβλητή category µε µια παράµετρο τύπου String και την µεταβλητή occurredat µε δύο παραµέτρους τύπου int. public Event(String s, int h, int m) // 0.5 category = s; // 0.5 occurredat = new Time(h, m); // 1 (b) (2 µονάδες) Υλοποιήστε έναν κατασκευαστή αντικειµένων (constructor) χωρίς παραµέτρους που αρχικοποιεί την µεταβλητή category στην κενή συµβολοσειρά και την µεταβλητή occurredat στις τιµές hour=minute=0 (σηµειώστε ότι αυτός ο κατασκευαστής χρησιµοποιείται εµµέσως από τον κατασκευαστή του ερωτήµατος a).

public Event( ) // 1 this("", 0, 0); // 1 (c) (2 µονάδες) Υλοποιήστε µια µέθοδο tostring() η οποία µετατρέπει ένα αντικείµενο Event σε µια συµβολοσειρά της µορφής " ιαγώνισµα, 09:30", "Μάθηµα, 16:05", or "Γεύµα, 12:10". public String tostring( ) // 0.5 return category + ", " /* 0.5 */ + occurredat.tostring( ); /* 1 */ (d) (5 µονάδες) Υλοποιήστε µια µέθοδο clone() η οποία δηµιουργεί ένα βαθύ αντίγραφο (deep copy) ενός αντικειµένου Event και η οποία υποσκελίζει (overrides) την µέθοδο clone() που ορίζεται στην κλάση Object (σηµειώστε ότι η µέθοδός σας δεν πρέπει να εγείρει καµία εξαίρεση και κατά συνέπεια ο χειρισµός της εξαίρεσης CloneNotSupported της µεθόδου clone() στην κλάση Object πρέπει να γίνεται τοπικά στο σώµα της µεθόδου σας τυπώνοντας ένα κατάλληλο µηνύµα στην στάνταρτ έξοδο). public Object clone( ) // 0.5 Event copy; try // 1 copy = (Event) super.clone( ); // 1 copy.occurredat = (Time)occurredAt.clone( ); // 1 catch (CloneNotSupportedException e) // 1 System.out.println("Clone not supported."); return copy; // 0.5 3.3 (5 µονάδες) Θεωρήστε τον ακόλουθο ορισµό της κλάσης ScaledEvent η οποία είναι υποκλάση της Event: public class ScaledEvent extends Event private double importance; // constructors and methods (a) (2.5 µονάδες) Υλοποιήστε έναν κατασκευαστή αντικειµένων (constructor) ο οποίος αρχικοποιεί όλες τις µεταβλητές µε παραµέτρους. public ScaledEvent(String s, int h, int m, double d) // 0.5 super(s, h, m); // 1 importance = d; // 1 (b) (2.5 µονάδες) Υλοποιήστε µια µέθοδο tostring() η οποία µετατρέπει ένα αντικείµενο ScaledEvent σε µια συµβολοσειρά της µορφής " ιαγώνισµα, 09:30, importance = 1.00" (για ευκολία µπορείτε να χρησιµοποιήσετε την κλάση java.text.decimalformat).

public String tostring( ) // 0.5 return super.tostring( ) /* 1 */ + ", importance = " + (new DecimalFormat("0.00")).format(importance); /* 1 */ 3.4 (17 µονάδες) Θεωρήστε τον ακόλουθο ορισµό της κλάσης EventList: import java.util.*; public class EventList // storing references of Events private ArrayList events = new ArrayList( ); // public methods (a) (8 µονάδες) Υλοποιήστε µια µέθοδο earliestevent() η οποία επιστρέφει µία αναφορά σε ένα αντικείµενο Event της µεταβλητής events (τύπου ArrayList) το οποίο θα συµβεί χρονικά πρώτο (στην περίπτωση που η µεταβλητή είναι κενή η µέθοδος πρέπει να δηµιουργεί µια εξαίρεση τύπου EmptyListException). public Event earliestevent( ) // 0.5 throws EmptyListException // 1 int len = events.size( ); Event toreturn = null; // 0.5 if (len > 0) toreturn = (Event) events.get(0); // 1 for (int i = 1; i < len; ++i) if (((Event)events.get(i)).getOccurredAt( ). earlierthan(toreturn.getoccurredat( ))) toreturn = (Event)events.get(i); // 3.5 s else throw new EmptyListException( ); // 1 return toreturn; // 0.5 (b) (4 µονάδες) Υλοποιήστε µια µέθοδο copy() η οποία δηµιουργεί ένα βαθύ αντίγραφο (deep copy) ενός αντικειµένου EventList. public EventList copy( ) // 0.5 ArrayList copy = (ArrayList) events.clone( ); // 1 for (int i = 0; i < events.size( ); ++i) // 0.5 copy.set(i, ((Event)events.get(i)).clone( )); // 1 EventList ret = new EventList(); ret.events = copy; // 0.5 return ret; // 0.5 (c) (5 µονάδες) Υλοποιήστε µια µέθοδο remove() η οποία αφαιρεί όλα τα αντικείµενα τύπου Event της µεταβλητής events (τύπου ArrayList) για µία συγκεκριµένη κατηγορία η οποία δίνεται σαν παράµετρος εισόδου.

public void remove(string cat) // 0.5 Iterator it = events.iterator( ); // 1 while (it.hasnext( )) // 0.5 Event current = (Event) it.next( ); // 1 if (current.getcategory( ).equals(cat)) // 1 it.remove( ); // 1 // A for loop does not work in this method. 2 s if a for loop is used. 3.5 (13 µονάδες) Θεωρήστε τον ακόλουθο ορισµό της κλάσης CategoryList στηνjava η οποία χρησιµοποιείται για να αναπαραστήσει γεγονότα (events) οργανωµένα σε κατηγορίες (categories): import java.util.*; public class CategoryList private HashMap categories = new HashMap( ); // public methods Το κλειδί (key) ενός στοιχείου της µεταβλητής categories είναι το πεδίο category µε τύπο String το οποίο ορίζεται σε µια κλάση Event ενώ η τιµή (value) ενός στοιχείου είναι ένα αντικείµενο τύπου ArrayList το οποίο περιέχει όλα τα γεγονότα (Events) για µια συγκεκριµένη κατηγορία. (a) (4 µονάδες) Υλοποιήστε µια µέθοδο addevent() στην κλάση CategoryList η οποία προσθέτει ένα καινούργιο γεγονός (Event) στην µεταβλητή categories (τύπου HashMap). Θεωρήστε τις ακόλουθες δύο περιπτώσεις: 1) η περιγραφή του γεγονότος βρίσκεται ήδη στο HashMap, 2) η περιγραφή δεν βρίσκεται στο HashMap. Η µέθοδος πρέπει να επιστρέφει ένα ενηµερωµένο αντικείµενο CategoryList. public CategoryList addevent(event e) // 0.5 String s = e.getcategory( ); // 0.5 if (!categories.containskey(s)) categories.put (s, new ArrayList( )); // 1 ArrayList v = (ArrayList)categories.get(s); // 1 v.add(e); // 0.5 return this; // 0.5 (b) (4 µονάδες) Υλοποιήστε µια µέθοδο removeevent() στην κλάση CategoryList η οποία αφαιρεί ένα γεγονός (Event) στην µεταβλητή categories (τύπου HashMap). Αν είναι το µοναδικό γεγονός µιας κατηγορίας τότε πρέπει να αφαιρεθεί και η συγκεκριµένη κατηγορία. public void removeevent(event e) // 0.5 String cat = e.getcategory( ); // 0.5

ArrayList catlist = (ArrayList) categories.get(cat); // 1 catlist.remove(e); // 1 if (catlist.isempty( )) categories.remove(cat); // 1 (c) (5 µονάδες) Υλοποιήστε µια µέθοδο printevents() στην κλάση CategoryList η οποία τυπώνει όλα τα γεγονότα (ένα σε κάθε γραµµή της στάνταρτ εξόδου) χωρίς να διατάσει τις κατηγορίες στο HashMap. public void printevents( ) // 0.5 Iterator it = categories.values( ).iterator( ); // 1 while (it.hasnext( )) // 0.5 ArrayList current = (ArrayList) it.next( ); // 1 for (int i = 0; i < current.size( ); ++i) System.out.println((Event)current.get(i)); // 2 s