Πολυδιάστατοι πίνακες α) Στατικοί πίνακες Πως δηλώνονται: π.χ. INTEGER A(3,5) REAL B(1991:2000,1:12) REAL C(4,8,12:20) ή INTEGER, DIMENSION(3,5)::A REAL, DIMENSION(1991:2000,1:12)::B REAL, DIMENSION(4,8,12:20)::C
β) Δυναμικοί πίνακες Πως δηλώνονται: π.χ. REAL, ALLOCATABLE::A(:,:) INTEGER, ALLOCATABLE::D(:,:,:) ή REAL, DIMENSION(:,:), ALLOCATABLE::A INTEGER, DIMENSION (:,:,:), ALLOCATABLE::D ALLOCATE(A(N,M),D(K,L,P))
Πως δίνουμε τιμές σε πολυδιάστατο πίνακα α) 1ος τρόπος (Απευθείας ανάγνωση) π.χ. REAL A(5,10) READ*, A (αναμένει από το χρήστη 50 τιμές και τα τοποθετεί σε στήλες)
β) 2ος τρόπος (με χρήση της DO-END DO) π.χ. REAL A(5,10) DO I=1,5 DO J=1,10 READ*, A(I,J) END DO END DO(τοποθέτηση τιμών κατά γραμμές) DO J=1,10 DO I=1,5 READ*, A(I,J) END DO END DO(τοποθέτηση τιμών κατά στήλες)
γ) 3ος τρόπος (με χρήση της implied-DO) π.χ. REAL A(5,10) READ*, ((A(I,J), J=1,5),I=1,10) (τοποθέτηση τιμών κατά γραμμές) REAL A(5,10) READ*, ((A(I,J), I=1,10),J=1,5) (τοποθέτηση τιμών κατά στήλες)
Εκτύπωση πίνακα τάξης 2 α) 1ος τρόπος (Απευθείας εκτύπωση) π.χ. REAL A(5,10) PRINT*, A Θα τυπώσει κατά στήλες το ένα στοιχείο δίπλα στο άλλο, δηλαδή A(1,1), A(2,1), A(3,1), A(4,1), A(5,1), A(1,2), A(2,2), κλπ.
β) 2ος τρόπος (με χρήση της implied-DO) π.χ. REAL A(5,10) PRINT*, ((A(I,J), J=1,5),I=1,10) (εκτύπωση τιμών κατά γραμμές) REAL A(5,10) PRINT *, ((A(I,J), I=1,10),J=1,5) (εκτύπωση τιμών κατά στήλες) Και στις δύο περιπτώσεις εκτυπώνονται τα στοιχεία του πίνακα το ένα δίπλα στο άλλο.
γ) 3ος τρόπος (με χρήση της DO-END DO) π.χ. REAL A(5,10) DO I=1,5 DO J=1,10 PRINT*, A(I,J) END DO END DO(τοποθέτηση τιμών κατά γραμμές) DO J=1,10 DO I=1,5 PRINT *, A(I,J) END DO END DO(τοποθέτηση τιμών κατά στήλες) Στην περίπτωση αυτή εκτυπώνεται κάθε στοιχείο σε διαφορετική σειρά
Για να έχουμε εκτύπωση σε μορφή πίνακα χρησιμοποιούμε την εξής δομή: π.χ. REAL A(5,10) DO I=1,5 DO J=1,10 WRITE(*,10) A(I,J) 10 FORMAT(F7.2\) END DO PRINT* END DO
Πράξεις σε πίνακες PROGRAM SUM_MATRIX IMPLICIT NONE INTEGER N,M,I,J REAL, ALLOCATABLE::A(:,:),B(:,:),C(:,:) PRINT*, “GIVE DIMENSIONS” READ*, N,M ALLOCATE (A(N,M),B(N,M),C(N,M)) DO I=1,N DO J=1,M READ*, A(I,J) END DO
READ*, ((B(I,J),J=1,M),I=1,N) DO I=1,N DO J=1,M C(I,J)=A(I,J)+B(I,J) END DO PRINT*, ‘THE SUM OF A AND B IS” DO I=1,N DO J=1,M WRITE(*,10) C(I,J) 10 FORMAT(F7.2\) END DO PRINT* END DO END PROGRAM SUM_MATRIX C=A+B
PROGRAM MATRIX_MULTIPLICATION IMPLICIT NONE INTEGER N,L,M,I,J,P REAL, ALLOCATABLE::A(:,:),B(:,:),C(:,:) PRINT*, “GIVE DIMENSIONS OF A” READ*, N,L PRINT*, “GIVE DIMENSIONS OF B” READ*, L,M ALLOCATE (A(N,L),B(L,M),C(N,M)) PRINT*, “GIVE MATRIX A” READ*, ((A(I,J),J=1,L),I=1,N) PRINT*, “GIVE MATRIX B” READ*, ((B(I,J),J=1,M),I=1,L)
DO I=1,N DO J=1,M C(I,J)=0 DO P=1,L C(I,J)= C(I,J)+A(I,P)*B(P,J) END DO PRINT*, ‘THE SUM OF A AND B IS” DO I=1,N DO J=1,M WRITE(*,10) C(I,J) 10 FORMAT(F7.2\) END DO PRINT* END DO END PROGRAM MATRIX_MULTIPLICATION C=MATMUL(A,B)
Άσκηση Να γράψετε πρόγραμμα που θα δέχεται σαν είσοδο ένα δυναμικό πίνακα τάξης 2, διαστάσεων ΝxΝκαι θα ελέγχει αν είναι συμμετρικός ή όχι.
PROGRAM MATRIX IMPLICIT NONE INTEGER N,I,J REAL, ALLOCATABLE::A(:,:) READ*, N ALLOCATE (A(N,N)) READ*, ((A(I,J), J=1,N),I=1,N) DO I=1,N DO J=1,N IF (A(I,J)/=A(I,J)) GOTO 10 END DO GOTO PRINT*, ‘O PINAKAS DEN EINAI & SYMMETRIKOS’ GOTO PRINT*, ‘O PINAKAS EINAI & SYMMETRIKOS’ 30 END PROGRAM MATRIX
Συναρτήσεις σε πίνακες ALL (λογική έκφραση) επιστρέφει τιμή TRUE αν όλα τα στοιχεία του πίνακα ικανοποιούν την λογική έκφραση π.χ. ALL (A>0) ΠΡΟΣΟΧΗ δεν χρησιμοποιούνται δείκτες ANY (λογική έκφραση) π.χ. ANY (A>2) COUNT (λογική έκφραση) επιστρέφει το πλήθος των στοιχείων του πίνακα που ικανοποιούν την λογική έκφραση π.χ. COUNT (A==0)
Οι συναρτήσεις: MAXVAL(A), MINVAL(A), MAXLOC(A), MINLOC(A) Άσκηση Να γράψετε πρόγραμμα που να βρίσκει το μέγιστο και ελάχιστο στοιχείο ενός διδιάστατου πίνακα καθώς και όλες τις θέσεις τους.
Η εντολή WHERE WHERE (λογική έκφραση 1) εντολή ανάθεσης 11 εντολή ανάθεσης 12 …………………….. ELSEWHERE (λογική έκφραση 2) εντολή ανάθεσης 21 εντολή ανάθεσης 22 …………………….. ELSEWHERE εντολή ανάθεσης 01 εντολή ανάθεσης 02 …………………….. END WHERE
Παράδειγμα Να γράψετε πρόγραμμα που θα διαβάζει ένα δυναμικό πίνακα Α και θα ορίζει τον πίνακα Β από τις σχέσεις 1/A(I,J), A(I,J) 0 B(I,J)= 3,A(I,J)=0 WHERE (A/=0) B=1/A ELSEWHERE B=3 END WHERE
Η εντολή FORALL FORALL (μεταβλητή=αρχική τιμή:τελική τιμή:βήμα, μεταβλητή=αρχική τιμή:τελική τιμή:βήμα, …) εντολές αντικατάστασης, ή εντολές WHERE ή εντολές FORALL) END FORALL Παράδειγμα Δίνεται πίνακας Α, NxM και θέλουμε να ορίσουμε πίνακα Β, NxM από τη σχέση B(I,J)=1/(A(I,J)**2+5) FORALL (I=1:N,J=1:M) B(I,J)=1/(A(I,J)**2+5) END FORALL
Το πρόβλημα της ταξινόμησης των γραμμών (ή στηλών) ενός διδιάστατου πίνακα Θέλουμε να αναδιατάξουμε τα στοιχεία ενός ΝxM πίνακα Α έτσι ώστε μετά την αναδιάταξη να ισχύει A(I,1) A(I,2) ……. A(I,M), 1 I N
PROGRAM MATRIX_ORDER IMPLICIT NONE INTEGER N,M,I,J,K REAL, ALLOCATABLE::A(:,:) REAL B READ*, N,M ALLOCATE (A(N,M)) READ*, ((A(I,J), J=1,M), I=1,N)
DO I=1,N DO J=1,M-1 DO K=J+1,M IF (A(I,J)>A(I,K)) THEN B= A(I,J) A(I,J)= A(I,K) A(I,K)=B END IF END DO
DO I=1,N DO J=1,M WRITE(*,10) C(I,J) 10 FORMAT(F7.2\) END DO PRINT* END DO END PROGRAM MATRIX_ORDER