FORTRAN 77
Introduzione
FORTRAN 77
Introduzione
PROGRAM {nome}
{dichiarazioni}
{istruzioni (statements )}
STOP END
FORTRAN 77
Struttura
col. 01-05 : statement label (opzionale) col. 06 : continuazione linea
col. 07-72 : FORTRAN statements
col. 73-80 : numero sequenziale (opzionale)
FORTRAN 77
Esempio 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 77
Nomi
• non più di 6 caratteri
• lettera iniziale
• maiuscole
• ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
FORTRAN 77
Costanti
• 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)
FORTRAN 77
Variabili
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 77
Variabili
INT(argomento) R,D,I I (conversioni) REAL (argomento) R,D,I R
DBLE (argomento ) R,D,I D ICHAR(argomento) C I CHAR (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 77
Espressioni
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 77
Espressioni
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 77
Espressioni
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 77
Espressioni
Operatori aritmetici precedenza >
Operatori relazionali Operatori 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.
FORTRAN 77
Espressioni
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 77
IF
IF ({espressione logica}) {istruzione}
in generale:
IF ({espressione logica}) THEN {istruzioni}
ELSEIF ({espressione logica}) THEN {istruzioni}
...
ELSE
{istruzioni}
ENDIF
FORTRAN 77
IF
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 77
GOTO
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 77
IF aritmetica
IF ({espressione}) label1,label2,label3
espressione <0 ⇒ GOTO label1 espressione =0 ⇒ GOTO label2 espressione >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
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(*,*) I 10 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
FUNCTION
es: SQRT(X) radice quadrata EXP(X) esponenziale SIN(X) seno
SUBROUTINE
es: SSWAP(N,X,INCX,Y,INCY) scambio X-Y STRSL(T,TDIM,N,B,JOB,INFO) sistemi Tx=b
FORTRAN 77
Input - Output
READ ({#unità},{#FORMAT}) {variabili}
WRITE ({#unità},{#FORMAT}) {variabili}
es: READ(*,*)I,J READ *,I,J es: READ(*,10)I,J
10 FORMAT(I5,I6)
es: WRITE(*,*)I,J PRINT*,I,J es: WRITE(*,*)’riga=‘,I,’colonna=‘,J es: WRITE(*,10)I,J
10 FORMAT(‘riga=’,I5,2X,‘colonna=’,I6)
FORTRAN 77
Esempio 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