ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 13/12/07 Ένα απλό παράδειγμα μιας κλάσης εφαρμογής με δύο μεθόδους (κλήση μεθόδου μέσα στην ίδια κλάση): import java.util.*; public class Example public static double square(double r) double s = x*x; return s; Scanner input = new Scanner(System.in); System.out.println( Please give a number: ); double n = input.nextdouble(); double z = square(n); System.out.println(n + squared is: + z); Παράδειγμα εκτέλεσης του προγράμματος: > Please give a number: > 5 > 5 squared is 25 > 1
Παράδειγμα με κλήση μεθόδου από άλλη κλάση: public class Combi // μέθοδος που υπολογίζει το n! public static int fact(int n) int p = 1; for (int i=1; i<=n; i++) p *= i; return p; // μέθοδος που υπολογίζει το (n ανά k) public static int combinations(int n, int k) return (fact(n)/(fact(k)*fact(n-k))); public class TestCombi System.out.println( 10! = + Combi.fact(10)); System.out.println( 5 ανά 2 = ); System.out.println(Combi.combincations(5,2)); Δηλαδή, το πρόγραμμα αποτελείται από δύο κλάσης: την κλάση εφαρμογής (TestCombi) και την κλάση υποστήριξης (Combi). Η κλάση υποστήριξης περιέχει δύο μεθόδους (fact και combinations) και η κλάση εφαρμογής μία μέθοδο (την main). Η κάθε μία από τις κλάσεις αυτές σώζεται σε ξεχωριστό αρχείο, με το όνομά της.java (Combi.java και TestCombi.java). Κατά την εκτέλεση του προγράμματος, εκτελείται ο κώδικας της μεθόδου main, ο οποίος καλεί τις άλλες δύο μεθόδους (οπότε και η ροή του κώδικα πάει σε αυτές κατά την κλήση τους). Το αποτέλεσμα του συγκεκριμένου παραδείγματος θα είναι το εξής: > 10! = 3628800 > 5 ανά 2 = > 10 2
- Τοπικές μεταβλητές: οι μεταβλητές που ορίζονται μέσα σε κάποια μέθοδο. Έχουν υπόσταση μόνο μέσα στη μέθοδο. o Δημιουργούνται όταν καλείται η μέθοδος o Παύουν να υπάρχουν όταν τελειώσει η εκτέλεση της μεθόδου Οι παράμετροι μιας μεθόδου είναι κι αυτές τοπικές μεταβλητές, οι οποίες αρχικοποιούνται στις τιμές των ορισμάτων τους. (σημείωση: παράμετροι είναι οι μεταβλητές εισόδου μιας μεθόδου, ενώ ορίσματα είναι οι τιμές αυτών των παραμέτρων με τις οποίες (τιμές) καλούνται οι μέθοδοι βλ. προηγούμενο μάθημα) - Μεταβλητές κλάσης: [θα τις δούμε αργότερα] Παράδειγμα τοπικής μεταβλητής: public class Local public static void withlocalvars(int x) System.out.println( 1) x = + x); x = 5; System.out.println( 2) x = + x); int x = 1; System.out.println( 3) x = + x); withlocalvars(x); System.out.println( 4) x = + x); Το πρόγραμμα αυτό θα εκτυπώσει στη οθόνη το εξής: > 3) x = 1 > 1) x = 1 > 2) x = 5 > 4) x = 1 Το x είναι 1 στο τελευταίο System.out.println γιατί αφορά την τοπική μεταβλητή της main και όχι αυτήν της withlocalvars η οποία έχει γίνει 5. 3
- Μέθοδος για τον έλεγχο πρώτων αριθμών public class Primes public static boolean isprime(int n) if ((n%2==0 && n>2) n==1) return false; int limit = (int)math.sqrt(n)+1; for (int div=3; div<=limit; div+=2) if (n%div==0) return false; return true; Η κλάση αυτή είναι κλάση υποστήριξης. Έχουμε πει ότι μια μέθοδος έχει ένα μόνο return. Γιατί αυτή έχει τρία; Γιατί μόνο ένα από αυτά θα εκτελεστεί. Δηλαδή, στην ουσία αυτό που ισχύει είναι ότι μια μέθοδος επιστρέφει μία μόνο μεταβλητή. Πως θα ήταν η κλάση εφαρμογής; import java.util.*; public class TestPrimes Scanner input = new Scanner(System.in); System.out.println( Please give a positive integer: ); int n = input.nextint(); if (Primes.isPrime(n)) System.out.println( The number + n + is prime. ); else System.out.println( This number is not a prime. ); 4
Άσκηση: Να βρεθούν όλα τα ζεύγη πρώτων αριθμών p και q στο διάστημα [3, 200] έτσι ώστε q=2p+1. Αρκεί να ελεγχθεί κάθε περιττός στο διάστημα [3, 99] και για κάθε πρώτο p σε αυτό το διάστημα να ελέγχεται άν ο 2p+1 είναι πρώτος. Θα χρησιμοποιήσουμε τη μέθοδο isprime της κλάσης Primes από πριν. public class PrimePairs for (int p=3; p<=99; p+=2) if (Primes.isPrime(p)) if (Primes.isPrime(2*p+1)) System.out.println(p + + (2*p+1)); - Παράδειγμα Ημερολογίου Ένα πρόγραμμα που θα δέχεται από τον χρήστη τον μήνα (1-12) και το έτος (μετά το 1900) και θα επιστρέφει το ημερολόγιο του μήνα, ως εξής: Δεκέμβριος 2007 Κυ Δε Τρ Τε Πε Πα Σα 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 Το πρόγραμμα αποτελείται από διάφορες «εξειδικευμένες» μεθόδους, υπό την έννοια ότι κάθε μία από αυτές επιτελεί κάποιες πολύ συγκεκριμένες εργασίες. α) Μέθοδος που επιστρέφει το όνομα του μήνα: public static String monthname(int month) if (month==1) return Ιανουάριος ; else if (month==2) return Φεβρουάριος ; else if (month==3) return Μάρτιος ; 5
else if (month==4) return Απρίλιος ; else if (month==5) return Μάιος ; else if (month==6) return Ιούνιος ; else if (month==7) return Ιούλιος ; else if (month==8) return Αύγουστος ; else if (month==9) return Σεπτέμβριος ; else if (month==10) return Οκτώβριος ; else if (month==11) return Νοέμβριος ; else return Δεκέμβριος ; β) Μέθοδος που επιστρέφει αν ένα έτος είναι δίσεκτο: public static boolean isleapyear(int year) return ((year%4==0 && year%100!=0) year%400==0); γ) Μέθοδος που επιστρέφει τις ημέρες ενός μήνα: public static int daysinmonth(int month, int year) if (month==2) return (isleapyear(year)? 29:28; else if (month==4 month==6 month==9 month==11) return 30; else return 31; δ) Μέθοδος που επιστρέφει τι μέρα είναι η πρώτη ημέρα ενός μήνα: public static int firstday(int month, int year) int day=1; //η 1/1/1900 ήταν Δευτέρα η Κυρ. θα είναι η 0, //η Δευτ. η 1, η Τρίτη η 2,..., το Σαβ. η 6. // η πρώτη ημέρα του έτους year: for (int i=1900; i<year; i++) day = (day+365) % 7; if (isleapyear(i)) day = (day+1) % 7; // η πρώτη ημέρα του μήνα month του έτους year: for (int i=1; i<month; i++) 6
day = (day + daysinmonth(i, year)) % 7; return day; Πριν δούμε τις υπόλοιπες μεθόδους του προγράμματος, κάποια πράγματα για τη δομή των κλάσεων: Η δομή μιας Κλάσης: Επικεφαλίδα Πεδία (μεταβλητές, αντικείμενα) Μέθοδοι Οι μεταβλητές κλάσης ορίζονται έξω από τις μεθόδους και είναι προσπελάσιμες από όλες τις μεθόδους της κλάσης. - Αν η ορατότητά τους είναι public, τότε είναι προσπελάσιμες και από μεθόδους άλλων κλάσεων. - Αν η ορατότητά τους είναι private, τότε είναι προσπελάσιμες μόνο από τις μεθόδους της κλάσης τους. Τα ίδια περί ορατότητας (public / private) ισχύουν και για τις μεθόδους. Οι μεταβλητές κλάσης, για να μπορούν να προσπελαθούν από static μεθόδους, θα πρέπει να δηλωθούν κι αυτές σαν static. Δηλαδή, οι static μέθοδοι έχουν πρόσβαση μόνο σε static μεταβλητές. [Συνέχεια περί μεταβλητών κλάσεων και η συνέχεια του προγράμματος, την επόμενη εβδομάδα] 7