ΕΡΓΑΣΙΑ 2 Κατασκευάζοντας Ημερολόγια Ημερομηνία Ανάρτησης: 23/02/2018 Ημερομηνία Παράδοσης: 13/03/2018, 09:00 Εισαγωγή Σκοπός της παρούσας άσκησης είναι η απόκτηση εμπειρίας στη χρήση πινάκων (πολλαπλών διαστάσεων), συναρτήσεων, και εν μέρει γραμματοσειρών. Χρειάζεται να δημιουργήσετε πρόγραμμα το οποίο κατασκευάζει και εκτυπώνει το ημερολόγιο δεδομένου έτους. Το πρόγραμμα λαμβάνει τρία ορίσματα από τη γραμμή εντολής, που είναι: το έτος, η πρώτη ημέρα του έτους (1 για Δευτέρα, 2 για Τρίτη, και ούτω καθεξής, μέχρι 7 για Κυριακή) και ο αριθμός των στηλών σε σχέση με την παρουσίαση του ημερολογίου. Να γίνουν οι εξής έλεγχοι: αν υπάρχουν και τα 3 ορίσματα αν το δεύτερο όρισμα έχει τιμή εντός ορίων 1-7 αν το τρίτο όρισμα έχει τιμή εντός ορίων >=1 και σε αντίθετη περίπτωση να βάλετε αντίστοιχα μηνύματα λάθους. Παραδείγματα Εκτέλεσης Το output του προγράμματος διαφαίνεται στα ακόλουθα παραδείγματα: ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 1
$ java Calendar 2018 1 1 CALENDAR 2018 JANUARY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 FEBRUARY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 MARCH 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 APRIL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 2
MAY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 JUNE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 JULY 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 AUGUST 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 SEPTEMBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 3
OCTOBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 NOVEMBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 DECEMBER 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 $ java Calendar 2018 1 2 CALENDAR 2018 JANUARY FEBRUARY 1 2 3 4 5 6 7 1 2 3 4 8 9 10 11 12 13 14 5 6 7 8 9 10 11 15 16 17 18 19 20 21 12 13 14 15 16 17 18 22 23 24 25 26 27 28 19 20 21 22 23 24 25 29 30 31 26 27 28 ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 4
MARCH APRIL 1 2 3 4 1 5 6 7 8 9 10 11 2 3 4 5 6 7 8 12 13 14 15 16 17 18 9 10 11 12 13 14 15 19 20 21 22 23 24 25 16 17 18 19 20 21 22 26 27 28 29 30 31 23 24 25 26 27 28 29 30 MAY JUNE 1 2 3 4 5 6 1 2 3 7 8 9 10 11 12 13 4 5 6 7 8 9 10 14 15 16 17 18 19 20 11 12 13 14 15 16 17 21 22 23 24 25 26 27 18 19 20 21 22 23 24 28 29 30 31 25 26 27 28 29 30 JULY AUGUST 1 1 2 3 4 5 2 3 4 5 6 7 8 6 7 8 9 10 11 12 9 10 11 12 13 14 15 13 14 15 16 17 18 19 16 17 18 19 20 21 22 20 21 22 23 24 25 26 23 24 25 26 27 28 29 27 28 29 30 31 30 31 SEPTEMBER OCTOBER 1 2 1 2 3 4 5 6 7 3 4 5 6 7 8 9 8 9 10 11 12 13 14 10 11 12 13 14 15 16 15 16 17 18 19 20 21 17 18 19 20 21 22 23 22 23 24 25 26 27 28 24 25 26 27 28 29 30 29 30 31 NOVEMBER DECEMBER 1 2 3 4 1 2 5 6 7 8 9 10 11 3 4 5 6 7 8 9 12 13 14 15 16 17 18 10 11 12 13 14 15 16 19 20 21 22 23 24 25 17 18 19 20 21 22 23 26 27 28 29 30 24 25 26 27 28 29 30 31 ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 5
$ java Calendar 2018 1 3 CALENDAR 2018 JANUARY FEBRUARY MARCH 1 2 3 4 5 6 7 1 2 3 4 1 2 3 4 8 9 10 11 12 13 14 5 6 7 8 9 10 11 5 6 7 8 9 10 11 15 16 17 18 19 20 21 12 13 14 15 16 17 18 12 13 14 15 16 17 18 22 23 24 25 26 27 28 19 20 21 22 23 24 25 19 20 21 22 23 24 25 29 30 31 26 27 28 26 27 28 29 30 31 APRIL MAY JUNE 1 1 2 3 4 5 6 1 2 3 2 3 4 5 6 7 8 7 8 9 10 11 12 13 4 5 6 7 8 9 10 9 10 11 12 13 14 15 14 15 16 17 18 19 20 11 12 13 14 15 16 17 16 17 18 19 20 21 22 21 22 23 24 25 26 27 18 19 20 21 22 23 24 23 24 25 26 27 28 29 28 29 30 31 25 26 27 28 29 30 30 JULY AUGUST SEPTEMBER 1 1 2 3 4 5 1 2 2 3 4 5 6 7 8 6 7 8 9 10 11 12 3 4 5 6 7 8 9 9 10 11 12 13 14 15 13 14 15 16 17 18 19 10 11 12 13 14 15 16 16 17 18 19 20 21 22 20 21 22 23 24 25 26 17 18 19 20 21 22 23 23 24 25 26 27 28 29 27 28 29 30 31 24 25 26 27 28 29 30 30 31 OCTOBER NOVEMBER DECEMBER 1 2 3 4 5 6 7 1 2 3 4 1 2 8 9 10 11 12 13 14 5 6 7 8 9 10 11 3 4 5 6 7 8 9 15 16 17 18 19 20 21 12 13 14 15 16 17 18 10 11 12 13 14 15 16 22 23 24 25 26 27 28 19 20 21 22 23 24 25 17 18 19 20 21 22 23 29 30 31 26 27 28 29 30 24 25 26 27 28 29 30 31 ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 6
$ java Calendar 2018 1 4 CALENDAR 2018 JANUARY FEBRUARY MARCH APRIL 1 2 3 4 5 6 7 1 2 3 4 1 2 3 4 1 8 9 10 11 12 13 14 5 6 7 8 9 10 11 5 6 7 8 9 10 11 2 3 4 5 6 7 8 15 16 17 18 19 20 21 12 13 14 15 16 17 18 12 13 14 15 16 17 18 9 10 11 12 13 14 15 22 23 24 25 26 27 28 19 20 21 22 23 24 25 19 20 21 22 23 24 25 16 17 18 19 20 21 22 29 30 31 26 27 28 26 27 28 29 30 31 23 24 25 26 27 28 29 30 MAY JUNE JULY AUGUST 1 2 3 4 5 6 1 2 3 1 1 2 3 4 5 7 8 9 10 11 12 13 4 5 6 7 8 9 10 2 3 4 5 6 7 8 6 7 8 9 10 11 12 14 15 16 17 18 19 20 11 12 13 14 15 16 17 9 10 11 12 13 14 15 13 14 15 16 17 18 19 21 22 23 24 25 26 27 18 19 20 21 22 23 24 16 17 18 19 20 21 22 20 21 22 23 24 25 26 28 29 30 31 25 26 27 28 29 30 23 24 25 26 27 28 29 27 28 29 30 31 30 31 SEPTEMBER OCTOBER NOVEMBER DECEMBER 1 2 1 2 3 4 5 6 7 1 2 3 4 1 2 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11 3 4 5 6 7 8 9 10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18 10 11 12 13 14 15 16 17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25 17 18 19 20 21 22 23 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 24 25 26 27 28 29 30 31 ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 7
$ java Calendar 2018 1 6 CALENDAR 2018 JANUARY FEBRUARY MARCH APRIL MAY JUNE 1 2 3 4 5 6 7 1 2 3 4 1 2 3 4 1 1 2 3 4 5 6 1 2 3 8 9 10 11 12 13 14 5 6 7 8 9 10 11 5 6 7 8 9 10 11 2 3 4 5 6 7 8 7 8 9 10 11 12 13 4 5 6 7 8 9 10 15 16 17 18 19 20 21 12 13 14 15 16 17 18 12 13 14 15 16 17 18 9 10 11 12 13 14 15 14 15 16 17 18 19 20 11 12 13 14 15 16 17 22 23 24 25 26 27 28 19 20 21 22 23 24 25 19 20 21 22 23 24 25 16 17 18 19 20 21 22 21 22 23 24 25 26 27 18 19 20 21 22 23 24 29 30 31 26 27 28 26 27 28 29 30 31 23 24 25 26 27 28 29 28 29 30 31 25 26 27 28 29 30 30 JULY AUGUST SEPTEMBER OCTOBER NOVEMBER DECEMBER 1 1 2 3 4 5 1 2 1 2 3 4 5 6 7 1 2 3 4 1 2 2 3 4 5 6 7 8 6 7 8 9 10 11 12 3 4 5 6 7 8 9 8 9 10 11 12 13 14 5 6 7 8 9 10 11 3 4 5 6 7 8 9 9 10 11 12 13 14 15 13 14 15 16 17 18 19 10 11 12 13 14 15 16 15 16 17 18 19 20 21 12 13 14 15 16 17 18 10 11 12 13 14 15 16 16 17 18 19 20 21 22 20 21 22 23 24 25 26 17 18 19 20 21 22 23 22 23 24 25 26 27 28 19 20 21 22 23 24 25 17 18 19 20 21 22 23 23 24 25 26 27 28 29 27 28 29 30 31 24 25 26 27 28 29 30 29 30 31 26 27 28 29 30 24 25 26 27 28 29 30 30 31 31 ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 8
Δομή Δεδομένων Για την εσωτερική αναπαράσταση του ημερολογίου μπορεί να χρησιμοποιηθεί ένας τρισδιάστατος πίνακας ως ακολούθως: int[][][] calendar = new int[12][6][7]; Η πρώτη διάσταση αντιπροσωπεύει τους 12 μήνες του έτους. Η δεύτερη διάσταση αντιπροσωπεύει τις (μέχρι) 6 εβδομάδες που διατρέχει ένας μήνας. Η τρίτη διάσταση αντιπροσωπεύει τις 7 ημέρες, από τη Δευτέρα μέχρι την Κυριακή. Για παράδειγμα, ο πίνακας για το έτος 2018 μπορεί να αναπαρασταθεί όπως δεικνύεται στο πιο κάτω σχήμα (δίνονται τα στοιχεία μόνο για τους μήνες Ιανουάριο και Δεκέμβριο). 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 0 0 0 0 0 0 Όπως διαφαίνεται στο πιο πάνω σχήμα, ο τρισδιάστατος πίνακας αναλύεται σε ένα μονοδιάστατο πίνακα 12 στοιχείων, τα οποία είναι δισδιάστατοι πίνακες 6 x 7. Επομένως, calendar[0] αντιπροσωπεύει το μήνα Ιανουάριο του συγκεκριμένου έτους, και ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 9
calendar[11] αντιπροσωπεύει το μήνα Δεκέμβριο. Παρομοίως, ο δισδιάστατος πίνακας που αντιπροσωπεύει ένα μήνα αναλύεται σε ένα μονοδιάστατο πίνακα 6 στοιχείων, τα οποία είναι μονοδιάστατοι πίνακες 7 στοιχείων, τα οποία είναι αριθμοί. Ως εκ τούτου μπορεί να έχουμε τις ακόλουθες αναφορές: calendar ολόκληρος ο πίνακας των τριών διαστάσεων, που αντιπροσωπεύει το έτος calendar[i] το i-οστό στοιχείο του πίνακα που είναι ένας πίνακας δύο διαστάσεων (ο i-στος μήνας του έτους) calendar[i][j] η j-οστή εβδομάδα που διατρέχει ο i-οστός μήνας, που είναι ένας μονοδιάστατος πίνακας (μια ημερολογιακή εβδομάδα) calendar[i][j][k] η ημέρα του μήνα που αντιστοιχεί στην k-οστή ημερολογιακή μέρα της j-οστης βδομάδας του i-στου έτους. Ημέρες δεδομένων εβδομάδων που δεν αφορούν ένα μήνα, υποδηλώνονται με το 0 όπως φαίνεται και στο πιο πάνω σχήμα. Αρθρωτός Σχεδιασμός Το πρόγραμμα που θα δημιουργήσετε χρειάζεται να είναι αρθρωτό, δηλαδή να αξιοποιεί αριθμό άλλων συναρτήσεων πέραν της main. Τέτοιες συναρτήσεις μπορούν να λαμβάνουν πίνακες ως ορίσματα, για παράδειγμα θα μπορούσε μια συνάρτηση να λαμβάνει ένα μήνα (calendar[i]) ή μια βδομάδα (calendar[i][j]) ως όρισμα. Μη ξεχνάτε ότι το τι δίνεται στη συνάρτηση είναι η διεύθυνση του πίνακα. Αναλύστε προσεκτικά το πρόβλημα που καλείστε να λύσετε και εντοπίστε σημαντικά υπό-προβλήματα, τα οποία χειριστείτε μέσω ξεχωριστών συναρτήσεων. Δοκιμάστε πρώτα και διορθώστε τις βασικές συναρτήσεις, και διαδοχικά προχωρήστε στις πιο πάνω συναρτήσεις (αυτές που καλούν άλλες συναρτήσεις) μέχρις ότου να φτάσετε στη συνάρτηση main στο πλαίσιο της οποίας συναρμολογείται ολόκληρο το πρόγραμμά σας. Κάποιες ενδεικτικές βασικές συναρτήσεις που μπορείτε να υλοποιήσετε είναι οι ακόλουθες: Είναι δεδομένο έτος δίσεκτο; Πόσες μέρες έχει δεδομένος μήνας, δεδομένου έτους; Από ποια ημερολογιακή μέρα (Δευτέρα, Τρίτη, κτλ) αρχίζει δεδομένος μήνας, δεδομένου έτους, δεδομένης της ημέρας της 1ης του έτους; Παρουσίαση Ημερολογίου ως Διακριτό Σχήμα ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 10
Η εξωτερική μορφή του ημερολογίου, δηλαδή αυτό που τυπώνει το πρόγραμμα, δεν είναι τίποτα άλλο από ένα δομημένο διακριτό σχήμα, όπως διαφαίνεται και στα παραδείγματα χρήσης του προγράμματος. Το σχήμα αποτελείται από επικεφαλίδα και κάθετα τοποθετημένα blocks. Ο αριθμός των blocks υπολογίζεται βάσει του αριθμού των στηλών που αποτελεί το τρίτο όρισμα του προγράμματος στη γραμμή εντολής. Για παράδειγμα, αν οι στήλες είναι τρεις, δηλαδή οι μήνες να τυπώνονται ανά τριάδα, τότε θα έχουμε τέσσερα blocks. Κάθε block πρέπει να είναι πλήρες, και επομένως το 12 πρέπει να διαιρείται ακριβώς με τον αριθμό των στηλών. Επομένως, ακραίες περιπτώσεις είναι είτε να έχουμε μία στήλη, στην οποία περίπτωση οι μήνες τυπώνονται ο ένας κάτω από τον άλλο, είτε να έχουμε 12 στήλες, στην οποία περίπτωση οι μήνες τυπώνονται ο ένας δίπλα στον άλλο. Το κάθε block έχει την εξής δομή: Πρώτα δίνονται τα ονόματα των μηνών, μετά δίνονται οι ονομασίες των επτά ημερών μιας εβδομάδας, και μετά ακολουθούν οι ημέρες των μηνών διατεταγμένες στις (μέχρι) έξι βδομάδες που μπορεί να διατρέχει ένας μήνας. Έχετε υπόψη ότι ένα διακριτό σχήμα δημιουργείται (εκτυπώνεται) γραμμή με γραμμή, και επομένως όλα τα οριζόντια τμήματα κάθε γραμμής πρέπει να συναρμολογηθούν (εκτυπωθούν), πριν προχωρήσει η συναρμολόγηση (εκτύπωση) της επόμενης γραμμής. Ως μια τελευταία πρόκληση, επιδιώξετε να δημιουργήσετε (κτίσετε) το διακριτό σχήμα που αναπαριστά το αιτούμενο ημερολόγιο ως ένα ενιαίο String, κάνοντας χρήση του τελεστή + για την ένωση συμβολοσειρών, το οποίο μετά απλά εκτυπώνεται με χρήση μιας εντολής εκτύπωσης. Με άλλα λόγια αντί να τυπώνετε τις επιμέρους συμβολοσειρές που απαρτίζουν το σχήμα (με τα σχετικά new lines), να τις ενώνετε. Η όλη συναρμολόγηση ή κατασκευή, του ημερολογίου σε μορφή String, για εξωτερική παρουσίαση, θα μπορούσε επομένως να ορισθεί ως μια ξεχωριστή, επαναχρησιμοποιήσιμη, συνάρτηση, η οποία απλά να καλείται από τη main ως ακολούθως: public static String constructcalendar (int year, int firsty, int cols) {.....} public static void main (String[] args){ int year = Integer.parseInt(args[0]); int firsty = Integer.parseInt(args[1]); int cols = Integer.parseInt(args[2]); System.out.println(constructCalendar(year, firsty, cols)); } ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 11
Παράδοση Όταν έχετε τελειώσει με τον πηγαίο κώδικα, μεταγλωττίστε το και βεβαιωθείτε ότι τρέχει σωστά. Παραδώστε τα αρχείο πηγαίου κώδικα (userid_ erg2.java) και μια λίστα δοκιμής (userid_erg2.txt) με όλα τα παραδείγματα εκτέλεσης που φαίνονται πιο πάνω ηλεκτρονικά μέσω του submit assignment κάτω από το Ασκήσεις Εργασία 2 στην ιστοσελίδα του μαθήματος μέχρι τις 13/03/2017 και ώρα 09:00. Όπου userid βάλτε το username που σας δόθηκε από το τμήμα. Προσοχή: Το σύστημα ελέγχει το χρόνο παράδοσης εργασιών γι αυτό μην περιμένετε την τελευταία στιγμή να κάνετε submit την εργασία σας. Βαθμολογία Ένα πρόγραμμα για να πάρει όλες τις μονάδες είναι απαραίτητο να: χρησιμοποιεί σχόλια έχει ευθυγραμμισμένο κώδικας χρησιμοποιεί αυτό-επεξηγηματικά ονόματα για τις μεταβλητές δουλεύει σωστά κάνει όλους τους απαραίτητους ελέγχους χρησιμοποιεί μεθόδους (αρθρωτή σχεδίαση) Για όλα τα παραπάνω ακολουθήστε τις οδηγίες που περιγράφονται εδώ: http://introcs.cs.princeton.edu/java/11style/. Το αρχείο με το πηγαίο κώδικα πρέπει οπωσδήποτε να περιέχει μια συμπληρωμένη κατάλληλα επικεφαλίδα από σχόλια στην αρχή του αρχείου όπως: /** * Author: Γράψτε εδώ το όνομα σας * Written:../../2018 * Last updated:../../2018 * * Compilation: javac userid_erg2.java * Execution: java userid_erg2 * * Γράψτε εδώ πληροφορίες σχετικά ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 12
* με το τι κάνει το πρόγραμμα * */ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ Η εργασία είναι ατομική. Μπορείτε να συζητήσετε για αυτήν με τους συμφοιτητές σας, ωστόσο ποτέ δεν είναι αποδεκτό για σας να δείτε τον κώδικα κάποιου άλλου ή να κάνετε από κοινού τον κώδικα. Φυσικά, αν έχετε οποιεσδήποτε ερωτήσεις σχετικά με την εργασία, είμαστε πάντα στη διάθεσή σας για βοήθεια. Ανίχνευση αντιγραφής θα τιμωρείται με μηδενισμό. Κώδικας που δε μεταγλωττίζει ή δεν τρέχει (crashes) παίρνει αυτόματα βαθμολογία 0. ΕΠΛ131 Εργασία 2. Υπεύθυνος Εργασίας: Παύλος Αντωνίου 13