ΠΕΡΙΕΧΟΜΕΝΑ ΚΕΦΑΛΑΙΟ 1: Εισαγωγή... 17 1.1. Ανασκόπηση της ιστορίας των υπολογιστών... 18 1.2. Πληροφορία και δεδομένα... 24 1.3. Ο Υπολογιστής... 26 1.4. Δομή και λειτουργία του υπολογιστή... 28 1.5. Η εκτέλεση ενός προγράμματος... 34 1.6. Λογικά λάθη προγραμμάτων... 36 1.7. Παράσταση των αριθμών... 40 ΚΕΦΑΛΑΙΟ 2: Αλγόριθμοι και Προγράμματα... 47 2.1. Εισαγωγή... 47 2.2. Περιγραφή και χαρακτηριστικά των αλγόριθμων... 49 2.3. Λογικό διάγραμμα... 51 2.4. Παραδείγματα... 56 2.5. Γλώσσες προγραμματισμού... 68 2.6. Ασκήσεις... 71 ΚΕΦΑΛΑΙΟ 3: FORTRAN... 73 3.1. Εισαγωγή... 73 3.2. Βασικές έννοιες... 78 3.3. Αριθμητικές σταθερές... 86 3.4. Μεταβλητές... 88 3.5. Αριθμητικές εκφράσεις... 90 3.6. Ασκήσεις... 96 ΚΕΦΑΛΑΙΟ 4: Ένα απλό πρόγραμμα... 99 4.1. Εντολή αντικατάστασης... 99 4.2. Αρχικές τιμές... 101 4.3. Εντολές εισόδου/εξόδου... 102 4.4. Τεχνικές εισόδου/εξόδου... 106 4.5. Βασικές εντολές ενός προγράμματος... 109 4.6. Παραδείγματα προγραμμάτων... 112 4.7. Ασκήσεις... 115
8 FORTRAN 77/90/95/2003 ΚΕΦΑΛΑΙΟ 5: Εντολές ελέγχου... 119 5.1. Εισαγωγή... 119 5.2. Εντολή απλής διακλάδωσης... 120 5.3. Διακλάδωση προς 3 διευθύνσεις... 121 5.4. Διακλάδωση προς 2 διευθύνσεις... 123 5.5. Διακλάδωση προς πολλές διευθύνσεις... 131 5.6. Εντολή ανακύκλωσης... 133 5.7. Ιδιαίτερα χαρακτηριστικά... 137 5.8. Παραδείγματα προγραμμάτων... 150 5.9. Ασκήσεις... 155 ΚΕΦΑΛΑΙΟ 6: Μεταβλητές με δείκτες... 159 6.1. Ορισμός... 159 6.2. Εντολή DIMENSION... 162 6.3. Είσοδος έξοδος πινάκων... 170 6.4. Νέες εντολές της Fortran 90/95... 172 6.5. Παραδείγματα προγραμμάτων... 178 6.6. Ασκήσεις... 184 ΚΕΦΑΛΑΙΟ 7: Eντολές τύπου... 187 7.1. Τύποι μεταβλητών... 188 7.2. Αριθμητικές εκφράσεις... 192 7.3. Υπολογισμός αριθμητικών εκφράσεων... 194 7.4. Λογικές μεταβλητές... 195 7.5. Μεταβλητές χαρακτήρων... 198 7.6. Εντολές αντικατάστασης... 204 7.7. Δημιουργία νέων τύπων δεδομένων... 205 7.8. Παραδείγματα προγραμμάτων... 209 7.9. Ασκήσεις... 214 ΚΕΦΑΛΑΙΟ 8: Είσοδος έξοδος... 217 8.1. Εισαγωγή... 218 8.2. Γενικοί τύποι για την είσοδο και έξοδο... 219 8.3. Προδιαγραφές του FORMAT... 222 8.4. Μεταβλητά FORMAT... 249 8.5. Ελεύθερο FORMAT... 253 8.6. Παραδείγματα... 255 8.7. Ασκήσεις... 260
ΠΕΡΙΕΧΟΜΕΝΑ 9 ΚΕΦΑΛΑΙΟ 9: Υποπρογράμματα... 263 9.1. Βασικές έννοιες... 264 9.2. SUBROUTINE... 268 9.3. FUNCTION... 271 9.4. Πως καλείται ένα υποπρόγραμμα... 273 9.5. Επικοινωνία υποπρογραμμάτων... 278 9.6. Δήλωση μιας συνάρτησης... 281 9.7. Νέες εντολές της Fortran 90/95... 283 9.8. Παραδείγματα προγραμμάτων... 298 9.9. Ασκήσεις... 305 ΚΕΦΑΛΑΙΟ 10: Αρχεία... 309 10.1. Γενικές έννοιες... 310 10.2. Κατηγορίες αρχείων... 315 10.3. Οργάνωση αρχείων... 318 10.4. Εντολές της FΟRΤRAN για την επεξεργασία αρχείων... 322 10.5. Παραδείγματα προγραμμάτων... 340 10.6. Ασκήσεις... 347 ΚΕΦΑΛΑΙΟ 11: Fortran 2003... 349 11.1. Εισαγωγή... 349 11.2. Αντικειμενοστραφής προγραμματισμός... 351 11.3. Είσοδος/έξοδος... 354 11.4. Ειδικές βελτιώσεις... 360 11.5. Συνεργασία με το λειτουργικό σύστημα... 365 11.6. Διαλειτουργικότητα με τη γλώσσα προγραμματισμού C... 370 11.7. Παραδείγματα προγραμμάτων... 378 ΠΑΡΑΡΤΗΜΑ Α: Εσωτερικές συναρτήσεις βιβλιοθήκης της FORTRAN 77... 385 ΠΑΡΑΡΤΗΜΑ Β: Στάνταρ συναρτήσεις βιβλιοθήκης της FORTRAN 77... 387 ΠΑΡΑΡΤΗΜΑ Γ: Συναρτήσεις της Fortran 90/95... 401 ΠΑΡΑΡΤΗΜΑ Δ: Μεταγλωττιστές της FORTRAN... 409 ΠΑΡΑΡΤΗΜΑ E: Περιεχόμενα του CD... 417 Βιβλιογραφία... 427 Ευρετήριο... 433
ΚΕΦΑΛΑΙΟ 6 ΜΕΤΑΒΛΗΤΕΣ ΜΕ ΔΕΙΚΤΕΣ 6.1 Ορισμός 6.2. Εντολή DIMENSION 6.3. Είσοδος-έξοδος πινάκων 6.4. Νέες εντολές της Fortran 90/95 6.5. Παραδείγματα προγραμμάτων 6.6. Ασκήσεις Σε πολλά επιστημονικά, και όχι μόνο, προβλήματα χρησιμοποιούμε συχνά πίνακες με δύο ή και περισσότερες διαστάσεις. Στον προγραμματισμό, ένας πίνακας είναι πολύ χρήσιμος για τη συστηματική επεξεργασία των δεδομένων. Στη γλώσσα FΟRΤRΑΝ κάθε μια διάσταση του πίνακα εκφράζει και μία μεταβλητή η οποία μπορεί να πάρει περισσότερες από μία τιμές. Επειδή χρειάζεται ιδιαίτερη προσοχή στη δήλωση, χρήση και επεξεργασία των πινάκων, γι' αυτό το λόγο σ' αυτό το κεφάλαιο θα μελετήσουμε αποκλειστικά τους πίνακες ή όπως συνήθως λέγονται στον προγραμματισμό των υπολογιστών, μεταβλητές με δείκτες. 6.1. Ορισμός Στον προγραμματισμό μια μεταβλητή χαρακτηρίζεται, από το συμβολικό της όνομα και από το ότι καταλαμβάνει μια μόνο θέση μνήμης του υπολογιστή ή όπως λέγεται μια "λέξη" μνήμης. Υπάρχει όμως, η δυνατότητα μ' ένα μόνο συμβολικό όνομα να ορίσουμε και μια συνεχή σειρά από θέσεις στη μνήμη. Σ' αυτή την περίπτωση το συμβολικό όνομα της μεταβλητής θα λέγεται πίνακας (Αrray). Έτσι, μία μεταβλητή η οποία καταλαμβάνει μία θέση μνήμης θα λέγεται απλή μεταβλητή και μία μεταβλητή η οποία καταλαμβάνει πολλές θέσεις μνήμης θα λέγεται μεταβλητή με δείκτες.
160 FORTRAN 77/90/95/2003 Οι δείκτες ορίζουν τις διαστάσεις του πίνακα και επιτρέπουν να βρίσκουμε το συγκεκριμένο στοιχείο του. Έτσι, η έκφραση Α(10) υποδεικνύει το δέκατο στοιχείο ενός μονοδιάστατου πίνακα και η έκφραση Β(3,5) υποδεικνύει το στοιχείο το οποίο βρίσκεται στη 3 η γραμμή και στη 5 η στήλη ενός διδιάστατου πίνακα. Όλες οι τιμές οι οποίες τοποθετούνται σ' ένα πίνακα, με οποιοδήποτε τρόπο, πρέπει να είναι ίδιου τύπου. Δηλαδή, όλες οι τιμές πρέπει να είναι ακέραιες ή οι όλες να είναι πραγματικές. Το όνομα μιας μεταβλητής με δείκτες (πίνακας), υπακούει στους ίδιους κανόνες της γλώσσας FORTRAN οι οποίο ισχύουν και για μία απλή μεταβλητή. Αν δεν οριστεί αναλυτικά, με μια δηλωτική εντολή, ο τύπος μιας μεταβλητής με δείκτες τότε, αν το όνομα αρχίζει μ ένα από τα έξι (6) γράμματα Ι, J, Κ, L, Μ, Ν, τα στοιχεία του πίνακα θα είναι ακέραιοι, διαφορετικά θα είναι πραγματικοί. Επίσης, μία μεταβλητή με δείκτη, μπορεί να αναπληρώσει μία απλή μεταβλητή παντού όπου την έχουμε συναντήσει μέχρι τώρα, εκτός από την περίπτωση των τριών παραμέτρων μιας εντολής DΟ. Μέχρι και την έκδοση της FORTRAN 77, δεν μπορούσαμε να γράψουμε τις εντολές: DΟ 10 Ι = Α(1), Α(10)................... 10 CΟΝΤΙΝUE αλλά έπρεπε να γράψουμε: Ι1 =Α(1) Ι2=Α(10) DΟ 10 Ι = Ι1, Ι2.......... 10 CΟΝΤΙΝUE Σημείωση : Ο περιορισμός αυτός δεν ισχύει στη Fortran 90/95 με την προϋπόθεση το βήμα να έχει ακέραια τιμή
ΚΕΦΑΛΑΙΟ 6: ΜΕΤΑΒΛΗΤΕΣ ΜΕ ΔΕΙΚΤΕΣ 161 Ο δείκτης ενός πίνακα μπορεί να είναι μια αριθμητική έκφραση, ακέραια ή πραγματική, η οποία αυτόματα θα πάρει την αμέσως μικρότερη ακέραια τιμή δηλαδή, γίνεται α- ποκοπή της τιμής (truncation). Π.χ. μπορούμε να γράφουμε : Κ(10), Μ(10+J), R(Α+Β-Χ), D(1+Α**2) Αν όμως, κάποιος δείκτης υπολογίζεται κατά τη διάρκεια των πράξεων του προγράμματος και πάρει τιμή εκτός των ορίων ορισμού του πίνακα τότε, θα μπορεί να συμβεί σοβαρό λάθος στην εκτέλεση των πράξεων και φυσικά, τα αποτελέσματα δεν θα είναι σωστά. Πολλές φορές, ένα παρόμοιο σφάλμα μπορεί να προκαλέσει διακοπή της εκτέλεσης των πράξεων του προγράμματος λόγω της επέμβασης σε μη επιτρεπτές περιοχές της μνήμης, ενώ άλλες φορές κάνουμε πράξεις με θέσεις μνήμης οι οποίες δεν αντιστοιχούν στον πίνακα τον οποίο έχουμε δηλώσει και άρα, ή χρησιμοποιούμε αυθαίρετες τιμές ή τοποθετούμε τιμές εκεί όπου δεν μπορούμε στη συνέχεια να τις χρησιμοποιήσουμε. Το πλήθος των δεικτών, καθώς και οι τιμές των διαστάσεων ενός πίνακα ορίζονται με τη δηλωτική εντολή DΙΜEΝSΙΟΝ. Σημείωση. Μέχρι την έκδοση της FORTRAN 66, η τιμή κάθε δείκτη έπρεπε να ήταν μεγαλύτερη ή ίση με τη μονάδα.
162 FORTRAN 77/90/95/2003 6.2. Εντολή DIMENSION Η εντολή DIΜEΝSΙΟΝ ανήκει στις εντολές προδιαγραφών, δεν εκτελείται, αλλά δηλώνει-ορίζει το μέγεθος ενός ή περισσοτέρων πινάκων. Δηλαδή, με την εντολή DIΜEΝSΙΟΝ ζητάμε να δεσμευτεί στη μνήμη μια ζώνη από συνεχόμενες θέσεις μνήμης οι οποίες θα έχουν όλες το ίδιο συμβολικό όνομα. Η εντολή DIΜEΝSΙΟΝ πρέπει να δηλώνεται πριν από την πρώτη χρήση της μεταβλητής με δείκτη (πίνακα). Έτσι, από συνήθεια και ομοιομορφία, συγκεντρώνουμε όλες τις εντολές DΙΜEΝSΙΟΝ στην αρχή του προγράμματος. Ο σκοπός αυτής της εντολής είναι να προειδοποιήσει το μεταγλωττιστή της γλώσσας FORΤRΑΝ για να δεσμεύσει τις απαραίτητες θέσεις στη μνήμη για τις δηλούμενες μεταβλητές. 6.2.1. Ορισμός της εντολής DIΜEΝSΙΟΝ Μέχρι και τη FORTRAN 77, η γενική μορφή της εντολής DΙΜEΝSΙΟΝ ήταν: DIMENSION όνομα μεταβλητής με δείκτες ( Χ : Υ ) Το Χ εκφράζει την κατώτερη τιμή την οποία μπορεί να λάβει ο δείκτης και όταν λείπει εννοείται η μονάδα. Το Υ εκφράζει την ανώτερη τιμή την οποία μπορεί να λάβει ο δείκτης και πρέπει να υπάρχει υποχρεωτικά. Ο τύπος των μεταβλητών με δείκτες ακολουθεί τους ίδιους κανόνες με μία απλή μεταβλητή. Επίσης, μπορούμε να δηλώσουμε ταυτόχρονα και περισσότερα ονόματα μεταβλητών με δείκτες χωρισμένα με υποδιαστολή. Π.χ. μπορούμε να γράψουμε : DΙΜEΝSΙΟΝ Α(15), Β(10, 10), C(-5 : 5), Κ(3, 2, 2) Η τιμή η οποία βρίσκεται ανάμέσα στις παρενθέσεις δηλώνει τον αριθμό των διαδοχικών θέσεων μνήμης οι οποίες θα δεσμευτούν. Όταν υπάρχουν περισσότερες τιμές, οι οποίες μπορεί να φθάσουν μέχρι τις 7, αυτό σημαίνει ότι ο πίνακας είναι περισσοτέρων διαστάσεων. Π.χ. Για τον πίνακα Α(15) κρατάμε 15 διαδοχικές θέσεις μνήμης. Για τον πίνακα Β(10,10) κρατάμε 10*10 = 100 διαδοχικές θέσεις μνήμης. Για τον πίνακα C(-5:5) κρατάμε συνολικά 11 θέσεις μνήμης. Για τον πίνακα Κ(3, 2, 2) κρατάμε συνολικά 3*2*2 = 12 θέσεις μνήμης.
ΚΕΦΑΛΑΙΟ 6: ΜΕΤΑΒΛΗΤΕΣ ΜΕ ΔΕΙΚΤΕΣ 163 Με τη Fortran 90/95 η γενική μορφή της εντολής DΙΜEΝSΙΟΝ γίνεται: Τύπος, DIMENSION (Χ :Υ) :: όνομα μεταβλητής με δείκτες Ο Τύπος, είναι ένας από τους γνωστούς και αποδεκτούς τύπους των μεταβλητών. Μπορούμε να δηλώσουμε ταυτόχρονα και περισσότερα ονόματα μεταβλητών με δείκτες, χωρισμένα με υποδιαστολή. Π.χ. μπορούμε να γράψουμε : REAL, DΙΜEΝSΙΟΝ (15) :: Α, Β, C(-5 : 5), Μ(7,7), Κ(3, 2, 2) Εδώ, όλοι οι πίνακες θα δέχονται μόνο πραγματικές τιμές, αλλά επιπλέον, οι μεταβλητές C, Μ και K δεν θα ακολουθούν τη γενική δήλωση. Δηλαδή, οι πίνακες Α και Β θα είναι μονοδιάστατοι και 15 θέσεων ο κάθε ένας, ενώ ο πίνακας C θα είναι μονοδιάστατος αλλά 11 θέσεων, ο πίνακας Μ διδιάστατος και ο πίνακας Κ τριδιάστατος. Επομένως, έχουμε την ευχέρεια να δηλώνουμε τους πίνακες με μεγάλη ευελιξία. Αν γράψουμε : INTEGER, DΙΜEΝSΙΟΝ (10, 10) :: Α, Β, C τότε, όλοι οι πίνακες θα είναι διδιάστατοι (10, 10) και θα δέχονται μόνο ακέραιες τιμές. Εναλλακτικά, μπορούμε να δηλώσουμε τους πίνακες χωρίς τη χρήση της εντολής DIMENSION, μέσω των γνωστών δηλωτικών εντολών. Π.χ. μπορούμε να γράψουμε τις ακόλουθες εντολές: REAL X(5,5), Y(5, 5) INTEGER TAB(100), PIN(10, 20) αντί για τις εντολές: REAL, DIMENSION (5,5) :: Χ, Y INTEGER, DIMENSION (100) :: TAB, PIN(10,20) Παρατήρηση. Συνιστάται η χρησιμοποίηση και της λέξης DIMENSION στη δήλωση των πινάκων επειδή παρέχει μεγαλύτερη ακρίβεια στη διατύπωση των εντολών του προγράμματος
164 FORTRAN 77/90/95/2003 6.2.2. Εισαγωγή τιμών σε πίνακα Όλες οι θέσεις μνήμης τις οποίες καταλαμβάνει ένας πίνακας ταυτόχρονα με τη δήλωσή του μηδενίζονται. Δηλαδή, οι αρχικές τιμές ενός πίνακα είναι πάντα μηδέν. Μπορούμε όμως, να δώσουμε τιμές σ ένα πίνακα στη FORTRAN με τους ακόλουθους τρεις τρόπους. Α τρόπος. Με τις εντολές της απλής αντικατάστασης. Αν έχουμε τον πίνακα Α(5) και θέλουμε να δώσουμε τις τιμές 10, 20, 30, 40, 50 μπορούμε να γράψουμε : INTEGER, DIMENSION (5) :: A Α(1) = 10 Α(2) = 20 Α(3) = 30 Α(4) = 40 Α(5) = 50 Μπορούμε να βελτιώσουμε αυτόν τον κώδικα με την χρήση της εντολής DO. Π.χ. INTEGER, DIMENSION (5) :: A DO I = 1, 5 Α(I) = I*10 ENDDO Μπορούμε να δώσουμε και σε μεμονωμένες θέσεις ενός πίνακα τιμές, δηλαδή μπορούμε να γράψουμε : Α(3) = 3055 Β τρόπος. Κατά τη διάρκεια εκτέλεσης του προγράμματος (Εντολές εισόδου). Αν θέλουμε να δώσουμε δυναμικά, κατά τη διάρκεια της εκτέλεσης του προγράμματος, τιμές οι οποίες θα τοποθετηθούν σε πίνακες, μπορούμε να χρησιμοποιήσουμε τις εντολές εισόδου της FORTRAN, δηλαδή μπορούμε να γράψουμε : INTEGER, DIMENSION (5) :: A PRINT *, "Πληκτρολογείστε πέντε τιμές" READ *, A
ΚΕΦΑΛΑΙΟ 6: ΜΕΤΑΒΛΗΤΕΣ ΜΕ ΔΕΙΚΤΕΣ 165 Οι πέντε τιμές (5) οι οποίες θα πρέπει να πληκτρολογηθούν, όταν εμφανιστεί το μήνυμα στην οθόνη, θα τοποθετηθούν στις πέντε (5) θέσεις του πίνακα Α. Γ τρόπος. Με τη βοήθεια της εντολής DATA. Όταν πρέπει να δώσουμε αρχικές τιμές σε ένα πρόγραμμα οι οποίες δεν θα αλλάζουν σε κάθε νέα εκτέλεση του προγράμματος ή κατά τη διάρκεια της εκτέλεσης πρέπει να πληκτρολογήσουμε ένα μεγάλο αριθμό γνωστών τιμών, θεωρείται άστοχο να τις πληκτρολογούμε σε κάθε νέα επανεκκίνηση του προγράμματος. Οι λόγοι της αποφυγής αυτής της μορφής απόδοσης τιμών είναι κυρίως δύο. Ο πρώτος λόγος είναι ότι προκαλείται καθυστέρηση στην έκδοση των αποτελεσμάτων, από τη χρονοβόρο διαδικασία της πληκτρολόγησης και ο δεύτερος, ίσως και ο πιο σημαντικός λόγος, είναι ότι μια λανθασμένη πληκτρολόγηση μπορεί να προκαλέσει λανθασμένα αποτελέσματα. Συνιστάται λοιπόν, η χρησιμοποίηση της εντολής DATA, η οποία επιτρέπει τη μαζική απόδοση τιμών σε απλές μεταβλητές και σε μεταβλητές με δείκτες. H γενική μορφή της εντολής DATA, είναι : DATA μεταβλητές / σταθερές τιμές Μπορούμε, στη θέση των μεταβλητών να τοποθετήσουμε μια σειρά από απλές μεταβλητές ή/και μεταβλητές με δείκτες του προγράμματος. Στη θέση των σταθερών τιμών γράφουμε τις αντίστοιχες τιμές των μεταβλητών. Π.χ. η συνέχεια των εντολών: REAL XYZ (4) DATA XYZ / 1.2, 15.5, 7.0, 14.1 / θα προκαλέσει αντικατάσταση των τεσσάρων αριθμητικών τιμών στις τέσσερεις θέσεις του πίνακα ΧYZ. Η συνέχεια των εντολών: INTEGER Χ(2, 2), Z DATA Χ, Z / 1, 2, 3, 4, 5 / θα προκαλέσει αντικατάσταση των 4 πρώτων τιμών (1, 2, 3, 4) στις 4 θέσεις του πίνακα Χ ως εξής : Χ(1, 1)=1, Χ(2, 1)=2, Χ(1, 2)=3 και Χ(2, 2)=4, και την τιμή 5 στην απλή μεταβλητή Ζ.
166 FORTRAN 77/90/95/2003 Η εντολή DATA μπορεί να βρίσκεται σε οποιοδήποτε σημείο του κώδικα, αλλά συνήθως τοποθετείται στην αρχή του προγράμματος και χρησιμεύει κυρίως για την απόδοση αρχικών ή σταθερών τιμών στις μεταβλητές. 6.2.3. Διαδικασία αποθήκευσης τιμών Ας εξετάσουμε τώρα τη διαδικασία αποθήκευσης στη μνήμη των τιμών ενός πίνακα. Για έναν πίνακα μιας διάστασης είναι απλό. Το στοιχείο π.χ. Α(3), βρίσκεται στην τρίτη κατά σειρά θέση (εικόνα 6.1.) Απόσπασμα Μνήμης Διεύθυνση Τιμή Α(1) 12345 00000101010100001 Α(2) 12346 00010001010001000 Α(3) 12347 00000101111101110 Εικόνα 6.1. Αποθήκευση ενός μονοδιάστατου πίνακα στη μνήμη Για έναν πίνακα δύο διαστάσεων, π.χ. Β(3, 2) οι θέσεις στη μνήμη βρίσκονται με την ακόλουθη διάταξη: Β(1,1) Β(2,1), Β(3,1) και στη συνέχεια Β(1,2), Β(2,2), Β(3,2) δηλαδή, οι πίνακες δύο διαστάσεων κρατούν τόσες θέσεις όσα τα στοιχεία τους, τα οποία είναι διατεταγμένα μέσα στη μνήμη, πρώτα όλα τα στοιχεία της πρώτης στήλης, κατόπιν όλα τα στοιχεία της δεύτερης στήλης και ούτω καθ' εξής μέχρι την τελευταία στήλη (εικόνα 6.2). Πιο απλά, πιο γρήγορα μεταβάλλεται ο πρώτος δείκτης (δείκτης γραμμών). Απόσπασμα Μνήμης Διεύθυνση Τιμή Β(1,1) 12345 00000101010100001 Β(2,1) 12346 00010001010001000 Β(3,1) 12347 00000101111101110 Β(1,2) 12348 00000101010100001 Β(2,2) 12349 00010001010001000 Β(3,2) 12350 00000101111101110 Εικόνα 6.2. Αποθήκευση ενός διδιάστατου πίνακα στη μνήμη
ΚΕΦΑΛΑΙΟ 6: ΜΕΤΑΒΛΗΤΕΣ ΜΕ ΔΕΙΚΤΕΣ 167 Εύκολα, μπορούμε να βρούμε τη σχέση η οποία μετατρέπει έναν πίνακα πολλών διαστάσεων σε μονοδιάστατο. Για έναν πίνακα δύο διαστάσεων, έστω Β(Ι, J), ο δείκτης Ν ο οποίος αντιστοιχεί στο στοιχείο Β(Κ, L) θα είναι: Ν = (L-1) * Ι + Κ π.χ. η μεταβλητή Β(7,2) του πίνακα Β(10,10) θα βρίσκεται στη (2-1)*10+7= 17 κατά σειρά θέση στη μνήμη. Απόσπασμα Μνήμης Διεύθυνση Τιμή D(1,1,1) 12345 00000101010100001 D(2,1,1) 12346 00010001010001000 D(3,1,1) 12347 00000101111101110 D(1,2,1) 12348 00000101010100001 D(2,2,1) 12349 00010001010001000 D(3,2,1) 12350 00000101111101110 D(1,1,2) 12351 00000101010100001 D(2,1,2) 12352 00010001010001000 D(3,1,2) 12353 00000101111101110 D(1,2,2) 12354 00000101010100001 D(2,2,2) 12355 00010001010001000 D(3,2,2) 12356 00000101111101110 Εικόνα 6.3. Αποθήκευση ενός τριδιάστατου πίνακα στη μνήμη Για έναν πίνακα τριών διαστάσεων, π.χ. D(3,2,2) οι θέσεις στη μνήμη κατά σειρά θα είναι: D(1,1,1), D(2,1,1), D(3,1,1,), D(1,2,1), D(2,2,1), D(3,2,1), D(1,1,2), D(2,1,2), D(3,1,2), D(1,2,2), D(2,2,2), D(3,2,2) Δηλαδή, πρώτα μεταβάλλεται ο πρώτος δείκτης, μετά ο δεύτερος και τελευταίος ο τρίτος δείκτης (εικόνα 6.3.).
168 FORTRAN 77/90/95/2003 Το στοιχείο (Κ, L, Μ) ενός πίνακα τριών διαστάσεων (Ι, J, R) όταν αυτός μετατραπεί σ' ένα ισοδύναμο μονοδιάστατο πίνακα, θα έχει τη θέση του δείκτη Ν, όπου Ν δίνεται από τη σχέση: Ν=((Μ -1) * J + L - 1) * Ι + Κ π.χ. η μεταβλητή της θέσης D(2, 1, 2) του πίνακα D(3, 2, 2) θα βρίσκεται στη ((2-1)*2+1-1)*3+2 = 8 θέση, όπως φαίνεται και στην εικόνα 6.3. 6.2.4. Απλά παραδείγματα Παράδειγμα 1. Αν πληκτρολογήσουμε 20 ακέραιους αριθμούς, να υπολογιστεί το ά- θροισμά τους. Χρησιμοποιώντας ένα μονοδιάστατο πίνακα, έστω Κ, διαβάζουμε και αποθηκεύουμε όλες τις τιμές στον πίνακα Κ και στη συνέχεια με μία εντολή DΟ υπολογίζουμε και εμφανίζουμε το άθροισμα των 20 ακεραίων (μεταβλητή L). Έτσι έχουμε το πρόγραμμα: PROGRAM ARRAY IMPLICIT NONE INTEGER K, L, I DIMENSION K(20) PRINT *, 'ΠΛΗΚΤΡΟΛΟΓΗΣΤΕ 20 ΤΙΜΕΣ '! Διαβάζουμε τις 20 τιμές και τις αποθηκεύουμε στον πίνακα Κ REΑD *, Κ! Υπολογίζουμε το άθροισμα των στοιχείων του πίνακα Κ L=0 DΟ 2 Ι = 1, 20 L=L+ Κ(Ι) 2 CΟΝΤΙΝUE! Εμφάνιση του αποτελέσματος PRINT *, 'Αποτέλεσμα = ', Κ SΤΟP EΝD
ΚΕΦΑΛΑΙΟ 6: ΜΕΤΑΒΛΗΤΕΣ ΜΕ ΔΕΙΚΤΕΣ 169 Παράδειγμα 2. Με τη βοήθεια των πινάκων, μπορούμε να γράψουμε το ακόλουθο πρόγραμμα για το παράδειγμα ε' του 2 ου Κεφαλαίου ( 2.4.6). PROGRAM BUBBLE IMPLICIT NONE REAL A, X, Y INTEGER N, K, I DIMENSION A(30) PRINT *, 'ΠΛΗΚΤΡΟΛΟΓΗΣΤΕ ΤΙΣ 30 ΤΙΜΕΣ'! Διαβάζουμε τις 30 τιμές οι οποίες τοποθετούνται στον πίνακα Α REΑD *, Α! Εμφανίζουμε τις αρχικές τιμές του πίνακα Α PRINT *, 'ΑΡΧΙΚΕΣ ΤΙΜΕΣ ΤΟΥ ΠΙΝΑΚΑ', A Ν=30! Ορισμός του πλήθους των τιμών του πίνακα Α! Εφαρμογή της μεθόδου φυσαλίδας (Bubble) DΟ 10 Ι=1, Ν-1 ΙF(Α(Ι).LE. Α(Ι+1)) GΟΤΟ 10 Χ=Α(Ι) A(Ι)=Α(Ι+1) Α(Ι+1)=Χ Κ=Ι DO WHILE (K.GT. 1) ΙF(Α(Κ- 1).LE. Α(Κ)) GΟΤΟ 10 Y=Α(Κ) Α(Κ)=Α(K-1) A(K-1)=Y K=K-1 ENDDO 10 CONTINUE! Εμφανίζουμε τις τελικές τιμές του πίνακα Α! (διατεταγμένες κατ αύξουσα τάξη μεγέθους) PRINT *, 'ΔΙΑΤΑΞΗ ΣΕ ΑΥΞΟΥΣΑ ΤΑΞΗ', A STOP END
170 FORTRAN 77/90/95/2003 6.3. Είσοδος - έξοδος πινάκων Στην προηγούμενη παράγραφο, για να διαβάσουμε ή για να εμφανίσουμε στην οθόνη τα στοιχεία του πίνακα Α του δευτέρου παραδείγματος, χρησιμοποιούμε μόνο το συμβολικό του όνομα. Έτσι, κάθε στοιχείο του πίνακα Α μεταφέρεται σύμφωνα με τη σειρά με την οποία πληκτρολογείται ή βρίσκεται στη μνήμη. Το ίδιο και για έναν πίνακα δύο διαστάσεων πρώτα θα πληκτρολογηθούν ή θα εμφανιστούν τα στοιχεία της πρώτης στήλης, κατόπιν της δεύτερης κ.λ.π. μέχρι την τελευταία στήλη του πίνακα. Π.χ. η συνέχεια των εντολών: DIMENSION T( 3, 4 ) DO 10 J = 1, 4 DO 10 I = 1, 3 10 READ *, T( I, J ) Μας δίνει ακριβώς η ίδια αποτελέσματα, με τη συνέχεια των εντολών: DIMENSION T( 3, 4 ) READ *, T Και με τις δύο συνέχειες των εντολών διαβάζουμε δώδεκα (12) τιμές τις οποίες αποθηκεύουμε στον πίνακα Τ. Στη πρώτη συνέχεια, η εντολή READ εκτελείται δώδεκα φορές (λόγω των δώδεκα επαναλήψεων των εντολών DO), ενώ στη δεύτερη συνέχεια, έ- χουμε εκτέλεση της εντολής READ μόνο μία φορά. Ακόμη μία λεπτομέρεια. Και στις δύο συνέχειες των εντολών έχουμε αυτόματα επανάληψη της διαδικασίας εισόδου, τόσες φορές, όσες χρειάζονται για να συμπληρωθούν όλες οι θέσεις του πίνακα Τ. Προσοχή, και για τις δύο συνέχειες εντολών τα δεδομένα πρέπει να πληκτρολογούνται με μία μόνον τιμή σε κάθε γραμμή (και μετά ENTER). Μπορούμε όμως, ν' αποφύγουμε την περίπτωση πληκτρολόγησης μιας μόνο τιμής σε κάθε γραμμή, όταν προσθέσουμε το κατάλληλο FORMAT. Η συνέχεια των εντολών: DIMENSION T( 3, 4 ) READ(*, 101) T 101 FORMAT( 3F3.1 )
ΚΕΦΑΛΑΙΟ 6: ΜΕΤΑΒΛΗΤΕΣ ΜΕ ΔΕΙΚΤΕΣ 171 μας επιτρέπει να πληκτρολογούμε σε μια γραμμή τις τρεις τιμές κάθε μιας στήλης του πίνακα Τ, χωρισμένες μεταξύ τους είτε με μια υποδιαστολή είτε με ένα τουλάχιστον κενό διάστημα (space bar). Έτσι χρειαζόμαστε τέσσερεις γραμμές δεδομένων με τρεις τιμές σε κάθε μία γραμμή. Η συνέχεια των εντολών: DIMENSION T( 3, 4 ) READ(*, 102) T 102 FORMAT( 12F3.1 ) μας επιτρέπει να πληκτρολογήσουμε σε μία μόνο γραμμή όλες τις τιμές του πίνακα Τ, χωρισμένες μεταξύ τους είτε με μια υποδιαστολή είτε με ένα τουλάχιστον κενό διάστημα. Ιδιαίτερο ενδιαφέρον παρουσιάζεται κατά την εκτύπωση των τιμών ενός πίνακα επειδή, τις περισσότερες φορές, οι τιμές του πίνακα είναι τ αποτελέσματα της επεξεργασίας του προγράμματος και πρέπει να εμφανίζονται με την ανάλογη μορφή για την εύκολη ανάγνωσή τους. Π.χ. η συνέχεια των εντολών: DIMENSION T( 3, 4 ) WRITE(*, 200) T 200 FORMAT(3F3.1) θα μας εμφανίσει τις τιμές της κάθε στήλης στην ίδια γραμμή άρα, θα έχουμε στην οθόνη τέσσερεις γραμμές και σε κάθε γραμμή τρεις τιμές Εάν θέλουμε να εμφανιστούν οι τιμές κάθε γραμμής του πίνακα στην ίδια γραμμή της οθόνης θα πρέπει να γράψουμε τη συνέχεια των εντολών: DIMENSION T( 3, 4 ) DO 10 I = 1, 3 10 WRITE(*, 300) (T ( I, J ), J = 1, 4 )) 300 FORMAT( 4F3.1 ) Σημείωση: Περισσότερες λεπτομέρειες για τη σημασία και τη χρήση των εντολών εισόδου/εξόδου των πινάκων υπάρχουν στο 8 ο κεφάλαιο όπου πραγματοποιείται και λεπτομερής ανάπτυξη των εντολών FORMAT.