ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΕΙΡΑΙΩΣ Τµήµα Ψηφιακών Συστηµάτων Μάθηµα: «Αντικειµενοστρεφής Προγραµµατισµός» 2 ο εξάµηνο, Εαρινή περίοδος 2015-2016 ΕΡΓΑΣΙΑ ΜΑΘΗΜΑΤΟΣ Η εργασία αυτή θα σας βοηθήσει να εξοικειωθείτε µε τις βασικές έννοιες του αντικειµενοστρεφούς προγραµµατισµού και µε τον προγραµµατισµό σε γλώσσα Java. Η εργασία πρέπει να εκπονηθεί από οµάδες µέχρι δύο ατόµων (µπορεί να γίνει και ατοµική αν δεν υπάρχει η δυνατότητα οµαδικής εργασίας). Η εργασία σας θα πρέπει να παραδοθεί σε ένα αρχείο ΑΜ1-ΑΜ2.zip (ΑΜ1, ΑΜ2 οι αριθµοί µητρώου των µελών της οµάδας). Το zip αρχείο θα υποβληθεί µέσω eclass (ανεβάστε το αρχείο στην περιοχή «Εργασίες» στο https://evdoxos.ds.unipi.gr/). Η εργασία θα πρέπει να παραδοθεί µέχρι τις 5/6/2016, ώρα 23:59 (µετά την παρέλευση της ηµεροµηνίας αυτής δεν πρόκειται να γίνουν δεκτές εργασίες). Οδηγίες ανάπτυξης και εξαγωγής πηγαίου κώδικα εργασίας από το Eclipse Για την ανάπτυξη του πηγαίου κώδικα της εργασίας και την εκτέλεση θα χρησιµοποιήσετε το ολοκληρωµένο περιβάλλον ανάπτυξης Eclipse. Για την εξαγωγή και αποθήκευση του πηγαίου κώδικα της εργασίας, πρέπει να ακολουθήσετε τα εξής βήµατα µέσα από το Eclipse: 1. Από το µενού του Eclipse (η µπάρα στο πάνω µέρος) επιλέγετε File ->Export. 2. Στο παράθυρο που σας ανοίγει, επιλέγετε από την κατηγορία General, την επιλογή Archive File και πατάτε Next. 3. Επιλέγετε το project στο πάνω αριστερά µέρος (τικάρετε το κουτάκι στα αριστερά του ονόµατος) και πατάτε το κουµπί Browse... για να επιλέξετε τη διαδροµή που θα αποθηκευτεί το αρχείο. 4. Τέλος, πατάτε το κουµπί Finish για να αποθηκευτεί ο κώδικάς σας σε συµπιεσµένη µορφή στο zip αρχείο, το οποίο θα αποστείλετε µέσω του eclass. Περιγραφή Εργασίας Να αναπτύξετε ένα πρόγραµµα σε γλώσσα προγραµµατισµού Java το οποίο θα περιέχει: 1. Κλάση Person η οποία θα περιλαµβάνει: - Πεδία: όνοµα, επώνυµο, email. όπου namefieldvalue, lastnamefieldvalue και emailfieldvalue είναι οι τιµές των πεδίων όνοµα, επώνυµο και email αντίστοιχα για το στιγµιότυπο της κλάσης Person. ΣΗΜΕΙΩΣΗ: Πρέπει να διασφαλίζεται ότι και για οποιοδήποτε αντικείµενο της κλάσης, το email περιέχει τους χαρακτήρες «@» και «.». 2. Κλάση Publisher η οποία θα περιλαµβάνει: - Πεδία: όνοµα, διεύθυνση, χώρα, πόλη.
όπου namefieldvalue,addressfieldvalue, cityfieldvalue και countryfieldvalue είναι οι τιµές των πεδίων όνοµα, διεύθυνση, πόλη και χώρα αντίστοιχα για το στιγµιότυπο της κλάσης Publisher. 3. Κλάση Item η οποία θα περιλαµβάνει: - Πεδία: τίτλος, εκδότης, τιµή, ποσότητα, έτος έκδοσης. Ο εκδότης αποτελεί αντικείµενο της κλάσης Publisher. όπου titlefieldvalue, pricefieldvalue, yearfieldvalue, quantityfieldvalue είναι οι τιµές των πεδίων τίτλος, τιµή, έτος έκδοσης, ποσότητα, αντίστοιχα για το στιγµιότυπο της κλάσης Item και namefieldvalue, addressfieldvalue, cityfieldvalue και countryfieldvalue είναι οι τιµές των πεδίων όνοµα, διεύθυνση, πόλη και χώρα αντίστοιχα του εκδοτικού οίκου για το στιγµιότυπο της κλάσης Item. 4. Κλάση Author η οποία θα κληρονοµεί από την κλάση Person και θα περιλαµβάνει επιπλέον: - Πεδίο: φύλο Author: { Gender: genderfieldvalue όπου namefieldvalue, lastnamefieldvalue, emailfieldvalue και genderfieldvalue είναι οι τιµές των πεδίων όνοµα, επώνυµο, email και φύλο αντίστοιχα για το στιγµιότυπο της κλάσης Author. ΣΗΜΕΙΩΣΗ: Πρέπει να διασφαλίζεται ότι και για οποιοδήποτε αντικείµενο της κλάσης, το φύλο έχει τιµή F ή «M. 5. Κλάση Student η οποία θα κληρονοµεί από την κλάση Person και θα περιλαµβάνει επιπλέον: - Πεδίο: id
- Υπερφόρτωση της µεθόδου tostring() η οποία θα επιστρέφει το αλφαριθµητικό : Student: { ID: idfieldvalue όπου namefieldvalue, lastnamefieldvalue, emailfieldvalue και idfieldvalue είναι οι τιµές των πεδίων όνοµα, επώνυµο, email και id αντίστοιχα για το στιγµιότυπο της κλάσης Student. 6. Κλάση Book η οποία θα κληρονοµεί από την κλάση Item και θα περιλαµβάνει επιπλέον: - Πεδία: συγγραφέας, isbn. Ο συγγραφέας αποτελεί αντικείµενο της κλάσης Author. - Κατασκευαστή/Κατασκευαστές και accessor/mutator (get/set) µεθόδους. Book: { Author: { Name: authornamefieldvalue Last Name: authorlastnamefieldvalue Email: authoremailfieldvalue Gender: authorgenderfieldvalue ISBN: isbnfieldvalue όπου titlefieldvalue, pricefieldvalue, yearfieldvalue, quantityfieldvalue, isbnfieldvalue είναι οι τιµές των πεδίων τίτλος, τιµή, έτος έκδοσης, ποσότητα και isbn αντίστοιχα για το στιγµιότυπο της κλάσης Book και namefieldvalue, addressfieldvalue, cityfieldvalue και countryfieldvalue είναι οι τιµές των πεδίων όνοµα, διεύθυνση, πόλη και χώρα αντίστοιχα του εκδοτικού οίκου για το στιγµιότυπο της κλάσης Book και authornamefieldvalue, authorlastnamefieldvalue, authoremailfieldvalue και authorgenderfieldvalue είναι οι τιµές των πεδίων όνοµα, επώνυµο, email και φύλο αντίστοιχα του συγγραφέα του στιγµιοτύπου της κλάσης Book. 7. Κλάση Magazine η οποία θα κληρονοµεί από την κλάση Item και θα περιλαµβάνει επιπλέον: - Πεδίο: τεύχος
Magazine: { Issue: issuefieldvalue όπου titlefieldvalue, pricefieldvalue, yearfieldvalue, quantityfieldvalue, issuefieldvalue είναι οι τιµές των πεδίων τίτλος, τιµή, έτος έκδοσης, ποσότητα και τεύχος αντίστοιχα για το στιγµιότυπο της κλάσης Magazine και namefieldvalue, addressfieldvalue, cityfieldvalue και countryfieldvalue είναι οι τιµές των πεδίων όνοµα, διεύθυνση, πόλη και χώρα αντίστοιχα του εκδοτικού οίκου για το στιγµιότυπο της κλάσης Magazine. 8. Κλάση Loan όπου θα περιλαµβάνει: - Πεδία: φοιτητής, item. - Υπερφόρτωση της µεθόδου tostring() η οποία θα επιστρέφει: a) το ακόλουθο αλφαριθµητικό αν το item είναι βιβλίο: Loan: { Student: { ID: idfieldvalue Book: { Author: { Name: authornamefieldvalue Last Name: authorlastnamefieldvalue Email: authoremailfieldvalue Gender: genderfieldvalue ISBN: isbnfieldvalue
όπου namefieldvalue, lastnamefieldvalue, emailfieldvalue και idfieldvalue είναι οι τιµές των πεδίων όνοµα, επώνυµο, email και id αντίστοιχα για το φοιτητή του στιγµιοτύπου της κλάσης Loan και titlefieldvalue, pricefieldvalue, yearfieldvalue, quantityfieldvalue, isbnfieldvalue είναι οι τιµές των πεδίων τίτλος, τιµή, έτος έκδοσης, ποσότητα και isbn αντίστοιχα για το βιβλίο του στιγµιοτύπου της κλάσης Loan και namefieldvalue, address- FieldValue, cityfieldvalue και countryfieldvalue είναι οι τιµές των πεδίων όνοµα, διεύθυνση, πόλη και χώρα αντίστοιχα του εκδοτικού οίκου του βιβλίου του στιγµιοτύπου της κλάσης Loan και authornamefieldvalue, authorlastnamefieldvalue, authoremail- FieldValue και authorgenderfieldvalue είναι οι τιµές των πεδίων όνοµα, επώνυµο, email και φύλο αντίστοιχα του συγγραφέα του βιβλίου του στιγµιοτύπου της κλάσης Loan. b) το ακόλουθο αλφαριθµητικό αν το item είναι περιοδικό: Loan: { Student: { ID: idfieldvalue Magazine: { Name: publishernamefieldvalue Issue: issuefieldvalue όπου namefieldvalue, lastnamefieldvalue, emailfieldvalue και idfieldvalue είναι οι τιµές των πεδίων όνοµα, επώνυµο, email και id αντίστοιχα για το φοιτητή του στιγµιοτύπου της κλάσης Loan και titlefieldvalue, pricefieldvalue, yearfieldvalue, quantityfieldvalue, issuefieldvalue είναι οι τιµές των πεδίων τίτλος, τιµή, έτος έκδοσης, ποσότητα και τεύχος αντίστοιχα για το περιοδικό του στιγµιοτύπου της κλάσης Loan και namefieldvalue, addressfieldvalue, cityfieldvalue και countryfieldvalue είναι οι τιµές των πεδίων όνοµα, διεύθυνση, πόλη και χώρα αντίστοιχα του εκδοτικού οίκου του περιοδικού του στιγµιοτύπου της κλάσης Loan. ΣΗΜΕΙΩΣΗ: Για την επίλυση του συγκεκριµένου ερωτήµατος ενδείκνυται η χρήση της µεθόδου instanceof που είναι ικανή να ελέγχει αν ένα αντικείµενο item ανήκει στην κλάση Book ή Μagazine. [https://docs.oracle.com/javase/tutorial/displaycode.html?code=https:// docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/instanceofdemo.java] 9. Προσαρµογή της κλάσης Loan ώστε να περιέχει ένα ακόµα πεδίο αυτό της τρέχουσας ηµεροµηνίας (ηµεροµηνία και ώρα) κατά την οποία δηµιουργήθηκε ένα αντικείµενο της κλάσης Loan και να οριστεί η συνάρτηση που θα ορίζει την ηµεροµηνία. Η κλάση Loan πρέπει να υλοποιεί τη µέθοδο loantime() του Interface Time που θα επιστρέφει την ηµεροµηνία µε
την οποία θα ορίζεται η τιµή ηµεροµηνία και ώρα στο πεδίο ηµεροµηνίας κατά τη δηµιουργία ενός αντικειµένου τύπου Loan. Το παραπάνω θα πρέπει να πραγµατοποιηθεί χωρίς προσθήκη επιπλέον ορίσµατος στον κατασκευαστή της Loan άλλα µέσα σε αυτόν να ορίζεται η τιµή του πεδίου ηµεροµηνία µε βάση τη loantime(). Παράλληλα να δηµιουργηθεί η public συνάρτηση getloantime η οποία θα επιστρέφει την τιµή του πεδίου ηµεροµηνίας (ηµεροµηνία και ώρα). O υπολογισµός της ηµεροµηνίας θα γίνεται µε τη χρήση της κλάσης Date του πακέτου java.util [https://docs.oracle.com/javase/6/docs/api/java/util/ Date.html]. Τέλος Πρέπει να γίνει και επέκταση της µεθόδου tostring() της κλάσης Loan ώστε να περιλαµβάνει το πρόσθετο πεδίο ως έξης: Student: { ID: idfieldvalue Magazine: { Name: publishernamefieldvalue Issue: issuefieldvalue Timestamp: timestampfieldvalue 10. Κλάση Management που θα περιλαµβάνει τη συνάρτηση main η οποία µε τη χρήση ενός µενού που θα εµφανίζεται κατά την εκκίνηση της εκτέλεσης του προγράµµατος θα είναι σε θέση ανάλογα µε την επιλογή του χρήστη να εκτελεί τα ακόλουθα: 1. Δηµιουργία νέου αντικειµένου της κλάσης Student, όταν ο χρήστης εισάγει την τιµή 1. Αυτό θα συνεπάγεται τη δηµιουργία δυναµική νέων αντικειµένων (εκχώρηση τιµών στα πεδία µε βάση τιµές που εισάγει ο χρήστης από το πληκτρολόγιο) της κλάσης Student και καταχώρηση σε κατάλληλο πίνακα τύπου Student αν ο φοιτητής δεν έχει εκχωρηθεί παλαιότερα και εκτύπωση του αρχικού µενού. Ο έλεγχος θα γίνεται µε βάση το πεδίο id µε µία επανάληψη που θα ελέγχει ένα προς ένα αν τα αντικείµενα Student του πίνακα students έχουν πεδίο id ίδιο µε αυτό που εισήγαγε ο χρήστης. Αν δεν συµπίπτει, τότε το νέο αντικείµενο τύπου Student εισάγεται στον πίνακα students και στη συνέχεια εκτυπώνεται ξανά το αρχικό µενού. Θα πρέπει να γίνει χρήση της κλάσης ArrayList και των µεθόδων της: ArrayList< Student > students (µέθοδοι students.add(student), students.get(index), students.size(); ). 2. Δηµιουργία νέου αντικειµένου της κλάσης Book, όταν ο χρήστης εισάγει την τιµή 2. Αυτό θα συνεπάγεται τη δηµιουργία δυναµική νέων αντικειµένων (εκχώρηση τιµών στα πεδία µε βάση τιµές που εισάγει ο χρήστης από το πληκτρολόγιο) της κλάσης Book και καταχώρηση σε κατάλληλο πίνακα τύπου Item αν το βιβλίο δεν έχει εκχωρηθεί παλαιότερα. Ο έλεγχος θα γίνεται µε βάση το πεδίο τίτλος µε µία
επανάληψη που θα ελέγχει ένα προς ένα αν τα αντικείµενα τύπου Book του πίνακα items έχουν το πεδίο τίτλο ίδιο µε αυτό που εισήγαγε ο χρήστης. Αν δεν συµπίπτει, τότε το νέο αντικείµενο τύπου Book εισάγεται στον πίνακα items. Θα πρέπει να γίνει χρήση της κλάσης ArrayList και των µεθόδων της: ArrayList< Items > items (µέθοδοι items.add(book), items.get(index), items.size()). Παράλληλα, δηµιουργία κατάλληλων αντικειµένων της κλάσης Publisher και Author αναγκαία ως ορίσµατα δηµιουργίας αντικειµένων της κλάσης Book και εκτύπωση του αρχικού µενού. 3. Δηµιουργία νέου αντικειµένου της κλάσης Magazine, όταν ο χρήστης εισάγει την τιµή 3. Αυτό θα συνεπάγεται τη δηµιουργία δυναµική νέων αντικειµένων (εκχώρηση τιµών στα πεδία µε βάση τιµές που εισάγει ο χρήστης από το πληκτρολόγιο) της κλάσης Magazine και καταχώρηση στον παραπάνω πίνακα τύπου Item (υποερώτηµα 10.2) αν το περιοδικό δεν έχει εκχωρηθεί παλαιότερα. Ο έλεγχος θα γίνεται µε βάση το πεδίο τίτλος µε µία επανάληψη που θα ελέγχει ένα προς ένα αν τα αντικείµενα τύπου Magazine του πίνακα items έχουν το πεδίο τίτλο ίδιο µε αυτό που εισήγαγε ο χρήστης. Αν δεν συµπίπτει τότε το νέο αντικείµενο τύπου Magazine εισάγεται στον πίνακα items. Θα πρέπει να γίνει χρήση της κλάσης ArrayList και των µεθόδων της: ArrayList< Items > items (µέθοδοι items.add(magazine), items.get(index), items.size()). Παράλληλα, δηµιουργία κατάλληλου αντικειµένου της κλάσης Publisher αναγκαίο ως όρισµα δηµιουργίας αντικειµένου της κλάσης Magazine και εκτύπωση αρχικού µενού. 4. Δηµιουργία νέου αντικειµένου της κλάσης Loan, όταν ο χρήστης εισάγει την τιµή 4. Αυτό θα συνεπάγεται τη δηµιουργία δυναµική νέων αντικειµένων (εκχώρηση τιµών στα πεδία µε βάση τιµές που εισάγει ο χρήστης από το πληκτρολόγιο) της κλάσης Loan. Για να επιτευχθεί αυτό θα πρέπει να εµφανίζεται κατάλληλο µήνυµα προς το χρήστη ώστε να εισαχθούν από το πληκτρολόγια δύο τιµές, το student ID (πεδίο της κλάσης Student) και ένα title (πεδίο της κλάσης Item). Με βάση το student ID θα πρέπει να γίνεται έλεγχος αν υπάρχει αντικείµενο τύπου Student που διαθέτει το student id που εισήγαγε ο χρήστης στον πίνακα students του υποερωτήµατος 10.1, και µε βάση τον τίτλο αν υπάρχει αντικείµενο τύπου Book ή Magazine που διαθέτει τον τίτλο που εισήγαγε ο χρήστης στον πίνακα items του υποερωτήµατος 10.2, ή 10.3. Αν οι δυο παραπάνω συνθήκες ικανοποιούνται, τότε θα δηµιουργείται κατάλληλο αντικείµενο της κλάσης Loan µε ορίσµατα τα αντικείµενα student και item που εµπεριέχουν τις τιµές που εισήγαγε ο χρήστης. Τέλος για κάθε αντικείµενο τύπου Loan που δηµιουργήθηκε κατά την παραπάνω διαδικασία θα πρέπει να εισάγεται στον πίνακα loans. Τέλος για να καταχωρηθούν τα αντικείµενα στο κατάλληλον πίνακα τύπου Loan πρέπει το απόθεµα του προς δανεισµό βιβλίου ή περιοδικού να είναι µεγαλύτερο από το µηδέν. Για κάθε νέο επιτυχή δανεισµό το απόθεµα θα µειώνεται ανάλογα. Στη συνέχεια εκτυπώνεται ξανά το αρχικού µενού. Θα πρέπει να γίνει χρήση της κλάσης ArrayList και των µεθόδων της: ArrayList< Loan > loans (µέθοδοι loans.add(magazine), loans.get(index), loans.size()). 5. Διαγραφή ενός δανεισµού (στοιχείο του πίνακα loans), όταν ο χρήστης εισάγει την τιµή 5. Αυτό θα συνεπάγεται τη διαγραφή δανεισµού από τον πίνακα τύπου Loan του υποερωτήµατος 10.4 µε βάση µία ηµεροµηνία που εισάγει ο χρήστης (πεδio timedate του ερωτήµατος 9) και εκτύπωση αρχικού µενού. Θα πρέπει να γίνει χρήση της κλάσης ArrayList και των µεθόδων της: (µέθοδος loans.get(index), loans.size(), loans.remove(loan)).
6. Εκτύπωση όλων των στοιχείων του πίνακα των φοιτητών, όταν ο χρήστης εισάγει την τιµή 6 και εκτύπωση αρχικού µενού. 7. Εκτύπωση όλων των στοιχείων του πίνακα των βιβλίων και περιοδικών, όταν ο χρήστης εισάγει την τιµή 7 και εκτύπωση αρχικού µενού. 8. Εκτύπωση όλων των στοιχείων του πίνακα των δανεισµών, όταν ο χρήστης εισάγει την τιµή 8 και εκτύπωση αρχικού µενού. 9. Έξοδος από την εκτέλεση του προγράµµατος, όταν ο χρήστης επιλέξει x ή Χ. ΣΗΜΕΙΩΣΕΙΣ: 1. Για την επίλυση αυτού του ερωτήµατος ενδείκνυται η χρήση της µεθόδου instanceof που είναι ικανή να ελέγχει αν ένα αντικείµενο item ανήκει στην κλάση Book ή Μagazine. [https://docs.oracle.com/javase/tutorial/displaycode.html?code=https:// docs.oracle.com/javase/tutorial/java/nutsandbolts/examples/instanceofdemo.java]. 2. Για δυναµικές δοµές δεδοµένων (πίνακες) ενδείκνυται η χρήση της κλάσης ArrayList [https://docs.oracle.com/javase/7/docs/api/java/util/arraylist.html] 3. Παράδειγµα επαναληπτικού µενού εισαγωγής τιµών από το πληκτρολόγιο είναι το ακόλουθο: [+] To Insert New Student Press: 1 [+] To Insert New Book Press: 2 [+] To Insert New Magazine Press: 3 [+] To Insert New Loan Press: 4 [+] To Delete Loan Press: 5 [+] To Print Students Press: 6 [+] To Print Books and Magazines Press: 7 [+] To Print Loans Press: 8 [+] For Exit Press: x or X [>] Insert Choice: Καλή Επιτυχία!!!