Εξάμηνο Μάθημα Τίτλος 2017 2018 Εαρινό Αντικειμενοστραφής Προγραμματισμός Ι Ύλη εργαστηρίου, Ασκήσεις Java Ημερομηνία Εργαστήριο 8 ο Α. Ύλη εργαστηρίου 8.1 Αντικειμενοστραφής προγραμματισμός 8.2 Κλάσεις Αντικείμενα 8.3 Encapsulation (συγκέντρωση) - overloading (υπερφόρτωση) 8.4 Πολυμορφισμός 8.5 Χρήση του this Προετοιμασία εργαστηρίου: Στο φάκελο <Tα έγγραφα μου> ή <My Documents> δημιουργήστε φάκελο με τον αριθμό μητρώου σας π.χ ΤΧΧΧ και εκεί δημιουργήστε φάκελο Lab8. Όλες οι ασκήσεις που ακολουθούν για αυτό το εργαστήριο θα αποθηκευτούν εκεί και μόνον εκεί. Όταν τελειώσει το εργαστήριο αυτό μπορείτε να αντιγράψετε το φάκελο για να έχετε τις ασκήσεις και να συνεχίσετε να εργάζεστε εκτός εργαστηρίου. Ανοίξτε τον NetBeans και αφού διαγράψετε ότι παλαιά project βρείτε επιλέξτε File\New Project. Οδηγίες για την δημιουργία project για την επίλυση της Άσκησης 1. Στο NetBeans επιλέξτε File->new project> java Application επιλέξτε το φάκελο Lab8 και Name δώστε το όνομα της Άσκησης δηλαδή TestTime. Έτσι θα δημιουργηθεί το project TestTime που περιέχει το αρχείο TestTime.java όπου υπάρχει η μέθοδος main και αποτελεί την εκκίνηση του προγράμματος Java. Στη συνέχεια για να δημιουργήσετε την κλάση Time επιλέξτε File\New File <επιλέξτε java class> και Class Name δώστε το όνομα της κλάσης δηλ. Time. Β. Ασκήσεις λυμένες για το εργαστήριο 1. Δημιουργήστε μια κλάση με το όνομα Time με τα ακόλουθα χαρακτηριστικά: Ώρα hour Λεπτά minute Δευτερόλεπτα second Η κλάση Time να υποστηρίζει μια μέθοδο settime(), η οποία να θέτει όλα τα χαρακτηριστικά σε προκαθορισμένες τιμές. H κλάση θα έχει τους εξής κατασκευαστές: o Έναν με όλες τις παραμέτρους o Έναν χωρίς καθόλου παραμέτρους, ο οποίος να θέτει το ρολόι στα μεσάνυχτα. H κλάση Time να υποστηρίζει επίσης τις παρακάτω μεθόδους:
gethours(), getminutes(), getseconds(), touniversalstring(), tostandardstring() Στη συνέχεια δημιουργήστε Java εφαρμογή με το όνομα TestTime που να χρησιμοποιεί την κλάση Time. //Αρχείο Time.java package erg7ask1; public class Time { όχι private int hour; // 0-23 private int min; // 0-59 private int sec; // 0-59 // ελέγχει τις τιμές γιά καταλληλότητα και και θέτει // τελικές τιμές σε μορφή 24ώρου public void settime(int h, int m, int s) { hour = ((h >= 0 && h < 24)? h : 0); min = ((m >= 0 && m < 60)? m : 0); sec = ((s >= 0 && s < 60)? s : 0); // Κατασκευαστής με τρία ορίσματα: hour, miν and sec σαν ορίσματα public Time(int h, int m, int s) { settime(h, m, s); // invoke method settime to validate time // Κατασκευαστής με δύο ορίσματα: hour καί min ορίζονται, το sec public Time(int h, int m) { settime(h, m, 0); // invoke method settime to validate time // Κατασκευαστής με ένα όρισμα: μόνο το hour ορίζεται public Time(int h) { settime(h, 0, 0); // invoke method settime to validate time // Κατασκευαστής χωρίς ορίσματα: αρχικοποιεί όλες τις μεταβλητές με 0 public Time() { this(0, 0, 0); //καλεί τον κατασκευαστή με 3 ορίσματα //εναλλακτικά θα μπορούσαμ: // settime(0, 0, 0); // εκτύπωση σε 24-ωρη μορφή public String touniversalstring() { return String.format("%02d:%02d:%02d", hour, min, sec); // εκτύπωση σε 12-ωρη μορφή public String tostandardstring() { if (hour == 12 hour == 0) { hour = 12; else { hour = hour % 12;
String sampm; //"AM ή PM if (hour < 12) { sampm = " AM"; else { sampm = " PM"; return String.format("%02d:%02d:%02d", hour, min, sec) + sampm; // end class Time // Αρχείο TestTime.java package erg7ask1; public class TestTime { public static void main(string args[]) { Time t1 = new Time(); // 00:00:00 Time t2 = new Time(7); // 07:00:00 Time t3 = new Time(19, 25); // 19:25:00 Time t4 = new Time(12, 15, 50); // 12:15:50 Time t5 = new Time(29, 85, 81); // 00:00:00 String output = "\nκατασκευαστής χωρίς ορίσματα" + "\nt1: όλες οι μεταβλητές παίρνουν προεπιλεγμένες τιμές" + "\n " + t1.touniversalstring() + "\n " + t1.tostandardstring(); output += "\nκατασκευαστής με ένα όρισμα" + "\nt2: το hour ορίζεται το min και το sec όχι" + "\n " + t2.touniversalstring() + "\n " + t2.tostandardstring(); output += "\nκατασκευαστής με δύο ορίσματα" + "\nt3: το hour και το min ορίζονται, το sec όχι" + "\n " + t3.touniversalstring() + "\n " + t3.tostandardstring(); output += "\nκατασκευαστής με τρία ορίσματα" + "\nt4: τα hour, minute και second ορίζονται" + "\n " + t4.touniversalstring() + "\n " + t4.tostandardstring(); output += "\nt5: Προσπάθεια δημιουργίας με ακατάλληλες τιμές" + "\n " + t5.touniversalstring() + "\n " + t5.tostandardstring(); System.out.println(output); System.exit(0); // end main
// end class TestTime Να δημιουργηθεί νέο project ακολουθώντας τις οδηγίες της Άσκησης 1. To όνομα του project θα είναι TestKlasmata. 2. Να οριστεί η κλάση Klasma η οποία θα περιγράφει κλάσματα. Η τάξη να περιέχει δύο private ακέραιες µμεταβλητές, τον αριθμητή και τον παρονομαστή. Ο κατασκευαστής της τάξης να αρχικοποιεί τον αριθμητή στο μηδέν και τον παρονομαστή στην μονάδα και να ορίσετε µία μέθοδο setklasma η οποία να αποδίδει τιμές στις private μεταβλητές της (ελέγχοντας εάν ο παρονομαστής είναι μηδέν και σ αυτή την περίπτωση να τον κάνει ένα). Επίσης η τάξη να υλοποιεί τις παρακάτω μεθόδους (public): o Πρόσθεση, Αφαίρεση, Πολλαπλασιασμό, διαίρεση δύο κλασμάτων, όπως και o Εκτύπωση κλάσματος στην μορφή α/β, και τέλος, o Εκτύπωση κλάσματος αλλά σε μορφή πραγματικού αριθμού. Τέλος να γράψετε ένα πρόγραμμα TestKlasmata το οποίο να χρησιμοποιεί και να ελέγχει την τάξη Klasma. // Αρχείο Klasma.java package testklasmata; import java.util.scanner; public class Klasma { private int arith; private int paro; public Klasma() { setklasma(0, 1); public void setklasma(int ari, int par) { if (par == 0) { paro = 1; else { paro = par; arith = ari; public Klasma prosthesi(klasma d2) { Klasma temp = new Klasma(); double x; temp.arith = (arith * d2.paro) + (paro * d2.arith); temp.paro = paro * d2.paro; x = (double) temp.arith / (double) temp.paro; System.out.println(temp.arith + "/" + temp.paro + " = " + x); return temp;
public Klasma aferesi(klasma d2) { //να συμπληρωθεί στο εργαστήριο public Klasma polapla(klasma d2) { //να συμπληρωθεί στο εργαστήρio public Klasma dieresi(klasma d2) { //να συμπληρωθεί στο εργαστήρio // Αρχείο TestKlasmata.java package testklasmata; import java.util.scanner; public class TestKlasmata { public static void main(string args[]) { Scanner sc = new Scanner(System.in); int a, b, c, d; int e = 0; Klasma k1, k2, k3, k4, k5, k6, k7; System.out.println("Δώσε το 1o κλάσμα"); System.out.println("Δώσε τον αριθμητή: "); a = sc.nextint(); System.out.println("Δώσε τον παρανομαστή: "); b = sc.nextint(); k1 = new Klasma(); k1.setklasma(a, b); System.out.println(" Δώσε το 2o κλάσμα"); System.out.println("Δώσε τον αριθμητή: "); c = sc.nextint(); System.out.println("Δώσε τον παρανομαστή: "); d = sc.nextint(); k2 = new Klasma(); k2.setklasma(c, d); while (true) { System.out.println("1. + \n2. - \n3. * \n4. exit"); e = sc.nextint(); switch (e) { case 1: k7 = k1.prosthesi(k2);
break; case 2: k6 = k1.aferesi(k2); break; case 3: k5 = k1.polapla(k2); break; case 4: System.exit(1); break; default: System.out.println("Λανθασμένη επιλογή"); Γ. Ασκήσεις άλυτες για το εργαστήριο 2. Να δημιουργηθεί ένα πρόγραμμα Java για τρίγωνα. Το όνομα του project θα είναι TestTrigono. α. Να δημιουργηθεί μια νέα κλάση (Trigono) που να περιγράφει το τρίγωνο. Το τρίγωνο θα δίνεται από τον ορισμό τριών σημείων (κορυφές του τριγώνου). Η νέα αυτή κλάση να χρησιμοποιεί την κλάση του σημείου που ακολουθεί. Στην κλάση να υπάρχουν δύο κατασκευαστές, ο πρώτος να μην κάνει τίποτε και ο δεύτερος να αρχικοποιεί όλες τις κορυφές σημεία. Επιπλέον να δημιουργηθεί μια μέθοδος για τον υπολογισμό του μήκους δύο κορυφών του τριγώνου και στη συνέχεια να δημιουργηθεί μια μέθοδος perimetros() που θα υπολογίζει το άθροισμα των πλευρών του τριγώνου. Ο τύπος υπολογισμού για το μήκος μεταξύ δύο κορυφών ενός τριγώνου είναι Math.sqrt(Math.pow((pStart.getX() pend.getx()),2) + Math.pow((pStart.getY() pend.gety()),2)) Τα pstart και pend είναι οι κορυφές, αντικείμενα τύπου Point. Στη συνέχεια στον ορισμό της main στην εφαρμογή TestTrigono θα δημιουργήσετε 2 αντικείμενα της κλάσης του τριγώνου, θα δώσετε τιμές στα σημεία των κορυφών του και θα τυπώσετε τις τιμές των ιδιοτήτων και την περίμετρο των τριγώνων. package testtrigono; // Point.java
// Point class declaration represents an x-y coordinate pair. public class Point { private int x; // x part of coordinate pair private int y; // y part of coordinate pair // no-argument constructor public Point() { // implicit call to Object constructor occurs here x=0; y=0; // constructor public Point(int xvalue, int yvalue) { // implicit call to Object constructor occurs here x = xvalue; // no need for validation y = yvalue; // no need for validation // set x in coordinate pair public void setx(int xvalue) { x = xvalue; // no need for validation // return x from coordinate pair public int getx() { return x; // set y in coordinate pair public void sety(int yvalue) { y = yvalue; // no need for validation // return y from coordinate pair public int gety() { return y; // return String representation of Point object public String tostring() { return "[" + x + ", " + y + "]"; // end class Point 3. Να δημιουργηθεί ένα πρόγραμμα Java (TestBank) για την παρακολούθηση των τραπεζικών λογαριασμών. Το πρόγραμμα θα είναι απλοποιημένο και θα αποτελείται από τρεις τάξεις:
o o o μία τάξη τραπεζικού λογαριασμού (Account) μία τάξη Ατόμου που θα υλοποιεί τους κατόχους των τραπεζικών λογαριασμών (Person) μία τάξη με το κυρίως πρόγραμμα (TestBank) Η τάξη Account θα αποτελείται από τα εξής: δύο ιδιότητες: τον κωδικό λογαριασμού code, το υπόλοιπο του λογαριασμού balance και τον ιδιοκτήτη του λογαριασμού ένα αντικείμενο τύπου Person ένα constructor (κατασκευαστή) που θα καλείται όταν δημιουργούνται αντικείμενα τύπου Account και θα θέτει την ιδιότητα balance ίσο µε 0. Αρχικά το υπόλοιπο κάθε λογαριασμού είναι μηδέν. Μία μέθοδο getbalance που θα επιστρέφει το τρέχον υπόλοιπο του λογαριασμού Μία μέθοδο setowner που θα ορίζει τον κάτοχο του λογ/μου και μια μέθοδο getowner που θα επιστρέφει τον κάτοχο του λογ/μου Μία μέθοδο setcode που θα ορίζει τον κωδικό του λογ/μου και μια μέθοδο getcode που θα επιστρέφει τον κωδικό του λογ/μου Μία μέθοδο withdraw (ανάληψη) για την ανάληψη μετρητών από τον λογαριασμό εφόσον αυτό είναι εφικτό Μία μέθοδο deposit (κατάθεση) για την κατάθεση μετρητών στο λογαριασμό Η τάξη Person θα αποτελείται από τα εξής: το όνομα (name), την ηλικία (age) και ένα πίνακα το πολύ 10 τραπεζικών λογαριασμών που αντιπροσωπεύουν τους τραπεζικούς λογαριασμούς του Person. Μέθοδο set και get για το όνομα, την ηλικία, και τους τραπεζικούς λογαριασμούς Στο κυρίως πρόγραμμα TestBank στη μέθοδο main να δημιουργηθούν δύο άτομα ο George και η Natalia και τρεις τραπεζικούς λογαριασμοί με κωδικούς 10001, 20001, 20002 αντίστοιχα. Στον λογαριασμό 10001 και 20001 είναι δικαιούχος ο George ενώ στο λογαριασμό 20002 δικαιούχος είναι η Natalia. Οι συνδέσεις μεταξύ αυτών των αντικειμένων θα δημιουργηθούν µε τη χρήση των μεθόδων setowner και setaccount των δυο τάξεων.
Στη συνέχεια ο George θα κάνει µία κατάθεση 10.000 στον λογ/μο 10001. Μετά θα κάνει µία ανάληψη 5.000 και τέλος θα προσπαθήσει να κάνει µία ανάληψη 6.000 που όμως δεν θα πετύχει γιατί το υπόλοιπο του λογαριασμού θα είναι 5.000. Αντίστοιχα κάνετε κάποιες συναλλαγές με τον άλλο λογ/μο του George και με τον λογ/μο της Natalia. Τέλος µε τη χρήση των μεθόδων getaccount() να εμφανίσετε το σύνολο των χρημάτων που έχει o George σε καταθέσεις στους λογαριασμούς του.