Εισαγωγή στις μεθόδους

Σχετικά έγγραφα
ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Περισσότερα για τις Κλάσεις, τα Αντικείμενα και τις Μεθόδους

Διάλεξη 4: Προγραμματισμός σε JAVA IΙ. Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Εισαγωγή στον Προγραμματισμό

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #2 ο : Ανατομία προγραμμάτων εφαρμογών, η

Η γλώσσα προγραμματισμού C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

Η γλώσσα προγραμματισμού C

Προγραμματισμός Συστημάτων

8. Μέθοδοι (Methods)

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 8/4/2008. Πίνακες (Arrays)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 6/12/07

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Γενικά (για τις γραπτές εξετάσεις)

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

Κλάσεις και Αντικείµενα

Εισαγωγή στον Προγραμματισμό

Διάλεξη 3: Προγραμματισμός σε JAVA I. Διδάσκων: Παναγιώτης Ανδρέου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 22/11/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Αντικειµενοστραφής Προγραµµατισµός

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 6 : ΠΙΝΑΚΕΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

Δομημένος Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java II

ΠΛΗΡΟΦΟΡΙΚΗ Ι JAVA Τμήμα θεωρίας με Α.Μ. σε 3, 7, 8 & 9 25/10/07

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

Αντικειµενοστρεφής Προγραµµατισµός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 7: Πίνακες (Arrays)

2.1. Εντολές Σχόλια Τύποι Δεδομένων

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Αντικειμενοστρεφής Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Προγραμματισμός Ι (ΗΥ120)

Η βασική συνάρτηση προγράμματος main()

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Στατικές μέθοδοι και μεταβλητές Εσωτερικές κλάσεις

Αντικειμενοστραφής Προγραμματισμός I(5 ο εξ) Εργαστήριο #4 ο : Αποσφαλμάτωση (debugging), μετατροπές

Το πρόγραμμα HelloWorld.java. HelloWorld. Κλάσεις και Αντικείμενα (2) Ορισμός μιας Κλάσης (1) Παύλος Εφραιμίδης pefraimi <at> ee.duth.

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 4 : CLASSES

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #2

Εισαγωγή στη γλώσσα προγραμματισμού JAVA. Δομές Δεδομένων Διδάσκων: Π.Α. Μήτκας Τομέας Ηλεκτρονικής και Υπολογιστών

Εισαγωγή στη JAVA. Εισαγωγή στη Java. Η Java είναι δημιούργημα της SUN MICROSYSTEMS.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Θέματα Προγραμματισμού Η/Υ

Αντικειμενοστρεφής Προγραμματισμός

2 Ορισμός Κλάσεων. Παράδειγμα: Μηχανή για Εισιτήρια. Δομή μιας Κλάσης. Ο Σκελετός της Κλάσης για τη Μηχανή. Ορισμός Πεδίων 4/3/2008

Εργαστήριο 2: Πίνακες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Μαθήματα από τα εργαστήρια

I (JAVA) Ονοματεπώνυμο: Α. Μ.: Δώστε τις απαντήσεις σας ΕΔΩ: Απαντήσεις στις σελίδες των ερωτήσεων ΔΕΝ θα ληφθούν υπ όψην.

Γ7.5 Αλγόριθμοι Αναζήτησης. Γ Λυκείου Κατεύθυνσης

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Προγραμματισμός Η/Υ. Ενότητα 8: Ειδικά Θέματα Αλγορίθμων

Διάλεξη 5: Κλάσεις και Αντικείμενα. Διδάσκων: Παναγιώτης Ανδρέου

Δομημένος Προγραμματισμός (ΤΛ1006)

Εισαγωγή στον Προγραµµατισµό. Πανεπιστήµιο Θεσσαλίας Τµήµα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

Διάλεξη 04: Παραδείγματα Ανάλυσης

Δομές Δεδομένων & Αλγόριθμοι

Βασικά της γλώσσας JAVA

Διάλεξη 9η: Πίνακες (arrays)

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Διάλεξη 04: Παραδείγματα Ανάλυσης Πολυπλοκότητας/Ανάλυση Αναδρομικών Αλγόριθμων

2.1 Αντικειµενοστρεφής προγραµµατισµός

Βασικά Στοιχεία της Java

ΕΠΛ231 Δομές Δεδομένων και Αλγόριθμοι 4. Παραδείγματα Ανάλυσης Πολυπλοκότητας Ανάλυση Αναδρομικών Αλγόριθμων

Δομές Δεδομένων (Εργ.) Ακ. Έτος Διδάσκων: Ευάγγελος Σπύρου. Εργαστήριο 3 Επανάληψη Γ μέρος

ΑΤΕΙ ΘΕΣΣΑΛΟΝΙΚΗΣ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ ΠΛΗΡΟΦΟΡΙΚΗΣ Αλγοριθμική και Προγραμματισμός. Παναγιώτης Σφέτσος

Λογισµικό (Software SW) Γλώσσες

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα ως ορίσματα Εισαγωγή στις αναφορές

Αντικείµενα. ηµιουργία και χρησιµοποίηση αντικειµένων. ηµιουργία αντικειµένων

3 Αλληλεπίδραση Αντικειμένων

Βασικά Στοιχεία της Java

Τύποι Δεδομένων και Απλές Δομές Δεδομένων. Παύλος Εφραιμίδης V1.0 ( )

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και αντικείμενα στην Java Strings Πίνακες

2 ΓΡΑΜΜΙΚΕΣ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΠΑΡΑΡΤΗΜΑ: QUIZ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός μνήμης Αντικείμενα παράμετροι String Interning

Οντοκεντρικός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπάρχουσες κλάσεις και αντικείμενα στην Java Strings Wrapper Classes Δομές

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Ηβασικήσυνάρτηση προγράμματος main()

Εισαγωγή στον Προγραµµατισµό, Αντώνιος Συµβώνης, ΣΕΜΦΕ, ΕΜΠ,, Slide 6

Υπερφόρτωση Μεθόδων και Πέρασμα Ορισμάτων

Διαδικασιακός Προγραμματισμός

Transcript:

Αντικειμενοστραφής Προγραμματισμός I (5 ο εξ) Διάλεξη #5 η : Μέθοδοι (methods), Πίνακες (arrays), Πίνακες αντικειμένων Γαβαλάς Δαμιανός dgavalas@aegean.gr Εισαγωγή στις μεθόδους Μια μέθοδος είναι μια συλλογή από δηλώσεις που αποτελούν μια ενότητα και πραγματοποιούν συνολικά μια συγκεκριμένη λειτουργία Τροποποιητές (modifiers) Επικεφαλίδα μεθόδου O ρισμός μεθόδου Τύπος επιστρεφόμενης τιμής Όνομα μεθόδου παράμετροι public static int max(int num1, int num2) { Κλήση μεθόδου int z = max(x, y); int result; Σώμα Πραγματικοί μεθόδο υ Λίστα παραμέτρων παράμετροι if (num1 > num2) (arguments) result = num1; else result = num2; Επιστρεφόμενη τιμή return result; 1

Εισαγωγή στις μεθόδους Η υπογραφή μιας μεθόδου (method signature) είναι ο συνδυασμός μιας μεθόδου και της λίστας των παραμέτρων Οι μεταβλητές που ορίζονται στην επικεφαλίδα της μεθόδου είναι γνωστές ως επίσημες παράμετροι (formal parameters) Όταν καλείται μια μέθοδος, περνάει μια τιμή στην παράμετρο. Αυτή η τιμή αναφέρεται ως πραγματική παράμετρος (actual parameter ή argument). Εισαγωγή στις μεθόδους Μία μέθοδος μπορεί να επιστρέφει μια τιμή. Αν όντως επιστρέφει τιμή πρέπει να δηλωθεί (στην υπογραφή της μεθόδου) ο τύπος της τιμής που επιστρέφεται Αν δεν επιστρέφει κάποια τιμή τότε δηλώνεται ως τύπος επιστροφής ο void. Για παράδειγμα ο τύπος επιστροφής της main μεθόδου είναι void. 2

Κλήση μεθόδων Περνάει η τιμή το υ i Περνάει η τιμή του j public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Προσοχή! Κάθε μη void μέθοδος απαιτείται να συμπεριλαμβάνει μια δήλωση return. Η ακόλουθη μέθοδος είναι λογικά σωστή, αλλά ωστόσο θα βγάλει λάθος μεταγλώττισης, επειδή ο Java compiler θεωρεί πιθανό να μην επιστραφεί κάποια τιμή από αυτή τη μέθοδο. public static int sign(int n) { if (n > 0) return 1; else if (n == 0) return 0; else if (n < 0) return 1; Για να λυθεί το πρόβλημα αφαιρέστε το if (n<0) 3

Επανάχρηση μεθόδων άλλων κλάσεων Σημείωση: ένα από τα πλεονεκτήματα των μεθόδων είναι η δυνατότητα επανάχρησής τους (δηλαδή επανάχρησης κώδικα). Η μέθοδος max μπορεί να κληθεί από οποιαδήποτε κλάση εκτός της κλάσης TestMax στην οποία ανήκει. Αν δημιουργήστε μια νέα κλάση Test, μπορείτε να καλέσετε την max μέθοδο ως εξής: ClassName.methodName (π.χ., TestMax.max) Στοίβες κλήσεων (Call Stacks) Χώρος που απαιτείται για τη μέθοδο main k: j: 2 i: 5 Χώρος που απαιτείται γι α τη μέθοδοmax result: 5 num2: 2 num1: 5 Χώρος που απαιτείται για τη μέθοδο main k: j: 2 i: 5 Χώρος που απ αιτείται για τη μέθοδο main k: 5 j: 2 i: 5 H στοίβα αδειάζει Καλείται η μέθοδος main Καλείται η μέθοδος max Η μέθοδος max έχει τελειώσει και η επ ιστρεφόμενη τιμή εκ χωρείται στην k Η μέθοδος main έχει τελειώσει 4

Στοίβες κλήσεων (call stacks): παράδειγμα Ορίζεται και αρχικοποιείται το i public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Καλείται η main μέθοδος i5 i: Στοίβες κλήσεων (call stacks): παράδειγμα Ορίζεται και αρχικοποιείται το j public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Καλείται η main μέθοδος j: 2 i5 i: 5

Στοίβες κλήσεων (call stacks): παράδειγμα Ορισμός του k public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Χώ ρος που απαιτείται για τη μέθοδο main k: j: 2 i5 i: Καλείται η main μέθοδος Στοίβες κλήσεων (call stacks): παράδειγμα Κλήση της max(i, j) public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Χώ ρος που απαιτείται για τη μέθοδο main k: j: 2 i5 i: Καλείται η main μέθοδος 6

Στοίβες κλήσεων (call stacks): παράδειγμα Πέρασμα των τιμών των i και j στα num1 και num2 public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; num2: 2 num1: 5 Χώρος που απαιτείται για τη μέθοδο main k: j: 2 i: 5 Καλείται η main μέθοδος Στοίβες κλήσεων (call stacks): παράδειγμα Πέρασμα των τιμών των i και j στα num1 και num2 public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; result: num2: 2 num1: 5 Χώρος που απαιτείται για τη μέθοδο main k: j: 2 i: 5 Καλείται η main μέθοδος 7

Στοίβες κλήσεων (call stacks): παράδειγμα (num1 > num2) είναι true public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; result: num2: 2 num1: 5 Χώρος που απαιτείται για τη μέθοδο main k: j: 2 i: 5 Καλείται η main μέθοδος Στοίβες κλήσεων (call stacks): παράδειγμα Εκχώρηση του num1 στο result public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Space required for the max method result: 5 num2: 2 num1: 5 Χώρος που απαιτείται για τη μέθοδο main k: j: 2 i: 5 Καλείται η main μέθοδος 8

Στοίβες κλήσεων (call stacks): παράδειγμα Επέστρεψε το result και εκχώρησέ το στο k public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Space required for the max method result: 5 num2: 2 num1: 5 Χώρος που απαιτείται για τη μέθοδο main k:5 j: 2 i: 5 Καλείται η main μέθοδος Στοίβες κλήσεων (call stacks): παράδειγμα public static void main(string[] args) { int i = 5; int j = 2; int k = max(i, j); System.out.println( "The maximum between " + i + " and " + j + " is " + k); public static int max(int num1, int num2) { int result; if (num1 > num2) result = num1; else result = num2; return result; Εκτέλεση της δήλωσης print Χώ ρος που απαιτείται για τη μέθοδο main k:5 j: 2 i5 i: Καλείται η main μέθοδος 9

Περνώντας παραμέτρους public static void nprintln(string message, int n) { for (int i = 0; i < n; i++) System.out.println(message); Ας υποθέσουμε ότι καλείτε την παραπάνω μέθοδο ως εξής: nprintln( Welcome to Java, 5); Ποιο θα είναι το output; Ας υποθέσουμε ότι καλείτε λί την παραπάνω μέθοδο έθδ ως εξής: nprintln( Computer Science, 15); Ποιο θα είναι το output; Περνώντας παραμέτρους ως τιμή (Pass by Value) public static void main(string[] args) { int num = 1; System.out.println("Πριν την changevalue num=" + num); changevalue(num); System.out.println("Μετά την changevalue num=" + num); public static void changevalue(int n) { System.out.println("\tΜέσα στην changevalue μέθοδο"); System.out.println("\t\tΠριν αλλάξω τιμή n=" + n); n = 100; System.out.println("\t\tΑφού αλλάξω τιμή n=" + n); 10

Περνώντας παραμέτρους ως τιμή (Pass by Value) Πριν την changevalue num=1 Μέσα στην changevalue μέθοδο Πριν αλλάξω τιμή n=1 Αφού αλλάξω τιμή n=100 Μετά την changevalue num=1 Η τιμή της num περνιέται στη n. Η εκτέλεση της changevalue δε ν επηρεάζει τη num Τι τυπώνει το πρόγραμμα Χώρος που απαιτείται για την changevalue n: 1000 Χώ ρος που απαιτείται για τη main num: 1 Χώρος που απαιτείται γι α τη main num: 1 Χώρος που απαιτείται για τη main num: 1 Η στοίβα είναι άδεια \Κλήσ η της main Κλήση της changevalue Η changevalue τελείωσε Η main τελείωσε Πεδίο ή φάσμα (scope) των τοπικών μεταβλητών Τοπική μεταβλητή: μια μεταβλητή που ορίζεται μέσα σε μια μέθοδο Πεδίο (scope): το μέρος του προγράμματος όπου μπορεί να αναφερθεί η μεταβλητή Το πεδίο μιας τοπικής μεταβλητής αρχίζει από το σημείο της δήλωσή της και ολοκληρώνεται στο τέλος της ενότητας (block) που περιέχει τη μεταβλητή. Μια τοπική μεταβλητή πρέπει, φυσικά, να δηλωθεί πριν χρησιμοποιηθεί η 11

Πεδίο των τοπικών μεταβλητών Μπορείτε να ορίσετε μια τοπική μεταβλητή με το ίδιο όνομα πολλαπλές φορές σε διαφορετικά (μη επικαλυπτόμενα) blocks σε μία μέθοδο, αλλά δεν μπορείτε να ορίσετε μια τοπική μεταβλητή δύο φορές σε φωλιασμένα (nested) blocks. Πεδίο των τοπικών μεταβλητών Το πεδίο μιας μεταβλητής που ορίζεται στην επικεφαλίδα ενός βρόγχου for εκτείνεται σε ολόκληρο το βρόγχο. Αν όμως ορίζεται μέσα στο σώμα του βρόγχου for, τότε το πεδίο της περιορίζεται από το σημείο της δήλωσής της μέχρι το τέλος του block που περιέχει τη μεταβλητή. Το πεδίο της i Το πεδίο της j public static void method1() {.. for (int i = 1; i < 10; i++) {.. int j;... 12

Πεδίο των τοπικών μεταβλητών Είναι ΟΚ να δηλώσεις το i σε δύο μη επ ικαλυπτόμενα blocks public static void method1() { int x = 1; int y = 1; for (int i = 1; i < 10; i++) { x += i; for (int i = 1; i < 10; i++) { y += i; Είναι λάθος να δηλώσεις το i σε δύο μη επικαλυπτόμενα blocks public static void method2() { int i = 1; int sum = 0; for (int i = 1; i < 10; i++) sum += i; Πεδίο των τοπικών μεταβλητών // Εκτελείται χωρίς λάθη public static void correctmethod() { int x = 1; int y = 1; // δηλώνεται το i for (int i = 1; i < 10; i++) { x += i; // το i δηλώνεται ξανά for (int i = 1; i < 10; i++) { y += i; 13

Πεδίο των τοπικών μεταβλητών // ποιο λάθος υπάρχει εδώ;;;; public static void incorrectmethod() { int x = 1; int y = 1; for (int i = 1; i < 10; i++) { int x = 0; x += i; Η αφαίρεση (abstraction) στις μεθόδους Μπορείτε να σκεφτείτε το σώμα των μεθόδων ως ένα «μαύρο κουτί» που περιέχει την αναλυτική υλοποίηση της μεθόδου Προαιρετικά ορίσ ματα για Input Προαιρετική επιστροφή τιμής Υπογραφή μεθόδου Σώμα μεθόδου Μαύρο κουτί 14

Πλεονεκτήματα των μεθόδων Γράφετε μια μέθοδο μια φορά και την επαναχρησιμοποιείτε οπουδήποτε Κρύψιμο πληροφορίας: Κρύβεται η υλοποίηση από το χρήστη Μείωση πολυπλοκότητας Η κλάση Math Σταθερές της κλάσης: PI E Μέθοδοι της κλάσης: Μέθοδοι Τριγωνομετρίας Μέθοδοι για ύψωση σε δύναμη Μέθοδοι στρογγυλοποίησης Μέθοδοι min, max, abs, και random 15

Μέθοδοι Τριγωνομετρίας sin(double a) cos(double a) tan(double a) acos(double a) asin(double a) Παραδείγματα: Math.sin(0) επιστρέφει 0.0 Math.sin(Math.PI / 6) επιστρέφει 0.5 Math.sin(Math.PI / 2) επιστρέφει 1.0 Math.cos(0) επιστρέφει 1.0 atan(double a) Math.cos(Math.PI / 6) επιστρέφει 0.866 Math.cos(Math.PI / 2) επιστρέφει 0 Μέθοδοι για ύψωση σε δύναμη exp(double a) Επιστρέφει το e υψωμένο στην a. log(double a) Επιστρέφει το φυσικό λογάριθμο του a. log10(double a) Επιστρέφει το δεκαδικό λογάριθμο του a. pow(double a, double b) Επιστρέφει το a υψωμένο στη δύναμη του b. sqrt(double a) Επιστρέφει την τετραγωνική ρίζα του a. Παραδείγματα: Math.exp(1) επιστρέφει 2.71 Math.log(2.71) επιστρέφει 1.0 Math.pow(2, 3) επιστρέφει 8.0 Math.pow(3, 2) επιστρέφει 9.0 Math.pow(3.5, 2.5) επιστρέφει 22.91765 Math.sqrt(4) επιστρέφει 2.0 Math.sqrt(10.5) επιστρέφει 3.24 16

Μέθοδοι στρογγυλοποίησης double ceil(double x) Το x στρογγυλοποιείται προς τα πάνω στον πλησιέστερο ακέραιο. Αυτός ςο ακέραιος επιστρέφεται ως τιμή double. double floor(double x) Το x στρογγυλοποιείται προς τα κάτω στον πλησιέστερο ακέραιο. Αυτός ο ακέραιος επιστρέφεται ως τιμή double. double rint(double x) Το x στρογγυλοποιείται στον πλησιέστερο ακέραιο. Αν ο x βρίσκεται ανάμεσα σε δύο ακεραίους, τότε επιστρέφεται ο άρτιος ακέραιος ως double. int round(float x) Επιστρέφει το (int)math.floor(x+0.5). long round(double x) Επιστρέφει το (long)math.floor(x+0.5). Παραδείγματα μεθόδων στρογγυλοποίησης Math.ceil(2.1) επιστρέφει 3.0 Math.ceil(2.0) returns 2.0 Math.ceil(-2.0) επιστρέφει 2.0 Math.ceil(-2.1) επιστρέφει -2.0 Math.floor(2.1) επιστρέφει 2.0 Math.floor(2.0) επιστρέφει 2.0 Math.floor(-2.0) επιστρέφει 2.0 Math.floor(-2.1) επιστρέφει -3.0 Math.rint(2.1) επιστρέφει 2.0 Math.rint(2.0) επιστρέφει 2.0 Math.rint(-2.0) επιστρέφει 2.0 Math.rint(-2.1) επιστρέφει -2.0 Math.rint(2.5) επιστρέφει 2.0 Math.rint(-2.5) επιστρέφει -2.0 Math.round(2.6f) επιστρέφει 3 Math.round(2.0) επιστρέφει 2 Math.round(-2.0f) επιστρέφει -2 Math.round(-2.6) επιστρέφει -3 17

min, max και abs max(a, b)και min(a, b) Επιστρέφουν το μέγιστο/ελάχιστο των δύο παραμέτρων abs(a) Επιστρέφει την απόλυτη τιμή της παραμέτρου random() Επιστρέφει μια τυχαία double τιμή στο εύρος [0.0, 1.0). Παραδείγματα: Math.max(2, 3) επιστρέφει 3 Math.max(2.5, 3) επιστρέφει 3.0 Math.min(2.5, 3.6) επιστρέφει 2.5 Math.abs(-2) επιστρέφει 2 Math.abs(-2.1) επιστρέφει 2.1 Η μέθοδος Math.random Δημιουργεί μια τυχαία double τιμή μεγαλύτερη ή ίση του 0.0 και μικρότερη του 1.0 (0 <= Math.random() < 1.0). Παραδείγματα: (int)(math.random() * 10) 50 + (int)(math.random() * 50) Επιστρέφει έναν τυχαίο ακέραιο μεταξύ 0 και 9 Επιστρέφει έναν τυχαίο ακέραιο μεταξύ 50 και 99 Γενικά, a + Math.random() * b Επιστρέφει έναν τυχαίο ακέραιο μεταξύ a και a + b, μη συμπεριλαμβανομένου του a + b. 18

Δείτε το manual της java.lang.math online Μπορείτε να δείτε το ολοκληρωμένο manual (τεκμηρίωση) της κλάσης Math online: http://download.oracle.c om/javase/6/docs/api/i ndex.html. Αυτού του είδους τα manuals ονομάζονται Javadocs Παράδειγμα: Δημιουργία τυχαίων χαρακτήρων Ένα πρόγραμμα μπορεί να επεξεργαστεί τόσο αριθμούς όσο και χαρακτήρες. Κάθε Unicode χαρακτήρας έχει μια μοναδική αριθμητική αναπαράσταση μεταξύ 0 και FFFF σε δεκαεξαδικό (65535 σε δεκαδικό). Άρα, για τη δημιουργία ενός τυχαίου χαρακτήρα αρκεί να δημιουργήσουμε έναν τυχαίο ακέραιο μεταξύ 0 και 65535 χρησιμοποιώντας την ακόλουθη έκφραση: (σημειώστε ότι καθώς 0 <= Math.random() < 1.0, πρέπει να προσθέσουμε το 1 στο 65535.) (int)(math.random() * (65535 + 1)) 19

Παράδειγμα: Δημιουργία τυχαίων χαρακτήρων Ας υποθέσουμε τώρα ότι θέλουμε να δημιουργήσουμε έναν τυχαίο πεζό χαρακτήρα. Οι Unicode αναπαραστάσεις για τα πεζά γράμματα είναι συνεχόμενοι ακέραιοι που αρχίζουν από τη Unicode αναπαράσταση του 'a', έπειτα του 'b', 'c',..., και 'z'. Η Unicode αναπαράσταση του 'a' είναι (int)'a' Άρα, ο τυχαίος ακέραιος μεταξύ (int)'a' και (int)'z' είναι (int)((int)'a' + Math.random() * ((int)'z' (int)'a' + 1) Άσκηση για το σπίτι: PrintCalender Όταν γράφουμε μεγάλα προγράμματα, χρησιμοποιούμε στρατηγική διαίρει και βασίλευε, για να αποδομηθεί σε υποπροβλήματα. Τα υποπροβλήματα μπορούν να αποδομηθούν περαιτέρω σε μικρότερα, πιο διαχειρήσιμα ιμα προβλήματα. Βάλτε αυτή τη στρατηγική σε εφαρμογή σε μια εφαρμογή PrintCalendar 20

Άσκηση για το σπίτι: Διάγραμμα σχεδιασμού της PrintCalendar Κάθε κόμβος στο διάγραμμα αντιστοιχεί σε μία μέθοδο printcalendar (main) readinput printmonth printmonthtitle getmonthname printmonthbody getstartday gettotalnumofdays getnumofdaysinmonth isleapyear Πακέτα (Packages) Υπάρχουν τρεις λόγοι για να χρησιμοποιείτε πακέτα: 1. Για την αποφυγή συγκρούσεων ονομάτων (naming conflicts). Όταν αναπτύσσετε επαναχρησιμοποιήσιμες κλάσεις για να τις ςμοιραστείτε με άλλους προγραμματιστές, είναι ενδεχόμενο να συμβούν να ορίσετε μια κλάση δίνοντάς της το ίδιο όνομα με κλάση που χρησιμοποιεί κάποιος άλλος. Αυτό αποφεύγεται αν τοποθετήσετε τις κλάσεις σε πακέτα ώστε οι αναφορές σε αυτές μα είναι μέσω των ονομάτων πακέτων 2. Για να διανέμουμε software με ένα βολικό τρόπο. Τα πακέτα ομαδοποιούν σχετιζόμενες κλάσεις ώστε να μπορούν εύκολα να ομαδοποιηθούν. 3. Για να προστατευθούν κάποιες κλάσεις. Τα πακέτα παρέχουν προστασία ώστε τα protected μέλη των κλάσεων να είναι προσβάσιμα από άλλες κλάσεις στο ίδιο πακέτο αλλά όχι από «εξωτερικές» κλάσεις. 21

Συμβάσεις στην ονοματοδοσία πακέτων Τα πακέτα είναι ιεραρχικά, μπορούμε δηλαδή να έχουμε πακέτα μέσα σε πακέτα. π.χ. το java.lang.math δηλώνει ότι η κλάση Math είναι μια κλάση στο πακέτο lang και ότι το lang είναι ένα πακέτο μέσα στο πακέτο java. Τα επίπεδα φωλιάσματος εξασφαλίζουν μοναδικότητα στα ονόματα των πακέτων. Η επιλογή μοναδικών ονομάτων πακέτων είναι σημαντική καθώς το πακέτο σας μπορεί να χρησιμοποιείται από άλλους προγραμματιστές, και αντίστροφα. Γενικά, συνίσταται να χρησιμοποιείτε το Internet όνομα περιοχής σας σε ανάστροφη σειρά ως πρόθεμα των πακέτων σας (π.χ. aegean.ct). Καθώς τα ονόματα περιοχής στο Internet είναι μοναδικά, αυτή η μέθοδος αποκλείει συγκρούσεις ονομάτων Για το πακέτο aegean.ct.mypackage, πρέπει να δημιουργήστε ένα φάκελο, όπως φαίνεται στην εικόνα. Δηλαδή, το πακέτο είναι στην πραγματικότητα ένας φάκελος που περιέχει το bytecode των κλάσεων (*.class αρχεία). aegean.ct.mypackage Βάζοντας κλάσεις σε πακέτα Κάθε κλάση στη Java ανήκει σε ένα πακέτο. Για να προστεθεί μία κλάση TestClass στο πακέτο aegean.ct.mypackage πρέπει: To αρχείο (bytecode) TestClass.class να αποθηκευθεί στον φάκελο C:\..\...\aegean\ct\mypackage\ Να προστεθεί η ακόλουθη γραμμή κώδικα ως πρώτη δήλωση στον κώδικα της TestClass: inport aegean.ct.mypackage.*; 22

Χρησιμοποιώντας κλάσεις που ανήκουν σε κάποια πακέτα Υπάρχουν δύο τρόποι για να χρησιμοποιήστε σε ένα πρόγραμμα μια κλάση που ανήκει σε κάποιο πακέτο 1. Ένας τρόπος είναι να χρησιμοποιήσετε το πλήρες όνομα της κλάσης π.χ., το πλήρες όνομα της JOptionPane είναι javax.swing.joptionpane, περιλαμβάνει δηλαδή και το πακέτο στο οποίο ανήκει. Αυτός ο τρόπος μπορεί να είναι βολικός εφόσον η κλάση χρησιμοποιείται λίγες φορές μέσα στο πρόγραμμα 2. Ο άλλος τρόπος είναι να χρησιμοποιηθεί η δήλωση import. Π.χ. για να εισάγετε (δηλαδή για να μπορείτε να χρησιμοποιήσετε όλες τις κλάσεις του πακέτου javax.swing γράφετε: import javax.swing.*; Μπορείτε ωστόσο να εισάγετε και μια συγκεκριμένη κλάση, π.χ. γράφοντας: import javax.swing.joptionpane; Η πληροφορία των κλάσεων ενός εισαχθέντος πακέτου δεν διαβάζεται κατά τη μεταγλώττιση ούτε και κατά την εκτέλεση, παρά μόνο όταν η κλάση χρησιμοποιηθεί πραγματικά στο πρόγραμμα. Η δήλωση import απλά λέει στο μεταγλωττιστή που θα βρει τις κλάσεις Εισαγωγή στους πίνακες (Arrays) Οι πίνακες είναι δομές δεδομένων που αναπαριστούν μια συλλογή από δεδομένα του ίδιου τύπου double[] mylist = new double[10]; mylist αναφορά mylist[0] mylist[1] 5.6 4.5 Μεταβλητή αναφοράς στον πίνακα mylist[2] mylist[3] 3.3 13.2 Στοιχείο του πίνακα στη θέση 5 mylist[4] mylist[5] mylist[6] mylist[7] mylist[8] mylist[9] 4 34.33 34 45.45 99.993 11123 Τιμή στοιχείου 23

Ορισμός και δημιουργία πινάκων datatype[] arrayrefvar; Παράδειγμα: double[] mylist; Δημιουργία πίνακα: arrayrefvar = new datatype[arraysize]; Παράδειγμα: mylist = new double[10]; mylist[0] references the first element in the array. mylist[9] references the last element in the array Ορισμός και δημιουργία πίνακα σε ένα βήμα: double mylist = new double[10]; Το μήκος (ή μέγεθος) ενός πίνακα Από τη στιγμή της δημιουργίας του, το μήκος ενός πίνακα είναι καθορισμένο και δεν αλλάζει. Μπορείτε να το δείτε χρησιμοποιώντας την ιδιότητα length arrayrefvar.length Για παράδειγμα, mylist.length επιστρέφει 10 24

Οι μεταβλητές καταλόγου (indexed variables) Τα στοιχεία του πίνακα προσπελαύνονται μέσω της θέσης τους (index). Η αρίθμηση των θέσεων αρχίζει από το 0. Κάθε στοιχείο του πίνακα αναπαρίσταται χρησιμοποιώντας τη σύνταξη, γνωστή και ως μεταβλητή καταλόγου (indexed variable): arrayrefvar[index]; Μετά τη δημιουργία του πίνακα, μία μεταβλητή καταλόγου χρησιμοποιείται όπως και οποιαδήποτε άλλη μεταβλητή, π.χ.: mylist[2] = mylist[0] + mylist[1]; Ορισμός, δημιουργία και αρχικοποίηση πινάκων double[] mylist = {1.9, 2.9, 3.4, 3.5; Η αρχικοποίηση μπορεί να γίνει και σε πολλά βήματα: double[] mylist = new double[4]; mylist[0] = 1.9; mylist[1] = 2.9; mylist[2] = 3.4; mylist[3] = 3.5; 25

Παράδειγμα χρήσης πινάκων public class Test { public static void main(string[] args) { int[] values = new int[5]; for (int i = 1; i< 5; i++) { values[i] = i+ values[i 1]; values[0] = values[1] + values[4]; 1 Μετά τη δημιουργία του πίνακα 0 1 2 3 4 0 0 0 0 0 Στο τέλος της εκτέλεσης του προγράμματος 0 11 2 3 4 1 3 6 10 Παρακολουθώντας τις τιμές των στοιχείων ενός πίνακα στον Debugger του NetBeans 26

Αντιγραφή πινάκων Συχνά, σε ένα πρόγραμμα, χρειάζεται να αντιγράψετε έναν πίνακα x (ή μέρος ενός πίνακα x) σε κάποιον άλλο πίνακα y. H χρησιμοποίηση της δήλωσης εκχώρησης (π.χ. list2 = list1) έχει ως αποτέλεσμα οι δύο μεταβλητές αναφοράς των πινάκων να «δείχνουν» πλέον προς τα στοιχεία του ενός πίνακα. Τα στοιχεία του άλλου πίνακα θα διαγραφούν από τη μνήμη (garbage collection) Μετά την εκχώρηση, οποιαδήποτε αλλαγή στα στοιχεία του ενός πίνακα θα επηρεάσει και τον άλλο Πριν την εκχώρηση list2 = list1; list1 list2 Στοιχεία list1 Στοιχεία list2 Μετά την εκχώρηση list2 = list1; list1 list2 Σκουπίδια (θα διαγραφεί) Στοιχεία list1 Στοιχεία list2 Αντιγραφή πινάκων Αντιγραφή πινάκων, διατηρώντας δύο «ανεξάρτητους» πίνακες (χωρίς εκχώρηση) 1. Με χρήση βρόγχου: int[] sourcearray = {2, 3, 1, 5, 10; int[] targetarray = new int[sourcearray.length]; for (int i = 0; i < sourcearrays.length; i++) targetarray[i] = sourcearray[i]; 2. Με χρήση της μεθόδου arraycopy της κλάσης System: arraycopy(sourcearray, src_pos, targetarray, tar_pos, length); π.χ.,system.arraycopy(sourcearray,0, targetarray, 0, sourcearray.length); 27

Περνώντας πίνακες σε μεθόδους public static void printarray(int[] myarray) { for (int i = 0; i < myarray.length; i++) { System.out.print(myarray[i] + " "); Τι αποτέλεσμα θα έχει η παρακάτω κλήση της μεθόδου; ; int[] list = {3, 1, 2, 6, 4, 2; printarray(list); Pass by Value ή Pass by Reference;; Άλλες γλώσσες προγραμματισμού επιτρέπουν, όταν περνάς παραμέτρους σε μεθόδους, να δείχνεις κατά θέλεις τα δεδομένα των παραμέτρων αυτών να παραμείνουν αμετάβλητα μετά την κλήση της μεθόδου (pass by value) b l ή να μεταβληθούν (pass by reference) Στη Java, αυτή η επιλογή δεν υπάρχει. Αυτό που πρέπει να θυμόμαστε ως κανόνα είναι το εξής: Όταν περνάμε μια παράμετρο πρωτογενούς τύπου (π.χ. int, double, char, String, κλπ) τότε γίνεται pass by value (η τιμή τους θα μείνει ίδια μετά την κλήση της μεθόδου) ) Όταν περνάμε ως παράμετρο οποιοδήποτε αντικείμενο (π.χ. ένα αντικείμενο της κλάσης Circle ή ένα array), τότε γίνεται pass by reference (η τιμή τους θα έχει μεταβληθεί μετά την κλήση της μεθόδου) 28

Pass by Value ή Pass by Reference;; public static void main(string[] args) { int i = 10; int[] myarray = {4, 7, 90; String s = "this is before"; Circle circle = new Circle(10); System.out.println("i=" + i + ", myarray" + Arrays.toString(myArray) + ", s=" + s + ", Circle radius=" + circle.getradius()); test(i, myarray, s, circle); System.out.println("i=" + i + ", myarray" + Arrays.toString(myArray) + ", s=" + s + ", Circle radius=" + circle.getradius()); Pass by Value ή Pass by Reference;; public static void test (int j, int[] newarr, String str, Circle c) { j = 1000; newarr [0] = 1000; str = "this is after"; c.setradius(200); Τι θα τυπωθεί; i=10, myarray[4, 7, 90], s=this is before, Circle radius=10.0 i=10, myarray[1000, 7, 90], s=this is before, Circle radius=200.0 Δηλαδή τα i, s έμειναν αμετάβλητα ενώ το array και το αντικείμενο της Circle τροποποιήθηκαν 29

Παράδειγμα επιστροφής ενός πίνακα από μια μέθοδο public static int[] reverse(int[] list) { int[] result = new int[list.length]; for (int i = 0, j = result.length - 1; i < list.length; i++, j--) { result[j] = list[i]; return result; Κλήση της μεθόδου (ποια θα είναι τα περιεχόμενα του πίνακα list2 μετά την κλήση;) int[] list1 = new int[]{1, 2, 3, 4, 5, 6; int[] list2 = reverse(list1); Αναζήτηση σε πίνακες Η αναζήτηση είναι η διαδικασία εξέτασης του πίνακα για το κατά πόσο περιέχει ένα συγκεκριμένο στοιχείο Η αναζήτηση είναι συνηθισμένη πράξη στον προγραμματισμό. Υπάρχουν πολλοί αλγόριθμοι που αφιερώνονται στην αναζήτηση Εδώ εξετάζονται η γραμμική (linear) και δυαδική (binary) αναζήτηση. public class LinearSearch { /** The method for finding a key in the list */ public static int linearsearch(int[] list, int key) { for (int i = 0; i < list.length; i++) if (key == list[i]) [0] [1] [2] return i; list return -1; key Σύγκρινε το keyμε το list[i] για i = 0, 1, 30

Γραμμική αναζήτηση Η γραμμική αναζήτηση συγκρίνει την τιμή που αναζητείται (key) σειριακά με κάθε στοιχείο στον πίνακα. Η μέθοδος συνεχίζει μέχρι να βρεθεί στοιχείο όμοιο με το key ή να εξαντληθεί ο πίνακας. Αν το key βρεθεί τότε επιστρέφεται η θέση (index) του στοιχείου στον πίνακα. Αν δε βρεθεί, επιστρέφεται η τιμή 1. int[] list = {1, 4, 4, 2, 5, -3, 6, 2; int i = linearsearch(list, 4); // returns 1 int j = linearsearch(list, -4); // returns -1 Δυαδική αναζήτηση Για να λειτουργήσει η δυαδική αναζήτηση, τα στοιχεία του πίνακα πρέπει να είναι ταξινομημένα (συνήθως, θεωρούμε σε αύξουσα σειρά) π.χ., 2 4 7 10 11 45 50 59 60 66 69 70 79 Η δυαδική αναζήτηση πρώτα συγκρίνει το key με το μεσαίο στοιχείο του πίνακα Αν το κλειδί είναι μικρότερο από το μεσαίο στοιχείο τότε αρκεί να περιορίσεις την αναζήτηση στο πρώτο μισό του πίνακα. Αν το κλειδί είναι ίσο με το μεσαίο στοιχείο τότε η αναζήτηση τελειώνει. Αν το κλειδί είναι μεγαλύτερο από το μεσαίο στοιχείο τότε αρκεί να περιορίσεις την αναζήτηση στο δεύτερο μισό του πίνακα. 31

Δυαδική αναζήτηση Key Πίνακας 8 8 8 1 2 3 4 6 7 8 9 1 2 3 4 6 7 8 9 1 2 3 4 6 7 8 9 Υλοποίηση δυαδικής αναζήτησης public static int binarysearch(int[] list, int key) { int low = 0; int high = list.length - 1; while (high >= low) { int mid = (low + high) / 2; if (key < list[mid]) high = mid - 1; else if (key == list[mid]) return mid; else low = mid + 1; return -1 - low; 32

Μέθοδοι της κλάσης java.util.arrays H κλάση java.util.arrays προσφέρει χρήσιμη λειτουργικότητα που αφορά τη χρήση και επεξεργασία πινάκων, αν π.χ. έχουμε τον πίνακα ακεραίων a: Ταξινόμηση Arrays.sort(a); // ταξινομεί τα στοιχεία του a σε αύξουσα σειρά (χρησιμοποιεί την quicksort) Δυαδική αναζήτηση int pos = Arrays.binarySearch(a, 5); // Επιστρέφει τη θέση του 5 στο a Αντιγραφή int[] b = Arrays.copyOf(a, num); // το b θα είναι αντίγραφο του a με μήκος num Ορισμός και δημιουργία 2 διάστατων πινάκων int[][] matrix = new int[10][10]; matrix[0][0] = 3; for (int i = 0; i < matrix.length; i++) for (int j = 0; j < matrix[i].length; j++) matrix[i][j] = (int)(math.random() * 1000); double[][] x; 33

Παράδειγμα 2 διάστατου πίνακα 0 0 1 2 3 4 0 0 1 2 3 4 0 1 2 0 1 2 3 1 2 3 4 matrix = new int[5][5]; 1 2 3 4 7 matrix[2][1] = 7; 3 1 2 4 5 6 7 8 9 10 11 12 int[][] array = { {1, 2, 3, {4, 5, 6, {7, 8, 9, {10, 11, 12 ; matrix.length? 5 matrix[0].length? 5 array.length? 4 array[0].length? 3 Ορισμός και δημιουργία και αρχικοποίηση 2 διάστατων πινάκων int[][] array = { {1, 2, 3, {4, 5, 6, {7, 8, 9, {10, 11, 12 ; Αντίστοιχο με int[][] array = new int[4][3]; array[0][0] = 1; array[0][1] = 2; array[0][2] = 3; array[1][0] = 4; array[1][1] = 5; array[1][2] = 6; array[2][0] = 7; array[2][1] = 8; array[2][2] = 9; array[3][0] = 10; array[3][1] = 11; array[3][2] = 12; 34

Άσκηση για το σπίτι Γράψτε ένα πρόγραμμα το οποίο Αρχικοποιεί έναν 2 διάστατο πίνακα με της απαντήσεις φοιτητών σε ερωτήσεις πολλαπλής επιλογής Αρχικοποιεί έναν μονοδιάστατο πίνακα με τις σωστές απαντήσεις στις ερωτήσεις πολλαπλής επιλογής Υπολογίζει και εμφανίζει το σκορ κάθε φοιτητή (αριθμό σωστών απαντήσεων) Απαντήσεις φοιτητών σε ερωτήσεις: 0 1 2 3 4 5 6 7 8 9 Student 0 Student 1 Student 2 Student 3 Student 4 Student 5 Student 6 Student 7 A B A C C D E E A D D B A B C A E E A D E D D A C B E E A D C B A E D C E E A D A B D C C D E E A D B B E C C D E E A D B B A C C D E E A D E B E C C D E E A D Key Σωστές απαν τήσεις: 0 1 2 3 4 5 6 7 8 9 D B D C C D A E A D Πίνακες πολλαπλών διαστάσεων Σε κάποιες περιπτώσεις θα χρειαστεί να αναπαραστήσετε δομές δεδομένων πολλαπλών διαστάσεων. Στη Java μπορείτε να δημιουργήσετε πολυδιάστατους πίνακες (n dimensional arrays) Π.χ. παρακάτω ορίζεται ένας 3 διάστατος πίνακας με double τιμές double[][][] scores = new double[10][5][2]; 35

Πίνακας από αντικείμενα Circle[] circlearray = new Circle[10]; Ένας πίνακας από αντικείμενα είναι στην πραγματικότητα ένας πίνακας από μεταβλητές αναφοράς (array of reference variables). Άρα, η κλήση circlearray[1].getarea() περιλαμβάνει δύο επίπεδα αναφοράς το circlearray αποτελεί αναφορά σε ολόκληρο τον πίνακα το circlearray[1] αναφέρεται σε ένα αντικείμενο Circle circlearray reference circlearray[0] Circle object 0 circlearray[1] Circle object 1 circlearray[9] Circle object 9 36