Baixe o app para aproveitar ainda mais
Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original
NOÇÕES BÁSICAS DE PROGRAMAÇÃO NA LINGUAGEM FORTRAN Prof. Edson Antonio da Silva Departamento de Engenharia Química Curso: Engenharia Química – junho de 1998. 2 I - INTRODUÇÃO A linguagem FORTRAN, a primeira linguagem de programação de alto nível (surgiu em 1956), foi proposta e implementada para auxiliar os programadores na codificação de problemas técnicos e científicos cuja solução requer a utilização de computadores eletrônicos. O FORTRAN é uma das linguagens mais popular e difundida no meio técnico e científico, muitas bibliotecas computacionais na área de matemática estão disponíveis nesta linguagem, destacando-se principalmente a IMSL. NOTAÇÃO: [ ] Os Colchetes indicam de tratar-se de um item opcional. { } As chaves encerram uma lista de itens dos quais somente um item pode ser usado. ... As reticências indicam que o item precedente pode aparecer uma ou mais vezes em sucessão. EXPRESSÕES Uma expressão FORTRAN, é definida como uma combinação de itens sintáticos, isto é: uma expressão pode consistir de uma única constante, de uma única variável, de um único elemento ou conjunto, ou uma combinação de constantes, variáveis, elementos ou conjuntos, unidos com um ou mais operadores. Os operadores especificam as computações a serem realizadas sobre os valores dos elementos básicos. Por exemplo, a expressão: x + z , consiste de duas variáveis unidas pelo operador + TIPOS DE EXPRESSÕES: Aritméticas: produz somente um valor que é sempre um número cujo tipo é real, inteiro ou complexo. Caracteres: produz somente um valor que é sempre uma cadeia de caracteres. Relacionais: produz somente um valor que é sempre uma constante lógica. Lógicas: produz somente um valor que é sempre uma constante lógica. Booleanas: produz somente um valore que é sempre do tipo Booleano. 3 OPERADORES ARITIMÉTICOS Operador Definição Uso do Operador Significado ** Potenciação a**b a elevado a potência b * Multiplicação a*b a multiplicado por b / Divisão a/b a dividido por b + Adição a+b a mais b + Mais unitário +a o mesmo que a - Subtração a-b a menos b - Menos unitário -a a com sinal trocado OPERADOR CARACTERE Operador Definição Uso do Operador Significado // Concatenação a//b a encadeado com b O resultado de uma operação de concatenação é uma cadeia de caracteres encadeando o primeiro operando imediatamente com o segundo operando, sendo seu comprimento igual à soma dos comprimentos dos operandos. Por exemplo o valor de: ‘AB’//’EFG’ , é: ABEFG. OPERADORES RELACIONAIS Operador Definição Uso do Operador Significado .EQ. Igual a a.EQ.b a = b ? .NE. Diferente de a.NE.b a b ? .LT. Menor que a.LT.b a < b ? .LE. Menor ou igual a.LE.b a b ? .GT. Maior que a.GT.b a > b ? .GE. Maior ou igual a.GE.b a b ? 4 OPERADORES LÓGICOS Operador Definição Uso do Operador Significado .NOT. Negação Lógica .NOT.a Complemento de a: se a é verdade, então .NOT.a é falso, se a é falso então .NOT.a. é verdade. .AND. Conjunção lógica a.AND.b Produto Booleano de a por b: se a e b são verdade, então a.AND.b é verdade; se a ou b ou ambos são falsos, então a.AND.b é falso. .OR. Disjunção Inclusivo lógica a.OR.b Soma Booleana de a com b: se a ou b ou ambos são verdade, então a.OR.b é verdade; se a e b são falsos, então a.OR.b é falso. .EQV. Equivalência Lógica a.EQV.b Equivalência lógica de a com b: se a e b são ambos verdade ou ambos falsos, então a.EQV.b é verdade, caso contrário é falso. .NEQV. Não equivalência lógica a.NEQV.b Não equivalência lógica de a com b: se a e b são ambos verdade ou ambos falsos, então a.EQV.b é falso, caso contrário é verdade. EXEMPLOS Se desejarmos testar se o valor da variável A satisfaz a inequação: 100 A , na linguagem FORTRAN devemos utilizar o seguinte procedimento: 0.LE.A.AND.A.GT.10 O computador calcula esta expressão lógica, se ambas as expressões relacionais são verdadeiras então o valor da expressão é .TRUE., caso contrário é .FALSE. . II - COMANDOS PARA DEFINIÇÃO DOS TIPOS DE VARIÁVEIS E FUNÇÕES 2.1 - COMANDO INTEGER O comando INTEGER é usado para declarar, explicitamente, um nome de variável, conjunto de variáveis, constante simbólica, ou de função, como sendo do tipo inteiro. Sintaxe: INTEGER [*s], n1[,ns,].. S Número de bytes, pode ser 1, 2 ou 3. n1 Variável ou função do tipo inteiro n2 Variável do função do tipo inteiro 5 Exemplos: a)- INTEGER*2 a,b,c,d(10) b)- INTEGER*4 FUNCTION IT(A,B) REAL*4 A,B c)- INTEGER K,L,M 2.2 - COMANDO REAL O comando REAL é usado para declarar, explicitamente, um nome de variável, conjunto de variáveis, constante simbólica, ou de função, como sendo do tipo real. Sintaxe: REAL [*s], a1[,as,].. S Número de bytes, pode ser 4 ou 8. a1 Variável ou função do tipo real a2 Variável do função do tipo real Exemplos: a)- REAL*4 a,b,c,d(10) b)- REAL*4 FUNCTION FZ(A,B) REAL*4 A,B c)- REAL A,Z 2.3 - COMANDO COMPLEX O comando COMPLEX é usado para declarar, explicitamente, um nome de variável, conjunto de variáveis, constante simbólica, ou de função, como sendo do tipo COMPLEX. Sintaxe: COMPLEX [*s], a1[,as,]... S Número de bytes, pode ser 4, 8. Ou 16. a1 Variável ou função do tipo complexo a2 Variável do função do tipo complexo Exemplos: a)- COMPLEX*4 a,b,c,d(10) b)- COMPLEX*8 FUNCTION FZ(A,B) 6 2.4 - COMANDO CHARACTER O comando CHARACTER é usado para declarar, explicitamente, um nome de variável, conjunto de variáveis, constante simbólica, ou de função, como sendo do tipo alfa-numérica Sintaxe: CHARACTER [*s], a1[,as,].. S Número de caracteres, deve ser um número inteiro positivo. a1 Variável ou função do tipo alfa-numérica. a2 Variável do função do tipo alfa-numérica. Exemplos: a)- CHARACTER*10 A A = ‘TESTE’ b)- CHARACTER NOME c)- CHARACTER N1*10, N2*20, C*30 2.5 - COMANDO LOGICAL O comando LOGICAL é usado para declarar, explicitamente, um nome de variável, conjunto de variáveis, como sendo do tipo lógica. As variáveis lógicas devem ser .TRUE. (verdadeiro) ou .FALSE. (falso). Sintaxe: LOGICAL [*s], a1[,as,].. S Número de bytes pode ser 1, 2 ou 4. a1 Variável do tipo lógica a2 Variável do tipo lógica EXEMPLO: a)- LOGICAL*2 B,C OBS: A maioria dos compiladores da linguagem FORTRAN não permite que sejam feitas operações entre variáveis de tipo diferentes. Exemplo se a variável J é do tipo INTEGER*2 e a variável A é do tipo REAL*4, então a soma J + A causa um erro durante a execução do programa, portanto se desejarmos que o resultado desta soma seja uma variável do tipo REAL*4 devemos 7 converter a variável J (INTEGER) para uma variável (REAL), através do comando FLOAT, neste caso pode-se realizar a soma destas duas variáveis : FLOAT(J) + A III - COMANDOS PARA DE ENTRADA SAÍDA 3.1 - COMANDO WRITE O comando WRITE é usado para transferir dados da lista para um arquivos externos e internos. Sintaxe: WRITE ( unit, fmt ) lista de variáveis Unit Número que identifica o dispositivo de saída (ARQUIVO, IMPRESSORA, VÍDEO), o dispositivo padrão é o vídeo e identificado pelo símbolo *. Fmt Pode ser um número (LABEL) associado ao formato de saída dos dados ou pode ser utilizado para especificar diretamente o formato da variável a ser transferida, a qual deve ser escrita utilizando os seguintes delimitadores: ‘(tipo do formato)’. Pode-se omitir a especificação do formato (utiliza-se o dispositivo padrão), para isto é necessário utilizar o símbolo *. Exemplos: Se a = 2.30 e b = 323,141415, e ambas as variáveis são do tipo REAL*4, então: a)- WRITE(*,*) a,b Apresenta os seguintes valores de a e b no vídeo: 2.300000 323.1414 b)- WRITE(8,10) a,b 10 FORMAT(3X,’Valor de a = ’, f5.3, 5X,’Valor de b = ’, f6.2) Apresenta a seguinte mensagem na unidade 8 (que pode ser vídeo, impressora ou arquivo): Valor de a = 2.300 Valor de b = 323.14 Se a variável nome = ‘LINGUAGEM FORTRAN’ é do tipo CHARACTER*17, então: c)- WRITE(*,’(A10)’) NOME Apresenta o valor da variável nome com os 10 primeiros caracteres no vídeo: LINGUAGEM 8 3.2 - COMANDO PRINT O comando PRINT é usado para transferir dados da lista para o vídeo. Sintaxe: PRINT fmt, lista de variáveis Fmt Pode ser um número (LABEL) associado ao formato de saída dos dados ou pode ser utilizado para especificar diretamente o formato da variável a ser transferida, a qual deve ser escrita utilizando os seguintes delimitadores: ‘(tipo do formato)’. Pode-se omitir a especificação do formato (utiliza-se o dispositivo padrão), para isto é necessário utilizar o símbolo *. Exemplos: Se a = 2.30 e b = 323,141415, e ambas as variáveis são do tipo REAL*4, então: a)- PRINT*, a,b Apresenta os seguintes valores de a e b no vídeo: 2.300000 323.1414 b)- PRINT 10,a,b 10 FORMAT(3X,’Valor de a = ’, f5.3, 5X,’Valor de b = ’, f6.2) Apresenta a seguinte mensagem no vídeo: Valor de a = 2.300 Valor de b = 323.14 Se a variável JI = 2 do tipo INTEGER*2, então: c)- PRINT ’(I3)’,JI Apresenta o valor da variável JI no vídeo com os 3 dígitos, neste caso os dois primeiros dígitos não são preenchidos (brancos). 3.3 - COMANDO READ O comando READ é usado para adquirir dados de um arquivo ou teclado. Sintaxe: READ ( unit, fmt ) lista de variáveis Unit Número que identifica o dispositivo de entrada (ARQUIVO, TECLADO), o dispositivo padrão é o teclado e identificado pelo símbolo *. Fmt Pode ser um número (LABEL) associado a formato de entrada dos dados ou pode ser 9 utilizado para especificar diretamente o formato da variável a ser transferida, a qual deve ser escrita utilizando os seguintes delimitadores: (‘tipo do formato’). Pode-se omitir a especificação do formato (utiliza-se o dispositivo padrão), para isto é necessário utilizar o símbolo *. Exemplos: a)- READ(*,*) a b)- READ(*,10) b,c 10 FORMAT(3X,f8.6, 5X, f7.6) c)- READ(8,*) A,B 3.4 - COMANDO FORMAT O comando FORMAT é um comando não executável, usado em conjunção com os comandos de entrada e saída formatados. Em outras palavras, o comando FORMAT descreve o formato nos quais os dados devem ser transferidos, especifica o tipo de conversão que os dados devem sofrer entre a representação interna e a representação externa, e pode especificar requisitos de edição necessários para esse formato. Sintaxe: n FORMAT(ef [,ef [,...,ef ]]) N Número (LABEL) associado a formato de entrada ou saída dos dados. Ef Especificação do formato. As especificações do formato de conversão mais usadas no FORTRAN são: [a] Iw Conversão de dados inteiros decimais a É uma constante inteira sem sinal, usada para indicar o número de vezes que a mesma especificação do formato é, repetitivamente usada. Se a for omitida, a especificação será usada somente uma vez. w É uma constante inteira sem sinal e não nula, indicando a largura do campo externo, em caracteres. 10 [a] Fw.d Conversão de dados reais sem expoentes a É uma constante inteira sem sinal, usada para indicar o número de vezes que a mesma especificação do formato é, repetitivamente usada. Se a for omitida, a especificação será usada somente uma vez. w É uma constante inteira sem sinal e não nula, indicando a largura do campo externo, em caracteres. d É uma constante inteira sem sinal, indicando a quantidade de dígitos á direita do ponto decimal interno ao campo w. Na saída todos os valores são arredondados. [a] Ew.d Conversão de dados reais com expoente de simples precisão. a É uma constante inteira sem sinal, usada para indicar o número de vezes que a mesma especificação do formato é, repetitivamente usada. Se a for omitida, a especificação será usada somente uma vez. w É uma constante inteira sem sinal e não nula, indicando a largura do campo externo, em caracteres. d É uma constante inteira sem sinal , indicando a Quantidade de dígitos à direita do ponto decimal interno ao campo w. Na saída todos os dados são arredondados. [a] Dw.d Conversão de dados reais com expoente de dupla precisão. a É uma constante inteira sem sinal, usada para indicar o número de vezes que a mesma especificação do formato é, repetitivamente usada. Se a for omitida, a especificação será usada somente uma vez. w É uma constante inteira sem sinal e não nula, indicando a largura do campo externo, em caracteres. d É uma constante inteira sem sinal , indicando a Quantidade de dígitos à direita do ponto decimal interno ao campo w. Na saída todos os dados são arredondados. 11 [a] Aw Conversão de dados caracteres. a É uma constante inteira sem sinal, usada para indicar o número de vezes que a mesma especificação do formato é, repetitivamente usada. Se a for omitida, a especificação será usada somente uma vez. w É uma constante inteira sem sinal e não nula, indicando a largura do campo externo, em caracteres. CARACTERES DE CONTROLE DE FORMATAÇÃO Símbolo RESULTADO [a] x Avança na apresentação dos dados um total de a caracteres. [a] / Avança uma linha. \ Permite que a apresentação dos dados continue na mesma linha. EXEMPLOS Se a = 34.456767 e b = 0.001312, então: FORMATO A b F9.4 34.4568 0.0013 E10.4 0.3446E+03 0.1312E-02 E12.5 0.34457E+03 0.13120E-02 D10.4 0.3446D+03 0.1312D-02 Se N = 23, J =356, K=-13, então: Variável FORMATO N I2 J I3 K I3 Se NOME = ‘teste de programação, então: FORMATO RESULTADO A10 teste de p A5 teste 12 IV- COMANDOS DE CONTROLE DE FLUXOS 4 .1 - COMANDO IF Os comandos executáveis IF transferem o controle de fluxo ou executam outro comando (ou um bloco de comandos) dependendo da condição dada como resultado de uma expressão contida no particular comando IF. Os três tipos de IF são: IF aritmético. IF lógico. IF bloco. i)- IF ARITIMÉTICO O comando IF aritmético, transfere o controle de fluxo par um dos três comandos numerados, dependendo do valor de uma expressão aritmética contida no IF. IF (e) n1,n2,n3 E É uma expressão aritmética do tipo inteiro, real ou dupla precisão. n1,n2,n3 São rótulos (LABEL) que identificam as linhas os quais devem ser desviados de acordo com o valor do resultado da expressão aritmética e. e<0 Desvia o controle para a linha identificada por n1. e=0 Desvia o controle para a linha identificada por n2. e>0 Desvia o controle para a linha identificada por n3. EXEMPLO IF(K**2 – 2*K + 10 ) 40,60,20 EXPRESSÃO: K**2 – 2*K + 10 EFEITO Negativa Igual a zero Positiva Desvio o programa para a linha identificada com rótulo 40. Desvio o programa para a linha identificada com rótulo 60. Desvio o programa para a linha identificada com rótulo 20. ii)- IF LÓGICO O comando IF lógico, executa ou ignora um comando executável contido no próprio IF de acordo com o resultado da expressão lógica. IF (e) c E É uma expressão lógica. 13 C É qualquer comando executável FORTRAN, exceto um comando DO ou qualquer dos comandos IF. EXEMPLOS a)- IF(A.GT.1.2) K = K + 1 Efeito: Se após o cálculo da expressão lógica A>1.2 o resultado for .TRUE. (verdadeiro) então executa-se o seguinte operação matemática: K = K + 1. b)- IF(J.EQ.1) call soma(n,res) Efeito: Se após o cálculo da expressão lógica J=1 o resultado for .TRUE. (verdadeiro) então executa-se o seguinte comando call soma(n,res), isto é a subprograma soma será executado. iii)- IF BLOCO O comando IF bloco, executa condicionalmente, blocos ou grupos de comandos executáveis. If(e1) THEN Bloco (1) ELSE IF(e2) THEN Bloco (2) ELSE Bloco (3) END IF Se a expressão lógica (e1) for verdadeira o bloco1 é executado. Se a expressão lógica (e1) for falsa e a expressão (e2) for verdadeira o bloco2 é executado. Se ambas as expressões lógicas (e1) e (e2) são falsas, então o bloco3 é executado. EXEMPLO IF(DELTA.GT.0) THEN X1 = (-B+DELTA)/(2.0*A) X2 = (-B+DELTA)/(2.0*A) AR = ‘Raizes distintas’ ELSE IF(DELTA.EQ.0.) THEN X1 = -B/(2.0*A) X2 = X1 AR = ‘Raizes repetidas’ ELSE Z1 = CMPLX ( B/(2.0*A), (-DELTA) **0.5 /(2.0*A) ) Z2 = CMPLX ( -B/(2.0*A),(-DELTA) **0.5 /(2.0*A) ) AR = ‘Raizes complexas’ END IF 14 4.2 - COMANDO DO O comando DO é um comando de controle que permite que uma seqüência de comandos seja repetitivamente executada enquanto o valor da variável de controle estiver entre os limites especificados. DO k=nstart, nend[,step] Bloco (1) END DO k É uma variável de controle do tipo inteiro. nstart É o parâmetro inicial de k. nend É o parâmetro inicial de k. nstep É o parâmetro de incremento de k. EXEMPLO: Desejamos calcular o valor da variável s, a qual é definida pela seguinte expressão : )9(x)7(x)5(x)3(x)1(xs DO J=1,9,2 S = S + X(J) END DO 4.3 - COMANDO DO WHILE O comando DO é um comando de controle que permite que uma seqüência de comandos seja repetitivamente executada enquanto a expressão lógica permanecer verdadeira .TRUE. . DO WHILE (expressão lógica) Bloco (1) END DO Enquanto a expressão lógica for verdadeira a seqüência de comandos representada pelo bloco (1) é executada. EXEMPLO: se desejarmos que seja apresentado todos os valores da variável K, a qual pode assumir os seguinte conjunto de valores: 1,2,3,4,5,6,7,8,9,10, podemos utilizar dos seguintes comandos: INTEGER K K = 0 DO WHILE (K.LT.10) K = K + 1 PRINT *,K END DO END 15 4.4 - COMANDO CASE O comando CASE é um comando de controle que permite que uma seqüência de comandos seja executada se o valor da variável de controle estiver entre os limites especificados. SELECT CASE ( Variável do tipo inteiro) CASE (Seleção do caso) Bloco 1 CASE DEFAULT Bloco 2 END SELECT O bloco do CASE DEFAULT é opcional. A declaração da seleção do caso pode assumir uma das quatro formas: (valor igual) (valor inferior:) (:valor superior) (valor inferior: valor superior) EXEMPLO integer n character*20 a read(*,*) n select case(n) case(:4200) a = 'Regime Laminar' case(4201:12000) a = 'Regime de Transicao' case default a = 'Regime Turbulento' end select print *,a end O Bloco 1 é executado se a seguinte expressão (1) for verdadeira 4200n . O Bloco 2 é executado se a seguinte expressão (2) for verdadeira 12000n4201 . O Bloco 3 é executado se as expressões (1) e (2) forem falsas. 4.5 - COMANDO PAUSE Suspende temporariamente a execução do programa e permite que seja executado operações do sistema operacional durante a suspensão. 16 4.6 - COMANDO STOP O comando executável STOP termina a execução do programa, pode exibir uma informação no vídeo. STOP [‘ mensagem’] EXEMPLO STOP ‘PROGRAMA ABORTADO’ 4.7 - COMANDO END O comando END indica o final físico de uma unidade de programa para o compilador. Um programa na linguagem FORTRAN tem dois pontos terminais. O primeiro é um ponto terminal lógico, indicando o fim da execução do programa. Esse terminal lógico é indicado pelo comando STOP. O segundo ponto terminal é o ponto terminal físico, indicando o fim do processo de compilação. Esse ponto terminal físico é indicado pelo comando END, que deve ser o último comando numa unidade de programa FORTRAN. A forma geral do comando END é: END Cada unidade de programa (isto é, um programa principal, um subprograma FUNCTION, um subprograma SUBROUTINE) deve conter um e somente um comando END. V- SUPROGRAMAS Um subprograma, é uma seqüência de instruções ou comandos que fazem parte de um programa. Tanto o programa principal como os subprogramas são conhecidos como unidades de programas. Uma unidade de programa FORTRAN contém uma seqüência de comandos FORTRAN que define um procedimento computacional. Uma unidade de programa FORTRAN sempre deve terminar com um comando END. As unidades de programa podem, então ser compiladas independentemente uma das outras, porém um subprograma não pode ser executado a não ser através de um programa principal. 5.1 – FUNÇÕES INTRÍNSECAS As funções intrínsecas são procedimentos que já estão definidos, e seu códigos estão incluídos numa biblioteca de funções. 17 FUNÇÕES DE CONVERSÃO DE TIPO Nome Específico Tipo de argumento Resultado IDINT(var) Real*8 Integer*4 INT(var) Integer, Real ou Complex. Integer*4 INT1(var) Integer, Real ou Complex. Integer*1 INT2(var) Integer, Real ou Complex. Integer*2 INT4(var) Integer, Real ou Complex. Integer*4 EXEMPLO 10 REAL*4 A COMPLEX B INTEGER*2 A = 2.64 B = (4.04,3.4) C = INT(A) D =INT(B) PRINT 10,C,D FORMAT(3X,’VALOR DE C = ‘,I2,3X,’VALOR DE D =’,I2) END EFEITO: No vídeo será apresentado os seguintes valores para as variáveis C e D: VALOR DE C = 2 VALOR DE D = 3 Nome Específico Tipo de argumento Resultado DFLOAT (var) Integer, Real ou Complex Real*8 FLOAT(var) Integer Real*4 DBLE (var) Integer, Real ou Complex Real*8 Nome Específico Tipo de argumento Resultado CMPLX (var) Integer, Real ou Complex Complex*8 DCMPLX(var) Integer,Real ou Complex Complex*16 Nome Específico Tipo de argumento Resultado CHAR (var) Integer, Real ou Complex Inteiro FUNÇÕES TRIGONOMÉTRICAS NOME Definição Argumento Resultado SIN (x) Seno em radianos Real or complex REAL*4 SIND (x) Seno em graus Real or complex REAL*4 CSIN (x) Sine (radianos) COMPLEX*8 COMPLEX*8 CDSIN (x) Seno (radianos) COMPLEX*16 COMPLEX*16 DSIN (x) Seno (radianos) REAL*8 REAL*8 DSIND (x) Seno (graus) REAL*8 REAL*8 18 ASIN (x) Arcseno (radianos). Retorna com valor no intervalo [2, 2 ] Real, x 1 REAL*4 ASIND (x) Arcseno (graus) Retorna com valor no intervalo [90, 90 ] Real, x 1 REAL*4 DASIN (x) Arcseno (radianos) Retorna com valor no intervalo [2, 2 ] REAL*8 REAL*8 DASIND (x) Arcseno (graus) Retorna com valor no intervalo [90, 90 ] REAL*8 REAL*8 COS (x) Coseno (radianos). Se x é complexo, sua parte real é considerada como o valor em radianos. Real or complex REAL*4 COSD (x) Coseno (graus). Se x é complexo, sua parte real é considerada como o valor em radianos. Real or complex REAL*4 CCOS (x) Coseno (radianos) COMPLEX*4 COMPLEX*4 CDCOS (x) Coseno (radianos) COMPLEX*8 COMPLEX*8 DCOS (x) Coseno (radianos) REAL*8 REAL*8 DCOSD (x) Coseno (graus) REAL*8 REAL*8 ACOS (x) Arco coseno (radianos) Retorna com valor no intervalo [ 0, ] Real, x 1 REAL*4 ACOSD (x) Arco coseno (graus) Retorna com valor no intervalo [ 0, 180 ] Real, x 1 REAL*4 DACOS (x) Arco coseno (radianos) Retorna com valor no intervalo [ 0, ] REAL*8, x 1 REAL*8 DACOSD (x) Arco coseno (graus) Retorna com valor no intervalo [ 0, 180 ] REAL*8, x 1 REAL*8 TAN (x) Tangente (radianos) Real REAL*4 TAND (x) Tangente (graus) Real REAL*4 DTAN (x) Tangente (radianos) REAL*8 REAL*8 DTAND (x) Tangente (graus) REAL*8 REAL*8 COTAN (x) Cotangente (radianos) Real. x não pode ser 0. REAL*4 DCOTAN (x) Cotangente (radianos) REAL*8. x não pode ser 0. REAL*8 ATAN (x) Arco tangente (radianos). Retorna com valor no intervalo [2, 2 ] Real REAL*4 ATAND (x) Arco tangente (graus). Retorna com valor no intervalo [90, 90 ] Real REAL*4 DATAN (x) Arco tangente (radianos). Retorna com valor no intervalo [2, 2 ] REAL*8 REAL*8 DATAND (x) Arco tangente (graus). Retorna com valor no intervalo [90, 90 ] REAL*8 REAL*8 ATAN2 (y,x) Arco tangente (y / x) em radianos. Retorna com valor no intervalo [, ] Real. x e y não podem ambos ser 0. REAL*4 ATAN2D (y,x) Arco tangente (y / x) em graus. Retorna com valor no intervalo Real. x e y não podem ambos ser 0. REAL*4 19 [180, 180 ] DATAN2 (y,x) Arco tangente (y / x) em radianos. Retorna com valor no intervalo [, ]) REAL*8 x e y não podem ambos ser 0. REAL*8 DATAN2D (y,x)¤ Arco tangente (y / x) em graus. Retorna com valor no intervalo [180, 180 ] REAL*8 x e y não podem ambos ser 0. REAL*8 FUNÇÕES HIPERBÓLICAS NOME Definição Argumento Resultado SINH (x) Hipérbolico seno (radianos) Real REAL*4 DSINH (x) Hipérbolico seno (radianos) REAL*8 REAL*8 COSH (x) Hipérbolico coseno (radianos) Real REAL*4 DCOSH (x) Hipérbolico coseno (radianos) REAL*8 REAL*8 TANH (x) Hipérbolico tangente (radianos) Real REAL*4 DTANH (x) Hipérbolico tangente (radianos) REAL*8 REAL*8 FUNÇÕES EXPONENCIAL E LOGARTIMICA NOME Definição Argumento Resultado CEXP (x) Cálculo da função exponencial COMPLEX*8 COMPLEX*8 DEXP (x) Cálculo da função exponencial REAL*8 REAL*8 EXP (x) Cálculo da função exponencial REAL*4 REAL*4 ALOG (x) Cálculo da função logarítmica na base e REAL*4 REAL*4 CDLOG (x) Cálculo da função logarítmica na base e COMPLEX*16 COMPLEX*16 CLOG (x) Cálculo da função logarítmica na base e COMPLEX*8 COMPLEX*8 DLOG (x) Cálculo da função logarítmica na base e REAL*8 REAL*8 LOG (x) Cálculo da função logarítmica na base e Real or complex Real or complex ALOG10 (x) Cálculo da função logarítmica na base 10 REAL*4 REAL*4 DLOG10 (x) Cálculo da função logarítmica na base 10 REAL*8 REAL*8 LOG10 (x) Cálculo da função logarítmica na base 10 REAL*4 REAL*4 EXEMPLO: Se desejarmos calcular as seguintes expressões matemáticas: )xln(y , alogv e xez , onde: y,v e z são do tipo REAL*4, então devemos utilizar das seguintes funções: y = LOG(x) v = LOG10(a) 20 z = EXP(x) FUNÇÕES MÁXIMO E MÍNIMO Funções de mínimo Retorna com o menor valor a partir de um conjunto de variáveis Função Argumento Resultado AMIN0 ( a1, a2 [ , a3,...] ) INTEGER*4 REAL*4 AMIN1 ( a1, a2 [ , a3,...] ) REAL*4 REAL*4 DMIN1 ( a1, a2 [ , a3,..] ) REAL*8 REAL*8 MIN ( a1, a2 [ , a3,...] ) INTEGER OR REAL INTEGER OR REAL MIN0 ( a1, a2 [ , a3,...] ) INTEGER*4 INTEGER*4 MIN1 ( a1, a2 [ , a3,...] ) REAL*4 INTEGER*4 EXEMPLOS: MIN(3,5) = 3 MIN(2.1,3.5)=2.1 MIN1(3.1,4.1,-2.1) = -2 Funções de máximo Retorna com o maior valor a partir de um conjunto de variáveis Função Argumento Resultado AMAX0 (a1, a2 [ , a3,...] INTEGER*4 REAL*4 AMAX1 (a1, a2 [ , a3,...] REAL*4 REAL*4 DMAX1 (a1, a2 [ , a3,...] REAL*8 REAL*8 MAX (a1, a2 [ , a3,...] INTEGER OR REAL INTEGER OR REAL MAX0 (a1, a2 [ , a3,...] INTEGER*4 INTEGER*4 MAX1 (a1, a2 [ , a3,...] REAL*4 INTEGER*4 EXEMPLOS: MAX(2,5) = 5 MAX(7.1,3.5)=7.1 MAX1(6.1,8.5,-2.1) = 8 OUTRAS FUNÇÕES INTRINSÍNSECAS i)- CALL TIME (string) A subrotina TIME retorna com uma com a hora no seguinte formato: hh:mm:sss, onde hh é a hora, mm são os minutos e sss são os centésimos de segundos. EXEMPLO: character*15 horas call time(horas) print *,horas Efeito: É apresentado no vídeo a seguinte mensagem: 20:01:003 21 ii)- CALL DATE(string) A subrotina DATE retorna com uma com a data no seguinte formato: :dd-mmm-yy, onde hh é o dia (número inteiro com dois dígitos), mmm a abreviação do mês correspondente (Três caracteres),. yy é o ano correspondente com dois dígitos. EXEMPLO: character*15 tempo call date(tempo) print *,tempo Efeito: É apresentado no vídeo a seguinte mensagem: 29-jun-98 5.2 – FUNÇÕES EXTERNAS Desde que as funções intrínsecas estão contidas numa biblioteca do compilador FORTRAN, pode acontecer do usuário necessitar de utilizar de uma função que não esteja disponível na biblioteca, neste caso é necessário escrever sua própria função. Um subprograma função FUNCTION é usado do mesmo modo da função intrínseca. A diferença é que o usuário é quem deve escrever o subprograma FUNCTION. 5.2.1 - COMANDO FUNCTION O comando FUNCTION deve aparecer como o primeiro comando num subprograma FUNCTION. Tipo FUNCTION nome (argumento) Tipo INTEGER*2, INTEGER*4, REAL*4, REAL*8, COMPLEX*8, COMPLEX*16, CHARACTER[*comprimento] Nome É o nome do subprograma FUNCTION Argumento É um argumento que pode ser o nome de uma variável, o nome de um conjunto de variáveis, ou mudo. Todo subprograma FUNCTION deve terminar com os comandos: RETURN e END. i)- EXEMPLO: Suponha que desejamos resolver a seguinte expressão: n 1i i . INTEGER FUNCTION SUM(N) INTEGER N SUM = 0 DO I=1, N SUM = SUM + I END DO RETURN END 22 ii)- EXEMPLO: Suponha que temos um problema termodinâmico na qual seja necessário calcular muitas vezes a pressão de vapor do álcool etílico em diversas temperaturas utilizando a equação de Antoine, neste caso é conveniente construir uma função que permita fazer este cálculo. A equação de ANTOINE para este caso é CT B AexpP , os valores das constantes são: A = 18.3036, B = 3816.44 e C = -46.13. Onde a pressão em (mmHg) e a Temperatura em (K). DEFINIÇÃO DA FUNÇÃO REAL*4 FUNCTION PVAP(T) REAL*4 T REAL* 4 A,B,C A = 18.3036 B = 3816.44 C = -46.13 PVAP = EXP( A - B / (T + C ) ) RETURN END CHAMADA DA FUNÇÃO NO PROGRAMA PRINCIPAL REAL*4 T1,T2,P1,P2 REAL*4 PVAP EXTERNAL PVAP T1 = 300.0 P1 = PVAP(T1) ! Calcula a pressão de vapor na temperatura de 300 K ! T2 = 350.0 P2 = PVAP(T2) ! Calcula a pressão de vapor na temperatura de 350 K ! END ATIVIDADES: i)- Desenvolva uma função que permite o cálculo do fatorial. (n!) ii)- Desenvolva uma função para o cálculo da pressão, volume específico e temperatura utilizando a equação dos gases ideais. P V = R T. onde: P(atm), V(cm 3 /gmol) , T(K) e R = 82,05 cm 3 atm / mol K. 5.2.2 - COMANDO EXTERNAL EXTERNAL [LISTA DE NOMES] Identifica uma subrotina ou função escrita pelo próprio usuário em vez de uma função intrínseca. O comando EXTERNAL somente pode aparecer em unidades de programa que enviam argumentos representando por nomes de subprogramas (FUNCTION ou SUBROUTINE) 23 EXEMPLO: REAL*4 PVAP EXTERNAL PVAP END REAL*4 FUNCTION PVAP(T) REAL*4 T RETURN END 5.2.3 - COMANDO SUBROUTINE O comando SUBROUTINE deve aparecer como o primeiro comando num subprograma SUBROUTINE. Este comando contém o nome simbólico que é o ponto principal de entrada do subprograma. A forma geral deste comando é: SUBROUTINE NOME (argumento) Nome É o nome do subprograma SUBROUTINE Argumento É um argumento que pode ser o nome de uma variável, o nome de um conjunto de variáveis, ou mudo. Todo subprograma SUBROUTINE deve terminar com os comandos: RETURN e END. O comando SUBROUTINE é essencial para o desenvolvimento de programas estruturados, pois este comando permite que o programa principal seja desmembrado em vários subprogramas, ficando mais fácil de se trabalhar na montagem do programa principal. Usualmente somos deparados com problemas matemáticos aplicados a engenharia na qual uma das etapas é a resolução do sistema de equações lineares. Então é conveniente construir um subprograma utilizando o comando SUBROUTINE para a resolução de sistemas de equações, portanto se necessitarmos de tal ferramenta podemos simplesmente dentro do programa principal chamar este subprograma, para isto utilizaremos um outro comando denominado de CALL. O tipo dos argumentos utilizados na chamada do subprograma deve ser idêntica ao utilizado na definição da subroutine. SUBPROGRAMA SUBROUTINE SOMA(N,SUM) INTEGER N REAL*4 SUM SUM = 0.0 DO I=1,N SUM = SUM + FLOAT(I) END DO RETURN END 24 PROGRAMA PRINCIPAL 10 20 INTEGER NN REAL* 4 S EXTERNAL SOMA WRITE(*,10) FORMAT(3X,’Entre com o valor de n = ‘\) READ(*,*) N CALL SOMA(NN,S) WRITE(*,20) S END Uma dúvida muito comum quando inicia-se a programação na linguagem FORTRAN é se existe a necessidade de que os nomes dos argumentos na chamada do subprograma (comando CALL) sejam idênticos ao da definição (SUBROUTINE). Como podemos observar do exemplo anterior não existe esta necessidade, por exemplo: quando definirmos a variável NN=5.no programa principal, ao utilizar o comando CALL SOMA(NN,S), será atribuído o valor 5 para a variável NN, valor este que será armazenado na variável N na SUBROUTINE SOMA, portanto quando chamamos um subprograma com o comando CALL serão transferidos os valores das variáveis. SUBROUTINE SOMA(N,SUM) CALL SOMA(NN,S) É importante observar que o tipo e a seqüência das variáveis nos comandos SUBROUTINE e CALL deverão ser obrigatoriamente os mesmos, como podemos observar na tabela abaixo. COMANDO VARIÁVEL TIPO SUBROUTINE SOMA(N,SUM) N SUM INTEGER REAL*4 CALL SOMA(NN,S) NN S INTEGER REAL*4 Caso não seja respeitado o tipo e a seqüência das variáveis, ocorrerá um erro de lógica, que é mais difícil de se encontrar. Para ilustrarmos, tomemos o seguinte exemplo: se no programa principal definirmos a variável S como do tipo REAL*8, sendo que no SUBPROGRAMA SOMA, a variável SUM é do tipo REAL*4, ao compilar o programa não detectado nenhum tipo de erro, contudo ao executar este programa poderemos observar que valor retornado na variável S não está correto em função dos tipos das variáveis serem diferentes (REAL*4 SUM, REAL*8 S), ocasionando então um erro de lógica. ii)- Desenvolva uma função que permite o cálculo do fator de compressibilidade utilizando a equação de Redlich-Kwong: 25 h1 h T 934,4 h1 1 Z 5,1 r , r r TZ P0867,0 h , c r T T T e c r P P P . Dados para o teste da subrotina: substância: n-butano: T = 460 K , P = 15 atm, Tc = 425,2 K , Pc = 37,5 atm e tolerância = 1,0x10 -4 . Valor de Z encontrado: 0,884214. FLUXOGRAMA DE REDLICH-KWONG Entre com T, P , Tc, Pc e TOL Calcule Tr, Pr Z=1, ERRO=1 Cálculo de h Cálculo de Zn Erro= abs(Z-Zn) Tol> Erro Z = Zn NÃO SIM Apresente o valor de Z 26 5.2.4 - COMANDO CALL O comando CALL é chamado para executar um subprograma SUBROUTINE. A forma geral deste comando é: CALL NOME (argumento) Nome É o nome do subprograma SUBROUTINE Argumento É um argumento que pode ser o nome de uma variável, o nome de um conjunto de variáveis, ou mudo. EXEMPLO: Construção de uma subrotina para o cálculo de fatorial. SUBROUTINE FATORIAL(N,RES) INTEGER N REAL*4 RES IF(N.EQ.0) THEN FAT = 1.0 IF ELSE(N.GE.1) THEN FAT = 1.0 DO I=1,N FAT = FAT*FLOAT(I) END DO ELSE STOP(‘NÃO EXISTE FATORIAL DE NUMERO NEGATIVO’) END IF RETURN END 10 20 REAL*4 FAT INTEGER N PRINT 10 FORMAT(3X,’Entre com o valor de n = ‘,\) READ(*,*) N CALL FATORIAL(N,FAT) PRINT 20, N,FAT FORMAT(3X,I4,’! = ‘,F9.6 END ATIVIDADES: Desenvolva uma subprograma utilizando o comando SUBROUTINE para encontrar a raiz de uma equação utilizando o método de NEWTON-RAPHSON. Objetivo: Encontrar o valor de x, tal que: 0)x( )x(' )x( xx )n( )n( )n()1n( onde: )n(x : valor de x na interação (n) 27 )1n(x : valor de x calculado na interação (n+1) )x( : Função na qual deseja-se encontrar a raiz da equação. )x(' : Derivada da função na qual deseja-se encontrar a raiz da equação. Critério de parada: Tolxx )n()1n( Os seguintes argumentos devem ser utilizados na construção desta subrotina: XI Estimativa inicial para o cálculo da raiz. XF Valor da raiz encontrada pelo método de Newton-Raphson. TOL Tolerância FUN Função na qual deseja-se encontrar a raiz. DFUN Derivada da função na qual deseja-se encontrar a raiz. EXEMPLO: 4x)xln()x( 1 x 1 )x(' , com x (1) = 2.0. N o de iterações )n(x )1n(x )x( )n( )x( )1n( Erro 1 2.000000 2.871235 1.306853 -1.348282 8.712351E-01 2 2.871235 2.926136 7.402257E-02 -1.341748 5.490136E-02 3 2.926136 2.926271 1.805562E-04 -1.341732 1.344681E-04 4 2.926271 2.926271 1.350883E-07 -1.341732 0.000000E+00 6 – COMANDOS DE ESPECIFICAÇÃO: DESIGNAÇÃO DE ÁREAS DE MEMÓRIA 6.1 – COMANDO DIMENSION Quando se trabalha com um conjunto de variáveis, por exemplo: os elementos de uma matriz n,n n,2 n,1 3,n 3,2 3,1 2,n 2,2 2,1 1,n 1,2 1,1 nxn a a a a a a a a a a a a A , ou um vetor X com n elementos: n321 xx,x,xX . Em ambos os casos é necessário reservar uma área de memória para estas variáveis. 28 O comando DIMENSION especifica nomes simbólicos como nomes de conjuntos, define o número de dimensões em cada conjunto, e especifica os limites de cada dimensão. A forma geral deste comando é: DIMENSION c1(d1[,d2],...]) [, c2(d3[,d4],...])]... c1 e c2 Nome do conjunto de variáveis d1 e d2 Números inteiros que indicam a dimensão do conjunto de variáveis c1, cada. d3 e d4 Números inteiros que indicam a dimensão do conjunto de variáveis c2. A especificação dos limites de cada índice do conjunto, pode ocorrer em duas formas: Superior ou Inferior : superior Superior: Especifica o limite superior da dimensão e deve ser sempre especificado. Inferior: Especifica o limite inferior da dimensão, sendo opcional. Se o valor da dimensão for omitido (em conjunto com :), seu valor é considerado igual a 1. O comando DIMENSION designa uma área de memória a cada elemento em cada dimensão de um conjunto. O número total de áreas designadas a um conjunto é igual ao produto dos valores dos declaradores de dimensão para esse conjunto. EXEMPLOS DIMENSION A(10,10),X(5) DIMENSION Y(-4:5,4:20),Z(2:5,4:7,6) Uma forma equivalente de declarar um conjunto de variáveis sem utilizar o comando DIMENSION, consiste em declarar a dimensão junto com os comandos de especificação dos tipos de variáveis . EXEMPLOS Real*4 A(10,10),X(5),Y(-4:5,4:20) Integer Z(2:5,4:7,6) 6.2 – COMANDO PARAMETER O comando PARAMETER representa uma constante através de um símbolo e declara seu valor. O comando PARAMTER é um comando não executável, e deve ser escrito entre os comandos de especificação. PARAMETER ( n1=v1 [ , n2=v2 ] ...) n1 e n2 Nomes das variáveis v1 e v2 Valores atribuídos as variáveis n1 e n2 respectivamente. 29 EXEMPLOS real*4 gc, densidade integer n parameter ( gc = 32.2, densidade = 1.3 , n = 10) Uma vez que o nome simbólico de uma constante tenha sido definido através de um comando PARAMETER, ele pode ser usado em qualquer unidade do programa, exceto como parte da especificação de um formato. Uma questão importante a ser analisada é qual a diferença entre uma constante simbólica, definida por um comando de atribuição e a definida por um comando PARAMETER. A diferença é que uma vez definido o valor de uma constante simbólica, não é possível redefini-la, além disto a especificação da dimensão de um conjunto variáveis somente é permitido através da utilização de constantes simbólicas utilizando o comando PARAMETER. EXEMPLOS i)- integer n, w parameter (n =10, w = 20) real*4 a(n,n),x(n) character*15 nome(w) ii)- Resolução de sistemas de equações cuja a matriz dos coeficientes é triangular superior, isto é, os elementos abaixo da diagonal são todos nulos, como apresentado no exemplo abaixo. n 3 2 1 n 3 2 1 n,n n,3 n,2 n,1 1n,3 1n,2 1n,1 3,3 3,2 3,1 2,2 2,11,1 b b b b x x x x a a a a 0 a a a 0 a a a 0 0 a a 0 0 0 a De maneira sintética podemos escrever a seguinte equação: BAX , onde: n,n n,3 n,2 n,1 1n,3 1n,2 1n,1 3,3 3,2 3,1 2,2 2,11,1 nxn a a a a 0 a a a 0 a a a 0 0 a a 0 0 0 a A , n 3 2 1 x x x x X e n 3 2 1 b b b b B O problema original consiste em encontrar os valores das variáveis X, tal que BAX , onde A é uma matriz triangular superior. Pode-se empregar o seguinte algoritmo para a resolução deste Problema: n,nnn a/bx 30 Para 1,1ni temos: i,i 1i nj j,ijii a/axbx Apresentamos a seguir uma subprograma para a resolução de sistema de equações cuja matriz seja triangular superior: I C C C C C C C C C Subroutine resol_as(A,X,B,N) Integer n Real*4 a(n,n), X(n), B(n) ----- resolucao de uma sistema de equacoes lineares: AX=B ------- ----- onde a matriz A e triangular superior --------- A: Matriz dos coeficientes B: Vetor constante X: Vetor incógnita N: Número de incognitas x(n) = b(n)/a(n,n) do i=n-1,1,-1 soma = 0.0 do j=n,i+1,-1 soma = soma + x(j)*a(i,j) end do x(i) = (b(i) –soma)/a(i,i) end do return end ATIVIDADES: i)- Resolva o seguinte sistema de equações: 4 4 5 1 x x x x 4 2 4 2 0 1 1 2 0 0 1 2 0 0 0 1 4 3 2 1 Resultado: )1,2,3,1(XT ii)- Desenvolva uma subrotina para a resolução de sistemas lineares utilizando o método da eliminação de Gauss. O método da eliminação de Gauss consiste em transformar a matriz dos coeficientes Anxn em uma matriz equivalente triangular superior (matriz escalonada) e encontrar a solução, a matriz equivalente tem a mesma solução da matriz original. Método da eliminação de Gauss 1n,1k 31 n,1ki k,kk,i a/am kii bmbb n,1kj j,kj,ij,i amaa Resolução do sistema (matriz triangular superior) n,nnn a/bx Para 1,1ni temos: i,i 1i nj j,ijii a/axbx OBS: Quando o elemento pivô da matriz dos coeficientes ( k,ka ) é nulo, não é possível aplicar o método da eliminação de Gauss (divisão por zero k,kk,i a/am ). Além disso, quando o elemento pivô tem um valor muito pequeno quando comparado com os demais elementos da coluna k das linhas não escalonadas da matriz A, podem ocorrer problemas de instabilidade numérica que afetam os valores das incógnitas (vetor X) encontrados. pelo método da eliminação de Gauss. Para contornar este problema é conveniente realizar a estratégia de pivotação parcial na matriz A. Esta técnica consiste em encontrar o elemento k,pa das linhas não escalonadas, tal que: k,jk,p aa .com n,kj e trocar as linhas pk LL . EXEMPLO: 4 2 4 2 3 1 1 2 9 3 4 2 0 0 0 1 , neste caso 2k . Neste caso observamos que 2,j2,4 aa , para 4,3,2j . Portanto deve-se trocar as linhas: 42 LL , obtendo-se a seguinte matriz equivalente. 4 2 4 2 1 1 3 2 4 3 9 2 0 0 0 1 iii)- Desenvolva uma subrotina para a resolução de sistemas lineares utilizando o método da eliminação de Gauss com pivotação parcial. 32 ALGORITMO DA PIVOTAÇÃO PARCIAL. ELEMENTO PIVÔ k,ka k,kav kp n,1kr se k,rav , então: rp se kp , então: kbd pk bb dbp n,kj j,kac j,pj,k aa ca j,p Para testar o programa utilize o seguinte exemplo: 6 2 12 8 x x x x 13 11 30 13 13 41 12 21 4 3 2 1 4,3,2,1XT . 6.3 – COMANDO DATA O comando DATA inicializa uma variável, cujo valor pode ser alterado durante a execução do pro1grama. O comando DATA é um comando não executável, e deve ser escrito entre os comandos de especificação. DATA n1list/ v1list/ [ , n2list/ v2list/...] n1list e n2list Lista de variáveis a ser inicializadas. v1list e v2list Valores a serem atribuídos a conjunto de variáveis n1list e n2list respectivamente. EXEMPLOS Real*4 a,b,c,n1,n2 Data a,b,c/1.2,3.4,4.12/,n1,n2/5,10/ Tem o mesmo efeito a atribuição: A = .12 B = 3.4 33 C = 4.12 N1 = 5 N2 = 10 6.4 – COMANDO COMMON O comando COMMON está diretamente ligado a utilização de subprogramas FUNCTION e SUBROUTINE, que são unidades de programas independentes no sentido do processo de compilação, isto é, são compilados separadamente do .programa principal. Isto significa que uma variável X pode ser usada para uma finalidade no programa principal e pode ter uma finalidade diferente do subprograma. A forma de transferência de valores das variáveis dos subprogramas FUNCTION e SUBROUTINE ocorrem mediante a lista de argumentos destes comandos, contudo existe uma outra forma de transferir informações entre os subprogramas, através do comando COMMON, que define um bloco de memória comum. COMMON /n1/ l1/ [ ,/n2/ l2...] n1 e n2 Nomes simbólicos, chamado rótulo ou bloco comum. l1 e l2 Lista das variáveis a serem incluídas no bloco comum. EXEMPLOS Real*4 a,b,c,n1,n2 COMMON /Bloco1/a,b,c,n1,n2 Real*8 Z,X Integer n,k Character*20 nome COMMON /Bloco2/z,x,/bl3/n,k,nome 7– ABERTURA, LEITURA E GRAVAÇÃO DE ARQUIVOS EXTERNOS 7.1 – COMANDO OPEN Inicializa um arquivo de forma que as operações de entrada e saída podem ser executadas. O comando OPEN pode ser usado para: 1. Associar um arquivo existente com um número de entrada e saída. 2. Criar um arquivo novo e associa-lo com um número de entrada e saída. O comando OPEN permite a utilização de uma série parâmetros, apresentaremos na sua forma mais comum e simplificada de utilização. Sua forma geral é: OPEN ( UNIT = u, ACCESS= a ,FILE = f, STATUS=s) u Número inteiro maior ou igual a zero, este parâmetro associa um número a um dispositivo de entrada e saída. 34 a ‘APPEND’ Especifica que o arquivo está sendo aberto para acesso seqüencial, caso exista um arquivo com o mesmo valor do parâmetro FILE, as informações contidas neste arquivo não são perdidas quando acrescenta-se novos dados a este arquivo. ‘SEQUENTIAL’ Especifica que o arquivo está sendo aberto para acesso seqüencial. Valor padrão do parâmetro ACESS. ‘DIRECT’ Especifica que o arquivo está sendo aberto para acesso direto.. f Parâmetro especificador do nome do dispositivo de saída File = ‘COM’ vídeo Qualquer outro nome é associado a um arquivo . s ‘OLD’ O arquivo já deve existir. Se o arquivo existe, ele é aberto. Se o arquivo não existe, ocorre um erro de entrada/saída. ‘NEW’ O arquivo não deve existir. Se o arquivo não existe, ele é criado. Se o arquivo existe, ocorre um erro de entrada/saída. ‘SCRATCH’ Se for omitido o parâmetro FILE quando é aberto um arquivo, o valor padrão do parâmetro STATUS é ‘SCRATCH’. Arquivos Scratch são temporários e são apagados após a execução do programa. ‘REPLACE’ O arquivo aberto substitui um com o mesmo nome. Caso não exista nenhum arquivo com o mesmo nome, um novo arquivo é criado. ‘UNKNOWN’ O valor do padrão do parâmetro STATUS é UNKNOWN. Inicialmente é observado se o arquivo aberto já existe, isto é, status=‘OLD’, caso contrário cria-se um novo arquivo status=’NEW’. Em síntese, se o arquivo existe ele é aberto, se não existe ele é criado. EXEMPLOS i)- Criação de um novo arquivo para armazenar dados dos vetores X e Y. Character*12 nome Integer n Parameter (n=10) Real*4 x(n),y(n) Print '(3x,A\)','Entre com o nome do arquivo = ' read(*,*) nome print '(3x,A\)','Entre com o numero de dados = ' read(*,*) n do i=1,n print 10, i read(*,*) x(i) print 20, i read(*,*) y(i) 35 10 20 30 end do open(unit=5,file=nome,status=’NEW’) write(5,’(i3)’) n do i=1,n write(5,30) x(i),y(i) end do close(5) format(3x,’x( ‘,i2,’) = ‘,\) format(3x,’y( ‘,i2,’) = ‘,\) format(3x,e10.4,3x,e10.4) end OBS: Como no exemplo (i) foi criado um novo arquivo, o valor do parâmetro STATUS referente ao comando OPEN é igual a ‘NEW’. ii)- Leitura dos valores dos vetores X e Y armazenados no arquivo do exemplo (i). 30 Character*12 nome Integer n Parameter (n=10) Real*4 x(n),y(n) Print '(3x,A\)','Entre com o nome do arquivo = ' read(*,*) nome open(unit=4,file=nome,status=’OLD’) read(4,’(i3)’) n do i=1,n read(4,30) x(i),y(i) end do close(4) format(3x,e10.4,3x,e10.4) end OBS: Como no exemplo (ii) o arquivo já existia, o valor do parâmetro STATUS referente ao comando OPEN é igual a ‘OLD’. iii)- Armazenamento dos valores dos vetores X e Y em um arquivo já existente. Desejamos armazenar novos valores das variáveis X e Y no arquivo DADOS.DAD já existente, neste caso a sintaxe do comando OPEN é a seguinte: open(unit=8,access='append',file=’dados.dad’, status='old') OBS: Se o arquivo DADOS.DAD já existe, para que as informações contidas neste arquivo não sejam perdidas, é necessário que o valor do parâmetro ACCESS no comando OPEN seja igual a ‘APPEND’. 7-2 COMANDO CLOSE 36 O comando CLOSE desconecta uma unidade específica, especificando se o arquivo é para ser guardado ou liberado. A forma simplificada deste comando é a seguinte: CLOSE (UNIT=u,[status = s]) u Número inteiro maior ou igual a zero, este parâmetro deve estar associado a um arquivo utilizado anteriormente com o comando OPEN. S ‘KEEP’ Valor padrão do parâmetro STATUS, especifica que o arquivo deve ser mantido após a execução do comando CLOSE. ‘DELETE’ Especifica que o arquivo deve ser apagado após a execução do comando CLOSE. EXEMPLOS i)- CLOSE(9) ii)- CLOSE(4,STATUS=’DELETE’) ATIVIDADES i)- Desenvolva um programa computacional que obtenha as seguintes informações: nome da substância, peso molecular, temperatura crítica, pressão crítica e fator acêntrico., a partir de um arquivo externo DADOS PARA A MONTAGEM DO BANCO DE DADOS: Substância Peso molecular Tc(K) Pc(Mpa) Fator acêntrico Amônia 17,031 405,5 11,35 0,250 Argônio 39,948 150,8 4,87 0,001 Bromo 159,808 588,0 10,30 0,108 Nitrogênio 28,013 126,2 3,39 0,039 Água 18,015 647,3 22,12 0,344 Tetracloreto de carbono 153,823 556,4 4,56 0,193 Etano 30,070 305,4 4,88 0,099 Álcool Etílico 46,069 513,9 6,14 0,644 Dióxido de carbono 44,010 304,1 7,38 0,239 8 - COMANDO INCLUDE O comando INCLUDE insere o conteúdo de um arquivo texto específico na posição em que estiver escrito o comando INCLUDE. INCLUDE ‘nome do arquivo’ Nome do arquivo O conteúdo deste arquivo deve apresentar apenas declarações na linguagem FORTRAN, pode-se acrescentar a descrição da localização do arquivo (path). EXEMPLO: 37 Se o arquivo FILE01.INC, contêm as seguintes informações: Real*8 Z,X Integer n,k Character*20 nome COMMON /Bloco2/z,x,/bl3/n,k,nome Então no programa principal, ou em subprograma podemos utilizar o comando INCLUDE. Real*4 a Include ‘file01.inc’ Resultado: neste exemplo o conteúdo (seqüência de comandos FORTRAN) do arquivo FILE01.INC é acrescentado ao programa principal ou subprograma. Utiliza-se o comando INCLUDE principalmente quando existe uma série de comandos que se repetem nos subprogramas. PROJETO FINAL DO CURSO Desenvolver um programa computacional para o cálculo do fator de compressibilidade e do volume específico utilizando a equação de Peng-Robinson. )bV(b)bV(V a bV RT P , onde: 2 c 2 c 2 P TR 45724,0a e c c P RT 007780,0b 2rT11 e 226992,054226.137464,0 0BBABZB3B2AZB1Z 32223 22 TR aP A e RT bP B DADOS DE ENTRADA: - M, Tc, Pc e devem ser lidos através de um banco de dados, na qual o usuário seleciona a substância e então são obtidos os valores correspondentes de Tc, Pc e . - Temperatura e pressão. CÁLCULO DE Z - No cálculo do fator de compressibilidade utilize o método de Newton-Raphson. DADOS DE SAÍDA - Nome da substância, Tc, Pc , , temperatura, pressão, fator de compressibilidade e volume específico (m 3 /Kg) NOTAÇÃO: Tc - Temperatura crítica. T - Temperatura do gás. 38 Pc - Pressão crítica. P - Pressão. - Fator acêntrico. Z - Fator de compressibilidade. V - Volume específico. R - Constante do gases ideais Tr - Temperatura reduzida: (T/Tc)
Compartilhar