FA: Exemplos de Programas em FORTRAN Exemplos de Programas em FORTRAN João Manuel R. S. Tavares Joaquim O. Fonseca Exemplo I Programa simples de utilização do ciclo DO, com escrita não formatada: PROGRAM exercicio1 DIMENSION A(10) Vai gerar valores que são o quíntuplo da indexação DO 15 I = 1, 10 A(I) = I*5 15 ONTINUE ESREVE NO SENTIDO DERESENTE DA INDEXAÇÃO DO 20 J = 10, 1, -1 WRITE (*,*) A(J) 20 ONTINUE STOP @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 2 @2001 - João Tavares/JOF 1
FA: Exemplos de Programas em FORTRAN Exemplo I Output: @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 3 Exemplo II Programa principal e subrotina para produto 2 matrizes de 2x2, com saída não formatada: PROGRAM exercicio2 DIMENSION A(2, 2), B(2, 2), (2, 2) VAI DEFINIR PONTOS A(...) A(1, 1) = 0.0 A(1, 2) = 0.0! onsidere, por exemplo, os A(2, 1) = 10.0! pontos extremos dum segmento de recta A(2, 2) = 0.0 VAI LER O ÂNGULO DE ROTAÇÃO @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 4 @2001 - João Tavares/JOF 2
FA: 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! onverte graus em radianos DEFINE MATRIZ DE ROTAÇÃO em torno da origem B(1, 1) = OS(TETA) B(1, 2) = SIN(TETA) B(2, 1) = -SIN(TETA) B(2, 2) = OS(TETA) ALL MULTMAT(A, B, )! hamada da subrotina MULTMAT ESREVE A MATRIZ RESULTANTE DO PRODUTO (...) @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 5 Exemplo II DO 20 I = 1, 2 WRITE (*,*) ((I, J), J = 1, 2)! iclo DO interno em J 20 ONTINUE STOP Subrotina para o produto de duas matrizes de 2x2 SUBROUTINE MULTMAT(A, B, ) DIMENSION A(2, 2), B(2, 2), (2, 2) faz ciclo sobre o número de linhas I @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 6 @2001 - João Tavares/JOF 3
FA: Exemplos de Programas em FORTRAN Exemplo II DO 1 I = 1, 2 faz produto com a matriz quadrada B DO 2 J = 1, 2 AB = 0.0! Inicia valor da posição da matriz DO 3 K = 1, 2 AB = AB+A(I, K)*B(K, J)!Adiciona contribuições 3 ONTINUE (I, J) = AB! Guarda valor na posição da matriz 2 ONTINUE 1 ONTINUE RETURN @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 7 Exemplo II Output: @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 8 @2001 - João Tavares/JOF 4
FA: 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 número de vértices (nós) e número de faces; - nas linhas seguintes para todos os vértices, teremos o número do vértice e as coordenadas - seguindo-se depois as linhas para a definição de cada face, com o número da face, número de vértices na face e os números dos vértices dessa face. Para o caso particular dum cubo de aresta 2 e centrado na origem, será definido do modo seguinte (ficheiro exemplo.dat) @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 9 Exemplo III 8 6! número de vértices e número de faces 1-1 1 1 2 1 1 1 3 1 1-1 4-1 1-1! oordenadas pontos 5-1 -1 1 6 1-1 1 1 7 1-1 -1 8-1 -1-1 1 4 1 2 3 4 2 2 4 1 4 8 5 3 4 5 8 7 6! Faces Z 4 4 2 6 7 3 5 4 1 5 6 2 5 6 4 3 7 8 4 5 1 2 Y 4 8 X 4 3 7 6 3 6 @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 10 @2001 - João Tavares/JOF 5
FA: Exemplos de Programas em FORTRAN Exemplo III PROGRAM exercicio3 Versão Inicial do programa de processamento duma figura 3D ********************************************************** Programa 3D XORD oordenadas dos vértices LNODE Número de vértices por face NNODE Número de cada vértice da face OMMON / FAES / XORD(100, 4), LNODE(20), NNODE(20, 8) Limitado a 100 pontos, 20 faces e 8 lados no máximo por face HARATER*12 FNAME NDIM = 3 IANAL = 20 @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 11 Exemplo III WRITE (*, '(A\)')' Nome do Ficheiro : ' READ (*, '(A)') FNAME OPEN (IANAL, FILE = FNAME, STATUS = 'OLD') ALL LERDATA(NP, NF, NDIM, IANAL) escreve no ecrã a definição lida pela subrotina LERDATA DO 20 I = 1, NP WRITE (*, *) I, (XORD( I, J ), J = 1, NDIM) 20 ONTINUE DO 30 I = 1, NF WRITE (*, *) I, LNODE(I), (NNODE(I, J), J = 1, LNODE(I)) 30 ONTINUE STOP @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 12 @2001 - João Tavares/JOF 6
FA: Exemplos de Programas em FORTRAN Exemplo III Versão Inicial subrotina LERDATA para leitura duma figura 3D ********************************************************** SUBROUTINE LERDATA(NP, NF, NDIM, IANAL) OMMON / FAES / XORD(100, 4), LNODE(20), NNODE(20, 8) READ (IANAL, *) NP, NF DO 10 I = 1, NP READ (IANAL, *) II, (XORD( II, J ), J = 1, NDIM) XORD(II, NDIM+1) = 1! valor não utilizado neste exemplo 10 ONTINUE DO 20 I = 1, NF READ (IANAL, *) II, LNODE(II), (NNODE(II, J), J = 1, LNODE(II)) 20 ONTINUE RETURN @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 13 Exemplo III Output: @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 14 @2001 - João Tavares/JOF 7
FA: Exemplos de Programas em FORTRAN Programa para leitura dum ficheiro, duma estrutura de faces e cálculo 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 triângulo de lados a, b e c. 1 2 LNODE(I) 3 4 LNODE(I)-1 Só aplicável a Polígonos onvexos @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 15 EXEMPLO de ESTRUTURA 3D dum PRISMA TRIANGULAR 6 5 1-1 1 1 2 1 1 1 3 1 1-1 4-1 1-1! oordenadas 5-1 -1 1 6 1-1 1 1 4 1 2 3 4 2 3 1 4 5 3 4 5 6 3 4! Faces 4 3 2 6 3 5 4 1 5 6 2 2 5 1 Z 5 1 Y 2 4 4 X 3 3 6 @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 16 @2001 - João Tavares/JOF 8
FA: Exemplos de Programas em FORTRAN PROGRAM exercicio4 PROGRAMA 3D! ontinuação do exemplo anterior OMMON /FAES/ XOORD(100, 4), LNODE(20), NNODE(20, 8) PARAMETER (MPOIN = 100, MDIME = 4, MF = 20, MN = 8) DIMENSION XOORD(MPOIN, MDIME), LNODE(MF), + NNODE(MF, MN)! Vars locais HARATER*12 FNAME NDIM = 3 IANAL = 20 WRITE (*, '(A\)') ' Nome do ficheiro : ' READ (*, '(A)') FNAME OPEN (IANAL, FILE = FNAME, STATUS = 'OLD') ALL LERDATA(NP, NF, NDIM, IANAL) @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 17 ALL LERDATA(MPOIN, MDIME, MF, MN, NP, NF, NDIM, + IANAL, XOORD, LNODE, NNODE) ESRITA PARA ONTROLO DE LEITURA DO FIHEIRO DE DADOS DO 20 I = 1, NP WRITE (*, 100) I, (XOORD(I, J), J = 1, NDIM) 20 ONTINUE DO 30 I = 1, NF WRITE (*, 110) I, LNODE(I), (NNODE(I, J), J = 1, LNODE(I)) 30 ONTINUE ÁLULO DA ÁREA TOTAL AREAT = 0.0 @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 18 @2001 - João Tavares/JOF 9
FA: Exemplos de Programas em FORTRAN DO 40 I=1, NF NO1 = NNODE(I, 1) X1 = XOORD(NO1, 1) Y1 = XOORD(NO1, 2) Z1 = XOORD(NO1, 3) AREAF = 0.0 DO 35 K = 3, LNODE(I) NO2 = NNODE(I, K-1) NO3 = NNODE(I, K) X2 = XOORD(NO2, 1) Y2 = XOORD(NO2, 2) Z2 = XOORD(NO2, 3) X3 = XOORD(NO3, 1) Y3 = XOORD(NO3, 2) Z3 = XOORD(NO3, 3) A = SQRT((X2-X1)*(X2-X1)+(Y2-Y1)*(Y2- + Y1)+(Z2-Z1)*(Z2-Z1)) @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 19 B = SQRT((X3-X2)*(X3-X2)+(Y3-Y2)*(Y3- + Y2)+(Z3-Z2)*(Z3-Z2)) = SQRT((X1-X3)*(X1-X3)+(Y1-Y3)*(Y1- + Y3)+(Z1-Z3)*(Z1-Z3)) P = (A+B+)/2 AREA = SQRT(P*(P-A)*(P-B)*(P-)) AREAF = AREAF+AREA! Area total da face 35 ONTINUE WRITE (*, 1000) I, AREAF AREAT = AREAT+AREAF! Area total da figura 3D 40 ONTINUE WRITE (*, 1010) AREAT STOP 100 FORMAT (4H No, I4, 3(2X, F11.4)) 110 FORMAT (10I5) 1000 FORMAT (1X, 5HFAE, I4, 5X, 7HAREA =, E12.5) 1010 FORMAT (1X, 13HAREA TOTAL =, E12.5) @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 20 @2001 - João Tavares/JOF 10
FA: Exemplos de Programas em FORTRAN SUBROUTINE LERDATA(MP,MD,MF,MN,NP,NF,NDIM,IAN + AL,XOORD,LNODE,NNODE) *********************************************************** * Subrotina LERDATA, faz a leitura dos dados de um ficheiro * * MP - Número máximo de pontos em XOORD * * MD - Máximo da dimensão (3) * * MF - Número máximo de faces * * MN - Número máximo de pontos por face * * NP - Número de pontos em processamento * * NF - Número de faces em processamento * * NDIM - Dimensão das coordenadas (2 ou 3) * * IANAL - Número de endereço do ficheiro de leitura * * XOORD - Vector de armazenamento das coordenadas dos pontos * * LNODE - Vector onde se guarda o número de pontos por cada face* @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 21 * NNODE - Vector onde se guarda os núm. globais de cada nó da face * *********************************************************** DIMENSION XOORD(MP, MD), LNODE(MF), NNODE(MF, MN) READ (IANAL, *) NP, NF DO 10 I = 1, NP READ (IANAL, *) II, (XOORD(II, J), J = 1, NDIM) XOORD(II, NDIM+1) = 1! Não usado neste exemplo 10 ONTINUE DO 20 I = 1, NF READ (IANAL,*) II, LNODE(II), (NNODE(II, K), K = 1, + LNODE(II)) 20 ONTINUE RETURN @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 22 @2001 - João Tavares/JOF 11
FA: Exemplos de Programas em FORTRAN Output: @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 23 Exemplo V Programa para processamento de uma cadeia de caracteres PROGRAM exemplo5 Programa para leitura duma cadeia de caracteres e conversão desta em todos Maiúsculos ou Minúsculos * Variável de caso: * ISIM = 1 Passagem de minusculas a maiusculas * ISIM = 0 Passagem de maiusculas a minusculas c HARATER*72 LINHA HARATER*1 SIM NL = 72 Questiona da conversão 5 WRITE(*, '(A\)') ' Texto Maiusculas (S)- Minusculas (N)[S]: ' READ (*, '(A)') SIM @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 24 @2001 - João Tavares/JOF 12
FA: Exemplos de Programas em FORTRAN Exemplo V ontrola resposta 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 IF ISIM = 1! Para maiusculas IF (SIM.EQ. 'N'.OR. SIM.EQ. 'n') THEN ISIM = 0! Para minusculas IF Vai ler adeia de aracteres WRITE (*, '(A\)') ' Texto : ' READ (*, '(A)') LINHA @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 25 Exemplo V Vai determinar o número de caracteres significativos 10 IF (LINHA(NL:NL).EQ. ' ') THEN NL = NL-1 GOTO 10 IF onversão caracteres Minusculos --> Maiusculos ou Vice-Versa I = 1 20 IAS = IHAR(LINHA(I:I))! ódigo ASII do caracter IF (IAS.GE. 97.AND. IAS.LE. 122.AND. ISIM.EQ. 1) THEN LINHA(I:I) = HAR(IAS-32)! passa a maiusculo ELSE IF (IAS.GE. 65.AND. IAS.LE. 90.AND. ISIM.EQ. 0) THEN LINHA(I:I) = HAR(IAS+32)! passa a minusculo IF I = I+1 IF (I.LE. NL) GOTO 20 (caracter a partir do código ASII) @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 26 @2001 - João Tavares/JOF 13
FA: Exemplos de Programas em FORTRAN Exemplo V Escreve para o ecrã a cadeia de caracteres já convertida WRITE (*, '(A\)') ' Texto : ' WRITE (*, '(A)') LINHA(1:I) STOP Output @2001 - João Tavares/JOF FA: Exemplos de Programas em FORTRAN 27 @2001 - João Tavares/JOF 14