Académique Documents
Professionnel Documents
Culture Documents
br
Disciplina: Introduo Informtica Prof. Carlos Gonalves Sala 214, Bloco 06, CCET - email: cav@ufma.br Webpages: http://www.deinf.ufma.br/~cav, ou http://cavg.br.tripod.com Assunto: Linguagem FORTRAN 77 e 90
Adicionalmente, nomes podem conter at 31 caracteres, podem conter sublinhado _, e podem conter letras ambas maisculas e minsculas. Ponteiros. Os ponteiros provm duas importantes capacidades no Fortran 90 estruturas de dados dinmicas e arranjos dinmicos. O ltimo especialmente importante para a cincia computacional pois ele permite que os arranjos sejam dinamicamente alocados (e realocados) de tamanho adequado e fornece meios de minimizar a transferncia de dados quando realizando operaes sobre sees de arranjos variveis. Por conta do impacto negativo que os ponteiros tm sobre a otimizao, um ponteiro em Fortran 90 pode apontar apenas para (a) um objeto de dados explicitamente declarado como alvo do ponteiro, (b) um objeto criado dinamicamente, ou (c) outro ponteiro. Isto torna possvel que a aplicao da tecnologia de otimizao de armazenamento esttico seja usada sobre dados que no tenham atributos nem de ponteiros nem de alvo. Estruturas de Dados. Arranjos so provavelmente os mais importantes objetos compostos de dados para a cincia computacional, porm objetos mais heterogneos so necessrios, incluindo estruturas ligadas dinamicamente. No jargo do Fortran 90, estruturas so objetos de tipos definidos pelo usurio. Estruturas dinamicamente ligadas so implementadas essencialmente pelos tipos recursivos definidos pelo usurio. Um exemplo de um tipo que pode ser usado para a estrutura de uma lista duplamente encadeada mostrado abaixo, onde os componentes recursivos (PREVIOUS e NEXT no exemplo) devem ser ponteiros. Em geral, um tipo definido pode conter qualquer nmero de tipos de componentes. type list real :: data type(list), pointer :: previous, next end type list Aspectos obsolescentes. O Fortran 90 um primeiro passo em direo a um modelo de evoluo planejada da linguagem enquanto oposio ao crescimento desbalanceado ou remoes ad hoc de itens. Como a maioria dos passos iniciais, este uma pequena tentativa at aqui com resultado incerto. A idia finalmente remover aquelas caractersticas que se tornaram obsoletas enquanto a linguagem evolui, mas oficialmente identificar tais candidatos como obsolescentes bem antes da remoo efetiva. Intenta-se assim dar a comunidade Fortran (a) a chance de rever as recomendaes e prevenir que equvocos sejam feitos, (b) tempo para preparar-se para a mudana de forma ordenada. Segundo o modelo corrente, um item listado como obsolescente em uma verso do Fortran padro um candidato remoo na prxima verso. Os dez itens seguintes do Fortran 90 so listados como obsolescentes: 1. O IF-aritmtico 2. Expresses e variveis de preciso real (e dupla) como ndices do DO 3. Finalizao partilhada do DO (i.e., dois laos terminando no mesmo comando) 4. Outra finalizao do lao DO que no END DO ou CONTINUE 5. Desviar para um comando END IF exterior quela construo IF 6. Retornos alternados (ao invs, usar um cdigo varivel de retorno) 7. O comando PAUSE (usar READ no lugar) 8. Comandos ASSIGN e GOTO atribudo (usar procedimentos internos no lugar) 9. Especificadores atribudos de FORMAT (usar cadeias de strings ao invs) 10. O descritor H de edio de string (i.e., nHstring equivalente a string)
Comparao entre Fortran 77, C, C++ e Fortran 90. Por trinta anos, desde sua criao at o Fortran 77, o Fortran tem sido a principal linguagem da cincia computacional. Durante este tempo as capacidades numricas do Fortran tem sido notavelmente estvel e superior quelas de outras linguagens de computador. As maiores mudanas surgem na forma de uma diversamente crescente e confivel biblioteca de rotinas numricas. A unio do Fortran, tcnicas para seu uso, e a extensivas bibliotecas numricas caracterizam a predominante infraestrutura para a cincia computacional. Na dcada passada, todavia, a crescente importncia de estruturas de dados dinmicas (particularmente arranjos dinmicos), unix workstations, sofisticadas facilidades de visualizao interativas, e, mais recentemente, arquiteturas paralelasnenhuma das quais Fortran 77 adere bemtem promovido interesse no uso de outras linguagens para computao, mais notadamente a C. Recentemente C++ tem tambm angariado considervel interesse, e Fortran tem tentado enderear suas deficincias para a moderna cincia computacional evoluindo para o Fortran 90. A tabela abaixo resume uma tentativa genrica de comparar estas quatro linguagens quanto a relativa adaptabilidade cincia computacional.
Tabela 1: Comparao entre linguagens numa escala de melhor (1) a pior (4) Funcionalidade Fortran C C+ Fortran 77 + 90 Robustez numrica 2 4 3 1 Paralelelismo de 3 3 3 1 dados Abstrao de 4 3 2 1 dados P.O.O. 4 3 1 2 Programao 4 3 2 1 funcional Mdia 3.4 3.2 2.2 1.2
Expresses Lgicas Usa-se os operadores relacionais e lgicos conforme descriminados a seguir. Os operadores relacionais: Sintax e .GT. .GE. .EQ. .NE. .LT. .LE. Descrio Greater than Greater than or equal to Equal to Not equal Less than Less than or equal to Fortran 90 > >= = /= < <= Semnti ca > = <
Operadores Lgicos Sintax e .NOT. .AND. .OR. Descrio No lgico e (conjuo) ou (disjuno)
Declarao de Variveis
Seguindo a especificao do FORTRAN 77: REAL v1, v2, v3, , vn INTEGER v1, v2, v3, , vn Nota: As variveis vi podem ser vetores ou matrizes e as variveis declaradas explicitamente anulam a declarao implcita. Exemplos: REAL NOTA, MEDIA INTEGER VAR, A(5,10), INDEX(10), L
LOGICAL v1, v2, v3, , vn Podem receber apenas .TRUE. ou .FALSE. Variveis complexas: COMPLEX v1, v2, v3, , vn onde a instruo de atribuio ser: vi = (real, imag) Dupla preciso DOUBLE PRECISION v1, v2, v3, , vn onde vi pode ser qualquer tipo conjunto: vetores e/ou matrizes Cadeias alfanumricas: Devemos indicar o comprimento da cadeia. CHARACTER *comp v1, v2, v3, , vn ou ainda CHARACTER v1*comp1, v2*comp2, v3*comp3, , vn*compn Atribuio: var = cadeia Concatenao: var3 = var1//var2//cadeia Exemplos: CHARACTER BRANCO*1, RELAT*9, TITUL*22 Declarao DIMENSION: DIMENSION nome(d1, d2,, dn),, nomej(e1, e2,,en) onde: nomeidentificador da varivel di, eiexpresses que determinam o tamanho mximo de cada dimenso. Linguagem Fortran 7/907 - p.4/8
Nota: No FORTRAN 77 permite-se at 7 dimenses, ao passo que compiladores antigos limitavam at um mximo de 3 dimenses. Uma forma alternativa de declarar arranjos no F77 : DIMENSION nome(li:ls), sendo li=lim. inferior e ls=lim. superior. Declarao IMPLICIT Usada para modificar a conveno do FORTRAN quanto ao tipo implcito das variveis. IMPLICIT tipo(letra1, letra2,, letran) Exemplo: IMPLICIT REAL(A:H) IMPLICIT LOGICAL (Z)
Estruturas de Deciso
1. IF-bloco: exclusiva do FORTRAN 77 e acima: IF (exp.) THEN ou IF(exp.) THEN S S ELSE S ENDIF ENDIF Nota: permitido o aninhamento de estruturas IFs. 2. IF-lgico: compiladores antigos no aceitavam esta instruo. [OBSOLETO] IF (exp.) S onde: S no pode ser END, outro IF ou uma instruo DO. 3. IF aritmtico: [OBSOLETO] IF (arit)end1, end2, end3 onde: endi so endereos para onde deve ser desviado o fluxo de execuo, caso arit seja <0, =0 ou >0, respectivamente.
Desvios
So representados pelo comando GOTO. [OBSOLETO] 1. GOTO incondicional: GOTO end 2. GOTO controlado: GOTO(n1, n2, , nj), exp onde: o fluxo desviar para nj de acordo com o valor resultante de exp. Se exp resultar fora dos limites, i.e., superior a 1 ou n, a instruo ser ignorada ou acusar erro, dependendo do compilador.
Estruturas de Repetio
So os laos (aritmticos) chamados de DO/CONTINUE. [OBSOLETO] Sintaxe: *2345678 DO end var=e1,e2,e3 S end CONTINUE onde: end pode ser qualquer nmero inteiro>0, var=var. de controle, e1=valor inicial, e2=valor final e e3=passo. S=comandos que compem o corpo do lao. Exemplo: *2345678 DO 10 K=1, 10, 2 S 10 CONTINUE
No Fortran 90 tem-se os laos DO/ENDDO, que equivalem ao comando PARA/FIMPARA do Portugol. Sintaxe: *2345678 DO var=e1,e2,e3 S ENDDO onde: os elementos componentes tm a mesma semntica do lao DO/CONTINUE acima. Exemplo: *2345678 DO K=1,10,2 S ENDDO Ainda no Fortran 90, temos o lao controlado por uma varivel ou expresso do tipo lgica. o lao DOWHILE/ENDDO, que equivale ao ENQUANTO/FIMENQUANTO do Portugol. Sintaxe: *2345678 DOWHILE (exp.) S ENDDO onde: exp=expresso lgica, e S=comandos que compem o corpo do lao. Exemplo:
Comandos de ENTRADA/SADA
Basicamente temos dois, a saber: Entrada: READ(unid, form) lista ou READ form, lista Sada: WRITE(unid, form) lista ou PRINT form, lista onde: unid especifica a unidade de E/S usada. Deve ser uma constante ou varivel inteira form endereo de uma declarao FORMAT que descreve o formato para E/S de resultados lista variveis separadas por virgula As notaes livres de formato acontecem quando substitumos o endereo do formato por um * (asterisco), opcionalmente pode-se omitir tambm a unidade de E/S, nas instrues de E/S. Exemplos: Entrada: Sada: Entrada, formato livre: READ(5,*) Sada, formato livre: WRITE(6,*) Linguagem Fortran 7/907 - p.6/8
READ(5,form)
WRITE(6, form)
As constantes 5 e 6 acima referem-se a leitora de carto e impressora, respectivamente, padro este que pode mudar de instalao para instalao. No Fortran 90 a sintaxe sempre no formato livre, veja a tabela abaixo: Fortran 90 (formato livre) Entrada: READ *,<var1>,<var2> etc. Sada: WRITE *,<exp.> ou PRINT *,<exp.> onde: exp=expresso ou string ou varivel separados por virgula, se mais de um. Exemplos READ *,X,Y,Z WRITE *,Area=,a PRINT *,Vol=,v PRINT *,vol,area
Uso do DO implcito para E/S de vetores e matrizes: [OBSOLETO] Vetores: READ(2,35) (VET(K), K=1,10,2), ou WRITE(6,35) (VET(K), K=1,10,20) Matrizes: Precisa-se do aninhamento dos laos DO e isto feito conforme indicado abaixo: READ(5,40) ((MAT(I,J), I=1,5),J=1,3), ou WRITE(6,35) ((MAT(J,K), J=1,6),K=1,5) Declarao FORMAT [OBSOLETO] Serve para definir o formato que ser usado na E/S dos dados, podendo a especificao ser de dados numricos, constantes literais e de posicionamento horizontal e vertical. Veremos apenas algumas destas especificaes, para maiores detalhes favor consultar [PEREIRA], p.118-125, ou qualquer outro livro-texto sobre FORTRAN 77 da bibliografia. Descritores para formatos numricos: Fc.d Ec.d Ic onde: c=comprimento total do campo incluindo o ponto decimal d=nmero de casas decimais Exemplo: FORMAT(F4.1, F6.2, I3, E9.3) Obs.: Caso haja presena de formatos repetidos na especificao podemos denotar isto da seguinte maneira: nESP onde: n=nmero de repeties da ESPecificao Exemplo: FORMAT(2F4.1, 3I2, 4E6.1) Obs.: Um mesmo formato pode ser referenciado de qualquer parte do programa, i.e., o formato pode ser reutilizado em vrias instrues. Linguagem Fortran 7/907 - p.7/8 valores reais valores em potncia de 10 valores inteiros
Dos descritores de posicionamento: Horizontal: Vertical: etc. pX salta p posies para a direita Tp salta para a posio p / salta 1 linha. O uso de vrgulas antes/depois da barra opcional 1 salta para a primeira linha da prxima folha etc.
Exemplo de uso de uma Funo num Programa Completo C ---------------------------------------------------------C Program Fat - Determina o fatorial C de nr.lido, usando uma func. definida C pelo usuario. C Autor: Carlos Goncalves C Data: 10.nov.2011 - Revisao: beta C Compilador: Force v.3.0b3 C ---------------------------------------------------------*234567 PROGRAM Fat C integer num,n C write *,'-- Calcula o fatorial --' num=2 !valor inicial dowhile (num > 1) write *,'Entre numero > 2 (zero p/ FIM): ') read *,num if (num/=0) then C // Ativa func. // C n=fator(num) // Escreve resultado // write *,'Fatorial=',n endif enddo --------------------------------Funcao Fatorial --------------------------------integer function fator(nr) integer nr, i, fat fat=1 do i=2,nr fat=fat*i enddo fator=fat return end
C C C C C
Bibliografia
CSEPComputational Science Educational Project. Fortran 90 and computational science. USA, 1995. GHEZZI, Carlo e Jazayeri, Mehdi. Conceitos de linguagem de programao. Ed. Campus: Rio de Janeiro, 1987. PAGE, Clive G. Professional programmers guide to Fortran 77. University of Leicester: United Kingdom, 1995. PEREIRA, Jorge da Cunha e Loiola, Caetano R. A. FORTRAN ANSI 77 e WATFIV-S, Um texto universitrio. Ed. Campus: Rio de Janeiro, 1991.