Πίνακες οµηµένη µεταβλητή: αποθηκεύει µια συλλογή από τιµές δεδοµένων Πίνακας (array): δοµηµένη µεταβλητή που αποθηκεύει πολλές τιµές του ίδιου τύπου Ηδέσµευσηµνήµηςγιαένανπίνακαµπορείναγίνειείτε κατά τη διάρκεια µεταγλώτισης (compile time arrays) είτε δυναµικά κατά την εκτέλεση (run time arrays) Παραδείγµαταδήλωσης compile time arrays INTEGER:: pinakas(100) ή INTEGER, DIMENSION(100) :: pinakas ορίζει έναν πίνακα 100 ακεραίων, τα στοιχεία του οποίου είναι: pinakas(1), pinakas(2), pinakas(3)... pinakas(100) και έχουν τύπο integer (i) 1
Πίνακες (ii) ήλωση πίνακα µε στατική δέσµευση µνήµης τύπος, DIMENSION (κ:α) :: λίσταµεταονόµαταπινάκων ή τύπος, λίστα προσδιοριστών πινάκων οιπροσδιοριστέςπινάκωνέχουντηµορφή : όνοµαπίνακα (κ:α) κ: κάτωόριο α: άνωόριο Παραδείγµατα REAL, DIMENSION(50) :: pinakas INTEGER, PARAMETER :: katw=-6, anw=3, down=0, up=8 INTEGER, DIMENSION (katw:anw) :: first_array REAL, DIMENSION (down:up) :: second_array ανητιµήτουκείναι 1 µπορείναπαραλειφθείκαιηδήλωσηγίνεται: τύπος, DIMENSION (α) :: λίσταµεταονόµαταπινάκων ανκαιοιτιµέςτωνκκαιαείναισυνήθωςθετικοίακέραιοιηfortran επιτρέπει ακέραιες τιµές µεγαλύτερες, µικρότερες ή ίσες του µηδενός 2
Πίνακες ήλωση πίνακα µε δυναµική δέσµευση µνήµης τύπος, DIMENSION (:), ALLOCATABLE :: λίστα ή τύπος, DIMENSION (:) :: λίστα ALLOCATABLE :: λίστα όπου λίστα είναι τα ονόµατα των πινάκων Παράδειγµα REAL, DIMENSION (:), ALLOCATABLE :: A,B ηλώνουµε δύο allocatable πίνακες Α και Β (iii) Γιαναδεσµεύσουµετοχώροστηµνήµηπουαπαιτείταιγιατην αποθήκευση του πίνακα χρησιµοποιούµε την εντολή ALLOCATE 3
Πίνακες (iv) Εντολή Allocate ALLOCATE (λίστα) ή ALLOCATE(λίστα, stat=status_variable) όπου λίστα είναι δηλώσεις πινάκων της µορφής όνοµα_πίνακα (κ:α) κκαιαείναιοιθέσειςτουπρώτουκαιτελευταίουστοιχείουτου πίνακα και status_variable είναι µία ακέραια µεταβλητή Παράδειγµα WRITE (*, *) " ώσε το µέγεθος των πινάκων Α και Β" READ (*,*) n ALLOCATE (A(n), B(0:n+1), STAT=allocate_status) IF (allocate_status /= 0) STOP! ενυπάρχειαρκετήµνήµη Αν υπάρχει αρκετή µνήµη θα δεσµευτούν n θέσεις για τον πίνακα Α και n+2 θέσεις για τον πίνακα Β. Αν όχι η µεταβλητή allocate_status έχειτιµήδιάφορητουµηδενόςκαιίσηµετονκωδικόλάθους 4
Πίνακες Εντολή DEALLOCATE Κάθε φορά που η δεσµευµένη µνήµη δεν µας χρειάζεται πρέπει να την αποδεσµεύουµε για εξοικονόµηση µνήµης DEALLOCATE (λίστα) ή DEALLOCATE(λίστα, stat=status_variable) όπου λίστα είναι τα ονόµατα των πινάκων και status_variable είναι µία ακέραια µεταβλητή (v) Η τιµή της status_variable είναι 0 όταν γίνεται σωστά η αποδέσµευση µνήµης και έχει διαφορετική τιµή όταν δεν έγινε σωστά. Στη δεύτερη περίπτωση η τιµή της µεταβλητής είναι ο κωδικός λάθους 5
Πίνακες Παραδείγµατα INTEGER:: A(12), Y(5) REAL:: B(5) (vi) CHARACTER(LEN=10):: NAMES(12) Εντολές εκχώρησης A(1) = 4; A(2)=5; A(12)=8!δίνονταςσεκάθεστοιχείοτηντιµήτου B=(/2.3, 4.6, 5.8, 9.1, 10.0/) Y=(/(i, i=1,22,2)/) ή συνδυασµός των µεθόδων που χρησιµοποιήθηκαν στον Β και Υ C=(/2, 4, (i, i=5, 100, 5), 153/) DO I=1,10!µε χρησιµοποίηση βρόχου A(I)=2*I A=0!όλαταστοιχείατουπίνακαέχουντηντιµή 0 READ(*.*) (NAMES(k), k=2,12,2) αρχή, τέλος, βήµα 6
Πίνακες (vii) ιάβασµα ενός πίνακα REAL:: a(12) READ(*,*) (a(k), k=1,12) ή DO i=1,12 READ (*,*) a(i) Εκτύπωση ενός πίνακα WRITE (*,*) a(:)ή DO i=1,12 WRITE (*,*) a(i) 7
Πράξεις µε πίνακες (i) Απλέςπράξεις, π.χ. a(k) = a(k)+1; a(k) = a(1)+a(n); DO i=1,10 WRITE(*,*) a(i) IF (a(k) > a(k+1)) THEN... Αρχικοποίηση (µε µηδενικά) DO i=1,10; a(i)=0; Εύρεση ελάχιστου στοιχείου x = a(1) DO i=2,10 IF (a(i) < x) THEN x = a(i) END IF 8
Πράξεις µε πίνακες Εφαρµογή τελεστών και συναρτήσεων σε πίνακα Integer, Dimension (4) :: A,B Integer, Dimension (0:3) :: C Integer, Dimension (6:9) :: D Logical, Dimension (4) :: P A=(/1,2,3,4/) A=(/5,6,7,8/) A=A+B ΑντυπώσωτονπίνακαΑθαπάρωτιςτιµές 6,8,10,12 Προσοχή οι πίνακες να έχουν το ίδιο µέγεθος C=(/-1,3,-5,7/) D=2*ABS(C)+1 Αν τυπώσω τον πίνακα D θα πάρω τις τιµές 3,7,11,15 P=(C>0).AND. (MOD(B,3)==0) Τα στοιχεία του P θα πάρουν τις τιµές.false.,.true.,.false.,.false. (ii) 9
Υποπίνακες Υποπίνακες είναι νέοι πίνακες που αποτελούν τµήµα κάποιου πίνακα. Παραδείγµατα: Integer, Dimension (10) :: A Integer, Dimension (5) :: B,C Αν A=(/10,20,30,40,50,60,70,80,90,100/) τότεβ=a(2:10:2)είναιτοτµήµατουαπουέχειτα στοιχεία µε τιµές 20,40,60,80,100 όνοµα_αρχικού πίνακα (αρχή:τέλος:βήµα) αρχή: το πρώτο στοιχείο του αρχικού πίνακα τέλος:τοτελευταίο Υπάρχει η δυνατότητα να επιλέξω συγκεκριµένα στοιχεία του αρχικού πίνακα ως εξής: π.χ. Αν C=(/6,5,3,9,1/)τότε B=A(C)=(/60,50,30,90,10/) 10
οµή where Χρησιµοποιείται για να δώσουµε τιµές σε πίνακες που εξαρτώνται από την τιµή µιας λογικής έκφρασης πίνακα where (λογική έκφραση σε πίνακα) πίνακα τιµή στοιχείων πίνακα ή ανά στοιχείο where (λογικήέκφρασησεπίνακα) στοιχείο_πίνακα_1=τιµή_στοιχείου1... στοιχείο_πίνακα_n=τιµή_στοιχείου n elsewhere στοιχείο_πίνακα_1=τιµή_στοιχείου1... στοιχείο_πίνακα_n=τιµή_στοιχείου n end where Το τµήµα elsewhere είναι προαιρετικό 11
Γραµµική αναζήτηση (i) Πρόβληµα (αναζήτησης): δίνεται ένας πίνακας ακεραίων a και ζητείται να βρεθεί αν υπάρχει ο ακέραιος x στα στοιχεία του IMPLICIT NONE INTEGER:: x,a(10) άλλες δηλώσεις; διάβασµα του πίνακα a; διάβασµα του ακεραίου x; ψάξιµοστονπίνακαγιατον x; παρουσίαση αποτελεσµάτων END 12
Γραµµική αναζήτηση Μια δυνατή συγκεκριµενοποίηση READ(*,*) (a(i) i=1,10) j=1 DO WHILE ((j<10).and. (a(j)/=x)) j=j+1 IF (a(j)==x) THEN WRITE(*,*) 'To βρήκαστηθέση ', j ELSE WRITE(*,*) ' εντοβρήκα' END IF Στη χειρότερη περίπτωση θα ελεγχθούν όλα τα στοιχεία του πίνακα Απαιτούνται a n + b βήµατα γραµµικό κόστος (a, bσταθερές, nτοµέγεθοςτουπίνακα) (ii) 13
Γραµµική αναζήτηση Εναλλακτική συγκεκριµενοποίηση #1 i=1; found=.false. DO WHILE ((i<=10).and. (.NOT. found)) IF (a(i)==x) THEN found=.true. ELSE found =.FALSE. END IF i=i+1 IF (found) THEN WRITE(*,*) 'To βρήκαστηθέση ', (i-1) ELSE WRITE (*,*) ' εντοβρήκα' END IF (iii) 14
Γραµµική αναζήτηση (iv) Εναλλακτική συγκεκριµενοποίηση #2 i=1; found=.false. DO WHILE ((i<=10).and. (.NOT. found)) IF a(i)==x THEN found=.true. END IF i=i+1 IF (found) THEN WRITE(*,*) 'To βρήκαστηθέση ', (i-1) ELSE WRITE (*,*) ' εντοβρήκα' END IF 15
Γραµµική αναζήτηση (v) Εναλλακτική συγκεκριµενοποίηση #3 i=1; found=.false. DO WHILE ((i<=10).and. (.NOT. found)) found=(a(i)==x) i=i+1 IF (found) THEN WRITE(*,*) 'To βρήκαστηθέση ', (i-1) ELSE WRITE(*,*) ' εντοβρήκα' END IF 16
υαδική αναζήτηση Προϋπόθεση: ο πίνακας να είναι ταξινοµηµένος, π.χ. Σε αύξουσα διάταξη Είναι πολύ πιο αποδοτική από τη γραµµική αναζήτηση Στη χειρότερη περίπτωση απαιτούνται a log 2 n + bβήµατα λογαριθµική (a, bσταθερές, nτοµέγεθοςτουπίνακα) (i) 17
υαδική αναζήτηση Το πρόγραµµα PROGRAM binsearch INTEGER, PARAMETER:: n=100; INTEGER:: i,howmany,mid,first,last INTEGER:: a(n), x LOGICAL:: found Μήνυµα επικεφαλίδα και οδηγίες χρήσης read(howmany) (* κατά αύξουσα σειρά *) DO i=1,howmany READ(*,*) (a(i)) READ(*,*) x Αναζήτηση και εµφάνιση αποτελέσµατος END (ii) 18
υαδική αναζήτηση Αναζήτηση και εµφάνιση αποτελέσµατος first=1; last=howmany found = false DO WHILE ((.NOT.found).AND.(first<=last)) mid = (first+last) / 2 found = (x==a(mid)) IF (x<a(mid)) THEN last=mid-1 ELSE first=mid+1 END IF IF (found) THEN WRITE(*,*) mid ELSE WRITE(*,*) 'not found' END IF (iii) 19
Ταξινόµηση (i) Πρόβληµα: να αναδιαταχθούν τα στοιχεία ενός πίνακα ακεραίων σε αύξουσα σειρά Μια από τις σηµαντικότερες εφαρµογές των ηλεκτρονικών υπολογιστών Βασική διαδικασία: εναλλαγή τιµών (swap) SUBROUTINE SWAP (x,y) IMPLICIT NONE INTEGER:: x,y,save save=x x=y y=save END 20
Ταξινόµηση Μέθοδος της φυσαλίδας (ii) DO i=1,(n-1) DO j=(n-1),i,-1 IF (a(j)>a(j+1)) THEN CALL swap (a(j),a(j+1)) END IF Πλήθος συγκρίσεων (n 1) + (n 2) +... + 2 + 1 = n (n 1) / 2 τηςτάξηςτου n 2 O(n 2 ), τετραγωνικό 21
Ταξινόµηση (iii) Παράδειγµα εκτέλεσης 22
Πολυδιάστατοι πίνακες (i) Παράδειγµα INTEGER:: a(77,99)ή INTEGER, DIMENSION (77,99):: a DO i=1,10 DO j=1,5 READ(*,*) a(i,j) Πίνακες περισσοτέρων ιαστάσεων Η Fortran επιτρέπει µέχρι επτά διαστάσεις µε οποιοδήποτε αριθµό στοιχείων ανά διάσταση. 23
24 Αποθήκευσηπίνακαστηµνήµη Πίνακας D(-1:2,0:1) Πίνακας C(2,2,2) Πίνακας Β(2,4) ΠίνακαςΑµε µία διάσταση Θέσεις Μνήµης D(2,1) C(2,2,2) B(2,4) A(8) 8 D(1,1) C(1,2,2) B(1,4) A(7) 7 D(0,1) C(2,1,2) B(2,3) A(6) 6 D(-1,1) C(1,1,2) B(1,3) A(5) 5 D(2,0) C(2,2,1) B(2,2) A(4) 4 D(1,0) C(1,2,1) B(1,2) A(3) 3 D(0,0) C(2,1,1) B(2,1) A(2) 2 D(-1,0) C(1,1,1) B(1,1) A(1) 1
Πολλαπλασιασµόςπινάκων (i) ίνονταιοιπίνακες: a (m n), b (n q) Ζητείταιοπίνακας: c = a b (m q) όπου: c i, j = n k= 1 a i, k b k, j 25
Πολλαπλασιασµός πινάκων (ii) To πρόγραµµα INTEGER:: a(m,n), b(n,q), c(m,q) DO i=1,m DO j=1,q c(i,j)=0 DO k=1,n c(i,j)=c(i,j)+a(i,k)*b(k,j) 26
Μαγικάτετράγωνα (i) ισδιάστατοι πίνακες (n n) που περιέχουν όλουςτουςφυσικούςµεταξύ 0 και n 2 1 τοάθροισµατωνστοιχείωνκάθεστήλης, γραµµής και διαγωνίου είναι σταθερό Πρόβληµα: κατασκευή µαγικού τετραγώνου (n n) για περιττό n 10 9 3 22 16 17 11 5 4 23 24 18 12 6 0 1 20 19 13 7 8 2 21 15 14 27
Μαγικά τετράγωνα (ii) 28
Μαγικά τετράγωνα (iii) PROGRAM MAGIC_SQUARES IMPLICIT NONE INTEGER, PARAMETER:: n=5 INTEGER:: h,i,j,k,m,a(n,n) i=(n+1)/2 j=n+1 k=0 DO i=1,n DO j=1,n WRITE(*,10) a(i,j) 10 FORMAT (I4,1X\) WRITE(*,*) END PROGRAM ηλώσεις, Αρχικοποιήσεις Εκτύπωση των στοιχείων Υπολογισµός των στοιχείων DO h=1,n j=j-1 a(i,j)=k k=k+1 DO m=2,n i=mod(i,n)+1 j=mod(j,n)+1 a(i,j)=k k=k+1 29
Μαγικά τετράγωνα (iv) PROGRAM MAGIC_SQUARES IMPLICIT NONE INTEGER:: h,i,j,k,m,n INTEGER, ALLOCATABLE:: a(:,:) WRITE (*,*) " ώσεδιάστασηπίνακα" READ (*,*) n ALLOCATE(a(n,n)) i=(n+1)/2 j=n+1 πίνακα k=0 DO i=1,n DO j=1,n WRITE(*,10) a(i,j) 10 FORMAT (I4,1X\) WRITE(*,*) END PROGRAM υναµική δέσµευση DO h=1,n j=j-1 a(i,j)=k k=k+1 DO m=2,n i=mod(i,n)+1 j=mod(j,n)+1 a(i,j)=k k=k+1 30
Ανάστροφοςπίνακας PROGRAM YPOLOGOISMOS_ANASTROFOU IMPLICIT NONE INTEGER, PARAMETER:: N=4, M=3 INTEGER:: i, j, A(N,M), B(M,N) WRITE(*,*) " ώσε τιµές για τα στοιχεία του πίνακα" READ(*,*) ((A(i,j), j=1,m), i=1,n) DO i=1,n DO j=1,m B(j,i)=A(i,j) WRITE(*,10) ((A(i,j), j=1,m), i=1,n) WRITE(*,20) ((B(i,j), j=1,n), i=1,m) 10 FORMAT (' A='/4(' ',3(I3),' '/)) 20 FORMAT (' B='/3(' ',4(I3),' '/)) END 31
ΚατηγορίεςΠινάκων (i) Οι διαστάσεις και το πλήθος του πίνακα είναι γνωστές από τη δήλωση του πίνακα INTEGER:: p1(3,5,8) INTEGER:: p2(4:7, 5:9, -3:2) O p1 έχει τις θέσεις 1,2,3 στην πρώτη διάσταση, τις 1,2,3,4,5 στη δεύτερη και τα τις 1,2,3,4,5,6,7,8 στην τρίτη. (Μέγεθος του πίνακα 3*5*8=120) Ο p2 έχει τις θέσεις 4,5,6,7 στην πρώτη διάσταση, τις 5,6,7,8,9 στηδεύτερηκαιτις -3 έως 2 στηντρίτηπ.χ. p2(5,7,-1)=6. (Μέγεθος του πίνακα 4*5*6=120) Οι δείκτες ενός πίνακα µπορεί να είναι οποιαδήποτε ορθή έκφρασηακεραίωνπ.χ. X(10,2), X(2*i), X(INT(ABS(a))) 32
ΚατηγορίεςΠινάκων (ii) Οι διαστάσεις είναι γνωστές αλλά όχι και το µέγεθος. Το πλήθος των στοιχείων ανά διάσταση καθορίζεται τη στιγµή της χρήσης τουκαιείναιίδιεςµεαυτέςκάποιουάλλου πίνακα. INTEGER:: p1(5,8) CALL R(p1) SUBROUTINE R(p2) INTEGER p2(:,:) Τη στιγµή που καλείται η υπορουτίνα καθορίζεται ο αριθµόςτωνστοιχείωνανάδιάσταση. 33
ΚατηγορίεςΠινάκων (iii) PROGRAM pinakes IMPLICIT NONE INTEGER I,J,X(3,2) DO I=1,3; DO J=1,2 X(I,J)=I+J ; WRITE(*,*), SHAPE(X) WRITE(*,*), X(1,:) CALL SUB1(X) CALL SUB2(X) END SUBROUTINE SUB1(V) INTEGER V(2,*) WRITE(*,*) SIZE(V,1) WRITE(*,*) V(:,1) WRITE(*,*), V(:,2) END SUBROUTINE SUBROUTINE SUB2(V) INTEGER V(*) WRITE(*,*) V(6) END SUBROUTINE αποτέλεσµα 3 2 2 3 2 2 3 4 3 5 34
ΚατηγορίεςΠινάκων (iv) Οι διαστάσεις είναι γνωστές αλλά όχι και το µέγεθος. Το µέγεθος καθορίζεται κατά τη διάρκειαεκτέλεσηςτουπρογράµµατος. ηλώνονται µε τη χρήση της εντολής ALLOCATE. INTEGER, ALLOCATABLE, DIMENSION(:,:,:):: pin1 ALLOCATE (pin1(10,10,10)) DEALLOCATE(pin1) ALLOCATE (pin1(15,15,15)) 35
ΚατηγορίεςΠινάκων (v) INTEGER, ALLOCATABLE, DIMENSION(:,:,:):: pin1 ALLOCATE (pin1(10,10,10)) DEALLOCATE(pin1) ALLOCATE (pin1(15,15,15)) PROGRAM allocatable_array IMPLICIT NONE INTEGER:: i,j INTEGER, ALLOCATABLE, DIMENSION(:,:,:):: pin1 ALLOCATE (pin1(5,5,5)) pin1=5 WRITE(*,*) pin1; WRITE(*,*)!τυπώνειτοναριθµό 5 125=5*5*5 φορές DEALLOCATE(pin1) ALLOCATE (pin1(10,10,10)) pin1=8 WRITE(*,*) pin1; WRITE(*,*)!τυπώνειτοναριθµό 8 1000=10*10*10φορές DEALLOCATE(pin1) END 36
είκτες στοιχείων πίνακα τα στοιχεία άλλου πίνακα Ταστοιχείαενόςπίνακαµπορούννα χρησιµοποιηθούν ως δείκτες στοιχείων άλλου αρκεί οι δείκτες να είναι ακέραιοι INTEGER:: pin(5) INTEGER:: pin1(8) INTEGER:: pin2(5) pin=(/2,3,4,5,8/) pin1=(/2,3,4,5,8,3,4,5/) pin2=pin1(pin) Οι τιµές των στοιχείων του πίνακα pin2 είναι 3,4,5,8,5 37
Τµήµαταπινάκων (υποπίνακες) (i) Κάποιο τµήµα ενός πίνακα (ένας υποπίνακας) µπορεί να πάρειτιµέςαπόκάποιοάλλοτµήµατουπίνακαµε ορισµένεςπροϋποθέσεις. Εστω για παράδειγµα ο πίνακας INTEGER, DIMENSION(1:6,1:8) :: P Επιτρεπτές εκχωρήσεις τιµών είναι οι παρακάτω: P(1:3,1:4)=P(1:6:2,1:8:2). Υποπίνακας παίρνει τιµές από άλλον ίδιων διαστάσεων P(1:3,1:4)=2. Υποπίνακας παίρνει την σταθερή τιµή 2 P(2:6:2,1:7:3)=P(1:3,1:4)Υποπίνακαςδιαστάσεων 3x3 παίρνει τις τιµές υποπίνακα διαστάσεων 3x4 (δεν είναι επιτρεπτή σε όλους τους compilers) Μη επιτρεπτές εκχωρήσεις τιµών Οταν υποπίνακας παίρνει τιµές από υποπίνακα µικρότερων διαστάσεων π.χ. P(2:6:2,1:7:3)=P(2:5,7) 38
Τµήµαταπινάκων (υποπίνακες) (ii) INTEGER, DIMENSION(1:6,1:8):: P INTEGER:: I,J DO I=1,6 DO J=1,8 P(I,J)=I+J DO I=1,6 WRITE(*,*) P(I,:); WRITE(*,*) WRITE(*,*) P(1:3,1:4)=P(1:6:2,1:8:2) DO I=1,6 WRITE(*,*) P(I,:); WRITE(*,*) WRITE(*,*) WRITE(*,*) P(1:3,1:4)=2 DO I=1,6 WRITE(*,*) P(I,:) WRITE(*,*) END P(2:6:2,1:7:3)=P(1:3,1:4) DO I=1,6 WRITE(*,*) P(I,:) WRITE(*,*) P(2:6:2,1:7:3)=P(2:5,7) DO I=1,6 WRITE(*,*) P(I,:) WRITE(*,*) 39
Χειρισµόςπινάκωνχωρίςτηνεντολή DO Εκχώρηση τιµών DO i=1,5 A(i)=A(i+1) Απλουστευµένος Τρόπος γραφής A(1:5)=A(2:6) Τοαντίστροφοδενµπορείναγίνει DO i=1,5 A(i+1)=A(i) Απλουστευµένος Τρόπος γραφής A(2:6)=A(1:5) 40
Χειρισµόςπινάκωνχωρίςτηνεντολή DO DO i=1,5 A(i)=A(i+1) Τυπώνει: 2 3 4 5 6 DO i=1,10 A(i)=i A(1:5)=A(2:6) Τυπώνει: 2 3 4 5 6 Προσοχή! Το αντίστροφο δεν δίνει το ίδιο αποτέλεσµα DO i=1,5 A(i+1)=A(i) Τυπώνει: 1 1 1 1 1 ίνει διαφορετικό αποτέλεσµα A(2:6)=A(1:5) Τυπώνει: 1 1 2 3 4 5 41
Υποπίνακεςµεµησυνεχήστοιχεία Ηχρήσηβήµατοςδίνειτηδυνατότηταπρόσβασηςσεµη συνεχή στοιχεία πίνακα. π.χ. Β = Α(10:20:2). ΟυποπίνακαςΑ(10:20:2) περιλαµβάνειτα στοιχείαα(10), Α(12), Α(14), Α(16), Α(18) καια(20). ΤαστοιχείατουπίνακαΒπαίρνουντιςτιµέςτουυποπίνακαΑ όπωςαυτόςορίστηκεπαραπάνω. ηλ. ταβ(1), Β(2),..., Β(10) θα πάρουν τις τιµές των στοιχείων Α(10), Α(12),...,Α(20) αντίστοιχα Στο βήµα µπορεί να έχουµε και αρνητικές τιµές. Για παράδειγµα Β(10:1:-1). Και αν ορίσω µονοδιάστατο πίνακα Γ(10) και δώσω την εντολή Γ= Β(10:1:-1) παίρνω τον αντίστροφο πίνακα του Β. Ταάνωκαικάτωόριαενόςπίνακαµπορείναπαραλειφθούναν έχουν δηλωθεί προηγούµενα. Για π.χ. Η εντολή Γ(:10)=5 θα εκχωρήσειτηντιµή 5 σταστοιχείατουπίνακαγαπότογ(1) έως τογ(10). ΤοίδιοισχύεικαιανγράψωΓ(1:)=5 ήγ(:)=5 42
Εντολή WHERE (i) Εκτέλεση εντολών υπό συνθήκη σε πίνακα WHERE (συνθήκη) Εκχωρήσεις τιµών σε στοιχεία πίνακα ELSEWHERE Άλλες Εκχωρήσεις τιµών ENDWHERE WHERE (Α>5) Β= -Α ELSEWHERE Β=Α ENDWHERE 43
Εντολή WHERE (ii) PROGRAM WHERE_ARRAY IMPLICIT NONE INTEGER :: A(10), B(10), G(10) WRITE(*,*) " ώσε 10 τιµέςγιαταστοιχείατουα"; READ(*,*) A B=0; G=10 WHERE (A >= 5) B=B+1; G=G-1 ELSEWHERE A=20 ENDWHERE WRITE(*,*) "PINAKAS A" WRITE(*,*) A WRITE(*,*) "PINAKAS B" WRITE(*,*) B WRITE(*,*) "PINAKAS G" WRITE(*,*) G END Ανοχρήστηςδώσειτιµές 1,2,3,4,5,6,7,8,9,10 στον πίνακα Α Το πρόγραµµα τυπώνει: 20 20 20 20 5 6 7 8 9 10 (τιµέςτουα) 0 0 0 0 1 1 1 1 1 1 (τιµέςτουβ) 10 10 10 10 9 9 9 9 9 9 (τιµέςτου G) 44
Εντολή FORALL (i) Εκτέλεση εντολών υπό συνθήκη σε πίνακα FORALL (συνθήκη) Εντολές ανάθεσης END FORALL Παραδείγµατα: FORALL (i=1:10) A(i,i) =20 FORALL (i=1:3, (A(i,i)/=0)) A(i,i) =20 FORALL (i=1:n, j=1:n) A(i,j)= 1/REAL(i+j) FORALL (i=1:5) WHERE (C(i,:)==0) C(:,i)=I ELSEWHERE (C(i,:)>2) C(i,:)=23 ENDWHERE ENDFORALL 45
Εντολή FORALL PROGRAM forall_array IMPLICIT NONE INTEGER :: i, j, A(3,3) READ(*,*) A FORALL (i=1:3, (A(i,i)/=0)) A(i,i) =20 WRITE(*,*) "ΠΙΝΑΚΑΣ A" WRITE(*,*) A FORALL (i=1:3) A(i,2)=48 WRITE(*,*) "ΠΙΝΑΚΑΣ A" WRITE(*,*) A END (ii) Ανοχρήστηςδώσειτον πίνακααµετιµές 1 2 3 4 5 6 7 8 9 Το πρόγραµµα θα τυπώσει: ΠΙΝΑΚΑΣ Α 20 2 3 4 20 6 7 8 20 ΠΙΝΑΚΑΣ Α 20 2 3 48 48 48 7 8 20 FORALL (i=1:5) WHERE (C(i,:)==0) C(:,i)=i ELSEWHERE (C(i,:)>2) C(i,:)=9 ENDWHERE ENDFORALL Γιατιµέςτου C: 1 0 0 0 0 2 1 1 1 0 1 2 2 0 2 2 1 0 2 3 1 0 0 0 0 Τι θα τυπώσει το πρόγραµµα µετά τη WHERE? Το πρόγραµµα µετά την FORALL τυπώνει: 1 0 0 0 0 1 1 1 1 5 1 2 2 4 9 1 1 3 2 9 1 2 0 0 5 46
PROGRAM PINAKES IMPLICIT NONE REAL, DIMENSION(4):: HEIGHTS=(/ 5.1, 5.6, 4.0, 3.6 /) CHARACTER (LEN=5), DIMENSION(3)::COLORS=(/ 'BLUE ', ' RED ', 'GREEN' /) INTEGER::i INTEGER, DIMENSION(10)::INTS=(/ 100, (i, i=1,8), 100 /) WRITE(*,*) HEIGHTS WRITE(*,*) COLORS WRITE(*,*) INTS END PROGRAM CHANGE_COLUMNS IMPLICIT NONE INTEGER, PARAMETER:: N=2, M=4 INTEGER::i,j,A(N,M), j1, j2, temp WRITE(*,*) "GIVE ARRAY ELEMENTS" READ(*,*) A WRITE(*,*) "old array" DO i=1,n WRITE(*,*) A(i,:) WRITE(*,*) "GIVE COLUMNS J1,J2" READ(*,*) J1,J2 DO i=1,n temp=a(i,j1) A(i,j1)=A(i,j2) A(i,j2)=temp WRITE(*,*) "new array" DO i=1,n WRITE(*,*) A(i,:) END 47