Πίνακες ΕΠΛ031 Εισαγωγή στον Προγραμματισμό Νέαρχος Πασπαλλής Επισκέπτης Ακαδημαϊκός (Λέκτορας) nearchos@cs.ucy.ac.cy Γραφείο #B120, Τηλ. ext. 2744 Πίνακες (arrays) >>> Οι πίνακες είναι απλές μορφές καταχώρησης μιας σειριακής διαδοχής δεδομένων στη μνήμη του υπολογιστή Κάθε πίνακας έχει τρία χαρακτηριστικά Τάξη: ο αριθμός των διαστάσεων (μέχρι 7 διαστάσεις) Μέγεθος: το πλήθος των στοιχείων Μορφή: ο τρόπος διάταξης των στοιχείων π.χ Α(10) τάξης 1, μεγέθους 10, μορφής 1x10 Β(2,3) 2, 6, 2x3 8-2 C(10,3,2) 3, 60, 10x3x2 Πίνακες (arrays) A ή Β είναι το όνομα των πινάκων 1 ος όρος: (έκταση του πίνακα στην πρώτη διάσταση (αριθμός των γραμμών), 2 ος όρος: έκταση του πίνακα στην δεύτερη διάσταση (αριθμός στηλών), 3 ος όρος: έκταση του πίνακα στην τρίτη διάσταση κτλ...μέγιστο 7 διαστάσεις Ίδιος πινάκας (ίδια μορφή)=τάξη και μέγεθος είναι το ίδιο. εν ισχύει πάντα το αντίστροφο Χ(2,3)=τάξη 2, μέγεθος 6, μορφής 2Χ3 Υ(3,2)=τάξη 2, μέγεθος 6 και μορφής 3Χ2 Είδη Πινάκων Στατικοί Οι ιδιότητες τους δηλώνονται ρητά εν μπορούν να αλλάξουν στην έκταση του προγράμματος υναμικοί Είναι δυνατό να αλλάξει το μέγεθος και η μορφή σε οποιοσδήποτε σημείο του προγράμματος Η τάξη τους δεν μπορεί να αλλάξει 8-3 8-4 Πανεπιστήμιο Κύπρου 1
Δήλωση Δυναμικού Πίνακα δήλωση τύπου, ALLOCATABLE:: όνομα (: ή [: :]) π.χ. REAL, ALLOCATABLE:: array(:) INTEGER, ALLOCATABLE:: A(:), B(:,:) CHARACTER, ALLOCATABLE:: NAME(:) [ ή με DIMENSIOΝ: REAL, ALLOCATABLE, DIMENSION (:) A1, A2 ] 8-5 Παράδειγμα PROGRAM allocate IMPLICIT NONE INTEGER, ALLOCATABLE:: array(:) ALLOCATE (array(3)) array = (/1,2,3/) PRINT *, array DEALLOCATE (array) ALLOCATE (array(5)) PRINT *, array array = (/2,4,6,8,10/) PRINT *, array [ DEALLOCATE (array) ] 8-6 END PROGRAM allocate Καλό είναι να μηδενίζεται ο πίνακας! 1 2 3 123 ( ή ) 2 4 6 8 10 Δήλωση Πινάκων (1) Η δήλωση των πινάκων είναι υποχρεωτική και χωρίς τη παρουσία της εντολής IMPLICT NONE Η σύνταξη των δηλώσεων είναι παρόμοια με των απλών μεταβλητών και επωνύμων σταθερών π.χ. REAL ή Integer etc:: C(5) τάξης 1, μεγέθους 5, μορφής 1x5 Δήλωση Πινάκων (2) INTEGER ::count REAL ::PIN(5) DO count = 1, 5 PIN(count) = count +1 C(1) C(2) C(3) C(4) C(5) C(4) = 3.5 : Το στοιχείο με ενδείκτη 4, παίρνει τη τιμή 3.5 Το 5 είναι η έκταση της (πρώτης) διάστασης του πίνακα PIN(1) PIN(2) PIN(3) PIN(4) PIN(5) 2.0 3.0 4.0 5.0 6.0 8-7 8-8 Πανεπιστήμιο Κύπρου 2
Example Program pinakes implicit none integer::i=0 Real::C(5) Do i=1,5 C(i)=i+1 print*,c(i) End DO End program pinakes 8-9 Δήλωση Πινάκων (3) εν επιτρέπεται η δήλωση μεταβλητού μεγέθους πινάκων REAL ::A(N), όπου Ν μεταβλητή Αν δεν είμαστε σίγουροι για το μέγεθος του πίνακα: Κάνουμε μια πρόβλεψη του μεγέθους της διάστασης 8-10 που πιθανόν να χρειαστούμε ηλώνουμε το πίνακα με πιο μεγάλο μέγεθος από την πρόβλεψη μας (ή χρησιμοποιούμε δυναμικό πίνακα) x Γενική Μορφή δήλωση τύπου [, ιδιότητες::] μεταβλητη1(ενδείκτης1[, ενδείκτης2,...]),... ή δήλωση τύπου, DIMENSION (ενδείκτης1[, ενδείκτης 2,...]):: μεταβλητή1,... Οι ενδείκτες πρέπει να έχουν ακέραια τιμή Π.χ. REAL ::A(10,2,3), B(2,3) REAL, DIMENSION (10,3,2):: A, C, F Έκταση vs Ενδείκτη Ο ενδείκτης κάθε διάστασης μπορεί προαιρετικά να έχει ένα κάτω όριο και ένα άνω όριο: REAL ::A(0:8, -1:2) Έκταση: 9, 4 τάξη 2, μέγεθος 36, μορφή 9x4 πρώτο στοιχείο A(0,-1), τελευταίο A(8,2) Αν το κάτω όριο δεν δηλωθεί, τότε θεωρείται ίσο με τη μονάδα REAL ::B(9,4) τάξη 2, μέγεθος 36, μορφή 9x4 πρώτο στοιχείο B(1,1), τελευταίο A(9,4) Έκταση: 9, 4 Ίδιοι Πίνακες απλά χρησιμοποιούν διαφορετικούς ενδείκτες 8-11 8-12 Πανεπιστήμιο Κύπρου 3
Στοιχεία Πίνακα (1) Μπορούμε να διαχειριστούμε, να κάνουμε πράξεις, και να δημιουργήσουμε εκφράσεις χρησιμοποιώντας το σύνολο,, ή μμ μεμονωμένα μ στοιχεία ενός πίνακα REAL::A(2,2,2) A(1,1,1) = 2. (μόνο αυτό το στοιχείο παίρνει τη τιμή 2) REAL ::A(10), B(10) (ή REAL, DIMENSION(10) ::A,B) A = 10.0, Α=10 Οι πράξεις γίνονται σε όλα B = A, Β=10 τα στοιχεία των πινάκων. A = SQRT(A), Α=3.16 (δεν επιτρεπόταν στην F77) B = A+B, Β=13.6 Στοιχεία Πίνακα (2) Οι ενδείκτες των πινάκων είναι δυνατό να είναι Ακέραιες σταθερές Ακέραιες μεταβλητές Ακέραιες εκφράσεις REAL ::A(3,3), B(3,3), C(89), R INTEGER :: i=2, j=3 B(2,2) = 4.5 R = 7.0 B(i,j) = 3.3 C(INT(R)*2+1) = 2.0 A(1,2) = B(INT(C(15)), INT(SQRT(R))) 8-13 8-14 Με Κατασκευαστή Πίνακα (όχι στη F77) όνομα πίνακα = (/τιμη1, τιμη2,.../) REAL ::A(5) A = (/2.,4.,6.,8.,10./) ή REAL ::A(5) = (/2.,4.,6.,8.,10./) ΕΠΕΞΕΡΓΑΣΙΑ ΠΙΝΑΚΩΝ Οι τιμές μςμπορούν να είναι σταθερές ρςή μεταβλητές ή εκφράσεις, αλλά πρέπει να είναι του ίδιου τύπου με τον πίνακα 8-16 Για πολυδιάστατους πίνακες πρέπει να χρησιμοποιηθεί η εντολή RESHAPE (εκτός ύλης) Πανεπιστήμιο Κύπρου 4
8-17 Παράδειγμα REAL, DIMENSION(5) :: A, B REAL ::x = 2, y =3 A = (/2.,1.,2.,4.,4./) B = (/x,3. *2.,y*x,3.,4./) PRINT *, A PRINT *, Β Τυπώνει: 2.00000 1.00000 2.00000 4.000000 4.000000 2.00000 6.00000 6.00000 3.000000 4.000000 Παράδειγμα Program Constructor implicit none Real::a(5),b(5),c(3) Real::x=2,y=3 a=(/2.,1.,2.,3.,4./) b=(/x,3.*2,y*x,3.,4./) Print*,'(*********)',a,b c=1. a=(/x,y,c/) c=(/2.,3.,4./) b=(/c,x,y/) Print*,'-----',a,b end program Constructor 8-18 Με Τριάδες (όχι στη F77) όνομα πίνακα(όριο1:όριο2:βήμα [,...])= σταθερά ή έκφραση όριο1, όριο2, βήμα: ακέραιες σταθερές ή μεταβλητές ή εκφράσεις Όταν όριο1 παραλείπεται, θεωρείται ίσο με κάτω όριο ενδείκτη Όταν όριο2 παραλείπεται, θεωρείται ίσο με άνω όριο ενδείκτη Όταν βήμα παραλείπεται, θεωρείται ίσο με 1 REAL ::A(6,6) 8-19 A(3:4, 3:4) A(3, 1:6) A(1:6:2, 1:6:2) A(1:6, 1:6:3) 8-20 Παράδειγμα 1 REAL ::A(10) INTEGER ::n=10, m=5, l=2 A(3:5:2) = 1.0 A(1:5:2) = 3.0 A(1:5:2) = (/1.,2.,4./) A(:5:2) = 3.0 A(:m:l) = (/m,l,m+l) A(2::3) = 3.0 A(7:9) = 3.0 A(:) = 3.0 A(:n) = 3.0 A(3)=A(5)= 1. A(1)=A(3)=A(5)= 3. A(1)=1., A(3)=2., A(5)=4. A(1)=A(3)=A(5)= 3. A(1)=5, A(3)=2, A(5)=7 A(2)=A(5)=A(8)= 3. A(7)=A(8)=A(9)= 3. A= 3. (όλα έχουν τιμή 3.) A= 3. (όλα έχουν τιμή 3.) Πανεπιστήμιο Κύπρου 5
8-21 Παράδειγμα 2 REAL ::B(10,5), X(10) INTEGER ::n=10, m=5, l=2 B(n, :l) = 1.0 B(:n, l) = 1.0 B(m, :m) = 1.0 B(1:2, 2:3) = 1.0 X(10:1:-1) = X(1:10) Β(10,1)=Β(10,2)= 1. η δεύτερη στήλη έχει τιμή 1. η πέμπτη γραμμή έχει τιμή 1. Β(1,2)=1., Β(2,2)=1., Β(1,3)=1., Β(2,3)=1. Αναστρέφει τον πίνακα Επιπλέον Χρήση των Τριάδων INTEGER ::A(3,3), B(3,3), i A=1! Όλα τα στοιχεία του Α παίρνουν την τιμή 1 Α(1,:) = 2! Τα στοιχεία της πρώτης γραμμής παίρνουν τη τιμή 2 PRINT *, A! Τυπώνει όλα τα στοιχεία σε μια γραμμή, με προτεραιότητα! στήλης: Α(1,1) Α(2,1) Α(3,1) Α(1,2) Α(2,2) Α(3,2)...! ηλ. 2 1 1 2 1 1 2 1 1 8-22!Τυπώνει ανά γραμμή DO i=1, 3 PRINT *, A(i, : )! 2 2 2! 1 1 1! 1 1 1! Χρήση εγγενών συναρτήσεων B = 16 Α(::2,:)= :)= SQRT(B(::2,:)) :)) Με Διανυσματικούς Ενδείκτες (όχι στη F77) Παρόμοια μέθοδο με αυτή των τριάδων, όμως οι ακέραιοι ενδείκτες των στοιχείων του πίνακα περιέχονται σε ένα άλλο μονοδιάστατο πίνακα Χρησιμοποιούνται για την επιλογή τμημάτων του πίνακα που η θέση των στοιχείων δεν ακολουθεί μια κανονική σχέση διαδοχής 8-23 8-24 Παράδειγμα (1) INTEGER, DIMENSION(3):: a=(/1,5,2/), b=(/3,2,4/) INTEGER C(5,5), i C = 0 C(b,a) = 2! C(3,1) = C(2,1) = C(4,1) = 2! C(3,5) = C(2,5) = C(4,5) = 2! C(3,2) = C(2,2) = C(4,2) = 2 DO i =1, 5; PRINT*, C( i, : );!00000! 2 2 0 0 2! 22002! 22002! 00000 Πανεπιστήμιο Κύπρου 6
Παράδειγμα (2) a = a*b/2! (/1,5,4/) b = b+a/3! (/3,3,5/) C(a,b) = 3 DO i =1, 5; PRINT*, C( i, : );! 0 0 3 0 3! 2 2 0 0 2! 2 2 0 0 2!22303 2 3! 0 0 3 0 3 Με READ Οι τιμές εισάγονται κατά σειρά από το χρήστη μέσω του πληκτρολογίου ή διαβάζονται από αρχείο δεδομένων (επόμενη διαλ.) ) F90/95 F77 REAL ::A(10) REAL A(10) READ *, A INTEGER i DO i = 1, 10 READ *, A(i) Προσοχή στη είσοδο στοιχείων πολυδιάστατων πινάκων! 8-25 8-26 Με επανάληψη Ήδη είδαμε κάποια παραδείγματα 8-27 INTEGER ::A(50), count = 1 DO WHILE (count <51) IF (count <11) THEN A(count) = count ELSE READ *, A(count) END IF count = count + 1 PRINT *, A Υπονοούμενη Επανάληψη Μπορεί να χρησιμοποιηθεί σε συνάρτηση με τους προηγούμενους πέντε τρόπους επεξεργασίας στοιχείων πινάκων Είναι επανάληψη με αρίθμηση που επιλέγει στοιχεία πινάκων (όνομα πίνακα(αριθμητής), αριθμητής = τιμή1, τιμή2, βήμα) ((όνομα πίνακα(αριθμητής1,αριθμητής2), αριθμητής2 = τιμή1, τιμή2, βήμα), αριθμητής1= τιμή1, τιμή2, βήμα) REAL A(10) READ *, (A(i), i=1,10) 8-28 Πανεπιστήμιο Κύπρου 7
Υπονοούμενη επανάληψη με κατασκευαστές (/(έκφραση αριθμητή, αριθμητής = τιμη1, τιμή2, βήμα)/) INTEGER ::A(6), i LOGICAL ::L(10) A = (/(i,i = 1,6)/)! A(1) = 1, A(2) = 2, A(2::2) = (/(i**2,i=1,3)/)! A(2)=1, A(4) = 4, A(6) = 9 L = (/(.TRUE., i=1,5), (.FALSE., i=6,10)/) PRINT *, L! T T T T T F F F F F Πράξεις με Πίνακες F77: Χρησιμοποιούνται επαναλήψεις και οι πράξεις γίνονται για κάθε στοιχείο του πίνακα F90/95: Είναι δυνατό οι πράξεις να γίνονται σε ολόκληρο τον πίνακα ή σε τμήματα του (π.χ. με τριάδες) Μπορούν να χρησιμοποιηθούν όλοι οι αριθμητικοί, λογικοί, και συγκριτικοί τελεστές ύο πίνακες (ή δύο τμήματα πινάκων) μπορούν να είναι τελεστέοι στον ίδιο τελεστή μόνο αν είναι σύμμορφοι (ή σύμμορφα) 8-29 8-30 8-31 Παραδείγματα REAL, DIMENSION(10,10) x, y, z, w, v, a(20,20) x = 1! όλα 1. y = x*4 x4! όλα 4. z = x + y! όλα 5. w = z*y! όλα 20. v = w! όλα 20. a(1:10, 1:10) = v! έκα πρώτες γραμμές (μέχρι! τη 10 η στήλη) έχουν τιμή 20. F77: DO i = 1, 10 DO j = 1, 10 x(i,j) = 1! 100 επαναλήψεις Εγγενείς Συναρτήσεις Χειρισμού Πινάκων Η FORTRAN έχει 24 διαφορετικές εγγενείς συναρτήσεις για πίνακες. Π.χ. 8-32 SIZE(A): μέγεθος μγ ςή έκταση πίνακα Α LBOUND(A): κάτω όριο διαστάσεων του Α UBOUND(A): πάνω όριο SHAPE(A): μορφή του Α SUM(A): άθροισμα στοιχείων του Α PRODUCT(A): γινόμενο στοιχείων TRANSPOSE(A): αναστροφή του Α MERGE: συνένωση δύο πινάκων σε ένα ΑΝΥ(συνθήκη): αν κάποιο στοιχείο πληρεί τη συνθ. ALL(συνθήκη): αν όλα τα στοιχεία πληρούν τη συνθ. Πανεπιστήμιο Κύπρου 8
Παραδείγματα REAL A(3), B(2,3) PRINT *, SIZE(A)! 3 PRINT *, SIZE(B), SIZE(B,2)!6 3 A = 5.0 PRINT *, SUM(A)! 15.0 PRINT *, PRODUCT(A)! 125.0 PRINT *, PRODUCT(A(1:2))! 25.0 IF (ALL(A/=0.0)) 0)) A = 1.0/A A(1) = -1.0 IF (ANY(A<0.0)) A = ABS(A) Βιβλίο μαθήματος: Κεφ. 7.8 (σελ. 226) και ΠΑΡΑΡΤΗΜΑ (σελ. 556) 8-33 8-34 8-35 8-36 Πανεπιστήμιο Κύπρου 9
Περίληψη Πίνακες Παράμετροι, χαρακτηριστικά ήλωση Πινάκων Επεξεργασία Πινάκων Με κατασκευαστές (F90/95) Με τριάδες (F90/95) Με διανυσματικούς ενδείκτες (F90/95) Με READ Με επανάληψη Με υπονοούμενη επανάληψη Πράξεις με πίνακες Εγγενείς συναρτήσεις πινάκων 8-37 Πανεπιστήμιο Κύπρου 10