Class_A_Lecture_4_5

30
Εισαγωγή στη γλώσσα προγραμματισμού Fortran 77 (μέρος ) Κωνσταντίνος Σιέττος

Transcript of Class_A_Lecture_4_5

Page 1: Class_A_Lecture_4_5

Εισαγωγή στη γλώσσα προγραμματισμού

Fortran 77

(μέρος ∆)

Κωνσταντίνος Σιέττος

Page 2: Class_A_Lecture_4_5

Εντολές Εισόδου-Εξόδου/ Προσπέλαση αρχείων

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

• Γενικά τα αρχεία διακρίνονται σε δύο κατηγορίες:

1. Τα σειριακά αρχεία

Η επεξεργασία των γραμμών των αρχείων γίνεται με την σειρά (εγγραφή + ανάγνωση)

2. Τα αρχεία άμεσης προσπέλασης

Ορίζεται ο αριθμός των γραμμών (records) που θα διαβαστούν ή θα εγγραφούν

Χρειάζεται η δήλωση του αρχείου ως άμεσης προσπέλασης(εντολή ACCESS)

Page 3: Class_A_Lecture_4_5

Εντολές Εισόδου-Εξόδου/ Προσπέλαση αρχείων

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

• Άνοιγμα αρχείων σειριακής προσπέλασης

Προετοιμασία για άνοιγμα αρχείου για διάβασμα:

open(unit = INTEGER, FILE = ‘onomaarxeiou’, status = 'OLD')

Προετοιμασία για άνοιγμα αρχείου για γράψιμο:

open(unit = INTEGER, FILE = ‘onomaarxeiou’, status = ‘new')

ή και για τα δύο

open(unit = INTEGER, FILE = FILENAME, status = ‘unknown‘)

Page 4: Class_A_Lecture_4_5

Εντολές Εισόδου-Εξόδου/ Προσπέλαση αρχείων

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

• Κλείσιμο αρχείων

open(unit = INTEGER, FILE = FILENAME, status = ‘unknown‘)

close (unit)

Καλό είναι μετά την προσπέλαση του αρχείου να κλείνετε το αρχείο με την εντολή close

• Rewind αρχείων: μεταφορά της ανάγνωσης στην «αρχή» του αρχείου.

�����������

Page 5: Class_A_Lecture_4_5

Οι εντολές read και write/ format⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

READ(UNIT, f) metavlites

WRITE(UNIT, f) metavlites

f είναι ο ακέραιος αριθμός της εντολής FORMAT η οποία περιγράφει τις προδιαγραφές, δηλαδή πως έχει γραφεί (και συνεπώς πως θα πρέπει να διαβαστεί) το record (metablites):

FORMAT (προδιαγραφές)

Page 6: Class_A_Lecture_4_5

Οι εντολές read και write/ format⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Παράδειγμα: Να διαβαστούν τα στοιχεία από ένα αρχείο που έχει ανοιχθεί προηγουμένως ως unit=1 που περιέχει τα στοιχεία ενός πίνακα Α 5x5

…….

………do 20 i=1,5read(1,*) (A(i,j), j=1,5)

5 continue……..

open(unit = 1, file=‘pinakas’, status = ‘unknown‘)

Page 7: Class_A_Lecture_4_5

Κωδικοί Προδιαγραφών για την εντολή FORMAT

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Ο κωδικός προδιαγραφής Ιw

-Χρησιμοποιείται για την ανάγνωση και εγγραφή ακεραίων με μήκος πεδίου w

- Επιτρεπτές μορφές δεδομένων εισόδου (sm), s είναι ενδεχόμενο πρόσημο, m είναι ακολουθία ψηφίων

-Κενά που βρίσκονται αριστερά του πρώτου ψηφίου διαβάζονται ως κενά ενώ όλα τα άλλα διαβάζονται ως μηδενικά

Παράδειγμα

Έστω η γραμμή δεδομένων 123456-789

Read(1,10) K,L,M10 Format(I2,I4,I4)

Οι μεταβλητές K,L,M παίρνουν τις τιμέςΚ=12, L=3456, M=-789

Page 8: Class_A_Lecture_4_5

Κωδικοί Προδιαγραφών για την εντολή FORMAT

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Ο κωδικός προδιαγραφής Fw.d-Χρησιμοποιείται για την ανάγνωση και εγγραφή πραγματικών αριθμών με μήκος πεδίου w (w>=d+2). To w συμπεριλαμβάνει και την υποδιαστολή

-d είναι ένας ακέραιος που δηλώνει το μήκος πεδίου του δεκαδικού μέρους

- Επιτρεπτές μορφές δεδομένων εισόδου (sm, sm.n), S είναι ενδεχόμενο πρόσημο, m,n είναι ακολουθία ψηφίων

-Κενά που βρίσκονται αριστερά του πρώτου ψηφίου διαβάζονται ως κενά ενώ όλα τα άλλα διαβάζονται ως μηδενικά

-Αν στον αριθμό που διαβάζεται δεν υπάρχει κλασματικό σημείο τότε χωρίζονται τόσα ψηφία όσα δηλώνονται με το d

-Αν το ακέραιο μέρος είναι μεγαλύτερο από w-d-1 τότε κατά την εγγραφή εμφανίζονται αστεράκια αντί του αριθμού

Παράδειγμα

Έστω η γραμμή δεδομένων -345.5678975

Read(1,10) Α,Β10 Format(F7.2,F5.2)

Οι μεταβλητές A,B,C παίρνουν τις τιμέςA=-345.56, B=789.75,

Page 9: Class_A_Lecture_4_5

Κωδικοί Προδιαγραφών για την εντολή FORMAT

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Ο κωδικός προδιαγραφής Ew.d

-Χρησιμοποιείται για την ανάγνωση και εγγραφή πραγματικών αριθμών γραμμένους με εκθετικό τρόπο με την μορφή S.mE+/-xx με μήκος πεδίου w.

-Στην ανάγνωση ακολουθούνται οι κανόνες όπως με το Fw.d

-Στην εγγραφή

Το S είναι το πρόσημο του αριθμού

m είναι ακολουθία ψηφίων το οποίο γίνεται ίσο με d είτε με στρογγύλεμα είτε με προσθήκη μηδενικών

xx είναι ακέραια σταθερά

Παράδειγμα

Έστω η γραμμή δεδομένων 4567Ε2

Read(1,10) Α10 Format(Ε6.3)

Η μεταβλητή A διαβάζεταιA=456.7

Page 10: Class_A_Lecture_4_5

Κωδικοί Προδιαγραφών για την εντολή FORMAT

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Ο κωδικός προδιαγραφής nX

-Χρησιμοποιείται για την παράλειψη n χαρακτήρων κατά την ανάγνωση ή την εγγραφή n κενών κατά την εγγραφή-Στην εγγραφή

Παράδειγμα

Έστω η γραμμή δεδομένων

Bac12345678910.56

read(1,10) K,L,Awrite(*,10) K,L,A

10 Format(3x,I4,I3,f7.2)

Η μεταβλητή K διαβάζεταιK=1234 Η μεταβλητή L διαβάζεταιL=567 Η μεταβλητή A διαβάζεταιL=8910.56

Η μεταβλητή K θα διαβαζότανK=0Η μεταβλητή L ωςL=0και η μεταβλητή A διαβάζεταιL=8910.56

Αν όμως τα k,l ήταν Real μεταβλητές τότε

Page 11: Class_A_Lecture_4_5

Υποπρογράμματα⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

ή…………Επίλυση των επιμέρους προβλημάτων χωριστά

∆ύο κύριες κατηγορίες

(α) Functions

(b) subroutines

Ένα τυπικό πρόγραμμα FORTRAN αποτελείται από το κύριο πρόγραμμα και από περισσότερα υποπρογράμματα

Page 12: Class_A_Lecture_4_5

Functions⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

• Το πιο απλό είδος υποπρογράμματος

• Χρησιμοποιείται όταν χρειάζεται να εκτελεσθεί πολλές φορές κάποιο block εντολών μέσα στο κύριο πρόγραμμα

•∆ηλώνεται στην αρχή του προγράμματος μετά τις δηλώσεις των μεταβλητών (Integer, Real, Double Precision κ.τ.λ.)

•Καλείται σε οποιοδήποτε σημείο του κύριου προγράμματος

Page 13: Class_A_Lecture_4_5

Functions⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

• Γενική μορφή δήλωσης μιας function

type function name(arguments)

όπου

type: Integer, real, double precision, logical

name: το όνομα της συνάρτησης

arguments: μεταβλητές εισόδου που χωρίζονται με κόμμα. ∆ηλώνονται μέσα στην function και θα πρέπει να είναι του ίδιου τύπου καιδιαστάσεων με τις μεταβλητές που ορίζονται στο κύριο πρόγραμμα.Μπορεί να είναι και arrays, functions ή subroutines

Page 14: Class_A_Lecture_4_5

∆ομή Functions⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

real function paradeigma(a,b,c)integer a,b,creal ….…..……Εντολές…….…….paradeigma = EXPRESSION……….RETURNEND

Program mainreal paradeigmainteger p,t,wreal bdouble precision ….…..……Εντολές……b= paradeigma(p,t,w)………..END

Page 15: Class_A_Lecture_4_5

Κανόνες για την χρήση των Functions⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

• Ο τύπος και το πλήθος των μεταβλητών (arguments) που χρησιμοποιούνται στο κύριο πρόγραμμα και στην function θα πρέπει να είναι ο ίδιος. Τα ονόματα των μεταβλητών δεν χρειάζεται να είναι τα ίδια.

• Ο τύπος της συνάρτησης θα πρέπει να είναι ο ίδιος τόσο στην δήλωση της στο κύριο πρόγραμμα όσο και στην περιγραφή της συνάρτησης.

• Το αποτέλεσμα της συνάρτησης θα πρέπει να ανατίθεται στο όνομα της συνάρτησης.

• Κάθε συνάρτηση θα πρέπει να έχει τουλάχιστον ένα return.

• Η συνάρτηση (function) μπορεί να τοποθετηθεί είτε πριν είτε μετά από το κύριο πρόγραμμα.

Μια συνάρτηση δεν μ�ορεί να καλέσει τον εαυτό της�

Page 16: Class_A_Lecture_4_5

Παράδειγμα για την χρήση των Functions⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Να γραφεί ένα πρόγραμμα με την χρήση μιας function για τον υπολογισμό της σειράς για τους πρώτους Ν όρους: 1- x^2/2! + x^4/4! -……

program mainreal x,binteger Nreal cosfunwrite(*,*) ‘give x,N’read(*,*) x,Nb= cosfun(x,N)write(*,*) bend

real function cosfun(x,N) real x,term, F0integer N,i,kinteger factF0=1.i=2k=0do while (i.lt.2*N)term=x**i/ fact(i)k=k+1F0=F0+(-1)**k*termi=i+2enddocosfun=F0end

integer function fact(m) integer mfact=1do 10 i=1,mfact=fact*i

10 continuereturnend

Page 17: Class_A_Lecture_4_5

Subroutines-Υπορουτίνες⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Η υπορουτίνα είναι το πιο σύνηθες είδος υποπρογράμματος και το πιο γενικό γιατί

επιτρέπει τον υπολογισμό πολλών τιμών ταυτόχρονα (αριθμητικές, λογικές, χαρακτήρων)

σε αντίθεση με το υποπρόγραμμα-functiοn που

δίνει στο κύριο πρόγραμμα μια μόνο μεταβλητή: αυτή του ονόματος της.

• Έχει την ακόλουθη επικεφαλίδα :

SUBROUTINE name (argmunets)

• όπου– Name είναι το όνομα της υπορουτίνας– Τα ορίσματα (arguments) είναι μεταβλητές εισόδου-εξόδου

Page 18: Class_A_Lecture_4_5

Κάλεσμα υπορουτίνων και κανόνες⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

• Μια υπορουτίνα καλείται σε ένα σημείο του κύριου προγράμματος με την εντολή CALL

CALL name (arguments)

• Τα arguments θα πρέπει να είναι του ίδιου τύπου και διαστάσεων με τις μεταβλητές που ορίζονται στο κύριο πρόγραμμα.

• Στο τέλος της υπορουτίνας θα πρέπει να έχει ένα return για να εξασφαλίζεται η μεταφορά του ελέγχου του προγράμματος στο πρόγραμμα που την καλεί (κύριο πρόγραμμα ή άλλη υπορουτίνα)

• Στα ορίσματα (arguments) πρέπει να εμπεριέχονται και οι μεταβλητές που θα μεταφερθούν στο πρόγραμμα που την καλεί. Αυτά μπορεί να είναι ίδια με τα ορίσματα εισόδου δηλαδή τις μεταβλητές που μεταβιβάζονται στην υπορουτίνα στην αρχή των υπολογισμών.

Page 19: Class_A_Lecture_4_5

Subroutines-Παράδειγμα⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Να γραφεί ένα κύριο πρόγραμμα που θα καλεί ένα υποπρόγραμμα το οποίο θα βρίσκει το αλγεβρικά μεγαλύτερο στοιχείο ενός μονοδιάστατου ανύσματος με πραγματικά στοιχεία.

subroutine findmax(a,amax,N) real a(N)amax=a(1)do 10 i=1,Nif(a(i).gt.amax) amax=a(i)

10 continuereturnend

program mainparameter(N=10) real a(N)open(unit=1,file=‘vector.txt’,status=‘unknown’)do 10 i=1,Nread(1,*) a(i)

10 Continueamax=0.call findmax(a,amax,N)write(*,*) amaxend

Page 20: Class_A_Lecture_4_5

Subroutines-Παράδειγμα -Μέθοδος Newton-Raphson

⎪⎩

⎪⎨⎧

≤∧≥−>∧≥+

<=

2k 3j 1,j2k 3j 3,j

0j ,0z

Να γραφεί ένα κύριο πρόγραμμα που θα καλεί ένα υποπρόγραμμα το οποίο θα βρίσκει τη λύση ενός συστήματος μη-γραμμικών αλγεβρικών εξισώσεων με τη μέθοδο Newton-Raphson

Η αριθμητική μέθοδος Newton-Raphson

Η μέθοδος Newton-Raphson είναι η πλέον διαδεδομένη μέθοδος για την επίλυση

συστημάτων αλγεβρικών εξισώσεων της μορφής

( ) 0=xF , nn RR →:F  

Page 21: Class_A_Lecture_4_5

Subroutines-Παράδειγμα-Μέθοδος Newton-Raphson

FnR

( ) 0: =x*F*x( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈Υποθέτοντας ότι η F είναι  επαρκώς  παραγωγίσιμη  σε  ένα  διάστημα  στο  nR   το  οποίο 

εμπεριέχει  την  λύση  ( ) 0: =x*F*x τότε  η  ( )xF μπορεί  να  αναπτυχθεί  σε  σειρά Taylor

γύρω από ένα σημείο Cx  «κοντά» στο  x*ως 

 

( ) ( ) ( )( )CcC xxxFxFxF −∇+≈  

Αν στην προηγούμενη σχέση αντικαταστήσουμε την ( ) 0=x*F  τότε προκύπτει η σχέση 

( ) ( ) ( )[ ] 1 −∇−≈− cCC xFxFxx*  

Page 22: Class_A_Lecture_4_5

Subroutines-Παράδειγμα -Μέθοδος Newton-Raphson

FnR

( ) 0: =x*F*x( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈Βάση της παραπάνω σχέσης η επαναληπτική διαδικασία Newton-Raphson δίνεται από την

εξής αναδρομική σχέση

( ) ( )[ ] 11 −+ ∇−= )()()()( xFxFxx nnnn

Βασική προϋπόθεση για την εφαρμογή της παραπάνω σχέσης είναι η συνθήκη ότι ο

Ιακωβιανός πίνακας δεν πρέπει να είναι ιδιάζων, δηλαδή ( )( ) 0≠∇ )(xFdet n .

Η αναδρομική σχέση (21) επαναλαμβάνεται έως ότου tolnn <−+ )()( xx 1 . Αποδεικνύεται

ότι αν η αρχική εκτίμηση )(x 0   είναι  επαρκώς  κοντά  στην  λύση  x*   τότε  η  μέθοδος

συγκλίνει τετραγωνικά στο  x* . 

Page 23: Class_A_Lecture_4_5

Subroutines-Παράδειγμα-Μέθοδος Newton-Raphson

FnR

( ) 0: =x*F*x( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈ k = 0

Set )(x k as initial guess

Set tol as tolerance of convergence

Do while error < tol

Solve the system ( ) ( ))()()( xFxxF kkk −=∇ δ

Update the solution as )()()( xxx kkk δ+=+1

error = )(x kδ

k=k+1

End do

Page 24: Class_A_Lecture_4_5

Subroutines-Παράδειγμα -Μέθοδος Newton-Raphson

FnR

( ) 0: =x*F*x( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈Να γραφεί ένα κύριο πρόγραμμα που θα καλεί ένα υποπρόγραμμα το οποίο θα βρίσκει τη λύση της εξίσωσης

x^1.7658 -3.2589x +1.152 = 0

program mainc initial guess

x0=1.0c tolerance

tol=1.E-06call newtonr(x0,tol)write(*,*) x0end

subroutine newtonr(x0,tol)error1=1.Do while(error1.gt.tol) call funeval (x0,dx)error1=sqrt(dx**2)x0=x0+dxenddoreturnend

subroutine funeval(x0,dx)fx0=x0**1.7658-3.2589*x0+1.152rjac=1.7658*x0**0.7658-3.2589dx=-fx0/rjacreturnend

Page 25: Class_A_Lecture_4_5

Subroutines-Παράδειγμα -Μέθοδος Newton-Raphson σε 2 ∆ιαστάσεις

FnR

( ) 0: =x*F*x( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈Να γραφεί ένα κύριο πρόγραμμα που θα καλεί ένα υποπρόγραμμα το οποίο θα βρίσκει τη λύση των εξισώσεων

x1^1.7658 -3.2589x1*x2 +1.152 = 0

x2^1.3456-4.56*x1*x2+0.54program mainimplicit real*8(a-h,o-z)parameter(n=2)dimension x0(n),dx(n)c initial guessx0(1)=1.0x0(2)=0.75c tolerancetol=1.E-06call newtonr(x0,tol,n)write(*,*) x0(1),x0(2)end

subroutine newtonr(x0,tol,n)implicit real*8(a-h,o-z)dimension x0(n),dx(n)error1=1.Do while(error1.gt.tol) call funeval (x0,dx,n)error1=sqrt(dx(1)**2+dx(2)**2)write(*,*) error1,x0(1),x0(2)pausex0(1)=x0(1)+dx(1)x0(2)=x0(2)+dx(2)enddoreturnend

Page 26: Class_A_Lecture_4_5

Subroutines-Παράδειγμα -Μέθοδος Newton-Raphson σε 2 ∆ιαστάσεις

FnR

( ) 0: =x*F*x( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈

subroutine funeval(x0,dx,n)implicit real*8(a-h,o-z)dimension dx(n),x0(n),fx0(n)dimension rjac(n,n)cfx0(1)=x0(1)**1.7658-3.2589*$x0(1)*x0(2)+1.152fx0(2)=x0(2)**1.3456-4.56*x0(1)$*x0(2)+0.54crjac(1,1)=1.7658*x0(1)**0.7658$-3.2589*x0(2)rjac(1,2)=-3.2589*x0(1)rjac(2,1)=-4.56*x0(2)rjac(2,2)=1.3456*x0(2)**0.3456$-4.56*x0(1)call gelim(n,rjac,-fx0,dx)returnend

Να γραφεί ένα κύριο πρόγραμμα που θα καλεί ένα υποπρόγραμμα το οποίο θα βρίσκει τη λύση των εξισώσεων

subroutine gelim(n,sk,r1,u)implicit real*8(a-h,o-z)dimension sk(n,n),u(n),r1(n)do 10 i=1,ndo 20 j=1,n20 continue10 continue

do 30 r=1,n-1do 40 i=r,n-1p=sk(i+1,r)/sk(r,r)do 50 j=r+1,nsk(i+1,j)=sk(i+1,j)-p*sk(r,j)

50 continuer1(i+1)=r1(i+1)-p*r1(r)

40 continue

30 continuedo 60 m=n,1,-1if(m.eq.n) goto 100do 70 l=n,m+1,-1r1(m)=r1(m)-sk(m,l)*u(l)

70 continue100 u(m)=r1(m)/sk(m,m)60 continue

returnend

x1^1.7658 -3.2589x1*x2 +1.152 = 0

x2^1.3456-4.56*x1*x2+0.54

Page 27: Class_A_Lecture_4_5

∆ομή προγραμμάτων-ΑνακεφαλαίωσηF

nR( ) 0: =x*F*x

( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈• Μεγάλα προβλήματα θα πρέπει να χωρίζονται σε μικρότερα

υποπροβλήματα

– Κάθε υπο-πρόβλημα θα πρέπει να λύνεται χωριστά και με τη σειρά που απαιτείται για την λύση του αρχικού σύνθετου

– Για κάθε υπο-πρόβλημα γράφεται η αντίστοιχη υπο-ρουτίνα (subroutine) για την υπολογιστική επίλυση του

• Ένα τυπικό πρόγραμμα FORTRAN αποτελείται από– Ένα κύριο (main) πρόγραμμα– Από κανένα, ένα ή περισσότερα υπο-προγράμματα (subroutines)

Page 28: Class_A_Lecture_4_5

∆ομή προγραμμάτων-ΑνακεφαλαίωσηF

nR( ) 0: =x*F*x

( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*( ) ( ) ( )( )CcC xxxFxFxF −∇+≈

• Οι υπο-ρουτίνες μπορούν να εμφανίζονται πριν ή συνήθως μετά το main πρόγραμμα

• Η εκτέλεση του προγράμματος αρχίζει από το main πρόγραμμα

• Μια υπορουτίνα ή συνάρτηση μπορεί να καλείται τόσο από το main πρόγραμμα όσο και από οποιαδήποτε άλλη υπορουτίνα. Αυτό-καλέσματα δεν είναι δυνατά.

– Tο main πρόγραμμα ή η υπορουτίνα περνάει πληροφορία στην καλούμενη υπορουτίνα ή συνάρτηση βάσει των ορισμάτων(arguments)

• Μετά το κάλεσμα της υπορουτίνας και την εκτέλεση των εντολών που περιέχονται σε αυτή, επιστρέφει τα αποτελέσματα των υπολογισμών στο πρόγραμμα που την καλεί(main ή subroutine)

Page 29: Class_A_Lecture_4_5

Ο μεταγλωτιστής της Fortran 77• Απλές κλήσεις του Μεταγλωτιστή

Κλήση Παραγόμενο αρχείο Είδος Αρχείου

% f77 file.f a.out εκτελέσιμο

% f77 file1.f file2.f … -c file1.o file2.o …μεταγλωτισμός

συνδέσιμο

% f77 –ο όνομα-exe file1.o file2.o … όνομα-exe εκτελέσιμο

% f77 file.f –o όνομα-exe όνομα-exe εκτελέσιμο

% f77 file.f -g για χρήση του dbx Για ανεύρεση λαθών

% dbx

Page 30: Class_A_Lecture_4_5

Enjoy the ride!F

nR( ) 0: =x*F*x

( )xF

Cxx*

FnR

( ) 0: =x*F*x

Cxx*