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



Σχετικά έγγραφα
EE512: Error Control Coding

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

The Simply Typed Lambda Calculus

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

derivation of the Laplacian from rectangular to spherical coordinates

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

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

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

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

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

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

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

Section 8.3 Trigonometric Equations

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

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

2 Composition. Invertible Mappings

HOMEWORK 4 = G. In order to plot the stress versus the stretch we define a normalized stretch:

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

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

Homework 3 Solutions

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

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

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

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

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

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

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

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

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

Finite Field Problems: Solutions

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

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

Εργαστήριο Ανάπτυξης Εφαρμογών Βάσεων Δεδομένων. Εξάμηνο 7 ο

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

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

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

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

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

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

Physical DB Design. B-Trees Index files can become quite large for large main files Indices on index files are possible.

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

Partial Trace and Partial Transpose

Instruction Execution Times

Week 7: Java Collection Classes

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

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

DESIGN OF MACHINERY SOLUTION MANUAL h in h 4 0.

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

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

ΕΙΣΑΓΩΓΗ ΣΤΟN ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ ΚΑΙ ΠΛΗΡΟΦΟΡΙΚΗΣ

Inverse trigonometric functions & General Solution of Trigonometric Equations

CHAPTER 25 SOLVING EQUATIONS BY ITERATIVE METHODS

k A = [k, k]( )[a 1, a 2 ] = [ka 1,ka 2 ] 4For the division of two intervals of confidence in R +

Section 9.2 Polar Equations and Graphs

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

Ordinal Arithmetic: Addition, Multiplication, Exponentiation and Limit

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

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

Main source: "Discrete-time systems and computer control" by Α. ΣΚΟΔΡΑΣ ΨΗΦΙΑΚΟΣ ΕΛΕΓΧΟΣ ΔΙΑΛΕΞΗ 4 ΔΙΑΦΑΝΕΙΑ 1

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

H κλάση ArrayList. Γιώργος Θάνος. Γραφείο Γ. Γκλαβάνη 37. Αντικει ενοστραφής Προγρα. ος όροφος

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

Approximation of distance between locations on earth given by latitude and longitude

Assalamu `alaikum wr. wb.

Other Test Constructions: Likelihood Ratio & Bayes Tests

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

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

3.4 SUM AND DIFFERENCE FORMULAS. NOTE: cos(α+β) cos α + cos β cos(α-β) cos α -cos β

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

Math221: HW# 1 solutions

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

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

Econ 2110: Fall 2008 Suggested Solutions to Problem Set 8 questions or comments to Dan Fetter 1

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

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

Concrete Mathematics Exercises from 30 September 2016

Μορφοποίηση υπό όρους : Μορφή > Μορφοποίηση υπό όρους/γραμμές δεδομένων/μορφοποίηση μόο των κελιών που περιέχουν/

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

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

PARTIAL NOTES for 6.1 Trigonometric Identities

Section 7.6 Double and Half Angle Formulas

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

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

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

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

ΚΥΠΡΙΑΚΟΣ ΣΥΝΔΕΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY 21 ος ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ Δεύτερος Γύρος - 30 Μαρτίου 2011

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

Fractional Colorings and Zykov Products of graphs

Οδηγίες Αγοράς Ηλεκτρονικού Βιβλίου Instructions for Buying an ebook

Dynamic types, Lambda calculus machines Section and Practice Problems Apr 21 22, 2016

A ΜΕΡΟΣ. 1 program Puppy_Dog; 2 3 begin 4 end. 5 6 { Result of execution 7 8 (There is no output from this program ) 9 10 }

Example Sheet 3 Solutions

4.6 Autoregressive Moving Average Model ARMA(1,1)

Block Ciphers Modes. Ramki Thurimella

ST5224: Advanced Statistical Theory II

Κληρονομικότητα. Παύλος Εφραιμίδης pefraimi <at> ee.duth.gr. Java Κληρονομικότητα 1

C.S. 430 Assignment 6, Sample Solutions

Συστήματα Διαχείρισης Βάσεων Δεδομένων

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

Transcript:

Πανεπιστήμιο Κρήτης Τμήμα Επιστήμης Υπολογιστών ΗΥ-252 Αντικειμενοστρεφής Προγραμματισμός Βασίλης Χριστοφίδης Ονοματεπώνυμο: Αριθμός Μητρώου: Τελική Εξέταση (3 ώρες) Ημερομηνία: 1 Φεβρουαρίου 2009 Άσκηση 1(5 μονάδες) Αφαιρετικές Κλάσεις και κατασκευή αντικειμένων Η παρακάτω κλάση Person έχει οριστεί σαν βασική κλάση (base class) για την σχεδίαση των υποκλάσεων Student και Professor. Η κλάση Person έχει δηλωθεί σαν αφαιρετική γιατί δεν θέλουμε να επιτρέπουμε την δημιουργία στιγμιοτύπων τύπου Person: το πρόγραμμα μπορεί να δημιουργεί μόνο στιγμιότυπα των κλάσεων Student και Professor. public abstract class Person { private String name; private String ssn; public Person(String name, String ssn) { this.setname(name); this.setssn(ssn); //... Rest of code omitted Ωστόσο ο βασικός λόγος για την δήλωση μιας κλάσης σαν αφαιρετική είναι όταν η κλάση χρειάζεται να δηλώσει μεθόδους οι οποίες πρέπει/μπορούν να υλοποιηθούν μόνο από τις υποκλάσεις της. Αυτό δεν ισχύει για την κλάση Person. Πως θα μπορούσατε να διορθώσετε την παραπάνω δήλωση της Person ώστε: 1. Να μην είναι αφαιρετική κλάση. 2. Να μην μπορεί ένας κώδικας πελάτης να δημιουργήσει στιγμιότυπα της Person. 3. Να μπορεί ένας κώδικας πελάτης να δημιουργήσει στιγμιότυπα των υποκλάσεων Student και Professor. The class Person must not be abstract and the constructor should be made protected: protected Person(String name, String ssn) { this.setname(name); this.setssn(ssn);

Clients cannot instantiate a class with only protected constructors. Subclasses can still call super in their own constructors in order to invoke the protected constructors. Άσκηση 2 (15 μονάδες) Βασική Λειτουργικότητα Αντικειμένων Σας δίνεται η παρακάτω κλάση Java η οποία αναπαριστά ρητούς αριθμούς των οποίων ο αριθμητής και παρανομαστής είναι ακέραιοι αριθμοί. public class Rational { protected int num, denom; public Rational(int num, int denom) { this.num = num; this.denom = denom; set(num, denom); protected void set(int num, int denom) { if (denom == 0) throw new Error("Divide by zero"); this.denom = denom; this.num = num; public void reciprocate() { int olddenom = this.denom; this.denom = num; this.num = olddenom; set(denom, num); public double todouble() { return ((double) num / denom); public String tostring() { return num + "/" + denom; α) (5 μονάδες) Δεδομένης της default υλοποίησης των μεθόδων hashcode() και equals(object), τι πρόβλημα μπορεί να παρουσιαστεί στον παρακάτω κώδικα που δημιουργεί ένα σύνολο από ρητούς αριθμούς; Set s = new HashSet(); s.add(new Rational(1,2)); s.add(new Rational(1,2)); The two Rational objects will each be viewed as distinct, because default hashcode is based on an object's address in memory. The Set which should have just once instance of the fraction would then have two instances. β) (10 μονάδες) Υποσκελίστε την default υλοποίηση των μεθόδων hashcode() και equals(object) ώστε να υποστηρίζουμε με συνεπή τρόπο συλλογές αντικειμένων τύπου Rational που βασίζονται σε συναρτήσεις κατακερματισμού.

public int hashcode() { //Give credit for any reasonable implementation Best is: return num + 39*denom; //alternatively return this.tostring().hashcode(); public boolean equals(object o) { if (o == null) return false; else if (!(o instance of Rational) return false; else { Rational r = (Rational)o;//you can assume this works return(this.num todouble() == r.todouble()num && this.denom == r.denom); // or similar Common Mistakes a) Οι φοιτητές που απάντησαν λάθος στο συγκεκριμένο ερώτημα, θεωρούσαν ότι ουσιαστικά δεν υπήρχε λάθος καθώς η μέθοδος equals και hashcode της Object λειτουργούσαν κανονικά για τα αντικείμενα τύπου Rational χωρίς να χρειαστεί να τις υποσκελίσουν. b) Η μέθοδος hashcode υλοποιήθηκε από το 5% περίπου των φοιτητών. Στη μέθοδο equals οι φοιτητές δεν την υποσκέλιζαν σωστά καθώς δεν τηρούσαν την υπογραφή της μεθόδου και δεν έκαναν του κατάλληλους ελέγχους για τις περιπτώσεις όπου το αντικείμενο ήταν null ή δεν ήταν στυγμιότυπο της κλασης Rational. Άσκηση 3 (10 μονάδες) Βασική Λειτουργικότητα Αντικειμένων Η Java ορίζει την διεπαφή Comparable ως εξής: interface Comparable { int compareto(object o) ; όπου x.compareto(y) επιστρέφει έναν αρνητικό ακέραιο εάν x < y, 0 εάν είναι ίσα, και έναν θετικό ακέραιο εάν x > y. Ορίστε μία κλάση MyArray η οποία ενθυλακώνει πίνακες ακεραίων και υλοποιεί την διεπαφή Comparable. Στιγμιότυπα της MyArray πρέπει να συγκρίνονται χρησιμοποιώντας το άθροισμα (sum) των ακεραίων που περιέχουν οι ενθυλακωμένοι πίνακες. Για παράδειγμα, η εκτέλεση του παρακάτω τεστ // create tow arrays and in initialize the elements int [ ] a = new int [ ] { 1, 2, 3, 4 ; int [ ] b = new int [ ] {-1, 2, -3, 4, -5; // create objects encapsulating these arrays MyArray m1 = new MyArray(a) ; MyArray m2 = new MyArray(b) ; // print the result of the comparison System.out.println (m1.compareto(m2)) ; θα τυπώσει έναν θετικό ακέραιο επειδή 1 + 2 + 3 + 4 > -1 + 2-3 + 4-5.

Υλοποιήστε πλήρως την κλάση MyArray ώστε ο παραπάνω κώδικας πελάτης να μπορεί να εκτελεστεί με επιτυχία. public class MyArray implements Comparable { private int[ ] thearray ; private int thesum ; public MyArray (int[] intarr ) { thearray = intarr ; int sum = 0 ; for (int i=0; i < thearray.length ; i++) { sum = sum + thearray[i] ; thesum = sum ; public int getthesum( ) { return thesum ; public int compareto(object o) { int othersum =((MyArray) o).getthesum( ) ; return thesum - othersum ; Common Mistakes Αρκετοί φοιτητές υλοποίησαν την μέθοδο compareto παίρνοντας ως όρισμα ένα αντικείμενο τύπου MyArray,αντί για Object Ένα άλλο λάθος που έκαναν άλλοι είναι ότι δεν έκαναν casting το Object σε αντικείμενο MyArray, άρα στην συνέχεια δεν ήταν σωστό να προσπελάσουν τις μεθόδους της κλάσης MyArray, μέσω του ορίσματος (που είναι Object). Άλλο λάθος ήταν ότι κάποιοι φοιτητές δεν ενθυλάκωναν καθόλου τους πίνακες ακεραίων Άσκηση 4 (28 μονάδες) Χειρισμός Πλαισίου Συλλογών Αντικειμένων α) (20 μονάδες) Όταν χειριζόμαστε συλλογές τύπου HashMap, ορισμένες φορές χρειαζόμαστε να καθορίσουμε εάν δύο αντικείμενα HashMaps έχουν κοινά ζεύγη κλειδί/τιμή. Θεωρήστε για παράδειγμα τις παρακάτω συλλογές hashmap1 και hashmap2 που αντιστοιχούν συμβολοσειρές σε συμβολοσειρές (δηλ. ο τύπος τους είναι HashMap<String,String>). Key Αλίκη Μαρία Σπύρος Βασίλης Ειρήνη Value Healthy Ecstatic Happy Sick Fine Key Μαρία Βασίλης Θοδωρής Μανώλης Σπύρος Value Ecstatic Healthy Superb Fine Happy hashmap2 hashmap1

Τα κοινά ζεύγη στο παραπάνω παράδειγμα είναι: "Μαρία"/"Ecstatic" και "Σπύρος"/"Happy". Σημειώστε ότι αν και το κλειδί "Βασίλης" εμφανίζεται και στις δύο συλλογές, η συσχετισμένη τιμή με αυτό το κλειδί είναι διαφορετική στο hashmap1 από ότι στο hashmap2 (κατά συνέπεια δεν υπολογίζεται στα κοινά ζεύγη των δύο HashMaps). Παρόμοια, εάν μία τιμή εμφανίζεται και στις δύο συλλογές (π.χ. η τιμή "Fine") χωρίς όμως να συσχετίζεται με το ίδιο κλειδί δεν υπολογίζεται επίσης στα κοινά ζεύγη των δύο HashMaps. Σε αυτή την άσκηση θα πρέπει να υλοποιήσετε την μέθοδο : public int commonkeyvaluepairs(hashmap<string,string> map1, HashMap<String,String> map2) η οποία δέχεται σαν ορίσματα δύο αντικείμενα τύπου HashMap<String,String> και επιστρέφει τον αριθμό των κοινών ζευγών κλειδί/τιμή των δύο HashMaps (για ευκολία υποθέστε ότι δεν έχουμε null τιμές). /** Method: commonkeyvaluepairs(map1, map2) * Returns a count of the number of common key/value * pairs in the two HashMaps that are passed in. */ public int commonkeyvaluepairs(hashmap<string,string> map1, HashMap<String,String> map2) { int count = 0; // Get iterator over map1 Iterator<String> it = map1.keyset().iterator(); while (it.hasnext()) { // Get key from map1 String key = it.next(); // See if that keys exists in map2 if (map2.containskey(key)) { //alternatively map1.get(key).equals(map2.get(key)) //Lookup values associated with key in both maps String map1value = map1.get(key); String map2value = map2.get(key); // See if values are equal if (map2value.equals(map1value)) { count++; return count; Εναλλακτικά: public int commonkeyvaluepairs(map<string,string> map1, Map<String, String> map2) {

map1.entryset().retainall(map2.entryset()); return map1.size(); Common Mistakes: Αρκετοί φοιτητές νόμιζαν ότι από HashMap μπορούν να πάρουν απευθείας έναν Iterator ο οπόιος είχε σαν πεδία το key και το value του κάθε στοιχείου του HashMap. Κάτι τέτοιο προφανώς δεν ισχύει. Επίσης το άλλο λάθος που έκαναν ήταν ότι προσπαθούσαν να διαχειριστούν το HashMap σαν πίνακα οπότε για κάθε i στοιχείο του προσπαθούσαν να πάρουν το key και το value του. Επίσης κάτι τέτοιο δεν ισχύει. β) (8 μονάδες) Σε συλλογές τύπου HashMap or HashSet συνήθως εκτελούμε αποδοτικά πολλές πράξεις όπως εισαγωγές (add), διαγραφές (remove), αναζητήσεις (contains) ή άλλες. Οι επιδόσεις αυτών των πράξεων εξαρτώνται από τις ιδιότητες που έχει η συνάρτηση κατακερματισμού (hash function) καθώς και ο παράγοντας φόρτωσης (load factor). (i) Ποια ιδιότητα πρέπει να έχει η συνάρτηση κατακερματισμού ώστε αυτές οι πράξεις να εκτελούνται πολύ αποδοτικά; A hash function converts a key value into an integer that is used to select the bucket (or slot) where that key should be stored. For hashing to be efficient, the hash function must distribute the keys among the buckets uniformly so no one bucket winds up with too many key values. (ii) Ποια ιδιότητα πρέπει να έχει ο παράγοντας φόρτωσης ώστε αυτές οι πράξεις να εκτελούνται πολύ αποδοτικά; The load factor is the ratio n/b of the number of items in the table (n) to the total number of buckets (b). For hashing to be efficient, this number needs to be small. Άσκηση 5 (28 μονάδες) Σαρωτές Συλλογών Αντικειμένων Σε αυτή την άσκηση θα υλοποιήσετε ορισμένους σαρωτές (Iterators) χρησιμοποιώντας άλλους που προσφέρονται από το πλαίσιο συλλογών αντικειμένων της Java. Στις υλοποιήσεις σας θα πρέπει να λάβετε υπόψη τις εξαιρέσεις που ενδεχομένως να δημιουργηθούν. α) (10 μονάδες) Υλοποιήστε έναν σαρωτή ReverseIterator ο οποίος επιστρέφει τα στοιχεία (τύπου Object) μιας λίστας (τύπου List) σε ανεστραμμένη σειρά. Η λίστα δίνεται σαν όρισμα στην μέθοδο κατασκευής (constructor) του σαρωτή. Ο σαρωτής θα πρέπει να υλοποιεί όλη την λειτουργικότητα της διεπαφής Ιterator, δηλ τις μεθόδους hasnext(),

next() και remove(), χρησιμοποιώντας κατάλληλες μεθόδους της διεπαφής List όπως size(), get(int) και remove(int). import java.util.*; public class ReverseIterator implements Iterator { private ListIterator listit; // 2 points public ReverseIterator(List list) { this.listit = listit.listiterator(list.size()) ; // 2 points public boolean hasnext() { return listit.hasprevious(); // 2 points public Object next() { return listit.previous(); // 2 points public void remove() { listit.remove(); // 2 points Common Mistakes: Αρκετοί ήταν οι φοιτητές που αντί για μια κλάση με τα παραπάνω χαρακτηριστικά έφτιαξαν μια μέθοδο που επέστρεφε μια λίστα με ανεστραμμένα τα στοιχεία. Επίσης κοινό λάθος ήταν η δημιουργία στον κατασκευαστή μιας λίστας με ανεστραμμένα τα στοιχεία. β) (18 μονάδες) Υλοποιήστε έναν σαρωτή ZipperIterator πού συναρμόζει ( zips") τα στοιχεία (τύπου Object) που επιστρέφουν δύο άλλοι σαρωτές που δίνονται σαν ορίσματα στην μέθοδο κατασκευής (constructor) του ZipperIterator. Πιο συγκεκριμένα, εάν ο πρώτος σαρωτής επιστρέφει τα στοιχεία με την σειρά x0; x1; ; xn; Και ο δεύτερος σαρωτής επιστρέφει τα στοιχεία με την σειρά y0; y1; ; yn;, ο σαρωτής ZipperIterator θα επιστρέφει τα στοιχεία με την σειρά x0; y0; x1; y1; ; xn; yn. Με άλλα λόγια, ο ZipperIterator επιστρέφει εναλλακτικά τα στοιχεία από τους σαρωτές που του δίνονται σαν ορίσματα. Ο ZipperIterator τερματίζει την σάρωση (δηλ. η hasnext γίνεται ψευδής) όταν ένας από τους δύο σαρωτές εισόδου εξαντλεί τα στοιχεία της συλλογής που σαρώνει. Η μέθοδος remove() του ZipperIterator διαγράφει το πιο πρόσφατα σαρωμένο στοιχείο από τον σαρωτή που το έχει επιστρέψει. Σας δίνεται στην συνέχεια ένας κώδικας πελάτης που επιδεικνύει την λειτουργία του ZipperIterator: import java.util.*; List l = new ArrayList(); List r = new ArrayList(); l.add("a"); l.add("b"); l.add("c");

r.add("a"); Iterator z = new ZipperIterator(l.iterator(),r.iterator()); while (z.hasnext()) { System.out.println(z.next()); z.remove(); System.out.println(l); System.out.println(r); Output a [b, c] [A] A [b, c] [] b [c] [] Βοήθεια: Στην υλοποίηση του ZipperIterator θα χρειαστείτε μια μεταβλητή στιγμιοτύπων (πχ. nextisleft) η οποία υποδεικνύει ποιος από τους δύο σαρωτές που δίνονται σαν ορίσματα θα προσφέρει το επόμενο στοιχείο που θα επιστραφεί. import java.util.*; public class ZipperIterator implements Iterator { private Iterator left, right; private boolean nextisleft; // 3 points public ZipperIterator(Iterator left, Iterator right) { this.left = left; this.right = right; nextisleft = true; // 4 points public boolean hasnext() { return nextisleft? left.hasnext():right.hasnext(); // 2 points public Object next() { E next; next = nextisleft? left.next():right.next(); nextisleft =!nextisleft; return next; // 5 points public void remove() { if (nextisleft) right.remove(); else left.remove(); // 4 points

Common Mistakes: Αρκετοί ήταν οι φοιτητές που αντί για μια κλάση με τα παραπάνω χαρακτηριστικά έφτιαξαν μια μέθοδο που επέστρεφε μια λίστα. Κοινό λάθος ήταν επίσης η δημιουργία μιας λίστας στον κατασκευαστή με τα στοιχεία των Iterators εναλλακτικά. Τέλος πολλοί ήταν αυτοί που θεώρησαν ότι τερματίζει ο zipperiterator μόλις ένας από τους δυο Iterators τερματίζει: return it1.hasnext() && it2.hasnext(). Άσκηση 6 (15 μονάδες) Γενικοί Τύποι στην Java α) (5 μονάδες) Η Java προσφέρει περισσότερους από έναν τρόπους για να σαρώσουμε τα στοιχεία μιας λίστας. Για παράδειγμα σε μία λίστα από συμβολοσειρές: List<String> list = new LinkedList<String>(); list.add("i"); list.add("love"); list.add("everybody"); μπορούμε να σαρώσουμε τα στοιχεία της λίστας list με τον κώδικα: for (String s: list) // Technique 1 System.out.println(s); ή εναλλακτικά με τον κώδικα: Iterator<String> i = list.iterator(); // Technique 2 while (i.hasnext()) System.out.println(i.next()); Υπάρχει κάποια διαφορά στα στοιχεία της λίστας που επιστρέφουν οι παραπάνω κώδικες? Δώστε μια σύντομη και περιεκτική εξήγηση. There is no difference. The first technique is easier to write. The second technique, using the Iterator class, is usually used only when you need to do something that is possible only with an Iterator, such as selectively delete list members during iteration. β) (5 μονάδες) Δεδομένης της παρακάτω δήλωσης της κλάσης Derived public class Derived extends Base {... είναι ο γενικός τύπος LinkedList<Derived> ένας υποτύπος του LinkedList<Base>? Δώστε μια σύντομη και περιεκτική εξήγηση. LinkedList<Derived> is not a subclass of LinkedList<Base>. If B is a subclass of A, then instances of B should be substitutable for instances of A. However, if a is a LinkedList<Base>, one can perform operations such as a.add(new Base());

This operation would not be permitted for a LinkedList<Derived>. Consequently, a LinkedList<Derived> is not substitutable for a LinkedList<Base>. In other words, you cannot use a LinkedList<Derived> where a LinkedList<Base> is expected. γ) (5 μονάδες) Σε ένα πρόγραμμα Java θα πρέπει να μπορεί να εκλεχθεί στατικά (δηλ. κατά την μετάφραση) η ορθότητα των τύπων όλων των εκφράσεων που χρησιμοποιεί. Π.χ αντί για την δήλωση της παραμέτρου <T>, θα πρέπει να γράψουμε την πιο περιορισμένη: <T extends...>. Πως θα μπορούσατε να συμπληρώσετε τον παρακάτω κώδικα (στην υπογραμμισμένη περιοχή) έτσι ώστε να είναι ένα σωστό ως προς τους τύπους πρόγραμμα Java; Δώστε μια σύντομη και περιεκτική εξήγηση για την συμπλήρωση πού προτείνετε περιγράφοντας όλες τις επιπλέον κλάσεις ή διεπαφές που σας είναι απαραίτητες. Προσπαθήστε να κάνετε την υπογραφή της μεθόδου όσο περισσότερο γενική μπορείτε στα πλαίσια όμως της ορθότητας. class C {... <T extends > int f (T x, T y){... x.compareto(y)...... We call method compareto() on T, which is defined in Comparable, so T must be a subtype of Comparable, therefore its an upper bound: <T extends Comparable>. Comparable has also a generic version (say with E) and it define its method as compareto(e e). We only pass arguments of type T to this method, so E must assignable from T, i.e. a supertype. Thus, T is a lower bound, and we need <? super T>. All together: <T extends Comparable<? super T>> <T extends Comparable> is also correct, since using the raw interface Comparable makes the argument of compareto(e e) an Object, thus assignable from any possible reference T. Generally speaking, we would avoid raw types, because the compiler only issues a warning and then drops all generic type-checking on all usages of the raw type. Common Mistakes: 6α) Πολλοί φοιτητές είπαν ότι στην τεχνική 1 το s που εκτυπώνεται είναι ένα String ενώ στην τεχνική 2 το i.next() είναι Object. Κάποιοι άλλοι είπαν ότι στην τεχνική 1 δημιουργείται ένα String με όλα τα περιεχόμενα της λίστας. Τέλος κάποιοι είπαν ότι στην τεχνική 1 το τελευταίο στοιχείο που θα εκτυπωθεί θα είναι το null και ότι στη τεχνική 2 η εκτύπωση θα αρχίσει από το δεύτερο στοιχείο.

6β) Το πιο κοινό λάθος ήταν ότι θεωρούσαν ότι ο τύπος LinkedList<Derived> είναι υπότυπος του LinkedList<Base>, επειδή είναι μια λίστα από αντικείμενα τύπου Derived και ο τύπος Derived είναι subclass of Base. Άσκηση 7 (8 μονάδες) Θεωρία Αντικειμενοστρεφούς Κώδικα α) (4 μονάδες) Για ποιους λόγους θα χρησιμοποιούσατε μια διεπαφή Java στην σχεδίαση μιας ιεραρχίας κλάσεων; In general, the base class in a class hierarchy has two main purposes. First, it defines the common interface for using the set of classes. Second, because subclasses inherit methods, the base class is the proper place to implement code that will be common to all subclasses. Although the base class does specify the interface, it also includes implementation information that is of no interest to clients. The usual practice is to use a Java Interface to specify the interface, and then have the base class implement that interface. Client code is typically written to the Java Interface. This not only simplifies the task of writing client code, but the resulting code is more flexible because it will also work with different implementations of the Interface. β) (4 μονάδες) Τι είναι ένας τύπος Java; Τι είναι οι πρωτογενείς (primitive) τύποι; Τι είναι οι τύποι που ορίζονται από τούς χρήστες (user-defined); Πώς η Java χρησιμοποιεί τους τύπους ώστε να διευκολύνει τον προγραμματισμό και να καθιστά τα προγράμματα πιο αξιόπιστα; A type is a set of values and operations that may be performed on them. For instance int is a 32-bit integer type, with values ranging from -2 31 to 2 31-1. Valid operations on int are addition, subtraction, multiplication, division, the bitwise operations, etc. Java's primitive types are: int, byte, short, long, float, double, char and boolean. A user-defined type is a composition of built-in types with special operations defined on it. In Java, a user-defined type is called a class or an interface. Java checks to make sure every operation is valid with respect to its operands' types at compile time. This prevents careless errors, like treating an integer value as a floating-point, or vice versa. Type checking ensures that every operation in the program is conceptually valid before the program has a chance to run and crash.