Βασικά στοιχεία προγραµµατισµού στη JAVA Επαναχρησιµοποίηση κώδικα Ονοµατολογία Χρήσιµες Βιβλιοθήκες (I/O) Προγραµµατιστικές συµβάσεις
Επαναχρησιµοποίηση Κώδικα Application Programming Interfaces (APIs) Βιβλιοθήκες
Επαναχρησιμοποίηση κλάσεων Μ. Δικαιάκος Όταν θέλουμε να επαναχρησιμοποιήσουμε υπάρχουσες κλάσεις, ο μεταγλωττιστής θα πρέπει να μπορεί να τις αναζητήσει και να τις βρεί. Όταν ο πηγαίος κώδικας της επαναχρησιμοποιούμενης κλάσης βρίσκεται στο αρχείο μας, το πρόβλημα είναι απλό (no forward referencing problem στην Java). Επίσης, μπορούμε εύκολα να επαναχρησιμοποιήσουμε κλάσεις που βρίσκονται τοποθετημένες στον ίδιο κατάλογο με τον κώδικά μας Για την «ενσωμάτωση» εξωτερικών κλάσεων χρησιμοποιούμε την εντολή import, με την οποία λέμε στον μεταφραστή να ενσωματώσει μια κλάση ή ένα «πακέτο» (package), δηλ. μια βιβλιοθήκη κλάσεων. Π.χ.: import java.util.arraylist; import java.util.*; 3
4 Προγραμματιστική Διαπροσωπεία Εφαρμογών
4 Προγραμματιστική Διαπροσωπεία Εφαρμογών H Προγραμματιστική Διαπροσωπεία Εφαρμογών της JAVA (JAVA API - Application Programming Interface) αποτελείται από μια μεγάλη συλλογή έτοιμων δομοστοιχείων λογισμικού, τα οποία υλοποιούν διάφορες χρήσιμες λειτουργικότητες.
4 Προγραμματιστική Διαπροσωπεία Εφαρμογών H Προγραμματιστική Διαπροσωπεία Εφαρμογών της JAVA (JAVA API - Application Programming Interface) αποτελείται από μια μεγάλη συλλογή έτοιμων δομοστοιχείων λογισμικού, τα οποία υλοποιούν διάφορες χρήσιμες λειτουργικότητες. Το ΑΡΙ είναι οργανωμένο σε λογικές συλλογές (βιβλιοθήκες) κλάσεων και διαπροσωπειών, οι οποίες, στην ορολογία της JAVA, αποκαλούνται πακέτα (packages).
4 Προγραμματιστική Διαπροσωπεία Εφαρμογών H Προγραμματιστική Διαπροσωπεία Εφαρμογών της JAVA (JAVA API - Application Programming Interface) αποτελείται από μια μεγάλη συλλογή έτοιμων δομοστοιχείων λογισμικού, τα οποία υλοποιούν διάφορες χρήσιμες λειτουργικότητες. Το ΑΡΙ είναι οργανωμένο σε λογικές συλλογές (βιβλιοθήκες) κλάσεων και διαπροσωπειών, οι οποίες, στην ορολογία της JAVA, αποκαλούνται πακέτα (packages). Πληροφορίες για τον ορισμό των κλάσεων που υπάρχουν στις βιβλιοθήκες της Java, μπορούν να βρεθούν στα εγχειρίδια χρήσης της γλώσσας, που υπάρχουν σε μορφή HTML:
4 Προγραμματιστική Διαπροσωπεία Εφαρμογών H Προγραμματιστική Διαπροσωπεία Εφαρμογών της JAVA (JAVA API - Application Programming Interface) αποτελείται από μια μεγάλη συλλογή έτοιμων δομοστοιχείων λογισμικού, τα οποία υλοποιούν διάφορες χρήσιμες λειτουργικότητες. Το ΑΡΙ είναι οργανωμένο σε λογικές συλλογές (βιβλιοθήκες) κλάσεων και διαπροσωπειών, οι οποίες, στην ορολογία της JAVA, αποκαλούνται πακέτα (packages). Πληροφορίες για τον ορισμό των κλάσεων που υπάρχουν στις βιβλιοθήκες της Java, μπορούν να βρεθούν στα εγχειρίδια χρήσης της γλώσσας, που υπάρχουν σε μορφή HTML: JDK6 Documentation
4 Προγραμματιστική Διαπροσωπεία Εφαρμογών H Προγραμματιστική Διαπροσωπεία Εφαρμογών της JAVA (JAVA API - Application Programming Interface) αποτελείται από μια μεγάλη συλλογή έτοιμων δομοστοιχείων λογισμικού, τα οποία υλοποιούν διάφορες χρήσιμες λειτουργικότητες. Το ΑΡΙ είναι οργανωμένο σε λογικές συλλογές (βιβλιοθήκες) κλάσεων και διαπροσωπειών, οι οποίες, στην ορολογία της JAVA, αποκαλούνται πακέτα (packages). Πληροφορίες για τον ορισμό των κλάσεων που υπάρχουν στις βιβλιοθήκες της Java, μπορούν να βρεθούν στα εγχειρίδια χρήσης της γλώσσας, που υπάρχουν σε μορφή HTML: JDK6 Documentation http://java.sun.com/javase/6/docs/index.html
5 To API της κλάσης Charge public class Charge double x0, y0, q0; double potentialat(double x, double y) δυναμικό στη θέση x,y λόγω του φορτίου String tostring() μια συμβολοσειρά που αναπαριστά το φορτίο
6 Το API της μαθηματικής βιβλιοθήκης
7 Ένα πρόγραμμα σε Java // Property.java import java.util.*; // java.util.date public class Property { public static void main(string[] args) { System.out.println(new Date()); Properties p = System.getProperties(); p.list(system.out); System.out.println( -- Memory usage: ); Runtime rt = Runtime.getRuntime(); System.out.println( Total Memory = + rt.totalmemory() + Free Memory = + rt.freememory()); } }
8 Πληροφορίες για κλάσεις
8 Πληροφορίες για κλάσεις getproperies(): στατική μέθοδος της κλάσης System. Επιστρέφει χειριστήριο για ένα αντικείμενο της κλάσης Properties.
Πληροφορίες για κλάσεις getproperies(): στατική μέθοδος της κλάσης System. Επιστρέφει χειριστήριο για ένα αντικείμενο της κλάσης Properties. Η κλάση Properties διαθέτει μια μέθοδο list(), η οποία στέλνει τα περιεχόμενα τού αντικειμένου σε ένα αντικείμενο System.out Μ. Δικαιάκος 8
Πληροφορίες για κλάσεις getproperies(): στατική μέθοδος της κλάσης System. Επιστρέφει χειριστήριο για ένα αντικείμενο της κλάσης Properties. Η κλάση Properties διαθέτει μια μέθοδο list(), η οποία στέλνει τα περιεχόμενα τού αντικειμένου σε ένα αντικείμενο System.out Υπερφόρτωση τελεστή + Μ. Δικαιάκος 8
Πληροφορίες για κλάσεις getproperies(): στατική μέθοδος της κλάσης System. Επιστρέφει χειριστήριο για ένα αντικείμενο της κλάσης Properties. Η κλάση Properties διαθέτει μια μέθοδο list(), η οποία στέλνει τα περιεχόμενα τού αντικειμένου σε ένα αντικείμενο System.out Υπερφόρτωση τελεστή + Αυτόματη μετατροπή τύπου Μ. Δικαιάκος 8
9
10
11
Διαχείριση Ονοµάτων Πώς αποφεύγουµε συγκρούσεις ανάµεσα σε δύο ονόµατα (µεθόδων, µεταβλητών, πεδίων δεδοµένων...);
13 Ορατότητα Ονομάτων (name visibility)
13 Ορατότητα Ονομάτων (name visibility) Αποφυγή συγκρούσεων ονομάτων:
13 Ορατότητα Ονομάτων (name visibility) Αποφυγή συγκρούσεων ονομάτων: Μέθοδοι και πεδία δεδομένων είναι πάντοτε φωλιασμένα σε κλάσεις και καλούνται μέσω του ονόματος αντικειμένων.
13 Ορατότητα Ονομάτων (name visibility) Αποφυγή συγκρούσεων ονομάτων: Μέθοδοι και πεδία δεδομένων είναι πάντοτε φωλιασμένα σε κλάσεις και καλούνται μέσω του ονόματος αντικειμένων. Επομένως, δεν υπάρχει περίπτωση σύγκρουσης με ονόματα μεθόδων ή πεδίων δεδομένων άλλων κλάσεων.
13 Ορατότητα Ονομάτων (name visibility) Αποφυγή συγκρούσεων ονομάτων: Μέθοδοι και πεδία δεδομένων είναι πάντοτε φωλιασμένα σε κλάσεις και καλούνται μέσω του ονόματος αντικειμένων. Επομένως, δεν υπάρχει περίπτωση σύγκρουσης με ονόματα μεθόδων ή πεδίων δεδομένων άλλων κλάσεων. Τι συμβαίνει με τα ονόματα των κλάσεων;
13 Ορατότητα Ονομάτων (name visibility) Αποφυγή συγκρούσεων ονομάτων: Μέθοδοι και πεδία δεδομένων είναι πάντοτε φωλιασμένα σε κλάσεις και καλούνται μέσω του ονόματος αντικειμένων. Επομένως, δεν υπάρχει περίπτωση σύγκρουσης με ονόματα μεθόδων ή πεδίων δεδομένων άλλων κλάσεων. Τι συμβαίνει με τα ονόματα των κλάσεων; Η JAVA εισάγει μια σύμβαση σύμφωνα με την οποία κάθε αρχείο Java αντιστοιχεί αυτόματα σε έναν δικό του χώρο ονομάτων (name space) και κάθε κλάση μέσα στο αρχείο δέχεται αυτόματα μια μοναδική ταυτότητα (identifier).
13 Ορατότητα Ονομάτων (name visibility) Αποφυγή συγκρούσεων ονομάτων: Μέθοδοι και πεδία δεδομένων είναι πάντοτε φωλιασμένα σε κλάσεις και καλούνται μέσω του ονόματος αντικειμένων. Επομένως, δεν υπάρχει περίπτωση σύγκρουσης με ονόματα μεθόδων ή πεδίων δεδομένων άλλων κλάσεων. Τι συμβαίνει με τα ονόματα των κλάσεων; Η JAVA εισάγει μια σύμβαση σύμφωνα με την οποία κάθε αρχείο Java αντιστοιχεί αυτόματα σε έναν δικό του χώρο ονομάτων (name space) και κάθε κλάση μέσα στο αρχείο δέχεται αυτόματα μια μοναδική ταυτότητα (identifier). Για την αποφυγή συγκρούσεων ανάμεσα σε ομώνυμες κλάσεις διαφορετικών προγραμματιστών, κάθε προγραμματιστής μπορεί να επιδιώκει την χρήση μοναδικών ονομάτων. Π.χ.: cy.ac.ucy.cs.mdd.utility
14 Κανόνες προτεραιότητας ονομάτων
14 Κανόνες προτεραιότητας ονομάτων import java.util.*;
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test {
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) {
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random();
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}}
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random;
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο;
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*;
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random {
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random { int nextint() { return 0; }
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random { int nextint() { return 0; } }
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random { int nextint() { return 0; } } public class Test {
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random { int nextint() { return 0; } } public class Test { public static void main(string[] args) {
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random { int nextint() { return 0; } } public class Test { public static void main(string[] args) { Random rand = new Random();
14 Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random { int nextint() { return 0; } } public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;
Κανόνες προτεραιότητας ονομάτων import java.util.*; public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100;}} Πού ορίζεται η κλάση Random; Τι συμβαίνει στο ακόλουθο; import java.util.*; public class Random { int nextint() { return 0; } } public class Test { public static void main(string[] args) { Random rand = new Random(); int j = rand.nextint() % 100; }} Μ. Δικαιάκος 14
15 Ονοματολογία Κλάσεων και Μεθόδων import java.util.*; class Random { int nextint() { return 0; } } public class Test { public static void main(string[] args) { java.util.random rand = new java.util.random(); int j = rand.nextint() % 100; } }
Βιβλιοθήκες Εισόδου/Εξόδου
17
18
19 Λίγα λόγια για την StdDraw line(x0, y0, x1, y1) τραβάει μια γραμμή από το (x0,y0) στο (x1,y1) προκαθορισμένη κλίμακα: μοναδιαίο τετράγωνο: συντεταγμένες σημείων μεταξύ (0,0) και (1,1) προκαθορισμένη συμπεριφορά: η απεικόνιση των σχεδίων σας γίνεται σε παράθυρο με μαύρο χρώμα σε άσπρο παρασκήνιο point(x,y) απεικονίζει ένα σημείο στις συντεταγμένες (x,y)
20 Παράδειγμα αʼ Σχεδιάστε ένα ισόπλευρο τρίγωνο με μήκος ακμής 1 και με μια τελεία στο εσωτερικό του: (0.5, sqrt(3)/2) (0,0) (0,1)
21 Ο κώδικας } public class Triangle { public static void main(string[] args) { double t = Math.sqrt(3.0) / 2.0; StdDraw.line(0.0, 0.0, 1.0, 0.0); StdDraw.line(1.0, 0.0, 0.5, t); StdDraw.line(0.5, t, 0.0, 0.0); StdDraw.point(0.5, t/3.0); }
Παράδειγμα βʼ Διάβασε ένα σύνολο από συντεταγμένες σημείων και απεικόνισέ τα στο επίπεδο public class PlotFilter { public static void main(string[] args) { // read in bounding box and rescale double x0 = StdIn.readDouble(); double y0 = StdIn.readDouble(); double x1 = StdIn.readDouble(); double y1 = StdIn.readDouble(); StdDraw.setXscale(x0, x1); StdDraw.setYscale(y0, y1); } Μ. Δικαιάκος // plot points, one at a time while (!StdIn.isEmpty()) { double x = StdIn.readDouble(); double y = StdIn.readDouble(); StdDraw.point(x, y); } 22
Παράδειγμα βʼ Διάβασε ένα σύνολο από συντεταγμένες σημείων και απεικόνισέ τα στο επίπεδο public class PlotFilter { public static void main(string[] args) { // read in bounding box and rescale double x0 = StdIn.readDouble(); double y0 = StdIn.readDouble(); double x1 = StdIn.readDouble(); double y1 = StdIn.readDouble(); StdDraw.setXscale(x0, x1); StdDraw.setYscale(y0, y1); } Μ. Δικαιάκος // plot points, one at a time while (!StdIn.isEmpty()) { double x = StdIn.readDouble(); double y = StdIn.readDouble(); StdDraw.point(x, y); } 22
23 Παράδειγμα γʼ
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
23 Παράδειγμα γʼ Χρησιμοποιείστε την κλάση StdDraw για να κάνετε τη γραφική παράσταση της συνάρτησης: y = sin(4x) + sin(20x) στο διάστημα (0, π) Ωστόσο: στο διάστημα αυτό υπάρχουν άπειρα σημεία... Λύση: Δειγματοληψία: υπολογίζουμε τη συνάρτηση για πεπερασμένο αριθμό σημείων Γραμμική προσέγγιση: ενώνουμε τα σημεία της γραφικής παράστασης με ευθύγραμμα τμήματα
24 public class FunctionGraph { public static void main(string[] args) { } } // number of line segments to plot int N = Integer.parseInt(args[0]); // the function y = sin(4x) + sin(20x), sampled at N points // between x = 0 and x = pi double[] a = new double[n+1]; for (int i = 0; i <= N; i++) { a[i] = Math.sin(4*Math.PI*i/N) + Math.sin(20*Math.PI*i/N); } // rescale the coordinate system StdDraw.setXscale(0, N); StdDraw.setYscale(-2.0, +2.0); // plot the approximation to the function for (int i = 0; i < N; i++) { StdDraw.line(i, a[i], i+1, a[i+1]); }
25 Άσκηση για το σπίτι Χρησιμοποιείστε την StdDraw για να απεικονίσετε: ένα ισόπλευρο τρίγωνο εγγεγραμμένο σε κύκλο τον κύκλο το κέντρο του κύκλου
26 Έλεγχος στη StdDraw setxscale(x0, x1), setyscale(y0,y1) αλλάζουν τις κλίμακες των αξόνων συντεταγμένων από (0,1) σε (x0,x1) και (y0,y1), αντίστοιχα το σημείο (x0,y0) αντιστοιχεί στην κάτω αριστερά γωνία του καμβά μας. setpenradius(r) αλλάζει το μέγεθος της ακίδας του νοητού μολυβιού με το οποίο σχεδιάζονται οι γραμμές, σε r
27 Σχήματα στη StdDraw Η StdDraw υποστηρίζει την απεικόνιση σχημάτων (κύκλων, ορθωγώνιων, πολυγώνων) Ένα σχήμα ορίζεται από το περίγραμμά του Μέθοδοι των οποίων το όνομα ξεκινάει με filled, το εσωτερικό του σχήματος είναι διαφορετικό από το παρασκήνιο
28 Παράδειγμα σχημάτων στη StdDraw
29 StdDraw: χρώμα και κίνηση
Παράδειγμα δʼ: ελαστική σφαίρα Μ. Δικαιάκος Απεικονίστε μια ελαστική σφαίρα, η οποία κινείται με ταχύτητα (vx,vy), ξεκινώντας από μια αρχική θέση (rx, ry) Αλγόριθμος: Υπολόγισε τη νέα θέση της σφαίρας Καθάρισε τον καμβά Απεικόνισε τη σφαίρα στη νέα της θέση Περίμενε για λίγο διάστημα Επανάλαβε για έναν αριθμό βημάτων ώστε να δοθεί η αίσθηση της κίνησης της σφαίρας Υπολογισμός νέας θέσης: x t+1 = xt + vx, όπου x0 = rx y t+1 = yt + vx, όπου y0 = ry Τι συμβαίνει όταν χτυπήσουμε τοίχο; 30
public class BouncingBall { public static void main(string[] args) { // set the scale of the coordinate system StdDraw.setXscale(-1.0, 1.0); StdDraw.setYscale(-1.0, 1.0); // initial values double rx = 0.480, ry = 0.860; // position double vx = 0.005, vy = 0.003; // velocity double radius = 0.05; // radius // main animation loop while (true) { // bounce off wall according to law of elastic collision if (Math.abs(rx + vx) > 1.0 - radius) vx = -vx; if (Math.abs(ry + vy) > 1.0 - radius) vy = -vy; // update position rx = rx + vx; ry = ry + vy; // clear the background StdDraw.setPenColor(StdDraw.GRAY); StdDraw.filledSquare(0, 0, 1.0); // draw ball on the screen StdDraw.setPenColor(StdDraw.BLACK); StdDraw.filledCircle(rx, ry, radius); // display and pause for 20 ms StdDraw.show(20); } } } 31
32 StdDraw: αλληλεπίδραση με χρήστη double mousex() επιστρέφει την x συντεταγμένη του μυός double mousey() επιστρέφει την y συντεταγμένη του ποντικιού boolean mousepressed() επιστρέφει τιμή αληθή αν πιέσουμε το ποντίκι
33 Χρήση βιβλιοθηκών Κατεβάστε τα αρχεία JAVA που υλοποιούν τις StdIn, StdOut και StdDraw από το Διαδίκτυο: http://www.cs.princeton.edu/introcs/stdlib/stdin.java http://www.cs.princeton.edu/introcs/stdlib/stdout.java http://www.cs.princeton.edu/introcs/stdlib/stddraw.java Τοποθετείστε τα τρία αυτά αρχεία στον κατάλογο στον οποίο κρατάτε τα προγράμματα JAVA που δημιουργείτε. Εισάγετε τα αρχεία αυτά στο περιβάλλον του Eclipse. Χρησιμοποιείστε μέσα από το Eclipse την εντολή javadoc για να δημιουργηθούν τα εγχειρίδια χρήσης των κλάσεων StdIn, StdOut, StdDraw Είστε έτοιμοι!
Προγραµµατιστικές Συµβάσεις τής SUN για την JAVA
35 Λόγοι Υιοθέτησης Συμβάσεων Οι προγραμματιστικές συμβάσεις είναι σημαντικές για μια σειρά λόγων: 80% του χρόνου κωδικοποίησης ενός προγράμματος αφορά στην συντήρησή του. Σπάνια κάποιο λογισμικό συντηρείται από τον αρχικό προγραμματιστή. Προγραμματιστικές συμβάσεις βελτιώνουν την αναγνωσιμότητα του λογισμικού και διευκολύνουν τους προγραμματιστές να κατανοούν τα προγράμματα πιό γρήγορα και καλύτερα. Αν ο πηγαίος κώδικά σας πρόκειται να κυκλοφορήσει σαν προϊόν,θα πρέπει να είναι οργανωμένος και γραμμένος καθαρά.
36 Οργάνωση Αρχείων JAVA Ένα αρχείο αποτελείται από τμήματα, τα οποία πρέπει να διαχωρίζονται με κενές γραμμές και προαιρετικά σχόλια περιγραφής του κάθε σχήματος. Αρχεία μεγαλύτερα από 2000 γραμμές είναι δυσανάγνωστα και πρέπει να αποφεύγονται. Κάθε αρχείο Java περιέχει μια μόνο δημόσια κλάση ή διαπροσωπεία. Όταν υπάρχουν ιδιωτικές κλάσεις ή διαπροσωπείες που σχετίζονται με την δημόσια κλάση, αυτές μπορούν να συμπεριληφθούν στο αρχείο της δημόσιας κλάσης, αλλά μετά τον ορισμό της. Τα αρχεία της Java έχουν την ακόλουθη δομή: Στην αρχή υπάρχουν σχόλια. Ακολουθούν εντολές πακέτων (package)και εισαγωγών (import). Δηλώσεις κλάσεων και διαπροσωπειών.
Αρχικά Σχόλια Αρχείων Java /* * Classname * * Version information * * Date * * Copyright notice */ Μ. Δικαιάκος 37
Εντολές Πακέτων και Εντολών Εισαγωγής Η πρώτη εντολή στα περισσότερα αρχεία Java αφορά στον ορισμό της βιβλιοθήκης (package) στην οποία ανήκουν οι κλάσεις του αρχείου. Ακολουθούν εντολές ενσωμάτωσης υπαρχουσών βιβλιοθηκών. Π.χ.: package java.awt; import java.awt.peer.canvaspeer; Μ. Δικαιάκος 38
39 Δηλώσεις Κλάσεων και Διαπροσωπειών Σύμφωνα με την σύμβαση της Sun, η δήλωση μιας κλάσης περιλαμβάνει: 1. Σχόλιο για την αποδελτίωση (documentation) της κλάσης ή διαπροσωπείας 2. Δήλωση κλάσης ή διαπροσωπείας. 3. Αν χρειάζεται, σχόλιο σχετικά με την υλοποίηση της κλάσης ή της διαπροσωπείας. 4. Ορισμούς μεταβλητών κλάσης (στατικών), με πρώτες τις public, ακολουθούμενες από τις protected, τις μη καθοριζόμενης πρόσβασης και τις private. 5. Ορισμούς μεταβλητών στιγμιοτύπου (instance variables), με την ίδια σειρά όπως και οι στατικές. 6. Κατασκευαστές (constructors) 7. Μέθοδοι
40 Παράδειγμα αρχείου Java package java.blah; import java.blah.blahdy.blahblah; /** * Class description goes here. * * @version 1.82 18 Mar 1999 * @author Firstname Lastname */ public class Blah extends SomeClass { /* A class implementation comment can go here. */
41 Παράδειγμα αρχείου Java (συνέχεια) /** classvar1 documentation comment */ public static int classvar1; /** * classvar2 documentation comment that happens to be * more than one line long */ private static Object classvar2; /** instancevar1 documentation comment */ public Object instancevar1; /** instancevar2 documentation comment */ protected int instancevar2; /** instancevar3 documentation comment */ private Object[] instancevar3; /** *...constructor Blah documentation comment... */ public Blah() { //...implementation goes here... }
Παράδειγμα αρχείου Java (συνέχεια) /** *...method dosomething documentation comment... */ public void dosomething() { //...implementation goes here... } /** *...method dosomethingelse documentation comment... * @param someparam description */ public void dosomethingelse(object someparam) { //...implementation goes here... } } Μ. Δικαιάκος 42
Συμβάσεις Σχολίων: Γενικές Αρχές Δύο ειδών σχόλια: Υλοποίησης, που περιλαμβάνονται ανάμεσα σε /*...*/, ή έπονται του // Αποδελτίωσης (documentation ή "doc comments"), που περιλαμβάνονται ανάμεσα σε /**...*/. Τα σχόλια αποδελτίωσης, μπορούν να εξαχθούν αυτόματα σε εγχειρίδια HTML μορφότυπου, με χρήση του εργαλείου javadoc. Τα σχόλια υλοποίησης χρησιμεύουν για τον αποκλεισμό κώδικα σε σχόλιο, ή τον σχολιασμό υλοποίησης. Τα σχόλια αποδελτίωσης στοχεύουν στην καταγραφή των προδιαγραφών του κώδικα (code specification), ανεξάρτητα της υλοποίησης. Γενικά, τα σχόλια αποσκοπούν στην παράθεση επεξηγήσεων σχετικά με τον κώδικα για πράγματα που δεν είναι φανερά από τον κώδικα τον ίδιο. Πάρα πολλά επεξηγηματικά σχόλια υποδηλώνουν συνήθως κακή σχεδίαση του κώδικα. 43
44 Σχόλια Αποδελτίωσης (doc comments) Χρησιμεύουν στην αυτόματη αποδελτίωση σε εγχειρίδιο HTML από το εργαλείο javadoc. Περιλαμβάνονται μεταξύ χαρακτήρων /**...*/, με ένα σχόλιο για κάθε κλάση, διαπροσωπεία ή μέθοδο-μέλος κλάσης και πρέπει να εµφανίζονται ακριβώς πριν την δήλωση για την αποδελτίωση της οποίας εισάγονται: /** * The Example class provides... */ public class Example {... Ακολουθούν την στοίχιση της δήλωσης της οποίας προηγούνται. Σχόλια αποδελτίωσης δεν πρέπει να τοποθετούνται μέσα στο σώμα μιας μεθόδου.
Σχόλια Αποδελτίωσης (συνέχεια) Μπορούν να περιλαμβάνουν σημαντήρες (tags) @see, οι οποίοι επιτρέπουν την παραπομπή σε άλλα τμήματα των εγχειριδίων HTML, τα οποία δημιουργούνται από το javadoc. Άλλοι χρησιμοποιούμενοι σημαντήρες είναι οι ακόλουθοι: @version @author author-information @since @param parameter-name description @return description @throws Μ. Δικαιάκος 45
Μ. Δικαιάκος Συμβάσεις Ονοματολογίας Κλάσεις: Class names should be nouns, in mixed case with the first letter of each internal word capitalized. Try to keep simple and descriptive. Use whole words-avoid acronyms and abbreviations. Διαπροσωπείες: Interface names should be capitalized like class names. Μέθοδοι: Methods should be verbs, in mixed case with the first letter lowercase, with the first letter of each internal word capitalized. Μεταβλητές: Except for variables, all instance, class, and class constants are in mixed case with a lowercase first letter. Internal words start with capital letters. Variable names should not start with underscore _ or dollar sign $ characters, even though both are allowed. Variable names should be short yet meaningful. The choice of a variable name should be mnemonic- that is, designed to indicate to the casual observer the intent of its use. One-character variable names should be avoided except for temporary "throwaway" variables. Common names for temporary variables are i, j, k, m, and n for integers; c, d, and e for characters. Σταθερές: The names of variables declared class constants and of ANSI constants should be all uppercase with words separated by underscores ("_"). (ANSI constants should be avoided, for ease of debugging.) 46
47