Πίνακες στην JAVA ΕΡΓΑΣΤΗΡΙΟ AΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ (Διαφάνειες: ΧΟΧΟΛΗΣ ΔΙΟΝΥΣΙΟΣ Προσαρμογή 2014: Κώστας Στάμος)
Δήλωση Μεταβλητής Πίνακα – [] variable_name; –int [] prime; –int prime[]; Και ο δύο τρόποι είναι ισοδύναμοι Καμμία δέσμευση στην μνήμη μέχρι στιγμής
Ορισμός Μεγέθους Πίνακα Ορισμός Μεγέθους ενός πίνακα: –variable_name=new [N]; –primes=new int[10]; Δήλωση και ορισμός μεγέθους: –int[] primes=new int[10]; Μέγεθος σε bytes: –int : 4 bytes –Σύνολο: 4*10=40 bytes
ΓΡΑΦΙΚΗ ΑΝΑΠΑΡΑΣΤΑΣΗ prime TIMH ΘΕΣΗΣ ΔΕΙΚΤΗΣ ΘΕΣΗΣ ΠΙΝΑΚΑ
Τι γίνεται στην περίπτωση… Ορίσουμε –int[] prime=new long[20]; MorePrimes.java:5: incompatible types found: long[] required: int[] int[] primes = new long[20]; ^ ΣΥΝΤΑΚΙΚΟ ΛΑΘΟΣ : –Ασυμβατότητα τύπων δήλωσης και ορισμού
Τι γίνεται στην περίπτωση… Ορίσουμε –int prime[100]; MorePrimes.java:5: ']' expected long primes[20]; ^ ΣΥΝΤΑΚΤΙΚΟ ΛΑΘΟΣ : –Ο τρόπος ορισμού της C++ δεν επιτρέπεται στην JAVA
Εξ ορισμού Αρχικοποίηση Πίνακα Όταν δημιουργείται ο πίνακας τα στοιχεία του πίνακα αρχικοποιούνται –Αριθμητικές τιμές (int, double,κτλ.) σε 0 –Boolean τιμές σε false –Char τιμές σε ‘\u0000’ (unicode αναπαράσταση για τον κενό χαρακτήρα)
ΓΡΑΦΙΚΗ ΑΝΑΠΑΡΑΣΤΑΣΗ Εξ ορισμού αρχικοποίησης Αριθμητικές τιμές –int[] primes=new int[10]; false Boolean Τιμές boolean[] bool=new boolean[10];
Προσπέλαση Στοιχείων Πίνακα Ο Δείκτης Θέσης ενός πίνακα είναι: –Θετικός Ακέραιος int,short Κάθε άλλος τύπος είναι συντακτικό σφάλμα –long, double, κτλ. Η αρίθμηση των δεικτών θέσης ξεκινάει από το 0 και τελείωνει στο N-1 primes[2]=0;// Θέτει την τιμή 0 στην θέση 2 int k = primes[2];//Εκχωρεί την τιμή που περιέχεται στη //θέση 2 στην μεταβλητή k …
Έλεγχος Δεικτών Θέσης Η JAVA ελέγχει εάν οι δείκτες θέσης είναι έγκυροι κατά την εκτέλεση του προγράμματος Ένα μήνυμα σφάλματος IndexOutOfBoundsException θα εμφανισθεί εάν: –Εάν ο δέικτης θέσης είναι αρνητικός –Εάν ο δείκτης θέσης είναι εκτός του έγκυρου εύρους τιμών int primes[] = new int[10]; primes[15]=2;//Λάθος …. Runtime Error: Exception in thread “main” java.lang.ArrayIndexOutOfBoundsException: Έγκυρο Εύρος Τιμών:0-9
Αρχικοποίηση Πινάκων Δήλωση, Ορισμός Μεγέθους και Αρχικοποίηση int[] primes={2,3,5,7,11,13,17}; //7 στοιχεία Αρχικοποίηση μέσω άλλου πίνακα int[] even={2,4,6,8,10}; int[] value=even; –Ένας πίνακας αλλά δυο μεταβλητές πινάκων –Και οι δύο μεταβλητές αναφέρονται στον ίδιο πίνακα –Ο πίνακας μπορεί να προσπελαστεί Array μέσω οποιασδήποτε εκ των δύο μεταβλητών
Παράδειγμα long[] primes = new long[20]; primes[0] = 2; primes[1] = 3; long[] primes2=primes; System.out.println(primes2[0]); primes2[0]=5; System.out.println(primes[0]);
Έξοδος 2525
Ιδιότητα length Για κάθε πίνακα υπάρχει η ιδιότητα length που δίνει τον αριθμό των θέσεων του πίνακα –array_variable_name.length –for(int k=0; k<primes.length;k++) …. Παράδειγμα: long[] primes = new long[20]; System.out.println(primes.length); Output: 20
Προσπέλαση όλων των θέσεων ενός πίνακα Για την προσπέλαση όλων των θέσεων ενός πίνακα χρησιμοποιομε μια δομή επανάληψης for με γενική μορφή: int[] array = new int[10]; for(int i=0; i<array.length; i++){ ….. }
Άσκηση 1 Να γραφεί πρόγραμμα σε Java (CopyArrays.java) στο οποίο να δημιουργούνται δύο πίνακες ακεραίων: πρώτα πίνακας με όνομα ΑrrayInt2 10 θέσεων που περιέχει τους αριθμούς από το 1-5 στις 5 πρώτες θέσεις του, και τον πίνακα με όνομα ArrayInt1 5 θέσεων που περιέχει τους αριθμούς Κάνετε τις απαραίτητες αντιγραφές στοιχείων μεταξύ των δύο πινάκων ώστε ο πίνακας ArrayInt1 να περιέχει τους αριθμούς 1-5 και ο πίνακας ArrayInt2 τους αριθμούς 1-10
Γραφική Αναπαράσταση arrayInt1 arrayInt
Άσκηση 2 Να γραφεί πρόγραμμα σε java με όνομα ArrayOperations στο οποίο να δημιουργείται ένας πίνακας ακεραίων Ν θέσεων όπου Ν θετικός ακέραιος που εισάγεται από τον χρήστη. Στην συνέχεια να εισάγονται από τον χρήστη θετικοί ακέραιοι για κάθε θέση του πίνακα. Να υπολογιστούν και να τυπωθούν: 1.Το άθροισμα των στοιχείων του πίνακα 2.Ο μέσος όρος των στοιχείων του πίνακα 3.Το μέγιστο στοιχείο του πίνακα 4.Το πλήθος των περιττών στοιχείων του πίνακα Στην συνέχεια ο χρήστης να εισάγει έναν θετικό ακέραιο αριθμό. Να γίνει αναζήτηση του συγκεκριμένου αριθμού στον πίνακα και να τυπωθεί κατάλληλο μήνυμα.
Δισδιάστατοι Πίνακες –float[][] sample=new float[5][10]; –5 πίνακες με 10 στοιχεία ο καθένας –Ο πρώτος δείκτης θέσης: καθορίζει τον πίνακα (γραμμή-row) –Ο δεύτερος δείκτης θέσης:καθορίζει το στοιχείο στον πίνακα(στήλη-column) –Στην JAVA ο τύπος float είναι 4 bytes, total Συνολικό μέγεθος=4*5*10=200 bytes
Γραφική Αναπαράσταση sample[0] sample[1] sample[2]
Αρχικοποίηση Δισδιάστατου Πίνακα int[][] array2D = { {99, 42, 74, 83, 100}, {90, 91, 72, 88, 95}, {88, 61, 74, 89, 96}, {61, 89, 82, 98, 93}, {93, 73, 75, 78, 99}, {50, 65, 92, 87, 94}, {43, 98, 78, 56, 99} }; //7 πίνακες με 5 στοιχεία ο καθένας
Δισδιάστατοι πίνακες μεταβλητού μήκους Όλοι οι πίνακες δεν είναι αναγκαίο να έχουν το ίδιο μήκος float[][] samples; samples=new float[6][]; samples[2]=new float[6]; samples[5]=new float[101]; Δεν απαιτείται να ορισθούν όλοι οι πίνακες
Αρχικοποίηση Πινάκων μεταβλητού μήκους int[][] uneven = { { 1, 9, 4 }, { 0, 2}, { 0, 1, 2, 3, 4 } }; //Τρείς πίνακες //Ο πρώτος έχει 3 στοιχεία //Ο δεύτερος έχει 2 στοιχεία //Ο τρίτος έχει 5 στοιχεία
Μέγεθος Πινάκων long[][] primes = new long[20][]; primes[2] = new long[30]; System.out.println(primes.length); //Αριθμός Πινάκων System.out.println(primes[2].length);//Αριθμός στοιχέιων στον δέυτερο πίνακα OUTPUT: 20 30
Παράδειγμα class unevenExample3 { public static void main( String[] arg ) { // δήλωση και αρχικοποίηση δισδιάστατου πίνακα int[][] uneven = { { 1, 9, 4 }, { 0, 2}, { 0, 1, 2, 3, 4 } }; // Εκτύπωση στοιχείων του πίνακα for ( int row=0; row < uneven.length; row++ ) //αλλαγή γραμμής { System.out.print("Row " + row + ": "); for ( int col=0; col < uneven[row].length; col++ ) //αλλαγή στήλης System.out.print( uneven[row][col] + " "); System.out.println(); }
Τρισδιάστατοι Πίνακες Ένας αγρότης έχει δέκα φάρμες με σιτάρι σε δύο νομούς και κάθε φάρμα έχει 30 χωράφια Τρισδιάστατος πίνακας int[][][] wheat=new int[2][10][30];
Άσκηση 1 Να γραφεί πρόγραμμα σε γλώσσα java ArrayTwoDimensions.java, στο οποίο αρχικά θα δηλώνεται ένας πίνακας ακεραίων 3 x 3 που θα δέχεται τυχαίες τιμές από το πληκτρολόγιο και στη συνέχεια θα υπολογίζεται το άθροισμα των στοιχείων του πίνακα μέχρι το πρώτο αρνητικό στοιχείο (αν υπάρχει τέτοιο) ή όλων των στοιχείων του πίνακα αν δεν υπάρχει αρνητικό στοιχείο σε αυτόν. Η διαπέραση του πίνακα θα γίνεται κατά γραμμές και σε κάθε γραμμή τα κελιά θα προσπελαύνονται από αριστερά προς τα δεξιά (κατά αύξοντα αριθμό στήλης).
Άσκηση 2 Να γραφεί πρόγραμμα σε java με όνομα ArrayTwoDimensions2 στο οποίο: 1.Θα δηλώνεται ένας πίνακας ακεραίων Ν x Ν όπου N θετικός ακέραιος που εισάγεται από τον χρήστη. 2.Στην συνέχεια να εισάγονται από τον χρήστη θετικοί ακέραιοι για κάθε θέση του πίνακα. 3.Να υπολογιστεί και να τυπωθεί το άθροισμα των στοιχείων της κυρίας διαγωνίου 4.Δημιουργήστε έναν μονοδιάστατο πίνακα ακεραίων με μήκος N που σε κάθε θέση του θα περιέχει τον μέγιστο ακέραιο της κάθε σειράς του πίνακα ΝΧN. 5.Να τυπώσετε όλους τους άρτιους αριθμούς που περιέχονται στον μονοδιάστατο πίνακα.