Πίνακες
Ας υποθέσουμε ότι θέλουμε να δώσουμε (διαβάσουμε, read) τιμές σε 5.000 ακεραίους αριθμούς (integers) και να κάνουμε κάποιες πράξεις μαζί τους. Πώς θα πρέπει να αποθηκεύσουμε αυτούς τους αριθμούς;
Μια λύση θα ήταν να χρησιμοποιήσουμε 5.000 διαφορετικές μεταβλητές (variables), ως εξής;
aa, ab, ac, ad, ... aaa, aab, ... aba, ...
και μια άλλη λύση θα ήταν να χρησιμοποιήσουμε έναν πίνακα ή διάταξη ή μεταβλητή με δείκτη (array).
Οι πίνακες (array) περιέχουν πολλές θέσεις αποθήκευσης, που είναι όλες του ΙΔΙΟΥ τύπου δεδομένων.
Οι Μονοδιάστατοι Πίνακες
Στους μονοδιάστατους πίνακες (one-dimensional array) μπορούμε να αναφερόμαστε σε μια θέση αποθήκευσης με το όνομα του πίνακα και με την τιμή ενός δείκτη (index).
Ο ορισμός του πίνακα γίνεται ως εξής:
Ως τύπο:
type typename = array [enumerated_type] of another_data_type;
Ο τύπος δεδομένων (another_data_type) μπορεί να είναι ο,τιδήποτε, ακόμη κι ένας άλλος πίνακας (array).
Για τον τύπο του δείκτη (enumerated_type) πρέπει να είναι απαριθμητός τύπος (enumerated type). Μπορούμε να καθορίσουμε τον απαριθμητό τύπο μέσα στις αγκύλες ή μπορούμε να χρησιμοποιήσουμε έναν προκαθορισμένο απαριθμητό τύπο.
Αυτό σημαίνει ότι η παρακάτω δήλωση :
type enum_type = 1..50; arraytype = array [enum_type] of integer;
είναι ισοδύναμη με την εξής :
type arraytype = array [1..50] of integer;
Για να δηλώσουμε ένα string (συμβολοσειρά), γράφουμε τα εξής:
type String = packed array [0..255] of char;
Ο όρος packed σημαίνει ότι ο πίνακας (array) θα συμπιεσθεί ώστε να καταλαμβάνει τον μικρότερο δυνατό χώρο μνήμης.
Οι πίνακες είναι ιδιαίτερα χρήσιμοι όταν θέλουμε να αποθηκεύσουμε μεγάλες ποσότητες δεδομένων για να τις χρησιμοποιήσουμε αργότερα μέσα στο πρόγραμμα.
Εργάζονται εξαιρετικά καλά με τους ΒΡΟΧΟΥΣ FOR.
Για παράδειγμα, για να διαβάσουμε 50 αριθμούς, κάνουμε πρώτα τις δηλώσεις :
type arraytype = array[1..50] of integer;
και
var myarray : arraytype;
και γράφουμε μετά την εντολή :
for count := 1 to 50 do read (myarray[count]);
Χρησιμοποιούμε τις αγκύλες για να περικλείσουμε τον δείκτη (subscript) όταν αναφερόμαστε σε πίνακες (arrays).
myarray[5] := 6;
Ως μεταβλητή:
Ευκολότερος τρόπος δήλωσης πινάκων. Αυτό φαίνεται καλύτερα στο παρακάτω παράδειγμα:
program exArrays; var n: array [1..10] of integer; (* n πίνακας 10 θέσεων integers *) i, j: integer; begin (* αρχικοποίηση του πίνακα n για 10 θέσεις*) for i := 1 to 10 do n[ i ] := i + 100; (* βάλε το νούμερο στην θέση i του πίνακα ως i + 100 *) (* εξαγωγή των στοιχείων του πίνακα *) for j:= 1 to 10 do writeln('Element[', j, '] = ', n[j] ); end.
Με την εντολή n: array [1..10] of integer;
δημιουργήσαμε έναν πίνακα 10 θέσεων, που η κάθε θέση μπορεί να περιέχει ακεραίους (integer).
Προσέξτε πόσο καλά λειτουργούν συνδυαστικά η δύο βρόγχοι επανάληψης FOR, ο πρώτος για την εισαγωγή τιμών στον πίνακα και ο δεύτερος για την εξαγωγή τους (στην οθόνη). Το αποτέλεσμα θα είναι:
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
Element[10] = 110
Πίνακες ως παράμετροι σε υποπρογράμματα:
Σημείωση:
- Πρώτα δημιουργούμε τύπο ενός πίνακα.
- Στην συνέχεια δημιουργούμε μεταβλητή για τον νέο τύπο.
- Έπειτα στέλνουμε τον πίνακα στο υποπρόγραμμα δίνοντας απλώς σκέτο το όνομα του (το όνομα της μεταβλητής του)
- Σημαντική είναι η χρήση της δεσμευμένης λέξης var στην κεφαλή του υποπρογράμματος ως κλήση call by reference από το κυρίως πρόγραμμα!
Αυτό φαίνεται καλύτερα στο παρακάτω παράδειγμα:
program arrayToFunction; const size = 5; //-------------------------------- type a = array [1..size] of integer; //-------------------------------- var balance: a = (1000, 2, 3, 17, 50); average: real; //-------------------------------- function avg( var arr: a) : real; var i :1..size; sum: integer; begin sum := 0; for i := 1 to size do sum := sum + arr[i]; avg := sum / size; end; //-------------------------------- begin (* Passing the array to the function *) average := avg( balance ) ; (* output the returned value *) writeln( 'Average value is: ', average:7:2); end.
Οι Δισδιάστατοι Πίνακες
Με την εντολή n: array [1..10, 1..10] of integer; δημιουργούμε έναν δισδιάστατο πίνακα 10×10 θέσεων, που η κάθε θέση π.χ. n[2,5] ή n[3,3] ή n[9,6] κλπ. μπορεί να περιέχει ακεραίους (integer). Ισχύουν όλες οι πράξεις για τους πίνακες όπως τις γνωρίσαμε.
Για την προσπέλαση των στοιχείων χρησιμοποιούνται εμφωλιασμένες for εντολές (εμφωλιασμένοι βρόγχοι).
Ακολουθεί παράδειγμα κατανόησης για πίνακα 3χ3 δύο διαστάσεων:
program ex2dimarray; var a: array [0..3, 0..3] of integer; i,j : integer; begin for i:=0 to 3 do for j:=0 to 3 do a[i,j]:= i * j; for i:=0 to 3 do begin for j:=0 to 3 do write(a[i,j]:2,' '); writeln; end; end.