Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ ΠΙΝΑΚΕΣ Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD
ΕΙΣΑΓΩΓΗ Οι πίνακες είναι συλλογές δεδομένων που μοιράζονται τα ίδια χαρακτηριστικά. Τα στοιχεία ενός πίνακα βρίσκονται σε προκαθορισμένες αριθμημένες θέσεις (indexed) και ανήκουν όλα στον ίδιο τύπο δεδομένων Ο Η/Υ αντιλαμβάνεται τους πίνακες σαν απλές μορφές διαδοχικής καταχώρησης δεδομένων στη μνήμη του Είδη Στατικοί πίνακες: το μέγεθος δηλώνεται ρητά πριν το compilation στην περιοχή των δηλώσεων και δεν αλλάζει στην έκταση του προγράμματος Δυναμικοί πίνακες: στην περιοχή των δηλώσεων δηλώνονται ρητά οι διαστάσεις, ενώ το μέγεθος μπορεί να αλλάζει στην έκταση του προγράμματος και κατά την εκτέλεσή του. Οι πίνακες δηλώνονται ΥΠΟΧΡΕΩΤΙΚΑ
ΧΑΡΑΚΤΗΡΙΣΤΙΚΑ ΠΙΝΑΚΩΝ ΣΤΗΝ FORTRAN 1. Τύπος δεδομένων: (data type) integer, real, character, logical, complex Όλα τα στοιχεία ενός πίνακα έχουν τον ίδιο τύπο και τις ίδιες παραμέτρους 2. Τάξη (rank): αριθμός διαστάσεων Μέχρι 7 διαστάσεις Συνήθως χρησιμοποιούμε τους όρους τάξη 1 Διάνυσμα (vector) τάξη 2 Μητρώο (matrix) 3. Όρια (bounds): Το κάτω και το πάνω όριο των δεικτών σε κάθε διάσταση 4. Μέγεθος (size): το συνολικό πλήθος των στοιχείων του πίνακα (το γινόμενο των εκτάσεων των διαστάσεων) Η έκταση (extent) σε κάθε διάσταση είναι: (πάνω όριο - κάτω όριο +1) 5. Μορφή (shape): Ο τρόπος διάταξης των στοιχείων του πίνακα Δύο πίνακες με ίδια τάξη και έκταση δεικτών λέγονται σύμμορφοι (conformable)
ΔΗΛΩΣΗ ΣΤΑΤΙΚΩΝ ΠΙΝΑΚΩΝ ΤΥΠΟΣ ΔΕΔΟΜΕΝΩΝ[::] ΟΝΟΜΑ (έκταση) Παραδείγματα δηλώσεων integer:: A(3) real B(10,4) real,dimension(10,4)::b,c character(10)::s(20) integer:: A(3,6,8) Ο σωστός τρόπος δήλωσης στατικού πίνακα: integer,parameter:: N=5,M=7 real:: A(N,M) Δήλωση ορίων σε κάθε διάσταση
Στοιχεία πίνακα (array elements) ΟΝΟΜΑ ΠΙΝΑΚΑ (έκφραση ακέραιου τύπου) Στοιχεία ενός πίνακα είναι τα δεδομένα που απαρτίζουν τον πίνακα Για να αναφερθούμε σε ένα στοιχείο ενός πίνακα χρειάζεται να δηλώσουμε Το όνομα του πίνακα Τη θέση του στοιχείου Κάθε στοιχείο του πίνακα χρησιμοποιείται όπου μπορεί να χρησιμοποιηθεί και μία απλή μεταβλητή
Αποθήκευση στη μνήμη Οι τιμές των στοιχείων του πίνακα καταχωρούνται στη μνήμη σε συνεχόμενες θέσεις αλλάζοντας πρώτα τον 1 ο δείκτη, μετά τον 2 ο κ.ο.κ. Δηλαδή η αποθήκευση ενός δισδιάστατου πίνακα γίνεται με προτεραιότητα στηλών.
Πρόσβαση στα στοιχεία του πίνακα Απαιτείται το όνομα του πίνακα και η θέση του στοιχείου στον πίνακα Η θέση (δείκτες) καθορίζεται Με ρητή δήλωση Με αριθμητικές εκφράσεις Με συναρτήσεις Με στοιχεία ενός άλλου πίνακα Συνδυασμό των παραπάνω
Τριάδες Α(3:4,3:4) Έστω ο πίνακας A 6x6 Α(3, : ) Α(3,1:6) (το βήμα υπονοείται) Α( : : 2, : : 3) Α(1:6:2,1:6:3) (το πάνω και κάτω όριο υπονοείται) Α( :, 2: : 2)
Ανάθεση τιμών στα στοιχεία του πίνακα Με εκxώρηση Integer:: Β(10,4), A(4,9) B=5! Όλα τα στοιχεία του πίνακα B παίρνουν την τιμή 5 A(2,4)=8! To στοιχείο στην 2 η γραμμή και 4 η στήλη του Α παίρνει την τιμή 8 Με επανάληψη DO Τα στοιχεία σε κάθε γραμμή του πίνακα Α λαμβάνουν την τιμή της θέσης τους Με Read Με χρήση της random_number integer::a(3,4); real::x(3,4) call random_number(x) A=nint(X*10)+20 Καταχωρούνται από το πληκτρολόγιο τόσες τιμές όσες και το μέγεθος του πίνακα Α. Εκτυπώνονται όλα τα στοιχεία του πίνακα Α.
Ανάθεση τιμών στα στοιχεία του πίνακα (συνέχεια) Με κατασκευαστή πίνακα Μονοδιάστατοι Integer:: A(3), B(10) A=(/7,-3,2/) B=(/(i,i=1,5),(7,i=6,10)/) Με διανυσματικούς δείκτες Δισδιάστατοι Τα στοιχεία του πίνακα C λαμβάνουν την τιμή 999. Στις θέσεις των στοιχείων του C που προκύπτουν από όλους τους συνδυασμούς των τιμών των στοιχείων των Α, Β (3x3=9) εκχωρείται η τιμή 2. Με τριάδες [όνομα_πίνακα(όριο1:όριο2:βήμα)]
Παραδείγματα εξόδου Δισδιάστατου Πίνακα Έστω ο πίνακας integer::a(5,3) Τότε οι παρακάτω τρόποι έχουν το ίδιο ακριβώς αποτέλεσμα: Α. Με Do Do i=1,5 print (3i4),A(I,:) End do Β. Με διπλή υπονοούμενη επανάληψη Print (3i4), ((A(i,j),j=1,3),i=1,5) Γ. Με απλή υπονοούμενη επανάληψη Print (3i4), (A(i,:),i=1,5)
Υπονοούμενη επανάληψη Η υπονοούμενη επανάληψη χρησιμοποιείται Για τον καθορισμό επανάληψης σε ένα μέρος μιας λίστας εισόδου/εξόδου Για την μεταφορά μέρους ενός πίνακα Για την μεταφορά αντικειμένων ενός πίνακα με διαφορετική σειρά από αυτή που καταχωρούνται στη μνήμη. Παραδείγματα:
Πράξεις με πίνακες Οι πράξεις με πίνακες ακολουθούν ό,τι ισχύει και για τους διάφορους τύπους δεδομένων Οι πράξεις με πίνακες γίνονται με τρεις τρόπους Πράξεις με στοιχεία του πίνακα Κάθε στοιχείο του πίνακα χρησιμοποιείται σαν μεταβλητή Πράξεις με ολόκληρους πίνακες Χρησιμοποιούνται όλα τα στοιχεία του πίνακα Πράξεις με εγγενείς συναρτήσεις Ανάλογα με το πως ορίζεται η συνάρτηση
Βασικές Εγγενείς Συναρτήσεις για Πίνακες LBOUND UBOUND SIZE SHAPE MINVAL MAXVAL MINLOC MAXLOC SUM PRODUCT COUNT CSHIFT EOSHIFT TRANSPOSE ANY ALL MATMUL DOT_PRODUCT MERGE RESHAPE
Δυναμικοί Πίνακες Στους Δυναμικούς Πίνακες δεν γνωρίζουμε το μέγεθός τους εκ των προτέρων, αλλά αυτό καθορίζεται κατά την εκτέλεση του προγράμματος. Κατ τον τρόπο αυτό επιτυγχάνουμε βέλτιστη χρήση της διαθέσιμης μνήμης, επειδή εκμηδενίζονται τα κενά στοιχεία. Παράδειγμα: Δήλωση δυναμικών πινάκων. Integer,allocatable::A(:,:),B(:) Πρέπει να δηλώσουμε την τάξη Integer::N,M,st τους, αλλά όχι το μέγεθος τους Read*,N M=2*N Allocate(A(N,M),B(N),stat=st) Δημιουργία δυναμικών πινάκων If (st/=0) then print*, Sfalma! Παρουσιάστηκε σφάλμα π.χ. μη επαρκής μνήμη stop End if! Εντολές επεξεργασίας των πινάκων Deallocate(A,B) Καταστροφή δυναμικών πινάκων. (Γίνεται αυτόματα με το τέλος του προγράμματος)
Επεξεργασία Στοιχείων Δισδιάστατου Πίνακα Έστω ο πίνακας A ΝxM Κατά γραμμές Do i=1,n Do j=1,m <Επεξεργασία του στοιχείου A(i,j)> End Do End Do Κατά στήλες Do j=1,m Do i=1,n <Επεξεργασία του στοιχείου A(i,j)> End Do End Do
Τμήματα Τετραγωνικού Πίνακα NxN i=j i+j=n+1 i<j i+j<n+1 i>j i+j>n+1 Κύρια Διαγώνιος Δευτερεύουσα Διαγώνιος
ΔΟΜΗ WHERE Επηρεάζει τα στοιχεία στις θέσεις των δεικτών των πινάκων, για τις οποίες ισχύει η αντίστοιχη συνθήκη Where (συνθήκη) εκχώρηση Where (συνθήκη) εκχωρήσεις 1 Elsewhere (συνθήκη) εκχωρήσεις 2 Elsewhere εκχωρήσεις 3 End Where
Βασικές Λειτουργίες Πινάκων Αναζήτηση Σειριακή Δυαδική Ταξινόμηση Ευθείας Ανταλλαγής ή Bubble Sort Με επιλογή ή Selection Sort Με εισαγωγή ή Insertion Sort Quick Sort (Είναι αναδρομική διαδικασία) Συγχώνευση Πινάκων
Εφαρμογή: Αριθμητική Ολοκλήρωση (Κανόνας Τραπεζίου)