You are on page 1of 27

Exemplos de Programas em FORTRAN

Joo Manuel R. S. Tavares Joaquim O. Fonseca

Exemplo I
Programa simples de utilizao do ciclo DO, com escrita no formatada: PROGRAM exercicio1 DIMENSION A(10) Vai gerar valores que so o quntuplo da indexao DO 15 I = 1, 10 A(I) = I*5 CONTINUE

C C C

15 C C ESCREVE NO SENTIDO DECRESCENTE DA INDEXAO C DO 20 J = 10, 1, -1 WRITE (*,*) A(J) 20 CONTINUE STOP END
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 2

Exemplo I
Output:

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

Exemplo II
Programa principal e subrotina para produto 2 matrizes de 2x2, com sada no formatada: PROGRAM exercicio2 DIMENSION A(2, 2), B(2, 2), C(2, 2)

C C VAI DEFINIR PONTOS A(...) C A(1, 1) = 0.0 A(1, 2) = 0.0 ! Considere, por exemplo, os A(2, 1) = 10.0 ! pontos extremos dum segmento de recta A(2, 2) = 0.0 C C VAI LER O NGULO DE ROTAO C

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

Exemplo II
WRITE (*, '(A\)') ' ANGULO : ' READ (*, *) TETA PI = 4*ATAN(1.0) ! Define a constante (pi) TETA = TETA*PI/180 ! Converte graus em radianos DEFINE MATRIZ DE ROTAO em torno da origem B(1, B(1, B(2, B(2, 1) 2) 1) 2) = = = = COS(TETA) SIN(TETA) -SIN(TETA) COS(TETA)

C C C

C C C

CALL MULTMAT(A, B, C) ! Chamada da subrotina MULTMAT ESCREVE A MATRIZ RESULTANTE DO PRODUTO C(...)

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

Exemplo II
C 20 DO 20 I = 1, 2 WRITE (*,*) (C(I, J), J = 1, 2) CONTINUE STOP END ! Ciclo DO interno em J

C C Subrotina para o produto de duas matrizes de 2x2 C SUBROUTINE MULTMAT(A, B, C) DIMENSION A(2, 2), B(2, 2), C(2, 2) C C faz ciclo sobre o nmero de linhas I C

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

Exemplo II
C C C DO 1 I = 1, 2 faz produto com a matriz quadrada B DO 2 J = 1, 2 AB = 0.0 ! Inicia valor da posio da matriz DO 3 K = 1, 2 AB = AB+A(I, K)*B(K, J) !Adiciona contribuies CONTINUE C(I, J) = AB ! Guarda valor na posio da matriz CONTINUE CONTINUE RETURN END

3 2 1 C

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

Exemplo II
Output:

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

Exemplo III
Programa para processamento duma Figura 3D, com leitura dos dados dum ficheiro com a seguinte estrutura:
- na primeira linha o nmero de vrtices (ns) e nmero de faces; - nas linhas seguintes para todos os vrtices, teremos o nmero do vrtice e as coordenadas - seguindo-se depois as linhas para a definio de cada face, com o nmero da face, nmero de vrtices na face e os nmeros dos vrtices dessa face.

Para o caso particular dum cubo de aresta 2 e centrado na origem, ser definido do modo seguinte (ficheiro exemplo.dat)
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 9

Exemplo III
1 2 3 4 5 6 7 8 1 2 3 4 5 6 8 -1 1 1 -1 -1 1 1 -1 4 4 4 4 4 4 6 1 1 1 1 -1 -1 -1 -1 1 1 5 2 1 3 ! nmero de vrtices e nmero de faces 1 1 -1 -1 ! Coordenadas pontos 1 1 -1 -1 2 3 4 4 8 5 8 7 6 ! Faces 6 7 3 5 6 2 7 8 4

Y
3 1 6 2 8

Z
5

X
7

3 6

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

10

Exemplo III
PROGRAM exercicio3 C Verso Inicial do programa de processamento duma figura 3D C********************************************************** C Programa 3D C XCORD Coordenadas dos vrtices C LNODE Nmero de vrtices por face C NNODE Nmero de cada vrtice da face C COMMON / FACES / XCORD(100, 4), LNODE(20), NNODE(20, 8) C C Limitado a 100 pontos, 20 faces e 8 lados no mximo por face C CHARACTER*12 FNAME C NDIM = 3 ICANAL = 20
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 11

Exemplo III
WRITE (*, '(A\)')' Nome do Ficheiro : ' READ (*, '(A)') FNAME OPEN (ICANAL, FILE = FNAME, STATUS = 'OLD') CALL LERDATA(NP, NF, NDIM, ICANAL)

C C escreve no ecr a definio lida pela subrotina LERDATA C DO 20 I = 1, NP WRITE (*, *) I, (XCORD( I, J ), J = 1, NDIM) 20 CONTINUE DO 30 I = 1, NF WRITE (*, *) I, LNODE(I), (NNODE(I, J), J = 1, LNODE(I)) 30 CONTINUE STOP END

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

12

Exemplo III
C Verso Inicial subrotina LERDATA para leitura duma figura 3D C********************************************************** SUBROUTINE LERDATA(NP, NF, NDIM, ICANAL) C COMMON / FACES / XCORD(100, 4), LNODE(20), NNODE(20, 8) C READ (ICANAL, *) NP, NF DO 10 I = 1, NP READ (ICANAL, *) II, (XCORD( II, J ), J = 1, NDIM) XCORD(II, NDIM+1) = 1 ! valor no utilizado neste exemplo 10 CONTINUE C DO 20 I = 1, NF READ (ICANAL, *) II, LNODE(II), (NNODE(II, J), J = 1, LNODE(II)) 20 CONTINUE RETURN END
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 13

Exemplo III
Output:

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

14

Exemplo IV
Programa para leitura dum ficheiro, duma estrutura de faces e clculo da rea total utilizando a formula A= p(p-a)(p-b)(p-c), com p=(a+b+c)/2, para determinar a rea dum qualquer tringulo de lados a, b e c.
1

2 LNODE(I) 3 4 LNODE(I)-1

S aplicvel a Polgonos Convexos


@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 15

Exemplo IV
EXEMPLO de ESTRUTURA 3D dum PRISMA TRIANGULAR 6 -1 1 1 -1 -1 1 4 3 4 3 4 5 1 1 1 1 -1 -1 1 1 5 2 1

1 2 3 4 5 6 1 2 3 4 5

1 1 -1 -1 1 1 2 4 6 6 5

! Coordenadas 3 5 3 3 6 4 4 2 ! Faces
2

Y
3 1

Z
5 5

3 6

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

16

Exemplo IV
PROGRAM exercicio4 C PROGRAMA 3D ! Continuao do exemplo anterior C C COMMON /FACES/ XCOORD(100, 4), LNODE(20), NNODE(20, 8) C PARAMETER (MPOIN = 100, MDIME = 4, MF = 20, MN = 8) DIMENSION XCOORD(MPOIN, MDIME), LNODE(MF), + NNODE(MF, MN) ! Vars locais C CHARACTER*12 FNAME NDIM = 3 ICANAL = 20 WRITE (*, '(A\)') ' Nome do ficheiro : ' READ (*, '(A)') FNAME OPEN (ICANAL, FILE = FNAME, STATUS = 'OLD') C C CALL LERDATA(NP, NF, NDIM, ICANAL)
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 17

Exemplo IV
C + C C ESCRITA PARA CONTROLO DE LEITURA DO FICHEIRO DE DADOS C DO 20 I = 1, NP WRITE (*, 100) I, (XCOORD(I, J), J = 1, NDIM) 20 CONTINUE DO 30 I = 1, NF WRITE (*, 110) I, LNODE(I), (NNODE(I, J), J = 1, LNODE(I)) 30 CONTINUE C C CLCULO DA REA TOTAL C AREAT = 0.0
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 18

CALL LERDATA(MPOIN, MDIME, MF, MN, NP, NF, NDIM, ICANAL, XCOORD, LNODE, NNODE)

Exemplo IV
DO 40 I=1, NF NO1 = NNODE(I, 1) X1 = XCOORD(NO1, 1) Y1 = XCOORD(NO1, 2) Z1 = XCOORD(NO1, 3) AREAF = 0.0 DO 35 K = 3, LNODE(I) NO2 = NNODE(I, K-1) NO3 = NNODE(I, K) X2 = XCOORD(NO2, 1) Y2 = XCOORD(NO2, 2) Z2 = XCOORD(NO2, 3) X3 = XCOORD(NO3, 1) Y3 = XCOORD(NO3, 2) Z3 = XCOORD(NO3, 3) A = SQRT((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2Y1)+(Z2-Z1)*(Z2-Z1))
CFAC: Exemplos de Programas em FORTRAN 19

@2001 - Joo Tavares/JOF

Exemplo IV
+ + B = SQRT((X3-X2)*(X3-X2)+(Y3-Y2)*(Y3Y2)+(Z3-Z2)*(Z3-Z2)) C = SQRT((X1-X3)*(X1-X3)+(Y1-Y3)*(Y1Y3)+(Z1-Z3)*(Z1-Z3)) P = (A+B+C)/2 AREA = SQRT(P*(P-A)*(P-B)*(P-C)) AREAF = AREAF+AREA ! Area total da face CONTINUE WRITE (*, 1000) I, AREAF AREAT = AREAT+AREAF ! Area total da figura 3D CONTINUE WRITE (*, 1010) AREAT STOP FORMAT (4H No , I4, 3(2X, F11.4)) FORMAT (10I5) FORMAT (1X, 5HFACE , I4, 5X, 7HAREA = , E12.5) FORMAT (1X, 13HAREA TOTAL = , E12.5) END
CFAC: Exemplos de Programas em FORTRAN 20

35 40 100 110 1000 1010

@2001 - Joo Tavares/JOF

Exemplo IV
SUBROUTINE LERDATA(MP,MD,MF,MN,NP,NF,NDIM,ICAN + AL,XCOORD,LNODE,NNODE) *********************************************************** * Subrotina LERDATA, faz a leitura dos dados de um ficheiro * * MP - Nmero mximo de pontos em XCOORD * * MD - Mximo da dimenso (3) * * MF - Nmero mximo de faces * * MN - Nmero mximo de pontos por face * * NP - Nmero de pontos em processamento * * NF - Nmero de faces em processamento * * NDIM - Dimenso das coordenadas (2 ou 3) * * ICANAL - Nmero de endereo do ficheiro de leitura * * XCOORD - Vector de armazenamento das coordenadas dos pontos * * LNODE - Vector onde se guarda o nmero de pontos por cada face*

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

21

Exemplo IV
* NNODE - Vector onde se guarda os nm. globais de cada n da face * *********************************************************** DIMENSION XCOORD(MP, MD), LNODE(MF), NNODE(MF, MN) C READ (ICANAL, *) NP, NF DO 10 I = 1, NP READ (ICANAL, *) II, (XCOORD(II, J), J = 1, NDIM) XCOORD(II, NDIM+1) = 1 ! No usado neste exemplo 10 CONTINUE C DO 20 I = 1, NF READ (ICANAL,*) II, LNODE(II), (NNODE(II, K), K = 1, + LNODE(II)) 20 CONTINUE RETURN END
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 22

Exemplo IV
Output:

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

23

Exemplo V
Programa para processamento de uma cadeia de caracteres C C * * * c PROGRAM exemplo5 Programa para leitura duma cadeia de caracteres e converso desta em todos Maisculos ou Minsculos Varivel de caso: ISIM = 1 Passagem de minusculas a maiusculas ISIM = 0 Passagem de maiusculas a minusculas CHARACTER*72 LINHA CHARACTER*1 SIM NL = 72

C C Questiona da converso C 5 WRITE(*, '(A\)') ' Texto Maiusculas (S)- Minusculas (N)[S]: ' READ (*, '(A)') SIM
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 24

Exemplo V
C C Controla resposta C IF (SIM .NE. 'S' .AND. SIM .NE. 's' .AND. SIM .NE. 'N' .AND. + SIM .NE. 'n' .AND. SIM .NE. ' ') THEN WRITE (*,'(A)') ' Resposta Incorrecta !' GOTO 5 END IF ISIM = 1 ! Para maiusculas IF (SIM .EQ. 'N' .OR. SIM .EQ. 'n') THEN ISIM = 0 ! Para minusculas END IF C Vai ler Cadeia de Caracteres C WRITE (*, '(A\)') ' Texto : ' READ (*, '(A)') LINHA
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 25

Exemplo V
C Vai determinar o nmero de caracteres significativos C 10 IF (LINHA(NL:NL) .EQ. ' ') THEN NL = NL-1 GOTO 10 END IF C Converso caracteres Minusculos --> Maiusculos ou Vice-Versa C IC = 1 20 IASC = ICHAR(LINHA(IC:IC)) ! Cdigo ASCII do caracter IF (IASC .GE. 97 .AND. IASC .LE. 122 .AND. ISIM .EQ. 1) THEN LINHA(IC:IC) = CHAR(IASC-32) ! passa a maiusculo ELSE IF (IASC .GE. 65 .AND. IASC .LE. 90 .AND. ISIM .EQ. 0) THEN LINHA(IC:IC) = CHAR(IASC+32) ! passa a minusculo END IF IC = IC+1 (caracter a partir do IF (IC .LE. NL) GOTO 20 cdigo ASCII)
@2001 - Joo Tavares/JOF CFAC: Exemplos de Programas em FORTRAN 26

Exemplo V
C C Escreve para o ecr a cadeia de caracteres j convertida C WRITE (*, '(A\)') ' Texto : ' WRITE (*, '(A)') LINHA(1:IC) STOP END
Output

@2001 - Joo Tavares/JOF

CFAC: Exemplos de Programas em FORTRAN

27