ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ Διάλεξη 2: Πίνακες και δυναμικά δεδομένα στη FORTRAN 90 Εαρινό εξάμηνο 2009 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ι. Σαρρής, τηλ.
Οργάνωση παρουσίασης •Θα δούμε την σύνταξη και την χρήση των δυναμικών πινάκων •Την εισαγωγή των δυναμικών πινάκων στις διαδικασίες •Τους παράγωγους τύπους δεδομένων •Τους δείκτες και την χρήση τους
Πίνακες Πίνακας είναι μια σύνθετη μεταβλητή που καταλαμβάνει παραπάνω από μια θέση στην μνήμη του Η/Υ, έχει ένα συγκεκριμένο όνομα και δέχεται ένα συγκεκριμένο τύπο δεδομένων. Λόγοι χρήσης των πινάκων είναι οι : •Η χρησιμοποίηση των δεδομένων παραπάνω από μια φορά. •Η αποθήκευση των δεδομένων πριν τη χρησιμοποίηση τους.
Πίνακες •Στατικοί πίνακες (static arrays) Ένας πίνακας που καταλαμβάνει έναν συγκεκριμένο χώρο μνήμης σε όλη την εκτέλεση του προγράμματος ονομάζεται στατικός πίνακας. Η διάσταση των στατικών πινάκων ορίζεται στην αρχή του προγράμματος και καταλαμβάνει συγκεκριμένο ποσό μνήμης σε όλη τη διάρκεια του προγράμματος. Αυτό έχει ως αποτέλεσμα τη δέσμευση μεγάλου μέρους της μνήμης του Η/Υ. •Δυναμικοί πίνακες (dynamic arrays) Οι δυναμικοί πίνακες δηλώνονται όπως και οι στατικοί πίνακες στην αρχή του προγράμματος, αλλά η διάστασή τους ορίζεται στη διάρκεια εκτέλεσης του προγράμματος, οπότε και την συγκεκριμένη στιγμή καταλαμβάνουν κομμάτι της μνήμης του Η/Υ. Στη συνέχεια, αν δεν χρειάζονται, μπορούμε να τους καταργήσουμε αποδεσμεύοντας το συγκεκριμένο κομμάτι της μνήμης του Η/Υ για άλλες λειτουργίες.
Πως δηλώνουμε τους Πίνακες •Στατικοί πίνακες Μέχρι και τη Fortran 77, η γενική μορφή της εντολής DΙΜEΝSΙΟΝ είναι: Dimension "όνομα πίνακα" (Χ : Υ) Το Χ εκφράζει την κατώτερη τιμή που μπορεί να πάρει ο δείκτης και όταν λείπει εννοείται η μονάδα. Το Υ εκφράζει την ανώτερη τιμή και πρέπει να υπάρχει υποχρεωτικά. Ο τύπος των πινάκων ακολουθεί τους ίδιους κανόνες με μία απλή μεταβλητή. Π.χ Dimension Α(15), Β(10, 10), C(-5 : 5), Κ(3, 2, 2) Για τον πίνακα Α(15) κρατάμε 15 διαδοχικές θέσεις μνήμης. Για τον πίνακα Β(10,10) κρατάμε 10*10 = 100 διαδοχικές θέσεις μνήμης. Για τον πίνακα C(-5:5) κρατάμε συνολικά 11 θέσεις μνήμης. Για τον πίνακα Κ(3, 2, 2) κρατάμε συνολικά 3*2*2 = 12 θέσεις μνήμης.
Πως δηλώνουμε τους Πίνακες •Στατικοί πίνακες Με τη Fortran 90/95 η γενική μορφή της εντολής Dimension γίνεται : Τύπος, Dimension (Χ : Υ) :: "όνομα πίνακα" Ο Τύπος, είναι ένας από τους γνωστούς και αποδεκτούς τύπους των μεταβλητών. Μπορούμε να δηλώσουμε ταυτόχρονα και περισσότερα ονόματα πινάκων χωρισμένα με υποδιαστολή. Π.χ. μπορούμε να γράψουμε : Real, Dimension (15) :: Α, Β, C(-5 : 5), Κ(3, 2, 2) ή Integer, Dimension (10, 10) :: Α, Β, C
Πως δηλώνουμε τους Πίνακες Εναλλακτικά, μπορούμε να δηλώσουμε τους πίνακες χωρίς την χρήση της εντολής Dimension, μέσω των, γνωστών από τις μεταβλητές, δηλωτικών εντολών. Π.χ. μπορούμε να γράψουμε τις ακόλουθες εντολές: Real X(5, 5), Y(5, 5) Integer Tab(100), Pin(10, 20)
Τοποθέτηση Τιμών σε Πίνακα α) Από το χρήστη Μπορούμε να χρησιμοποιήσουμε την εντολή Do – End Do: Integer A Dimension A(5) Write(*, *) "Πληκτρολογείστε πέντε τιμές" Do i =1, 5 Read(*, *) A(i) End Do Να έχουμε απευθείας ανάγνωση του πίνακα Α Integer A Dimension A(5) Write(*, *) "Πληκτρολογείστε πέντε τιμές" Read(*, *) Α
Τοποθέτηση Τιμών σε Πίνακα α) Από το χρήστη Να χρησιμοποιήσουμε την υπονοούμενη (implied) εντολή Do: Integer A Dimension A(5) Write(*, *) "Πληκτρολογείστε πέντε τιμές" Read(*, *) (A(i), i = 1, 5) Η γενική μορφή της εντολής για το υπονοούμενο Do είναι: ("μεταβλητή", "μεταβλητή ελέγχου" = "κατώτερο όριο", "ανώτερο όριο", "βήμα") Π.χ. Read(*, *) (A(i), i = 1, 10, 2)
Τοποθέτηση Τιμών σε Πίνακα β) Με εντολές ανάθεσης Integer, Dimension (5) :: A Α(1) = 10 Α(2) = 20 Α(3) = 30 Α(4) = 40 Α(5) = 50 γ) Από το πρόγραμμα με τη χρήση της εντολής Data που επιτρέπει τη μαζική απόδοση τιμών σε απλές μεταβλητές και σε πίνακες Με τη σύνταξη: Όνομα μεταβλητές ή πίνακας=(/τιμές/) π.χ. REAL A(4) DATA A=(/2.4,4.0,8,5.9/)
Τοποθέτηση Τιμών σε Δυσδιάστατο Πίνακα Α’ τρόπος. Με Εντολές Εισόδου Διάβασμα τιμών ενός δυσδιάστατου πίνακα κατά γραμμές: Integer A Dimension A(3, 2) Do i =1, 3 Do j =1, 2 Read(*, *) A(i, j) End Do
Τοποθέτηση Τιμών σε Δυσδιάστατο Πίνακα Α’ τρόπος. Με Εντολές Εισόδου Διάβασμα τιμών ενός δυσδιάστατου πίνακα κατά στήλες: Integer A Dimension A(3, 2) Do j =1, 2 Do i =1, 3 Read(*, *) A(i, j) End Do
Τοποθέτηση Τιμών σε Δυσδιάστατο Πίνακα Να έχουμε απευθείας ανάγνωση του πίνακα Α Integer A Dimension A(3, 2) Read(*, *) Α Οι έξι πρώτες τιμές που θα πληκτρολογηθούν, θα τοποθετηθούν στις 6 θέσεις του πίνακα Α. Επειδή η Fortran αποθηκεύει τις τιμές ενός δυσδιάστατου πίνακα κατά στήλες θα πρέπει να δίνουμε τις τιμές του πίνακα Α κατά στήλες.
Τοποθέτηση Τιμών σε Δυσδιάστατο Πίνακα Ή να χρησιμοποιήσουμε την υπονοούμενη (implied) εντολή Do. Όπως μπορούμε να χρησιμοποιήσουμε πολλές ανακυκλώσεις τη μία μέσα στην άλλη, σε μια εντολή Do, έτσι και σε μια υπονοούμενη Do μπορούμε να γράφουμε: Integer A Dimension A(3, 2) Read(*, *) ((A(i,j), j = 1, 2), i = 1, 3) αν θέλουμε να διαβάσουμε τις τιμές του πίνακα κατά γραμμές. Από τους δύο δείκτες i και j, πρώτα μεταβάλλεται εκείνος που είναι εσωτερικά δηλαδή ο j και κατόπιν ο i.
Τοποθέτηση Τιμών σε Δυσδιάστατο Πίνακα Ανάθεση με την εντολή Data Αν έχουμε τον πίνακα Α(3, 2) και θέλουμε να δώσουμε τις τιμές μπορούμε να γράψουμε: Data A / 1, 2, 3, 2, 4, 6 /
Εκτύπωση μονοδιάστατου πίνακα Α’ τρόπος. Με χρήση της εντολής Do – End Do Integer A Dimension A(5) Do i =1, 5 Write(*, *) A(i) End Do Β’ τρόπος. Με χρήση της υπονοούμενης εντολής Do Integer A Dimension A(5) Write(*, *) (A(i), i = 1, 5) Γ’ τρόπος. Με απευθείας εκτύπωση Integer A Dimension A(5) Write(*, *) Α
Γενικά για τους πίνακες
Γιατί δυναμικοί πίνακες;
Δυναμικοί πίνακες
Παράδειγμα
Δυναμικοί πίνακες (συνέχεια)
Επίσης, IF(.NOT.ALLOCATED(B))ALLOCATE(B(-10:10,3))
Παράδειγμα REAL,ALLOCATABLE::X(:,:)... ALLOCATE(X(10,2),STAT=IERR) IF(IERR).GT.0) CALL HANDLER X= DEALLOCATE(X)... ALLOCATE(X(-10:10),5),STAT=JERR)
Διαδικασίες και πίνακες
Διαδικασίες και πίνακες (συνέχεια)
Παράδειγμα PROGRAM automat IMPLICIT NONE REAL, ALLOCATABLE ::A(:,:) INTEGER ::i,n,m READ*,n,m ALLOCATE(A(n,m),STAT=IERR) IF(IERR).GT.0) CALL HANDLER A = 1. CALL auto(A,n,m) DEALLOCATE(A) CONTAINS SUBROUTINE auto(c,n,m) INTEGER, INTENT(IN) ::n, m REAL, INTENT(IN) ::c(n,m) !εικονικός INTEGER ::i,j REAL::b(n,m) !αυτόματος FORALL(i=1:n,j=1,m) b(i,j)=c(i,j)*c(i,j) END FORALL END SUBROUTINE auto END PROGRAM automat
Αυτόματοι πίνακες
Παράδειγμα INTEGER, ALLOCATABLE, DIMENSION(:)::X ALLOCATE(X(3),STAT=IERR) IF(IERR).GT.0) CALL HANDLER X=(/1,2,3/); PRINT *, X ! Τυπώνει: n = SIZE(X) X=test(x,n); PRINT *, X ! Τυπώνει: IF (ALLOCATED(X)) DEALLOCATED (X) CONTAINS FUNCTION test(x,n) RESULT(y) INTEGER, INTENT(IN) ::n, x(:) !υποθετικής μορφής INTEGER, DIMENSION(n) ::y !αυτόματος y=x*x END FUNCTION test END
Πίνακες υποθετικού μεγέθους και μορφής
Παράγωγοι τύποι δεδομένων
Παράγωγοι τύποι δεδομένων (συνέχεια)
Παράγωγοι τύποι δεδομένων TYPE (Όνομα νέου τύπου δεδομένων) Τύπος δεδομένων :: Όνομα πεδίου1 Τύπος δεδομένων :: Όνομα πεδίου2 ………………… END TYPE (Όνομα νέου τύπου δεδομένων) [PROGRAM όνομα προγράμματος] Implicit None Περιοχή σταθερών Τμήμα μεταβλητών Περιοχή τύπων …….. END [PROGRAM [όνομα προγράμματος]]
Παράγωγοι τύποι δεδομένων Παράδειγμα. TYPE STUDENTS CHARACTER (LEN=20) :: SURNAME ! ΕΠΩΝΥΜΟ CHARACTER (LEN=10) :: NAME ! ΟΝΟΜΑ INTEGER (KIND=2) :: AEM INTEGER (KIND=1) :: GRADE END TYPE STUDENTS TYPE (STUDENTS) :: STUDENT TYPE (Νέος τύπος δεδομένων) :: Λίστα μεταβλητών
Παράδειγμα. STUDENT=STUDENTS(‘Αναστασιάδης’, ‘Λάζαρος’,1234,9) ή STUDENT.SURNAME=’Αναστασιάδης’ STUDENT.NAME=’Λάζαρος’ STUDENT.AEM=1234 STUDENT.GRADE=9 Παράγωγοι τύποι δεδομένων
Παράγωγοι τύποι δεδομένων (συνέχεια)
Παράδειγμα IMPLICIT NONE TYPE IDEAL REAL ::VOLUME,PRESSURE,T CHARACTER(11)::HEADER END TYPE IDEAL TYPE (IDEAL):: C(5) ! Ο πίνακας C είναι τύπου IDEAL REAL::CONSTANT INTEGER::I REAL,PARAMETER::R= C%HEADER=(/’PRESSURE’,’VOLUME’,’TEMPERATURE’,’’,’’/) C(1)%PRESSURE=15; C%T=298 C%VOLUME =(/100,80,60,40,20/) CONTANT = C(1)%PRESSURE*C(1)%VOLUME C(:)%PRESSURE=CONSTANT/C(:)%VOLUME ! Τυπώνουμε την επικεφαλίδα: WRITE(*,’(X,3A11,)’) (C(I)%HEADER,I=1,3) ! Τυπώνουμε τις τιμές: DO I=1,5 WRITE(*,’(F6.2,6X,F5.1,8X,F5.1)’) C(I)%PRESSURE, C(I)%VOLUME, C(I)%T END DO END