Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 8/11/07 Συμπλήρωμα προηγούμενης εβδομάδας: ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με ΑΜ σε 3, 7, 8 & 9 8/11/07 Τι συμβαίνει όταν στην ίδια έκφραση υπάρχει πάνω από μία φορά ο τελεστής ++ (ή --) στην ίδια μεταβλητή (ή αν η μεταβλητή με τον εν λόγω τελεστή επανεμφανίζεται απλά μέσα στην έκφραση) πχ, int a = 5; int x = (a++) + (++a); // x = 5 + 7 = 12, a = 7 ------------------------- int a = 5; int x = (++a) + (a++); // x = 6 + 6 = 12, a = 7 Δηλαδή, στη περίπτωση του ++a η μεταβλητή πρώτα αυξάνεται κατά 1 και μετά παίρνει μέρος στην έκφραση, ενώ στην περίπτωση του a++ παίρνει μέρος στην έκφραση με την αρχική της τιμή και αμέσως μετά αυξάνεται κατά 1, οπότε αν υπάρχει και σε άλλο σημείο της έκφρασης, παίρνει μέρος με τη νέα της πλέον τιμή Η ΚΛΑΣΗ String Κάθε αλφαριθμητικό είναι αντικείμενο της κλάσης String και όχι μια μεταβλητή πρωτογενούς τύπου (όπως πχ η double, η int, κτλ) Δημιουργία: String str = Hello ; Τελεστής συνένωσης (δημιουργία νέων String): String s1 = Hello ; String s2 = there ; String s3 = s1 + s2; Systemoutprintln(s3); // Hellothere «Πρόσθεση» String με άλλους τύπους δεδομένων: Systemoutprintln(4+7); // Τυπώνει: 11 Systemoutprintln( The answer is: + 4 + 7); // Τυπώνει: The answer is 47 1
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 8/11/07 Για να τυπωθεί το επιθυμητό 11, θα πρέπει να χρησιμοποιήσουμε παρένθεση στην πρόσθεση 4+7, ως εξής: Systemoutprintln( The answer is: + (4 + 7)); // Τυπώνει: The answer is 11 ΣΥΓΚΡΙΣΗ ΜΕΤΑΒΛΗΤΩΝ Η σύγκριση δύο μεταβλητών στη Java γίνεται με τους ακόλουθους τελεστές (δεξιά στήλη): Μαθηματικά Java = == < < <= > > >=!= Το αποτέλεσμα μιας σύγκρισης είναι boolean (true ή false) πχ, int a=5, b=5; boolean c, d; c = (a == b); // c=true d = (a > b); // d=false άλλο παράδειγμα: boolean isrefriglighton; boolean isrefrigdooropen; isrefriglightopen = (isrefrigdooropen == true); (το φως του ψυγείου είναι αναμμένο όταν η πόρτα του είναι ανοιχτή!) 2
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 8/11/07 ΛΟΓΙΚΕΣ ΣΧΕΣΕΙΣ Σύζευξη (AND και): && Διάζευξη (OR ή): Άρνηση (NOT δεν):! Λογικές σχέσεις γίνονται μεταξύ boolean μεταβλητών (ή εκφράσεων που έχουν boolean αποτέλεσμα (τιμή)) Το αποτέλεσμά τους είναι κι αυτό boolean (true ή false) Πίνακας αληθείας: p q p&&q p q true true true true true false false true false true false true false false false false Ο υπολογισμός των λογικών σχέσεων σταματάει τη στιγμή που προσδιορίζεται η τιμή τους (υπάρχει τρόπος να μην γίνεται αυτό, με τα σύμβολα & και Θα τα δούμε στην «Πληροφορική ΙΙ») Δηλαδή, στο A&&B, αν το Α είναι false, τότε δεν ελέγχεται καν το Β, και το αποτέλεσμα του Α&&Β γίνεται false Αντίστοιχα, στο Α Β, αν το Α είναι true, το αποτέλεσμα γίνεται true χωρίς να ελεγχθεί το Β Άρα, η ακόλουθη έκφραση δεν δημιουργεί πρόβλημα: (3 == 7) && (2 == (3 / 0) ); βγάζει false (γιατί 3 == 7 είναι false και δεν μπαίνει ποτέ στο 3/0 του δεύτερου μέρους) Αντίθετα, αν ήταν: (7 == 7) && (2 == (3 / 0) ); θα έβγαζε σφάλμα (run-time error: division by zero) 3
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 8/11/07 Συχνά λάθη: Το x δεν ισούται με 2 ή 3: Λάθος: x!=2 x!=3 // Είναι πάντα true! Σωστό: x!=2 && x!=3 // ή:!(x==2 x==3) Ισχύουν οι ιδιότητες: To:!(p q) ταυτίζεται με το:!p &&!q To:!(p && q) ταυτίζεται με το:!p!q Το: 0 x < 1 γράφεται: 0 <= x && x < 1 (δεν συγκρίνουμε πάνω από δύο μεταβλητές μαζί) Παράδειγμα: Λύση: Για δεδομένο έτος (year) να δοθεί τιμή στην boolean μεταβλητή isleapyear ανάλογα με το αν το έτος είναι δίσεκτο (true) ή όχι (false): Πότε ένα έτος είναι δίσεκτο; Δίσεκτα είναι τα έτη που διαιρούνται με το 4, εκτός από τα έτη των αιώνων (πχ, 1700, 1800, 1900, κτλ) Κατ εξαίρεση, είναι δίσεκτα τα έτη των αιώνων που διαιρούνται με το 400 (πχ, 1600, 2000, 2400, κτλ) Άρα, ένα έτος είναι δίσεκτο: α) αν διαιρείται με το 4 αλλά όχι με το 100 ή β) αν διαιρείται με το 400 Οπότε: int year; boolean isleapyear; isleapyear = ((year%4==0) && (year%100!=0)) (year%400==0); // ή καλύτερα, πρώτα η απλούστερη έκφραση (year%400==0) και μετά η σύζευξη: // isleapyear = (year%400==0) ((year%4==0) && (year%100!=0)); 4
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 8/11/07 ΕΛΕΓΧΟΣ ΡΟΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ Ι Ελεγκτές συνθηκών ή περιπτώσεων: i) if/ ii) switch II Επαναληπτικές διαδικασίες: i) for ii) while iii) do/while if/: Με επιλογές μιας μόνο εντολής: Με επιλογές πολλαπλών εντολών: if (<λογική_έκφραση>) if (<λογική_έκφραση>) <εντολή_1>; // if true { <εντολή_1>; <εντολή_2>; <εντολή_2>; // if false } { <εντολή_3>; <εντολή_4>; } λογική_έκφραση boolean, δηλαδή true ή false πχ int a=5, b=7, c; if (a>=b) c = a+b; c = a-b; Systemoutprintln(c); // -2 5
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 8/11/07 Άλλο παράδειγμα: double temp; boolean israining, issnowing; // τιμές στις temp και israining if ((israining == true) && (temp <= 0)) issnowing = true; issnowing = false; Μπορεί να υπάρχει if χωρίς : if (<λογική_συνθήκη>) if (<λογική_συνθήκη>) <εντολή>; ή { <εντολές>; } Δηλαδή, πχ, if (test) <εντολή1>; <εντολή2>; <εντολή3>; Σε αυτό το παράδειγμα δεν υπάρχει Επομένως μόνο η <εντολή1> «ανήκει» στο if και εκτελείται μόνο εάν το test είναι true Η <εντολή2> και η <εντολή3> εκτελούνται ούτως ή άλλως, αφού βρίσκονται μετά το if Άρα: - Αν η test είναι true: <εντολή1>, <εντολή2>, <εντολή3> - Αν η test είναι false: <εντολή2>, <εντολή3> if (test) <εντολή1>; <εντολή2>; <εντολή3>; Σε αυτό το παράδειγμα η <εντολή2> «ανήκει» στην περίπτωση του if, άρα εκτελείται μόνο εάν το test είναι false Η <εντολή3> εκτελείται ούτως ή άλλως, αφού βρίσκεται μετά το if Άρα: - Αν η test είναι true: <εντολή1>, <εντολή3> - Αν η test είναι false: <εντολή2>, <εντολή3> 6
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 8/11/07 Το προηγούμενο παράδειγμα (με τη θερμοκρασία, τη βροχή και το χιόνι), με if χωρίς θα μπορούσε να γραφεί ως εξής: double temp; boolean israining, issnowing = false; // κάνουμε δηλαδή αρχικοποίηση της issnowing σε false // τιμές στις temp και israining if ((israining == true) && (temp <= 0)) issnowing = true; // δηλαδή αλλάζουμε την τιμή της issnowing μόνο εάν χρειάζεται If μέσα σε άλλο if (nested) a) b) if () if () { { } if () if () { { } } if () { { } } } { { } } Παραδείγματα στο επόμενο μάθημα 7