Το πρόγραμμα του αρχείου ΜULTIARY.C δίνει παραδείγματα πολυδιάστατων
πινάκων.
Διαπιστώνουμε οτι έχουν δηλωθεί δύο διδιάστατοι πίνακες ακεραίων με
ονόματα big και large. Ο αριθμός των διαστάσεων καθορίζεται από τον αριθμό
των ζευγών τετράγωνων παρενθέσεων που ακολουθούν το όνομα. Ο αριθμός που
βρίσκεται ανάμεσα στο πρώτο ζεύγος τετράγωνων παρενθέσεων καθορίζει το
μέγεθος της πρώτης διάστασης (αριθμός γραμμών του πίνακα). Ο δεύτερος
αριθμός καθορίζει το μέγεθος της δεύτερης διάστασης (αριθμός στηλών). Αν
υπήρχε τρίτος αριθμός θα καθόριζε το μέγεθος της τρίτης διάστασης (τον αριθμό
των επιπέδων), κ.ο.κ. Ο συνολικός αριθμός των στοιχείων καθορίζεται από το
γινόμενο των μεγεθών των διαστάσεων. Έτσι ο πίνακας big έχει 64 στοιχεία
ενώ ο πίνακας large έχει 3000 στοιχεία.
Όπως και στους μονοδιάστατους πίνακες το κάθε στοιχείο έχει το δικό του
όνομα που ορίζεται ως συνδυασμός βάσης και απόστασης. Τα ονόματα των
στοιχείων του πίνακα big είναι
big[0][0],big[0][1],...,big[0][7],big[1][0],...,big[7][6],big[7][7],
Στην παραπάνω διάταξη φαίνεται και η σειρά με την οποία είναι απποθηκευμένα
τα στοιχεία στη μνήμη, δηλαδή έχουμε αποθήκευση κατά γραμμή. Ο συνδυασμός
βάσης και απόστασης είναι τώρα λίγο πίο περίπλοκος και ονομάζεται γενικά
συναρτηση απεικόνισης. Στον πίνακα που ακολοθουθεί δίνεται η συνάρτηση
απεικόνισης ενός διδιάστατου πίνακα με εφαρμογή στον πίνακα big.
|
Είναι προφανής η επέκταση τόσο γιά τον large όσο και γιά πίνακες
μεγαλυτέρων διαστάσεων. Η διεύθυνση ενός τυχαίου στοιχείου του πίνακα
μπορεί να εκφαρστεί όπως και γιά τους μονοδιάστατους πίνακες με το πρόθεμα
&. Έτσι το στοιχείο big[0][0] έχει διεύθυνση &big[0][0] που είναι ίση με την
βάση, δηλαδή το όνομα big. Δεδομένου οτι έχουμε αποθήκευση κατά γραμμή
μπορούμε να ορίσουμε και τη βάση κάθε γραμμής, δηλαδή τη διεύθυνση του
μηδενικού στοιχείου κάθε γραμμής. Έτσι η διεύθυνση &big[1][0] είναι η βάση
της πρώτης γραμμής που μπορεί να συμβολιστεί και ως big[1]. Γενικά επομένως
έχουμε
&big[0][0] = big[0] = big
&big[1][0] = big[1]
&big[2][0] = big[2]
...
&big[7][0] = big[7]
Μετά τις δηλώσεις προχωρούμε στις εκτελέσιμες προτάσεις. Διαπιστώνουμε τη
χρήση δύο επιπέδων στις προτάσεις επανάληψης for. Γενικά μπορούμε να πούμε
οτι χρησιμοποιούμε τόσα επίπεδα επανάληψης όσες και οι διαστάσεις που
θέλουμε να σαρώσουμε. Επομένως είναι λογικό να περιμένει κανείς σε
προγράμματα επεξεργασίας διδιάστατων πινάκων αρκετές επναλαήψεις δύο
επειπέδων.
Το πρώτο διπλό for εκχωρεί τιμές στα στοιχεία του πίνακα big. Συνηθίζεται η
σειρά των επιπέδων επανάληψης να συμφωνεί με τη διάταξη αποθήκευσης των
στοιχείων στη μνήμη, εκτός αν υπάρχει συγκεκριμένος λόγος να γίνει
διαφορετικά. Έτσι το εξωτερικό for απαριθμεί τις γραμμές του πίνακα με τον
μετρητή i, ενώ το εσωτερικό for απαριθμεί τις στήλες του πίνακςα με τον
μετρητή j. Η σύμβαση χρήσης των μετρητών i, j, k γιά τη σάρωση πινάκων
προέρχεται από την Fortran και διατηρείται μέχρι σήμερα. 'Ομως πρέπει να γίνει
κατανοητό οτι πρέκειται γιά μιά σύμβαση και τίποτε δεν συνδέει το i με τις
γραμμές εκτός από τη σύμβαση αυτή. Τελικά το πρώτο διπλό for αποθηκεύει
στα στοιχεία του big έναν πίνακα πολλαπλασιασμού ενώ το δεύτερο διπλό for
αποθηκεύει στον large έναν πίνακα πρόσθεσης.
Οι επόμενες τρείς προτάσεις δίνουν παραδείγματα χειρισμού των στοιχείων
διδιάστατων πινάκων. 'Οπως και στους μονοδιάστατους πίνακες το καθε
στοιχείο αποτελεί ένα αυτόνομο δεδομένο και μπορούμε να το χειριστούμε
ανάλογα. Ιδιαίτερο ενδιαφέρον παρουσιάζει η τρίτη πρόταση η οποία
χρησιμοποιεί τη λεγόμενη έμμεση διευθυνσιοδότηση (indirect addressing). Η
πρακτική αυτή είναι πολύ διαδεδομένη σε γλώσσες assembly ή γλώσσες που δεν
υποστηρίζουν δείκτες, γιά τη δημιουργία πιό σύνθετων δομών δεδομένων, όπως
λίστες, δένδρα, κ.λ.π. Ορισμένα στοιχεία του πίνακα δεν περιέχουν δεδομένα
αλλά τις διευθύνσεις των στοιχείων που έπονται στη σειρά. Με αυτό τον τρόπο η
σειρα΄επεξεργασία των στοιχείων μπορεί να αλλάξει δυναμικά. Θα μπορούσαμε
να σκεφτούμε, ας πούμε τον πίνακα large σαν ένα δυαδικό δένδρο όπου κάθε
τριάδα στοιχείων καθορίζει την τιμή, τον δεξιό και τον αριστερό κλάδο ενός
κόμβου. Έτσι σε ένα σύνολο 3000 στοιχείων μπορεί να αποθηκευτούν 1000
κόμβοι ενός δυαδικού δένδρου.
Τελικά το πρόγραμμα παρουσιάζει μιά απλή τεχνική διαμορφωμένης εκτύπωσης
διδιάστατου πίνακα. Πρόκειται γιά ένα διπλό for με απαρίθμηση γραμμής και
στήλης. Μόλις το εσωτερικό for εκτυπώσει μιά γραμμή και πριν ξεκινήσει η
επόμενη επανάληψη του εξψτερικού for αλλάζουμε γραμμή. Το αποτέλεσμα
δίνεται παρακάτω.
0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7
0 2 5 6 8 10 748 14
0 3 6 9 12 15 18 21
0 4 8 12 16 20 24 28
0 5 10 15 20 177 30 35
0 6 12 18 24 30 36 42
0 7 14 21 28 35 42 49
|