Πίνακες. (i) FORTRAN και Αντικειµενοστραφής Προγραµµατισµός

Σχετικά έγγραφα
Πίνακες. FORTRAN και Αντικειμενοστραφής Προγραμματισμός

Fortran και Αντικειμενοστραφής προγραμματισμός.

Πίνακες. (i) FORTRAN και Αντικειµενοστραφής Προγραµµατισµός

ιαφάνειες παρουσίασης #6

ιαφάνειες παρουσίασης #5

ιαφάνειες παρουσίασης #7

Εισαγωγή στον Προγραμματισμό Η/Υ (Fortran 90/95/2003)

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

Ενότητα 1 Διάλεξη 3. Προγραμματισμός με Εφαρμογές στην Επιστήμη του Μηχανικού. Σιέττος Κωνσταντίνος

Το πλήθος των δεικτών και οι µεγαλύτερες τιµές που µπορούν να πάρουν ορίζεται µε µία δηλωτική εντολή που λέγεται Dimension.

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΠΙΝΑΚΕΣ. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Μονοδιάστατοι πίνακες

Εισαγωγή στον Προγραμματισμό

ΕΠΛ031 - Εισαγωγή στον Προγραμματισμό

8 FORTRAN 77/90/95/2003

Υπολογιστές Ι. Άδειες Χρήσης. Πολυδιάστατοι πίνακες. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΠΙΝΑΚΕΣ. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

Προχωρημένες έννοιες προγραμματισμού σε Pazcal

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2016

IMPLICIT NONE INTEGER :: a, b, c

Μορφοποίηση της εξόδου

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τι είναι μια υπορουτίνα; με υπορουτίνα ΥΠΟΡΟΥΤΙΝΕΣ. Παράδειγμα #1: η πράξη SQ. Ποια η διαφορά συναρτήσεων και υπορουτίνων;

Προγραμματισμός με FORTRAN Συνοπτικός Οδηγός Α. Σπυρόπουλος Α. Μπουντουβής

ΕΙΣΑΓΩΓΗ ΣΤΟΝ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

Εισαγωγή στον Προγραμματισμό Η/Υ για Χημικούς Μηχανικούς

ΠΛΗΡΟΦΟΡΙΑΚΑ & ΤΗΛΕΠΙΚΟΙΝΩΝΙΑΚΑ ΣΥΣΤΗΜΑΤΑ

Εισαγωγή στον Προγραμματισμό

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΜΟΣ Εντολές επιλογής και αποφάσεων 1 ο Φύλλο Εργασιών Εισαγωγικές ασκήσεις για την εντολή if ΑΠΑΝΤΗΣΕΙΣ

Δομή προγράμματος στη Fortran

Άσκηση 1. O υπολογισμός να γίνει: α) με την τεχνική αθροίσματος σε μεταβλητή

Δομή προγράμματος στη Fortran

Fortran και Αντικειμενοστραφής προγραμματισμός.

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Γιατί πολυδιάστατους πίνακες; ΠΟΛΥΔΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ. Δήλωση πολυδιάστατων πινάκων. Δήλωση πολυδιάστατων πινάκων

ιαφάνειες παρουσίασης #4

Κεφάλαιο 5ο: Εντολές Επανάληψης

Υπολογιστές Ι. Άδειες Χρήσης. Υποπρογράμματα. Διδάσκοντες: Αν. Καθ. Δ. Παπαγεωργίου, Αν. Καθ. Ε. Λοιδωρίκης

Μονοδιάστατοι πίνακες

Εισαγωγή στον Προγραμματισμό Η/Υ για Χημικούς Μηχανικούς

ιαφάνειες παρουσίασης #4

int array[10]; double arr[5]; char pin[20]; Προγραµµατισµός Ι

ΚΕΦΑΛΑΙΟ 4ο. Α. Το περιβάλλον της Microsoft Fortran Powerstation

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

Εντολή Δεδομένα Περιεχόμενα μετά την εκτέλεση 1 read(x) 122 x= 2 read(a,b,c) a= b= c= 3 read(d,e)

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

Δομές Δεδομένων & Αλγόριθμοι

Τμήμα Φυσικής Πανεπιστημίου Κύπρου Εαρινό Εξάμηνο 2015/2016. ΦΥΣ145 Υπολογιστικές Μέθοδοι στην Φυσική

Pascal, απλοί τύποι, τελεστές και εκφράσεις

FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017

Άσκηση 1. Α. Υπολογίστε χωρίς να εκτελέσετε κώδικα FORTRAN τα παρακάτω: Ποιά είναι η τελική τιμή του Z στα παρακάτω κομμάτια κώδικα FORTRAN:

Εισαγωγή στον Προγραμματισμό Η/Υ για Χημικούς Μηχανικούς

Εισαγωγή στη Fortran. Μάθημα 3 ο. Ελευθερία Λιούκα

διανύσματα - Πίνακες - Struct Στατικό διάνυσμα Είσοδος Έξοδος δεδομένων Συναρτήσεις Χειρισμός σφαλμάτων ΤΕΤΑΡΤΗ ΔΙΑΛΕΞΗ

ΦΥΣ-151. Ηλεκτρονικοί Υπολογιστές Ι (FORTRAN 77) (Άνοιξη 2004)

ΦΥΣ 145 Μαθηµατικές Μέθοδοι στη Φυσική. Πρόοδος 28 Μαρτίου 2009 Οµάδα 1 η

Παράλληλη Επεξεργασία Κεφάλαιο 2 Παραλληλισμός Δεδομένων

Εισαγωγή στον Προγραμματισμό Η/Υ (Fortran 90/95/2003)

Oι εντολές COMMON και PARAMETER

Ερωτήσεις πολλαπλής επιλογής - Κεφάλαιο 2

Συναρτήσεις και Πίνακες

Είσοδος -Έξοδος. Άνοιγµα αρχείου:

Αναφορά (1/2) Μπορούμε να ορίσουμε μια άλλη, ισοδύναμη αλλά ίσως πιο σύντομη, ονομασία για ποσότητα (μεταβλητή, σταθερή, συνάρτηση, κλπ.

ΑΠΑΝΤΗΣΕΙΣ. H διαδικασία ανεύρεσης λογικών λαθών περιλαμβάνει : β- Σωστό. Διαπίστωση του είδους του λάθους γ- Σωστό δ- Λάθος

Κεφάλαιο 7ο: Συναρτήσεις και Υπορουτίνες

Προχωρημένες έννοιες προγραμματισμού σε C

Διαδικασιακός Προγραμματισμός

Κεφάλαιο 8ο: Αρχεία. 8.1 Τι είναι αρχείο;

Εισαγωγή στη χρήση Η/Υ. Αναγνωστοπούλου Χριστίνα Λέκτορας

Π. Σταθοπούλου ή Οµάδα Α (Φοιτητές µε µονό αριθµό Μητρώου ) ιδασκαλία : Παρασκευή 11πµ-13µµ ΗΛ7

επιµέλεια Θοδωρής Πιερράτος

Εισαγωγή στη Fortran. Μάθημα 1 ο. Ελευθερία Λιούκα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΥΠΟΛΟΓΙΣΤΩΝ Κεφάλαιο 10 : Εντολές επιλογής και αποφάσεων

ΔΟΜΗΜΕΝΟΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

Εισαγωγή στον δομημένο προγραμματισμό

Στόχοι και αντικείμενο ενότητας. Πέρασμα Πίνακα σε Συνάρτηση (συν.) Πέρασμα Πίνακα σε Συνάρτηση. #8.. Ειδικά Θέματα Αλγορίθμων

ΕΙ ΑΓΩΓΉ ΣΗΝ FORTRAN

Σχολικό Βιβλίο - Κεφάλαιο 7 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΕ PASCAL ΠΑΡΟΥΣΙΑΣΗ 13

ΕΠΛ031 - Εισαγωγή στον Προγραμματισμό

Προγραμματισμός PASCAL

Εισαγωγή στον Προγραμματισμό

- Αναπαράσταση ακέραιας τιµής : - Εύρος ακεραίων : - Ακέραιοι τύποι: - Πράξεις µε ακεραίους (DIV - MOD)

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Εισαγωγή στην FORTRAN. Δρ. Ιωάννης Λυχναρόπουλος

ΠΛΗΡΟΦΟΡΙΚΗ Ι (MATLAB) Ενότητα 5

Μονοδιάστατοι πίνακες (συνέχεια)

Μεταγλωττιστές Βελτιστοποίηση

Ενότητα 1 Διάλεξη 4. Προγραμματισμός με Εφαρμογές στην Επιστήμη του Μηχανικού. Σιέττος Κωνσταντίνος

ΦΥΣ 145 Μαθηµατικές Μέθοδοι στη Φυσική. Πρόοδος 20 Μαρτίου 2011 Οµάδα

ΥΠΟΛΟΓΙΣΤΕΣ Ι. Τι είναι μια συνάρτηση; ΣΥΝΑΡΤΗΣΕΙΣ. Δήλωση συνάρτησης sq. Παράδειγμα συνάρτησης: υπολογισμός τετραγώνου

ιαφάνειες παρουσίασης #3

Δομές Δεδομένων. Καθηγήτρια Μαρία Σατρατζέμη. Τμήμα Εφαρμοσμένης Πληροφορικής. Δομές Δεδομένων. Τμήμα Εφαρμοσμένης Πληροφορικής

Ο τελεστής ανάθεσης και οι εντολές εισόδουεξόδου

H ΓΛΩΣΣΑ C. Μάθηµα 7: Πίνακες. ηµήτρης Ψούνης

Μονοδιάστατοι Πίνακες

ΓΛΩΣΣΑ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ PASCAL

i : 0<=i<N-1 => data[i] <= data[i+1] 25/10/2009

Ένα περιοδικό για το ΑΕΠΠ Τεύχος Πανελλαδικών ΙΙ

242 -ΕισαγωγήστουςΗ/Υ

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

for for for for( . */

ΠΙΝΑΚΑΣ ΠΕΡΙΕΧΟΜΕΝΩΝ

Εισαγωγή στην Αριθμητική Ανάλυση

Transcript:

Πίνακες οµηµένη µεταβλητή: αποθηκεύει µια συλλογή από τιµές δεδοµένων Πίνακας (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