ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ...

Preview:

DESCRIPTION

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ. ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ι. Σαρρής , sarris@uth.gr , τηλ . 2421074090. Διάλεξη 2 : Πίνακες και δυναμικά δεδομένα στη FORTRAN 90. Εαρινό εξάμηνο 200 9. Οργάνωση παρουσίασης. - PowerPoint PPT Presentation

Citation preview

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣΤΜΗΜΑ ΜΗΧΑΝΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΒΙΟΜΗΧΑΝΙΑΣ

Διάλεξη 2: Πίνακες και δυναμικά δεδομένα στη FORTRAN 90

Εαρινό εξάμηνο 2009

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/ΥΙ. Σαρρής, sarris@uth.gr, τηλ. 2421074090

Οργάνωση παρουσίασης

• Θα δούμε την σύνταξη και την χρήση των δυναμικών πινάκων

• Την εισαγωγή των δυναμικών πινάκων στις διαδικασίες

• Τους παράγωγους τύπους δεδομένων

• Τους δείκτες και την χρήση τους

Πίνακες

Πίνακας είναι μια σύνθετη μεταβλητή που καταλαμβάνει παραπάνω από μια θέση στην μνήμη του Η/Υ, έχει ένα συγκεκριμένο όνομα και δέχεται ένα συγκεκριμένο τύπο δεδομένων.

Λόγοι χρήσης των πινάκων είναι οι :•Η χρησιμοποίηση των δεδομένων παραπάνω από μια φορά.

•Η αποθήκευση των δεδομένων πριν τη χρησιμοποίηση τους.

Πίνακες

•Στατικοί πίνακες (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 ADimension A(5)Write(*, *) "Πληκτρολογείστε πέντε τιμές"Do i =1, 5

Read(*, *) A(i)End Do

Να έχουμε απευθείας ανάγνωση του πίνακα Α

Integer ADimension 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

End Do

Τοποθέτηση Τιμών σε Δυσδιάστατο Πίνακα

Α’ τρόπος. Με Εντολές Εισόδου

Διάβασμα τιμών ενός δυσδιάστατου πίνακα κατά στήλες:

Integer A

Dimension A(3, 2)

Do j =1, 2

Do i =1, 3

Read(*, *) A(i, j)

End Do

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 HANDLERX=0.0...DEALLOCATE(X)...ALLOCATE(X(-10:10),5),STAT=JERR)

Διαδικασίες και πίνακες

Διαδικασίες και πίνακες (συνέχεια)

Παράδειγμα

PROGRAM automatIMPLICIT NONE

REAL, ALLOCATABLE ::A(:,:)INTEGER ::i,n,m

READ*,n,mALLOCATE(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, mREAL, INTENT(IN) ::c(n,m) !εικονικόςINTEGER ::i,jREAL ::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 HANDLERX=(/1,2,3/); PRINT *, X! Τυπώνει: 1 2 3n = SIZE(X)X=test(x,n); PRINT *, X! Τυπώνει: 1 4 9IF (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 STUDENTSCHARACTER (LEN=20) :: SURNAME ! ΕΠΩΝΥΜΟCHARACTER (LEN=10) :: NAME ! ΟΝΟΜΑINTEGER (KIND=2) :: AEMINTEGER (KIND=1) :: GRADEEND TYPE STUDENTS

TYPE (STUDENTS) :: STUDENT

TYPE (Νέος τύπος δεδομένων) :: Λίστα μεταβλητών

Παράδειγμα.

STUDENT=STUDENTS(‘Αναστασιάδης’, ‘Λάζαρος’,1234,9)

ή

STUDENT.SURNAME=’Αναστασιάδης’

STUDENT.NAME=’Λάζαρος’

STUDENT.AEM=1234

STUDENT.GRADE=9

Παράγωγοι τύποι δεδομένων

Παράγωγοι τύποι δεδομένων (συνέχεια)

Παράγωγοι τύποι δεδομένων (συνέχεια)

Παράδειγμα

IMPLICIT NONETYPE IDEAL REAL ::VOLUME,PRESSURE,T CHARACTER(11) ::HEADEREND TYPE IDEAL

TYPE (IDEAL) :: C(5) ! Ο πίνακας C είναι τύπου IDEALREAL ::CONSTANTINTEGER ::IREAL,PARAMETER ::R=0.0820556

C%HEADER=(/’PRESSURE’,’VOLUME’,’TEMPERATURE’,’’,’’/)C(1)%PRESSURE=15; C%T=298C%VOLUME =(/100,80,60,40,20/)CONTANT = C(1)%PRESSURE*C(1)%VOLUMEC(:)%PRESSURE=CONSTANT/C(:)%VOLUME

! Τυπώνουμε την επικεφαλίδα:WRITE(*,’(X,3A11,)’) (C(I)%HEADER,I=1,3)

! Τυπώνουμε τις τιμές:DO I=1,5WRITE(*,’(F6.2,6X,F5.1,8X,F5.1)’) C(I)%PRESSURE, C(I)%VOLUME, C(I)%TEND DO

END

Recommended