ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07 Αριθμητική στο δυαδικό σύστημα (γενικά) Συμπληρωματικά για δυαδικό σύστημα Η πρόσθεση στηρίζεται στους κανόνες: 0 + 0 = 0, 0 + 1 = 1, 1 + 0 = 1, και 1 + 1 = 10 π.χ., 01101 1010 + 10111 + 1100 ------- ------ 100100 10110 Ο πολλαπλασιασμός γίνεται όπως και στο δεκαδικό σύστημα: 1001 x 1010 ------ 0000 1001 0000 + 1001 --------- 1011010 Υπολογιστική αναπαράσταση ακεραίων α) Προσημασμένο μέγεθος - Τα υπόλοιπα m-1 bits για το μέγεθος του αριθμού (απόλυτη τιμή) Για m=8 (όλα τα υπόλοιπα περί υπολογιστικής αναπαράστασης, υποθέτουν ότι χρησιμοποιούμε 8 bits, δηλ. m = 8): π,χ., 00101010 2 = 42 10, 10101010 2 = -42 10 Δύο μηδενικά: 00000000 και 10000000 β) Συμπλήρωμα ως προς ένα (one s complement) - Ο αντίθετος: αντικατάσταση των 0 με 1 και των 1 με 0 (bit swapping) π,χ., 00101010 2 = 42 10, 11010101 2 = -42 10 Δύο μηδενικά: 00000000 και 11111111 1
γ) Συμπλήρωμα ως προς δύο (two s complement) - Ο αντίθετος: όπως στο one s complement (bit swapping) + 1 (τυχόν κρατούμενο στο αριστερό bit αγνοείται) π,χ., 00101010 2 = 42 10, 11010110 2 (*) = -42 10 (*) 11010101 (bit swapping) +00000001 (μονάδα) -------------- 11010110 Ένα μηδέν: 00000000 (γιατί με bit-swapping συν 1 έχουμε πάλι 00000000) Όμως: αρνητικοί = θετικοί + 1 δ) Πλεόνασμα (excess) κατά 2 m-1 Κάθε αριθμός παριστάνεται με το άθροισμα της πραγματικής του τιμής με το 2 m-1. π.χ., για m = 8, 2 7 = 128, οι αριθμοί από -128 έως 127 απεικονίζονται στους 0 έως 255 (δηλαδή και οι αρνητικοί αριθμοί απεικονίζονται σε θετικούς). Άρα, ο 42 10 γίνεται 128 + 42 = 170 10 = 10101010 2 ενώ ο -42 10 γίνεται 128 42 = 86 10 01010110 2. Παρατηρούμε ότι στην ουσία είναι το two s complement με το πρόσημο αντεστραμμένο. Προφανώς, εάν θέλουμε να αναπαραστήσουμε αριθμούς μικρότερους του -128 και μεγαλύτερους του 127, θα πρέπει να χρησιμοποιήσουμε περισσότερα των 8 bits. Αριθμητική στους δυαδικούς με συγκεκριμένη αναπαράσταση (για m=8) Δεκαδικό one s complement two s complement 10 00001010 00001010 + -3 + 11111100 + 11111101 + 7 1 00000110 1 00000111 00000111 00000111 - Στο one s complement τυχόν κρατούμενο στο αριστερό bit προστίθεται ξανά στο αποτέλεσμα. - Στο two s complement τυχόν κρατούμενο στο αριστερό bit αγνοείται. Υπερχείλιση και υπεκχείλιση Έστω ότι ένας υπολογιστής χειρίζεται μόνο 3ψήφιους θετικούς ακέραιους. Τότε, στις ακόλουθες πράξεις έχουμε: 600 + 600 = 1200 υπερχείλιση 002 005 = -3 υπεκχείλιση 2
Μεταβλητές (variables) Χρησιμοποιούνται για την αποθήκευση (φύλαξη) δεδομένων. Το στοιχείο το οποίο περιέχει μια μεταβλητή λέγεται τιμή. Μια μεταβλητή έχει: ορατότητα (θα το δούμε αργότερα...) τύπο (type) όνομα (identifier αναγνωριστικό) τιμή (value) Η δημιουργία μιας μεταβλητής σε ένα πρόγραμμα γίνεται με τη δήλωσή της. Η σύνταξη μιας τέτοιας δήλωσης είναι: <τύπος> <όνομα> [=τιμή]; π.χ., int a = 5; double b; char answer; (προς το παρόν παραλείπουμε την ορατότητα) Τύποι (types) πρωτογενείς (primitive types) String (αλφαριθμητικά) κλάσεις σύνθετη δομή σχεδιασμένη απ τον προγραμματιστή Βασικοί κανόνες σύνταξης o Δεσμευμένες λέξεις (reserved): class, public, private, int, double, char, κτλ. o Αναγνωριστικά (identifiers): ονόματα πραγμάτων (μεταβλητών, κλάσεων, μεθόδων, κτλ.) ξεκινάνε με: γράμμα, _, # περιέχουν: γράμματα, νούμερα, _, # (όχι κενά,., *, κτλ.) μέχρι 256 χαρακτήρες (συνήθως 3-15) χωρίς κενά υπάρχει διάκριση μεταξύ κεφαλαίων και μικρών Συνήθως (κατά σύμβαση): o ονόματα κλάσεων ξεκινούν με Κεφαλαίο o υπόλοιπα ονόματα ξεκινούν με μικρό o σταθερές όλα ΚΕΦΑΛΑΙΑ o ξεχωρίζουμε λέξεις ενός ονόματος με Κεφαλαίο γράμμα και όχι με _ π.χ., numberofbaskets, mystuff, κτλ. Π.χ., my.class: λάθος (περιέχει τελεία) 7eleven: λάθος (ξεκινάει με νούμερο) public: λάθος (δεσμευμένη λέξη) Car: σωστό, αλλά δεν συνηθίζεται (μεταβλητή που ξεκινάει με Κεφαλαίο) 3
Πρωτογενείς τύποι μεταβλητών (primitive types) byte -128 ακέραιος 127 1 byte short -32768 ακέραιος 32767 2 bytes int -2 31 ακέραιος 2 31-1 (δις) 4 bytes long -2 63 ακέραιος 2 63-1 (πεντάκις) 8 bytes float δεκαδικός ακρίβεια: ±10-46 / εύρος: ±10 38 4 bytes double δεκαδικός ακρίβεια: ±10-324 / εύρος: ±10 308 8 bytes char χαρακτήρας Unicode 2 bytes boolean true ή false 1 bit π.χ. char symbol; symbol = A ; System.out.println(symbol); To σύμβολο = δεν είναι το μαθηματικό =. Λέγεται τελεστής εκχώρησης (assignment operator). Πραγματοποιεί μεταβίβαση της τιμής στα δεξιά του στη μεταβλητή στα αριστερά του. Άλλα παραδείγματα: αλλά και: int a = 18743; boolean b = true; a = a + 5; int x = 1; int y = 2; x = y; (το x γίνεται 2) Τα δύο τελευταία παραδείγματα, αν και από μαθηματικής άποψης μπορούν να θεωρηθούν λάθος, σε μια γλώσσα προγραμματισμού είναι σωστά. Στο πρώτο, απλά αλλάζει η τιμή του a και από 18743 γίνεται 18748. Στο δεύτερο, η μεταβλητή x παίρνει την τιμή της μεταβλητής y, δηλαδή γίνεται ίση με 2. Για αλφαριθμητικά (αλληλουχία χαρακτήρων): Τύπος String (είναι κλάση δεν είναι πρωτογενής τύπος μεταβλητών) (Περισσότερα σε επόμενο μάθημα). 4
Παράδειγμα εισόδου / εξόδου Το παρακάτω πρόγραμμα Java αποτελείται από μία μόνο κλάση, την κλάση εφαρμογής (περιέχει τη μέθοδο main). Δέχεται δύο ακέραιους αριθμούς από τον χρήστη, και εκτυπώνει στην οθόνη το άθροισμά τους. /* A simple java input/output example. October 25, 2007 */ import java.util.*; // βιβλιοθήκη που περιέχει την κλάση Scanner // για είσοδο δεδομένων public class Addition { public static void main(string [] args) { System.out.println( Enter two integer numbers on a line ); int n1, n2; Scanner keyboard = new Scanner(System.in); n1 = keyboard.nextint(); n2 = keyboard.nextint(); System.out.println( The sum of those two numbers is: ); System.out.println(n1+n2); } // end of method } // end of class Το κείμενο ανάμεσα στα σύμβολα /* και */ είναι σχόλιο και δεν αποτελεί μέρος του κώδικα της Java. Επίσης, το ίδιο συμβαίνει για το κείμενο που ακολουθεί το σύμβολο // σε μια γραμμή του προγράμματος (σχόλιο γραμμής). Σημείωση: Για την έξοδο στην οθόνη δεν χρειάζεται να προσθέσουμε κάποιο import στο πρόγραμμά μας. Ό,τι χρειάζεται για την έξοδο εισάγεται αυτόματα από τη Java. Αντίθετα, για την είσοδο, χρειάζεται να συμπεριλάβουμε (με το import ) τη «βιβλιοθήκη» (πακέτο) java.util στο πρόγραμμά μας. Περισσότερα για αυτή τη διαδικασία θα αναφερθούν στο μάθημα «Πληροφορική ΙΙ». Για να τρέξει το πρόγραμμά μας: i) Το σώζουμε σε αρχείο: Addition.java (όνομα αρχείου ίδιο με όνομα κλάσης) ii) Το κάνουμε compile: javac Addition.java Addition.class (byte-code) iii) Τρέχουμε το αρχείο byte-code με τον interpreter: java Addition 5