Προγραμματισμός FORTRAN > Μαθήματα > Πίνακες
Αρχική-HomeΠαραδείγματαΕντολές-ΣυναρτήσειςΟδηγίες-FAQsΣυνδέσεις-Links

ΜΑΘΗΜΑ: ΠΙΝΑΚΕΣ

Οι μεταβλητές που περιέχουν μόνο μια τιμή λέγονται βαθμωτές (scalar) και δεν έχουν διαστάσεις. Όμως, τα πιο σοβαρά προβλήματα που λύνονται με υπολογιστές, κάνουν χρήση της γραμμικής άλγεβρας και των πινάκων και δεν είναι εύκολο να περιγραφούν με βαθμωτές ποσότητες. Για παράδειγμα, οι συντεταγμένες (x, y, z) ενός σημείου στο χώρο, αντί να είναι τρεις χωριστοί αριθμοί (Χ, Υ, Ζ), μπορούν να αναπαρασταθούν σαν ένα μονοδιάστατο μητρώο Α τριών θέσεων, όπου το Α(1) θα είναι η συντεταγμένη Χ, το Α(2) η συντεταγμένη Υ και το Α(3) η συντεταγμένη Ζ.

Χ

Υ

Ζ

Α

Χ

,

Υ

,

Ζ

=>

Α(1),

Α(2),

Α(3)

Τα μητρώα είναι απαραίτητα για επαναλαμβανόμενες ομοειδής πράξεις. Για παράδειγμα, αν έχουμε 300 μεταβλητές, όλες με διαφορετικά ονόματα, θα πρέπει να γράψουμε 300 εκτελέσιμες εντολές, μια για κάθε μεταβλητή. Αν όμως τις έχουμε αποθηκεύσει σαν ένα μητρώο των 300 θέσεων (A), τότε γράφουμε μια μόνο γενικόή εντολή για το A(i), και την επαναλαμβάνουμε 300 φορές με ένα DO αλλάζοντας τον δείκτη i από το 1 έως το 300. Όταν χρησιμοποιούμε πίνακες κάνουμε έντονη χρήση της εντολής DO, και μάλιστα ο μετρητής ή ο δείκτης της DO, έχει άμεση σχέση με τους δείκτες του πίνακα.

Για να χρησιμοποιήσουμε ένα μητρώο θα πρέπει πρώτα να Δηλωθούν οι Διαστάσεις του στην αρχή του προγράμματος. Στη συνέχεια, με τη κατάλληλη Χρήση των Δεικτών του μητρώου, θα πρέπει να γίνει Ανάθεση Τιμών στα στοιχεία του. Έτσι, αποθηκεύοντας το μητρώο στη Μνήμη, το έχουμε διαθέσιμο για περαιτέρω επεξεργασία ή εκτύπωση.


αρχή

ΔΗΛΩΣΗ ΤΩΝ ΔΙΑΣΤΑΣΕΩΝ ΕΝΟΣ ΜΗΤΡΩΟΥ

Τα μητρώα δηλώνονται στην αρχή του προγράμματος, όπως και οι άλλες μεταβλητές, με τις γνωστές εντολές δηλώσεων (REAL, INTEGER, ...) με τη διαφορά ότι πρέπει πάντοτε να συνοδεύονται από τους αριθμούς που δηλώνουν τις διαστάσεις τους. Σε περιπτώσεις πολλών ίδιων πινάκων χρησιμοποιούμε τη κοινή δήλωση διαστάσεων με τη DIMENSION. Π.χ.:

INTEGER:: pinakas(1:2,1:3)
INTEGER, DIMENSION(2,3):: pinakas1, pinakas2, sum
REAL:: A(3), pinakas(4,4,6)
REAL, DIMENSION(3):: SimeioA, SimeioB, SimeioC
CHARACTER:: OnomaSpoudasti(150)*20
CHARACTER(LEN=20), DIMENSION(150):: OnomaSpoudasti
REAL:: B(0:15), c1(-100:100)
REAL:: D(4) = (/ 2.0, 4.0, 6.0, 8.0 /)
REAL:: e(9) = (/ (i, i=1,9) /)
INTEGER, PARAMETER, DIMENSION(2):: k=(/ 10, 20 /)

Σημειώσεις:

  • όταν όλα τα μητρώα μιας δήλωσης έχουν τις ίδιες διαστάσεις μπορούμε να χρησιμοποιήσουμε τη λέξη DIMENSION και να γράψουμε τις διαστάσεις μόνο μια φορά στην αρχή.
  • ένας πίνακας μπορεί να έχει πολλές διαστάσεις, τις οποίες και χωρίζουμε με κόμματα.
  • το μέγεθος κάθε διάστασης δηλώνεται είτε αναλυτικά (αρχή : τέλος), είτε συνοπτικά με τη τελική μόνο τιμή οπότε η αρχική θεωρείται το 1. Π.χ.: (2, 3) = (1:2, 1:3). Είναι μια καλή τακτική να γίνεται η δήλωση αναλυτικά, ώστε να μην συγχέεται οπτικά με την αναφορά στα στοιχεία του πίνακα.
  • στην εντολή δήλωσης μπορούν να δοθούν και οι τιμές των στοιχείων του μητρώου

αρχή

ΧΡΗΣΗ ΤΩΝ ΔΕΙΚΤΩΝ ΕΝΟΣ ΜΗΤΡΩΟΥ

Για να αναφερθούμε σε ένα μητρώο (ή πίνακα) χρησιμοποιούμε το όνομά του όπως δηλώθηκε στην αρχή του προγράμματος. Αν όμως θέλουμε να χειριστούμε μόνο ένα μέρος του ή ένα στοιχείο του, τότε χρησιμοποιούμε το όνομα του μητρώου ακολουθούμενο από τους δείκτες του σε παρένθεση, όπως και στη γραμμική άλγεβρα.

A(1:m,1:n)

 

j = 1, n

Πίνακας (m x n)

A( i, j )

1

2

3

...

n

 

i = 1,m

1

A(1,1)

A(1,2)

A(1,3)

...

A(1,n)

2

A(2,1)

A(2,2)

A(2,3)

...

A(2,n)

3

A(3,1)

A(3,2)

A(3,3)

...

A(3,n)

4

A(4,1)

A(4,2)

A(4,3)

...

A(4,n)

...

...

...

...

A(i,j)

...

m

A(m,1)

A(m,2)

A(m,3)

...

A(m,n)

Οι δείκτες και τα στοιχεία ενός 2-διάστατου μητρώου (πίνακα) μεγέθους (m x n).

Στον παραπάνω πίνακα, για να αναφερθούμε στο στοιχείο της γραμμής i και της στήλης j γράφουμε: A(i, j ). Για να αναφερθούμε στη επιλεγμένη περιοχή του πίνακα, γράφουμε τα όρια των δεικτών: A(2:3, 1:2 ). Τέλος, για να αναφερθούμε σε ολόκληρο το πίνακα, γράφουμε απλά A, ενώ για να το δηλώσουμε στην αρχή του προγράμματος γράφουμε: A(1:m, 1:n ).

Συνηθίζεται να χρησιμοποιούμε τα γράμματα i, j, k, l, m & n για δείκτες σε μητρώα, χωρίς όμως να είναι δεσμευτικό, διότι συμβαδίζει με τις συνήθειες πολλών θετικών επιστημών. Τα ίδια γράμματα τα συναντάμε και σαν δείκτες σε βρόγχους επανάληψης. Οι μεταβλητές που χρησιμοποιούνται σαν δείκτες σε μητρώα και σε βρόγχους δηλώνονται σαν ακέραιοι (INTEGER).

Οι δείκτες είναι το μέσο με το οποίο μπορούμε να εφαρμόσουμε τη ίδια πράξη σε όλα τα στοιχεία ενός μητρώου. Τοποθετούμε λοιπόν τη πράξη μέσα σε ένα βρόγχο και την επαναλαμβάνουμε αλλάζοντας κάθε φορά τις τιμές των δεικτών. Για κάθε διάσταση του μητρώου χρειάζεται και ένας βρόγχος με διαφορετικό δείκτη και όρια ανάλογα με τις διαστάσεις του και τα στοιχεία που συμμετέχουν στη πράξη. Έστω ότι έχουμε τα δύο παραπάνω μητρώα, και υπολογίζουμε το Β από τα στοιχεία του Α.

REAL :: B(1:5), A(1:5)=(/ 1.0, 2.0, 3.0, 4.0, 5.0 /)
DO i = 1,5
  B(i) = A(i) + 5.0
END DO

Το παραπάνω do θα δώσει στο δείκτη i διαδοχικά τις τιμές: 1, 2, 3, 4, 5, και θα εκτελέσει τη πράξη για κάθε μια τιμή, έτσι ώστε τα Α(1), Α(2), Α(3), Α(4) και Α(5) θα αυξηθούν κατά 5.0 και θα αποθηκευτούν στα Β(1), Β(2), Β(3), Β(4) και Β(5) αντίστοιχα.

Όταν η πράξη αφορά μια ομάδα γειτονικών στοιχείων μπορούμε να γράψουμε τα όρια των δεικτών κατ’ ευθείαν στη θέση των δεικτών. Π.χ.: Τα στοιχεία Β(2), Β(3) και Β(4) θα γίνουν διπλάσια από τα Α(2), Α(3) και Α(4), αντίστοιχα, με την εντολή:

B(2:4) = 2.0 * A(2:4)

Αν πάλι η πράξη αφορά όλο το μητρώο τότε γράφουμε μόνο το όνομά του χωρίς δείκτες. Π.χ.: Τα πέντε στοιχεία του μητρώου Β θα γίνουν δεκαπλάσια από τα αντίστοιχα στοιχεία του Α.

B = A * 10.0

 


αρχή

ΑΝΑΘΕΣΗ ΤΙΜΩΝ ΣΤΑ ΣΤΟΙΧΕΙΑ ΕΝΟΣ ΜΗΤΡΩΟΥ

Για να δώσουμε τιμές σε ένα μητρώο, είτε τις δίνουμε στοιχείο-στοιχείο:

  1. b(1,1,1)=1.0; b(2,1,1)=2.0; b(1,2,1)=3.0; b(2,2,1)=4.0
    b(1,1,2)=5.0; b(2,1,2)=6.0; b(1,2,2)=7.0; b(2,2,2)=8.0
  2. DO j = 10, 80, 10
      A(j) = REAL(j)
    END DO
  3. DO i = 1, 2
      DO j = 1, 4
        C(i,j) = SIN(REAL(i*j))
      END DO
    END DO

ή, χρησιμοποιούμε τους αντίστοιχους σύντομους τρόπους:

  1. b = (/ 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0 /)
  2. Α = (/ REAL(j), j= 10, 80, 10) /)
  3. C = (/ ((SIN(REAL(i*j)), i=1,2),j=1,4) /)

Τη πιο πάνω μορφή DO (3) την λέμε και πλάγιο DO (implied do) και τη συναντάμε κυρίως στις εντολές εισόδου/εξόδου για πίνακες.


αρχή

ΑΠΟΘΗΚΕΥΣΗ ΜΗΤΡΩΟΥ ΣΤΗ ΜΝΗΜΗ

Τα μητρώα αποθηκεύονται σε συνεχόμενες θέσεις μνήμης σαν να ήταν μονοδιάστατα ανεξάρτητα από το μορφή τους.

REAL :: A(8), b(2,2,2), C(2,4), d(-1:2,0:1)

Τα παραπάνω μητρώα έχουν όλα το ίδιο μέγεθος (size), 8, αλλά διαφορετική μορφή (shape). Το Α είναι μονοδιάστατο (rank=1) διάνυσμα (1x8), το b είναι τρισδιάστατο (rank=3) διάνυσμα (2x2x2), και τα C & d είναι δισδιάστατα (2x4) & (4x2) αντίστοιχα.

Όλα χρειάζονται χώρο αποθήκευσης 8 θέσεων, και οι στήλες τους τοποθετούνται η μία κάτω από την άλλη.

Θέσεις Μνήμης

Α(8)

b(2,2,2)

C(2,4)

d(-1:2,0:1)

         

1

A(1)

b(1,1,1)

C(1,1)

d(-1,0)

2

A(2)

b(2,1,1)

C(2,1)

d( 0,0)

3

A(3)

b(1,2,1)

C(1,2)

d( 1,0)

4

A(4)

b(2,2,1)

C(2,2)

d( 2,0)

5

A(5)

b(1,1,2)

C(1,3)

d(-1,1)

6

A(6)

b(2,1,2)

C(2,3)

d( 0,1)

7

A(7)

b(1,2,2)

C(1,4)

d( 1,1)

8

A(8)

b(2,2,2)

C(2,4)

d( 2,1)


αρχή

Prev Μάθημα Next


Παραδείγματα

Ερωτήσεις


©2006 Δρ. Β. Χ. Μούσας, Επικ. Καθ., e-mail Τ.Ε.Ι. ΑθήναςΤμήμα Πολιτικών Έργων Υποδομής