Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

46
ΦΥΣ-151: HΛΕΚΤΡΟΝΙΚΟΙ ΥΠΟΛΟΓΙΣΤΕΣ Ι ΕΣΑΓΩΓΗ ΣΤΗ FORTRAN 77 Νίκος Βουλγαράκης Πανεπιστήμιο Κρήτης Τμήμα Φυσικής

Transcript of Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

Page 1: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΦΥΣ-151: HΛΕΚΤΡΟΝΙΚΟΙ ΥΠΟΛΟΓΙΣΤΕΣ Ι ΕΣΑΓΩΓΗ ΣΤΗ FORTRAN 77

Νίκος Βουλγαράκης

Πανεπιστήµιο Κρήτης Τµήµα Φυσικής

Page 2: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης
Page 3: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

∆ΙΑΛΕΞΗ 1 .............................................................................................................................. 3

1.1 ΕΙΣΑΓΩΓΗ ΣΤΗ FORTRAN 77 .................................................................................... 3 1.1.1 ∆οµή προγράµµατος ................................................................................................. 3 1.1.2 Κανόνας των στηλών................................................................................................ 4 1.1.3 Ενα απλό παράδειγµα ............................................................................................... 5

1.2 ΑΛΓΕΒΡΙΚΕΣ ΠΡΑΞΕΙΣ............................................................................................... 5 1.3 ΜΕΤΑΒΛΗΤΕΣ (ΜΕΡΟΣ A)......................................................................................... 6

1.3.1 Τύποι µεταβλητών .................................................................................................... 6 1.3.2 ∆ήλωση µεταβλητών ................................................................................................ 7 1.3.3 Εκχώρηση τιµής στις µεταβλητές............................................................................. 7

1.4 ΕΤΟΛΕΣ read ΚΑΙ print................................................................................................. 7 1.4.1 Εντολή read .............................................................................................................. 7 1.4.2 Εντολή print.............................................................................................................. 8

2.4 ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ ............................................................................. 8 ∆ΙΑΛΕΞΗ 2 .............................................................................................................................. 9

2.1 ΜΕΤΑΒΛΗΤΕΣ (ΜΕΡΟΣ Β) ......................................................................................... 9 2.2 ΕΝΤΟΛΗ parameter ...................................................................................................... 9 2.3 ΕΣΩΤΕΡΙΚΕΣ ΣΥΝΑΡΤΗΣΕΙΣ (intrinsic functions) .................................................... 9 Συνάρτηση........................................................................................................................... 10 2.4 ΕΞΩΤΕΡΙΚΕΣ ΣΥΝΑΡΤΗΣΕΙΣ (external function).................................................... 12 2.5 ΕΝΤΟΛΗ ΕΛΕΓΧΟΥ IF ............................................................................................. 14 ΤΕΛΕΣΤΕΣ ΣΧΕΣΕΙΣ ........................................................................................................ 15

∆ΙΑΛΕΞΗ 3 ............................................................................................................................ 17 3.1 ΜΕΤΑΒΛΗΤΕΣ & ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ (ΜΕΡΟΣ Γ) ..................................... 17 3.2 ΕΝΤΟΛΗ ΕΠAΝΑΛΗΨΗΣ do .................................................................................... 19 3.3 ΕΝΤΟΛΗ ΕΠΑΝΑΛΗΨΗΣ ΚΑΙ ΕΛΕΓΧΟΥ do while............................................... 25

∆ΙΑΛΕΞΗ 4 ............................................................................................................................ 28 4.1 ΜΟΝΟ∆ΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ – ∆ΙΑΝΥΣΜΑΤΑ .................................................... 28 4.2 ΥΠΟΡΟΥΤΙΝΕΣ (subroutines)..................................................................................... 32

∆ΙΑΛΕΞΗ 5 ............................................................................................................................ 37 5.1 ∆Ι∆ΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ ........................................................................................... 37

5.1.1 Ανάγνωση απο τό πληκτρολόγιο και εκτύπωση στην οθόνη των στοιχείων ενός διδιάστατου πινακα.......................................................................................................... 38

5.2 ΜΕΤΑΒΛΗΤΕΣ (ΜΕΡΟΣ ∆) ....................................................................................... 39 5.2.1 Πραγµατικοί αριθµοί διπλής αρκίβειας (double precision).................................... 39 5.2.2 Μιγαδικοί αριθµοι (complex)................................................................................. 40

5.3 ∆ΙΑΧΕΙΡΙΣΗ ΑΡΧΕΙΩΝ .............................................................................................. 41 5.3.1 Open........................................................................................................................ 41 5.3.2 Close ....................................................................................................................... 42 5.3.3 Write ....................................................................................................................... 42 5.3.4 Read........................................................................................................................ 43

Page 4: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

3

∆ΙΑΛΕΞΗ 1

1.1 ΕΙΣΑΓΩΓΗ ΣΤΗ FORTRAN 77 Ένα πρόγραµµα σε οποιαδήποτε γλώσσα προγραµµατισµού δεν τίποτα άλλο από µια σειρά εντολών που πρέπει να εκτελέσει ο υπολογιστής για την επίλυση ενός προβλήµατος. Οπως και οι κοινές γλώσσες, έτσι και οι γλώσσες προγραµµατισµού αποτελούνται από ένα συγκεκριµένο σύνολο χαρακτήρων µε τη βοήθεια των οποίων µπορούµε να δηµιουργήσουµε «λέξεις» (εντολές ή συµβολικά ονόµατα) ή να γράψουµε αριθµητικές παραστάσεις.

Οι επιτρεπόµενοι χαρακτήρες στη FORTRAN 77 είναι: • τα 26 γράµµατα του αγγλικού αλφάβητου (κεφαλαία και µικρά) • τα ψηφία 0,1,2,...,9 • τα σύµβολα: + - * / = ( ) . , ’ _ το κενό

ΠΑΡΑΤΗΡΗΣΕΙΣ

1. Η FORTRAN 77 δεν κάνει διαχωρισµό µεταξύ κεφαλαίων και µικρών γραµµάτων. Για παράδειγµα, η εντολή print*,sum µπορεί να γραφτεί και ως PrINt*, Sum ή pRInt*,suM κοκ

2. Τα κενά δε λαµβάνονται υπ’όψιν από τον υπολογιστή. Για παράδειγµα το print*, sum είναι ισοδύναµο µε το pr in t * , Su m

3. Τα συµβολικά ονοµατα επιλέγονται ελεύθερα από τον προγραµµατιστή αλλά πρέπει να πληρούν ορισµένους κανόνες. Πιο συγκεκριµένα:

• Τα συµβολικά ονόµατα µπορούν να περιέχουν µέχρι 31 χαρακτήρες. • Οι επιτρεπόµενoi χαρακτήρες είναι: όλα τα γράµµατα του αγγλικού

αλφάβητου (κεφαλαία και µικρά), οι αριθµοί 0,1,2,...,9 και το _ (underscore)

• Ο πρώτος χαρακτήρας κάθε ονόµατος ΠΡΕΠΕΙ να είναι γράµµα

1.1.1 ∆οµή προγράµµατος Η δοµή ενός πρόγραµµατος στη FORTRAN 77 έχει ως εξής:

Page 5: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

4

program name δήλωση µεταβλητών εντολές stop end ΠΑΡΑΤΗΡΗΣΕΙΣ

1. Ένα πρόγραµµα στη FORTRAN 77 ξεκινάει µε την εντολή program και τελειώνει µε την εντολή end. Μεταξύ των εντολών αυτών υπάρχουν: αρχικά η δήλωση των µεταβλητών και στη συνέχεια οι υπόλοιπες εντολές.

2. Η εντολή program συνοδεύεται πάντα από ένα συµβολικό όνοµα (βλ. §1.1)

3. Η εντολή stop τερµατίζει την εκτέλεση του προγράµµατος σε όποιο σηµείο υπάρχει.

Η χρήση του stop πριν το end είναι προαιρετική, µια και η εκτέλεση του πρόγραµµατος θα σταµατήσει ούτως ή άλλως µόλις συναντήσει την εντολή end. Όµως στο παράδειγµα που ακολουθεί

program name δήλωση µεταβλητών

εντολή1 εντολή2 stop εντολή3 stop end το πρόγραµµα θα σταµατήσει στο πρώτο stop που θα συναντήσει, δηλ. ακριβώς πριν από την εντολή3.

1.1.2 Κανόνας των στηλών Ο κώδικας στη FORTRAN πρέπει να γράφεται µε ένα συκγεκριµένο τρόπο στο αρχείο που θα τον αποθηκεύσουµε. Πιο συγκεκριµένα:

1. Οι εντολές γράφονται µεταξύ των στηλών 7 – 72 της κάθε γραµµής. 2. Αν υπάρχει ο χαρακτήρας c (ή το *) στη στήλη 1, τότε ότι κι αν γράψουµε στη

γραµµή αυτή είναι σχόλιο και δε λαµβάνεται υπ’όψιν απο τον υπολογιστή

Page 6: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

5

3. Αν στην στήλη 6 υπάρχει οποιοδήποτε σύµβολο (συνηθίζεται το &), τότε η γραµµή αυτή θεωρείται συνέχεια της προηγούµενης. Αυτό συνήθως το χρησιµοποιουµε όταν η εντόλη που γραφουµε σε µία γραµµη υπερβαίνει τη στήλη 72.

4. Στις στήλες 2-5 µπαίνουν (αν είναι αναγκαίο) αριθµητικές (ακέραιες) ετικέτες.

1.1.3 Ενα απλό παράδειγµα 123456789.................................................................................................. program circle c Το πρόγραµµα αυτό διαβάζει από το πληκτρολόγιο την ακτίνα ενός κύκλου c και υπολογίζει την περίµετρο και το εµβαδόν του c c ΜΕΤΑΒΛΗΤΕΣ c r (input) ακτίνα του κύκλου c perimetros (output) περίµετρος του κύκλου c emvadon (output) εµδαδόν του κύκλου real r, perimetros, emvadon print*,’∆ώστε την ακτίνα του κύκλου’ read*, r perimetros = 2.*3.14*r emvadon = 3.14*r**2 print*,’Η περίµετρος του κύκλου είναι:’, perimetros print*,’Το εµβαδόν του κύκλου είναι:’, emvadon stop end

1.2 ΑΛΓΕΒΡΙΚΕΣ ΠΡΑΞΕΙΣ Οι αριθµητικοί τελεστές ειναι οι: + (πρόσθεση) - (αφαίρεση) * (πολλαπλασιασµός) / (διαίρεση) ** (ύψωση σε δύναµη)

Page 7: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

6

Για παράδειγµα η παρακάτω µαθηµατική έκφραση:

( ) 2dc

babac ++

++

στην FORTRAN 77 γράφεται ως c*(a+b) + (a+b)/c + d**2 ΠΑΡΑΤΗΡΗΣΗ: Οι αλγεβρικές πράξεις εκτελούνται µε την εξής σειρά προτεραιότητας:

1. ύψωση σε δύναµη 2. πολλαπλασιασµός ή διαίρεση 3. πρόσθεση ή αφαίρεση

Παραδείγµατα: 2*3+20 = 6+20 = 26 2+100/20 = 2+5 = 7 5+6*3**2 = 5+6*9 = 5+54 = 59 Πρώτες εκτελούνται οι πράξεις µέσα στις παρενθέσεις µε τη σειρά που αναφέραµε προηγουµένως. Για παράδειγµα: (2*3**2 +1)*2-6 = (2*9+1)*2-6 = (18+1)*2-6 = 19*2-6 = 38-6 = 32

1.3 ΜΕΤΑΒΛΗΤΕΣ (ΜΕΡΟΣ A) H FORTRAN 77 κάνει αυστηρό διαχωρισµό µεταξύ των πραγµατικών αριθµών (αριθµών µε δεκαδικό ψηφίο) και των ακεραίων αριθµών ( αριθµών χωρίς δεκαδικό ψηφιο). Για παρά-δειγµα, οι αριθµοί: 23 -100 2341 10000000001 είναι ακέραιοι, ενώ οι 23. 1.0000 .00231 -192. 134.2345 είναι πραγµατικοί. Μπορεί οι αριθµοί 23 και 23. να είναι ακριβώς η ίδια τιµή, ωστόσο στη FORTRAN 77 αντιµετωπίζονται τελείως διαφορετικά, γιατί αποθηκεύονται µε διαφορετικό τρόπο στη µνήµη του υπολογιστή.

1.3.1 Τύποι µεταβλητών Οι τύποι µεταβλητών που υποστηρίζει η FORTRAN 77 είναι:

Page 8: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

7

• integer (ακέραιοι) • real (πραγµατικοί, ακρίβεια µέχρι 8ο δεκαδικό ψηφίο)

• double precision (πραγµατικοί, ακρίβεια µέχρι 16ο δεκαδικό ψηφίο) • complex (µιγαδικοί) • character (χαρακτήρες) • logical (λογικές, µόνο δύο τιµές true και false)

1.3.2 ∆ήλωση µεταβλητών • Ρητή δήλωση

type λίστα µεταβλητών π.χ: integer a1, sum, count real energy, sum, r

• Aυτονόητη (implicit) δήλωση

Σε περίπτωση πoυ δεν ορίσουµε ρητά τον τύπο των µεταβλητών η FORTRAN 77 έχει την δυνατότητα να ταξινοµίσει τις µεταβλητές αυτόµατα. Πιο συγκεκριµένα, όσες µεταβλητές αρχίζουν από i, j, k, l, m ,n είναι ακέραιοι (πχ isum, jcount), ενώ όσες αρχίζουν απο τα υπόλοιπα γράµµατα του αγγλικού αλφάβητου, δηλ. a-h and o-z, είναι πραγµατικοί (π.χ sum, x, func)

1.3.3 Εκχώρηση τιµής στις µεταβλητές Μια µεταβλητή µπορεί να πάρει κάποια συκγεκριµένη τιµή ως

Μεταβλητή = αριθµητική παράσταση

Για παράδειγµα: a=0.5*10.**2 ή energy = 0.5*m*v**2,

όπου οι µεταβλητές m και v έχουν ήδη κάποια συγκεκριµένη τιµή. Επίσης µπορούµε να δώσουµε τιµή σε µια µεταβλητή µε την εντολή read (βλ. επόµενη παράγραφο).

1.4 ΕΤΟΛΕΣ read ΚΑΙ print

1.4.1 Εντολή read Σύνταξη: read*, λίστα µεταβλητών

Page 9: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

8

Με την εντολή αυτή ο υπολογιστής περιµένει να του δώσουµε από το πληκτρολόγιο µία λίστα µεταβλητων. Παράδειγµα: read*,a1, r, energy ΠΑΡΑΤΗΡΗΣΗ: Υπάρχουν δυο τρόποι να εισάγουµε τις µεταβλητές από το πληκτρολόγιο: 1 ∆ίνουµε διαδοχικά όλες τις µεταβλητές χωρισµένες µε κόµµα (,) και στο τέλος παταµε

enter. 2 Πατάµε enter σε κάθε µεταβλητή που πληκτρολογούµε.

1.4.2 Εντολή print Σύνταξη: print*, σχόλια και/ή λίστα µεταβλητών Με την εντολή αυτή ο υπολογιστής θα τυπώσει στην οθόνη τα σχόλια και/ή τη λίστα των µεταβλητών. Παράδειγµα: print*,’Το εµβαδόν του κύκλου είναι’, emvadon ΠΑΡΑΤΗΡΗΣΕΙΣ 1 Τα σχόλια µπαίνουν πάντα µέσα σε µονά εισαγωγικά: ’ ....σχόλιο...’ 2 Τα σχόλια και οι µεταβλητές χωρίζονται πάντα µε κόµµα.

2.4 ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ Συνοπτικά η διαδικασία που ακολουθείται για την εκτέλεση ενός προγράµµατος, είναι:

1. Αποθηκεύουµε τον κώδικα FORTRAN σε ένα αρχείο που έχει κατάληξη .f (π.χ pogram1.f)

2. Μεταφράζουµε (compile) τον κώδικα στη γλώσσα µήχανής π.χ g77 program1.f –o program1.exe

3. Το –ο program1.exe δηµιουργεί το εκτελέσιµο αρχείο µε όνοµα program1.exe 4. (Σε περίπτωση που δε δώσουµε το «–ο program1.exe», τότε ο µεταφραστής

(compiler) θα ονοµάζει πάντα το εκτελέσιµο αρχειο ως a.out) 5. «Τρέχουµε» το εκτέλεσιµο αρχείο program1.exe

ΠΑΡΑΤΗΡΗΣΗ:Η κατάληξη .exe στο εκτελέσιµο αρχείο είναι προαιρετική. Απλά συνηθί-ζεται για να υποδεικνύει ότι το αρχείο αυτό είναι εκτελέσιµο (executable).

Page 10: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

9

∆ΙΑΛΕΞΗ 2

2.1 ΜΕΤΑΒΛΗΤΕΣ (ΜΕΡΟΣ Β) Στην προηγούµενη διάλεξη µάθαµε ότι µπορούµε να χρησιµοποιούµε τη ρητή ή την αυτονόητη δήλωση µεταβλητών (βλ. § 1.3). Σε περίπτωση που δεν έχουµε ορίσει ρητά µία µεταβλητή, τότε η FORTRAN θα χρησιµοποιήσει αυτόµατα την αυτονόητη (implicit) δήλωση των µεταβλητών. Όµως η τακτική αυτή εγκυµωνεί πολλούς κινδύνους. Τι θα γινόταν αν κατά λάθος πληκτρολογούσουµε µία µεταβλητή που δεν υπάρχει στο πρόγραµµα µας; Σ’ αυτή την περίπτωση ο µεταφραστής (compiler) θα έδινε µία τυχαία τιµή στη µεταβλητή (συνήθως το µήδεν) και προφανώς η χρήση της σε µία αριθµητική παράσταση θα µας οδηγούσε σε λάθος αποτελέσµατα. Ένας τρόπος να αποφύγουµε τέτοια επιπόλαια λάθη είναι η χρήση της εντολής: implicit none Η εντολή αυτή µπαίνει ακριβώς µετά το program και µας αναγκαζει να δηλώνουµε όλες τις µεταβλητές που χρησιµοποιούµε (implicit none = καµια αυτονόητη δήλωση). Αν κατά λάθος πληκτρολογήσουµε µία ανύπαρκτη µεταβλητή ο compiler θα µας το υποδείξει ως λάθος και έτσι θα έχουµε την ευκαιρία να το διορθώσουµε. Στο εξής σε όλα τα παραδείγµατα που θα παρουσιάζουµε θα χρησιµοποιούµε αυτή την εντολή.

2.2 ΕΝΤΟΛΗ parameter Σε περίπτωση που στο πρόγραµµα µας θέλουµε να ορίσουµε µία σταθερά, τότε αυτό µπορούµε να το κάνουµε µε την εντολή parameter Σύνταξη: parameter ( µεταβλητή = τιµή ) ΠΑΡΑΤΗΡΗΣΗ: Η εντολή parameter µπαίνει µετά τη δήλωση του τύπου των σταθερών. Η τιµή που θα πάρουν οι σταθερές δεν µπορεί να αλλάξει κατά την εκτέλεση του προγράµµατος. π.χ real pi, f, npi integer N parameter (pi=3.141592, N=100, f=3.2, npi=3.*pi)

2.3 ΕΣΩΤΕΡΙΚΕΣ ΣΥΝΑΡΤΗΣΕΙΣ (intrinsic functions) Εκτός απο τις βασικές αριθµητικές πράξεις (+ - * / ) η FORTRAN 77 µας δίνει τη δυνατότητα να υπολογίσουµε και τις τιµές γνωστών µαθηµατικών συναρτήσεων. Οι

Page 11: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

10

συναρτήσεις αυτές ονοµάζονται εσωτερικές συναρτήσεις (intrinsic functions) και µπορούν να χρησιµοποιηθούν από κάθε πρόγραµµα γράφοντας απλά το όνοµα της συνάρτησης και δίνοντας όλα τα ορίσµατα που χρειάζονται: Όνοµα συνάρτησης (λίστα ορισµάτων) Μερικές απο τις πιο χρησιµές µαθηµατικές συναρτήσεις ειναι οι: Συνάρτηση Ονοµα στη F77 Τετραγώνική ρίζα sqrt(x) Απόλυτη τιµη: |χ| abs(x) Εκθετικό: ex exp(x) Φυσικός λογαριθµος: ln(x) log(x) Ηµίτονο: ηµ(x) sin(x) Συνηµίτονο: συν(x) cos(x) Εφαπτοµένη: εφ(x) tan(x) Συνεφαπτοµένη: σφ(x) cotan(x) ΠΑΡΑΤΗΡΗΣΗ: Στις παραπάνω µαθηµατικές συναρτήσεις (εκτός την απόλυτη τιµή abs) τα ορίσµατα και το αποτέλεσµα της συνάρτησης είναι ΠΑΝΤΑ πραγµατικοί αριθµοί. Για τη συνάρτηση abs το όρισµα µπορεί να είναι ή πραγµατικός ή ακέραιος και το αποτελεσµα είναι του ίδιου τύπου µε το όρισµα. Άλλες χρήσιµες εσωτερικές συναρτήσεις είναι: Συνάρτηση Ονοµα στη F77 Τύπος

ορισµατος Τύπος αποτέλεσµατος

Μετατροπή σε ακέραιο int(x) Real integer (αποκοπή δεκαδ. ψηφ.)

Μετατροπή σε πραγµατικό real(x) Integer real Μέγιστο ορισµάτων max(x1,x2,…) ή ολα integer ή

όλα real Το ιδιο µε τα x1,x2,…

Ελάχιστο των ορισµάτων min(x1,x2,…) ’’ ’’ ΠΑΡΑ∆ΕΙΓΜΑ 1 Γράψτε ένα πρόγραµµα που θα υπολογίζει το µέγιστο και το ελάχιστο 5 πραγµατικών αριθµών.

123456789........................... program maxmin c Το πρόγραµµα αυτό υπολογίζει το µέγιστο και το ελάχιστο 5 πραγµατικών

Page 12: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

11

c αριθµών a1,a2,a3,a4,a5 (inputs) c maximum (output): µέγιστο c minimum (output): ελάχιστο implicit none real a1,a2,a3,a4,a5, maximum, minimum print*,’∆ώστε 5 πραγµατικούς αριθµούς’ read*, a1, a2, a3, a4, a5 maximum = max(a1,a2,a3,a4,a5) minimum = min(a1,a2,a3,a4,a5) print*,’Ο µέγιστος αριθµός είναι:’,maximum print*,’Ο ελάχιστος αριθµός είναι:’,minimum stop end ΠΑΡΑ∆ΕΙΓΜΑ 2 Γράψτε ένα πρόγραµµα που να υπολογίζει την τιµή της συνάρτησης:

||)]sin()[sin()( 2 xxxexf x +++= 123456789........................... program paradeigma implicit none real x, fx print*,’∆ώστε ένα πράγµατικό αριθµό’ read*, x fx= exp(x) + ( cos(x) + sin(x) )**2 + abs(x) print*,’Η τιµή της συνάρτησης είναι:’, fx stop end Αν υποθέσουµε τώρα οτι θέλαµε να γράψουµε ένα πρόγραµµα που να υπολόγιζε την αριθµητική παράσταση Α=f(x1)+f(x2)+f(x3),

θα έπρεπε να τροποποιήσουµε το παραπάνω πρόγραµµα ως εξής:

Page 13: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

12

123456789........................... program paradeigma2 implicit none real x1, x2, x3, Α print*,’∆ώστε 3 πράγµατικoύς αριθµούς’ read*, x1, x2, x3 Α= exp(x1) + ( cos(x1) + sin(x1) )**2 + abs(x1) & + exp(x2) + ( cos(x2) + sin(x2) )**2 + abs(x2) & + exp(x3) + ( cos(x3) + sin(x3) )**2 + abs(x3) print*,’Η τιµή της αριθµητικής παράστασης είναι:’, Α stop end Ο κώδικας έγινε πιο πολύπλοκος. Σίγουρα τα πράγµατα θα ήταν πολύ καλύτερα αν η f(x) ήταν εσωτερική συνάρτηση. Στην περίπτωση αυτή ο κώδικας θα ήταν πιο απλός µια και το µόνο που θα έπρεπε να τροποποιήσουµε στο παραπάνω πρόγραµµα θα ήταν το: fx = f(x1)+f(x2)+f(x3) Μπορεί η FORTRAN να µην έχει την f(x) ως εσωτερική συνάρτηση αλλά µας δίνει τη δυνατότητα να τη δηµιουργήσουµε! Οι συναρτήσεις που δηµιουργεί ο προγραµµατιστης ονοµάζονται εξωτερικές συναρτήσεις (external functions). Στην επόµενη παράγραφο θα µάθουµε τον τρόπο µε τον οποίο δηµιουργούµε και χρησιµοποιούµε τις εξωτερικές συναρτήσεις.

2.4 ΕΞΩΤΕΡΙΚΕΣ ΣΥΝΑΡΤΗΣΕΙΣ (external function) Μία εξωτερική συνάρτηση ορίζεται ως εξης: δήλωση function όνοµα (λίστα ορισµάτων) δήλωση λίστας ορισµάτων δήλωση µεταβλητών (αν χρειάζονται) όνοµα = αριθµητική παράσταση return end

Page 14: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

13

Για παράδειγµα η συνάρτηση f(x) της προηγούµενης παραγράφου ορίζεται ως: 123456789................................... real function f(x) implicit none real x f = exp(x) + ( cos(x) + sin(x) )**2 + abs(x) return end ΠΑΡΑΤΗΡΗΣΕΙΣ

1. Ο ορισµός των εξωτερικών συναρτήσεων πρέπει να γίνεται στο ίδιο αρχείο που υπάρχει και το κυρίως πρόγραµµα. Αν η συνάρτηση υπάρχει σε άλλο αρχείο, τότε πρέπει να το προσθέσουµε και αυτό στη διαδικασία της µετάφρασης. Για παράδειγµα, αν το κυρίως πρόγραµµα υπάρχει στο αρχείο prog.f και η συνάρτηση στο func.f, τότε η µετάφραση γίνεται ως εξής:

g77 prog.f func.f –o prog.exe ΠΡΟΣΟΧΗ: Σε όλα τα αρχεία που συµπεριλαµβάνουµε στη µετάφραση πρέπει να υπάρχει µόνο ένα κυρίως πρόγραµµα.

2. Μία συνάρτηση που έχουµε ήδη ορίσει πέρα απο το κυρίως πρόγραµµα, µπορεί να την χρησιµοποιεί και οποιαδήποτε άλλη συνάρτηση που σκοπεύουµε να ορίσουµε.

3. Το όνοµα της συνάρτησης εµφανίζεται το ίδιο ακριβώς και στο αρίστερο µέλος της

ισότητας πριν το return.

4. Η συνάρτηση πρέπει να δηλώνεται και στο κυρίως πρόγραµµα. ΠΑΡΑ∆ΕΙΓΜΑ Γράψτε ένα πρόγραµµα που θα υπολογίζει την τιµή της συνάρτησης:

)|(|),( yxeyxg +−= .

123456789........................... program paradeigma

Page 15: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

14

implicit none real x, y, g print*,’∆ώστε 2 πράγµατικoύς αριθµούς’ read*, x, y print*, ’Η τιµή της συνάρτησης είναι:’, g(x,y) stop end c Ορισµός της συνάρτησης real function g(x, y) implicit none real x, y g = exp(- ( abs(x) + y ) ) return end

2.5 ΕΝΤΟΛΗ ΕΛΕΓΧΟΥ IF Μερικές φορές στα προγράµµατα µας χρειάζεται να επιλέξουµε µία συγκεκριµένη κατεύθυνση αντί για κάποια άλλη. Αυτό µπορεί να γίνει µε τη χρήση της εντολής if. H γενική σύνταξη του if έχει ως εξής: if (συνθήκη) then εντολές 1 endif Σηµασία: Αν ισχύει η συγκεκριµένη συνθήκη που εχουµε µέσα στην παρένθεση, τότε ο υπολογιστής θα εκτελεσει τις εντολές 1. Το if κλεινει πάντα µε το endif. Σε περίπτωση που έχουµε µόνο µία εντολή να εκτελέσουµε, τότε το if µπορεί να γραφτεί και ως: If (συνθήκη) εντολή Σε περίπτωση που εχουµε περισσότερες από µία συνθήκες να ελεγξουµε τότε η σύνταξη του if έχει ως εξης: if (1η συνθήκη) then Εντολές 1

Page 16: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

15

else if (2η συνθήκη) then Εντολές 2 else if … ... else Εντολές end if Σηµασία: Αν ισχύει η πρώτη συνθήκη, τότε ο υπολογιστής θα εκτελέσει τις εντολές 1, αλλιώς αν (elseif) ισχύει η δεύτερη, τότε τις εντολές 2 κοκ. Σε περίπτωση που δεν ισχύει καµία απο τις προηγούµενες συνθήκες µπορούµε, αν είναι αναγκαίο, να χρησιµοποιήσουµε µόνο το else. Τέλος, και σε αυτή την περίπτωση το if κλείνει µε το endif.

ΤΕΛΕΣΤΕΣ ΣΧΕΣΕΙΣ = (ίσο µε): .eq. (equal to) ≠ (διαφορετικό από): .ne. ( not equal to) > (µεγαλύτερο από) .gt. (gteater than) ≥ (µεγαλύτερο από ή ίσο από) .ge. (greater than or equal to) < (µικρότερο από) .lt. (less than) ≤ (µικρότερο από ή ίσο από) .le. (less than or equal to) Επίσης, µπορούµε να συνδέσουµε συνθήκες µεταξύ τους µε τους λογικούς τελεστές και . and. ή .or. ΠΑΡΑΤΗΡΗΣΗ: Η σειρά προτεραιότητας των εντολών στη συνθήκη είναι: Πρώτα οι αριθµητικές πράξεις, στη συνέχεια οι τελεστές σχέσεις και τέλος οι λογικοί τελεστές .and. και .or. ΠΑΡΑ∆ΕΙΓΜΑ Γράψτε την συνάρτηση

⎩⎨⎧

≥−<+<≤+

=1 ή 1 αν ),sin()tan(

1 1- αν |,|)cos()(

xxxxxxx

xf

real function f(x) implicit none real x if( (x.ge.-1.) .and. (x.lt.1.) ) then f=cos(x)+abs(x) else f= tan(x)+sin(x)

Page 17: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

16

end if return end

Page 18: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

17

∆ΙΑΛΕΞΗ 3

3.1 ΜΕΤΑΒΛΗΤΕΣ & ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ (ΜΕΡΟΣ Γ) Ένα από τα πιο λεπτά σηµεία στον προγραµµατισµό είναι ο τρόπος µε τον οποίο ο υπολογιστής εκτελεί τις αριθµητικές πράξεις και αποδίδει τιµές στις µεταβλητές. Γενικά, όταν έχουµε να κάνουµε πρόσθεση, αφαίρεση ή πολλαπλασιασµό µε ακέραιους, δεν υπαρχει απολύτως κανένα πρόβληµα στους υπολογισµούς µας. Για παράδειγµα, αν έχουµε δηλώσει το x ως integer, τότε: x=2*3+10-2 =14 δηλαδή ο υπολογιστής θα κάνει σωστά τις πράξεις και θα δώσει την ακέραια τιµή 14 στο x. Αν είχαµε δηλώσει το x ως real, τότε πάλι θα γινόταν σωστά οι πράξεις και µάλιστα ο υπολογιστής θα µετέτρεπε αυτόµατα το 14 σε πραγµατικο (δήλ. x=14.). Υπαρχει όµως σοβαρό πρόβληµα όταν έχουµε να κάνουµε διαίρεση µεταξύ ακέραιων αριθµών. Αν η διάιρεση δεν γίνεται ακριβώς, τότε ο υπολογιστής αποκόπτει το δεκαδικό µέρος του αποτελεσµατος. Για παράδειγµα: real x x=5/2=2. (λάθος) ή integer x x=5/2=2 (λάθος) Γι’αυτό τον λόγο πρέπει να αποφέυγουµε διαιρέσεις µεταξύ ακέραιων αριθµών. Όσον αφορά το παραπάνω παράδειγµα και την περίπτωση που το x είναι ακέραιoς, τότε δεν υπάρχει ούτως ή άλλως λύση µια και δεν ορίζεται ακέραιος αριθµός µε δεκαδικό ψηφίο. Όµως αν το x είναι πραγµατικός, η λύση είναι πολύ απλή· µετατρέπουµε το 5 και το 2 σε πραγµατικούς αριθµούς (δηλ 5. και 2.) Σ’αυτην την περίπτωση η διαίρεση θα γίνει σωστα: real x x=5./2.=2.5 Γενικά, στις αριθµητικές πράξεις µεταξύ αριθµών διαφορετικού τύπου ισχύει ο παρακάτω κανόνας:

Page 19: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

18

Αν υπάρχει έστω και ένας πραγµατικός αριθµός στην αριθµητική παράσταση, τότε το αποτέλεσµα είναι πραγµατικός. Έτσι, αν έχουµε real x x=5./2=2.5 (ή x=5/2.=2.5 το οποίο ειναι σωστό αποτέλεσµα. Παρόλα αυτά είναι πολύ εύκολο να κάνουµε και πάλι λάθος. Για παράδειγµα ας υποθέσουµε ότι θέλουµε να υπολογίσουµε την παρακάτω αριθµητική παράσταση 5/2*4.+1. Να σηµειώσουµε σε αυτό το σηµείο ότι οι πράξεις που ανήκουν στην ίδια σειρα προτεραιότητας (βλ. §1.2) εκτελούνται από αριστερά προς τα δεξιά. Έτσι, επιστρέφοντας στο παραπάνω παράδειγµα, το αποτέλεσµα είναι:

5/2*4.+1.=2*4.+1.=8.+1.=9. κάτι που προφανώς είναι λαθός. Αν όµως γράφαµε την παραπάνω αριθµητική παράσταση µε άλλη σειρά 4.*5/2+1. = 20./2+1.=10.+1.=11. το αποτέλεσµα θα ήταν σωστό. Καταλαβαίνετε λοιπόν πόσο εύκολα µπορούµε να οδηγηθούµε σε λάθη ανάλογα µε τη σειρά που έχουµε να γράψει τις µεταβλητές στην αριθµητική παράσταση. Γι’αυτο Να αποφεύγετε τις πράξεις µεταξύ αριθµών διαφορετικού τύπου. και κάτι ακόµα ...

Υπoθέστε οτι σ’ ένα πρόγραµµα υπάρχουν οι παρακάτω εντολές i=2 i=i+1 Μαθηµατικα αυτό είναι απράδεκτο µια και τα i θα απαλειφθούν και έτσι µένει το 0=1 (λάθος). Όµως ο υπολογιστής στη συγκεκριµένη περίπτωση θα χρησιµοποιήσει στο δεξιό µέλος της ισότητας την παλιά τιµή του i (δηλαδη το 2) , θα προσθέσει σε αυτή το 1 και θα αποδώσει στο i µία νέα τιµή η οποία θα είναι αποτέλεσµα της πρόσθεσης, δηλαδή το 3 Επίσης, όταν έχουµε να κανουµε µε πολύ µεγάλους ή πολύ µικρούς αριθµούς όπως το χ=12000 ή y=0.000034 τότε µπορούµε να τους γράψουµε ως: x=1.2Ε+4 ή x=0.12E+5 κοκ

Page 20: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

19

και y=3.4E-5 ή y=34E-6 κοκ ∆ηλαδή, το είναι ισοδύναµο µε το nE ± n±10

3.2 ΕΝΤΟΛΗ ΕΠAΝΑΛΗΨΗΣ do Συχνά στα προγράµµατα χρειάζεται να εκτελέσουµε ένα συγκεκριµένο συνόλο εντολών πολλές φορές. Αντί να γράψουµε τις συγκεκριµένες εντόλες τόσες φόρες όσες τις χρειαζόµαστε µπορουµε να χρησιµοποιήσουµε την εντολή do. Η γενική σύνταξη του do έχει ως εξής: do n=ni, nf, dn εντολές Α enddo όπου n: µετρητής ni: αρχική τιµή του µετρητή nf: τελική τιµή του µετρητή dn: βήµα επανάληψης Σηµασία: Να εκτελεστούν οι εντολές Α

) )int(,0 max( dndnninf +−

φορές. Όπου max(…) και int(…) οι γνωστές εσωτερικές συναρτήσεις της FORTRAN 77 (βλ. §1.2). Αυτή η επαναληπτική διαδικασία ονοµάζεται βρόχος do ή do-loop.

Με πιο απλά λόγια, αν το 0 )int( ≤+−dn

dnninf, τότε θα γίνουν µηδέν επαναλήψεις. Σε αντίθετη

περίπτωση, αρχικά ο υπολογιστής θα δώσει στο µετρητή την τιµή ni και θα εκτελεσει τις εντολές Α µία φορα, στη συνέχεια θα δώσει στο µετρητή την τιµή ni+dn και θα τις εκτελεσει άλλη µια φορα κοκ, µέχρι να γίνουν τόσες επαναλήψεις όσες υποδεικνύει ο τύπος που γράψαµε παραπάνω. Για παράδειγµα i) do I=1,21,2 (11 επαναλήψεις) ii) do I=100,0,-2 (51 επαναλήψεις) iii) do I=10,-1,2 (0 επαναλήψεις) iv) do I=1,1,1 (1 επανάληψη)

Page 21: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

20

ΠΑΡΑ∆ΕΙΓΜΑ 1 Να τυπωθούν οι περιττοί ακέραιοι από 1 έως 15

program doloop implicit none integer i do i=1,15,2 print*,i enddo stop end

ΠΑΡΑΤΗΡΗΣΕΙΣ

1. Ο µετρητής, η αρχική τιµή του µετρητή, η τελική τιµή του µετρητή και το βήµα µπορουν να είναι ή όλα ακέραιοι ή όλα πραγµατικοί.

2. Αν παραλείψουµε το βήµα τότε ο υπολγιστής το ορίζει αυτόµατα ίσο µε τη µονάδα (βλ. επόµενο παράδειγµα)

3. Η τιµή του µετρητή σε κάθε βήµα µπορεί να χρησιµοποιηθεί και σε πράξεις. Για παραδειγµα, αν θελουµε να τυπωσουµε τους 11 πρώτους ακέραιους και το τετράγωνο τους, τότε do i=1,11 print*,i,i**2 enddo

4. Απαγορεύεται να αλλάξει η τιµή του µετρητή κατά τη διάρκεια της εκτέλεσης των εντολών που βρίσκονται µέσα στο do-loop. Για παράδειγµα, η σύνταξη

do i=1,11 Εντολές

i=i+1 εντολές

enddo είναι απαράδεκτη.

Μερικά ακόµα παραδείγµατα ... ΠΑΡΑ∆ΕΙΓΜΑ 2 Να υπολογίσετε το άθροισµα 1 +2 +3 + ...+10

Page 22: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

21

program doloop2 implicit none integer I,sum sum=0 do I=1,10 sum=sum+I enddo print*,’To άθροισµα των ακέραιων από 1 έως 10 είναι:’, sum stop end

ΠΑΡΑΤΗΡΗΣΗ: Μην ξεχνάτε ποτέ να δίνετε µία κατάλληλη αρχική τιµή της µεταβλητής που αναπαριστά το άθροισµα. Το ίδιο ισχύει και για τα γινόµενα.

ΠΑΡΑ∆ΕΙΓΜΑ 3 Να γράψετε το παραπάνω πρόγραµµα ως συνάρτηση γενικεύοντας την έτσι ώστε να υπολογίζει το άθροισµα των ακέραιων από 1 έως Ν, όπου το Ν θα είναι το όρισµα της συνάρτησης. Στη συνέχεια, γράψτε ένα κυρίως πρόγραµµα που θα του δίνετε το Ν και θα τυπώνει την τιµή της συναρτησης.

program doloop3 implicit none integer i,isum print*,’∆ώστε το Ν’ read*,N print*,’To άθροισµα των ακέραιων από 1 έως’, N, ’είναι:’, isum(N) stop end

integer function isum(N)

implicit none integer I, N isum=0 do i=1,N isum=isum+i enddo

Page 23: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

22

return end

και ένα παράδειγµα µε πραγµατικούς αριθµούς.... ΠΑΡΑ∆ΕΙΓΜΑ 4 Γράψτε µία συνάρτηση που να υπολογίζει την τιµή του πολυώνυµου Nxxxx +++++ ...1 32

Στη συνέχεια, γράψτε ένα κυρίως πρόγραµµα που θα τυπώνει το χ και την τιµή του παράπανω πολυώνυµου 5ου βαθµού (Ν=5) για x από xmin έως xmax µε βήµα dx. Τα xmin, xmax και dx θα δίνονται απο το πληκτρολόγιο. program polyonymo implicit none real x, pol, xmin, xmax, dx print*,’∆ώστε το xmin, xmax και dx’ read*, xmin, xmax, dx

do x=xmin, xmax, dx print*, x, pol(x, 5) enddo stop end real function pol(x, N) implicit none integer N,i real x pol=1. do I=1,N pol=pol+x**I enddo return end

Page 24: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

23

ΠΑΡΑ∆ΕΙΓΜΑ 5 Εσωτερικά do-loops. Να υπολογίσετε το άθροισµα

2

1 1][∑∑

= =+

N

i

M

jji

program doloop3 implicit none integer N,M,sum print*,’∆ώστε το Ν και το Μ’ read*,N,M sum=0 do i=1,N do j=1,M sum=sum+(i+j)**2 enddo

enddo print*,’To άθροισµα είναι:’, sum stop end

Γενικά µπορουµε να χρησιµοποιήσουµε όσα εσωτερικα do-loops απαιτεί το πρόβληµα που θέλουµε να λύσουµε. Μία αλλη σύνταξη του do-loop είναι

do label n=ni, nf, dn εντολές Α label continue όπου το label είναι µία ακέραια τιµή η οποία µπορεί να µπαίνει από την 2η έως την 6η στήλη και υποδεινκύει πού κλείνει το do-loop (στη πραγµατικότητα το label µπορεί να αρχίζει και από την πρωτη στηλη αλλά ας µην µπερδεύουµε τα πράγµατα, µια και µεχρι τώρα την πρώτη στήλη τη χρησιµοποιουµε για το αν θα βάλουµε ή όχι σχόλια).

Page 25: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

24

Με αυτή τη σύνταξη το παράδειγµα 5 γράφεται ως

sum=0 do 10 i=1,N do 20 j=1,M sum=sum+(i+j)

20 continue 10 continue ή ακοµα και ως:

sum=0 do 10 i=1,N do 10 j=1,M sum=sum+(i+j)

10 continue Η σύνταξη αυτή του do, όπως καταλαβάτε, είναι πιο πολυπλοκη και µπορεί πολύ εύκολα σας δηµιουργησει σύγχυση για το πού ακριβώς κλεινει το κάθε do-loop. Πολλές φορές σε ένα do-loop µας παρουσιάζεται η ανάγκη να σταµατήσουµε την επανάληψη πριν ο µετρητής πάρει τη µέγιστη επιτρεπόµενη τιµή του. Αυτό µπορεί να γίνει µε τη εντολή if σε συνδυασµο µε την εντολή goto label H τελευταία εντολή απλά υποδεικνύει στον υπολογιστή ότι πρέπει να πάει στη γραµµή που υπάρχει το συγκεκριµένο label και να εκτέλεσει την εντολη που βρίσκεται εκεί. Συνήθως η εντολή αυτή είναι το continue που σηµαίνει απλά ότι πρέπει να συνεχιστεί η εκτέλεση του προγράµµατος απο εκεί και κάτω. Ετσι περιληπτικά: do i=ni,nf,dn ….. If(λογική παράσταση) goto 10 …. enddo 10 continue

∆ηλαδη, όταν η λογική παράσταση είναι αληθής, τότε ο υπολογιστής θα ‘βγει έξω’ απο το do-loop και θα συνεχίσει την εκτέλεση των εντολών που ακολουθούν το continue. Ένας πιο

Page 26: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

25

κοµψός τρόπος να κάνουµε επαναλήψεις υπό συνθήκη είναι η χρήση της εντολής dowhile που θα αναλύσουµε στην επόµενη παράγραφο.

3.3 ΕΝΤΟΛΗ ΕΠΑΝΑΛΗΨΗΣ ΚΑΙ ΕΛΕΓΧΟΥ do while H σύνταξη του do while είναι: dowhile(λογική παρασταση) Εντολές Α Enddo Σηµασία: Εκτέλεσε τις εντολές Α τόσες φόρες όσο η λογική παράσταση είναι αληθής ΠΑΡΑ∆ΕΙΓΜΑ1: Το παράδειγµα 1 της 3.2 µπορει να γραφτεί και ως

program doloop2 implicit none integer I,sum sum=0 i=1 dowhile(i.le.10) sum=sum+i i=i+1 enddo print*,’To άθροισµα των ακέραιων από 1 έως 10 είναι:’, sum stop end

ΠΑΡΑ∆ΕΙΓΜΑ2: Να γράψετε ένα πρόγραµµα που θα τυπώνει όλους τους όρους της ακολουθίας 2, 4, 8, 16,.... που είναι µικρότεροι του 100

program name implicit none

Page 27: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

26

integer n n=2 dowhile( n.le.100) print*,n n=2*n enddo stop end

ΠΑΡΑΤΗΡΗΣΗ: Συνήθως το dowhile χρησιµοποιείται όταν δεν ξέρουµε πόσες επαναλήψεις χρειάζονται. Για παραδειγµα αν θέλαµε να λύσουµε το πρόβληµα µε do, τότε θα γράφαµε

...... ...... n=2 do i=1,10000 print*,n n=2*n if(n.gt.100) go to 10 enddo

10 continue stop

end

Αυτό που κάναµε είναι ότι βάλαµε µια πολύ µεγάλη τελική τιµή στο do-loop ελπίζοντας ότι µέχρι ο µετρητής να την πάρει αυτή την τιµή θα έχει ικανοποιηθεί η συνθήκη του προβλήµατος. Ρίχνοντας µια µατιά και στα δύο παραπάνω παραδείγµατα, είναι προφανές ότι το dowhile είναι πιο κοµψή σύνταξη από το do και µάλιστα δεν µας βάζει τον περιορισµό να κάνουµε προβλέψεις για τον αριθµό των επαναλήψεων όταν δεν τον γνωρίζουµε ακριβώς. Ένας πιο καλός τρόπος για να γράψουµε το do υπό συνθήκη είναι να µην χρησιµοποιήσουµε µετρητή:

n=2 do print*,n n=2*n if(n.gt.100) go to 10 enddo

10 continue stop

Page 28: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

27

end που σηµαίνει ότι οι εντολες που περιεχει αυτο το do-loop θα εκτελούνται µέχρι να γίνει αληθής η λογική παράσταση n.gt.100 οπότε και το πρόγραµµα θα πάει στην εντολή continoue. ∆ηλαδή µε άλλα λόγια, η εντολή do χωρις µετρητή σηµαίνει: εκτέλεσε επαναληπτικά τις εντολες που περιέχονται στο do-loop. ΠΡΟΣΟΧΗ: Σε αυτή την περίπτωση, αν δεν βάλουµε συνθήκη µέσα στο do-loop ο υπολογιστής θα εκτελεί τις εντολές επ’απειρο!!!!!!

Page 29: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

28

∆ΙΑΛΕΞΗ 4

4.1 ΜΟΝΟ∆ΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ – ∆ΙΑΝΥΣΜΑΤΑ Μέχρι στιγµής έχουµε µάθει να δηλώνουµε ακέραιες ή πραγµατικές µεταβλητές στις όποιες µπορούµε να αποδώσουµε µόνο µία τιµή. Πολλές φορές όµως για λόγους απλότητας και ευκολίας είναι χρήσιµο να δουλεύουµε µε µεταβλητές στις οποίες να µπορούµε να αποδώσουµε περισσότερες από µία τιµές. Αυτό συµβαίνει συνήθως σε προβλήµατα που πρέπει να επεξεργαστούµε παρα πολλούς αριθµούς, οι οποίοι έχουν ένα κοινό χαρακτηριστικό, όπως για παράδειγµα τις πειραµατικές µετρήσεις ενός φυσικού µεγέθους. Οι µεταβλητές που έχουν αυτή την ιδιότητα, ονοµάζονται πίνακες και σε αυτή τη διάλεξη θα µάθουµε να δηλώνουµε και να χρησιµοποιούµε τους µονοδιάστατους πίνακες (ή διανύσµατα), την απλούστερη µορφή των πινάκων. Στη FORTRAN 77 οι µονοδίαστατοι πίνακες δηλώνονται περίπου όπως και οι απλές µεταβλητές. Για παράδειγµα, µπορούµε να δηλώσουµε έναν πίνακα που θα έχει ακέραιες τιµές ώς integer A(4) ή πραγµατικές τιµές ώς real X(5) ∆ηλαδή, αρχικά δηλώνουµε τον τύπο του πίνακα (integer ή real), στη συνέχεια ακολουθεί το όνοµα του (A ή X) και µέσα σε παρενθέσεις ορίζουµε πόσες διαφορετικές τιµές θέλουµε να έχει (πλήθος στοιχείων). Έτσι, στο παραπάνω παράδειγµα, έχουµε δηλώσει έναν πίνακα A, ο οποίος έχει 4 ακέραιες τιµές και έναν πίνακα Χ µε 5 πραγµατικές τιµές. Το πρώτο ερώτηµα που προκύπτει, είναι το πώς µπορούµε να αποδώσουµε τιµές στα στοιχεία των παραπάνω διανυσµάτων. Πολύ απλά, γράφουµε Α(1)=3 Α(2)=5 Α(3)=0 Α(4)=123 ή Χ(1)=4. Χ(2)=9.123

Page 30: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

29

Χ(3)=0.01 Χ(4)=2.3 Χ(5)=35. ή και να τις δώσουµε απο το πληκτρολόγιο read*,A(1),A(2),A(3),A(4) Το δέυτερο ερώτηµα είναι πώς χρησιµοποιούµε τις τιµές που έχουµε αποδώσει στους πίνακες. Και αυτό είναι πολυ απλό ... Μπορουµε, για παράδειγµα, να τις τυπώσουµε print*,A(1),A(2),A(3),A(4) ή ακόµα να κάνουµε πράξεις µε αυτές sum=A(1)+A(2)*A(3)+A(4) και το αποτέλεσµα θα είναι: sum=3+0+123=126 Προς το παρόν, έχουµε αποσιωπήσει τα πάντα για τις ιδιότητες του ‘αριθµού’ που βρίσκεται µέσα στις παρενθέσεις του πίνακα. Ο ‘αριθµός’ αυτός ονόµάζεται δείκτης και έχει ΠΑΝΤΑ ΑΚΕΡΑΙΑ ΤΙΜΗ. Έτσι, το Α(1) είναι το στοιχείο του πίνακα µε δείκτη 1 (δηλαδή το πρώτο), το Α(2) είναι το στοιχείο του πίνακα µε δείκτη 2 (δηλαδή το δεύτερο) κοκ. Το µεγάλο πλεονέκτηµα των δεικτών είναι ότι µπορούµε να τους χειριστούµε και ως µεταβλητές. Για παράδειγµα, program vector implicit none integer A(4),i do i=1,4 read*,A(i) enddo sum=0

do i=1,4 sum=sum+A(i) enddo print*,’To άθροισµα είναι:’,sum stop end

Page 31: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

30

Στο παραπανω προγραµµα είναι φανερό πόσο χρήσιµο είναι το γεγονός ότι ο δείκτης των πινάκων µπορεί να χρησιµοποιηθεί και ως µεταβλητή. Στο πρώτο do-loop, αρχικά το i=1, οπότε το πρόγραµµα διαβάζει από το πληκτρολόγιο την τιµή του πρώτου στοιχείου του πίνακα, στη συνέχεια το i=2 και διαβάζει την τιµή του δεύτερου στοιχείου του πίνακα κοκ, µέχρι να διαβάσει και τις 4 τιµές του. Η ίδια διαδικασία ακολουθείται και στο δεύτερο do-loop, όπου υπολογίζουµε το άθροισµα των στοιχείων του πίνακα. Μπορεί το παραπάνω παράδειγµα να σας φαίνεται πολύ απλό, µια και έχουµε να επεξεργαστουµε µόνο 4 αριθµους. Τι θα κάνατε όµως αν σε ενα πείραµα είχατε 1000 µετρήσεις ενός φυσικού µεγέθους και σας ζητουσαν να υπολογίσετε τη µέση τιµή και τη µέση τυπική απόκλιση τους; Τοτε, θα έπρεπε να δηλώσετε 1000 διαφορετικές µεταβλητές, στη συνέχεια να τις διαβάσετε από το πληκτρολόγιο και µετά να κάνετε τα κατάλληλα αθροίσµατα για να βρείτε τη µέση τιµή και την τυπική τους απόκλιση. ∆ηλαδη, program experiment implicit none real x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,...... read*, x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,x11,x12,x13,x14,...... :-( ????????????!!!!!!!!!!! Όποιος (;) έχει υποµονή, ας το συνεχίσει.... Στην επόµενη παράγραφο θα δείξουµε το πόσο εύκολα λύνεται αυτό το πρόβληµα χρησιµοποιώντας τους πίνακες, αλλα προς το παρόν ας πούµε µερικά πράγµατα ακόµα για αυτούς. Στο κυρίως προγραµµα πρέπει παντα να δηλώνουµε ξεκάθαρα το πλήθος των στοιχείων του πίνακα. Αυτό µπορεί γίνει µε δύο τρόπους. Ο πρώτος είναι

real X(16)

ενώ ο δεύτερος, που είναι πιο κοµψός και πιο ευέλικτος, είναι

integer N parameter (N=16) real X(N)

Tώρα δικαιολογηµένα θα αναρωτηθείτε πόσο πιο κοµψος είναι αυτός ο τρόπος από τη στιγµή που γράψαµε δύο γραµµες παραπάνω! Τι θα κανατε όµως χρειαζόταν να ορίσετε 5 πίνακες µε 16 στοιχεία; Συµφωνα µε τον πρώτο τρόπο θα γράφατε

real A(16), B(16), C(16),D(16), Ε(16)

ενώ µε το δεύτερο

Page 32: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

31

integer N parameter (N=16)

real A(N), B(N), C(N), D(N), E(N) Αν τώρα για κάποιο λόγο θέλατε οι πίνακες να έχουν 30 στοιχεία, θα έπρεπε στον πρώτο τρόπο να αλλαξετε όλα τα 16 και να τα κάνετε 30, ενώ στον δεύτερο, θα αρκούσε να αλλαξετε το Ν=16 και να το κάνετε Ν=30. Ποιος είναι τωρα πιο κοµψός και ευέλικτος; Προφανώς ο δεύτερος, γι’ αυτό καλό θα είναι να το συνηθίζετε, ακόµα και όταν έχετε να δηλώσετε ένα µόνο πίνακα. Μία ακόµα χρήσιµη ιδιότητα των δεικτών είναι οτι µπορούν να πάρουν και την τιµή 0 ή ακόµα και αρνητικές ακέραιες τιµές. Σε αυτή την περίπτωση η δήλωση γίνεται διαφορετικά. Για παράδειγµα, γράφοντας real Y(0:10) εννοούµε ότι υπάρχει και το στοιχείο Υ(0). Έτσι, ο πίνακας τώρα εχει 11 στοιχεία Υ(0),Υ(1),....,Υ(10) Ο πίνακας integer P(-2:2) έχει 5 στοιχεία P(-2), P(-1), P(0), P(1) και P(2) Οι πίνακες επίσης µπορούν να χρησιµοποιηθούν και ως ορίσµατα σε συναρτήσεις (ή υπορουτίνες, όπως θα δούµε στην επόµενη παράγραφο). Σε αυτή την περίπτωση πρέπει όχι µονο να δώσουµε τον πίνακα ώς όρισµα, αλλά και το πόσα στοιχεία έχει. ΠΑΡΑ∆ΕΙΓΜΑ: Γράψτε µια συνάρτηση που να υπολογίζει τη µέση τιµή των στοιχείων ενός πίνακα. real function mv(N,A) implicit none integer N,i c N: το πλήθος των στοιχείων του πίνακα real A(Ν) mv=0. do I=1,N mv=mv+A(i) enddo

Page 33: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

32

mv=mv/real(N) return end Επίσης, µπορούµε να χρησιµοποιούµε αυτή τη συνάρτηση σ’ενα κυρίως πρόγραµµα ως program name implicit none integer N,I parameter(N=100) real X(N),mesh_timh do I=1,N print*,’∆ώστε την’, i,’ τιµή του πίνακα’ read*,X(i) enddo mesh_timh= mv(N,X) print*,’Η µέση τιµή των στοιχείων του πίνακα είναι’, mesh_timh stop end ΠΑΡΑΤΗΡΗΣΗ: Σε περίπτωση που δεν χρησιµοποιούµε την ρητή δήλωση των µεταβλητών τότε µπορούµε να δήλώσουµε τους πίνακες µε την εντολή dimension ως dimension X(10), M(100) και έτσι εχουµε δύο πινακες, τον Χ µε 10 πραγµατικές τιµές και τον Μ µε 100 ακέραιες τιµές (βλ. § 1.3.2).

4.2 ΥΠΟΡΟΥΤΙΝΕΣ (subroutines) Μέχρι στιγµής έχουµε µάθει µόνο ένα είδος υποπρογραµµάτων, τις εξωτερικές συναρτήσεις, οι οποίες παίρνουν µία λίστα ορισµάτων και επιστρέφουν µόνο µία τιµή. Ένα αλλο είδος υποπρογραµµάτων ονοµάζεται υπορουτίνα (subroutine) και µπορεί να πάρει µηδέν ή περισσότερα ορίσµατα, να εκτελέσει κάποιες εντολές και να επιστρέψει µηδέν ή περισσότερες τιµές. Γενικά, οι υπορουτίνες έχουν πολλές δυνατότητες, οι οποίες συνοπτικά µπορούν να ταξινοµηθούν στις παρακάτω κατηγορίες:

Page 34: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

33

Κατηγορία 1η: Μερικά απο τα ορίσµατα µπορούν να έχουν κάποια συγκεκριµένη τιµή (inputs) και µε την κατάλληλη επεξεργασία τους να αποδώσουµε τιµές στα υπόλοιπα ορίσµατα (outputs). Κατηγορία 2η: Όλα τα ορισµατα να είναι inputs και όλα να είναι επίσης outputs. Κατηγορία 3η: Να έχει µόνο inputs και κανένα ouput. Κατηγορία 4η: Να µην έχει κανένα input και κανένα output.

Yπάρχουν βέβαια και άλλες δυνατότητες, πολύ πιο πολύπλοκες που υπερβαίνουν τα πλαίσια του µαθήµατος και δε θα αναλυθούν εδώ. Αν όλα αυτα σας φαινονται ... ‘κινέζικα’, υποµονή!!! Παρακάτω θα κάνουµε µερικά παραδείγµατα και για τις τέσσερις αυτές κατηγορίες και θα ξεκαθαριστούν όλα! Προηγουµένως όµως πρέπει να πούµε πώς ορίζουµε µία υπορουτίνα.

Γενικά, η σύνταξη µιας υπορουτίνας εχει ως εξής: subroutine name (λίστα µεταβλητων) implicit none δήλωση µεταβλητων Εντολές return end Μία υπορουτίνα ξεκινάει µε την λέξη subroutine ακολουθεί το όνοµα της υπορουτίνας µε την λίστα των ορισµάτων (αν υπάρχουν). Στη συνέχεια ορίζουµε τις µεταβλητές, εκτελούµε τις εντολές που απαιτέι το πρόβληµα, και κλείνουµε µε το return και end. Ένα απλό παράδειγµα, το οποίο ανήκει στην 1η κατηγορία, είναι η παρακάτω υπορουτίνα µε όνοµα mean_value, που παίρνει δύο πραγµατικούς αριθµούς a, b (inputs) και υπολογίζει τον µέσο όρο τους mv (output). subroutine mean_value(a, b, mv) implicit none real a, b, mv mv=(a+b)/2. return

Page 35: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

34

end Μία υπορουτίνα µπορεί να τη χρησιµοποιήσει (καλέσει) το κυρίως πρόγραµµα (ή οποιαδήποτε εξωτερική συνάρτηση ή άλλη υπορουτίνα) γράφοντας την εντολή call και το όνοµα της υπορουτίνας µε τη λίστα των ορισµάτων µέσα σε παρένθεση. Για παράδειγµα, την υπορουτίνα που γράψαµε παραπάνω µπορουµε να τη χρησιµοποιήσουµε σ’ενα κυρίως πρόγραµµα ως εξης: program name implicite none real a, b, c print*,’∆ώστε δυο πραγµατικούς αριθµούς’ read*, a, b call mean_value(a, b, c) print*, ’H µέση τιµή των αριθµών είναι’, c stop end και µερικά παραδείγµατα για τις υπόλοιπες κατηγορίες... Κατηγορία 2η Γραψτε µία συναρτηση που να παίρνει δύο πραγµατικούς αριθµούς και να αντιστρέφει τις τιµες τους. ∆ηλαδή αν a=1. και b=3., τότε η υπορουτίνα πρέπει να επιστρέψει a=3. και b=1. subroutine switch(a, b) implicite none real a, b, temp temp=a a=b b=temp return end Όπως καταλάβατε, σε αυτό το παράδειγµα εχουµε δυο ορίσµατα που αρχικά είναι inputs και µετα απο τις κατάλληλες πράξεις είναι και outputs. Κατηγορία 3η Γράψτε µία υπορουτίνα που να τυπώνει το άθροισµα δύο πραγµατικών αριθµών:

Page 36: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

35

subroutine my_print(a, b) implicite none real a, b print*,a,’+’,b,’=’,a+b return end H υπορουτίνα αυτή παίρνει δύο πραγµατικούς αριθµούς ως inputs και απλά τυπώνει το άθροισµά τους. ∆εν εχει κανένα output. Κατηγορία 4η Γράψτε µία υπορουτίνα που να τυπωνει την παρακάτω γραµµή ‘----------------------------------------------’ subroutine print_line print*,’-------------------------------------------------’ return end Αυτή η υπορουτίνα δεν έχει ουτε inputs ούτε outputs. Απλά εκτελεί µία συγκεκριµένη εντολή. ΠΑΡΑΤΗΡΗΣΗ: Όταν µία υπορουτίνα δεν έχει ορίσµατα, τότε είναι περιττό να βάλουµε τις παρενθεσεις, και όταν καλούµε την υπορουτίνα γράφουµε µόνο το όνοµα της µετά το call, δηλαδή call print_line Και ένα πιο προχωρηµένο παράδειγµα.... Γράψτε µία υπορουτίνα που να υπολογίζει τη µέση τιµή x και τη µέση απόλυτη απόκλιση ∆χ των στοιχείων ενός πίνακα. Η µέση απόλυτη απόκλιση ορίζεται ως

∑=

−=∆N

iiN xx

1

1 ||χ

subroutine mvmsd(N,A,mv,msd) implicit none

Page 37: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

36

integer N real A(N),mv,msd c Μέση τιµή: mv mv=0. do i=1,N mv=mv+A(i) enddo mv=mv/real(N) c Μέση απόλυτη απόκλιση: msd msd=0. do i=1,N msd=msd+abs(A(i)-mv) enddo msd=msd/real(N) return end

Page 38: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

37

∆ΙΑΛΕΞΗ 5

5.1 ∆Ι∆ΙΑΣΤΑΤΟΙ ΠΙΝΑΚΕΣ Εκτός από τους µονοδιάστατους πίνακες ή διανυσµατα που συζητήσαµε στην παράγραφο 4.1, µπορούµε να αποθηκεύσουµε τιµές και σε διδάστατους πίνακες. Τους διδιάστατους πίνακες στη FORTRAN 77 µπορεί κανείς να τους µεταχειρίζεται για ευκολία, όπως και τους αντίστοιχους πίνακες που χρησιµοποιούµε στην αλγεβρα. Για παράδειγµα, στην άλγεβρα ο παρακάτω πινακας

⎟⎟⎟

⎜⎜⎜

⎛=

121110987654321

A

είναι 3x4 και εννοούµε ότι έχει 3 γραµµές και 4 στήλες. Επίσης µπορούµε να αναφερόµαστε συµβολικά σε καθε στοιχείο του ώς Αi,j, όπου το i είναι η γραµµή και το j η στήλη στην οποία βρίσκεται το συγκεκριµένο στοιχείο. Παραδείγµατος χάριν, το στοιχείο του πινακα που βρίσκεται στην 2η γραµµη και στην 3η στήλη συµβολίζεται Α2,3 και είναι είναι το 7. Στη FORTRAN 77 η διαδικασία που ακολουθείται για τη χρησιµοποποίηση ενός διδιάστατου πίνακα είναι αντίστοιχη µε αυτή που µάθαµε στους µονοδιάστατους. Για παράδειγµα ο παραπάνω πίνακας δηλώνεται ως εξής: Real A(4,6) ∆ηλαδή, αρχικά προηγείται η δήλωση του τύπου (real, integer κτλ) του πίνακα και στη συνέχεια δίνουµε το όνοµά του και µέσα σε παρενθέσεις ορίζουµε πόσες γραµµές και στήλες θέλουµε να έχει ο πίνακας, χωρισµένες µε κοµµα (,). Επίσης, όπως και στους µονοδιάστατους πίνακες, οι δείκτες των γραµµών και των στηλών µπορούν να πάρουν και αρνητικές τιµές, πχ ο πίνακας Real x(0:4, -1:7) είναι ένας πραγµατικός πίνακας µε 5 γραµµές (0,1,2,...,5) και 9 στήλες (-1,0,1,...,7), δηλαδή έχει 5x9=45 στοιχεία. ΠAΡΑ∆ΕΙΓΜΑ 1 Γράψτε µία υπορουτίνα που να υπολογίζει το ελάχιστο στοιχείο ενός διδιάστατου πίνακα και να προσδιορίζει και την θέση του µέσα σε αυτόν. subroutine Min2D(N,M,A,amin,imin,jmin)

Page 39: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

38

implicit none real A(N,M), Amin integer imin,jmin Amin=A(1,1) do i=1,N do j=1,M If(A(i,j).lt.Amin) then Amin=A(i,j) imin=i jmin=j endif enddo enddo return end

5.1.1 Ανάγνωση απο τό πληκτρολόγιο και εκτύπωση στην οθόνη των στοιχείων ενός διδιάστατου πινακα Για να διαβάσουµε τα στοιχεία ενος πίνακα από το πληκτρολόγιο ο πιο βολικός τρόπος είναι µε ένα διπλο do-loop: do i=1,3 do j=1,4 print*,’∆ώστε το ’, i,j,’ στοιχείο του πίνακα’ read*, A(i,j) enddo enddo Η εκτύπωση στην οθόνη των στοιχείων του πίνακα είναι λίγο πιο πολύπλοκη υπόθεση. Αν χρησιµοποιήσουµε το παραπάνω διπλό do-loop, δηλαδή do i=1,3 do j=1,4 print*, A(i,j) enddo enddo τότε ο υπολογιστής θα τυπώσει: 1 2 3

Page 40: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

39

11 12 δηλαδή ένα στοιχείο σε κάθε γραµµη. Όµως αυτό δεν µας δίνει οπτικά την δυνατότητα να ελέγξουµε άµεσα τα στοιχεία του πίνακα. Ένας εναλλακτικός τρόπος που µας δίνει αυτη τη δυνατότητα είναι το λεγόµενο έµµεσο do-loop. Πιο συγκεκριµένα, αν γράψουµε do I=1,3 C εµµεσο do-loop print*, (A(i,j), j=1,4) enddo τότε το αποτέλεσµα θα είναι το επιθηµητό, δηλαδή 1 2 3 4 5 6 7 8 9 10 11 12 που σαφώς είναι καλύτερη παρουσίαση ενός διδιάστατου πίνακα. Με άλλα λόγια, το έµµεσο do-loop µας επιτρέπει να τυπώσουµε ένα συνόλο στοιχείων ενός πίνακα στην ίδια γραµµή. Στην πραγµατικότητα, σε κάθε γραµµή µπορούµε να τυπώσουµε µόνο τόσους αριθµούς όσους επιτρέπει ο συγκεκριµένος compiler που χρησιµοποιούµε. Αν οι αριθµοί που θέλουµε να εµφανίσουµε σε κάθε γραµµη είναι περισσότεροι από αυτούς που επιτρέπει ο compiler, τότε η εκτύπωση συνεχίζεται στην επόµενη γραµµή. Για να εκτυπώσουµε όσα δεδοµένα εµείς θέλουµε σε κάθε γραµµη, τότε πρέπει να χρησιµοποιήσουµε την εντολή format που θα µάθουµε παρακάτω. Για τη σύνταξη του διπλού έµµεσου do-loop βλ. σηµειώσεις µαθήµατος και την αναφορά [1] σελ 117

5.2 ΜΕΤΑΒΛΗΤΕΣ (ΜΕΡΟΣ ∆)

5.2.1 Πραγµατικοί αριθµοί διπλής αρκίβειας (double precision) Μέχρι στιγµής έχουµε µάθει να χρησιµοποιούµε πραγµατικούς αριθµούς µε ακρίβεια έως και το 8ο δεκαδικό ψηφίο. Η FORTRAN 77 µας δίνει τη δυνατότητα να χρησιµοποιούµε και πραγµατικούς αριθµούς µε ακρίβεια 16ου δεκαδικού ψηφίου. Οι µεταβλητές αυτές ονοµάζονται διπλής ακρίβειας (double precision) και δηλώνονται ως εξής: double precision x,y ή real*8 x,y

Page 41: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

40

Όταν θέλουµε να αποδώσουµε µία τιµή σ’ ένα πραγµατικό αριθµό διπλής ακρίβειας, τότε αυτός πρέπει πάντα να έχει την κατάληξη D0. Για παράδειγµα, τον αριθµό 1.321 πρέπει να τον γράψουµε ώς: X=1.321D0 Άλλοι τρόποι να γράψουµε τον παραπάνω αριθµό είναι: X=13.21D-1 ή x= 132.1D-2 ή Χ=0.1321D+1 ή x=0.01432D+2 κοκ ∆ηλαδή, όπως καταλάβατε, το είναι ισοδύναµο µε το . nD ± n±10 ΠΡΟΣΟΧΗ: Αν δεν χρησιµοποιήσουµε την καταληξη D, τότε ο υπολογιστής θα τον αναγνωρίσει ώς πραγµατικό αριθµό απλής ακρίβειας. ∆εν συµβαίνει όµως το ίδιο και όταν δίνουµε την τιµή από το πληκτρολόγιο. Αν έχουµε δηλώσει τη µεταβλητή που θέλουµε να διαβάσουµε ως double precision, τότε ο υπολογιστής θα µετατρέψει αυτόµατα τον αριθµό που του δίνουµε, είτε αυτός είναι ακέραιος (χώρις τελεία) είτε πραγµατικός απλής ακρίβειας (µε τελεία), σε πραγµατικό διπλής ακρίβειας ακόµα και όταν δεν χρησιµοποιήσουµε την κατάληξη D. Αν κάνουµε πράξεις µεταξύ πραγµατικών αριθµών απλής και διπλής ακρίβειας, τότε το λάθος της απόκοπής ψηφίου στον πραγµατικό αριθµό απλής ακρίβειας προστίθεται στο τελικό µας αποτέλασµα. Αυτός είναι ένας ακόµα λόγος για τον οποίο πρέπει να αποφεύγουµε πραξεις µεταξύ µεταβλητών διαφορετικού τύπου. Η µετατροπή ενός real αριθµού x σε double precision γινεται µε τη συνάρτηση

Dble(x)

5.2.2 Μιγαδικοί αριθµοι (complex) Ένας µιγαδικός αριθµός w στα µαθηµατικά γραφεται ώς w=a+ib, όπου το a ονοµάζεται πραγµατικό µέρος και το b φανταστικό µέρος του µιγάδικού αριθµού. Στη FORTRAN 77 η δήλωση των µιγαδικών αριθµών γίνεται ως εξής: Complex w ή Complex*8 w Στην πρώτη περίπτωση έχουµε δηλώσει ένα µιγαδικό αριθµό w, όπου το πραγµατικό και το φανταστικό µέρος είναι απλής ακρίβειας, ενώ στη δεύτερη διπλής ακρίβειας.

Page 42: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

41

Αν, για παράδειγµα, θέλουµε να δώσουµε στον υπολογιστή το µιγαδικό αριθµό 2.1+3i γράφουµε το εξής: Complex w W=(2.1,3) Ο πρώτος αριθµός µέσα στις παρενθέσεις αντιστοιχεί στο πραγµατικό µέρος, ενώ ο δεύτερος στο φανταστικό. Με τον ίδιο τρόπο θα τυπωθεί και ένας µιγαδικός αριθµός µε την εντόλή print. Αν θέλουµε να αποµονώσουµε το πραγµατικό µέρος του µιγαδικού αριθµού w, γράφουµε Real(w) ενώ για το φανταστικό Imag(w) Το µέτρο ενός µιγαδικού αριθµού w δίνεται απο τη συνάρτηση Abs(w) Στη FORTRAN 77 µπορουµε να κάνουµε και πράξεις µεταξύ µιγαδικών αριθµών χωρίς κανένα πρόβληµα.

5.3 ∆ΙΑΧΕΙΡΙΣΗ ΑΡΧΕΙΩΝ Πολλες φορές µας παρουσιάζεται το πρόβληµα να πρέπει να διαβάσουµε από το πληκτρολόγιο ή να εµφανίσουµε στην οθόνη πάρα πολλά δεδοµένα. Σ’ αυτή την περίπτωση είναι πολύ πιο βολικό να χρησιµοποιούµε τη δυνατότητα που µας παρέχει η FORTRAN 77 να διαβάζουµε ή να αποθηκεύουµε δεδοµένα σ’ενα αρχείο. Παρακάτω παρουσιάζουµε συνοπτικά τη διαδικασία που ακολουθείται για τη χρήση αρχείων σ’ενα προγραµµα.

5.3.1 Open Η εντολή open µας δίνει την δυνατότητα να ‘ανοίξουµε’ τα αρχεία. Ουσιαστικά υποδεικνύουµε στον υπολογιστή από ποιο αρχείο θα διαβάζει ή θα αποθηκεύσει τα δεδοµένα. Η πιο απλή συνταξη του open είναι: open (αριθµός, file = ’όνοµα αρχείου’) . Στη θέση του αριθµού βάζουµε πάντα ενα θετικό ακέραιο, ο οποίος αντιστοιχει στο αρχείο που θέλουµε να ανοίξουµε, ενώ στο όνοµα αρχείου βάζουµε το όνοµα του αρχείου πάντα

Page 43: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

42

µέσα σε µονά εισαγωγικά. Ο ακέραιος αυτός χρησιµοποιείται απο τον υπολογιστή για να αναφέρεται στο συγκεκριµένο αρχείο στις εντολες write και read, όπως θα δούµε παρακάτω. Μερικα παραδειγµατα για την εντολή open: Open (1,file=’data.in’) Open (33,file=’outputs’) Σε κάθε πρόγραµµα FORTRAN µπορούµε να ανοίξουµε αρκετά αρχεία, αλλά κάθε ένα απο αυτά πρέπει να έχει ένα διαφορετικό αριθµό. Αν το αρχείο δεν υπαρχεί, τότε η υπολογιστής θα το δηµιουργήσει, ενώ αν υπάρχει θα το διαγράψει και θα δηµιουργήσει ένα αλλο µε το ίδιο όνοµα. Γι’αυτό πρέπει να είστε προσεκτικοί ώστε να µη δίνετε ονόµατα αρχείων που σας είναι χρήσιµα.

5.3.2 Close Η εντολή close χρησιµποιείται για να ‘κλείσουµε’ τα αρχεία που έχουµε ήδη ανοίξει, δίνοντας απλά τον αριθµό του αρχείου µέσα σε παρένθεση. Για παράδειγµα Close (1) Close (33) Αν κλείσουµε ένα αρχείο, τότε µπορούµε να χρησιµοποιήσουµε τον ίδιο αριθµό για ένα άλλο αρχείο που σκοπέυουµε να ανοιξουµε στη συνέχεια του πρόγραµµατος. Να σηµειώσουµε ότι δεν είναι απαραίτητο να κλείνετε τα αρχεία. Όλα τα αρχεία τα κλείνει αυτόµατα ο υπολογιστής όταν τελειώσει το προγραµµα. Παρόλα αυτά ειναι καλύτερο να τα κλείνετε, όταν δεν τα χρειάζεστε πια, ιδιαίτερα σε περιπτώσεις όπου χρησιµποποιέιτε πόλλα αρχεία και υπάρχει µεγάλος κίνδυνος να µπερδέψετε τους αριθµούς τους.

5.3.3 Write Ένα άλλος τρόπος να τυπώσουµε τα δεδοµένα στην όθόνη, είναι µε την εντόλη write: Για παράδειγµα, το Write(*,*) ’Το εµβαδόν του κύκλου είναι’,emvadon είναι ισοδύναµο µε το Print*,’Το εµβαδόν του κύκλου είναι’,emvadon To δεύτερο αστεράκι * στην σύνταξη του write είναι ισοδύναµο µε το * του print και αναφέρεται στο ότι ο υπολογιστής θα χρησιµοποιήσει ένα δικό τρόπο παρουσίασης των αποτελεσµατων. Αργότερα θα µάθουµε πως µπορούµε να υποδεικνύουµε εµείς στον

Page 44: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

43

υπολογιστή τον τρόπο µε τον οποίο να παρουσιάσει (ή και να διαβάσει) τα δεδοµένα του προγράµµατος (βλ. εντολή format). Tο πρώτο αστεράκι στο write σηµαίνει οτι ο υπολογιστής θα τυπώσει τα δεδοµένα στην οθόνη. Αν αντικαταστήσουµε το αστεράκι µε τον αριθµό ενός αρχείου που έχουµε ανοίξει, τότε τα αποτελέσµατα θα καταγραφούν στο συγκεκριµένο αρχείο. Για παράδειγµα, αν γράψουµε Open (1,file=’data.out’) Write (1,*) ’Το εµβαδόν του κύκλου είναι’,emvadon Close (1) τότε το αποτέλεσµα θα τυπωθεί στο αρχείο data.out

5.3.4 Read H εντολή read(*,*) είναι ισοδύναµη µε την read*,. Όπως και στην εντολή write(*,*), έτσι και εδώ το δεύτερο αστεράκι αναφέρεται στο format που θα χρησιµποιήσουµε για να διαβάσουµε τα δεδοµένα, ενώ το πρώτο * υποδεικνύει ότι τα δεδοµένα θα δοθούν από το πληκτρολόγιο. Αν αντικαταστήσουµε το πρώτο * µε τον αριθµό ενος αρχειου, τότε ο υπολογιστής θα διαβάσει τα δεδόµένα απο το συγκεκριµένο αρχείο. ΠΑΡΑ∆ΕΙΓΜΑ 1 Υποθέστε ότι έχουµε δηµιουργήσει το αρχείο dadta.in και το οποίο περιέχει τους παρακάτω αριθµούς 11.0 3. 4. 0.1 8. 14. Αν θέλουµε να διαβάσουµε αυτούς τους αριθµούς και να δώσουµε τις τιµές του σε έξι διαφορετικές µεταβλητές, πρέπει να γράψουµε: Real a,b,c,d,e,f Open(1,file=’data.in’) Read(1,*) a,b,c Read(1,*) c, d, f και τότε οι µεταβλητές µας θα έχουν τις εξής τιµές: a=11.0 b= 3. c= 4. d= 0.1 e =8. f=14. ∆ηλαδή, όπως καταλάβατε, κάθε φορά που χρησιµοποιούµε την εντολή read, ο υπολογιστής διαβάζει δεδοµένα από µία γραµµή µόνο. Αν γράφαµε Read(1,*) a,b Read(1,*) d, f

Page 45: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

44

τότε οι τιµές των µεταβλητών θα ήταν: a=11.0 b= 3. d= 0.1 f=8. ενώ οι c και e δεν θα είχαν τιµές (ο υπολογιστής θα αγνοούσε τον τρίτο αριθµό της κάθε γραµµής) ΠΑΡΑ∆ΕΙΓΜΑ 2 Έστω ότι έχετε ενα αρχείο µέ όνοµα input και το οποίο περιέχει 30 αριθµούς (ένα σε κάθε γραµµη). Για να διαβάσετε τους αριθµούς αυτούς και να αποδώσετε τις τιµές τους σ’ενα µονοδιάστατο πίνακα πρέπει να γράψετε: Real A(30) Open (1,file=’inputs’) Do I=1,30 Read(1,*) A(i) Enddo Close(1) ΠΑΡΑ∆ΕΙΓΜΑ 3 Ας υποθέσουµε ότι στο παραπάνω παράδειγµα δεν γνωρίζαµε το πλήθος το γράµµων. Μία διαφορέτική συνταξη του read µας δίνει τη δυνατότητα να διαβάζουµε δεδοµένα από ενα αρχείο µέχρι ο υπολογιστής να φτάσει στο τέλος του.

Real A(1000) Integer I,Ν

Open(1,file=’inputs’)

Ν=0 Do Read(1,*,END=10) A(i) Ν=Ν+1 Enddo

10 continue Στο παραπάνω πρόγραµµα ο υπολογιστής θα διαβάζει ένα αριθµό από κάθε γραµµή και µόλις συναντήσει το τέλος του αρχείου θα πάει στη εντολή continue. Ο µετρητής Ν τελικά µας δίνει το πλήθος των γραµµών του αρχείου. ΠΑΡΑ∆ΕΙΓΜΑ 2 Έστω ότι έχετε ένα αρχείο που περιέχει 15 αριθµούς τοποθετηµένους σε 3 γραµµές και 5 στήλες. Ένας τρόπος να διαβάσετε τους αριθµούς αυτούς και να απόδώσετε τις τιµές τους σ’ενα διδιάστατο πίνακα είναι µε τη χρήση έµµεσου do-loop Real A(3,5) Integer i,j Open (8,file=’D2.in’)

Do I=1,3

Page 46: Εισαγωγή στην Fortran77 - Νίκος Βουλγαράκης

ΝΝΙΙΚΚΟΟΣΣ ΒΒΟΟΥΥΛΛΓΓΑΑΡΡΑΑΚΚΗΗΣΣ ΤΤΜΜΗΗΜΜΑΑ ΦΦΥΥΣΣΙΙΚΚΗΗΣΣ,, ΠΠΑΑΝΝ//ΜΜΙΙΟΟ ΚΚΡΡΗΗΤΤΗΗΣΣ

45

Read(8,*) (A(i,j),j=1,5) Enddo Close (8) ΕΝΤΟΛΕΣ character, format, data, common, και intrinsic, external functions Για τις παραπάνω σντολές µελετήστε τις σηµειώσεις του µαθήµατος και τις παρακάτω αναφορές

• character [1] σελ. 110 [2] σελ. 242 [3] σελ. 290, 316

• format [2] σελ. 83 [3] σελ. 183

• data [1] σελ. 131 [2] σελ.117 [3] σελ. 53, 124

• common

[1] σελ. 94 [2] σελ. 175 [3] σελ. 385

• intrinsic, external functions

[3] σελ. 408

ΒΙΒΛΙΟΓΡΑΦΙΑ [1] «Το πρώτο βιβλίο της FORTRAN 77», John Shelley, εκδόσεις Μ. Γκιούρδας. [2] «FORTRAN», Σωτήριος Περσίδης, εκδόσεις Ι∆ΕΑ [3] «FORTRAN 77 programming», T. M. R. Ellis, Addison-Wesley publishing company