Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #4 η : Πρωτογενείς τύποι δεδομένων, Δηλώσεις ελέγχου (συνθήκες), Βρόγχοι επανάληψης Γαβαλάς Δαμιανός dgavalas@aegean.gr Μεταβλητές (Variables) // Compute the first area radius = 1.0; area = radius * radius * 3.14159; System.out.println("The area is + area + " for radius "+radius); // Compute the second area radius = 2.0; area = radius * radius * 3.14159; System.out.println("The area is + area + " for radius "+radius); 1
Δήλωση μεταβλητών int x; // Δήλωση του x ως // ακέραιας μεταβλητής double radius; // Δήλωση του radius ως // δεκαδικής μεταβλητής char a; // Δήλωση του a ως // μεταβλητής χαρακτήρα float i, j; // Ταυτόχρονη δήλωση των // i και j ως δεκαδικών Αποδίδοντας τιμές σε μεταβλητές x = 1; // Απέδωσε την τιμή 1 στο x radius = 1.0; // Απέδωσε την τιμή 1.0 // στο radius char a = 'A'; // Δήλωσε την a ως char // και απέδωσέ της την // τιμή 'A float i=9.3f, j; // Απέδωσε την τιμή 9.3 // στο i και δήλωσε τον // j ως δεκαδικό int k=10, l=8; // Απέδωσε τιμές στους // ακεραίους k, l 2
Σταθερές (Constants) final datatype CONSTANTNAME = VALUE; final double PI = 3.14159; final int SIZE = 3; Αριθμητικοί τύποι δεδομένων Name Range Storage Size byte 2 7 (-128) to 2 7 1 (127) 8-bit signed short 2 15 (-32768) to 2 15 1 (32767) 16-bit signed int 2 31 (-2147483648) to 2 31 1 (2147483647) 32-bit signed long 2 63 to 2 63 1 64-bit signed (i.e., -9223372036854775808 to 9223372036854775807) float Negative range: 32-bit IEEE 754-3.4028235E+38 to -1.4E-45 Positive range: 1.4E-45 to 3.4028235E+38 double Negative range: 64-bit IEEE 754-1.7976931348623157E+308 to -4.9E-324 Positive range: 4.9E-324 to 1.7976931348623157E+308 3
Αριθμητικοί τελεστές Όνομα Σημασία Παράδειγμα Αποτέλεσμα + Πρόσθεση 34 + 1 35 - Αφαίρεση 34.0 0.1 33.9 * Πολλαπλασιασμός 300 * 30 9000 / Πηλίκο 1.0 / 2.0 0.5 % Υπόλοιπο 20 % 3 2 Διαίρεση ακεραίων +,,*,/,και % Από το 5/2προκύπτει ο ακέραιος 2. Από το 5.0 / 2 προκύπτει ο double 2.5 Από το 5%2προκύπτει 1(το υπόλοιπο της διαίρεσης) 4
Ο τελεστής υπολοίπου διαίρεσης (%) Ο τελεστής % είναι πολύ χρήσιμος στον προγραμματισμό. π.χ. ένας άρτιος αριθμός % 2 δίνει πάντα 0 και ένας περιττός αριθμός % 2 δίνει πάντα 1. Άρα μπορούμε να χρησιμοποιήσουμε αυτό τον αριθμό για να εξετάσουμε κατά πόσο ένας αριθμός είναι μονός ή ζυγός. Σε συνδυασμό με μια δομή επανάληψης, ο τελεστής μπορεί να χρησιμοποιηθεί για να εκφράσει μια επαναληπτική περιοδική διαδικασία. Π.χ. να τυπώσουμε τους αριθμούς 1..4 εκατό φορές. Πως;;;; Αν σήμερα είναι Σάββατο, τι μέρα θα είναι σε 10 μέρες; Η 28 η Οκτωβρίου 2010 πέφτει Πέμπτη. Το 2014;;; Σάββατο είναι η 6 η ημέρα της βδομάδας (6 + 10) % 7 is 2 Μετά από 10 ημέρες Η βδομάδα έχει 7 ημέρες Η 2 η ημέρα της βδομάδας είναι Τρίτη Παράδειγμα: Εμφάνιση ώρας Σας δίνεται μια μεταβλητή που δηλώνει το χρόνο (σε δευτερόλεπτα) μετά από τον οποίο θα συμβεί κάτι: long sec=4820; Γράψτε ένα πρόγραμμα που εμφανίζει αυτό το χρόνο σε μορφή hours:min:sec 5
Δεκαδικοί αριθμοί Οι δεκαδικοί αριθμοί θεωρούνται εξ ορισμού τύπου double. Π.χ. οαριθμός 5.0 θεωρείται double και όχι float. Άρα, η δήλωση float num = 5.0; προκαλεί λάθος μεταγλώττισης Μπορείς να κάνεις ένα δεκαδικό αριθμό float προσθέτοντας στο τέλος το γράμμα f ή F, και αντίστοιχα να τον κάνεις double προσθέτοντας το d ή D, π.χ.: float num = 100.2f; float num = 100.2F; double num = 100.2d; double num = 100.2D; Επιστημονικός συμβολισμός Οι δεκαδικοί μπορούν επίσης να αναπαρασταθούν και με επιστημονικό συμβολισμό, π.χ.: Τα 1.23456e+2 και 1.23456e2 είναι αντίστοιχα με τα 123.456 Το 1.23456e 2 είναι αντίστοιχο με το 0.0123456. Το E (ή e ) συμβολίζει το εκθετικό 6
Αριθμητικές εκφράσεις 3 4x 10( y 5)( a b c) 4 9 x 9( ) 5 x x y Μεταφράζεται σε (3+4*x)/5 10*(y-5)*(a+b+c)/x ( )/ + 9*(4/x + (9+x)/y) Τελεστές που συντομεύουν την απόδοση τιμών Τελεστής Παράδειγμα Αντίστοιχο += i += 8 i = i + 8 -= f -= 8.0 f = f - 8.0 *= i *= 8 i = i * 8 /= i /= 8 i = i / 8 %= i %= 8 i = i % 8 7
Τελεστές αύξησης/μείωσης Τελεστής Όνομα Περιγραφή i = ++var προ-αύξηση Αυξάνει το var κατά 1 και καταχωρείται η νέα τιμή του στο i i = var++ μετα-αύξηση Η τιμή του var καταχωρείται στο i και έπειτα το var αυξάνεται κατά ένα in var and increments var by 1. i = --var προ-μείωση Μειώνεται το var κατά 1 και καταχωρείται η νέα τιμή του στο i i = var-- μετα-μείωση Η τιμή του var καταχωρείται στο i και έπειτα το var μειώνεται κατά ένα Τελεστές αύξησης/μείωσης int i = 10; Ίδιο με int newnum = 10 * i++; int newnum = 10 * i; i = i + 1; int i = 10; ;Ίδιο με int newnum = 10 * (++i); i = i + 1; int newnum = 10 * i; 8
Μετατροπή αριθμητικών τύπων Εξετάστε τις παρακάτω δηλώσεις: byte i = 100; long k = i * 3 + 4; double d = i * 3.1 + k / 2; Αλλαγή τύπου (Type Casting) Έμμεση αλλαγή: double d = 3; (διεύρυνση τύπου) Ρητή αλλαγή: int i = (int)3.0; (περιορισμός τύπου) int i = (int)3.9; (το δεκαδικό μέρος ακρωτηριάζεται ) Τι είναι λάθος; intx=5/2.0; Τι θα τυπωθεί από το παρακάτω; int i = 896897689; byte by =(byte)i; System.out.println(""+by); Αυξάνει το εύρος byte, short, int, long, float, double 9
Ο τύπος δεδομένων Char char letter = 'A'; (ASCII) char numchar = '4'; (ASCII) char letter = '\u0041'; (Unicode) char numchar = '\u0034'; (Unicode) 4 δεκαεξαδικά ψηφία Σημείωση: Οι τελεστές αύξησης/μείωσης μπορούν να χρησιμοποιηθούνοιηθούν και στις μεταβλητές char για να δώσουν το επόμενο/προηγούμενο Unicode χαρακτήρα. Π.χ. από τις επόμενες δηλώσεις εμφανίζεται το b. char ch = 'a'; System.out.println(++ch); Ειδικοί χαρακτήρες Περιγραφή Σύμβολο Unicode Tab \t \u0009 Αλλαγή γραμμής \n \u000a Backslash \\ \u005c Μονό Quote \' \u0027 Διπλό Quote \" \u0022 10
Ο τύπος String (συμβολοσειρά) Ο τύπος char αναπαριστά ένα μόνο ένα χαρακτήρα. Για αναπαρασταθεί μια σειρά χαρακτήρων χρησιμοποιούμε τον τύπο δεδομένω που λέγεται String, π.χ., String message = "Welcome to Java"; Η String είναι ουσιαστικά μια προκαθορισμένη κλάση των βιβλιοθηκών της Java, όπως και οι κλάσεις System ή JOptionPane. Η String δεν είναι λοιπόν πρωτογενής τύπος. Είναι γνωστή ως τύπος αναφοράς (reference type). Οποιαδήποτε Java κλάση μπορεί να χρησιμοποιηθεί ως τύπος αναφοράς για μια μεταβλητή. H String ανήκει στο πακέτο java.lang Το μόνο των βιβλιοθηκών της Java που γίνεται αυτομάτως inport!! Συνένωση συμβολοσειρών // Συνενώνονται 3 συμβολοσειρές String message = "Welcome " + "to " + "Java"; // Η συμβολοσειρά Chapter συνενώνεται με τον // αριθμό 2 String s = "Chapter" + 2; // Η s γίνεται Chapter2 11
Λήψη εισόδου (Input) από πλαίσια διαλόγου (dialog boxes) String str = JOptionPane.showInputDialog(null, "Prompting Message", "Dialog Title", JOptionPane.QUESTION_MESSAGE); System.out.println(str); Εναλλακτικά (πιο σύντομα): String str = JOptionPane.showInputDialog("Prompting Message"); Μετατροπή Strings σε Integers Το input που επιστρέφεται από το dialog box είναι συμβολοσειρά (τύπου String). Αν ο χρήστης συμπληρώσει 123, επιστρέφει 123. Για να αποθηκεύσεις το user input σε μορφή αριθμού πρέπει να μετατρέψεις το string σε αριθμό. Η μετατροπή String > int μπορεί να γίνει χρησιμοποιώντας την static μέθοδο parseint της κλάσης Integer: int intvalue = Integer.parseInt(intString); όπου intstring είναι μια αριθμητική συμβολοσειρά, όπως η 123. 12
Μετατροπή Strings σε Doubles Αντίστοιχες κλάσεις και static methods υπάρχουν για την μετατροπή strings σε άλλους αριθμητικούς τύπους δεδομένων, π.χ. double και float. Για παράδειγμα για τη μετατροπή ενός string σε double: double doublevalue =Double.parseDouble(doubleString); όπου doublestring είναι μια αριθμητική συμβολοσειρά, π.χ. 123.45. Άσκηση για το σπίτι: Εμφάνιση τρέχουσας ώρας Γράψτε ένα πρόγραμμα που να εμφανίζει την τρέχουσα GMT ώρα (ώρα Greenwich) σε μορφή hour:minute:second π.χ.21:45:19. Η μέθοδος currenttimemillis της κλάσης System επιστρέφει την τρέχουσα ώρα (σε msec) από τα μεσάνυχτα της 1 ης Ιανουαρίου 1970 GMT (το 1970 πρωτοπαρουσιάστηκε το Unix) Unix Epoch 01-01-1970 00:00:00 GMT Χρόνος που παρήρθε Τρέχουσα ώρα System.CurrentTimeMills() Χρόνος 13
Λήψη εισόδου (Input) με την κλάση Scanner 1. Δημιούργησε ένα αντικείμενο της Scanner Scanner scanner = new Scanner(System.in); 2. Χρήση μεθόδων next(), nextbyte(), nextshort(), nextint(), nextlong(), nextfloat(), nextdouble(), or nextboolean() για να διαβάσεις μια τιμή string, byte, short, int, long, float, double, ή boolean, π.χ. System.out.print("Enter a double value: "); Scanner scanner = new Scanner(System.in); double d = scanner.nextdouble(); Στυλ προγραμματισμού και τεκμηρίωση Κατάλληλα σχόλια Συμβάσεις ονοματοδοσίας Κατάλληλη στοίχιση και κενά μεταξύ γραμμών Στυλ ενοτήτων (blocks) 14
Κατάλληλα σχόλια Συμπεριλάβετε μια περίληψη στην αρχή του προγράμματος ςπου να εξηγεί τι κάνει το πρόγραμμα,, ποιες οι κύριες λειτουργίες του, ποιες δομές δεδομένων υποστηρίζει, τυχόν ιδιαίτερες τεχνικές που χρησιμοποιεί. Συμπεριλάβετε το όνομά σας, έκδοση του προγράμματος, ημερομηνία και σύντομη περιγραφή στην αρχή του προγράμματος Συμβάσεις ονοματοδοσίας Επιλέξτε μεστά νοήματος και περιγραφικά ονόματα Ονόματα μεταβλητών και μεθόδων: Χρησιμοποιήστε πεζά γράμματα. Εφόσον το όνομα περιλαμβάνει πολλές λέξεις, συνενώστε τις, χρησιμοποιώντας πεζά γράμματα για την πρώτη λέξη και κεφαλαίο πρώτο γράμμα για τις υπόλοιπες, π.χ.: Ονόματα μεταβλητών: i, radius, area Όνομα μεθόδου: computearea Ονόματα κλάσεων: Ομοίως με τις μεταβλητές και μεθόδους αλλά με το πρώτο γράμμα πάντα κεφαλαίο, π.χ.: Circle, Shape, Human, Bank, BankAccount, κλπ Σταθερές: Όλα τα γράμματα καφαλαία, κάτω παύλα (_) για διαχωρισμό λέξεων, π.χ. PI, E, MAX_VALUE, MIN_VALUE, κλπ 15
Κατάλληλη στοίχιση και κενά μεταξύ γραμμών Στοίχιση (Indentation) Ένα μπλοκ κώδικα που ανήκει σε μια μέθοδο ή εκτελείται όταν ικανοποιείται μια συνθήκη, στοιχίζεται πιο δεξιά (με όλες τις γραμμές του στοιχισμένες ακριβώς τη μία κάτω από την άλλη) Χρησιμοποιήστε το πλήκτρο Tab για τη στοίχιση public static void main (String[] args) { int i = 90; if (i > 10 ) { i++; System.out.println( i= + i) Κενά: Αφήστε μία ή περισσότερες κενές γραμμές για να διαχωρίσετε διαφορετικά τμήματα κώδικα Στυλ ενοτήτων (Block Styles) Χρησιμοποιείτε άγκιστρα τέλους γραμμής (και όχι επόμενης γραμμής) Στυλ επόμενης γραμμής public class Test { public static void main(string[] args) { System.out.println("Block Styles"); public class Test { public static void main(string[] args) { System.out.println("Block Styles"); Στυλ τέλους γραμμής 16
Προγραμματιστικά σφάλματα Συντακτικά σφάλματα (Syntax Errors) Εντοπίζονται από το μεταγλωττιστή (compiler) Σφάλματα«εκτέλεσης» (Runtime Errors) Ανακύπτουν κατά τη διάρκεια της εκτέλεσης του προγράμματος και προκαλούν τον πρόωροτερματισμό του προγράμματος Λογικά σφάλματα (Logic Errors) Προκαλούν λανθασμένα αποτελέσματα Συντακτικά σφάλματα Βρείτε τα συντακτικά σφάλματα στο παρακάτω κώδικα: public class ShowSyntaxErrors { public static void main(string[] args) { i = 30; System.out.println(i + 4); 17
Λάθη «εκτέλεσης» Βρείτε τα συντακτικά σφάλματα στον παρακάτω κώδικα: public class ShowRuntimeErrors { public static void main(string[] args) { int i = 1 / 0; Σε ποια περίπτωση μπορεί να προκύψει σφάλμα εκτέλεσης εδώ; public class ShowRuntimeErrors { public static void main(string[] args) { int intvalue = Integer.parseInt(intString); Λογικά λάθη public class ShowLogicErrors { /* Είναι ένας αριθμός μεταξύ 1 και 100; (συμπεριλαμβανομένων αυτών) */ public static void main(string[] args) { // Ζήτησε από το χρήστη να δώσει ένα αριθμό String input = JOptionPane.showInputDialog(null, "Δώσε έναν ακέραιο:", "ShowLogicErrors", JOptionPane.QUESTION_MESSAGE); int number = Integer.parseInt(input); // Εμφάνισε το αποτέλεσμα System.out.println("Ο αριθμός είναι μεταξύ 1 και 100, συμπεριλαμβανομένων αυτών;" + ((1 < number) && (number < 100))); System.exit(0); 18
Ο τύπος boolean και σχετικοί τελεστές Συχνά σε ένα πρόγραμμα χρειάζεται να συγκρίνεις δύο τιμές, π.χ. να ελέγξεις κατά πόσο ο i είναι μεγαλύτερος του j. Η Java παρέχει έξι τελεστές σύγκρισης Το αποτέλεσμα της σύγκρισης είναι μία Boolean τιμή: true ή false. boolean b = (1 > 2); Τελεστές σύγκρισης Τελεστής Όνομα < μικρότερο από <= μικρότερο ή ίσο > μεγαλύτερο από >= μεγαλύτερο μγ ή ίσο == ίσο με!= άνισο με 19
Boolean τελεστές Τελεστής Όνομα! not && and or ^ exclusive or Πίνακας αληθείας του τελεστή! p!p Παράδειγμα true false false true!(1 > 2) είναι true, επειδή (1 > 2) είναι false.!(1 > 0) είναι false, επειδή (1 > 0) είναι true. 20
Πίνακας αληθείας του τελεστή && p1 p2 p1 && p2 Παράδειγμα false false false false true false true false false true true true (3 > 2) && (5 >= 5) είναι true, επειδή (3 > 2) και (5 >= 5) είναι και οι δύο true. (3 > 2) && (5 > 5) είναι false, επειδή (5 > 5) είναι false. Πίνακας αληθείας του τελεστή p1 p2 p1 p2 Παράδειγμα false false false false true true true false true true true true (2 > 3) (5 > 5) είναι false, επειδή (2 > 3) και (5 > 5) είναι και οι δύο false. (3 > 2) (5 > 5) είναι true, επειδή (3 > 2) είναι true. 21
Πίνακας αληθείας του τελεστή ^ p1 p2 p1 ^ p2 Παράδειγμα false false false false true true true false true true true false (2 > 3) ^ (5 > 1) είναι true, επειδή (2 > 3) είναι false και (5 > 1) είναι true. (3 > 2) ^ (5 > 1) είναι false, επειδή οι (3 > 2) και (5 > 1) είναι true. Παραδείγματα System.out.println("Ο" + num + " διαιρείται ακριβώς με τους 2 και 3; " + ((num % 2 == 0) && (num % 3 == 0))); System.out.println("Ο" + num + " διαιρείται ακριβώς με το 2 ή το 3; " + ((num % 2 == 0) (num % 3 == 0))); System.out.println("Ο " + num + " διαιρείται ακριβώς με το 2 ή το 3, αλλά όχι και με τους δύο; " + ((num % 2 == 0) ^ (num % 3 == 0))); 22
Παράδειγμα: Προσδιορισμός δίσεκτων ετών; Το πρόγραμμα ζητάει από το χρήστη να δώσει μία int τιμή (αποθηκεύεται στη μεταβλητή year) και ελέγχει αν αντιστοιχεί σε δίσεκτο έτος Μια χρονιά είναι δίσεκτη αν διαιρείται με το 4 αλλά όχι με το 100, ή διαιρείται αρ ακριβώς με το 400. (year % 4 == 0 && year % 100!= 0) (year % 400 == 0) Δηλώσεις επιλογών (συνθήκες) if δηλώσεις switch δηλώσεις Τελεστής συνθήκης (Conditional Operators) 23
Απλές δηλώσεις if if (booleanσυνθήκη) Σ { δηλώσεις που θα εκτελεστούν εφόσον η συνθήκη ικανοποιηθεί; if (radius >= 0) { area = radius * radius * PI; System.out.println( println("το εμβαδόν" + " του κύκλου με ακτίνα " + radius + " είναι " + area); Σημείωση Απαιτούνται οι εξωτερικές παρενθέσεις if ((i > 0) && (i < 10)) { System.out.println("i is an " + + "integer between 0 and 10"); (α) Αντίστιχο Οι αγκύλες μπορ ού ν να παραληφθούν (εφόσον το μπλοκ περιλαμβάνει μία μόνο δήλωση) if ((i > 0) && (i < 10)) System.out.println("i is an " + + "integer between 0 and 10"); (β) 24
Προσοχή Η πληκτρολόγηση ενός ερωτηματικού στο τέλος μιας δήλωσης if αποτελεί συνηθισμένο προγραμματιστικό σφάλμα if (radius >= 0); Λάθος { area = radius*radius*pi; System.out.println( "Το εμβαδόν του κύκλου με ακτίνα " + radius + " είναι " + area); Αυτού του είδους το σφάλμα εντοπίζεται σχετικά δύσκολα καθώς δεν είναι συντακτικό ούτε σφάλμα εκτέλεσης αλλά λογικό σφάλμα Η δήλωση if...else if (booleanσυνθήκη) { δηλώσεις που θα εκτελεστούν εφόσον η συνθήκη ικανοποιηθεί; else { δηλώσεις που θα εκτελεστούν εφόσον η συνθήκη δεν ικανοποιηθεί; 25
Παράδειγμα if...else if (radius >= 0) { area = radius * radius * 3.14159; System.out.println"Το εμβαδόν του κύκλου με ακτίνα " + radius + " είναι " + area); else { System.out.println("Αρνητική είσοδος"); Παράδειγμα if else δήλωσης Ας υποθέσουμε ότι score=70.0 if (score >= 90.0) grade = 'A'; else if (score >= 80.0) grade = 'B'; else if (score >= 70.0) grade = 'C'; else if f( (score >= 60.0) grade = 'D'; else grade = 'F'; Η συνθήκη δεν ικανοποιείται 26
Σημείωση Το else αφορά στο πιο πρόσφατο if (στην ίδια ενότητα δηλώσεων) int i = 1; int j = 2; int k = 3; if (i > j) if (i > k) System.out.println("A"); else System.out.println("B"); (α) Αντίστοιχο int i = 1; int j = 2; int k = 3; if (i > j) if (i > k) System.out.println("A"); else System.out.println("B"); (β) Παράδειγμα Τι θα τυπώσει ο παρακάτω κώδικας; Τι θα τύπωνε αν έλειπαν τα άγκιστρα; int i = 1; int j = 2; int k = 3; if (i > j) { if (i > k) System.out.println("A"); else System.out.println("B"); 27
Σημείωση if (even == true) System.out.println( "Είναι άρτιος."); (α) Αντίστοιχο if (even) System.out.println( "Είναι άρτιος."); (β) Άσκηση για το σπίτι: ένα εργαλείο για πρακτική εξάσκηση στην αριθμητική Γράψτε ένα Java πρόγραμμα που να παράγει δύο τυχαίους μονοψήφιους ακεραίους number1 και number2 όπου number1 > number2 και εμφανίζει μια ερώτηση σαν Πόσο κάνει 9 2; σε ένα μαθητή Αφού ο μαθητής συμπληρώσει την απάντησή του στο input πλαίσιο διαλόγου, το πρόγραμμα εμφανίζει ένα message dialog box για να δείξει αν η απάντηση ήταν σωστή (αν όχι, θα πρέπει να δοθεί η σωστή απάντηση). 28
Δήλωση switch switch (status) { case 0: δηλώσεις που θα εκτελεστούν εφόσον status=0; break; case 1: δηλώσεις που θα εκτελεστούν εφόσον status=1; break; case 2: δηλώσεις που θα εκτελεστούν εφόσον status=2; break; case 3: δηλώσεις που θα εκτελεστούν εφόσον status=3; break; default: δηλώσεις που θα εκτελεστούν εφόσον τίποτα από τα παραπάνω δεν ισχύει; System.exit(0); Κανόνες δήλωσης switch Η switch-έκφραση πρέπει να πάρει τιμή char, byte, short, ή int και πάντα να κλείνεται σε παρένθεση Η τιμή1,..., και τιμήn πρέπει να παίρνουν τον ίδιο τύπο δεδομένων με την switch-έκφραση. Οι δηλώσεις κάτω από κάθε case εκτελούνται όταν η τιμή στην switch-έκφραση παίρνει την ίδια τιμή με την case δήλωση. switch (switch-έκφραση) { case τιμή1: δηλώσεις1; break; case τιμή2: δηλώσεις2; break; case τιμήn: δηλώσειςn; break; default: δηλώσεις-γιαdefault; 29
Κανόνες δήλωσης switch Η λέξη κλειδί break είναι προαιρετική, αλλά πρέπει να χρησιμοποιηθεί στο τέλος κάθε case ώστε να μην εκτελεστεί το υπόλοιπο της switch δήλωσης. Αν η break δήλωση δεν υπάρχει, θα εκτελεστεί η επόμενη case δήλωση. Το default case είναι προαιρετικό και χρησιμοποιείται για να οριστούν δηλώσεις που θα εκτελεστούν εφόσον κανένα από τα cases δεν ικανοποιηθεί. switch (switch-expression) { case τιμή1: δηλώσεις1; break; case τιμή2: δηλώσεις2; break; case τιμήn: δηλώσεις N; break; default: default-δηλώσεις; Οι case δηλώσεις εκτελούνται σειριακά, ωστόσο η σειρά τους (συμπεριλαμβανομένου του default case) δεν έχει σημασία. Είναι ωστόσο καλή προγραμματιστική τεχνική να ακολουθούμε μια λογική σειρά και να αφήνουμε το default case στο τέλος. Παράδειγμα δήλωσης switch Υποθέτουμε ότι ch = 'c': switch (ch) { case 'a': System.out.println(ch); case 'b': System.out.println(ch); case 'c': System.out.println(ch); 30
Παράδειγμα δήλωσης switch Υποθέτουμε ότι ch = 'c': switch (ch) { case 'a': System.out.println(ch); break; case 'b': System.out.println(ch); break; case 'c': System.out.println(ch); Ποια η διαφορά με το προηγούμενο παράδειγμα; Τελεστής συνθήκης (conditional operator) if (x > 0) y = 1 else y = 1; Είναι αντίστοιχο με το: y = (x > 0)? 1 : 1; (booleanexpression)? expression1 : expression2 31
Παράδειγμα τελεστή συνθήκης if (num % 2 == 0) System.out.println(num + είναι άρτιος ); else System.out.println(num + είναι περιττός ); Πως θα γραφεί με τον τελεστή σύγκρισης; System.out.println( (num % 2 == 0)? num + είναι άρτιος : num + είναι περιττός ); Βρόγχος επανάληψης while while (συνθήκη βρόγχου) { // σώμα του βρόγχου; Δηλώσεις; int count = 0; while (count < 100) { System.out.println ("Welcome to Java!"); count++; 32
Παράδειγμα βρόγχου while int count = 0; while (count < 2) { System.out.println("Welcome to Java!"); count++; Τι θα κάνει;; Άσκηση για το σπίτι: Προχωρημένο εργαλείο για πρακτική εξάσκηση στην αριθμητική Επαναλάβατε την προηγούμενη άσκηση με το εργαλείο εξάσκησης στην αριθμητική ώστε να γεννάει 10 ερωτήσεις και στο τέλος να βαθμολογεί το μαθητή (π.χ. «άριστα» με πάνω από 8 σωστές απαντήσεις, «πολύ καλά» για 6 8 σωστέ απαντήσεις, κλπ. 33
Βρόγχος do-while do { // σώμα βρόγχου; Statement(s); while (loop-continuation-condition); Βρόγχος for for (αρχική δήλωση; συνθήκη για συνέχιση βρόγχου; Δήλωση που εκτελείται σε κάθε επανάληψη) { // σώμα βρόγχου; Δηλώσεις; int i; for (i = 0; i < 100; i++) { System.out.println( "Welcome to Java!"); 34
Παράδειγμα βρόγχου for int i; for (i = 0; i < 2; i++) { System.out.println( "Welcome to Java!"); Τι θα κάνει; Σημείωση Εφόσον η συνθήκη συνέχισης του βρόγχου παραληφθεί, έμμεσα θεωρείται ως αληθής Έτσι, ο κάτω αριστερά βρόγχος for είναι ένας ατέρμονος βρόγχος Ωστόσο, είναι καλύτερα να γράφεται όπως φαίνεται κάτω δεξιά, για αποφυγή παρεξηγήσεων for ( ; ; ) { Αντίστοιχο while (true) { // κάνε κάτι // κάνε κάτι (α) (β) 35
Παράδειγμα βρόγχου for Πρόβλημα: γράψτε ένα Java πρόγραμμα που αθροίζει μια σειρά αριθμών που αρχίζει από το 1.0 και τελειώνει στο 0.01 (το βήμα μείωσης είναι 0.01) το άθροισμα θα πρέπει να είναι: 1.0 + 0.99 + 0.98 + Φωλιασμένοι βρόγχοι (nested loops) Γράψτε ένα πρόγραμμα που τυπώνει τον πίνακα της προπαίδειας: 36
Ποιο βρόγχο να χρησιμοποιήσω; Οι τρεις εκφράσεις βρόγχων, while, do while, και for, είναι αντίστοιχοι, δηλαδή ένα πρόβλημα που απαιτεί κάποιο βρόγχο μπορεί να λυθεί με οποιαδήποτε από τις 3 αυτές μορφές. Π.χ. το while loop στο (α) μπορεί να μετατραπεί σε for loop (β): while (συνθήκη συνέχισης βρόγχου) { // σώμα βρόγχου (α) Αντίστοιχο for ( ; συνθήκη συνέχισης βρόγχου; ) { // σώμα βρόγχου (β) Αντίστοιχα, ένα for loop (α) μπορεί να μετατραπεί σε while loop (β) εκτός κάποιων ειδικών περιπτώσεων: for (αρχική δήλωση; συνθήκη συνέχισης βρόγχου; δήλωση που εκτελείται σε κάθε επανάληψη) { // σώμα βρόγχου; (α) Αντίστοιχο αρχική δήλωση; while (συνθήκη συνέχισης βρόγχου) { // σώμα βρόγχου; δήλωση που εκτελείται σε κάθε επανάληψη; (β) Σύσταση Χρησιμοποιήστε εκείνον με τον οποίο αισθάνεστε πιο άνετα Γενικά, ένα for loop χρησιμοποιείται όταν είναι γνωστός ο αριθμός των επαναλήψεων, π.χ. όταν θες να τυπώσεις ένα μήνυμα 100 φορές Ένα while loop μπορεί να χρησιμοποιηθεί όταν ο αριθμός των επαναλήψεων δεν είναι γνωστός, π.χ. όταν θες να διαβάσεις αριθμούς μέχρι να δοθεί input 0. Ένα do while loop μπορεί να χρησιμοποιηθεί αντί του while loop αν είναι βέβαιο ότι το σώμα του βρόγχου πρέπει να εκτελεστεί πριν γίνει ο έλεγχος της συνθήκης 37
Προσοχή! Η πληκτρολόγηση ενός ερωτηματικού μετά το for και πριν το σώμα του βρόγχου είναι συνηθισμένο λάθος που δύσκολα εντοπίζεται (είναι λογικό σφάλμα) : for (int i=0; i<10; i++); { System.out.println("i = " + i); Λογικό σφάλμα Προσοχή! Αντίστοιχα λάθος είναι και το: Λογικό λάθος int i=0; while (i < 10); { System.out.println("i is " + i); i++; Στην περίπτωση του do.. while loop, το παρακάτω είναι σωστό (το ερωτηματικό είναι απαραίτητο): int i=0; do { System.out.println("i Σωστό is " + i); i++; while (i<10); 38
Άσκηση για το σπίτι: Εύρεση Μέγιστου Κοινού Διαιρέτη Πρόβλημα: Γράψτε ένα Java πρόγραμμα που ζητάει από το χρήστη να δώσει δύο ακεραίους αριθμούς και υπολογίζει το μέγιστο κοινό διαιρέτη τους. Λύση: Αν ο χρήστης δώσει τους αριθμούς n1 και n2, ο μέγιστος κοινός διαιρέτης θα είναι κάποιος αριθμός από 1 έως τον ελάχιστο των n1 και n2 που διαιρεί ακριβώς ρβ ς( (αφήνει υπόλοιπο 0) και τους δύο αριθμούς. Χρήση των break και continue for (int i=0; i<5; i++) { System.out.println ("i=" + i); if (i == 3) break; for (int i=0; i<5; i++) { System.out.println ("i=" + i); if (i == 3) continue; Ποιες οι διαφορές; 39
Άσκηση για το σπίτι: Εμφάνιση Πρώτων Αριθμών Πρόβλημα: Γράψτε ένα Java πρόγραμμα που εμφανίζει τους πρώτους 50 πρώτους αριθμούς σε 5 γραμμές, κάθε μία από τους οποίες περιλαμβάνει 10 αριθμούς. Ένας ακέραιος μεγαλύτερος του 1 είναι πρώτος αριθμός εφόσον διαιρείται ακριβώς μόνο με το 1 και τον εαυτό του, π.χ., οι 2, 3, 5 και 7 είναι πρώτοι αριθμοί, ενώ οι 4, 6, 8 και 9 δεν είναι. Λύση: Το πρόβλημα μπορεί να αναλυθεί ως εξής: Για κάθε number = 2, 3, 4, 5, 6,..., έλεγξε αν ο number είναι πρώτος. Αν είναι, τύπωσέ τον Μέτρα τους πρώτους αριθμούς, και για κάθε 10 άλλαξε γραμμή 40