Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με ΑΜ σε 3, 7, 8 & 9 22/11/07 Παράδειγμα με if/else if και user input: import javautil*; public class Grades public static void main(string [] args) // variables: int score; char grade; // input: Scanner input = new Scanner(Systemin); Systemoutprintln( Please enter your score (0-100): ); score = inputnextint(); // calculate grade: if (score > 90) grade = A ; else if (score > 80) grade = B ; else if (score > 70) grade = C ; else if (score > 60) grade = D ; else grade = F ; // output: Systemoutprintln( With a score of + score + out of 100, your grade is: + grade); Παράδειγμα με if μέσα σε if (όχι else if) double balance, interest; int penalty = 100; // απόδοση τιμής σε balance και interest, // πχ, balance = 1000, interest = 01 1
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 if (balance>=0) if (interest>=0) balance += interest * balance; else Systemoutprintln( Cannot have interest < 0 ); else balance -= penalty Systemoutprintln( New balance = + balance); Τα και που υπάρχουν στο πρώτο if δεν είναι απαραίτητα γιατί στο if αυτό ανήκει μόνο μία εντολή, το δεύτερο if/else (το οποίο θεωρείται μία εντολή) Συντομογραφία του απλού if/else όταν έχουμε απόδοση τιμής Το if/else μπορεί να γραφεί σε συνοπτική μορφή (σε περιπτώσεις απόδοσης τιμής): if (x > y) max = x; else max = (x > y)? x : y; max = y; Μια παρατήρηση: Όταν μια λογική συνθήκη περιέχει μια boolean μεταβλητή, δεν χρειάζεται να την συγκρίνουμε με true ή false Δηλαδή το: boolean isfemale; if (isfemale == true) είναι το ίδιο με το: boolean isfemale; if (isfemale) Έτσι και το: if (isfemale == false) είναι το ίδιο με το: if (!isfemale) 2
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 - while: - do/while while(συνθήκη) do εντολές; εντολές; while(συνθήκη); Η συνθήκη είναι μία boolean έκφραση (άρα: true ή false) Κάνουν επανάληψη των εντολών καθ όσον η συνθήκη είναι αληθής Η διαφορά μεταξύ τους είναι ότι το do/while θα εκτελέσει τις εντολές τουλάχιστον μία φορά, ανεξάρτητα με το αν είναι true η συνθήκη, αφού την ελέγχει στο τέλος του loop, ενώ η while δεν μπαίνει καθόλου στο loop αν αρχικά η συνθήκη είναι false Διαγράμματα Ροής του while και του do/while START while START do/while OXI boolean true? NAI statements; statements; boolean true? NAI OXI END while END do/while 3
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 Παράδειγμα επιλογής while ή do/while: Θέλουμε να ζητήσουμε από τον χρήστη μια τιμή για τη μεταβλητή x η οποία να είναι μεγαλύτερη ή ίση του μηδενός Αν ο χρήστης δίνει αρνητική τιμή, τότε η ερώτηση θα επαναλαμβάνεται μέχρι να δοθεί τιμή μεγαλύτερη ή ίση του μηδενός: int x = 0; Scanner input = new Scanner(Systemin); while(x<0) // do Systemoutprintln( Please enter an integer>=0 ); x = inputnextint(); // while(x<0); Όπως είναι γραμμένος ο κώδικας, θα χρησιμοποιήσουμε είτε τον κόκκινο κώδικα (while) είτε τον μπλε (do/while) ο οποίος είναι σαν comments εδώ Ποιο από τα δύο θα επιλέξουμε; Η επιλογή του while είναι ΛΑΘΟΣ, γιατί το x είναι ήδη 0, άρα η ροή του κώδικα δεν θα μπει ποτέ μέσα στις αγκύλες του while, αφού το (x<0) είναι αρχικά false! Άρα δεν θα ζητηθεί ποτέ από τον χρήστη να εισάγει κάποια τιμή για το x Το σωστό είναι να χρησιμοποιήσουμε το do/while Παραδείγματα while: int n=0; int n=0; int n=0; int n=5; while (n<5) while (n<5) while (n<5) while (n<5) SOP(n++); SOP(++n); SOP(n--); SOP(n--); Θα τυπώσουν: 0 1 0-1 2-1 2 3-2 3 4-3 4 5-4 -5 (ατέρμονες επαναλήψεις) 4
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 Άλλα παραδείγματα while: Άθροισμα ψηφίων ακεραίου: Αλγόριθμος: i) εύρεση τελευταίου ψηφίου: n%10 (πχ, 1975%10 5) ii) αποκοπή τελευταίου ψηφίου: n/10 (πχ, 1975/10 197) int n = inputnextint(); int dsum = 0; while (n>0) dsum += n%10; n /= 10; Systemoutprintln(dsum); Μετατροπή δεκαδικού σε δυαδικό με διαδοχικές διαιρέσεις με το 2: int n = inputnextint(); String s = ; while (n>0) s = (n%2) + s; n /= 2; Systemoutprintln(s); 5
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 - for: Επανάληψη μέρους του κώδικα για συγκεκριμένο αριθμό επαναλήψεων Γενική σύνταξη: for (αρχικοποίηση; συνθήκη; ανανέωση) εντολή; συνήθως: for (counter=initialvalue; counter<=finalvalue; counter++) εντολές; Σειρά εκτέλεσης εντολών: i) counter = initialval; ii) έλεγχος counter<=finalvalue? iii) εντολές; iv) counter++ v) έλεγχος, κτλ Διάγραμμα Ροής του for-loop START FOR counter = initvalue OXI counter <= finalval? NAI statements; counter++ END FOR 6
Ακαδ έτος 2007-2008 ΠΛΗΡΟΦΟΡΙΚΗ Ι Φερεντίνος 22/11/07 Συνήθως ο μετρητής (counter) ορίζεται τοπικά, στο πρώτο μέρος της παρένθεσης του for-loop, δηλαδή είναι μια τοπική μεταβλητή Παράδειγμα: for (int i=1; i<=5; i++) Τυπώνει: 1 2 Systemoutprintln(i); 3 4 5 Άλλο ένα παράδειγμα: Υπολογισμός του n! int n = nextint(); int factorial = 1; for (int i=1; i<=n; i++) factorial *= i; Systemoutprintln( Το + n + παραγοντικό είναι ίσο με + factorial); 7