Πίνακες (Arrays) ΕΠΛ131 Ενότητα VI

Σχετικά έγγραφα
Πίνακες (Arrays) ΕΠΛ131 Ενότητα VI

Πίνακες. Οι πίνακες αποτελούν ένα σηµαντικό δοµηµένο τύπο δεδοµένων (structured data type) ή πιο απλά µία δοµή δεδοµένων (data structure).

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

ΕΠΛ131 Αρχές Προγραμματισμού

Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιµοποιώντας ένα πίνακα µεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία).

ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. Στοιχειώδεις Δοµές Δεδοµένων Δοµικά Στοιχεία και Πίνακες Κεφάλαιο 3 (3.1 και 3.2) Ε. Μαρκάκης Επικ. Καθηγητής

ΕΠΛ131 Αρχές Προγραμματισμού

ΕΡΓΑΣΙΑ 2 - Παίζοντας Blackjack

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

Βασικά στοιχεία προγραµµατισµού στη JAVA

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

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

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

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

Δομές ελέγχου ροής προγράμματος

ΠΛΗΡΟΦΟΡΙΚΗ Ι (MATLAB) Ενότητα 5

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

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

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

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

Η βασική λειτουργία σε όλες αυτές τις συναρτήσεις είναι η εκτύπωση γραµµών.

Διάλεξη 12η: Δείκτες, μέρος 2

Σημειώσεις δεύτερης εβδομάδας

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

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

Πίνακες Πολλαπλών Διαστάσεων (Multidimensional arrays)

Δοµές Δεδοµένων. 3η Διάλεξη Στοιχειώδεις Δοµές Δεδοµένων: Πίνακες. Ε. Μαρκάκης

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

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

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

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

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

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

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

Δοκιμή και Αποσφαλμάτωση Testing and Debugging

Προγραμματισμός Υπολογιστών Τάξη Γ Αθανασιάδης Χρήστος ΠΕ19 ΑΡΧΗ 1ΗΣ ΣΕΛΙΔΑΣ

Πληροφορική 2. Αλγόριθμοι

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

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

ιαφάνειες παρουσίασης #4

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

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

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

ΗΥ-150. Ταξινόµηση και Αναζήτηση

Μονοδιάστατοι πίνακες Πολυδιάστατοι πίνακες Μέθοδοι Μέθοδοι Recursive Overloading

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

Εργαστηριακή Άσκηση 1

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

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

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

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

Α. unsigned int Β. double. Γ. int. unsigned char x = 1; x = x + x ; x = x * x ; x = x ^ x ; printf("%u\n", x); Β. unsigned char

Σχηματίζοντας Γραφικές Παραστάσεις για Ημίτονο και Συνημίτονο και Ελέγχοντας Περιορισμούς σε Συστάδες Καρτών Τόμπολας

Προγραμματισμός Η/Υ Ι (Χρήση της C) 6 η Θεωρία ΜΟΝΟΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ

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

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

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

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

Στοιχειώδεις Δομές Δεδομένων

Δείκτες & Πίνακες Δείκτες, Πίνακες

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

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

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

Διάλεξη 09: Αλγόριθμοι Ταξινόμησης I

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

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

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

ΕΡΓΑΣΙΑ 4 - Αντικειμενοστραφής Υλοποίηση του Συστήματος Κατανομής Θέσεων σε Προγράμματα Σπουδών

Στοιχεία εξεταζόµενου Αριθµός Απάντησης Βαθµολογία. Σύνολο (Θέµα 4 ο )

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

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

Βασικές Έννοιες Δοµών Δεδοµένων

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

ΑΣΚΗΣΗ 6: ΔΕΙΚΤΕΣ. Σκοπός της Άσκησης. 1. Εισαγωγικά στοιχεία για τους Δείκτες

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

ΠΡΟΓΡΜΜΑΤΑ ΣΕ C. Γράψτε σε γλώσσα προγραμματισμού C τη συνάρτηση:

Τεχνολογία και Προγραμματισμός Υπολογιστών. Η γλώσσα προγραμματισμού C

Επανάληψη. Εντολές while, for, do-while

Αλγοριθμικές Δομές Επιλογής και Επανάληψης Συνθήκες, Λογικές Εκφράσεις και Βρόγχοι

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

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

Διδάσκων: Παναγιώτης Ανδρέου

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

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

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

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

Ανάλυση αλγορίθμων. Χρόνος εκτέλεσης: Αναμενόμενη περίπτωση. - απαιτεί γνώση της κατανομής εισόδου

Δείκτες (Pointers) Ένας δείκτης είναι μια μεταβλητή με τιμή μια διεύθυνση μνήμης. 9.8

ΕΠΛ Φροντιστήριο 3

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

Προγραμματιστικές Τεχνικές

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΠΙΝΑΚΕΣ. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Διδάσκων: Παναγιώτης Ανδρέου

Διάλεξη 08: Λίστες ΙΙ Κυκλικές Λίστες

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

Διάλεξη 13: Δομές Δεδομένων ΙΙ (Ταξινομημένες Λίστες)

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

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

Σύνοψη Προηγούμενου. Πίνακες (Arrays) Πίνακες (Arrays): Βασικές Λειτουργίες. Πίνακες (Arrays) Ορέστης Τελέλης

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

Transcript:

Πίνακες (Arrays) VI-1

Πίνακες Οι πίνακες αποτελούν ένα σημαντικό δομημένο τύπο δεδομένων (structured data type) ή πιο απλά μία δομή δεδομένων (data structure) Οι απλοί τύποι δεδομένων, δηλαδή οι τύποι δεδομένων όπου οι τιμές τους δεν μπορούν να διασπαστούν σε απλούστερα στοιχεία, δεν αρκούν από μόνοι τους: Για υψηλότερη αφαιρετικότητα (δεδομένων) χρειάζονται δομές δεδομένων VI-2

Μία δομή δεδομένων είναι μία συνάθροιση συγγενών δεδομένων τα οποία αποθηκεύονται κάτω από το ίδιο όνομα Ένας πίνακας είναι μία δομή δεδομένων, όπου ένα σύνολο αντικειμένων του ιδίου τύπου αποθηκεύονται σε σειρά, π.χ. Παραδείγματα 1 εκατομμύριο χαρακτήρες σε ένα βιβλίο 10 εκατομμύρια δείγματα ήχου σε ένα αρχείο MP3 73 δισεκατομμύρια αναζητήσεις Google το χρόνο 50 τρισεκατομμύρια κύτταρα στο ανθρώπινο σώμα 6 χιλιάδες φοιτητές στο Πανεπιστήμιο Κύπρου 52 χαρτιά στην τράπουλα κτλ, κτλ VI-3

Πίνακας MonthDays index value 0 31 1 28 2 31 3 30 4 31 5 30 6 31 7 31 8 30 9 31 10 30 11 31 VI-4

Πολλές Μεταβλητές του Ιδίου Τύπου Στόχος: 10 μεταβλητές του ιδίου τύπου // tedious and error-prone double a0, a1, a2, a3, a4, a5, a6, a7, a8, a9; a0 = 0.0; a1 = 0.0; a2 = 0.0; a3 = 0.0; a4 = 0.0; a5 = 0.0; a6 = 0.0; a7 = 0.0; a9 = 0.0; a9 = 0.0; double x = a4 + a8; VI-5

Πίνακες στην Java H Java παρέχει ειδική στήριξη σε πίνακες: 1. Για να δημιουργηθεί ένας πίνακας πρέπει να δηλωθεί, να υλοποιηθεί και να αρχικοποιηθεί 2. Αναφερόμαστε στο στοιχείο i ενός πίνακα a με την έκφραση a[i] 3.Τα στοιχεία ενός πίνακα απαριθμούνται (είναι indexed) από το 0 VI-6

int N = 10; double[] a; // declare the array a = new double[n]; // create the array for (int i = 0; i < N; i++) // initialize the array a[i] = 0.0; // all to 0.0 Συμπαγής, εναλλακτική λύση int N = 10; double[] a = new double[n]; // declare, create, init Default αρχικοποίηση: σε όλους τους αριθμούς ανατίθεται αυτόματα η τιμή 0. Όμως η ρητή αρχικοποίηση αποτελεί γενικά καλύτερη πρακτική. VI-7

Παράδειγμα: Vector Dot Product Το άθροισμα των γινομένων αντίστοιχων στοιχείων δύο διανυσμάτων, x[]και y[] double[] x = { 0.3, 0.6, 0.1 ; double[] y = { 0.5, 0.1, 0.4 ; double sum = 0.0; for (int i = 0; i < N; i++) { sum += x[i]*y[i]; VI-8

Παραδείγματα Επεξεργασίας Πινάκων VI-9

Επεξεργασία Πίνακα Η επεξεργασία ενός πίνακα γίνεται στοιχείο με στοιχείο, π.χ. System.out.println(a[0]); a[3] = 25.0; sum = a[0] + a[1]; sum += a[2]; a[3] += 1.0; a[2] = a[0] + a[1]; Τα στοιχεία ενός πίνακα αποθηκεύονται σε συνεχόμενες θυρίδες στη μνήμη του υπολογιστή. Ως εκ τούτου υπάρχει τυχαία προσπέλαση σε οποιοδήποτε στοιχείο του πίνακα. Αυτό είναι ένα από τα πλεονεκτήματα της δομής του πίνακα. VI-10

Αναπαράσταση Πίνακα στη Μνήμη Η αναπαράσταση ενός πίνακα στη μνήμη αντιστοιχεί απευθείας στη φυσική δομή του υπολογιστή Συνέπειες: Οι πίνακες έχουν σταθερό μέγεθος Υπάρχει ταχεία πρόσβαση στα στοιχεία του πίνακα μέσω του index τους Οι πίνακες είναι δείκτες VI-11

double[] x = {16.0,12.0,6.0,8.0,2.5,12.0, 14.0,-54.3 ; Πίνακας x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] 16.0 12.0 6.0 8.0 2.5 12.0 14.0 54.5 Αναφορά σε στοιχεία του πίνακα: Τι σημαίνουν οι ακόλουθες εκφράσεις; int i = 5; x[4] x[i] x[i+1] x[i+i] x[2*i] x[2*i 3] x[(int)x[4]] x[i++] x[ i] x[i-1] = x[i]; x[i] = x[i+1]; x[i] 1 = x[i]; VI-12

Παράδειγμα: Το ανακάτεμα της τράπουλας Διάσπαση προβλήματος σε υπο-προβλήματα Επιλογή και εκτύπωση ενός τυχαίου χαρτιού από την τράπουλα String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" ; String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" ; int i = (int) (Math.random() * 13); // between 0 and 12 int j = (int) (Math.random() * 4); // between 0 and 3 System.out.println(rank[i] + " of " + suit[j]); VI-13

Δημιουργία και εκτύπωση μιας τράπουλας String[] deck = new String[52]; for (int i = 0; i < 13; i++) for (int j = 0; j < 4; j++) deck[4*i + j] = rank[i] + " of " + suit[j]; for (int i = 0; i < 52; i++) System.out.println(deck[i]); Σε ποια σειρά εκτυπώνεται η τράπουλα; A. 2 of clubs 2 of diamonds 2 of hearts 2 of spades 3 of clubs... B. 2 of clubs 3 of clubs 4 of clubs 5 of clubs 6 of clubs... VI-14

Ανακάτεμα της τράπουλας Στόχος είναι να μπουν τα στοιχεία του πίνακα που αντιπροσωπεύει την τράπουλα σε τυχαία σειρά Αλγόριθμος για το Ανακάτεμα της Τράπουλας, deck: Επανέλαβε όσες φορές είναι τα χαρτιά της τράπουλας (N) Σε κάθε επανάληψη i, επέλεξε ένα τυχαίο χαρτί από το τμήμα της τράπουλας deck[i] μέχρι deck[n-1] Αντάλλαξε το χαρτί αυτό με εκείνο που βρίσκεται στη θέση deck[i] VI-15

int N = deck.length; for (int i = 0; i < N; i++) { int r = i + (int) (Math.random() * (N-i)); String t = deck[r]; deck[r] = deck[i]; εναλλαγή deck[i] = t; ανάμεσα σε i και N-1 VI-16

Βάζουμε τα διάφορα τμήματα μαζί για να συνθέσουμε ολόκληρο το πρόγραμμα public class Deck { public static void main(string[] args) { String[] suit = { "Clubs", "Diamonds", "Hearts", "Spades" ; String[] rank = { "2", "3", "4", "5", "6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace" ; int SUITS = suit.length; int RANKS = rank.length; int N = SUITS * RANKS; String[] deck = new String[N]; for (int i = 0; i < RANKS; i++) for (int j = 0; j < SUITS; j++) deck[suits*i + j] = rank[i] + " of " + suit[j]; for (int i = 0; i < N; i++) { int r = i + (int) (Math.random() * (N-i)); String t = deck[r]; deck[r] = deck[i]; deck[i] = t; αποφυγή "hardwired" σταθερών κτίσιμο τράπουλας ανακάτεμα τράπουλας for (int i = 0; i < N; i++) System.out.println(deck[i]); ΕΠΛ131 Ενότητα VI εκτύπωση ανακατεμένης τράπουλας VI-17

Δοκιμή προγράμματος για το ανακάτεμα της τράπουλας % java Deck 5 of Clubs Jack of Hearts 9 of Spades 10 of Spades 9 of Clubs 7 of Spades 6 of Diamonds 7 of Hearts 7 of Clubs 4 of Spades Queen of Diamonds 10 of Hearts 5 of Diamonds Jack of Clubs Ace of Hearts... 5 of Spades % java Deck 10 of Diamonds King of Spades 2 of Spades 3 of Clubs 4 of Spades Queen of Clubs 2 of Hearts 7 of Diamonds 6 of Spades Queen of Spades 3 of Spades Jack of Diamonds 6 of Diamonds 8 of Spades 9 of Diamonds... 10 of Spades VI-18

Παράδειγμα: Ο Συλλέκτης Κουπονιών Με δεδομένο τον αριθμό Ν των διαφορετικών ειδών καρτών, πόσες κάρτες θα πρέπει να συλλέξεις μέχρι να έχεις τουλάχιστο μία κάρτα από το κάθε είδος; Θεωρούμε ότι για κάθε κάρτα που συλλέγεται υπάρχει η ίδια πιθανότητα σε σχέση με τα διαφορετικά είδη. Αλγόριθμος Προσομοίωσης Επανειλημμένα επέλεξε ένα ακέραιο αριθμό, i, μεταξύ 0 και N-1. Σταμάτησε όταν έχεις τουλάχιστον μία κάρτα από το κάθε είδος. VI-19

Βασικό Υπο-πρόβλημα: Πώς γνωρίζουμε ότι έχουμε ήδη βρει μια κάρτα είδους i; Χρησιμοποιούμε έναν boolean πίνακα, έτσι ώστε found[i] να γίνεται true, όταν έχουμε συλλέξει μια κάρτα είδους i. Όλες οι είσοδοι του πίνακα found αρχικοποιούνται σε false. Η αρχικοποίηση γίνεται αυτόματα. VI-20

Συλλέκτης Κουπονιών: Υλοποίηση του Προγράμματος public class CouponCollector { public static void main(string[] args) { int N = Integer.parseInt(args[0]); int cardcnt = 0; // number of cards collected int valcnt = 0; // number of distinct cards // do simulation boolean[] found = new boolean[n]; while (valcnt < N) { int val = (int) (Math.random() * N); cardcnt++; if (!found[val]) { valcnt++; found[val] = true; είδος επόμενης κάρτας (ανάμεσα σε 0 και N-1) // all N distinct cards found System.out.println(cardcnt); VI-21

Αποσφαλμάτωση Προγράμματος Προσθέστε κώδικα για να εκτυπώνονται τα περιεχόμενα όλων των μεταβλητών (ίχνος προγράμματος) Με πίνακες απαιτείται η ιχνηλάτηση πολλών μεταβλητών! VI-22

Συλλέκτης Κουπονιών: Μαθηματικό Πλαίσιο Με δεδομένο τον αριθμό Ν των διαφορετικών ειδών καρτών, πόσες κάρτες θα πρέπει να συλλέξεις μέχρι να έχεις τουλάχιστο μία κάρτα από το κάθε είδος; Περίπου N (1 + 1/2 + 1/3 + + 1/N) ~ N In N VI-23

Παράδειγμα: Γραμμική Αναζήτηση (Linear Search) Πίνακας x x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] 6 2 7 1 3 9 4 10 12 pos Αρχίζοντας από το πρώτο στοιχείο του πίνακα, διαδοχικά συγκρίνουμε το υπό αναζήτηση στοιχείο με το στοιχείο του πίνακα, μέχρις ότου είτε να εντοπισθεί το στοιχείο, είτε να εξετασθούν όλα τα στοιχεία Επομένως, η αλγοριθμική δομή είναι απροσδιόριστη επανάληψη VI-24

public class LinearSearch { public static void main (String[] args) { int[] x = {6, 2, 7, 1, 3, 9, 4, 10, 12; int pos = 0; int item = Integer.parseInt(args[0]); while (pos < x.length && item!= x[pos]) ++pos; if (pos == x.length) System.out.println( Item not found ); else System.out.println( Item found ); Προσοχή: Σειρά συνθηκών της εντολής while Σημείωση: Λόγω του ότι η επεξεργασία ενός πίνακα γίνεται στοιχείο προς στοιχείο, η επανάληψη (απροσδιόριστη ή απαριθμητή) αποτελεί την πιο κατάλληλη αλγοριθμική δομή για πίνακες VI-25

Εναλλακτικός ορισμός: Η τελευταία είσοδος του πίνακα δεν αποτελεί μέρος του πίνακα, αλλά χώρο αποθήκευσης του υπό αναζήτηση στοιχείου public class LinearSearch { public static void main (String[] args) { int[] x = {6, 2, 7, 1, 3, 9, 4, 10, 12, 0; int pos = 0; x[x.length-1] = Integer.parseInt(args[0]); while (x[pos]!= x[x.length-1]) ++pos; if (pos == x.length-1) System.out.println( Item not found ); else System.out.println( Item found ); VI-26

% java LinearSearch 16 Item not found x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] x[9] 6 2 7 1 3 9 4 10 12 16 % java LinearSearch 9 Item found x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] x[9] 6 2 7 1 3 9 4 10 12 9 VI-27

Παράδειγμα: Δυαδική αναζήτηση Τα στοιχεία του πίνακα είναι ταξινομημένα σε αύξουσα σειρά x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] 1 3 5 7 9 11 13 15 Min pos Max Αλγόριθμος; VI-28

public static boolean binary_search(int[] table, int item) { int Min = 0, Max = table.length 1, pos; do { pos = (Min + Max) / 2; if (item > table[pos]) Min = pos + 1; else Max = pos 1; while (Min <= Max && item!= table[pos]); return item == table[pos]; VI-29

Αλγόριθμος Παράδειγμα: Ταξινόμηση Φυσαλίδας (Bubble Sort) Ενόσω ο πίνακας δεν είναι ταξινομημένος, διαδοχικά σύγκρινε γειτνιάζοντα στοιχεία του πίνακα και ενάλλαξε τα περιεχόμενά τους εάν δεν είναι στη ζητούμενη σειρά Ο αλγόριθμος πιο αναλυτικά Ο αλγόριθμος συνεπάγεται διπλή επανάληψη: Ο εξωτερικός βρόγχος ελέγχει το μήκος του αριστερού τμήματος του πίνακα που χρειάζεται να εξεταστεί. Αρχικά εξετάζεται ολόκληρος ο πίνακας. Ο εσωτερικός βρόγχος ελέγχει τις διαδοχικές συγκρίσεις ανάμεσα στα γειτνιάζοντα στοιχεία του πίνακα. VI-30

Ο αλγόριθμος πιο αναλυτικά Κάθε φορά που ολοκληρώνεται ο εσωτερικός βρόγχος οι εναλλαγές που εκτελέστηκαν, έχουν ως αποτέλεσμα το στοιχείο που πρέπει να βρίσκεται στην τελευταία θέση του εν λόγω τμήματος του πίνακα, να έχει καταχωρηθεί σε εκείνη τη θέση Σε κάθε διαδοχική προσπέλαση του πίνακα (εξωτερικός βρόγχος) το μήκος του τμήματος που χρειάζεται να εξετασθεί μειώνεται κατά ένα Η εξωτερική επανάληψη είναι απροσδιόριστη (ενόσω υπάρχουν στοιχεία σε λανθασμένες θέσεις) ενώ η εσωτερική επανάληψη είναι απαριθμητή (κάθε δυάδα γειτνιαζόντων στοιχείων του εν λόγω τμήματος του πίνακα) VI-31

9 3 5 1 7 1 η Προσπέλαση 9 3 5 1 7 3 9 5 1 7 3 5 9 1 7 3 5 1 9 7 3 5 1 7 9 VI-32

2 η Προσπέλαση 3 5 1 7 9 3 5 1 7 9 3 1 5 7 9 3 η Προσπέλαση 3 1 5 7 9 1 3 5 7 9 VI-33

4 η Προσπέλαση 1 3 5 7 9 1 3 5 7 9 Εάν το στοιχείο του πίνακα που κατέχει την πρώτη θέση στη ζητούμενη σειρά, βρίσκεται στην τελευταία θέση στην αρχική διάταξη, τότε σε κάθε προσπέλαση θα προχωρεί μία θέση προς τα αριστερά VI-34

public static void bubble_sort(int[] table) { boolean Sorted; int len = table.length 1; do {Sorted = true; // Assume that table is sorted for (int k = 0; k < len; k++) if (table[k] > table[k+1]) {int temp = table[k]; table[k] = table[k+1]; table[k+1] = temp; Sorted = false; len; while (!Sorted && len > 0); εναλλαγή VI-35

public class Search{ public static void bubble_sort(int[] table) { public static boolean binary_search(int[] table, int item) { public static void display_table(int[]table){ for (int i = 0; i < table.length; i++) System.out.print(table[i] + ); public static void main (String[] args){ int[] Table = {1, 8, 0, 56, 45, 8, 13, 12; int item = Integer.parseInt(args[0]); System.out.println(); display_table(table); bubble_sort(table); System.out.println(); display_table(table); if (binary_search(table, item)) System.out.println( Found + item); else System.out.println( Not Found + item); % java Search 16 1 8 0 56 45 8 13 12 0 1 8 8 12 13 45 56 Not Found 16 VI-36

Παράδειγμα: Indexed Sort Index Table 0 0 0 45 1 1 1 23 2 2 2 5 3 3 3 102 4 4 4 47 1. Η πρόσβαση στον πίνακα Table γίνεται μέσω του πίνακα Index 2. Τα περιεχόμενα του πίνακα Table δεν εναλλάσσονται - το τι εναλλάσσονται είναι οι είσοδοι του πίνακα Index 3. Μετά την ταξινόμηση η πρώτη σε σειρά είσοδος του Table, θα είναι η είσοδος Table[Index[0]] και η τελευταία η Table[Index[4]] VI-37

// Redefining bubble_sort to use an index array public static void bubble_sort(int[] table, int[] index) { boolean Sorted; int len = table.length 1; for (int k = 0; k < index.length; k++) index[k] = k; do {Sorted = true; // Assume that table is sorted for (int k = 0; k < len; k++) if (table[index[k]] > table[index[k+1]]) {int temp = index[k]; index[k] = index[k+1]; index[k+1] = temp; Sorted = false; len; while (!Sorted && len > 0); VI-38

Ταξινόμηση του Table σε αύξουσα σειρά Index Table 0 2 0 45 1 1 1 23 2 0 2 5 3 4 3 102 4 3 4 47 Η σειρά δηλαδή είναι: Table[Index[0]] Table[2] 5 Table[Index[1]] Table[1] 23 Table[Index[2]] Table[0] 45 Table[Index[3]] Table[4] 47 Table[Index[4]] Table[3] 102 VI-39

// Redefining binary_search to use an index array public static boolean binary_search(int[] table, int[] index, int item) { int Min = 0, Max = table.length 1, pos; do { pos = (Min + Max) / 2; if (item > table[index[pos]]) Min = pos + 1; else Max = pos 1; while (Min <= Max && item!= table[index[pos]]); return item == table[index[pos]]; VI-40

public class Search{ // Incorporating the changes in class Search public static void bubble_sort(int[] table, int[] index) { public static boolean binary_search(int[] table, int [] index, int item) { public static void display_table(int[]table, int[] index){ for (int i = 0; i < table.length; i++) System.out.print(table[index[i]] + ); public static void main (String[] args){ int[] Table = {1, 8, 0, 56, 45, 8, 13, 12; int[] Index = new int[table.length]; for (int i = 0; i < Index.length; i++) Index[i] = i; int item = Integer.parseInt(args[0]); System.out.println(); display_table(table, Index); bubble_sort(table, Index); System.out.println(); display_table(table, Index); if (binary_search(table, Index, item)) System.out.println( Found + item); else System.out.println( Not Found + item); % java Search 16 1 8 0 56 45 8 13 12 0 1 8 8 12 13 45 56 Not Found 16 VI-41

Παρενθετικές Παρατηρήσεις Η τροποποίηση της μεθόδου bubble_sort, και κατ επέκταση των μεθόδων, binary_search και display_table, με την προσθήκη ενός index πίνακα, ενδείκνυται σε περιπτώσεις όπου οι είσοδοι του πίνακα που χρειάζεται να ταξινομηθεί είναι ογκώδεις αφού είναι πολύ πιο αποδοτικό να εναλλάσσονται ακέραιοι παρά μεγάλου όγκου δεδομένα. Αλλαγές, ιδίως σε προγράμματα που ήδη χρησιμοποιούνται, πρέπει να είναι άκρως δικαιολογημένες και να γίνονται με προσοχή, διότι οι επιδράσεις τους μπορεί να μην είναι μόνο σε τοπικό επίπεδο μίας μεθόδου, π.χ. η αλλαγή στην bubble_sort επέφερε αλλαγές στις binary_search και display_table. Αλλαγές στις διεπαφές (interfaces) μεθόδων, όπως αυτήν που έγινε στην bubble_sort, είναι σημαντικές αλλαγές αφού υποχρεωτικά επηρεάζουν κάθε client application. Οι αρχές της αφαιρετικότητας και απόκρυψης πληροφοριών στοχεύουν στη μείωση των καθολικών επιδράσεων τυχόν αλλαγών και στον περιορισμό τους σε καθαρά τοπικό επίπεδο, δηλαδή στο επίπεδο της υλοποίησης των σχετικών μεθόδων. VI-42

Πρόβλημα: Το τρίγωνο του Pascal 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 Να εκτυπωθούν οι πρώτες Ν σειρές του τριγώνου, χρησιμοποιώντας ένα πίνακα μεγέθους Ν στοιχείων (η Ν-οστή σειρά περιέχει Ν στοιχεία) Έστω Ν = 6 1 0 0 0 0 0 1 1 0 0 0 0 1 2 1 0 0 0 1 3 3 1 0 0 1 4 6 4 1 0 1 5 10 10 5 1 VI-43

Αλγόριθμος Χρησιμοποιείται ένας πίνακας ακεραίων μεγέθους N, ο οποίος αρχικοποιείται στην πρώτη σειρά του τριγώνου Στη συνέχεια (αφού εκτυπωθεί η πρώτη σειρά), για κάθε μία από τις υπόλοιπες σειρές (2.. N), υπολογίζεται η επόμενη σειρά από την προηγούμενη σειρά και εκτυπώνεται Βασικά Υπο-προβλήματα: 1. Εκτύπωση δεδομένης σειράς αρχίζει από το πρώτο στοιχείο και προχωρεί μέχρι το τελευταίο στοιχείο της εν λόγω σειράς 2. Υπολογισμός δεδομένης σειράς από την προηγούμενη σειρά αρχίζει από το τελευταίο στοιχείο της εν λόγω σειράς και προχωρεί μέχρι το δεύτερο στοιχείο VI-44

public class Pascal { public static void print_row (int[] table, int row){ for (int k = 0; k < row; k++) System.out.print(table[k] + ); public static void compute_row (int[] table, int row){ for (int k = row 1; k > 0; k ) table[k] = table[k] + table[k 1]; public static void main (String[] args) { int N = Integer.parseInt(args[0]); int[] pascal = new int[n]; pascal[0] = 1; System.out.println(); print_row(pascal,1); for (int k = 2; k <= N; k++) { compute_row(pascal,k); System.out.println(); print_row(pascal,k); VI-45

%java Pascal 10 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 VI-46

Παράδειγμα: Το κόσκινο του Ερατοσθένη Πρώτος αριθμός (prime number): Ένας ακέραιος > 1 του οποίου οι μόνοι θετικοί παράγοντες είναι το 1 και ο εαυτός του Π.χ., 2, 3, 5, 7, 11, 13, 17, 23, Συνάρτηση που μετρά το πλήθος των πρώτων αριθμών: (N) = # primes N Π.χ., (17) = 7 Το κόσκινο του Ερατοσθένη Στον πίνακα isprime[] καταγράφονται οι ακέραιοι που είναι πρώτοι αριθμοί Επανέλαβε για i=2 μέχρι N Εάν ο αριθμός i δεν είναι σημειωμένος ως πρώτος αριθμός Ο i δεν είναι πρώτος αριθμός αφού έχει ήδη βρεθεί κάποιος παράγοντάς του Εάν ο αριθμός i είναι σημειωμένος ως πρώτος αριθμός Ο i είναι πρώτος αριθμός αφού δεν έχει μικρότερους παράγοντες Σημείωσε όλους τους πολλαπλάσιους αριθμούς του i ως μη πρώτους αριθμούς VI-47

Πως καταγράφονται οι πρώτοι αριθμοί N στον πίνακα isprime Πρώτος αριθμός (prime number): Ένας ακέραιος > 1 του οποίου οι μόνοι θετικοί παράγοντες είναι το 1 και ο εαυτός του Π.χ., 2, 3, 5, 7, 11, 13, 17, 23, Συνάρτηση που μετρά το πλήθος των πρώτων αριθμών: (N) = # primes N Π.χ., (17) = 7 VI-48

public class PrimeSieve { public static void main(string[] args) { int N = Integer.parseInt(args[0]); // initially assume all integers are prime boolean[] isprime = new boolean[n+1]; for (int i = 2; i <= N; i++) isprime[i] = true; // mark non-primes <= N using Sieve of Eratosthenes for (int i = 2; i*i <= N; i++) { Υλοποίηση αλγόριθμου Κόσκινο του Ερατοσθένη if (isprime[i]) { for (int j = i; i*j <= N; j++) isprime[i*j] = false; εάν ο i είναι πρώτος αρ, σημείωσε τα πολλαπλάσια του i ως μη πρώτους αριθμούς // count primes int primes = 0; for (int i = 2; i <= N; i++) if (isprime[i]) primes++; StdOut.println("The number of primes <= " + N + " is " + primes); % java PrimeSieve 1000 The number of primes <= 1000 is 168 VI-49

Επέκταση της κλάσης PrimeSieve με την προσθήκη της μεθόδου displayprimes για την εκτύπωση των πρώτων αριθμών, ανά n αριθμούς σε κάθε γραμμή $ java PrimeSieve 1000 The number of primes <= 1000 is 168 Εκτύπωση των 168 πρώτων Listing the primes <= 1000 αριθμών ανά 10 σε κάθε γραμμή 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 211 223 227 229 233 239 241 251 257 263 269 271 277 281 283 293 307 311 313 317 331 337 347 349 353 359 367 373 379 383 389 397 401 409 419 421 431 433 439 443 449 457 461 463 467 479 487 491 499 503 509 521 523 541 547 557 563 569 571 577 587 593 599 601 607 613 617 619 631 641 643 647 653 659 661 673 677 683 691 701 709 719 727 733 739 743 751 757 761 769 773 787 797 809 811 821 823 827 829 839 853 857 859 863 877 881 883 887 907 911 919 929 937 941 947 953 967 971 977 983 991 997 VI-50

public static void displayprimes (boolean isprime[], int n){ System.out.println("Listing the primes <= " + (isprime.length-1)); int count = 0; for (int i = 2; i < isprime.length; i++){ if (isprime[i]) {System.out.print(i + " "); count++; if (count % n == 0) System.out.println(); // calling displayprimes from main displayprimes(isprime,10); Είναι ο ακόλουθος αναδιατυπωμένος ορισμός της displayprimes λογικά ισοδύναμος με τον πιο πάνω ορισμό; public static void displayprimes (boolean isprime[], int n){ System.out.println("Listing the primes <= " + (isprime.length-1)); int count = 0; for (int i = 2; i < isprime.length; i++){ if (count % n == 0) System.out.println(); if (isprime[i]) {System.out.print(i + " "); count++; VI-51

Σύνοψη Πίνακας ως δομή δεδομένων Η Java παρέχει ειδική στήριξη Δημιουργία Πίνακα Δήλωση, υλοποίηση, αρχικοποίηση Τυχαία προσπέλαση Επεξεργασία Πίνακα Αναφορά σε στοιχεία του πίνακα Κατάλληλη αλγοριθμική δομή: επανάληψη VI-52