HY-252 Αντικειµενοστραφής Προγραµµατισµός Χειµερινό Εξάµηνο 2010 ιδάσκων: Χριστοφίδης Βασίλης 1 η Σειρά Ασκήσεων Ηµεροµηνία Παράδοσης: 15/10/2010 Άσκηση 1 Loops, IO (20%) Όνοµα αρχείου : Assign1_username.java Γράψτε µία µέθοδο printrectangle(int n, int m) που παίρνει ως παραµέτρους δυο ακεραίους n, m και εκτυπώνει ένα παραλληλόγραµµο από αστεράκια µε πλευρές n, m. Παράδειγµα n = 3 m = 10 Βοήθεια (Hints): Θα σας φανούν χρήσιµες οι παρακάτων µέθοδοι: System.out.print System.out.println Bonus Ερώτηµα (10%) ώστε µια αναδροµική υλοποίηση της µεθόδου printrectangle(int n, int m) χωρίς να χρησιµοποιήσετε κανένα επαναληπτικό loop for ή while. Η καινούργια µέθοδος θα ονοµάζεται recursiveprintrectangle(int mlimit, int nlimit, int m, int n), τα 2 πρώτα ορίσµατα mlimit και nlimit είναι οι πλευρές του παραλληλόγραµµου. Όταν καλείται αρχικά η συνάρτηση στα ορίσµατα n, m βάζετε 0. Σε κάθε αναδροµικό βήµα θα πρέπει να αλλάζετε κατάλληλα αυτά τα ορίσµατα. Παράδειγµα: Η κλήση recursiveprintrectangle(10, 3, 0, 0) έχει σαν έξοδο n = 3 m = 10
Άσκηση 2 String, File, I/O (30%) Όνοµα αρχείου : Assign2_username.java α) Γράψτε µία µέθοδο String explode(string string) που παίρνει ως παράµετρο ένα αντικείµενο τύπου String και το επιστρέφει τροποποιηµένο ως εξής: κάθε ψηφίο 0-9 που εµφανίζεται στην αρχική συµβολοσειρά θα αντικαθίσταται από τον πρώτο χαρακτήρα στα δεξιά του ψηφίου τόσες φορές όσες το ψηφίο προς αντικατάσταση. Σε περίπτωση που το ψηφίο είναι στο τέλος της συµβολοσειράς, θα αντικαθίσταται από τον πρώτο χαρακτήρα στα αριστερά του ψηφίου τόσες φορές όσες το ψηφίο προς αντικατάσταση. Η συµβολοσειρά θα πρέπει προσπελάζεται µια και µόνο φορά από αριστερά προς τα δεξιά και όλες οι αντικαταστάσεις θα πρέπει να γίνονται κατά την µοναδική αυτή προσπέλαση. Παραδείγµατα: explode("re3h1u") rehhhhuu explode("23vv") 33vvvvv explode("e2ve1") evvvee explode("e2v2e1") evvveeee β) Γράψτε ένα πρόγραµµα Java το οποίο παίρνει από την γραµµή εντολών το όνοµα ενός αρχείου εισόδου και το όνοµα ενός αρχείου εξόδου. Στη συνέχεια, αφού διαβάσει το αρχείο εισόδου το πρόγραµµα θα πρέπει να εκτυπώνει στο αρχείο εξόδου τις λέξεις του αρχείου εισόδου τροποποιηµένες σύµφωνα µε την µέθοδο explode() του ερωτήµατος α). Σε περίπτωση κάποιου προβλήµατος κατά την ανάγνωση ή την εγγραφή των αρχείων θα πρέπει να εµφανίζεται ένα κατάλληλο µήνυµα λάθους. Παράδειγµα: ώστε όνοµα αρχείου εισόδου: input.txt ώστε όνοµα αρχείου εξόδου: output.txt Παράδειγµα αρχείου εισόδου (input.txt) 23vv er1fvv k12v re3h1u re1h3 Έξοδος του παραδείγµατος (output.txt) 33vvvvv erffvv k2vvv rehhhhuu rehhhhh Βοήθεια (Hints): Θα σας φανούν χρήσιµες οι παρακάτω µέθοδοι: Από την κλάση String οι µέθοδοι: charat και length. Από την κλάση Character οι µέθοδοι: isdigit και getnumericvalue. Για περισσότερες λεπτοµέρειες πάνω στις κλάσεις String και Character ανατρέξτε στο Java API (http://download-llnw.oracle.com/javase/6/docs/api/).
Άσκηση 3 Arrays (30%) Όνοµα αρχείου : Assign3_username.java Ένα µαγικό τετράγωνο NxN είναι ένας δυσδιάστατος πίνακας που περιέχει 2 τους αριθµούς 1KN σαν στοιχεία του, τοποθετηµένους κατά τέτοιον τρόπο ώστε το άθροισµα οποιαδήποτε στήλης, γραµµής ή διαγωνίου να έχει την ίδια N( N 2 + 1) "µαγική" σταθερή τιµή που δίνεται απο τον τύπο:. Για παράδειγµα 2 το παρακάτω είναι ένα 3x 3 µαγικό τετράγωνο το οποίο περιέχει τους αριθµούς 1K 9 και η µαγική σταθερά του είναι η 15. 4 9 2 3 5 7 8 1 6 Γράψτε µία µέθοδο boolean ismagicsquare(int[][] array) που παίρνει ως παράµετρο έναν δυσδιάστατο πίνακα µε N γραµµές και N στήλες µε ακέραιους (int) και επιστρέφει µια λογική τιµή (boolean), η οποία είναι αληθής αν το δοθέν τετράγωνο (που αναπαρίσταται από τον πίνακα) είναι ένα κανονικό NxN µαγικό τετράγωνο ή ψευδής στην αντίθετη περίπτωση. Θεωρείστε ότι ο πίνακας που δίνεται ως παράµετρος έχει σωστές διαστάσεις, δηλαδή ίσο αριθµό γραµµών και στηλών. Παραδείγµατα: ismagicsquare({{4,9,2},{3,5,7},{8,1,6}}) true ismagicsquare({{7,9,6},{1,5,4},{8,3,2}}) false ismagicsquare({{7,3,1},{2,5,8},{9,4,6}}) false ismagicsquare({{7,12,1,14},{2,13,8,11},{16,3,10,5},{9,6,1 5,4}}) true Bonus Ερώτηµα (10%) Μια από τις πιο γνωστές µεθόδους για την δηµιουργία µαγικών τετραγώνων µε περιττό µήκος πλευράς είναι η λεγόµενη Siamese µέθοδος (en.wikipedia.org/wiki/siamese_method). Σας ζητείται να δηµιουργήσετε µια µέθοδο populatesquare() η οποία να υλοποιεί τον αλγόριθµο Siamese, ο οποίος δίνετε στη συνέχεια: Ξεκινώντας από τη µεσαία θέση της πρώτης σειράς του µαγικού τετραγώνου, εισάγω τους αριθµούς 1 έως Ν 2 (όπου Ν το µέγεθος του µαγικού τετραγώνου) κινούµενος διαγώνια (πάνω/δεξία) ένα µε τη σειρά. Αν µια κίνηση χρειάζεται να "βγει" από το τετράγωνο τότε ξεκινώ από την τελευταία γραµµή ή στήλη αντίστοιχα (wrap arround). Αν µια θέση του µαγικού τετραγώνου είναι ήδη κατειληµµένη, τότε κινούµαι κάθετα µια θέση. Ο έλεγχος ορθότητας του αλγορίθµου θα γίνεται µε την µέθοδο ismagicsquare() την οποία υλοποιήσατε στο προηγούµενο υποερώτηµα.
Άσκηση 4 Recursion (20%) Όνοµα αρχείου : Assign4_username.java Υλοποιήστε ένα πρόγραµµα αναδροµικής σχεδίασης που παίρνει ως παράµετρο έναν ακέραιο n και σχεδιάζει ένα Η-tree χρησιµοποιώντας την παρακάνω διαδικασία. Απλά επαναληπτικά γραφικά µπορούν να οδηγήσουν σε εικόνες που είναι εξαιρετικά περίπλοκές. Για παράδειγµα, ένα H-δέντρο της τάξης n ορίζεται ως εξής: Για την βασική περίπτωση n = 0 δεν υπάρχει σχήµα. Για n=1 σχεδιάζονται τρεις γραµµές σε σχήµα του γράµµατος H όπως φαίνεται στο σχήµα παρακάτω. Για n=2 σχεδιάζονται στις άκρες των γραµµών του γράµµατος Η τέσσερα γράµµατα Η µε µέγεθος γραµµών το µισό του αρχικού γράµµατος. Για το αναδροµικό βήµα ξεκινάµε σχεδιάζοντας ένα γράµµα Η και συνεχίζουµε σχεδιάζοντας στις ελεύθερες άκρες του σχήµατος γράµµατα Η στο µισό µέγεθος του γράµµατος που τα κολλάµε. Η αναδροµική συνάρτηση θα εχει όνοµα draw(int n, double x, double y, double size) όπου το n εκφράζει το βάθος της αναδροµής οπως στα παραπάνω παραδείγµατα, το x,y είναι η συντεταγµενες του κέντρου του γραφήµατος και το size εκφράζει το µέγεθος των γραµµών στο γράµµα Η. Σε κάθε αναδροµικό βήµα πρέπει να αλλάζεται κατάλληλα τα χ,y,size. (Hints): Για την σχεδίαση του γράµµατος H θα χρησιµοποιήσετε την παρακάτω µέθοδο: public static void drawh(double x,double y, double size){ // compute the coordinates of the 4 tips of the H double x0 = x - size/2;
double x1 = x + size/2; double y0 = y - size/2; double y1 = y + size/2; // draw the 3 line segments of the H StdDraw.line(x0, y0, x0, y1);//left vertical segment of the H StdDraw.line(x1, y0, x1, y1);//right vertical segment of the H StdDraw.line(x0, y, x1, y);// connect the two vertical segments of the H } Η µέθοδος αυτή ζωγραφίζει ένα γράµµα Η µε κέντρο το σηµείο x,y και µέγεθος γραµµών size. οκιµάστε να την καλέσετε στη µέθοδο main µε τα εξής ορίσµατα: drawh(0.5, 0.5, 0.5); H παραπάνω µέθοδος χρησιµοποιεί την StdDraw.line της κλάσης που βρίσκεται στην παρακάτω διεύθυνση: www.csd.uoc.gr/~hy252/ StdDraw.java και την οποία θα πρέπει να κατεβάσετε και να βάλετε στον ίδιο φάκελο µε την υλοποίηση της άσκηση 4. Οδηγίες Υποβολής Το username στην ονοµασία των ασκήσεων πρέπει να αντικατασταθεί από το δικό σας username. Για παράδειγµα εάν το username σας είναι christop η άσκηση 4 πρέπει να ονοµάζεται Assign4_christop.java