FORTRAN & Αντικειμενοστραφής Προγραμματισμός ΣΝΜΜ 2017 M7 Δομές δεδομένων: Πίνακες - Ασκήσεις Γεώργιος Παπαλάμπρου Επικ. Καθηγητής ΕΜΠ Εργαστήριο Ναυτικής Μηχανολογίας george.papalambrou@lme.ntua.gr ΕΜΠ/ΣΝΜΜ Εργαστήριο Ναυτικής Μηχανολογίας
Πίνακες Σε συνηθισμένη χρήση προγράμματος, μια λίστα είναι μια ακολουθία τιμών, που συνήθως όλες αντιπροσωπεύουν δεδομένα του ίδιου είδους πχ Μια λίστα μαθητών που έχουν εγγραφεί για ένα συγκεκριμένο μάθημα και Μια λίστα με όλους τους φοιτητές που είναι εγγεγραμμένοι σε ένα κολέγιο. Θα αναφερθούμε έτσι σε μια μονοδιάστατη διάταξη ως πίνακα ή λίστα. Συχνά, η ίδια λειτουργία ή ακολουθία των λειτουργιών εκτελείται σε κάθε στοιχείο ενός πίνακα. 2
Πίνακες Η Fortran έχει επίσης ισχυρές πράξεις και intrinsic functions που χειρίζονται ολόκληρες συστοιχίες ή τμήματα του πίνακα. Τα προγράμματα που έχουν γραφτεί χρησιμοποιώντας αυτές τις intrinsic functions είναι πιό αποδοτικά για τον μεταγλωττιστή (compiler) της γλώσσας (=βελτιστοποιημένο). από τους Fortran. Ειδικά σε υπολογιστές με αρχιτεκτονική παράλληλης επεξεργασίας ή επεξεργασίας πινάκων (parallel or array processing), τα προγράμματα αυτά είναι πιο πιθανό να επωφεληθούν από τα ειδικό υλικό (hardware) για την αύξηση της ταχύτητας εκτέλεσης. 3
Πίνακες και intrinsic functions που διαθέτει η γλώσσα FTN Constructor An array constructor is used to build an array from a list of values between "(/" and "/)". For example, given a REAL array x with shape (4): x = (/ 1.4, 0.5, 1.0, 1.5 /) All the components must have the same type and type attributes. 4
Πίνακες πολλών διαστάσεων Ασκήσεις με πίνακες πολλών διαστάσεων θα γίνουν στα τελευταία μαθήματα 5
6. Πράξεις με πίνακες: Αντιστροφή σειράς στοιχείων πίνακα (6.1) 6.1 Γράψτε ένα πρόγραμμα που αντιστρέφει τη σειρά των στοιχείων ενός δεδομένου πίνακα (reversing an array). (πρόγραμμα Reverse.f95 στην ιστοσελίδα μαθήματος) Για παράδειγμα, αν η δεδομένη διάταξη περιλαμβάνει πέντε στοιχεία: 3 5 7 2 4 Μετά την αντιστροφή της σειράς των στοιχείων, το αποτέλεσμα θα είναι: 4 2 7 5 3 Οι πίνακες με 1 διάσταση είναι επίσης γνωστοί ως λίστες (Lists) 6
6.1 Αντιστροφή σειράς στοιχείων πίνακα Το παραπάνω πρόγραμμα χρησιμοποιεί την μεταβλητή a() για να κρατήσει τον πίνακα εισαγωγής και την μεταβλητή n για τον πραγματικό αριθμό των στοιχείων. Η τιμή για το n και οι τιμές εισόδου διαβάζονται με τις δύο πρώτες READ (*,*). Σημειώστε ότι η είσοδος έχει μια μορφή ως εξής: 8 10 50 30 70 35 97 65 59 Η πρώτη γραμμή περιέχει την τιμή για το η και η δεύτερη γραμμή έχει τον αριθμό των στοιχείων του πίνακα. 7
6.1 Αντιστροφή σειράς στοιχείων πίνακα Στο site Sheen: /One-Dimensional Arrays/ Reversing an Array 8
6.1 Αντιστροφή σειράς στοιχείων πίνακα Τμήμα δηλώσεων μεταβλητών: array a Εισαγωγή δεδομένων Χρήση Implicit do για input/output σε οθόνη 9
6.1 Αντιστροφή σειράς στοιχείων πίνακα Αντιστροφή σειράς στοιχείων πίνακα Απεικόνηση πίνακα a σε οθόνη Έστω ότι δώσαμε 4 2 3 6 0 -> Head =1, Tail =4 Loop #1 Loop #2 2 3 6 0 H T H T Loop #1 Head >= Tail Temp = a(1) a(head) = a(tail) a(tail) = Temp Head = Head + 1 Tail = Tail - 1! 1>=4 false! Temp=2! a(1)=a(4)! a(4)=2! Head=1+1=2! Tail=4-1=3 Loop #2 Loop #3 Head >= Tail Temp = a(2) a(head) = a(tail) a(tail) = Temp Head = Head + 1 Tail = Tail - 1! 2>=3 false! Temp=3! a(2)=a(3)! a(3)=3! Head=2+1=3! Tail=3-1=2 Head >= Tail! 3>=2 true - > EXIT a= 0 6 3 2 10
6. Πράξεις με πίνακες: Ταξινόμηση (6.2) 6.2 Ταξινόμηση πίνακα (sorting) Η ταξινόμηση είναι μια σημαντική εφαρμογή στον υπολογιστή. Υπάρχουν πολλές μέθοδοι διαλογής. Γράψτε ένα πρόγραμμα για να αναδιατάξετε τα στοιχεία μιας δεδομένης σειράς σε αύξουσα σειρά (πρόγραμμα Sorting.f95 στην ιστοσελίδα μαθήματος) Ας υποθέσουμε ότι ο πίνακας έχει n στοιχεία. Βρίσκουμε το μικρότερο στοιχείο και τη θέση του στον πίνακα και ανταλλάσουμε αυτό το στοιχείο με το πρώτο. Μετά από αυτό, το πρώτο στοιχείο είναι το μικρότερο. Στη συνέχεια βρίσκουμε το μικρότερο στοιχείο και τη θέση του όλων των στοιχείων στην περιοχή των 2 και n και αλλάζουμε αυτό με το δεύτερο. Μετά από αυτό, τα δύο πρώτα στοιχεία είναι ταξινομημένα. Επαναλαμβάνοντας την διαδικασία, το σύνολο της διάταξης ταξινομείται. Στο site Sheen: /One-Dimensional Arrays/ Sorting an Array 11
6.2 Ταξινόμηση πίνακα H function FindMinimum( ) λαμβάνει πίνακα x( ), μια αρχική θέση Start, και μια τελική θέση End, και επιστρέφει τη θέση του μικρότερου στοιχείου σε αυτό το εύρος. H υπορουτίνα Swap( ) ανταλλάσσει τις τιμές των ορισμάτων της. Η υπορουτίνα Sort( ) παίρνει έναν πίνακα x( ) μεγέθους Size και τον ταξινομεί. 12
6.2 Ταξινόμηση πίνακα H function FindMinimum( ) λαμβάνει πίνακα x( ), μια αρχική θέση Start, και μια τελική θέση End, και επιστρέφει τη θέση του μικρότερου στοιχείου σε αυτό το εύρος. H υπορουτίνα Swap( ) ανταλλάσσει τις τιμές των ορισμάτων της. Η υπορουτίνα Sort( ) παίρνει έναν πίνακα x( ) μεγέθους Size και τον ταξινομεί. Για κάθε στοιχείο μεταξύ του πρώτου και αυτού δίπλα στο τελευταίο (δηλ, Size -1), η θέση του μικρότερου στοιχείου στην περιοχή από i και Size βρίσκεται χρησιμοποιώντας την FindMinimum( ). Στη συνέχεια η υπορουτίνα Swap( ) καλείται για να ανταλλάξει τις τιμές του x(i) και x(location). Μετά από αυτό, τα στοιχεία στην περιοχή από 1 μέχρι i είναι ταξινομημένα. 13
6.2 Ταξινόμηση πίνακα, μέρος 1/3 14
6.2 Ταξινόμηση πίνακα, μέρος 2/3 15
6.2 Ταξινόμηση πίνακα, μέρος 3/3 16
Εκχώρηση μνήμης (DMA) PROGRAM allocatable_array IMPLICIT NONE INTEGER:: i,j INTEGER, ALLOCATABLE, DIMENSION(:):: pin1 ALLOCATE (pin1(5)) pin1=7 WRITE(*,*) pin1; WRITE(*,*)! prints number 7, 5 times DEALLOCATE(pin1)! ALLOCATE (pin1(3)) pin1=66 WRITE(*,*) pin1; WRITE(*,*)! prints number 66, 3 times DEALLOCATE(pin1) END (πρόγραμμα allocatable_array.f95 στην ιστοσελίδα μαθήματος, νέο για 2017) 17
Εκχώρηση μνήμης (DMA) PROGRAM allocatable_array IMPLICIT NONE INTEGER:: i,j INTEGER, ALLOCATABLE, DIMENSION(:):: pin1 ALLOCATE (pin1(5)) pin1=7 WRITE(*,*) pin1; WRITE(*,*)! prints number 7, 5 times DEALLOCATE(pin1)! Must be used if dimension changes.!otherwise RUN-TIME error!! ALLOCATE (pin1(3)) pin1=66 WRITE(*,*) pin1; WRITE(*,*)! prints number 66, 3 times DEALLOCATE(pin1) END 18