Είσοδος και Έξοδος (Input and Output)
Είσοδος και Έξοδος Μονάδες Εισόδου Πληκτρολόγιο Ποντίκι Σκληρός Διαδίκτυο Ψηφιακή κάμερα Μικρόφωνο δίσκος Μονάδες Εξόδου Οθόνη Ηχεία Σκληρός δίσκος Διαδίκτυο Εκτυπωτής MP3 Player Στόχος: Τα προγράμματα μας σε Java να επικοινωνούν με τον έξω κόσμο
Input and Output Μονάδες Εισόδου Πληκτρολόγιο Ποντίκι Σκληρός Διαδίκτυο Ψηφιακή κάμερα Μικρόφωνο Δίσκος Μονάδες Εξόδου Οθόνη Ηχεία Σκληρός Διαδίκτυο Εκτυπωτής MP3 Player δίσκος Η προσέγγισή μας Ορίζουμε στη Java βιβλιοθήκες με συναρτήσεις εισόδου και εξόδου Χρησιμοποιούμε το λειτουργικό σύστημα για να συνδέσουμε τα προγράμματά μας με αρχεία, το ένα με το άλλο, το πληκτρολόγιο, το ποντίκι, την οθόνη, και τα ηχεία.
Το Πρόγραμμα «Digital Michelangelo» Στόχος: Η ακριβής τρισδιάστατη περιγραφή του αγάλματος Laser rangefinder. 5,000 ώρες σάρωσης, 32 Gigabytes!
Τερματικό Τερματικό: Εφαρμογή όπου μπορεί να πληκτρολογείς εντολές προς το λειτουργικό σύστημα Mac OS X Microsoft Windows
Είσοδος από τη Γραμμή-Εντολής και Standard Έξοδος Είσοδος από τη γραμμή-εντολής (command-line input): Διαβάζουμε ένα ακέραιο N ως όρισμα της γραμμής-εντολής Standard έξοδος Ευέλικτη διασύνδεση με το λειτουργικό σύστημα για έξοδο Στην Java, έξοδος από την System.out.println() διοχετεύεται στο stdout. Ως προεπιλογή, το stdout διοχετεύεται στο Τερματικό public class RandomSeq { public static void main(string[] args) { int N = Integer.parseInt(args[0]); for (int i = 0; i < N; i++) { System.out.println(Math.random()); % java RandomSeq 4 0.9320744627218469 0.4279508713950715 0.08994615071160994 0.6579792663546435
Η Παλαιότερη Αντίληψη
Η Σύγχρονη Αντίληψη
Standard Είσοδος και Έξοδος
Είσοδος από Γραμμή-Εντολής vs. Standard Είσοδος Είσοδοι από γραμμή-εντολής Χρησιμοποιούμε εισόδους από τη γραμμή εντολής για την εισδοχή μικρού αριθμού τιμών από το χρήστη Δεν αποτελεί πρακτικό μέσο εισδοχής για μεγάλο αριθμό τιμών Οι τιμές εισάγονται πριν να αρχίσει η εκτέλεση του προγράμματος Standard είσοδος Ευέλικτη διασύνδεση με το λειτουργικό σύστημα για είσοδο Ως προεπιλογή, το stdin παραλαμβάνεται από Τερματικό παράθυρο Τιμές μπορούν να εισαχθούν κατά την εκτέλεση του προγράμματος, παρέχοντας έτσι στο πρόγραμμα τη δυνατότητα του διαλογικού στοιχείου
Standard Είσοδος και Έξοδος Standard είσοδος: Παρέχεται η βιβλιοθήκη StdIn για την εισαγωγή κειμένου Standard έξοδος: Παρέχεται η βιβλιοθήκη StdOut για την εξαγωγή κειμένου
Standard Εισοδος και Έξοδος Για χρήση: Κατεβάζουμε τις βιβλιοθήκες StdIn.java και StdOut.java από την ιστοσελίδα του βιβλίου και τις αποθηκεύουμε στο φάκελο εργασίας (working directory) (ή χρησιμοποιούμε classpath). see booksite public class Add { public static void main(string[] args) { StdOut.print("Type the first integer: "); int x = StdIn.readInt(); StdOut.print("Type the second integer: "); int y = StdIn.readInt(); int sum = x + y; StdOut.println("Their sum is " + sum); % java Add Type the first integer: 1 Type the second integer: 2 Their sum is 3
Υπολογισμός Μέσου Όρου μιας Ακολουθίας Αριθμών Κλάση Average: Διαβάζονται οι αριθμοί ένας προς ένας, και εκτυπώνεται ο μέσος όρος τους public class Average { public static void main(string[] args) { double sum = 0.0; // cumulative total int n = 0; // number of values while (!StdIn.isEmpty()) { double x = StdIn.readDouble(); sum = sum + x; n++; StdOut.println(sum / n); % java Average 10.0 5.0 6.0 3.0 7.0 32.0 <Ctrl-d> 10.5 <Ctrl-d> is OS X/Linux/Unix EOF <Ctrl-z> is Windows analog currently no DrJava analog
Επανα-κατεύθυνση και Σωλήνωση (Redirection and Piping)
Επανα-κατευθύνοντας την Standard Έξοδο Επανα-κατευθύνοντας την standard έξοδο: Χρησιμοποιούμε το directive του λειτουργικού συστήματος (>) για να επανα-κατευθύνουμε την standard έξοδο σε κάποιο αρχείο για μόνιμη αποθήκευση (αντί για το τερματικό παράθυρο) % java RandomSeq 1000 > data.txt redirect stdout
Επανα-κατευθύνοντας την Standard Είσοδο Επανα-κατευθύνοντας την standard είσοδο: Χρησιμοποιούμε το directive του λειτουργικού συστήματος (<) για να επανα-κατευθύνουμε την standard είσοδο σε κάποιο αρχείο, δηλαδή να διαβάζουμε στοιχεία από το αρχείο (αντί από το τερματικό παράθυρο) % more < data.txt 0.5475375782884312 0.4971087292684019 0.23123808041753813 redirect stdin % java Average < data.txt 0.4947655567740991
Σωλήνωση Προγραμμάτων Σωλήνωση (piping): Χρησιμοποιούμε το directive του λειτουργικού συστήματος ( ), έτσι ώστε η standard έξοδος ενός προγράμματος να γίνει η standard είσοδος κάποιου άλλου. % java RandomSeq 1000000 java Average 0.4997970473016028
Standard Drawing
StdDraw: Βιβλιοθήκη για την παρουσίαση αποτελεσμάτων με γραφικό τρόπο public class StdDraw void line (double x0, double y0, double x1, double y1) void point (double x, double y) void text (double x, double y, String s) void circle (double x, double x, double r) void filledcircle (double x, double x, double r) void square (double x, double y, double r) void filledsquare (double x, double y, double r) void polygon (double[] x, double[] y) void filledpolygon (double[] x, double[] y) void setxscale (double x0, double x1) reset x range to (x 0, x 1 ) void setyscale (double y0, double y1) reset y range to (y 0, y 1 ) void setpenradius (double r) void setpencolor (Color c) void setfont (Font f) void setcanvassize (int w, int h) set pen radius to r set pen color to c set text font to f set canvas to w-by-h window
Συνέχεια Βιβλιοθήκης StdDraw public class StdDraw void clear (Color c) void show (int dt) void save (String filename) clear the canvas; color it c show all; pause dt milliseconds save to a.jpg or w.png file
Standard Draw Standard drawing. Υπάρχει η βιβλιοθήκη StdDraw για γραφικά, η οποία μπορεί να χρησιμοποιηθεί κατεβάζοντας το αρχείο StdDraw.java και αποθηκεύοντας το στο φάκελο εργασίας (working directory) 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); (½, ½ 3) % java Triangle (0, 0) (1, 0)
Οπτική Παρουσίαση Δεδομένων (Data Visualization) Φίλτρο σχεδιασμού (Plot filter): Διαβάζουμε μια ακολουθία συντεταγμένων (x, y) από τη standard είσοδο, και σχεδιάζουμε τα σημεία χρησιμοποιώντας standard drawing. public class PlotFilter { public static void main(string[] args) { double xmin = StdIn.readDouble(); double ymin = StdIn.readDouble(); double xmax = StdIn.readDouble(); double ymax = StdIn.readDouble(); StdDraw.setXscale(xmin, xmax); StdDraw.setYscale(ymin, ymax); rescale coordinate system while (!StdIn.isEmpty()) { double x = StdIn.readDouble(); double y = StdIn.readDouble(); StdDraw.point(x, y); read in points, and plot them
Οπτική Παρουσίαση Δεδομένων % more < USA.txt 669905.0 247205.0 1244962.0 490000.0 1097038.8890 245552.7780 1103961.1110 247133.3330 1104677.7780 247205.5560... bounding box coordinates of 13,509 US cities % java PlotFilter < USA.txt
Σχεδιάζοντας Μαθηματικές Συναρτήσεις 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); StdDraw.setXscale(0, N); StdDraw.setYscale(-2.0, +2.0); for (int i = 0; i < N; i++) StdDraw.line(i, a[i], i+1, a[i+1]); y sin 4x sin 20x
Το Παιγνίδι του Χάους Το Παιγνίδι του Χάους (Chaos Game): Παίζεται σε ένα ισόπλευρο τρίγωνο με κορυφές R, G, B. Αρχίζουμε από την κορυφή R Επαναλαμβάνουμε τα ακόλουθα N φορές: Επιλέγουμε τυχαία μια κορυφή Μετακινούμαστε στο μέσο της απόστασης ανάμεσα στο τρέχον σημείο και την κορυφή που επιλέξαμε Ζωγραφίζουμε ένα σημείο στο χρώμα της κορυφής B: (½, ½ 3) Ε. Τι εικόνα δημιουργείται; B B G R B G 1 2 5 3 6 4 0 R: (0, 0) G: (1, 0)
Το Παιγνίδι του Χάους public class Chaos { public static void main(string[] args) { int T = Integer.parseInt(args[0]); double[] cx = { 0.000, 1.000, 0.500 ; double[] cy = { 0.000, 0.000, 0.866 ; ½ 3 (avoid hardwired constants like this) double x = 0.0, y = 0.0; for (int t = 0; t < T; t++) { int r = (int) (Math.random() * 3); x = (x + cx[r]) / 2.0; y = (y + cy[r]) / 2.0; StdDraw.point(x, y); between 0 and 2
Το Παιγνίδι του Χάους Απλή τροποποίηση: Χρωματίζουμε το σημείο στο χρώμα της κορυφής που επιλέξαμε τυχαία StdDraw.setPenColor(StdDraw.RED) για να αλλάξουμε το χρώμα της πένας B % java Chaos 10000 R Sierpinski triangle G
// the modification for using the vertex colors for the points public class Chaos { public static void main(string[] args) { int T = Integer.parseInt(args[0]); double[] cx = { 0.000, 1.000, 0.500 ; double[] cy = { 0.000, 0.000, 0.866 ; double x = 0.0, y = 0.0; for (int t = 0; t < T; t++) { int r = (int) (Math.random() * 3); x = (x + cx[r]) / 2.0; y = (y + cy[r]) / 2.0; if (r == 0) StdDraw.setPenColor(StdDraw.RED); else if (r == 1) StdDraw.setPenColor(StdDraw.GREEN); else if (r == 2) StdDraw.setPenColor(StdDraw.BLUE); StdDraw.point(x, y);
Η Φτέρη του Barnsley (Barnsley Fern) Η φτέρη του Barnsley: Παίζουμε το παιγνίδι του χάους με διαφορετικούς κανόνες probability new x new y 2%.50.27y 15% -.14x +.26y +.57.25x +.22y -.04 13%.17x -.21y +.41.22x +.18y +.09 70%.78x +.03y +.11 -.03x +.74y +.27 E. Τι μας λέει η υπολογιστική για τη φύση; E. Τι μας λέει η φύση για την υπολογιστική; Επιστήμες του 20 ου αιώνα: Φόρμουλες Επιστήμες του 21 ου αιώνα: Αλγόριθμοι;
// modifying the rules for Barnsley Fern public class Chaos { public static void main(string[] args) { int T = Integer.parseInt(args[0]); double x = 0.0, y = 0.0; StdDraw.setPenColor(StdDraw.GREEN); for (int t = 0; t < T; t++) { double r = Math.random(); if (r < 0.02){x =.5; y =.27*y; else if (r < 0.17){x = -.14*x +.26*y +.57; y =.25*x +.22*y -.04; else if (r < 0.3) {x =.17*x -.21*y +.41; y =.22*x +.18*y +.09; else if (r < 1.0) {x =.78*x +.03*y +.11; y = -.03*x +.74*y +.27; StdDraw.point(x, y);
Εμψύχωση (Animation) Animation loop. Επανέλαβε τα ακόλουθα: Καθάρισε την οθόνη Μετακίνησε το αντικείμενο Σχεδίασε το αντικείμενο Παρουσίασε και περίμενε για ένα μικρό χρονικό διάστημα Παράδειγμα. Η μετακινούμενη μπάλα Η μπάλα έχει θέση (rx, ry) και σταθερή ταχύτητα (vx, vy). Εντοπίζουμε σύγκρουση με τοίχο και αντιστρέφουμε την ταχύτητα (vx, vy) (+1, +1) (rx, ry) (-1, -1)
Η Μετακινούμενη Μπάλα public class BouncingBall { public static void main(string[] args) { double rx =.480, ry =.860; double vx =.015, vy =.023; double radius =.05; StdDraw.setXscale(-1.0, +1.0); StdDraw.setYscale(-1.0, +1.0); position constant velocity radius rescale coordinates while(true) { if (Math.abs(rx + vx) > 1.0) vx = -vx; if (Math.abs(ry + vy) > 1.0) vy = -vy; bounce rx = rx + vx; ry = ry + vy; update position StdDraw.clear(StdDraw.GRAY); StdDraw.setPenColor(StdDraw.BLACK); StdDraw.filledCircle(rx, ry, radius); StdDraw.show(50); turn on animation mode: display and pause for 50ms clear background draw the ball
Ειδικά Εφέ Εικόνες: Αποθηκεύουμε ένα αρχείο.gif,.png, ή.jpg στο φάκελο εργασίας και χρησιμοποιούμε StdDraw.picture()για να το ζωγραφίσουμε Ηχητικά εφέ: Αποθηκεύουμε ένα αρχείο.wav,.mid, ή.au στο φάκελο εργασίας και χρησιμοποιούμε StdAudio.play()για να το παίξουμε Άσκηση: Τροποποιείστε την κλάση BouncingBall για να απεικονίζει εικόνα και να παίζει ήχο σε κάθε σύγκρουση Να γίνει αντικατάσταση της StdDraw.filledCircle() με: StdDraw.picture(rx, ry, "earth.gif"); Να προστεθεί η ακόλουθη εντολή όταν γίνεται σύγκρουση με τον τοίχο: StdAudio.play("boing.wav");
Επιπρόσθετο Υλικό
Διεπαφές Χρήστη (User Interfaces) Διεπαφή γραμμής εντολής: Ο χρήστης πληκτρολογεί εντολές στο τερματικό Εύκολα προσαρμόσιμο Επεκτείνεται σε σύνθετες ακολουθίες εντολών Δείξε και κάνε κλικ: Ο χρήστης ενεργοποιεί εφαρμογές μέσω γραφικών επιλογών (by clicking) File Open HelloWorld.java Περιορίζεται σε προ-αποφασισμένες επιλογές του μενού (menu options)
Swing Graphical User Interface "Swing" is Java's GUI. Buttons. Menus. Scrollbars. Toolbars. File choosers. import javax.swing.*; import java.awt.*; import java.awt.event.*; public class GUI implements ActionListener { private int clicks = 0; private JFrame frame = new JFrame(); private JLabel label = new JLabel("Number of clicks: 0 "); public GUI() { JButton button = new JButton("Click Me"); button.addactionlistener(this); JPanel panel = new JPanel(); panel.setborder(borderfactory.createemptyborder(30, 30, 10, 30)); panel.setlayout(new GridLayout(0, 1)); panel.add(button); panel.add(label); frame.add(panel, BorderLayout.CENTER); frame.setdefaultcloseoperation(jframe.exit_on_close); frame.settitle("gui"); frame.pack(); frame.show(); public void actionperformed(actionevent e) { clicks++; label.settext("number of clicks: " + clicks); ; public static void main(string[] args) { GUI gui = new GUI(); Ignore details. a sample Swing application
Computer Animation Computer animation: Παρουσιάζεται μια ακολουθία στενά σχετιζόμενων εικόνων σε ταχεία διαδοχή δίνοντας έτσι τη ψευδαίσθηση της κίνησης 1 2 10 11 Frame rate: Χρησιμοποιούνται 15-70 εικόνες το δευτερόλεπτο για να ξεγελάσουν" το ανθρώπινο μάτι και εγκέφαλο στο να βλέπουν ομαλή κίνηση Παρ. 1: Κινούμενα σχέδια Παρ. 2: Java mascot Duke cart-wheeling. 3 4 5 6 12 13 14 15 7 16 8 17 9 http://java.sun.com/docs/books/tutorial
Java Implementation public class Duke { public static void main(string[] args) { int images = 17; int WIDTH = 130, HEIGHT = 80; StdDraw.setCanvasSize(WIDTH, HEIGHT); for (int t = 0; true; t++) { int i = 1 + (t % images); String file = "T" + i + ".gif"; StdDraw.picture(0.5, 0.5, file); StdDraw.show(100); T1.gif - T17.gif
Συγκεκριμένα Στοιχεία Λειτουργικών Συστημάτων Common OS abstractions. Operation Windows XP OS X Unix Cycle through recent command Up, down arrows Up, down arrows Up, down arrows File name completion Tab Tab Tab End of file Ctrl-z <Enter>Ctrl-d Ctrl-d Newline character \r\n \n or \r \n Scroll through text, one screenful at a time more more less more less List files in current directory dir ls ls Redirection, pipes <, >, <, >, <, >, File system C:\introcs\Hi.java /u/introcs/hi.java /u/introcs/hi.java Unix means Unix variants (Linux, Solaris, Aix) Most Windows XP commands also supported in other version of Windows.
Είκοσι Ερωτήσεις Είκοσι Ερωτήσεις: Ο χρήστης σκέφτεται ένα ακέραιο αριθμό από το 1 μέχρι το 1 εκατομμύριο. Ο υπολογιστής προσπαθεί να τον μαντέψει. public class TwentyQuestions { public static void main(string[] args) { int lo = 1, hi = 1000000; while (lo < hi) { int mid = (lo + hi) / 2; StdOut.println("Is your number <= " + mid + "?"); boolean response = StdIn.readBoolean(); if (response) hi = mid; else lo = mid + 1; StdOut.println("Your number is " + lo); Δυαδική αναζήτηση: Κάθε ερώτηση αφαιρεί τις μισές από τις πιθανές εναπομείναντες τιμές Συνέπεια: Ο υπολογιστής πάντοτε έχει επιτυχία μετά από 20 ερωτήσεις invariant: user's number always between lo and hi 2 20 1 million