Ì ÔÓ ÓÑ ÒÛÒ Ö Å Ø ØÖÓÔ ÑôÒ Fahrenheit ÑÓ Celsius Fahrenheit Celsius c = (5/9)(f 32) public class Fahr2Cels { public static void main(string args[]) { int f = 451; // Τι συμβαίνει στους 451F? int c; c = (f - 32)*5/9; System.out.println(c); } } Θα εμφανίσει την τιμή 232 αντί της ακριβούς 232.7777...
Ì ÔÓ ÓÑ ÒÛÒ (i) ένα σύνολο τιμών και (ii) ένα σύνολο τελεστών(πράξεων). Π.χ. για ακέραια(int) δεδομένα: σύνολο τιμών κάποιο υποσύνολο του Z και οι4βασικέςπράξεις + - * /. Η Javaδιαθέτει: 8 πρωτεύοντες τύπους δεδομένων: λογικά δεδομένα: boolean(1 byte) ακέραιοι: byte, short, int, long(1,2,4,8bytes) πραγματικοί: float, double(4, 8 bytes) χαρακτήρες: char(2 bytes). έτοιμους σύνθετους τύπους(π.χ. String), και δυνατότητα δημιουργίας νέων τύπων(αντικείμενα). ½ Ò Ô Ö Ø ÓÑ ÒÛÒ Ø ÑÒ Ñ ΜΝΗΜΗ 64ΚΒ = 65535 Bytes 0 1 2 3 ΑΚΕΡΑΙΟΣ 4Β ΠΡΑΓΜΑΤΙΚΟΣ 8Β 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 10 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 2.71 65533 65534 65535 1 Byte = 8 bits 1 word = 4 bytes 1 KB = 2E+10B = 1024 Bytes 1 MB =2E+20B = 1048576 Bytes
Å Ø Ð Ø Παραμετρική διατύπωση αλγορίθμων/προγραμμάτων. Αναφορά σε τιμές που μεταβάλλονται σ ένα πρόγραμμα, ή δεν είναι γνωστές πριν την εκτέλεση(αντ. σταθερές). Εχουν 3 χαρακτηριστικά: όνομα: μονοσήμαντη αναφορά σε διαφορετικά μεγέθη τιμή: αντιστοίχιση του ονόματος σε κάποιο δεδομένο τύπος: ο τύπος δεδομένου της τιμής τους. Οι μεταβλητές είναι στην ουσία θέσεις μνήμης Οι μεταβλητές στην Java, πρέπει να δηλώνονται. Η δήλωση: δεσμεύειέναόνομακαι το συσχετίζει με κάποιο τύπο δεδομένων, π.χ. int c; È Ö Ø Ö Κάθε μεταβλητή αποθηκεύεται κάπου στη μνήμη, επομένως έχει μια διεύθυνση. Η δήλωση μεταβλητής δεσμεύει μια διεύθυνση μνήμης για την μεταβλητή. Η διεύθυνση δεν αλλάζει στη διάρκεια εκτέλεσης του προγράμματος, αλλάζει μόνο το περιεχόμενο(η τιμή της). Το ποσότητα μνήμης που απαιτείται για την αποθήκευση μιας μεταβλητής εξαρτάται από τον τύπο της. Στη Java είναι ανεξάρτητη από τον τύπο του υπολογιστή(ενώ σε κάποιες άλλες γλώσσες όχι).
ÇÒ Ñ Ø Ñ Ø Ð ØôÒ Ø Java Επιτρεπτοί είναι συνδυασμοί γραμμάτων, αριθμών και των και $. Περιορισμοί: Ο πρώτος χαρακτήρας δεν μπορεί να είναι αριθμός! Κεφαλαία μικρά Οχι δεσμευμένα ονόματα(ονόματα εντολών της Java). Παραδείγματα ΝΑΙ: f myfootballteam r2d2 mesos oros ΟΧΙ: 456 int 3po mesos-oros Ç Ø ÔÓ int Προσημασμένοι ακέραιοι, 32-bit, συμπλήρωμα-2. Τιμές από-2147483648 έως +2147483647. Παραδείγματα τιμών: 42, -13, 0, +256 Πράξεις + - * / δίνουν πάντα ακέραιο αποτέλεσμα! 5/9 είναι 0. % ακέραιο υπόλοιπο(mod) 9%4 κάνει 1. Δήλωση μεταβλητών int: int n; int fahr, cels;
Ö Ö ÙÔ ÐÓ Ô Εστω χρόνος(int totalminutes) εκφρασμένος σε λεπτά. Να εκφραστεί σε ώρες(int hours) και λεπτά(int minutes). Παράδειγμα:359λεπτάείναι5ώρεςκαι59λεπτά. Λύση στη Java: hours = totalminutes / 60; minutes = totalminutes % 60; Ç Ø ÔÓ double Αριθμοί κινητής υποδιαστολής, 64-bit, IEEE 754 Τιμές [ 1.7 10 308, +1.7 10 308 ]με14/15σημαντικάψηφία. 0.0 +0.0 Inf x<0, x >=1 x<0, x <1 4.9E 324 x>0, x <1 +4.9E 324 x>0, x >=1 +Inf 1.7E308 NaN +1.7E308 Π.χ. 2.71-3.14159 0. 1.0.12 Εκθετική μορφή πραγματικών τιμών οαριθμός a 10 β γράφεται aeβή aeβ 1.7e-308-6.023E+23 9E-2 1.e10
Ö Ó ÔÖ Ñ Ø Ó? Γιατί ints?. Γιατί να μη χρησιμοποιούμε πάντα doubles? Μερικές φορές μόνο ακέραιοι έχουν νόημα: numberofstudents = 201.2??? Ο τύπος double μπορεί να είναι ανακριβής για ints Σταμαθηματικά 3 15 (1/3) = 15 Αλλα, 3.0 * 15.0 * (1.0/3.0) μπορεί να είναι 14.99997 Τελευταίο και λιγότερο σημαντικό: πράξεις με doubles πιο αργές σε ορισμένους υπολογιστές. ο τύπος double συχνά καταλαμβάνει περισσότερη μνήμη Ö Εχουν τιμές και συνήθως εκφράζουν κάποιο υπολογισμό. Μια μεταβλητή από μόνη της αποτελεί έκφραση: f. Μια σταθερά από μόνη της αποτελεί έκφραση: 3.14 Είναιγενικάσυνδυασμοίμεταβλητών,σταθερώνκαιτελεστών area = 3.14 * radius * radius; Μερικοί αριθμητικοί τελεστές: μονομελείς: π.χ. πρόσημα + και - διμελείς: πρόσθεση +, αφαίρεση -, πολ/σμός *, διαίρεση /, κ.α. Ð ÙÒ ÖØ ÛÒ ÔÛ Ó Ñ Ö Ø Ö º
ÍÔÓÐÓ Ñ Ö ÛÒ ¹ Ö ÙÔÓÐÓ ÑÓ Ακριβείς κανόνες καθορίζουν μονοσήμαντα τη τιμή μιας έκφρασης: Ηέκφραση a + b a b 4 + 3 * 4-3 ισούταιμε (a + b) (a b) (4 + 3) * (4-3) = 7 ήμε a + (b a) b?? 4 + (3*4) - 3 = 13 Η προτεραιότητα τελεστών καθορίζει τη σειρά εκτέλεσης: 1. πρώτα οι παρενθέσεις (), αρχίζοντας από τις πιο εσωτερικές 2. μετά οι πολλαπλασιασμοί : *, / 3. τέλος οι προσθέσεις : +, - ½ ÍÔÓÐÓ Ñ Ö ÛÒ ¹ Ù Õ Ø Ñ Ø Ð ØôÒ Η προτεραιότητα δεν ξεκαθαρίζει την κατάσταση όταν όλοι οι τελεστές είναι στο ίδιο επίπεδο προτεραιότητας. Ηέκφραση a/b cισούταιμε a/(b c)ήμε (a/b) c?? Οι κανόνες συσχετισμού καθορίζουν τη σειρά μεταξύ συνεχόμενων τελεστών της ίδιας προτεραιότητας. Υπάρχει διαφορά? 16/4 2 Κανόνες συσχετισμού: Οι περισσότεροι αριθμητικοί τελεστές στο Java, υπολογίζονται από αριστερά προς τα δεξιά, για το ίδιο επίπεδο προτεραιότητας: Ηέκφραση a/b cισούταιμε (a/b) c) Ηέκφραση a + b c + dισούταιμε ((a + b) c) + d
ÒØÓÐ Ò Οι μεταβλητές παίρνουν συνήθως τιμές με τις εντολές ανάθεσης μεταβλητή = έκφραση Η εκτέλεση μιας ανάθεσης υλοποιείται σε δυο διακριτά βήματα 1. Υπολογισμός της έκφρασης στο δεξί μέλος. 2. Αποθήκευση της τιμής της έκφρασης στη μεταβλητή που καθορίζεται αριστερά του τελεστή ανάθεσης =. Επομένως η x = x + 1; εντολή ανάθεσης στο Java, και όχι μια αλγεβρική εξίσωση! Μιαμεταβλητήμπορείναέχειμόνομίατιμή ότανημεταβλητή πάρει κάποια νέα τιμή με εντολή ανάθεσης, η προηγούμενη τιμή της χάνεται. À Ò Ø ÑÒ Ñ RAM { { ΕΣΜΕΥΜΕΝΗ ΜΝΗΜΗ (ΛΣ, ΑΛΛΑ ΠΡΟΓΡΑΜΜΑΤΑ) ΕΛΕΥΘΕΡΗ ΜΝΗΜΗ f 451 f = 451; f 451 c 232 c = (f - 32)*5/9; f c 452 232 f = f + 1;
ÙØ Ñ Ø Å Ø ØÖÓÔ Ì ÔÓÙ Ö Τι συμβαίνει όταν συνδυάζονται δεδομένα διαφορετικού τύπου? Για int n και double x n + 1 int. n + 1.5 double. 9/4 int. Αλλά: 9.0/4, 9/4.0, 9.0/4.0 double. x = 0ισοδ.μετηνανάθεση x = 0.0. n = 0.5 ΛΑΘΟΣ(runtime error). Κανόνας Μετατροπής Εξασφαλίζεται η ακρίβεια του αποτελέσματος: τα δεδομένα του λιγότερου ακριβούς τύπου αναβαθμίζονται σε τύπο μεγαλύτερης ακρίβειας μόνο για την εκτέλεση της συγκεκριμένης πράξης. Å Ø ØÖÓÔ ÑôÒ Fahrenheit ÑÓ Celsius Fahrenheit Celsius c = (5/9)(f 32) public class Fahr2Cels { public static void main(string args[]) { int f = 451; double c; c = (f - 32.0)*5/9; // c = (f - 32)*5/9; // c = 5/9*(f - 32); System.out.println(c); } } Θα εμφανίσει την τιμή 232.77777777777777(14 δεκαδικά ψηφία)
Ê Ø Å Ø ØÖÓÔ Ì ÔÓÙ Συχνά η αυτόματη μετατροπή τύπου δεν είναι επιθυμητή. Παράδειγμα Για int a, b και double x, x = a / b; // Ακέραια διαίρεση με πιθανή αποκοπή Χρησιμοποιείται ο τελεστής προσαρμογής(cast): x = a / (double) b; x = (double) a / b; Η παρακάτω χρήση του τελεστή προσαρμογής είναι λανθασμένη! x = (double) (a / b); Ο τελεστής προσαρμογής είναι μονομελής, και η σύνταξη του είναι: (όνομα τύπου) έκφραση Ç Ø ÔÓ String Είναι παραγώμενος(σύνθετος) τύπος, αλλά πολύ βασικός. Τιμές(σταθερές String): χαρακτήρες σε διπλά εισαγωγικά: "Hello, world" "42" "" // empty string Δήλωση και αρχικοποίηση μεταβλητών τύπου String String javacreator = "Gosling"; // String javacreator = new String(" Gosling");
Ì Ð Ø ÙÒ ÒÛ concatenationµ Ο τελεστής + λειτουργεί διαφορετικά με όρους τύπου String: String s1 = "Hello, "; String s2 = "world"; // prints: Hello, world System.out.println(s1 + s2); Πρόσθεση όρων String με άλλους τύπους δεδομένων: // The answer is 42 System.out.println("The answer is "+4+2); // The answer is 6 System.out.println("The answer is "+(4+2)); Ç Ø ÔÓ boolean Για δεδομένα με 2 μόνο καταστάσεις(αληθές/ψευδές). Τιμές στο σύνολο {true, false} Εσωτερικάπαριστάνονταιαπό1bit: true 1και false 0 Δήλωση μεταβλητών boolean boolean isfemale; boolean isswitchon, isansweryes;
ÄÓ booleanµ ÔÖ Ü Ø Ð Ø Ë Þ ÙÜ µ Ñ Ø Ð Ø && Ñ Ð µ Ò ÖÑÓ Ö Ò ØÛ ÔÓ 0 o C Ö Õ Ø Ø Õ ÓÒÞ º Þ ÙÜ µ Ñ Ø Ð Ø Ñ Ð µ Ò ÓÑ ÑÓÙ Ø ÖÑ Ø Ø ÔÖôØ ØÓÙ ÔÖÛØ Ð Ñ ØÓ Ø Ø ØÓ Ô ÐÐÓ Ø Ø ³ ÛÒ Ø ØÓÙ ÕÖ ÒÓÙ Ø Ò ÙÖôÔ º ³ ÖÒ Òµ Ñ Ø Ð Ø! ÑÓÒÓÑ Ð µ Ò Ò Ò Ë ØÓ ÃÙÖ Ø Ø Ò Ö Ñ Ñ Ö º p q!p p &&q p q ÈÒ Ð true true false true true true false false true false true true false true false false false false ½ ÄÓ booleanµ Ö Στην απλούστερη μορφή τους συγκρίσεις, που σχηματίζονται από: boolean μεταβλητές ή σταθερές, boolean τελεστές, αριθμητικές εκφράσεις, και τελεστές συσχέτισης: Στα μαθηματικά: < > = Στη Java: < <= > >= ==!= È Ö Ñ Ø airtemperature > 30. 0 f <= 212 divisor!= 0
Ä Ò Ñ Ò ÕÖ ØÛÒ ÐÓ ôò Ø Ð ØôÒ xδενισούταιμε2ή3 Λάθος: x!=2 x!=3 Είναι πάντα true. Σωστό:!(x==2 x==3)ήαπλούστερα: x!=2 && x!=3 Προκύπτει από το νόμο του de Morgan:!(p q) ισοδ.!p &&!q!(p && q) ισοδ.!p!q 0 x < 1στη Javaγράφεται: 0 <= x && x < 1 Εκφράσειςτηςμορφής α x β,όπου κάποιοςαπότους τελεστέςσυσχέτισηςγράφονταιπάντασαν: α x && x β Ã Ò Ò ÙÔÓÐÓ ÑÓ ÐÓ ôò Ö ÛÒ Ο υπολογισμός λογικών εκφράσεων σταματάει τη στιγμή που προσδιορίζεται η τιμή τους(lazy evaluation). έκφραση1 && έκφραση2 Αν η έκφραση1 είναι false τότε δέν υπολογίζεται η έκφραση2. έκφραση1 έκφραση2 Αν η έκφραση1 είναι true τότε δέν υπολογίζεται η έκφραση2. Πρώτα συντάσσεται η απλούστερη από τις 2 εκφράσεις (y > 1) && (2*x*x-3*x+1 >= k*x*(x-1)+4*y) ή η έκφραση που δεν δημιουργεί προβλήματα (x!= 0) && (y%x == 0)
È Ö Ñ Ö ØÛÒ ØôÒ Ενα έτος είναι δίσεκτο, άν: τοέτοςδιαιρείταιμετο4αλλάδενδιαιρείταιμετο100,ή τοέτοςδιαιρείταιμετο400. π.χ. 1900 δεν είναι δίσεκτο, 2000 είναι. Η αντίστοιχη boolean έκφραση της Java για int year: ((year%4 == 0) && (year%100!= 0)) (year%400 == 0) ή (year%400 == 0) ((year%4 == 0) && (year%100!= 0))