Άσκηση 1 Εκφώνηση Αναπτύξτε ένα πρόγραμμα σε Java σύμφωνα με το οποίο το σύστημα θα προσθέτει τους αριθμούς 12.0 και 24.0 και θα δίνει στην κύρια έξοδο το αποτέλεσμα της άθροισης Να χρησιμοποιήσετε αντί για τον πρωτογενή τύπο double, την κλάση Double της βασικής βιβλιοθήκης Διαμορφώστε τον πηγαίο κώδικα έτσι ώστε το σύστημα να εκτελεί τις παρακάτω ενέργειες: Να ορίζει μια μεταβλητή αναφοράς τύπου Double και να της αναθέτει αρχική τιμή 12.0 Να ορίζει μια 2η μεταβλητή αναφοράς τύπου Double και να της αναθέτει αρχική τιμή 24.0 Να υπολογίζει το άθροισμα των δύο παραπάνω και να εκχωρεί το αποτέλεσμα σε μια 3η μεταβλητή αναφοράς τύπου Double Να τυπώνει το αποτέλεσμα της άθροισης 1
Άσκηση 1 Εκφώνηση Προσπαθήστε να κάνετε τον κώδικα συμπαγή αποφεύγοντας τη χρήση της τρίτης μεταβλητής αναφοράς Κάντε τον κώδικα ακόμη πιο συμπαγή αποφεύγοντας τη χρήση και των δύο πρώτων μεταβλητών αναφοράς. Εκδόσεις του προγράμματος: Εκδόσεις με τρεις μεταβλητές αναφοράς Έκδοση με δύο μεταβλητές αναφοράς Έκδοση χωρίς τη χρήση μεταβλητών αναφοράς Εκδόσεις με μεταβλητές στιγμιότυπου ορισμένες σε άλλη κλάση 2
Άσκηση 1 Έκδοση με Τρεις Μεταβλητές Αναφοράς Πηγαίος κώδικας: class Exercise1 { public static void main(string[] argv){ double d1 = new Double(12.0); double d2 = new Double(24.0); double d = d1.doublevalue() + d2.doublevalue(); double d3 = new Double(d); System.out.println(d3.doubleValue()); 3
Άσκηση 1 Έκδοση με Τρεις Μεταβλητές Αναφοράς Σχολιασμός: Double d1 = new Double(12.0); Δήλωση της d1 ως τοπική μεταβλητή αναφοράς τύπου Double Δημιουργία ενός στιγμιοτύπου και απόδοση αρχικής τιμής, καλώντας το δημιουργό της κλάσης Double Ο τελεστής ανάθεσης αναθέτει το στιγμιότυπο που μόλις δημιουργήθηκε στην αναφορά d1 double d = d1.doublevalue() + d2.doublevalue(); Αποστολή του μηνύματος doublevalue() στα στιγμιότυπα d1 και d2 Στην πρόταση Double d3 = d1 + d2; η έκφραση d1 + d2 δεν είναι αποδεκτή Ο τελεστής + δεν έχει οριστεί να ενεργεί σε στιγμιότυπα τύπου Double 4
Άσκηση 1 Έκδοση με Τρεις Μεταβλητές Αναφοράς Εναλλακτική έκδοση πηγαίου κώδικα: class Exercise1 { public static void main(string[] argv){ Double d1 = new Double(12.0); Double d2 = new Double(24.0); Double d3 = new Double(d1.doubleValue() + d2.doublevalue()); System.out.println(d3.doubleValue()); 5
Άσκηση 1 Έκδοση με Τρεις Μεταβλητές Αναφοράς Σχολιασμός: Double d3 = new Double(d1.doubleValue() + d2.doublevalue()); Δήλωση της d3 ως μιας τοπικής μεταβλητής αναφοράς τύπου Double Δημιουργία στιγμιοτύπου και απόδοση αρχικής τιμής Ως αρχική τιμή ορίζεται η τιμή της έκφρασης: d1.doublevalue() + d2.doublevalue() Πρόκειται για τιμή τύπου double 6
Άσκηση 1 Έκδοση με Δύο Μεταβλητές Αναφοράς Πηγαίος κώδικας: class Exercise1 { public static void main(string[] argv){ Double d1 = new Double(12.0); Double d2 = new Double(24.0); System.out.println(d1.doubleValue() + d2.doublevalue()); 7
Άσκηση 1 Έκδοση Χωρίς τη Χρήση Μεταβλητών Αναφοράς Πηγαίος κώδικας: class Exercise1 { public static void main(string[] argv){ System.out.println((new Double(12.0)).doubleValue() + (new Double(24.0)).doubleValue()); Σχολιασμός: Αποστολή του μηνύματος new στην κλάση Double για τη δημιουργία ενός στιγμιοτύπου Ο δημιουργός επιστρέφει μια αναφορά στο στιγμιότυπο που δημιουργήθηκε Μέσω της αναφοράς αυτής το σύστημα στέλνει στο στιγμιότυπο που μόλις δημιουργήθηκε το μήνυμα doublevalue 8
Άσκηση 1 Έκδοση με Μεταβλητές Στιγμιοτύπου Ορισμένες σε Άλλη Κλάση Πηγαίος κώδικας: class Exercise1 { public static void main(string[] argv){ MyClass myobject = new MyClass(); myobject.d1 = new Double(12.0); myobject.d2 = new Double(24.0); myobject.d3 = new Double(myObject.d1.doubleValue()+ myobject.d2.doublevalue()); System.out.println(myObject.d1 + + + myobject.d2 + = + myobject.d3); class MyClass { Double d1, d2, d3; 9
Άσκηση 1 Έκδοση με Μεταβλητές Στιγμιοτύπου Ορισμένες σε Άλλη Κλάση Εναλλακτική μορφή πηγαίου κώδικα: class Exercise1 { public static void main(string[] argv){ MyClass myobject = new MyClass(12.0,24.0); myobject.d3 = new Double(myObject.d1.doubleValue()+ myobject.d2.doublevalue()); System.out.println(myObject.d1 + + + myobject.d2 + = + myobject.d3); class MyClass { Double d1, d2, d3; MyClass(double a, double b){ this.d1 = new Double(a); this.d2 = new Double(b); 10
Άσκηση 2 Τροποποιείστε κατάλληλα τον κώδικα της προηγούμενης άσκησης έτσι ώστε ο χρήστης να μπορεί να ορίζει τους δύο προς άθροιση αριθμούς στο χρόνο εκτέλεσης Εκμεταλλευτείτε το μηχανισμό της Java που επιτρέπει το πέρασμα ορισμάτων από τη γραμμή εντολών Πηγαίος κώδικας: public class Exercise2 { public static void main(string[] argv){ Double d1 = new Double(argv[0]); Double d2 = new Double(argv[1]); double result = d1.doublevalue() + d2.doublevalue(); System.out.println(argv[0] + + + argv[1] + = + result); 11
Άσκηση 2 Μια Java εφαρμογή έχει πρόσβαση στα ορίσματα γραμμής διαταγών διαμέσου της αναφοράς argv σε πίνακα στοιχείων τύπου String: argv[0] είναι το πρώτο όρισμα argv[1] είναι το δεύτερο όρισμα, κλπ. 1η Εναλλακτική μορφή πηγαίου κώδικα: public class Exercise2 { public static void main(string[] argv){ Double d1 = Double.valueOf(argv[0]); Double d2 = Double.valueOf(argv[1]); double result = d1.doublevalue() + d2.doublevalue(); System.out.println(argv[0] + + + argv[1] + = + result); 12
Άσκηση 2 2η Εναλλακτική μορφή πηγαίου κώδικα: public class Exercise2 { public static void main(string[] argv){ Double d1 = Double.valueOf(argv[0]); Double d2 = Double.valueOf(argv[1]); System.out.println(argv[0] + + + argv[1] + = + (d1.doublevalue() + d2.doublevalue())); Έστω ότι το όνομα του αρχείου του πηγαίου κώδικα είναι Ex2 Η εκτέλεση γίνεται με την εξής γραμμή διαταγής: Java Ex2 12.0 24.0 13
Άσκηση 2 3η Εναλλακτική μορφή πηγαίου κώδικα: public class Exercise2 { public static void main(string[] argv){ Double d1 =; Double d2 =; System.out.println(argv[0] + + + argv[1] + = + (Double.valueOf(argv[0]).doubleValue() + Double.valueOf(argv[1]).doubleValue())); Χωρίς τη χρήση ενδιάμεσων αναφορών 14
Άσκηση 3 Υλοποιήσετε μία μέθοδο Java που τυπώνει τη μέρα της εβδομάδας για μία συγκεκριμένη μέρα (1..31), μήνα (1..12) και χρονιά Η μέρα της εβδομάδας για τις ημερομηνίες είναι ανάμεσα στις: Μάρτης 1900 και Φεβρουάριος 2100 μπορεί να υπολογιστεί όπως παρακάτω: Πρέπει να υπολογιστούν οι συνολικές μέρες από την 1900/1/1 μέχρι τη δεδομένη ημερομηνία (βλ. παρακάτω για λεπτομέρειες). Έπειτα, διαιρείς αυτό τον αριθμό δια 7 με ακέραιο υπόλοιπο: Αυτή είναι η μέρα της εβδομάδας, με 0 την Κυριακή, 1 τη Δευτέρα, κ.ο.κ. 15
Άσκηση 3 (συνέχεια) Για να υπολογίσετε τον συνολικό αριθμό των ημερών, πρέπει να υλοποιήσετε τα παρακάτω βήματα: Αφαιρέστε 1900 από την δεδομένη χρονιά και πολλαπλασιάστε το αποτέλεσμα με 365 Προσθέστε τις επιπλέον μέρες από τα δίσεκτα έτη με (year - 1900) / 4 Αν η δεδομένη χρονιά είναι δίσεκτο έτος και ο μήνας είναι Ιανουάριος ή Φλεβάρης, πρέπει να αφαιρέσετε 1 από το προηγούμενο αποτέλεσμα Προσθέστε όλες τις μέρες του χρόνου αυτού μέχρι τη δεδομένη ημέρα στο προηγούμενο αποτέλεσμα (Στην περίπτωση που είναι Φλεβάρης χρησιμοποιήσετε πάντα 28 μέρες, επειδή η επιπλέον μέρα του δίσεκτου έτους έχει ήδη προστεθεί) 16
Άσκηση 3 public class DayOfTheWeek { /* * Prints out the day of the week for a given day, month, year */ public static void main(string [] args) { int day = 23; int month = 5; int year = 1949; int dayoftheweek = (year - 1900) * 365 + (year - 1900) / 4; if (year % 4 == 0 && month <= 2) { dayoftheweek--; switch (month) { // NO break!!! Fall through to all cases case 12: dayoftheweek += 30; case 11: dayoftheweek += 31; case 10: dayoftheweek += 30; case 9: dayoftheweek += 31; case 8: dayoftheweek += 31; 17
Άσκηση 3 case 6: dayoftheweek += 31; case 5: dayoftheweek += 30; case 4: dayoftheweek += 31; case 3: dayoftheweek += 28; case 2: dayoftheweek += 31; dayoftheweek = (day + dayoftheweek) % 7; switch (dayoftheweek) { case 0: System.out.println("Sunday"); break; case 1: System.out.println("Monday"); break; case 2: System.out.println("Tuesday"); break; case 3: System.out.println("Wednesday"); break; case 4: System.out.println("Thursday"); break; case 5: System.out.println("Friday"); break; case 6: System.out.println("Saterday"); break; 18
Άσκηση 4 Προσδιορίστε την έξοδο του παρακάτω πηγαίου κώδικα που κάνει χρήση μεθόδων σύγκρισης Class RegionMatch { public static void main(string[] args) { String str = Klea, klea! ; boolean b1, b2, b3; b1 = str.regionmatches(6, Klea, 0, 4); b2 = str.regionmatches(true, 6, Klea, 0, 4); b3 = str.regionmatches(true, 6, Klea, 0, 5); System.out.println( b1 = + b1); System.out.println( b2 = + b2); System.out.println( b3 = + b3); 19
Άσκηση 4 Απάντηση: b1 = false b2 = true b3 = false 20
Άσκηση 5 Εκθετική Συνάρτηση Υποθέσετε ότι ο x είναι θετικός αριθμός τύπου double. Υλοποιήστε τη σειρά του Taylor για να υπολογίσετε την τιμή του αθροίσματος e x = 1 + x + 2 x 2! + 3 x 3! +... 21
Άσκηση 5 x N Υπολογισμός N! : double num = 1.0, dem = 1.0; for (int i=1; i<=n; i++) num *= x; for (int i=1; i<=n; i++) dem *= i; double term = num/dem; Καλύτερη προσέγγιση μονή επανάληψη double term = 1.0; for (int i=1; i<=n; i++) term *= x/i; 22
e Υπολογισμός : x Άσκηση 5 double term = 1.0; double sum = 0.0; for (int n=1; sum!=sum + term; n++){ sum += term; term = 1.0; for (int i=1; i<=n; i++) term *= x/i; /* * Η προηγούμενη προσέγγιση των 2-loops δεν μπορεί να ανταποκριθεί * για τιμές π.χ. x=10 και N=100 επειδή το 100! είναι πολύ μεγάλο για * να αναπαρασταθεί με double */ double term = 1.0; double sum = 0.0; for (int n=1; sum!=sum + term; n++){ sum += term; term *= x/i; 23