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



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

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

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

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

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

4. Συνδεδεμένες Λίστες

Συνδεδεμένη Λίστα (Linked List)

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

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

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

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

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

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

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

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

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

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

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

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

Σύνοψη Προηγούμενου. Λίστες (Lists) Συνδεδεμένες Λίστες: Εισαγωγή (1/2) Συνδεδεμένες Λίστες. Ορέστης Τελέλης

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

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

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

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

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

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

Δομές Δεδομένων. Ενότητα 4: Ο ΑΤΔ Λίστα & Υλοποίηση Λίστας με σειριακή αποθήκευση- Ο ΑΤΔ Συνδεδεμένη Λίστα- Υλοποίηση ΑΤΔ Συνδεδεμένη Λίστα με πίνακα

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

public class ArrayStack implements Stack {

Διάλεξη 12: Δέντρα ΙΙ Δυαδικά Δέντρα

Week. 6: Java Collections

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

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

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

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

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

Διαγράμματα Κλάσεων στη Σχεδίαση

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

Κλάσεις. Κατηγορίες Αντικειµένων. Κλάσεις. Φυσικά Αντικείµενα. Χώρος = Οµάδα Φυσικών Αντικειµένων. Πρόγραµµα = Οµάδα

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

public class ArrayQueue implements Queue {

Χρήση της αναπαραγωγής ipod

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

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

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

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

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

Κεφάλαιο 6 Ουρές Προτεραιότητας

Ουρά Προτεραιότητας (priority queue)

Διάλεξη 16: Σωροί. Στην ενότητα αυτή θα μελετηθούν τα εξής επιμέρους θέματα: - Ουρές Προτεραιότητας - Ο ΑΤΔ Σωρός, Υλοποίηση και πράξεις

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

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

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

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

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών. ΤΗΜΜΥ Α.Π.Θ Τρίτη 1 / 12 / 2015 ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

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

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΕΠΙΚΟΙΝΩΝΙΩΝ ΤΜΗΜΑ ΨΗΦΙΑΚΩΝ ΣΥΣΤΗΜΑΤΩΝ «ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ»

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

Δομές Αναζήτησης. κλειδί από ολικά διατεταγμένο σύνολο. Θέλουμε να υποστηρίξουμε δύο βασικές λειτουργίες: Εισαγωγή ενός νέου στοιχείου

9:00-10:00 π.μ. (60 λεπτά) Παρασκευή, 14 Οκτωβρίου, 2016

«ΕΙΔΙΚΑ ΘΕΜΑΣΑ ΣΟΝ ΠΡΟΓΡΑΜΜΑΣΙΜΟ ΤΠΟΛΟΓΙΣΩΝ» Κεφάλαιο 4: Αντικειμενοςτρεφήσ Προγραμματιςμόσ

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

Κλάσεις και Αντικείµενα

Week 7: Java Collection Classes

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

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

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

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

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

3 Αλληλεπίδραση Αντικειμένων

Συναρτήσεις Κατακερματισμού και Πίνακες Κατακερματισμού

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

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

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Copy Constructor Deep and Shallow Copies

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

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

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

Προγράμματα με δομή Κληρονομικότητας

Οι βασικές λειτουργίες (ή πράξεις) που γίνονται σε μια δομή δεδομένων είναι:

Σύστηµα Java RMI. Κατανεµηµένα Συστήµατα 17-1

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

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

Συνδεδεμένη Λίστα ΣΛ null VK 23

1ο Φύλλο Εργασίας. της παλέτας Ήχος. Πώς μπορούμε να εισάγουμε και να αναπαράγουμε έναν ήχο;

Διδάσκων: Κωνσταντίνος Κώστα Διαφάνειες: Δημήτρης Ζεϊναλιπούρ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ. ΘΕΩΡΗΤΙΚΗ ΑΣΚΗΣΗ 2 ΛΥΣΕΙΣ Γραμμικές Δομές Δεδομένων, Ταξινόμηση

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

Ονοματεπώνυμο και ΑΜ: Είχα παραδώσει εργασίες τα εξής ακαδημαϊκά έτη: Διάρκεια: 2,5 ώρες, κλειστά βιβλία και σημειώσεις ΚΑΛΗ ΕΠΙΤΥΧΙΑ!

Διασυνδεδεμένες Δομές. Δυαδικά Δέντρα. Προγραμματισμός II 1

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

Δηµοσθένης Σταµάτης Τµήµα Πληροφορικής ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΔΕΝΤΡΑ (TREES) B C D E F G H I J K L M

Δοµές Δεδοµένων. 6η Διάλεξη Αναδροµικές Εξισώσεις και Αφηρηµένοι Τύποι Δεδοµένων. Ε. Μαρκάκης

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

Διάλεξη 26: Σωροί. Διδάσκων: Παναγιώτης Ανδρέου

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

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

Πληροφορική & Τηλεπικοινωνίες. K18 - Υλοποίηση Συστημάτων Βάσεων Δεδομένων Εαρινό Εξάμηνο

Νήµαταστην Java. Συγχρονισµός νηµάτων Επικοινωνία νηµάτων Εκτελέσιµα αντικείµενα Νήµατα δαίµονες Οµάδες νηµάτων. Κατανεµηµένα Συστήµατα 11-1

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

Transcript:

HY-252 Αντικειμενοστραφής Προγραμματισμός Χειμερινό Εξάμηνο 2012 Διδάσκων: Χριστοφίδης Βασίλης 2 η Σειρά Ασκήσεων Ημερομηνία Παράδοσης: 16/11/2012 Παρακάτω σας δίνονται οι ορισμοί τεσσάρων διαφορετικών Αφαιρετικών Τύπων Δεδομένων (ΑΤΔ). Για όλες τις λειτουργίες (operations) αυτών των ΑΤΔ, δώστε τις υπογραφές (signatures), το είδος τους ανάλογα με την επίδραση που έχουν στην κατάσταση των αντικειμένων (constructors, accessors, transformers), και τις εκ των προτέρων, τις εκ των υστέρων και τις αμετάβλητες συνθήκες (preconditions, postconditions, invariants). Στη συνέχεια, υλοποιήστε τους ΑΤΔ χρησιμοποιώντας κλάσεις Java. Χρησιμοποιήστε τους μηχανισμούς των JUnit Tests της Java για να ελέγξετε την ορθότητα του κώδικά σας. Τεκμηριώστε τον κώδικα σας με την βοήθεια των Javadocs. Για κάθε άσκηση, πέρα από τον πηγαίο κώδικα που υλοποιεί τους ΑΤΔ που σας ζητούνται, θα πρέπει να συμπεριλάβετε και όλα τα.html αρχεία που παράγει η Javadoc, τα JUnit tests καθώς και μικρά προγράμματα πελάτες που χρησιμοποιούν τις λειτουργίες των ΑΤΔ που υλοποιήσατε. Παραδοτέα: Multiset/Multiset.java LeftRightStack/LeftRightStack.java MusicCollection/Track.java MusicCollection/MusicCollection.java MultiMap/MultiMap.java Επίσης, πρέπει να παραδώσετε τα παρακάτω αρχεία με JUnit Tests: Multiset/MultisetTest.java LeftRightStack/LeftRightStackTest.java MusicCollection/TrackTest.java MusicCollection/MusicCollectionTest.java MultiMap/MultiMapTest.java ΠΡΟΣΟΧΗ!!! Σε καμία περίπτωση δε πρέπει να αλλάξετε τα ονόματα των μεθόδων των συμβολαίων, τα ονόματα των κλάσεων ή των πακέτων που σας δίνονται. Άσκηση 1 Πολυσύνολα (20%) Όνομα πακέτου: Multiset Όνομα αρχείου: Multiset.java

Σχεδιάστε και υλοποιήστε τον αφαιρετικό τύπο δεδομένων (ΑΤΔ) για πολυσύνολα (με όνομα Multiset).Ένα πολυσύνολο είναι μία συλλογή αντικειμένων, τα οποία δεν είναι ταξινομημένα και ανακτούμε τα αντικείμενα με τυχαία σειρά. Ένα πολυσύνολο αποτελείται από έναν πίνακα αντικειμένων με ορισμένη χωρητικότητα και έχει συγκεκριμένο μέγεθος. Θεωρούμε ένα συμβόλαιο για τον ΑΤΔ Multiset που περιλαμβάνει τις εξής λειτουργίες: Δημιουργία ενός νέου πολυσυνόλου (1%): public Μultiset(); Δημιουργία ενός νέου πολυσυνόλου με προκαθορισμένα μέγεθος και χωριτηκότητα (1%): public Μultiset(int capacity, int m_size); Προσθήκη ενός αντικειμένου στο πολυσύνολο (3%): public void additem (Object Item); Ανάκτηση ενός αντικειμένου από το πολυσύνολο (3%): public Object getitem(); Διαγραφή ενός αντικειμένου από το πολυσύνολο (3%): public Object deleteitem(); Έλεγχος εάν το πολυσύνολο είναι γεμάτο (1%): public boolean isfull(); Έλεγχος εάν το πολυσύνολο είναι άδειο (1%): public boolean isempty(); Επιστροφή του μεγέθους του πολυσυνόλου (1%): public int currentsize(); Επιστροφή της χωρητικότητας του πολυσυνόλου (1%): public int capacity(); Σημασιολογία: H χωρητικότητα του κενού πολυσυνόλου μπορεί να οριστεί ίση με 50. Η ανάκτηση ή η διαγραφή ενός αντικειμένου από το πολυσύνολο γίνεται με τυχαίο τρόπο. Μπορείτε να χρησιμοποιήσετε την κλάση Random της Java ως γεννήτρια τυχαίων αριθμών. Δείτε τα παρακάτω links για την κατανόηση και χρήση της κλάσης Random:

http://docs.oracle.com/javase/1.4.2/docs/api/java/util/random.html http://alvinalexander.com/java/java-random-class-random-int-integerexample Με την ανάκτηση ενός αντικειμένου από το πολυσύνολο δεν το διαγράφουμε. 5% του βαθμού της άσκησης παίρνουν τα Javadoc-JUnit test. Άσκηση 2 LeftRightStack (25%) Όνομα πακέτου: LeftRightStack Όνομα αρχείου: LeftRightStack.java Σχεδιάστε και υλοποιήστε τον αφαιρετικό τύπο δεδομένων (ΑΤΔ) για την LeftRightStack, η οποία συμπεριφέρεται όπως η γνωστή στοίβα, εκτός από το γεγονός ότι τα στοιχεία που εισάγονται στη λίστα χαρακτηρίζονται από τα αναγνωριστικά left και right. Θεωρούμε ένα συμβόλαιο για τον ΑΤΔ LeftRightStack που περιλαμβάνει τις εξής λειτουργίες: Δημιουργία μίας άδειας στοίβας (1%): public LeftRightStack (); Έλεγχος αν η στοίβα είναι άδεια (1%): public boolean isempty(); Άδειασμα της στοίβας (1%): public void makeempty(); Επιστροφή μεγέθους της στοίβας (1%): public int size();

Εισαγωγή ενός νέου left αντικειμένου στη στοίβα (2%): public void pushleft (Object Obj); Διαγραφή του πιο πρόσφατα εισαγόμενου left αντικείμενου από τη στοίβα (1%): public void popleft(); Επιστροφή του πιο πρόσφατα εισαγόμενου left αντικείμενου από τη στοίβα (2%): public node topleft(); Επιστροφή και διαγραφή του πιο πρόσφατα εισαγόμενου left αντικείμενου από τη στοίβα (2%): public node topandpopleft (); Εισαγωγή ενός νέου right αντικεiμένου στη στοίβα (2%): public void pushright (Object Obj); Διαγραφή του πιο πρόσφατα εισαγόμενου right αντικείμενου από τη στοίβα (1%): public void popright(); Επιστροφή του πιο πρόσφατα εισαγόμενου right αντικείμενου από τη στοίβα (2%): public node topright(); Επιστροφή και διαγραφή του πιο πρόσφατα εισαγόμενου right αντικείμενου από τη στοίβα (2%): public node topandpopright(); Επιστροφή όλων των στοιχείων της στοίβας ως συμβ/ρές με το αναγνωριστικό left ή right (2%): Σημασιολογία: public String tostring (); Κάθε στοίβα έχει ένα συγκεκριμένο μέγεθος το οποίο αλλάζει ανάλογα με τις λειτουργίες που εκτελούνται. Όπως βλέπετε στο παραπάνω σχήμα, η στοίβα αποτελείται από Nodes και κάθε Node έχει ορισμένα χαρακτηριστικά. Πριν ξεκινήσετε την υλοποίησή σας ορίστε τη συγκεκριμένη κλάση. Μπορεί να οριστεί και ως private class μέσα στην κλάση LeftRightStack. Σε περίπτωση που εκτελούνται οι εντολές popleft/topandpopleft (αντίστοιχα για right) και δεν υπάρχει τέτοιος κόμβος, επιστρέφεται null.

5% του βαθμού της άσκησης παίρνουν τα Javadoc-JUnit test. Άσκηση 3 Μουσική συλλογή (25%) Όνομα πακέτου: MusicCollection Ονόματα αρχείων: Track.java MusicCollection.java Σχεδιάστε και υλοποιήστε τους Αφαιρετικούς Τύπους Δεδομένων (ΑΤΔ) ενός μουσικού κομματιού (Track) και μίας μουσικής συλλογής (MusicCollection). Ένα μουσικό κομμάτι αποτελείται από τον τίτλο του (title), το όνομα του καλλιτέχνη (artist), το όνομα του άλμπουμ (album), τις φορές που έχει αναπαραχθεί (plays) και τη διάρκειά του σε δευτερόλεπτα (duration). Μία μουσική συλλογή αποτελείται από το όνομά της (name), μία λίστα με τα τραγούδια που περιέχει (tracklist) και το πλήθος των κομματιών που περιέχει (total). Θεωρούμε ένα συμβόλαιο για τον ΑΤΔ Track που περιλαμβάνει τις παρακάτω λειτουργίες: Δημιουργία ενός κομματιού (0.5%): public Track(String newtitle, String newartist, String newalbum, int newplays, int newduration); Επιστροφή του ονόματος του κομματιού (0.5%): public String gettitle(); Αλλαγή του ονόματος του κομματιού (0.5%): public void settitle(string newtitle); Επιστροφή του ονόματος του καλλιτέχνη (0.5%): public String getartist(); Αλλαγή του ονόματος του καλλιτέχνη (0.5%): public void setartist(string newartist); Επιστροφή του ονόματος του άλμπουμ (0.5%): public String getalbum(); Αλλαγή του ονόματος του άλμπουμ (0.5%): public void setalbum(string newalbum); Επιστροφή του πλήθους των αναπαραγωγών του κομματιού (0.5%): public int getplays(); Επιστροφή της διάρκειας του κομματιού (σε δευτερόλεπτα) (0.5%): public int getduration();

Αναπαραγωγή του κομματιού (0.5%): public void play(); Επιστροφή της αναπαράστασης σε String του κομματιού (1%): public String tostring(); Θεωρούμε ένα συμβόλαιο για τον ΑΤΔ MusicCollection που περιλαμβάνει τις παρακάτω λειτουργίες: Δημιουργία μίας μουσικής συλλογής (0.5%): public MusicCollection(String newname); Επιστροφή του ονόματος της μουσικής συλλογής (0.5%): public String getname(); Αλλαγή του ονόματος της μουσικής συλλογής (1%): public void setname(string newname); Προσθήκη ενός μουσικού κομματιού στη μουσική συλλογή (1%): public boolean addtrack(track tr); Διαγραφή ενός μουσικού κομματιού από τη μουσική συλλογή με βάση το δοθέντα τίτλο και άλμπουμ και επιστροφή του (2%): public Track removetrack(string title, String album); Αλλαγή του ονόματος ενός κομματιού, δοθέντος του προηγούμενου τίτλου του και του άλμπουμ του (1%): public void renametrack(string oldtitle, String album, String newtitle); Αλλαγή του άλμπουμ ενός κομματιού, δοθέντος του τίτλου του και του προηγούμενου άλμπουμ του (1%): public void setalbum(string title, String oldalbum, String newalbum); Αλλαγή του καλλιτέχνη ενός κομματιού, δοθέντος του τίτλου του και του άλμπουμ του (1%): public void setartist(string title, String album, String newartist);

Αναπαραγωγή ενός κομματιού με βάση το δοθέντα τίτλο και άλμπουμ του (1%): public void playtrack(string title, String album); Επιστροφή του πλήθους των κομματιών της μουσικής συλλογής (0.5%): public int gettotaltracks(); Επιστροφή του συνολικού χρόνου αναπαραγωγής της λίστας κομματιών (σε δευτερόλεπτα) (1%): public int gettotaltime(); Επιστροφή του κομματιού στη μουσική συλλογή με τις περισσότερες αναπαραγωγές (1%): public Track getmostplayed(); Διαγραφή όλων των κομματιών από τη λίστα κομματιών της μουσικής συλλογής (0.5%): public void removeall(); Επιστροφή της αναπαράστασης σε String της μουσικής συλλογής (2%): public String tostring(); Σημασιολογία: Ο αριθμός των αναπαραγωγών (plays) κάθε κομματιού είναι ένας μετρητής που αυξάνεται κάθε φορά που το τραγούδι αναπαράγεται. Για να βρίσκετε και να επιστρέφεται ένα κομμάτι στη λίστα, θα σας βοηθήσει να υλοποιήσετε μία μέθοδο που θα εντοπίζει το index αυτού του κομματιού μέσα στη LinkedList με βάση τον τίτλο και το άλμπουμ του. Η μέθοδος gettotaltime() πρέπει να υπολογίζει το συνολικό χρόνο αναπαραγωγής της λίστας κομματιών. Αυτό γίνεται με το να υπολογίζει το άθροισμα του χρόνου αναπαραγωγής κάθε κομματιού, ο οποίος εξαρτάται από το πλήθος των αναπαραγωγών του (plays) και τη διάρκειά του (duration). Οι μέθοδοι tostring πρέπει να εμφανίζουν τις πληροφορίες όσο το δυνατό καλαίσθητα και αυτές να «βγάζουν νόημα». 5% του βαθμού της άσκησης παίρνουν τα Javadoc-JUnit test.

Άσκηση 4 Απεικόνιση (MultiMap) (30%) Όνομα πακέτου: MultiMap Ονόματα αρχείων: MultiMap.java Σχεδιάστε έναν Αφαιρετικό Τύπο Δεδομένων (ΑΤΔ) Aπεικόνιση (MultiMap). To MultiMap αντιστοιχίζει ένα κλειδί σε ένα σύνολο αντικειμένων σε αντίθεση με το απλό Map που αντιστοιχίζει ένα κλειδί σε ένα αντικείμενο. Ο σχεδιασμός του MultiMap θα πρέπει να λαμβάνει υπόψη τις παρακάτω λειτουργίες: Δημιουργία μίας κενής απεικόνισης (1%): public MultiMap(); Έλεγχος αν η απεικόνιση είναι άδεια (2%): public boolean isempty(); Επιστροφή του πληθαρίθμου της απεικόνισης (2%): public int size(); Επιστροφή των αντικειμένων στην απεικόνιση, δεδομένου ενός δοσμένου κλειδιού (2%): public LinkedList get(object key); Έλεγχος για το αν δύο απεικονίσεις είναι ίσες (2%): public boolean equals(multimap m); Επιστροφή του συνόλου των κλειδιών στην απεικόνιση (2%): public TreeSet keyset(); Διαγραφή όλων των εγγραφών στην απεικόνιση (1%): public void clear(); Προσθήκη μίας νέας εγγραφής στην απεικόνιση, δίνοντας το ζεύγος <κλειδί, αντικείμενο>. Επιστροφή των αντικειμένων, αν υπήρχαν, που ήταν συνδεδεμένα με το δοσμένο κλειδί πριν την εισαγωγή (3%): public LinkedList put(object key, Object value);

Διαγραφή μίας εγγραφής από την απεικόνιση, δίνοντας το ζεύγος <κλειδί, αντικείμενο>. Επιστροφή του αντικειμένου που μόλις διαγράφηκε (3%): public Object remove(object key, Object value); Διαγραφή όλων των εγγραφών της απεικόνισης που αντιστοιχούν στο δοσμένο κλειδί. Επιστροφή της λίστας των αντικειμένων που ήταν συνδεδεμένα με το δοσμένο κλειδί πριν τη διαγραφή (3%): public LinkedList remove(object key); Αντικατάσταση όλων των εγγραφών της απεικόνισης με τις εγγραφές μίας άλλης δοθείσας απεικόνισης (2%): public void replace(multimap m); Εκτύπωση των εγγραφών της απεικόνισης (2%): public void printmultimap(); Στην εικόνα 1 φαίνεται ένα παράδειγμα απεικόνισης (MultiMap). Ισοδύναμα, και βοηθητικά ως προς την υλοποίησή σας, μπορείτε να δείτε και την απεικόνιση στην εικόνα 2. Key Value K 1 V 1 K 1 V 2 K 1 V 3 K 2 V 4...... Σημασιολογία: Key Value K 1 {V 1,V 2,V 3 } K 2 {V 4 }.................. Εικόνα 1 Εικόνα 2 Η υλοποίηση του MultiMap θα πρέπει να γίνει με συνδεδεμένες λίστες. Το MultiMap περιέχει εγγραφές (records). Οι εγγραφές αυτές περιέχουν ένα μοναδικό κλειδί και μία λίστα αντικειμένων που αντιστοιχούν σε αυτό το κλειδί. Θα πρέπει να ορίσετε μία κλάση για τις εγγραφές που θα έχει αυτά τα χαρακτηριστικά. Αυτή η κλάση μπορεί να οριστεί σαν private στην κλάση MultiMap. Οι μέθοδοι remove και get θα πρέπει να επιστρέφουν null αν δεν βρεθούν οι αντίστοιχες εγγραφές. Για τη μέθοδο equals θα σας βοηθήσει να δημιουργήσετε μία επιπλέον μέθοδο που θα ελέγχει αν δύο LinkedList είναι ίδιες, ανεξαρτήτως της σειράς που εμφανίζονται τα αντικείμενα σε αυτές. 5% του βαθμού της άσκησης παίρνουν τα Javadoc-JUnit test.