Πίνακες στη γλώσσα προγραμματισμού Pascal

Πίνακες στη γλώσσα προγραμματισμού Pascal

Πίνακες

Ας υποθέσουμε ότι θέλουμε να δώσουμε (διαβάσουμε, 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

Πίνακες ως παράμετροι σε υποπρογράμματα:

Σημείωση:

  1.  Πρώτα δημιουργούμε τύπο ενός πίνακα.
  2. Στην συνέχεια δημιουργούμε μεταβλητή για τον νέο τύπο.
  3. Έπειτα στέλνουμε τον πίνακα στο υποπρόγραμμα δίνοντας απλώς σκέτο το όνομα του (το όνομα της μεταβλητής του)
  4. Σημαντική είναι η χρήση της δεσμευμένης λέξης 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.

Απάντηση

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.