Συνέχεια για το for: ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 29/11/07 Nested for-loops (for μέσα σε for): π.χ. int k; for (int i=0; i<3; i++) Σειρά εκτέλεσης: Μία φορά το k=0; k=0; Πέντε φορές το k=k+j+i; Μία φορά το System.out.println(k); for (int j=0; j<5; j++) Δεύτερη φορά το k=0; Άλλες πέντε φορές το k=k+j+i; k = k+j+i; κτλ. Άρα, θα εκτυπωθεί: 10 System.out.println(k); 15 20 Κάποια πιθανά σφάλματα στη δημιουργία ενός for: Ατέρμονες επαναλήψεις: for (int i=1; i>=0; i++) System.out.println(i); Καμμία επανάληψη: for (int j=1; j<=0; j--) System.out.println(j); Συμβουλή: Μπορούμε να χρησιμοποιήσουμε τον μετρητή του for σε πράξεις κτλ, αλλά καλό είναι να μην τον μεταβάλουμε (να μην αλλάζουμε την τιμή του) μέσα στο loop. Συνήθως το for χρησιμοποιείται για επάληψη του κώδικα για συγκεκριμένο αριθμό φορών, ο οποίος καθορίζεται από τον τρόπο μεταβολής του μετρητή του for. Αν ο μετρητής μεταβάλλεται και μέσα στο loop, τότε η διαδικασία περιπλέκεται... 1
Αριθμοί Fibonacci Οι αριθμοί Fibonacci δίνονται από την ακολουθία: f 1 = 1, f 2 = 2, f n = f n-1 + f n-2, για n>2, ο καθένας δηλαδή είναι το άθροισμα των δύο προηγούμενών του: 1, 2, 3, 5, 8, 13, 21,... Ένα πρόγραμμα Java που υπολογίζει συγκεκριμένο αριθμό αριθμών Fibonacci: import java.util.*; public class Fibonacci public static void main(string [] args) Scanner input = new Scanner(System.in); System.out.println( How many Fibonacci numbers? ); int n = input.nextint(); int g=1, f=2; // the first two Fibonacci numbers System.out.println(g); System.out.println(f); for (int i=3; i<=n; i++) f = f + g; g = f g; // to g ginetai = me to proigoumeno f System.out.println(f); Σχέση for και while: for (αρχικοποίηση; συνθήκη; ανανέωση) αρχικοποίηση; while(συνθήκη) ανανέωση; π.χ. for (int i=1; i<=5; i++) int i=1; while(i<=5) System.out.println(i); System.out.println(i); i++; 2
- switch: switch (varname) case value1: case value2: case value3: default: Η μεταβλητή VarName είναι είτε ακέραια, είτε τύπου boolean, είτε τύπου char. Το switch «στέλνει» τη ροή του κώδικα στο ισχύον case. Αν δεν υπάρχει κάποιο break στο τέλος ενός case, τότε η ροή του κώδικα συνεχίζει στο επόμενο case! Δηλαδή, κάνει έλεγχο των case μέχρι να βρει αυτό που ισχύει και από εκεί και πέρα δεν ελέγχει εάν τα υπόλοιπα ισχύουν ή όχι, αλλά απλά εκτελεί τον κώδικα μέχρι να βρει κάποιο break ώστε να βγει απ το switch. π.χ. char grade;... switch (grade) case A : System.out.println( Πολύ καλά!!! ); case B : System.out.println( Μπράβο! ); case C : System.out.println( Όχι κι άσχημα. ); case D : System.out.println( Έτσι κι έτσι... ); default: System.out.println( Ωχ... ); 3
Το break στο case A λείπει. Άρα, σε περίπτωση που ο βαθμός είναι A, θα εμφανιστεί: Πολύ καλά!!! Μπράβο! δηλαδή θα εκτελεστεί και το case B, ενώ αν ο βαθμός είναι Β, θα εμφανιστεί μόνο το: Μπράβο! Παράδειγμα με for και switch for (int j=0; j<5; ++j) switch (j) case 1: System.out.println( one ); case 2: System.out.println( two ); case 3: ; case 4: System.out.println( four ); case 5: System.out.println( five ); default: System.out.println( nothing ); Το πρόγραμμα θα εκτυπώσει (δίπλα φαίνονται οι αντίστοιχες τιμές του j): j εκτύπωση ------------- 1 one two 2 two 3 four five 4 four five 5 4
For και while για εισαγωγή αριθμών από το πληκτρολόγιο. Π.χ., θέλουμε να εισάγουμε αριθμούς και να υπολογίσουμε το άθροισμά τους: i) Για συγκεκριμένο πλήθος αριθμών: double total = 0, value; System.out.println( Πλήθος? ); int n = input.nextint(); for (int i=1; i<=n; i++) System.out.println( number? ); value = input.nextdouble(); total += value; System.out.println(total); ii) Για άγνωστο πλήθος αριθμών: double endofdata = 0; double total = 0, value; System.out.println( number? ); value = input.nextdouble(); while (value!= endofdata) total += value; System.out.println( number? Enter 0 to stop ); value = input.nextdouble(); System.out.println(total); Η μεταβλητή endofdata χρησιμοποιείται για τον τερματισμό της διαδικασίας εισόδου αριθμών από το πληκτρολόγιο. Στο συγκεκριμένο παράδειγμα, η διαδικασία τερματίζεται όταν ο χρήστης δώσει την τιμή 0. Η τιμή της endofdata επιλέγεται από τον προγραμματιστή (π.χ., 0, -1, 999, κτλ.). Ο χρήστης θα πρέπει φυσικά να ενημερώνεται για την τιμή της (με ανάλογο μήνυμα), ώστε να γνωρίζει πώς να τερματίσει τη διαδικασία εισόδου δεδομένων. 5
Υπολογισμός ελάχιστου λίστας θετικών αριθμών int endofdata = -1; int min = Integer.MAX_VALUE; // ο μεγαλύτερος ακέραιος System.out.println( number? ); int value = input.nextint(); while (value!= endofdata) if (value < min) min = value; System.out.println( number? Enter -1 to stop ); value = input.nextint(); System.out.println(min); Πρώτοι αριθμοί (στο επόμενο μάθημα) 6