1
FORTRAN 77Introduzione
FORTRAN 77Introduzione
PROGRAM {nome} {dichiarazioni}
{istruzioni (statements)}
STOP
END
FORTRAN 77Struttura
col. 01-05 : statement label (opzionale)
col. 06 : continuazione linea
col. 07-72 : FORTRAN statements
col. 73-80 : numero sequenziale (opzionale)
FORTRAN 77Esempio 1
PROGRAM VOLUME REAL R,H,VOL
C
C VOLUME CONO CIRCOLARE RETTO
C
WRITE(*,*) ‘R=? H=?’
READ(*,*)R,H
VOL=3.14159*R*R*H/3
WRITE(*,*) ’VOLUME=‘,VOL
STOP
END
FORTRAN 77Nomi
• non più di 6 caratteri
• lettera iniziale
• maiuscole
• ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
FORTRAN 77Costanti
• intere n es: 15;-3• reali aEn;aDn es: 1.5;-0.078;1.E-4;0.3D5• complesse z=x+iy es: (5.3,-3.1);(2E3,5E-2)• logiche .TRUE.;.FALSE.
• stringa es: ‘TESTO’• con nome es: PI (PARAMETER PI=3.14159)
2
FORTRAN 77Variabili
INTEGER {lista variabili} (dichiarazioni)REAL {lista variabili}DOUBLE PRECISION {lista variabili}COMPLEX {lista variabili}LOGICAL {lista variabili}CHARACTER {lista variabili}
IMPLICIT INTEGER(I-N)
nomevariabile = espressione (assegnazioni)
FORTRAN 77Variabili
INT(argomento) R,D,I I (conversioni)REAL(argomento) R,D,I RDBLE(argomento ) R,D,I DICHAR(argomento) C ICHAR(argomento) I C
es: X = (I/J)*(J/I) X real; I,J integer o real
es: Z = DBLE(X)*DBLE(Y) X,Y real; Z double precision
Z = DBLE(X*Y)
es: F = (9/5)*C +32
F = (9.0D0/5.0D0)*C +32.0D0
FORTRAN 77Espressioni
Operatori aritmetici:
** elevamento a potenza precedenza >
* moltiplicazione
/ divisione
+ addizione
- sottrazione
es: ax2+bx+c=0, x=(-b± b2-4ac)/2a
X = (-B + SQRT(B*B - 4.*A*C)) / (2.*A)
X = -B + SQRT(B*B - 4.*A*C)/2.*A NO
FORTRAN 77Espressioni
Operatori relazionali:
.LT. minore di (less than)
.LE. minore o uguale a (less than or equal)
.EQ. uguale a (equal)
.NE. non uguale a (not equal)
.GT. maggiore di (greater than)
.GE. maggiore o uguale a (greater than or equal)
es: b2-4ac≥0(B**2 - 4.*A*C) .GE. 0.
FORTRAN 77Espressioni
Operatori logici:
.NOT. (not)
.AND. (and)
.OR. (or)
.EQV. (equivalent)
.NEQV. (not equivalent)
es: b2-4ac≥0 e b=0((B**2 - 4.*A*C) .GE. 0.) .AND. (B .EQ. 0.)
FORTRAN 77Espressioni
Operatori aritmetici precedenza >
Operatori relazionaliOperatori logici
es: b2-4ac≥0 e b=0((B**2 - 4.*A*C) .GE. 0.) .AND. (B .EQ. 0.)
B**2-4.*A*C.GE.0..AND.B.EQ.0.
3
FORTRAN 77Espressioni
Manipolazioni di stringhe:
S1//S2 (concatenazione)
S(e1:e2) (sottostringa)
LENGTH(S) (lunghezza)
INDEX(S,’T’)(ricerca)
es: S1=‘ABC’,S2=‘DEF’ S=S1//S2 S=‘ABCDEF’
S(3:5)=‘546’ S=‘AB546F’
S=S(1:4) S=‘AB54’
L=LENGTH(S) L=4
L=INDEX(S,’B5’) L=2
FORTRAN 77IF
IF ({espressione logica}) {istruzione}
in generale:
IF ({espressione logica}) THEN {istruzioni}
ELSEIF ({espressione logica}) THEN {istruzioni}
...
ELSE {istruzioni}
ENDIF
FORTRAN 77IF
es: b2-4ac≥0 ⇒ ‘radici reali’
IF (B**2-4.*A*C.GE.0.) WRITE(*,*) ‘reali’
es: b2-4ac≥0,<0 ⇒ ‘radici reali, complesse’
IF (B**2-4.*A*C.GE.0.) THEN WRITE(*,*) ‘reali’
ELSE WRITE(*,*) ‘complesse’
ENDIF
FORTRAN 77GOTO
GOTO label
es: b2-4ac<0,=0,>0 ⇒ go to labels 30,40,50
DELTA = B**2 - 4.*A*C IF (DELTA.LT.0.) THEN
GOTO 30 ELSEIF (DELTA.EQ.0.) THEN GOTO 40 ELSE
GOTO 50 ENDIF
FORTRAN 77IF aritmetica
IF ({espressione}) label1,label2,label3
espressione <0 ⇒ GOTO label1espressione =0 ⇒ GOTO label2espressione >0 ⇒ GOTO label3
es: b2-4ac ⇒ go to labels 30,40,50
DELTA = B**2 - 4.*A*C IF (DELTA) 30,40,50
FORTRAN 77 WHILE - loops
label IF ({espressione logica}) THEN {istruzioni}
GOTO label ENDIF
es: READ(*,*) X
10 IF (X.LE.100) THEN WRITE(*,*) X
X=X+1
GOTO 10 ENDIF
4
FORTRAN 77 UNTIL - loops
label CONTINUE {istruzioni} IF ({espressione logica}) GOTO label
es: READ(*,*) X
10 CONTINUE WRITE(*,*) X X=X+1
IF (X.LE.100) GOTO 10
FORTRAN 77 DO - loops
DO label {var} = {espr1},{espr2},{espr3} {istruzioni}
label CONTINUE
es: READ(*,*) X
DO 10 I=X,100,1 WRITE(*,*) I10 CONTINUE
nota: DO-loops nidificati (nested)
nota: DO WHILE in alcuni compilatori
FORTRAN 77 Array
Unidimensionali (⇔ vettori)es: REAL A(15) equivale a REAL A(1:15)
es: DO 10 I=1,15 WRITE(*,*) X(I)10 CONTINUE
Bidimensionali (⇔ matrici)es: REAL A(15,10) equivale a REAL A(1:15,1:10)
Pluridimensionali (≤7)es: REAL A(15,10,5,1,1,5,10)
FORTRAN 77 Sottoprogrammi - FUNCTION
{tipo} FUNCTION {nome} ({variabili}) {dichiarazioni}
{istruzioni}
RETURN END
es: REAL FUNCTION DELTA(A,B,C) REAL A,B,C
DELTA=B**2-4.*A*C
RETURN out in END
FORTRAN 77 Sottoprogrammi - SUBROUTINE
SUBROUTINE {nome} ({argomenti}) {dichiarazioni}
{istruzioni}
RETURN END ...
CALL {nome} ({argomenti})
es: SUBROUTINE DELTA(A,B,C,D) REAL A,B,C,D
D=B**2-4.*A*C
RETURN in out END
FORTRAN 77 LIBRERIE
LIBRERIA = raccolta di sottoprogrammi
FUNCTIONes: SQRT(X) radice quadrata
EXP(X) esponenziale
SIN(X) seno
SUBROUTINEes: SSWAP(N,X,INCX,Y,INCY) scambio X-Y
STRSL(T,TDIM,N,B,JOB,INFO) sistemi Tx=b
5
FORTRAN 77 Input - Output
READ ({#unità},{#FORMAT}) {variabili} WRITE ({#unità},{#FORMAT}) {variabili}
es: READ(*,*)I,J READ*,I,Jes: READ(*,10)I,J10 FORMAT(I5,I6)
es: WRITE(*,*)I,J PRINT*,I,Jes: WRITE(*,*)’riga=‘,I,’colonna=‘,Jes: WRITE(*,10)I,J10 FORMAT(‘riga=’,I5,2X,‘colonna=’,I6)
FORTRAN 77Esempio 2 [1/3]
PROGRAM ORD PARAMETER (N=10)
REAL X(N),XCOPY(N),TEMP
C
C ORDINAMENTO CRESCENTE VETTORE X (N ELEMENTI)
C
C inserimento vettore:
WRITE(*,*) ‘INSERIRE’,N,’ELEMENTI’
DO 10 I=1,N
READ(*,*) X(I)
XCOPY(I)=X(I)
10 CONTINUE
FORTRAN 77 Esempio 2 [2/3]
C ordinamento vettore:
DO 30 I=1,N-1
MIN=I
DO 20 J=I+1,N
IF (X(J).LT.X(MIN)) MIN=J
20 CONTINUE
IF (MIN.GT.I) THEN
TEMP=X(MIN)
X(MIN)=X(I)
X(I)=TEMP
ENDIF
30 CONTINUE
FORTRAN 77 Esempio 2 [3/3]
C stampa vettori:
WRITE(*,*) ‘VETTORE INSERITO’
DO 40 I=1,N
WRITE(*,*) XCOPY(I)
40 CONTINUE
WRITE(*,*) ‘VETTORE ORDINATO’
DO 50 I=1,N
WRITE(*,*) X(I)
50 CONTINUE
STOP
END