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

Σχετικά έγγραφα
Πίνακες στη Java. Αντικειμενοστρεφής Προγραμματισμός 4/4/2016. Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια.

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

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

ΠΠΜ 500: Προχωρημένη Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής. 9. Πίνακες (Arrays) Χειμερινό εξάμηνο 2012

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

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

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

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

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

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

Διάλεξη 10η: Πολυδιάστατοι Πίνακες

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

5. Ανασκόπηση αντικειμενοστραφούς προγραμματισμού

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

Ταξινόµηση και Αναζήτηση

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

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

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

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

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

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

Παράδειγµα χρήσης πίνακα

Πρόβλημα 1: Αναζήτηση Ελάχιστης/Μέγιστης Τιμής

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

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

7. Δομές Ελέγχου (Control Statements)

ΗΥ-150. Προγραμματισμός

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες (Διάλεξη 19)

Μεθόδων Επίλυσης Προβλημάτων

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

Προαπαιτούμενες Ασκήσεις 5 ου Εργαστηρίου. Dose stoixeio (integer) : 25 Found stoixeio in position 7 Dose stoixeio (integer) :94 Value not found

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

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

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

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

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

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

Προγραμματισμός Ι. Εγγραφές. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Μεθόδων Επίλυσης Προβλημάτων

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 6/5/2006

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

ΠΛΗΡΟΦΟΡΙΚΗ ΙI Ενότητα 3: Έλεγχος ροής προγράμματος

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

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

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

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

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

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

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

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

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

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

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

Κεφάλαιο 8.7. Πίνακες & Συναρτήσεις ( ιάλεξη 17) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

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

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

ΚΥΠΡΙΑΚΗ ΕΤΑΙΡΕΙΑ ΠΛΗΡΟΦΟΡΙΚΗΣ CYPRUS COMPUTER SOCIETY ΠΑΓΚΥΠΡΙΟΣ ΜΑΘΗΤΙΚΟΣ ΔΙΑΓΩΝΙΣΜΟΣ ΠΛΗΡΟΦΟΡΙΚΗΣ 24/3/2007

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

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

Αριθμητικοί υπολογισμοί χρησιμοποιούνται σε όλα σχεδόν τα προγράμματα

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

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

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

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

Κεφάλαιο 8.7. Πολυδιάστατοι Πίνακες ( ιάλεξη 18) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

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

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

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

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

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

ΗΥ-150. Πίνακες (Arrays)

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

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

Διάλεξη 6: Δείκτες και Πίνακες

Κεφάλαιο Πίνακες Ι. (Διάλεξη 16)

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

Ειδικά Θέματα Προγραμματισμού

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

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

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

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

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

Μεθόδων Επίλυσης Προβλημάτων

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

Στόχοι και αντικείμενο ενότητας. Τύπος πίνακα. Τύπος πίνακα (συν.) #6. Πίνακες και Δείκτες

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

Μεθόδων Επίλυσης Προβλημάτων

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

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

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

Προγραμματισμός Ι. Κλάσεις και Αντικείμενα. Δημήτρης Μιχαήλ. Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Υπολογισμός - Εντολές Επανάληψης

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

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

Εισαγωγή στη Fortran. Μάθημα 3 ο. Ελευθερία Λιούκα

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

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

Transcript:

Πανεπιστήμιο Πειραιά Τμήμα Ψηφιακών Συστημάτων Αντικειμενοστρεφής Προγραμματισμός 27/3/2017 Δρ. Ανδριάνα Πρέντζα Αναπληρώτρια Καθηγήτρια aprentza@unipi.gr

Πίνακες στη Java

Εισαγωγή Πίνακες Δομές δεδομένων Στοιχεία δεδομένων του ίδιου τύπου (οποιουδήποτε τύπου int, double, String, κλπ) Το μέγεθός τους παραμένει το ίδιο αφού δημιουργηθούν Είναι αντικείμενα στη Java

Πίνακες Πίνακας -> Ομάδα μεταβλητών ίδιου τύπου ΕΡΩΤΗΣΗ: Τι είδους τύποι; Πρωταρχικοί ή Αναφοράς; ΑΠΑΝΤΗΣΗ: Αναφοράς, αφού οι πίνακες της Java είναι αντικείμενα Δηλ. στην πραγματικότητα, ό,τι θεωρούμε ως «πίνακα», είναι μια αναφορά σε ένα αντικείμενο πίνακα στη μνήμη

Πίνακας 12 στοιχείων

...Πίνακες Δείκτης Αριθμός θέσης σε αγκύλες [] Πρέπει να είναι θετικός ακέραιος ή ακέραιη έκφραση Το 1 ο στοιχείο έχει δείκτη ίσο με μηδέν (0) Επομένως ο δείκτης ξεκινά στο μηδέν και σταματά στο length-1 a = 5; b = 6; c[ a + b ] += 2; Προσθέτει 2 στο c[ 11 ]

...Πίνακες Παράδειγμα int[] values = new int[5]; values[0] = 12; // CORRECT values[4] = 12; // CORRECT values[5] = 12; // WRONG!! compiles but // throws an Exception // at run-time

...Πίνακες Εξέταση πίνακα c c είναι το όνομα του πίνακα Η έκφραση c.length προσπελαύνει το μήκος του c Ο c έχει 12 στοιχεία ( c[0], c[1], c[11] ) Η τιμή του c[0] είναι 45

Δήλωση και δημιουργία πινάκων Δήλωση και δημιουργία πινάκων Οι πίνακες είναι αντικείμενα που καταλαμβάνουν μνήμη Δημιουργούνται δυναμικά με τη λέξη-κλειδί new int c[] = new int[12]; Ισοδύναμο με το int c[]; // δήλωση μεταβλητής array c = new int[12]; // δημιουργία array Ισοδύναμο με το int size = 12; // δήλωση μεταβλητής μήκους int[] c = new int[size]; // δημιουργία array String b[] = new String[100];

Συνηθισμένο σφάλμα Σε μια δήλωση πίνακα, ο καθορισμός του αριθμού των στοιχείων στις αγκύλες της δήλωσης (π.χ., int c[12];) είναι συντακτικό λάθος

Παραδείγματα χρήσης πινάκων Δήλωση πινάκων Δημιουργία πινάκων Αρχικοποίηση πινάκων Χειρισμός στοιχείων πίνακα

1 // Fig. 7.2: InitArray.java 2 // Creating an array. 3 Δήλωση array ως 4 public class InitArray πίνακα από ints 5 { 6 public static void main( String args[] ) Δημιουργία 10 ints για τον array. Κάθε int αρχικοποιείται Παραδείγματα χρήσης πινάκων σε 0 εξ ορισμού 7 { 8 int array[]; // declare array named array 9 10 array = new int[10]; // create the space for array 11 12 System.out.printf( "%s%8s\n", "Index", "Value" ); // column headings 13 14 // output each array element's value 15 for (int counter=0; counter<array.length; counter++) 16 System.out.printf("%5d%8d\n", counter, array[counter]); 17 } // end main 18 } // end class InitArray Η έκφραση array.length επιστρέφει το μήκος του array Ο array[counter] επιστρέφει τον int που σχετίζεται με το δείκτη στον array

Παραδείγματα χρήσης πινάκων Index Value 0 0 1 0 2 0 3 0 4 0 5 0 6 0 7 0 8 0 9 0 Κάθε int αρχικοποιείται σε 0 εξ ορισμού

... Παραδείγματα χρήσης πινάκων Απόδοση αρχικών τιμών πίνακα Με χρήση λίστας αρχικοποίησης Τα στοιχεία περικλείοντα σε άγκιστρα ({}) Τα στοιχεία στη λίστα διαχωρίζονται με κόμματα int n[] = {10,20,30,40,50}; Δημιουργεί ένα πίνακα 5 στοιχείων Τιμές δεικτών 0, 1, 2, 3, 4 Δεν χρειάζεται η λέξη-κλειδί new

... Παραδείγματα χρήσης πινάκων Υπάρχει λάθος στον παρακάτω κώδικα? int n[] = {1, 2.5, 3, 3.5, 4};

... Παραδείγματα χρήσης πινάκων Για την πρόσβαση στα στοιχεία του πίνακα, χρησιμοποιούμε τον τελεστή [ ] : values[index] Παράδειγμα: int[] values = { 12, 24, -23, 47 }; values[3] = 18; // {12, 24, -23, 18} int x = values[1] + 3; // {12,24,-23,18}

Η μεταβλητή length Κάθε πίνακας έχει μία built-in μεταβλητή length η οποία περιέχει το μήκος του πίνακα : Παράδειγμα: int[] values = new int[12]; int size = values.length; // 12 int [] values2 = {1,2,3,4,5} int size2 = values2.length; // 5

Χρησιμοποιώντας τα στοιχεία του πίνακα Παράδειγμα 1: int[] values = new int[5]; for (int i=0; i<values.length; i++) { values[i] = i; } int y = values[i] * values[i]; System.out.println(y);

Χρησιμοποιώντας τα στοιχεία του πίνακα Παράδειγμα 2: int[] values = new int[5]; int i = 0; while (i<values.length) { values[i] = i; } int y = values[i] * values[i]; System.out.println(y); i++;

Παραδείγματα χρήσης πινάκων 1 // Fig. 7.3: InitArray.java 2 // Initializing the elements of an array with an array initializer. 3 4 public class InitArray 5 { Δήλωση του array ως πίνακα από ints 6 public static void main( String args[] ) 7 { 8 // initializer list specifies the value for each element 9 int array[] = {32,27,64,18,95,14,90,70,60,37}; 10 11 System.out.printf("%s%8s\n", "Index", "Value ); // column headings 12 13 // output each array element's value 14 for (int counter=0; counter<array.length; counter++) 15 System.out.printf( "%5d%8d\n", counter, array[counter] ); 16 } // end main 17 } // end class InitArray Ο μεταγλωττιστής χρησιμοποιεί τη λίστα αρχικοποίησης για την αρχική ανάθεση τιμών στον πίνακα

Παραδείγματα χρήσης πινάκων Index Value 0 32 1 27 2 64 3 18 4 95 5 14 6 90 7 70 8 60 9 37

... Παραδείγματα χρήσης πινάκων Αρχικοποίηση πίνακα 10 στοιχείων σε άρτιους ακέραιους

1 // Fig. 7.4: InitArray.java 2 // Calculating values to be placed into elements of an array. 3 4 public class InitArray 5 {... Παραδείγματα χρήσης 6 public static void main( String args[] ) 7 { 8 final int ARRAY_LENGTH = 10; // declare constant πινάκων Δήλωση σταθεράς μεταβλητής ARRAY_LENGTH με χρήση του τροποποιητικού final 9 int array[] = new int[ ARRAY_LENGTH ]; // create array 10 11 // calculate value for each array element 12 for ( int counter = 0; counter < array.length; counter++ ) 13 array[ counter ] = 2 + 2 * counter; 14 15 System.out.printf("%s%8s\n", "Index", "Value"); // column headings 16 17 // output each array element's value 18 for ( int counter = 0; counter < array.length; counter++ ) 19 System.out.printf( "%5d%8d\n", counter, array[ counter ] ); 20 } // end main 21 } // end class InitArray Δήλωση και δημιουργία πίνακα που περιέχει 10 ints

Παραδείγματα χρήσης πινάκων Index Value 0 2 1 4 2 6 3 8 4 10 5 12 6 14 7 16 8 18 9 20

Συνηθισμένα σφάλματα Η ανάθεση τιμής σε σταθερά αφού αυτή αρχικοποιηθεί είναι compilation error Η προσπάθεια χρήσης μιας σταθεράς πριν αρχικοποιηθεί είναι compilation error

... Παραδείγματα χρήσης πινάκων Άθροιση των στοιχείων ενός πίνακα Τα στοιχεία ενός πίνακα συχνά αναπαριστούν μία σειρά τιμών Μπορούμε να αθροίσουμε αυτές τις τιμές

1 // Fig. 7.5: SumArray.java 2 // Computing the sum of the elements of an array. 3 4 public class SumArray 5 { 6 public static void main( String args[] ) 7 { 8 int array[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; 9 int total = 0; 10 11 // add each element's value to total 12 for ( int counter = 0; counter < array.length; counter++ ) 13 total += array[ counter ]; 14 15 System.out.printf( "Total of array elements: %d\n", total ); 16 } // end main 17 } // end class SumArray Total of array elements: 849 Δήλωση array με λίστα αρχικοποίησης Άθροισε όλες τις array τιμές

Αποφυγή λαθών Μία εξαίρεση (exception) υποδεικνύει ότι ένα σφάλμα έχει συμβεί σε ένα πρόγραμμα Ο προγραμματιστής συχνά μπορεί να γράψει κώδικα που να ανακάμπτει από μία εξαίρεση και να συνεχίζει την εκτέλεση του προγράμματος, αντί το πρόγραμμα να τερματίζει ανώμαλα Όταν ένα πρόγραμμα προσπαθεί να προσπελάσει ένα στοιχείο εκτός των ορίων ενός πίνακα, συμβαίνει η εξαίρεση ArrayIndexOutOfBoundsException Θα ασχοληθούμε με τον χειρισμό των εξαιρέσεων (Exception handling) σε επόμενο μάθημα

Βελτιωμένη for Βελτιωμένη εντολή for Νέο χαρακτηριστικό της J2SE 5.0 Επιτρέπει την επανάληψη ανάμεσα στα στοιχεία ενός πίνακα χωρίς τη χρήση μετρητή Σύνταξη for ( parameter : arrayname ) statement

1 // Fig. 7.12: EnhancedForTest.java 2 // Using enhanced for statement to total integers in an array. 3 4 public class EnhancedForTest 5 { Βελτιωμένη for 6 public static void main( String args[] ) 7 { 8 int array[] = { 87, 68, 94, 100, 83, 78, 85, 91, 76, 87 }; 9 int total = 0; 10 11 // add each element's value to total 12 for ( int number : array ) 13 total += number; 14 15 System.out.printf( "Total of array elements: %d\n", total); 16 } // end main 17 } // end class EnhancedForTest Total of array elements: 849 Σε κάθε επανάληψη, αναθέτουμε το επόμενο στοιχείο του πίνακα array στην ακέραιη μεταβλητή number και μετά την προσθέτουμε στην total. Ο τύπος που καθορίζεται στη for είναι int επειδή ο array είναι πίνακας που περιέχει τιμές int

Βελτιωμένη for Οι γραμμές 12-13 είναι ισοδύναμες με το παρακάτω 12 for ( int number : array ) 13 total += number; for ( int counter = 0; counter < array.length; counter++ ) total += array[ counter ]; Χρήση Μπορεί να προσπελάσει τα στοιχεία πίνακα Δεν μπορεί να τροποποιήσει τα στοιχεία του πίνακα Δεν μπορεί να προσπελάσει το μετρητή που ορίζει τον δείκτη

Πέρασμα πινάκων και στοιχείων πινάκων σε μεθόδους Για να περάσουμε πίνακα ως όρισμα πίνακα σε μία μέθοδο Καθορίζουμε το όνομα του πίνακα χωρίς παρενθέσεις Ο πίνακας hourlytemperatures δηλώνεται ως int hourlytemperatures = new int[ 24 ]; Η κλήση της μεθόδου modifyarray(hourlytemperatures); περνάει τον πίνακα hourlytemperatures στη μέθοδο modifyarray

1 // Fig. 7.13: PassArray.java 2 // Passing arrays and individual array elements to methods. 3 4 public class PassArray 5 { 6 // main creates array and calls modifyarray and modifyelement 7 public static void main( String args[] ) 8 { 9 int array[] = { 1, 2, 3, 4, 5 }; 10 11 System.out.println( 12 "Effects of passing reference to entire array:\n" + 13 "The values of the original array are:" ); 14 15 // output original array elements 16 for ( int value : array ) 17 System.out.printf( " %d", value ); 18 19 modifyarray( array ); // pass array reference Δήλωση του array 5 ακεραίων με αρχικοποίηση λίστας Πέρασμα ολόκληρου του πίνακα στη μέθοδο modifyarray η μέθοδος παίρνει αντίγραφο της αναφοράς 20 System.out.println( "\n\nthe values of the modified array are:" ); 21 22 // output modified array elements 23 for ( int value : array ) 24 System.out.printf( " %d", value ); 25 26 System.out.printf( 27 "\n\neffects of passing array element value:\n" + 28 "array[3] before modifyelement: %d\n", array[ 3 ] );

Πέρασμα Πινάκων σε μεθόδους 29 30 modifyelement( array[ 3 ] ); // attempt to modify array[ 3 ] 31 System.out.printf( 32 "array[3] after modifyelement: %d\n", array[ 3 ] ); 33 } // end main 34 35 // multiply each element of an array by 2 36 public static void modifyarray( int array2[] ) 37 { 38 for ( int counter = 0; counter < array2.length; counter++ ) 39 array2[ counter ] *= 2; 40 } // end method modifyarray 41 42 // multiply argument by 2 43 public static void modifyelement( int element ) 44 { 45 element *= 2; 46 System.out.printf( 47 "Value of element in modifyelement: %d\n", element ); 48 } // end method modifyelement 49 } // end class PassArray Πέρασμα του στοιχείου πίνακα array[3] στη μέθοδο modifyelement Η μέθοδος modifyarray χειρίζεται τον πίνακα απευθείας Η μέθοδος modifyelement χειρίζεται ένα αντίγραφο του πρωταρχικού τύπου. Δηλ την τιμή του array[3] και όχι το array[3] αυτό καθεαυτό κλήση μέσω τιμής

Πέρασμα Πινάκων σε μεθόδους Effects of passing reference to entire array: The values of the original array are: 1 2 3 4 5 The values of the modified array are: 2 4 6 8 10 Effects of passing array element value: array[3] before modifyelement: 8 Value of element in modifyelement: 16 array[3] after modifyelement: 8

Πέρασμα Πινάκων σε μεθόδους Σημειώσεις για το πέρασμα ορισμάτων σε μεθόδους Δύο τρόποι με τους οποίους περνούν ορίσματα σε μεθόδους Κλήση μέσω τιμής (Pass-by-value ) Αντίγραφο της τιμής του ορίσματος περνάει στην κληθείσα μέθοδο Αλλαγές στο αντίγραφο δεν επηρεάζουν την τιμή της αρχικής μεταβλητής στη μέθοδο που την κάλεσε Στη Java, κάθε primitive (int, double etc.) περνάει με κλήση μέσω τιμής Κλήση μέσω αναφοράς (Pass-by-reference) Η κληθείσα μέθοδος μπορεί να προσπελάσει την τιμή του ορίσματος στη μέθοδο που την κάλεσε άμεσα και να τροποποιήσει αυτά τα δεδομένα αν χρειάζεται Βελτιωμένη απόδοση σε σχέση με pass-by-value λόγω έλλειψης αντιγράφων Στη Java, κάθε αντικείμενο είναι pass-by-reference Στη Java, οι πίνακες είναι αντικείμενα -> άρα pass-by-reference

Πέρασμα Πινάκων σε μεθόδους Βέλτιστη απόδοση Το πέρασμα πινάκων μέσω αναφοράς έχει νόημα για λόγους απόδοσης Αν οι πίνακες περαστούν μέσω τιμής, διοχετεύεται ένα αντίγραφο κάθε στοιχείου Για μεγάλους πίνακες αυτό θα ήταν χρονοβόρο και θα σπαταλούσε σημαντικό αποθηκευτικό χώρο για τα αντίγραφα των πινάκων

Δημοφιλή θέματα 1 Δείκτης πίνακας / τιμή πίνακα: int[] values = {99, 100, 101}; System.out.println(values[0]); // 99

Δημοφιλή θέματα 2 Αγκύλες { } μετά από if/else, for/while : for (int i=0; i<5; i++) System.out.println( Hi ); System.out.println( Bye ); Τι τυπώνει?

Πολυδιάστατοι πίνακες Πίνακες με γραμμές και στήλες 2-διάστατος πίνακας Πίνακας m επί n (mxn) Π.χ. 2-διάστατος πίνακας 3x2

Πολυδιάστατοι πίνακες Δηλ. Πίνακες μονοδιάστατου πίνακα Δήλωση διδιάστατου πίνακα b[2][2] int b[][] = { { 1, 2 }, { 3, 4 } }; Τα 1 και 2 αρχικοποιούν τα b[0][0] και b[0][1] Τα 3 and 4 αρχικοποιούν τα b[1][0] και b[1][1] int b[][] = { { 1, 2 }, { 3, 4, 5 } }; Η γραμμή 0 περιέχει τα στοιχεία 1 και 2 Η γραμμή 1 περιέχει τα στοιχεία 3, 4 και 5

Πολυδιάστατοι πίνακες Διδιάστατοι πίνακες με γραμμές διαφορετικού μήκους Τα μήκη των γραμμών στον πίνακα δεν χρειάζεται να είναι τα ίδια Π.χ., int b[][] = { { 1, 2 }, { 3, 4, 5 } };

Πολυδιάστατοι πίνακες Δημιουργία 2-διάστατων πινάκων με εκφράσεις δημιουργίας πίνακα Μπορούν να δημιουργηθούν δυναμικά πίνακας 3x4 int b[][]; b = new int[ 3 ][ 4 ]; Οι γραμμές μπορούν να έχουν διαφορετικό αριθμό στηλών int b[][]; b = new int[ 2 ][ ]; // δημιουργία 2 γραμμών b[ 0 ] = new int[ 5 ]; // δημιουργία 5 στηλών για τη γραμμή 0 b[ 1 ] = new int[ 3 ]; // δημιουργία 3 στηλών για τη γραμμή 1

1 // Fig. 7.17: InitArray.java 2 // Initializing two-dimensional arrays. 3 4 public class InitArray 5 { 6 // create and output two-dimensional arrays 7 public static void main( String args[] ) Πολυδιάστατοι πίνακες 8 { 9 int array1[][] = { { 1, 2, 3 }, { 4, 5, 6 } }; 10 int array2[][] = { { 1, 2 }, { 3 }, { 4, 5, 6 } }; 11 12 System.out.println( "Values in array1 by row are" ); 13 outputarray( array1 ); // displays array1 by row 14 15 System.out.println( "\nvalues in array2 by row are" ); 16 outputarray( array2 ); // displays array2 by row 17 } // end main 18 19 // output rows and columns of a two-dimensional array 20 public static void outputarray( int array[][] ) 21 { 22 // loop through array's rows 23 for ( int row = 0; row < array.length; row++ ) 24 { 25 // loop through columns of current row 26 for ( int column = 0; column < array[ row ].length; column++ ) 27 System.out.printf( "%d ", array[ row ][ column ] ); 28 29 System.out.println(); // start new line of output 30 } // end outer for 31 } // end method outputarray 32 } // end class InitArray Αρχικοποίηση array1 με χρήση αρχικοποίησης φωλιασμένων πινάκων Αρχικοποίηση array2 με χρήση αρχικοποίησης φωλιασμένων πινάκων διαφορετικού μήκους Η έκφραση array[row].length επιστρέφει τον αριθμό των στηλών που αφορούν τον δείκτη row Χρήση διπλών αγκίστρων για προσπέλαση τιμών 2-διάστατου πίνακα

Values in array1 by row are 1 2 3 4 5 6 Πολυδιάστατοι πίνακες Values in array2 by row are 1 2 3 4 5 6

Πολυδιάστατοι πίνακες Συνήθεις χειρισμοί με χρήση των εντολών for Π.χ for ( int column = 0; column < a[ 2 ].length; column++ ) a[ 2 ][ column ] = 0;

Η κλάση GradeBook με χρήση διδιάστατου πίνακα Η κλάση GradeBook Μονοδιάστατος πίνακας Αποθηκεύει βαθμούς φοιτητών σε ένα μόνο διαγώνισμα Διδιάστατος πίνακας Αποθηκεύει βαθμούς ενός μόνου φοιτητή και για την τάξη στο σύνολο

Welcome to the grade book for CS101 Introduction to Java Programming! The grades are: Test 1 Test 2 Test 3 Average Student 1 87 96 70 84.33 Student 2 Student 3 68 94 87 100 90 90 81.67 94.67 Student 4 100 81 82 87.67 Student 5 83 65 85 77.67 Student 6 78 87 65 76.67 Student 7 85 75 83 81.00 Student 8 91 94 100 95.00 Student 9 76 72 84 77.33 Student 10 87 93 73 84.33 Lowest grade in the grade book is 65 Highest grade in the grade book is 100 Overall grade distribution: 00-09: 10-19: 20-29: 30-39: 40-49: 50-59: 60-69: *** 70-79: ****** 80-89: *********** 90-99: ******* 100: *** Είσοδοι: - Όνομα μαθήματος - Βαθμοί μαθητών στα 3 tests Έξοδοι: - Μήνυμα Welcome - Επεξεργασία βαθμών - Βαθμοί μαθητών στα 3 tests - Μέσος όρος ανά μαθητή - Ελάχιστος βαθμός - Μέγιστος βαθμός - Εκτύπωση ιστογράμματος

Κλάσεις και μέθοδοι public class GradeBookTest main Δημιουργία αντικειμένου Κλήση μεθόδων εμφάνισης μηνύματος και επεξεργασίας βαθμών για το αντικείμενο που φτιάξαμε public class GradeBook Κατασκευαστής αντικειμένου Getters, setters if necessary Εμφάνιση μηνύματος Επεξεργασία βαθμών output Grades getminimum getmaximum getaverage outputbarchart

1 // Fig. 7.18: GradeBook.java 2 // Grade book using a two-dimensional array to store grades. 3 4 public class GradeBook 5 { 6 private String coursename; // name of course this grade book represents 7 private int grades[][]; // two-dimensional array of student grades 8 9 // two-argument constructor initializes coursename and grades array 10 public GradeBook( String name, int gradesarray[][] ) 11 { 12 coursename = name; // initialize coursename 13 grades = gradesarray; // store grades 14 } // end two-argument GradeBook constructor 15 16 // method to set the course name 17 public void setcoursename( String name ) 18 { 19 coursename = name; // store the course name 20 } // end method setcoursename 21 22 // method to retrieve the course name 23 public String getcoursename() 24 { 25 return coursename; 26 } // end method getcoursename 27 Δήλωση 2-διάστατου πίνακα grades Ο κατασκευαστής GradeBook δέχεται ένα String και ένα διδιάστατο πίνακα

28 // display a welcome message to the GradeBook user 29 public void displaymessage() 30 { 31 // getcoursename gets the name of the course 32 System.out.printf( "Welcome to the grade book for\n%s!\n\n", 33 getcoursename() ); 34 } // end method displaymessage 35 36 // perform various operations on the data 37 public void processgrades() 38 { 39 // output grades array 40 outputgrades(); 41 42 // call methods getminimum and getmaximum 43 System.out.printf( "\n%s %d\n%s %d\n\n", 44 "Lowest grade in the grade book is", getminimum(), 45 "Highest grade in the grade book is", getmaximum() ); 46 47 // output grade distribution chart of all grades on all tests 48 outputbarchart(); 49 } // end method processgrades 50 51 // find minimum grade 52 public int getminimum() 53 { 54 // assume first element of grades array is smallest 55 int lowgrade = grades[ 0 ][ 0 ]; 56

57 // loop through rows of grades array 58 for ( int studentgrades[] : grades ) 59 { 60 // loop through columns of current row 61 for ( int grade : studentgrades ) 62 { 63 // if grade less than lowgrade, assign it to lowgrade 64 if ( grade < lowgrade ) 65 lowgrade = grade; 66 } // end inner for 67 } // end outer for 68 69 return lowgrade; // return lowest grade 70 } // end method getminimum 71 72 // find maximum grade 73 public int getmaximum() 74 { 75 // assume first element of grades array is largest 76 int highgrade = grades[ 0 ][ 0 ]; 77 Βρόχος μεταξύ των γραμμών του grades για εύρεση του ελάχιστου βαθμού από όλους τους φοιτητές

78 // loop through rows of grades array 79 for ( int studentgrades[] : grades ) 80 { 81 // loop through columns of current row 82 for ( int grade : studentgrades ) 83 { 84 // if grade greater than highgrade, assign it to highgrade 85 if ( grade > highgrade ) 86 highgrade = grade; 87 } // end inner for 88 } // end outer for 89 90 return highgrade; // return highest grade 91 } // end method getmaximum 92 93 // determine average grade for particular set of grades 94 public double getaverage( int setofgrades[] ) 95 { 96 int total = 0; // initialize total 97 98 // sum grades for one student 99 for ( int grade : setofgrades ) 100 total += grade; 101 102 // return average of grades 103 return (double) total / setofgrades.length; 104 } // end method getaverage 105 Υπολογισμός του μέσου όρου εξαμήνου ενός συγκεκριμένου φοιτητή Βρόχος μεταξύ των γραμμών του grades για εύρεση του μέγιστου βαθμού από όλους τους φοιτητές

106 // output bar chart displaying overall grade distribution 107 public void outputbarchart() 108 { 109 System.out.println( "Overall grade distribution:" ); 110 111 // stores frequency of grades in each range of 10 grades 112 int frequency[] = new int[ 11 ]; 113 114 // for each grade in GradeBook, increment the appropriate frequency 115 for ( int studentgrades[] : grades ) 116 { 117 for ( int grade : studentgrades ) 118 ++frequency[ grade / 10 ]; 119 } // end outer for 120 121 // for each grade frequency, print bar in chart 122 for ( int count = 0; count < frequency.length; count++ ) 123 { 124 // output bar label ( "00-09: ",..., "90-99: ", "100: " ) 125 if ( count == 10 ) 126 System.out.printf( "%5d: ", 100 ); 127 else 128 System.out.printf( "%02d-%02d: ", 129 count * 10, count * 10 + 9 ); 130 131 // print bar of asterisks 132 for ( int stars = 0; stars < frequency[ count ]; stars++ ) 133 System.out.print( "*" ); Υπολογισμός της κατανομής των βαθμών των φοιτητών

134 135 System.out.println(); // start a new line of output 136 } // end outer for 137 } // end method outputbarchart 138 139 // output the contents of the grades array 140 public void outputgrades() 141 { 142 System.out.println( "The grades are:\n" ); 143 System.out.print( " " ); // align column heads 144 145 // create a column heading for each of the tests 146 for ( int test = 0; test < grades[ 0 ].length; test++ ) 147 System.out.printf( "Test %d ", test + 1 ); Welcome to the grade book for CS101 Introduction to Java Programming! 148 149 System.out.println( "Average" ); // student average column heading The grades are: 150 151 // create rows/columns of text representing array grades 152 for ( int student = 0; student < grades.length; student++ ) 153 { 154 System.out.printf( "Student %2d", student + 1 ); 155 156 for ( int test : grades[ student ] ) // output student's grades 157 System.out.printf( "%8d", test ); 158 Test 1 Test 2 Test 3 Average Student 1 87 96 70 84.33 Student 2 Student 3 68 94 87 100 90 90 81.67 94.67 Student 4 100 81 82 87.67 Student 5 83 65 85 77.67 Student 6 78 87 65 76.67 Student 7 85 75 83 81.00 Student 8 Student 9 91 76 94 72 100 84 95.00 77.33 Student 10 87 93 73 84.33 Lowest grade in the grade book is 65 Highest grade in the grade book is 100 Overall grade distribution: 00-09: 10-19: 20-29: 30-39: 40-49: 50-59: 60-69: *** 70-79: ****** 80-89: *********** 90-99: ******* 100: ***

159 // call method getaverage to calculate student's average grade; 160 // pass row of grades as the argument to getaverage 161 double average = getaverage( grades[ student ] ); 162 System.out.printf( "%9.2f\n", average ); 163 } // end outer for 164 } // end method outputgrades 165 } // end class GradeBook

1 // Fig. 7.19: GradeBookTest.java 2 // Creates GradeBook object using a two-dimensional array of grades. 3 4 public class GradeBookTest 5 { 6 // main method begins program execution 7 public static void main( String args[] ) 8 { 9 // two-dimensional array of student grades 10 int gradesarray[][] = { { 87, 96, 70 }, 11 { 68, 87, 90 }, 12 { 94, 100, 90 }, 13 { 100, 81, 82 }, 14 { 83, 65, 85 }, 15 { 78, 87, 65 }, 16 { 85, 75, 83 }, 17 { 91, 94, 100 }, 18 { 76, 72, 84 }, 19 { 87, 93, 73 } }; 20 21 GradeBook mygradebook = new GradeBook( 22 "CS101 Introduction to Java Programming", gradesarray ); 23 mygradebook.displaymessage(); 24 mygradebook.processgrades(); 25 } // end main 26 } // end class GradeBookTest Δήλωση του gradesarray ως ενός πίνακα 3x10 Κάθε γραμμή αναπαριστά ένα φοιτητή και κάθε στήλη αναπαριστά το βαθμό σε ένα διαγώνισμα

Welcome to the grade book for CS101 Introduction to Java Programming! The grades are: Test 1 Test 2 Test 3 Average Student 1 87 96 70 84.33 Student 2 Student 3 68 94 87 100 90 90 81.67 94.67 Student 4 100 81 82 87.67 Student 5 83 65 85 77.67 Student 6 78 87 65 76.67 Student 7 85 75 83 81.00 Student 8 91 94 100 95.00 Student 9 76 72 84 77.33 Student 10 87 93 73 84.33 Lowest grade in the grade book is 65 Highest grade in the grade book is 100 Overall grade distribution: 00-09: 10-19: 20-29: 30-39: 40-49: 50-59: 60-69: *** 70-79: ****** 80-89: *********** 90-99: ******* 100: ***

Πηγές/Acknowledgements http://java.sun.com/j2se H. M. Deitel, P. J. Deitel, Java Προγραμματισμός, 6η έκδοση, Μ. Γκιούρδας, 2006 D. Barnes, M. Kolling, Αντικειμενοστρεφής Προγραμματισμός σε Java, Κλειδάριθμος, 2008 Βασίλης Χριστοφίδης, Αντικειμενοστρεφής Προγραμματισμός, Πανεπιστήμιο Κρήτης Κ. Τσαγκάρης, Εισαγωγή στις εφαρμογές της Java, Πανεπιστήμιο Πειραιώς Jones, Evan, Adam Marcus, and Eugene Wu. 6.092 Introduction to Programming in Java,January IAP 2010. (Massachusetts Institute of Technology: MIT OpenCourseWare), http://ocw.mit.edu (Accessed 10 Mar, 2013). License: Creative Commons BY-NC-SA