ΒΙΒΛΙΟΘΗΚΕΣ ΚΑΙ ΠΕΛΑΤΕΣ Ι-1
Εκμάθηση γλώσσας προγρ/σμού Η εκμάθηση μίας γλώσσας προγραμματισμού μπορεί να χωρισθεί σε δύο μέρη Εκμάθηση της γλώσσας Σύνταξη, εντολές επιλογής, βρόγχοι, Εκμάθηση των βιβλιοθηκών (API) Συχνά χρησιμοποιούμενες δομές δεδομένων Διαπροσωπείες ανθρώπου-μηχανής (GUI), είσοδος/έξοδος, αποθήκευση δεδομένων, δικτύωση, 2
Βιβλιοθήκες Βιβλιοθήκη. Μία ενότητα της οποίας οι μέθοδοι προορίζονται για χρήση από πολλά άλλα προγράμματα. Πελάτης. Πρόγραμμα το οποίο καλεί μια βιβλιοθήκη. API. Συμβόλαιο μεταξύ πελάτη και υλοποίησης. Υλοποίηση. Πρόγραμμα το οποίο υλοποιεί τις μεθόδους σε ένα API. 3
Εκμάθηση των βιβλιοθηκών (API) API = Application Programming Interface Η διαπροσωπεία (συμβάσεις κλήσεως) μέσω της οποίας ένας προγραμματιστής εφαρμογών προσπελαύνει την βιβλιοθήκη κλάσεων της Java Java 2 Platform, Standard Edition, v 1.6 http://download.oracle.com/javase/6/docs/api/ 4
Java 2 Platform, Standard Edition, v 6 5
Βιβλιοθήκη κλάσεων Java Η Java 2 Platform, Standard Edition, παρέχει μια μεγάλη συλλογή από κλάσεις που υποστηρίζουν και απλουστεύουν πολλές συνήθεις προγραμματιστικές δραστηριότητες GUIs, TCP/IP sockets, συμπίεση (ZIP), 2D Graphics, κρυπτογράφηση Οι «θεμελιώδεις κλάσεις Java» είναι μέρος της «Java 2 standard language» 6
7
Συχνά χρησιμοποιούμενα πακέτα java.lang Παρέχει κλάσεις που θεωρούνται θεμελιώδεις για το σχεδιασμό της γλώσσας προγραμματισμού Java (περιλαμβάνει την κλάση Math) java.lang.math Παρέχει κλάσεις για την εκτέλεση αριθμητικών πράξεων μεγάλης ακρίβειας με ακέραιους και πραγματικούς αριθμούς. 8
Το μέγεθος των πακέτων Με μια πρώτη ματιά ο μεγάλος αριθμός των κλάσεων καθιστά αδύνατη την εκμάθηση τους. Στις περισσότερες περιπτώσεις ο προγραμματιστής χρειάζεται να γνωρίζει μόνο ένα υποσύνολο των κλάσεων. Το υποσύνολο των κλάσεων που πρέπει να γνωρίζει ένας προγραμματιστής εξαρτάται από τις εφαρμογές που αναπτύσσει. Σημαντική είναι η ικανότητα εντοπισμού των αναγκαίων για τη σωστή ανάπτυξη προγραμμάτων κλάσεων στις βιβλιοθήκες. 9
Σύγκριση Συχνότητα χρήσης λέξεων Οι 25 συχνότερα χρησιμοποιούμενες λέξεις αποτελούν περίπου το 1/3 του έντυπου υλικού (στην Αγγλική) Οι 100 συχνότερα χρησιμοποιούμενες λέξεις αποτελούν περίπου το 1/2 του έντυπου υλικού Οι 300 συχνότερα χρησιμοποιούμενες λέξεις αποτελούν περίπου το 65% του έντυπου υλικού www.duboislc.org/educationwatch/first100words.html 10
Πακέτα Εντολές Κλάσεις Υπάρχουν τρία στοιχεία που μπορεί να αποτελούν μέρη ενός αρχείου πηγαίου κώδικα Κανένα από αυτά δεν είναι αναγκαίο Αν ένα ή περισσότερα είναι παρόντα πρέπει να εμφανίζονται με την παρακάτω σειρά: Δήλωση πακέτου (package declaration) Εισαγωγή εντολών (import statements) Ορισμός κλάσης (class definition) 11
Παράδειγμα Java import javax.swing.*; public class SimpleGUIExample { public static void main(string s[]) { // we do lots of windows stuff here ;-) 12
import Οι εντολές Import εισάγουν ένα ολόκληρο πακέτο η μια συγκεκριμένη κλάση κλάση import java.awt.button; ολόκληρο πακέτο import java.util.*; 13
import Εάν κλάση με το ίδιο όνομα υπάρχει σε δυο διαφορετικά πακέτα, τότε αναφορές στην κλάση αυτή πρέπει να περιέχουν και το όνομα του πακέτου GP.Point point = new GP.Point(area, 20, 20); java.awt.point point = new awt.point (30, 3); Εάν δεν προσδιοριστεί το πακέτο ο μεταφραστής της java θα παράγει το διαγνωστικό μήνυμα: Ambiguous class: GP.Point and java.awt.point 14
Συχνά χρησιμοποιούμενες κλάσεις String Math System Κλάσεις συσκευαστές (Wrapper classes) 15
Η κλάση String Η κλάση String είναι ίσως η πιο συχνά χρησιμοποιούμενη κλάση Αντικείμενα τύπου String δεν μπορεί να μεταλλαχθούν Η τιμή τους δεν μπορεί να αλλαχθεί μετά τη δημιουργία τους Η Java υποστηρίζει τον ειδικό τελεστή συνένωσης αλφαριθμητικών ( + ) String cde = "cde"; System.out.println("abc" + cde); 16
Η κλάση String Η κλάση String περιλαμβάνει μεθόδους οι οποίες υποστηρίζουν: Ατομική εξέταση χαρακτήρων της συμβολοσειράς Σύγκριση συμβολοσειρών Αναζήτηση «Εξαγωγή» τμημάτων συμβολοσειρών Δημιουργία αντιγράφων συμβολοσειρών όπου όλα τα γράμματα έχουν μετατραπεί σε πεζά ή κεφαλαία 17
Η κλάση Math Περιέχει μεγάλο αριθμό στατικών μεθόδων για μαθηματικούς υπολογισμούς abs, max, min, sin, cos, tan, sqrt etc. random (επιστρέφει τυχαίο αριθμό ανάμεσα στο 0 και το 1) Εάν χρειάζεστε έναν τυχαίο αριθμό (τύπου double) από το διάστημα [0.0, 1.0) double myrandom = Math.random(); // [0,1) 18
Η κλάση Math Περιέχει 2 σταθερές Math.PI Math.E (βάση του φυσικού λογάριθμου) 19
Κλάσεις Συσκευαστές (Wrapper Classes) Η Java έχει μία κλάση συσκευαστή για κάθε ένα από τους βασικούς τύπους δεδομένων : Primitive Type Wrapper Class Primitive Type Wrapper Class boolean Boolean float Float byte Byte int Integer char Character long Long double Double short Short Η κλάση διακρίνεται από το κεφαλαίο αρχικό της γράμμα Εξαίρεση είναι οι τύποι char και int στους οποίους αντιστοιχούν οι Character και Integer Οι κλάσεις συσκευαστές περιέχουν στατικές μεθόδους για την «μετάφραση» συμβολοσειρών Integer.parseInt(inputString) 20
Παράδειγμα Java public class SimpleExample { public static void main(string s[]) { String mystringa = "123"; String mystringb = "456"; int myint = Integer.parseInt(myStringA) + Integer.parseInt(myStringB); System.out.println("Addition 1 " + mystringa + mystringb); System.out.println("Addition 2 " + myint); D:\>java SimpleExample Addition 1 123456 Addition 2 579 21
Η κλάση System Χρησιμοποιείται για προσπέλαση ιδιοτήτων του συστήματος, του συλλέκτη σκουπιδιών, της τρέχουσας ώρας, και επιτρέπει την αλλαγή της κύριας εισόδου, εξόδου και εξόδου λαθών. Όπως συμβαίνει και με την κλάση Math, όλες οι μέθοδοι και μεταβλητές της κλάσης System είναι μέθοδοι και μεταβλητές κλάσης (στατικές) Περιέχει τη μέθοδο exit() η οποία τερματίζει την εκτέλεση της εικονικής μηχανής Java (JVM) 22
Η κλάση System Η στατική μέθοδος System.currentTimeMilliseconds() επιστρέφει την τρέχουσα ώρα Στην Java η ώρα είναι ένας αριθμός τύπου long που αναπαριστά χιλιοστά του δευτερολέπτου (milliseconds) Αρχή μέτρησης χρόνου: GMT 1 η Ιανουαρίου 1970 Πεδίο 64 bits: έως 292,280,995 μ.χ. Οι αριθμοί τύπου long στην Java έχουν πρόσημο. Αρνητικές τιμές ερμηνεύονται ως χρονικές στιγμές πριν την αρχή της «νέας χρονικής περιόδου» 23
Αποδοκιμασία/απαξίωση (Deprecation) Οι επίσημες βιβλιοθήκες της Java (API) αλλάζουν μεταξύ διαδοχικών εκδόσεων Ορισμένοι τρόποι επίλυσης προγραμματιστικών προβλημάτων παύουν να ενδείκνυνται και η χρήση τους ίσως παύσει να υποστηρίζεται σε μελλοντικές εκδόσεις της βιβλιοθήκης Για να διευκολύνει την έγκαιρη μετατροπή των προγραμμάτων, ο μεταφραστής της Java προειδοποιεί όποτε επιχειρούμε να μεταφράσουμε ένα πρόγραμμα που χρησιμοποιεί μια αποδοκιμασμένη κλάση ή μέθοδο 24
Τυχαίοι Αριθμοί Η παραγωγή τυχαίων αριθμών είναι πολύ σημαντικό να αφεθεί στην τύχη. Όποιος εξετάζει αριθμητικές μεθόδους παραγωγής τυχαίων ψηφίων είναι σε μια κατάσταση αμαρτίας. Jon von Neumann (αριστερά), ENIAC (δεξιά)
Standard Random Standard random. Η βιβλιοθήκη μας η οποία παράγει ψευδο-τυxαίους αριθμούς. 26
public class StdRandom { Standard Random // between a and b public static double uniform(double a, double b) { return a + Math.random() * (b-a); // between 0 and N-1 public static int uniform(int N) { return (int) (Math.random() * N); // true with probability p public static boolean bernoulli(double p) { return Math.random() < p; // gaussian with mean = 0, stddev = 1 public static double gaussian() // recall Assignment 0 // gaussian with given mean and stddev public static double gaussian(double mean, double stddev) { return mean + (stddev * gaussian());... 27
Έλεγχος Μονάδας Έλεγχος Μονάδας (Unit Test). Περιλαμβάνει τη main() για να ελέγξει κάθε βιβλιοθήκη. public class StdRandom {... public static void main(string[] args) { int N = Integer.parseInt(args[0]); double[] t = {.5,.3,.1,.1 ; for (int i = 0; i < N; i++) { StdOut.printf(" %2d ", uniform(100)); StdOut.printf("%8.5f ", uniform(10.0, 99.0)); StdOut.printf("%5b ", bernoulli(.5)); StdOut.printf("%7.5f ", gaussian(9.0,.2)); StdOut.printf("%2d ", discrete(t)); StdOut.println(); % java StdRandom 5 61 21.76541 true 9.30910 0 57 43.64327 false 9.42369 3 31 30.86201 true 9.06366 0 92 39.59314 true 9.00896 0 36 28.27256 false 8.66800 1 28
Χρησιμοποιώντας μία βιβλιοθήκη public class RandomPoints { public static void main(string args[]) { int N = Integer.parseInt(args[0]); for (int i = 0; i < N; i++) { double x = StdRandom.gaussian(0.5, 0.2); double y = StdRandom.gaussian(0.5, 0.2); StdDraw.point(x, y); % javac RandomPoints.java % java RandomPoints 10000 Χρησιμοποιεί το όνομα της βιβλιοθήκης για να προκαλέσει τη μέθοδο 29
Βασικά Στατιστικά Π.χ. Βιβλιοθήκη όπου υπολογίζει τα στατιστικά σε μία συστοιχία πραγματικών αριθμών. mean sample variance 30
Βασικά Στατιστικά Π.χ. Βιβλιοθήκη όπου υπολογίζει τα στατιστικά σε μία συστοιχία πραγματικών αριθμών. public class StdStats { public static double max(double[] a) { double max = Double.NEGATIVE_INFINITY; for (int i = 0; i < a.length; i++) if (a[i] > max) max = a[i]; return max; public static double mean(double[] a) { double sum = 0.0; for (int i = 0; i < a.length; i++) sum = sum + a[i]; return sum / a.length; public static double stddev(double[] a) // see text 31
Βιβλιοθήκες Γιατί να χρησιμοποιήσουμε βιλβιοθήκες? Κάνει τον κώδικα ευκολότερο για να τον κατανοήσουμε. Κάνει τον κώδικα ευκολότερο ώστε να εντοπίζουμε τα σφάλματα που υπάρχουν (debugging). Κάνει τον κώδικα ευκολότερο για να συντηρηθεί και να βελτιωθεί. Κάνει τον κώδικα ευκολότερο για να επαναχρησιμοποιηθεί. 32
Συνήθη σφάλματα Οι βασικοί τύποι και τα αντικείμενα είναι πολύ διαφορετικές οντότητες Μέθοδοι δεν μπορούν να κληθούν για βασικούς τύπους Τελεστές όπως οι +, -, * και / δεν μπορεί να εφαρμοστούν στα περισσότερα αντικείμενα Σημείωση: Η χρήση του τελεστή + με αντικείμενα τύπου String είναι η μόνη εξαίρεση Υπάρχουν και άλλες διάφορες που δεν έχουν αναφερθεί 33
Συνήθη σφάλματα public class SimpleExample { public static void main(string s[]) { int myinta = 56; Integer myintb = new Integer(56); int valuea = myintb + myinta; int valueb = myinta.intvalue() + myintb.intvalue(); int valuec = myinta + myintb.intvalue(); 34
Συνήθη σφάλματα D:\t>javac SimpleExample.java SimpleExample.java:8: Incompatible type for +. Can't convert java.lang.integer to int. int valuea = myintb + myinta; ^ SimpleExample.java:9: Can't invoke a method on a int. int valueb = myinta.intvalue() + myintb.intvalue(); ^ 2 errors 35
Δημιουργώντας τις Δικές μας Βιβλιοθήκες 36
public class CardLib boolean SingleDigit (long x) είναι ο x μονοψήφιος; long LastDigit (long n) τελευταίο ψηφίο του n long RestDigits (long n) υπόλοιπα ψηφία του n long AddDigit (long x, long d) πρόσθεση ψηφίου στο τέλος long Join (long x, long y) ένωση των δύο αριθμών int Length (long x) αριθμός ψηφίων long Digit (long n, int i) i-οστό ψηφίο int Occur (long n, int d) αριθμός εμφανίσεων του d long Delete (long n, int d) διαγραφή ψηφίου d long DeleteNth (long n, int i) διαγραφή ψηφίου d long Reverse (long n) αντιστροφή ψηφίων boolean Palindrome (long n) είναι palindrome; boolean Sorted (long n) είναι τα ψηφία ταξινομημένα σε αύξουσα σειρά από τα αριστερά; API για τη βιβλιοθήκη μας CardLib, η οποία ορίζει συναρτήσεις για την επεξεργασία φυσικών αριθμών. Όλες οι συναρτήσεις θεωρούν ότι λαμβάνουν φυσικούς αριθμούς.
Παρατηρήσεις Μπορούν να προστεθούν και άλλες συναρτήσεις Συνήθως κρατούμε τον αριθμό των συναρτήσεων σε μια βιβλιοθήκη σχετικά μικρό Η προσθήκη νέων συναρτήσεων ή αλλαγές στην υλοποίηση υφιστάμενων συναρτήσεων μιας βιβλιοθήκης, υπό την προϋπόθεση ότι οι διεπαφές τους (signatures) παραμένουν σταθερές, δεν συνεπάγονται αλλαγές σε υφιστάμενους clients Η συνάρτηση main είναι για τη δοκιμή της βιβλιοθήκης (test harness)
// Implementing CardLib public static boolean SingleDigit (long x){ return x < 10 && x >= 0; public static long LastDigit (long n) { return n%10; public static long RestDigits (long n){ return n/10; public static long AddDigit (long x, long d){ if (SingleDigit(d)) return x*10+d; else return 0; // recursive definition for Join public static long Join (long x, long y){ if (SingleDigit(y)) return AddDigit(x,y); else return AddDigit(Join(x, RestDigits(y)), LastDigit(y));
// Implementing CardLib // recursive definition for Length public static int Length (long x){ if (SingleDigit(x)) return 1; else return 1 + Length(RestDigits(x)); // recursive definition for Digit public static long Digit (long n, int i){ if (i > Length(n)) return 0; else if (i == 1) return LastDigit(n); else return Digit(RestDigits(n), i - 1); // recursive definition for Occur public static int Occur (long n, int d){ if (n == 0) return 0; else if (d == LastDigit(n)) return 1 + Occur(RestDigits(n), d); else return Occur(RestDigits(n), d); // recursive definition for Delete public static long Delete (long n, int d){ if (SingleDigit(n)) {if (n == d) return 0; else return n; else if (d == LastDigit(n)) return Delete (RestDigits(n), d); else return AddDigit(Delete(RestDigits(n), d), LastDigit(n)); ΙVX-40
// Implementing CardLib // recursive definition for DeleteNth public static long DeleteNth (long n, int i){ if (i > Length(n)) return n; else if (i == 1) return RestDigits(n); else return AddDigit(DeleteNth(RestDigits(n), i - 1), LastDigit(n)); // recursive definition for Reverse public static long Reverse (long n){ if (SingleDigit(n)) return n; else return Join(LastDigit(n), Reverse(RestDigits(n))); // declarative definition for Palindrome public static boolean Palindrome (long n){ return n == Reverse(n); πιο αποδοτική αυτή η σειρά συνθηκών στον τελεστή && // recursive definition for Sorted public static boolean Sorted (long n){ if (SingleDigit(n)) return true; else return LastDigit(RestDigits(n)) <= LastDigit(n)&& Sorted(RestDigits(n));
Άσκηση Για τις συναρτήσεις που ορίζονται με αναδρομή, δώστε νέους ορισμούς που να χρησιμοποιούν επανάληψη
Εναλλακτικός ορισμός της Palindrome, ο οποίος χρησιμοποιεί επανάληψη Ανάλυση Περιπτώσεων 1. Φυσικοί αριθμοί με μονό αριθμό ψηφίων: Περιπτώσεις που είναι palindrome: 5 Όλοι οι μονοψήφιοι αριθμοί είναι 444 1238321 Περιπτώσεις που δεν είναι: 123 3456345 2. Φυσικοί αριθμοί με ζυγό αριθμό ψηφίων: Περιπτώσεις που είναι palindrome: 22 6776 Περιπτώσεις που δεν είναι: 195195
Είσοδος: Φυσικός αριθμός Ν Αλγόριθμος Έξοδος: Κατά πόσον ο Ν είναι ή δεν είναι Palindrome Αρχίζοντας από το αριστερότερο και το δεξιότερο ψηφίο του Ν, ενόσω υπάρχουν αντίστοιχα ψηφία και τα τρέχοντα αντίστοιχα ψηφία είναι όμοια, προχωρούμε προς τα αμέσως επόμενα ψηφία και στις δύο κατευθύνσεις Εάν έχουν εξαντληθεί τα ψηφία, τότε ο Ν είναι Palindrome, διαφορετικά δεν είναι Αλγοριθμική δομή της επανάληψης Η λογική έκφραση που διέπει την επανάληψη είναι σύζευξη
Είσοδος: Φυσικός αριθμός Ν Εκλεπτυσμένος Αλγόριθμος Έξοδος: Κατά πόσον ο Ν είναι ή δεν είναι palindrome left η θέση του αριστερότερου ψηφίου του Ν right η θέση του δεξιότερου ψηφίου του Ν Ενόσω (η θέση left δεν έχει διαπεράσει τη θέση right και το ψηφίο στη θέση left ισούται με το ψηφίο στη θέση right) τότε η θέση left μετακινείται μία θέση στα δεξιά η θέση right μετακινείται μία θέση στα αριστερά Εάν η θέση left έχει διαπεράσει τη θέση right, τότε ο Ν είναι palindrome, διαφορετικά δεν είναι
Ομοιόμορφη αντιμετώπιση όλων των περιπτώσεων Μονός αριθμός ψηφίων left right left right 1 1 Είναι left right 3 1 1 Δεν είναι left right left right left right 6 9 6 6 9 6 6 9 6 Είναι
Ομοιόμορφη αντιμετώπιση όλων των περιπτώσεων Ζυγός Αριθμός Ψηφίων left right left right 8 8 8 8 Είναι left right left right 3 1 6 3 3 1 6 3 Δεν είναι
Σύζευξη που διέπει την επανάληψη 1. Τα αντίστοιχα ψηφία είναι όμοια 2. Δεν έχουν διασταυρωθεί οι δείκτες Είναι η πιο πάνω σειρά των δύο συνθηκών ορθή; Καλύπτει και τις περιπτώσεις μονοψήφιων αριθμών; Ορθή σειρά συνθηκών της σύζευξης 1. Δεν έχουν διασταυρωθεί οι δείκτες, δηλαδή υπάρχει επιπλέον αντιστοιχία ψηφίων για σύγκριση 2. Τα εν λόγω ψηφία είναι όμοια Ακολουθιακή ερμηνεία των συνθηκών της λογικής έκφρασης Η άρνηση της πρώτης συνθήκης (δηλαδή οι δείκτες έχουν διασταυρωθεί) υποδηλώνει ότι ο Ν είναι Palindrome, ενώ η άρνηση της δεύτερης συνθήκης (δηλαδή τα εν λόγω αντίστοιχα στοιχεία δεν είναι τα ίδια) υποδηλώνει ότι ο Ν δεν είναι Palindrome
Ξετύλιγμα Επανάληψης σε Ακολουθία (αναθέσεων) Palindrome(696) (3 1) and (6 = 6) (2 2) and (9 = 9) (1 3) false true true left 3; right 1 left 2; right 2 left 1; right 3 return(left < right) true Palindrome(3163) (4 1) and (3 = 3) (3 2) and (1 = 6) true false left 4; right 1 left 3; right 2 return(left < right) false
// iterative definition of Palindrome public static boolen Palindrome (long N){ int left = Length(N), right = 1; while (left >= right && Digit(N,left) == Digit(N,right)){ left = left 1; right = right + 1; return left < right;
υπερφόρτωση public class BaseLib long convert (long n, int b) ο δεκαδικός n σε βάση b long convert (long n, int from, int to) ο n από βάση from σε βάση to ο δεκαδικός n σε δυαδική βάση ο δεκδικός n σε οκταδική βάση long binary (long n) long octal (long n) long ToDecimal (int b, long n) ο n από βάση b σε δεκαδική βάση boolean valid_num (int b,long n) είναι ο n έγκυρος στη βάση b; API για τη βιβλιοθήκη μας BaseLib, η οποία ορίζει συναρτήσεις για τη μετατροπή φυσικών αριθμών σε άλλες βάσεις από το 2 μέχρι το 9
public class BaseLib { // Implementing BaseLib // recursive definition for convert public static long convert (long n, int b){ if (n < b) return n; else return CardLib.AddDigit(convert(n/b, b), n%b); public static long convert (long n, int from, int to){ if (from == to) return n; else if (from == 10) return convert(n, to); else if (to == 10) return ToDecimal(from, n); else return convert(todecimal(from, n), to); public static long binary (long n){return convert(n, 2); public static long octal (long n) {return convert(n,8); public static long ToDecimal (int b, long n){ long i = 1, res = 0; while (n > 0){ res = res + i * CardLib.LastDigit(n); i = i * b; n = CardLib.RestDigits(n); ; return res; ΙVX-52 Η BaseLib είναι client της CardLib (βρίσκονται στον ίδιο φάκελος εργασίας)
// Implementing BaseLib public static boolean valid_num(int base, long num){ if (num < 0) return false; else {while (num > 0) if (CardLib.LastDigit(num) >= base) return false; else num = CardLib.RestDigits(num); return true; public static void main(string[] args){ // code for testing BaseLib