11.07.2014 Views

fortran 77 fortran 77 fortran 77 fortran 77 fortran 77 fortran 77

fortran 77 fortran 77 fortran 77 fortran 77 fortran 77 fortran 77

fortran 77 fortran 77 fortran 77 fortran 77 fortran 77 fortran 77

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

FORTRAN <strong>77</strong><br />

Introduzione<br />

FORTRAN <strong>77</strong><br />

Introduzione<br />

PROGRAM {nome}<br />

{dichiarazioni}<br />

{istruzioni (statements)}<br />

STOP<br />

END<br />

FORTRAN <strong>77</strong><br />

Struttura<br />

FORTRAN <strong>77</strong><br />

Esempio 1<br />

col. 01-05 : statement label (opzionale)<br />

col. 06 : continuazione linea<br />

col. 07-72 : FORTRAN statements<br />

col. 73-80 : numero sequenziale (opzionale)<br />

C<br />

PROGRAM VOLUME<br />

REAL R,H,VOL<br />

C VOLUME CONO CIRCOLARE RETTO<br />

C<br />

WRITE(*,*) ‘R=? H=?’<br />

READ(*,*)R,H<br />

VOL=3.14159*R*R*H/3<br />

WRITE(*,*) ’VOLUME=‘,VOL<br />

STOP<br />

END<br />

FORTRAN <strong>77</strong><br />

Nomi<br />

FORTRAN <strong>77</strong><br />

Costanti<br />

• non più di 6 caratteri<br />

• lettera iniziale<br />

• maiuscole<br />

• ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789<br />

• intere n es: 15;-3<br />

• reali aEn;aDn es: 1.5;-0.078;1.E-4;0.3D5<br />

• complesse z=x+iy es: (5.3,-3.1);(2E3,5E-2)<br />

• logiche .TRUE.;.FALSE.<br />

• stringa<br />

• con nome<br />

es: ‘TESTO’<br />

es: PI (PARAMETER PI=3.14159)<br />

1


INTEGER {lista variabili}<br />

REAL {lista variabili}<br />

DOUBLE PRECISION {lista variabili}<br />

COMPLEX {lista variabili}<br />

LOGICAL {lista variabili}<br />

CHARACTER {lista variabili}<br />

FORTRAN <strong>77</strong><br />

Variabili<br />

(dichiarazioni)<br />

FORTRAN <strong>77</strong><br />

Variabili<br />

INT(argomento) R,D,I I (conversioni)<br />

REAL(argomento) R,D,I R<br />

DBLE(argomento ) R,D,I D<br />

ICHAR(argomento) C I<br />

CHAR(argomento) I C<br />

IMPLICIT INTEGER(I-N)<br />

nomevariabile = espressione<br />

(assegnazioni)<br />

es: X = (I/J)*(J/I)<br />

es: Z = DBLE(X)*DBLE(Y)<br />

Z = DBLE(X*Y)<br />

es: F = (9/5)*C +32<br />

F = (9.0D0/5.0D0)*C +32.0D0<br />

X real; I,J integer o real<br />

X,Y real; Z double precision<br />

FORTRAN <strong>77</strong><br />

Espressioni<br />

FORTRAN <strong>77</strong><br />

Espressioni<br />

Operatori aritmetici:<br />

Operatori relazionali:<br />

** elevamento a potenza precedenza ><br />

* moltiplicazione<br />

/ divisione<br />

+ addizione<br />

- sottrazione<br />

es: ax 2 +bx+c=0, x=(-b± b 2 -4ac)/2a<br />

X = (-B + SQRT(B*B - 4.*A*C)) / (2.*A)<br />

X = -B + SQRT(B*B - 4.*A*C)/2.*A NO<br />

.LT. minore di (less than)<br />

.LE. minore o uguale a (less than or equal)<br />

.EQ. uguale a (equal)<br />

.NE. non uguale a (not equal)<br />

.GT. maggiore di (greater than)<br />

.GE. maggiore o uguale a (greater than or equal)<br />

es: b 2 -4ac≥0<br />

(B**2 - 4.*A*C) .GE. 0.<br />

FORTRAN <strong>77</strong><br />

Espressioni<br />

FORTRAN <strong>77</strong><br />

Espressioni<br />

Operatori logici:<br />

.NOT.<br />

.AND.<br />

.OR.<br />

.EQV.<br />

.NEQV.<br />

(not)<br />

(and)<br />

(or)<br />

(equivalent)<br />

(not equivalent)<br />

es: b 2 -4ac≥0 e b=0<br />

((B**2 - 4.*A*C) .GE. 0.) .AND. (B .EQ. 0.)<br />

Operatori aritmetici precedenza ><br />

Operatori relazionali<br />

Operatori logici<br />

es: b 2 -4ac≥0 e b=0<br />

((B**2 - 4.*A*C) .GE. 0.) .AND. (B .EQ. 0.)<br />

B**2-4.*A*C.GE.0..AND.B.EQ.0.<br />

2


FORTRAN <strong>77</strong><br />

Espressioni<br />

FORTRAN <strong>77</strong><br />

IF<br />

Manipolazioni di stringhe:<br />

IF<br />

({espressione logica}) {istruzione}<br />

S1//S2<br />

(concatenazione)<br />

S(e1:e2) (sottostringa)<br />

LENGTH(S) (lunghezza)<br />

INDEX(S,’T’)(ricerca)<br />

es: S1=‘ABC’,S2=‘DEF’ S=S1//S2 S=‘ABCDEF’<br />

S(3:5)=‘546’ S=‘AB546F’<br />

S=S(1:4) S=‘AB54’<br />

L=LENGTH(S) L=4<br />

L=INDEX(S,’B5’) L=2<br />

in generale:<br />

IF<br />

({espressione logica}) THEN<br />

{istruzioni}<br />

ELSEIF ({espressione logica}) THEN<br />

{istruzioni}<br />

...<br />

ELSE<br />

ENDIF<br />

{istruzioni}<br />

es: b 2 -4ac≥0 ⇒ ‘radici reali’<br />

FORTRAN <strong>77</strong><br />

IF (B**2-4.*A*C.GE.0.) WRITE(*,*) ‘reali’<br />

es: b 2 -4ac≥0,


label CONTINUE<br />

{istruzioni}<br />

IF ({espressione logica}) GOTO label<br />

es: READ(*,*) X<br />

10 CONTINUE<br />

WRITE(*,*) X<br />

X=X+1<br />

IF (X.LE.100) GOTO 10<br />

FORTRAN <strong>77</strong><br />

UNTIL - loops<br />

FORTRAN <strong>77</strong><br />

DO - loops<br />

DO label {var} = {espr1},{espr2},{espr3}<br />

{istruzioni}<br />

label CONTINUE<br />

es: READ(*,*) X<br />

DO 10 I=X,100,1<br />

WRITE(*,*) I<br />

10 CONTINUE<br />

nota: DO-loops nidificati (nested)<br />

nota: DO WHILE in alcuni compilatori<br />

FORTRAN <strong>77</strong><br />

Unidimensionali (⇔ vettori)<br />

es: REAL A(15) equivale a REAL A(1:15)<br />

es: DO 10 I=1,15<br />

WRITE(*,*) X(I)<br />

10 CONTINUE<br />

Array<br />

Bidimensionali (⇔ matrici)<br />

es: REAL A(15,10) equivale a REAL A(1:15,1:10)<br />

Pluridimensionali (≤7)<br />

es: REAL A(15,10,5,1,1,5,10)<br />

FORTRAN <strong>77</strong><br />

Sottoprogrammi - FUNCTION<br />

{tipo} FUNCTION {nome} ({variabili})<br />

{dichiarazioni}<br />

{istruzioni}<br />

RETURN<br />

END<br />

es: REAL FUNCTION DELTA(A,B,C)<br />

REAL A,B,C<br />

DELTA=B**2-4.*A*C<br />

RETURN out in<br />

END<br />

SUBROUTINE {nome} ({argomenti})<br />

{dichiarazioni}<br />

{istruzioni}<br />

RETURN<br />

END<br />

...<br />

CALL {nome} ({argomenti})<br />

es: SUBROUTINE DELTA(A,B,C,D)<br />

REAL A,B,C,D<br />

D=B**2-4.*A*C<br />

RETURN<br />

END<br />

FORTRAN <strong>77</strong><br />

Sottoprogrammi - SUBROUTINE<br />

in out<br />

LIBRERIA = raccolta di sottoprogrammi<br />

FUNCTION<br />

es: SQRT(X)<br />

EXP(X)<br />

SIN(X)<br />

SUBROUTINE<br />

radice quadrata<br />

esponenziale<br />

seno<br />

FORTRAN <strong>77</strong><br />

es: SSWAP(N,X,INCX,Y,INCY) scambio X-Y<br />

STRSL(T,TDIM,N,B,JOB,INFO) sistemi Tx=b<br />

LIBRERIE<br />

4


FORTRAN <strong>77</strong><br />

Input - Output<br />

FORTRAN <strong>77</strong><br />

Esempio 2 [1/3]<br />

READ ({#unità},{#FORMAT}) {variabili}<br />

WRITE ({#unità},{#FORMAT}) {variabili}<br />

es: READ(*,*)I,J READ*,I,J<br />

es: READ(*,10)I,J<br />

10 FORMAT(I5,I6)<br />

es: WRITE(*,*)I,J PRINT*,I,J<br />

es: WRITE(*,*)’riga=‘,I,’colonna=‘,J<br />

es: WRITE(*,10)I,J<br />

10 FORMAT(‘riga=’,I5,2X,‘colonna=’,I6)<br />

PROGRAM ORD<br />

PARAMETER (N=10)<br />

REAL X(N),XCOPY(N),TEMP<br />

C<br />

C ORDINAMENTO CRESCENTE VETTORE X (N ELEMENTI)<br />

C<br />

C<br />

inserimento vettore:<br />

WRITE(*,*) ‘INSERIRE’,N,’ELEMENTI’<br />

DO 10 I=1,N<br />

READ(*,*) X(I)<br />

XCOPY(I)=X(I)<br />

10 CONTINUE<br />

FORTRAN <strong>77</strong><br />

Esempio 2 [2/3]<br />

FORTRAN <strong>77</strong><br />

Esempio 2 [3/3]<br />

C<br />

ordinamento vettore:<br />

DO 30 I=1,N-1<br />

MIN=I<br />

DO 20 J=I+1,N<br />

IF (X(J).LT.X(MIN)) MIN=J<br />

20 CONTINUE<br />

IF (MIN.GT.I) THEN<br />

TEMP=X(MIN)<br />

X(MIN)=X(I)<br />

X(I)=TEMP<br />

ENDIF<br />

30 CONTINUE<br />

C<br />

stampa vettori:<br />

WRITE(*,*) ‘VETTORE INSERITO’<br />

DO 40 I=1,N<br />

WRITE(*,*) XCOPY(I)<br />

40 CONTINUE<br />

WRITE(*,*) ‘VETTORE ORDINATO’<br />

DO 50 I=1,N<br />

WRITE(*,*) X(I)<br />

50 CONTINUE<br />

STOP<br />

END<br />

5

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!