Вы находитесь на странице: 1из 25

Fortran 77

Autor: Prof. Luiz Bianchi Universidade Regional de Blumenau

Sumrio
1. Prlogo........................................................................................................................................3 Fortran 77......................................................................................................................................3 2. Introduo..................................................................................................................................3
Por que Fortran?..............................................................................................................................3 Portabilidade....................................................................................................................................3

3. Programa Fortran 77 bsico....................................................................................................3


Organizao do programa...............................................................................................................4 Regras de posio de colunas...........................................................................................................4 Comentrios......................................................................................................................................5 Continuao......................................................................................................................................5 Espaos em branco...........................................................................................................................5

4. Variveis e tipos de dados.........................................................................................................5


Nomes de variveis...........................................................................................................................5 Tipos de dados..................................................................................................................................5 Variveis inteira e de ponto flutuante.............................................................................................6

5. Constantes..................................................................................................................................6 6. O comando parameter...............................................................................................................7 7. Atribuio e expresses aritmticas.........................................................................................8


Atribuio.........................................................................................................................................8 Expresses aritmticas.....................................................................................................................8 Operadores aritmticos....................................................................................................................8 Operador de strings.........................................................................................................................9

8. Converso de tipos de dados.....................................................................................................9 9. Expresses lgicas.....................................................................................................................9


Variveis lgicas e atribuies.......................................................................................................10

10. Estrutura condicional............................................................................................................10


if aninhados.....................................................................................................................................11 if aritmtico.....................................................................................................................................11

11. Estrutura de repetio...........................................................................................................12


do-loops...........................................................................................................................................12 while-loops......................................................................................................................................13 until-loops.......................................................................................................................................14

12. O comando goto.....................................................................................................................14 13. Comandos bsicos de entrada e sada..................................................................................14


Read e write....................................................................................................................................15 Exemplos.........................................................................................................................................15 Outras verses................................................................................................................................16

14. O comando Format................................................................................................................16


Sintaxe.............................................................................................................................................16 Cdigos de format..........................................................................................................................16 Alguns exemplos.............................................................................................................................17

15. O comando Data....................................................................................................................18 16. Vetores e Matrizes..................................................................................................................19


Matriz unidimensional...................................................................................................................19 Matriz bidimensional.....................................................................................................................19 Iterao implcita...........................................................................................................................20 Armazenamento de matrizes de duas dimenses.........................................................................21 Matriz multidimensional...............................................................................................................22 O comando dimension....................................................................................................................22

17. Subprogramas........................................................................................................................22
Funes............................................................................................................................................22 Sub-rotinas......................................................................................................................................24 Chamada-por-referncia...............................................................................................................25

Fortran 77

1. Prlogo
O objetivo deste tutorial Fortran 77 permitir uma rpida introduo s caractersticas mais comuns da linguagem de programao Fortran 77. O perfil deste tutorial foi inspirado no excelente tutorial desenvolvido na Universidade de Stanford EUA, em 1995.

2. Introduo
O Fortran uma linguagem de programao de finalidade geral, desenvolvida principalmente para projetos da rea de engenharia. Fortran um acrnimo de FORmula TRANslation. Foi a primeira linguagem de programao de alto-nvel, criada pela IBM em 1957. Convencionalmente, a verso da linguagem Fortran conhecida pelos dois ltimos algarismos do ano em que foi introduzida. As ltimas verses distribudas so: Fortran 66, Fortran 77 e Fortran 90 (95). A verso mais utilizada hoje em dia , sem dvida, a 77, embora a verso 90 esteja crescendo rapidamente em popularidade. A verso 95 uma verso revisada do Fortran 90 a ser avaliada e aprovada pela American National Standards Institute (ANSI). H vrias outras verses da linguagem Fortran, algumas delas visam atender sistemas especficos de computador como, por exemplo, sistemas de processamento paralelo ou de multiprogramao. Uma das mais importantes a High Performance Fortran (HPF), considerada o autntico padro das verses Fortran. Muitos compiladores Fortran 77 admitem subconjuntos de comandos, isto , aceitam extenses fora do padro estabelecido pela ANSI.

Por que Fortran?


Fortran uma linguagem de programao usada em aplicaes de engenharia. De tempos em tempos, os assim chamados especialistas predizem que o Fortran ser rapidamente enfraquecido em popularidade e logo se tornar extinto. Essas predies invariavelmente tm falhado. a mais duradoura e histrica linguagem de programao de computador. Uma das principais razes de sobrevivncia do Fortran o software inrcio ou j desenvolvido e geralmente resistente modificao. Uma vez que uma empresa tenha despendido muitos anos-homens e qui milhes de dlares em produtos de softwares, improvvel que tente converter o software para uma linguagem diferente, ainda porque a translao sempre uma tarefa dificultosa.

Portabilidade
A principal vantagem do Fortran que uma linguagem padronizada pelos institutos ANSI e ISO (International Standards Organization). Conseqentemente, um programa escrito em ANSI Fortran 77, rodar em qualquer computador que tenha o compilador Fortran 77. Desse modo, os programas Fortran so portveis atravs de plataformas de mquinas.

3. Programa Fortran 77 bsico

Prof. Luiz Bianchi

Fortran 77 Um programa Fortran exatamente uma seqncia de linhas de texto. O texto deve obedecer uma certa sintaxe para ser considerado um programa Fortran vlido. A seguir apresentado um exemplo simplificado de programa.
program circulo real r, area c Este programa l um nmero real r e imprime c a rea do crculo com raio r. write (*,*) 'Valor do raio:' read (*,*) r area = 3.14159*r*r write (*,*) 'Area = ', area stop end

As linhas que comeam com a letra c so comentrios e no tem outra finalidade seno a de proporcionar maior legibilidade ao programa.

Organizao do programa
Um programa Fortran geralmente consiste de um programa principal e eventualmente de vrios subprogramas (procedimentos ou sub-rotinas). A estrutura do programa principal : program nome declaraes comandos stop end O comando stop opcional e pode parecer suprfluo uma vez que o programa terminar de qualquer modo quando alcanar o fim, mas recomendado encerrar a execuo do programa com o comando stop para enfatizar o final do fluxo de execuo.

Regras de posio de colunas


O Fortran 77 no uma linguagem de formato livre, pois impem certas restries para a escrita do cdigo fonte. As regras de posio de colunas so:
Coluna 1 2 a 5 6 7 a 72 73 a 80 contedo "*" ou "!" para comentrios rtulo ou label (opcional) continuao da linha anterior (opcional) comandos nmero de seqncia (opcional, raramente usado hoje em dia)

A quase totalidade das linhas do programa Fortran 77 inicia na posio 7 e termina antes de alcanar a coluna 72, ou seja, apenas o campo destinado aos comandos utilizado.

Prof. Luiz Bianchi

Fortran 77

Comentrios
A linha que inicia com a letra c ou com asterisco na primeira coluna um comentrio. Ele pode aparecer em qualquer lugar no programa. Comentrios bem escritos so cruciais para a legibilidade do programa.

Continuao
Ocasionalmente, um comando ocupa mais de uma linha de codificao e para denotar essa ocorrncia usado uma marca de continuao na posio 6. Exemplo:
1234567 c O prximo comando ocupa duas linhas area = 3.14159265358979 + * r * r 7273 80

Qualquer caractere pode ser usado no lugar do sinal + como caractere de continuao.

Espaos em branco
Espaos em branco so ignorados no Fortran 77. Se for removido todos os brancos, o programa tambm ser considerado sintaticamente correto, no entanto, praticamente ilegvel para as pessoas.

4. Variveis e tipos de dados


Nomes de variveis
Os nomes de variveis em Fortran consiste de letras a-z e de dgitos 0-9. O primeiro caractere deve obrigatoriamente ser uma letra. No h distino entre letras maisculas e minsculas.

Tipos de dados
Cada varivel deve ser expressa em uma declarao. Isto estabelece o tipo de dados da varivel. Os tipos de dados mais comum so:
integer lista de variveis real lista de variveis double precision lista de variveis character lista de variveis logical lista de variveis

A lista de variveis consiste de nomes de variveis separadas por vrgulas. Cada varivel deve ser declarada apenas uma vez.

Prof. Luiz Bianchi

Fortran 77 Exemplos:

integer k, m real numero, area character nome*w

Onde w representa o nmero mximo de caracteres que a varivel pode conter. character*w var1,var2 As variveis var1 e var2 possuem o mesmo tamanho w. character (len = w) var1, (len=w2) var2 A varivel var1 tem tamanho w e var2 tamanho w2.

Se o tipo da varivel no for declarado, o Fortran 77 utiliza as regras implcitas para determinar o tipo. Isto significa que todas as variveis que comeam com as letras i-n (de i at n) so consideradas inteiras (integer) e todas as demais, reais (real). Recomenda-se declarar as variveis de forma explcita a fim de evitar ou reduzir a probabilidade de erros que podem ocorrer na construo do programa. Quando no se deseja que nenhuma varivel seja declarada implicitamente deve-se usar o comando implicit none no incio do programa.

Variveis inteira e de ponto flutuante


O Fortran 77 tem apenas um tipo de varivel inteira ou de ponto fixo (fixed point). As variveis inteiras integer ocupam 32 bits ou 4 bytes para armazenar seus contedos. As variveis de ponto flutuante (floating point) so de dois tipos: real 4 bytes e double precision - 8 bytes. Verses no padronizadas do Fortran usam a sintaxe real*8 para declarar uma varivel de ponto flutuante de 8 bytes.

5. Constantes
Exemplos de constantes inteiras (integer): : Exemplos de constantes reais (real):
0 -100 32767 +15

1.0 -0.25 2.0E6 3.333E-1

O valor do elemento com notao E pode ser obtido multiplicando-se o nmero que antecede a letra E por 10 elevado ao nmero que segue a letra E . Assim, 2.0E6 equivale a dois milhes, enquanto 3.333E-1 aproximadamente um tero.

Prof. Luiz Bianchi

Fortran 77 Double precision Para constantes cujos nmeros so maiores que o permitido pelo tipo real, ou que requerem alta preciso, deve ser usado o tipo de dado double precision. A notao a mesma que a da constante real, exceto a letra E que substituda pela letra D. Constantes de dupla preciso (double precision):
2.0D-1 1D99

2.0D-1 uma constante de preciso dupla que representa um quinto. 1D99 equivale a um seguido de 99 zeros. Constantes lgicas (logical) A constante logical pode conter somente dois valores escritos entre dois pontos:
.TRUE. .FALSE.

Constantes de caracteres (character) A constate character consiste de uma seqncia de caracteres, conhecida como string, colocada entre apstrofos. ABC Constantes de caracteres ou alfanumricas (character):
Vale tudo O dia est lindo

6. O comando parameter
Com o comando parameter pode-se definir uma constante somente uma vez no incio do programa. Por exemplo, o programa que calcula a rea do crculo, pode ser escrito como segue:
program circulo real r, area parameter (pi = 3.14159) * Este programa l um nmero real r e imprime * a rea do circulo com raio r. write (*,*) 'Valor do raio:' read (*,*) r area = pi*r*r write (*,*) 'Area = ', area stop end

A sintaxe do comando parameter :


parameter (nomeDaCostante1 = valor, nomeDaConstante2 = valor, . . .)

As regras do comando parameter so:

Prof. Luiz Bianchi

Fortran 77

A varivel definida no comando parameter no propriamente uma varivel mas uma constante cujo valor no pode ser modificado. O parameter deve ser definido antes do primeiro comando executvel. Uma das razes para o uso do comando parameter no caso de modificao do valor da constante, que pode ser referenciada muitas vezes no programa, basta alterar seu valor apenas uma vez no comando parameter.

7. Atribuio e expresses aritmticas


Atribuio
A atribuio tem a seguinte forma:
nome-da-varivel = expresso

A interpretao a seguinte: O resultado da expresso direita do sinal de igualdade atribudo varivel esquerda desse sinal. A expresso direita pode conter outras variveis, mas seus valores nunca so alterados. Por exemplo,
rea = pi * r ** 2

o valor de pi ou de r no so modificados, apenas o contedo de rea.

Expresses aritmticas
Expresses simples so da forma: Exemplos: x + y
x + 2 * y

operando operador operando

Os valores podem ser atribudos variveis como nos exemplos que seguem:
soma = x + y resul = x * y / z

Operadores aritmticos
A precedncia dos operadores aritmticos em Fortran 77 so: (da mais alta para a mais baixa prioridade):
** {exponenciao} *, / {multiplicao, diviso}

+, -

{adio, subtrao}

Todos os operadores so considerados da esquerda para a direita, exceto a exponenciao que tem precedncia da direita para a esquerda. Caso se queira trocar a ordem de avaliao, podem ser utilizados parnteses. Os operadores acima so todos operadores binrios. Os operadores unrios, para negao, tem prioridade sobre os demais.

Prof. Luiz Bianchi

Fortran 77 Deve-se tomar especial cuidado ao usar o operador de diviso, que tem significado diferente para valores inteiros e reais. Se os operandos so ambos inteiros, uma diviso inteira ser realizada, caso contrrio ter efeito uma diviso de aritmtica real. Por exemplo, 3/2 igual a 1, enquanto que 3./2. igual a 1.5.

Operador de strings
A concatenao ou juno de duas ou mais palavras pode ser realizada atravs do operador //. Exemplo:
a1 = tele a2 = viso b = a1 // a2 fica: b = televiso

8. Converso de tipos de dados


Quando diferentes tipos de dados aparecem na mesma expresso, a converso de tipos tem lugar, explicita ou implicitamente. Por exemplo,
real x x = x + 1

seria convertido o nmero um inteiro para o nmero um real. Contudo, em expresses mais sofisticadas, boa prtica de programao efetuar a converso de tipo de modo explcito. Para int nmeros, as seguintes funes esto disponveis:
real dble ichar char

As primeiras trs tm significados bvios. ichar converte um caractere para integer, ao passo que char faz exatamente o oposto. Exemplo: Multiplicar duas variveis reais x e y usando a preciso dupla (double precision) e armazenar o resultado na varivel double precision w:
w = dble(x) * dble(y)

Note que isto diferente de


w = dble(x * y)

9. Expresses lgicas
A expresses lgicas podem conter apenas o valor .TRUE. ou .FALSE.. A expresso lgica pode ser constituda por expresses de comparao aritmticas, utilizando os operadores relacionais. Operadores relacionais:
Operadores significado

Prof. Luiz Bianchi

Fortran 77
.LT. .LE. .GT. .GE. .EQ. .NE. ou ou ou ou ou ou < <= > >= == /= menor que menor ou igual maior que maior ou igual igual diferente

Exemplos: Os smbolos < , <=, >, >=, == e /= no podem ser usados para comparao em Fortran 77 ANSI. No entanto, tais smbolos so aceitos em muitos compiladores Fortran 77 de hoje. O smbolo = (igual) nesses compiladores representado por dois iguais seguidos (= =) sem espao entre eles. As expresses lgicas podem ser combinadas pelos operadores lgicos. Operadores lgicos: .AND., .OR., .NOT. Exemplos:
50.GT.5 .AND. 20.GT.30 resulta em FALSE 50.GT.5 .OR. 20.GT.30 resulta em TRUE .NOT.5.GT.50 resulta em TRUE 15.NE.20 30.LT.20 resulta em TRUE resulta em FALSE

Variveis lgicas e atribuies


O valor verdade pode ser armazenado em variveis lgicas. A atribuio anloga a atribuio aritmtica. Exemplo:
Logical a, b a = .true. b = a.and.3.lt.5/2

Prioridade de execuo dos operadores: 1o operadores aritmticos, 2o operadores relacionais, 3o operadores lgicos na seguinte ordem: not, and e or. A ordem de precedncia importante, como o ltimo exemplo mostrado. A regra que as expresses aritmticas so avaliadas primeiro, depois os operadores relacionais e por fim os operadores lgicos. Desse modo, b receberia .FALSE. no exemplo acima. As variveis lgicas so raramente usadas em Fortran. Todavia, as expresses lgicas so bastante empregadas em declaraes condicionais como na instruo if.

10. Estrutura condicional


Uma parte importante de qualquer linguagem de programao so os comandos condicionais. muito comum o uso da instruo if em Fortran que pode ser empregada de formas diferentes:
if (expresso lgica) comando executvel

Prof. Luiz Bianchi

10

Fortran 77 Deve ser escrita em uma linha. O exemplo a seguir determina o valor absoluto de x:
if (x .LT. 0 ) x = -x

Se mais de um comando tenha de ser escrito dentro do if, ento a seguinte sintaxe deve ser usada: if (expresso lgica) then A estrutura aspecto:
comandos endif if (expresso lgica) then comandos elseif (expresso lgica) then comandos : : else comandos endif

geral do comando if tem o seguinte

O fluxo de execuo de cima para baixo. As expresses condicionais so avaliadas em seqncia at o sistema encontrar uma que seja verdade. O comando associado a expresso lgica verdade executado e o controle salta para o prximo comando aps o endif.

if aninhados
A instruo if pode ser aninhada em vrios nveis. Para garantir a legibilidade, importante escrever as instrues de modo indentadas. Exemplo:
if (x .GT. 0) then If (x .GE. y) then write(*,*) x positivo e x >= y else write(*,*) x positivo, mas x < y endif elseif (x .LT. 0) then write(*,*) x negativo else write(*,*) x = 0

endif No entanto, a construo de muitos nveis de ifs aninhados devem ser evitados em favor da legibilidade e manutenibilidade do programa.

if aritmtico
A instruo if aritmtico ou tambm conhecida como if com deslocamento utilizada com uma expresso aritmtica cuja forma geral do comando :
if (expresso aritmtica) label1, label2, label3

Prof. Luiz Bianchi

11

Fortran 77

onde label1, label2 e label3 so os nmeros das linhas das instrues escritos nas colunas 2 a 5 do programa. Se o resultado da expresso aritmtica for menor que zero o fluxo do programa desviado para label1, se o resultado for zero o fluxo de execuo desviado para o label2 e se maior que zero, para o label3. Exemplo:
k = 3 if (k 2) write(*,*) write(*,*) write(*,*) 10, 20, 30 k menor que zero k igual a zero k maior que zero

10 20 30

Resultado:
k maior que zero

11. Estrutura de repetio


Para repetir a execuo de instrues so utilizadas sentenas de iterao ou loop. As pessoas familiarizadas com outras linguagens de programao, certamente j lidaram ou ouviram falar em for-loops, while-loops e until-loops. O Fortran 77 tem apenas uma forma de construo de loop, chamada do-loop. O do-loop corresponde ao que conhecido como for-loop em outras linguagens. Outra construo de loop pode ser simulada utilizando os comandos if e goto.

do-loops
O do-loop utilizado para efetuar simples contagem. A seguir, mostrado um exemplo simples que calcula e exibe a soma dos nmeros inteiros de 1 a n: program somaSerie implicit none integer i, n, soma write(*,*)'Insira um nmero inteiro: ' read(*,*)n soma = 0 do 10 i = 1, n soma = soma + i continue write(*,*) 'soma = ', soma stop end

10

O nmero 10 um rtulo ou label. O programador responsvel pela atribuio de nmero nico para cada label em cada programa. Lembrar que as colunas 2 a 5 so reservadas para designar labels. O valor numrico dos labels no tem significado, portanto qualquer nmero pode ser usado. Tipicamente, muitos programadores fazem incrementos de 10 em 10 aos labels.

Prof. Luiz Bianchi

12

Fortran 77 A varivel definida no comando do incrementada de 1 em 1 por padro, Entretanto, pode-se definir qualquer outro valor inteiro para o incremento. O segmento de programa abaixo imprime os nmeros pares entre 1 e 10 em ordem decrescente. program numPar implicit none integer i do 20 i = 10, 1, -2 write(*,*) 'i =', i continue stop end

20

A forma geral do comando do-loop a que segue:


do label var = comandos label continue expr1, expr2, expr3

var uma varivel do tipo integer (geralmente chamada de ndice do loop) expr1 especifica o valor inicial de var expr2 o limite terminal do loop e expr3 o incremento ou passo do loop. Nota: A varivel do comando do-loop nunca deve ser modificada por outro comando dentro do loop, pois causaria uma grande confuso. Muitos compiladores Fortran 77 permitem que do-loops sejam encerrados com o comando enddo. A vantagem que o comando label pode ento ser omitido. A contruo do loop com enddo largamente usada, mas no um componente do Fortran 77 ANSI.

while-loops
O modo mais intuitivo para escrever o while-loop
do while (expr lgica) comandos enddo

Os comandos sero repetidos contanto que a condio no comando while seja verdadeira. Ainda que esta sintaxe seja aceita por muitos compiladores ela no faz parte do Fortran 77 ANSI. O modo correto usar if e goto:
label if (expr lgica) then comandos goto label endif

A seguir, mostrado um exemplo que calcula e imprime todas as potncias de dois que so menores ou iguais a 100: program potencia2 implicit none

Prof. Luiz Bianchi

13

Fortran 77 integer n n=1 if (n .le. 100) then n = 2*n write (*,*) n goto 10 endif stop end

10

until-loops
Se o critrio de avaliao no fim ao invs de ser no comeo, ele geralmente denominado de until-loop, cujo pseudocdigo : do comandos until (expr lgica)

Isto pode ser implementado em Fortran 77 atravs das instrues if e goto:


label continue comandos if (expr lgica) goto label

12. O comando goto


Para avanar ou recuar na estrutura do programa pode ser utilizado o comando goto ou go to, escrito com as slabas unidas ou separadas. Sintaxe:
goto label

onde label o nmero da linha para a qual o fluxo de execuo desviado. O comando goto tem uma sintaxe alternativa denominada goto implcito:
goto (label1, label2, ..., labeln) varivel

Exemplo:
50 60 70

i = 3 go to (50,60,70) i write(*,*) Valor de i = 1 write(*,*) Valor de i = 2 write(*,*) Valor de i = 3

Resultado do exemplo:
Valor de i = 3.

13. Comandos bsicos de entrada e sada

Prof. Luiz Bianchi

14

Fortran 77 Uma parte importante de qualquer programa de computador a manipulao de entrada e sada de dados. Nos exemplos mostrados, j foram usadas as duas formas mais comuns: read e write. O I/O (Input/Output) em Fortran pode ser de construo bastante complexa, no entanto, aqui sero descritos apenas algumas formas mais simples.

Read e write
Read usado para entrada e write para sada de dados Uma forma simples :
read (unidade, formato) lista-de-variaveis write(unidade, formato) lista-de-variaveis

A unidade definida por um nmero associado a entrada ou sada padro do sistema. O formato corresponde ao nmero do rtulo (label) do comando format que ser descrito mais adiante. possvel simplificar esses comandos utilizando o smbolo asterisco (*) para alguns argumentos como fora feito em todos os exemplos anteriores.
read (*,*) lista-de-variveis write(*,*) lista-de-variveis

O primeiro comando (read) far a leitura de dados a partir da entrada considerada padro do sistema e associa os valores s variveis constantes na lista de variveis e o segundo (write) efetua a gravao na unidade assinalada como padro de sada de dados.

Exemplos
Segue um segmento de cdigo de um programa Fortran:
integer m, n real x, y read(*,*) m, n

read(*,*) x, y A leitura realizada atravs da entrada padro. Um arquivo de dados consiste de um conjunto de registros. Nos exemplos apresentados, cada registro contem um nmero (inteiro ou real). Os registros so separados por espaos ou vrgulas. Uma entrada vlida para o programa acima mencionado seria:
-1 100 -1.0 1e+2

Ou poderiam ser colocadas vrgulas separadoras:

-1, 100 -1.0, 1e+2

Observe que a entrada de dados no Fortran 77 sensvel a linha, assim sendo importante ter a quantidade correta de elementos (registros) em cada linha. Por exemplo, se os dados de entrada forem informados todos em uma nica linha como

Prof. Luiz Bianchi

15

Fortran 77
-1, 100, -1.0, 1e+2

ento s variveis m e n seriam atribudos os valores 1 e 100, respectivamente, porm os ltimos dois valores seriam descartados, deixando x e y sem valores ou indefinidos.

Outras verses
Para uma lista simples de entrada e sada possvel usar uma sintaxe alternativa
read *, lista-de-variaveis print *, lista-de-variaveis

que tem o mesmo significado dos comandos read e write descritos anteriormente. Esta verso permite leitura e gravao na unidade padro de entrada e sada uma vez que o asterisco (*) ajusta-se ao formato.

14. O comando Format


At agora foi mostrado o formato livre de entrada e sada. Geralmente o programador necessita de um formato especfico de entrada e sada para descrever valores de diferentes tipos (inteiros, reais, caracteres, etc.). Para essa finalidade o Fortran 77 dispem do comando Format que usado tanto para entrada como para sada de dados.

Sintaxe
write(*, label) lista-de-variveis label format(formato-codigo)

Um exemplo simples pode demonstrar o funcionamento. Uma varivel inteira contendo 4 algarismos e um nmero real em notao de ponto flutuante com 3 decimais, seus formatos poderiam ser assim codificados:
write(*, 900) i, x 900 format (I4,F8.3)

O label 900 do formato foi escolhido arbitrariamente, porem prtica comum numerar os comandos format com nmeros de valores mais altos do que os labels de controle de fluxo. Aps a palavra-chave format segue o formato entre parnteses. I4 para o tipo inteiro com a extenso de 4 dgitos e F8.3 para que o nmero seja impresso segundo a notao de ponto flutuante com a largura de 8 e com 3 casas decimais. O comando format pode ser codificado em qualquer lugar dentro da unidade de programa. H dois estilos de programao: O comando format tanto pode suceder ao comando read/write ou todos os comandos format podem ser agrupados no fim do programa.

Cdigos de format
Os cdigos de format mais comuns so:

Prof. Luiz Bianchi

16

Fortran 77 A D E F I X / $ textos nmeros de dupla preciso, notao de expoente nmeros reais, notao de expoente nmeros reais, formato de ponto fixo inteiros espaos horizontais nova linha inibe o avano de linha

A letra F (e semelhantemente D, E) tem a forma geral Fw.d, onde w uma constante inteira representando a largura do campo e d uma constante inteira que representa a quantidade de dgitos a direita do ponto decimal. Para inteiros apenas a largura do campo especificada, cuja sintaxe Iw. Da mesma maneira, cadeia de caracteres podem ser especificadas como Aw, porm a largura do campo geralmente truncada. Se o nmero ou srie de caracteres no preencher por inteiro a largura do campo, sero adicionados espaos. Geralmente o texto alinhado direita, mas a regra exata varia dentre os diferentes cdigos de formato. Para espacejar na linha usado o cdigo nX, onde n significa a quantidade de espaos. Se n for omitido, assumido como sendo 1 (n=1). Para o salto de linha usado o cdigo / (barra). Cada barra corresponde a uma nova linha. importante dizer que o comando read ou write predefine avano de linha.

Alguns exemplos
O seguinte trecho de cdigo Fortran,
100 110 120 130 x = 0.025 write(*,100) 'x=', format (A,F5.3) write(*,110) 'x=', format (A,F4.2) write(*,120) 'x=', format (A,E8.2) write(*,130) 'x=', format (A,E7.1) x x x x

produz os seguintes resultados:

x=0.025 x=0.03 x=0.25E-01 x=0.3E-01

Neste exemplo para cada comando write foi definido um comando format diferente. Mas perfeitamente possvel usar o mesmo comando format para diversos write. Alis, esta uma das principais vantagens de usar o comando format. Este recurso conveniente quando for preciso imprimir tabelas, por exemplo e deseja-se que cada linha tenha o mesmo formato. Em vez de especificar o formato em comandos format separados, pode-se definir o format diretamente no comando read/write. Por exemplo, o comando

Prof. Luiz Bianchi

17

Fortran 77

write (*,'(A, F8.3)') 'Resposta - x = ', x

equivalente a
write (*,990) 'Resposta x = ', x 990 format (A, F8.3)

O texto tambm pode ser digitado no comando format como no seguinte exemplo:
write (*,999) x 999 format ('Resposta - x = ', F8.3)

15. O comando Data


O comando data outro meio para entrada de dados declarado no momento em que o programa escrito. similar ao comando de atribuio. A sintaxe :
data lista-de-variveis/ lista-de-valores /, ...

onde o trs pontos significam repetio do modelo. Exemplo:


data m/10/, n/20/, x/2.5/, y/2.5/

Pode tambm ser escrito como segue:


data m,n/10,20/, x,y/2*2.5/

Equivale s atribuies:

m n x y

= = = =

10 20 2.5 2.5

O comando data declarado somente uma vez antes do incio dos comandos de execuo do programa Por isso, o comando data usado principalmente no programa principal e no em sub-rotinas. O comando data pode tambm ser usado para inicializar vetores e matrizes. O exemplo a seguir mostra como zerar uma matriz no programa:
real A(10,20) data A/ 200 * 0.0/

Alguns compiladores inicializam automaticamente as matrizes, mas nem todos o fazem. Naturalmente, as matrizes podem ser inicializadas com outros valores diferentes de zero. Pode-se tambm inicializar os elementos da matriz individualmente:
integer v(5) real B(2,2) data v/10,20,30,40,50/, B/1.0,-3.7,4.3,0.0/

Prof. Luiz Bianchi

18

Fortran 77

16. Vetores e Matrizes


Muitos clculos cientficos usam vetores e matrizes. O tipo de dado Fortran usado para a representao de tais objetos a matriz ou array. O array de uma dimenso corresponde ao vetor, ao passo que o array bidimensional corresponde a matriz. Para o completo entendimento de como isso funciona em Fortran 77, deve-se conhecer no s a sintaxe empregada, mas tambm como esses objetos so armazenados na memria.

Matriz unidimensional
A matriz unidimensional ou vetor exatamente uma seqncia linear de elementos armazenados consecutivamente na memria. Por exemplo, a declarao
real a(20)

declara a como um array de tamanho 20. Isto , a consiste de 20 nmeros reais armazenados contiguamente na memria. Por conveno, arrays Fortran so indexados de 1 em diante. Assim sendo, o primeiro elemento no array designado por a(1) e o ltimo por a(20). No obstante, pode-se definir uma faixa de ndices arbitrariamente, por exemplo:
real b(0:19), estranho(-162:237)

b similar ao exemplo anterior, exceto o ndice que vai de 0 a 19. Estranho um array que admite 400 elementos, apurados como segue: 237-(-162)+1 = 400. O tipo dos elementos de um array pode ser qualquer dos tipos de dados bsicos. Exemplos:
integer i(10) logical a(0:1) double precision x(100)

Cada elemento de um array pode ser considerado como uma varivel isolada. Faz-se referncia a um elemento do array a por a(i). A seguir, exibido um exemplo de cdigo que armazena os 10 primeiros nmeros quadrados no array de nome quadra e, em seguida os exibe:
program potencia implicit none integer i, quadra(10) do 100 i = 1, 10 quadra(i) = i**2 write(*,'($,i3,a)')quadra(i),', ' .100 continue stop end

Um erro comum em Fortran aquele em que o programa tenta acessar elementos do array que esto fora dos limites ou indefinidos. Isto da responsabilidade do programador uma vez que o compilador no detecta tais erros.

Matriz bidimensional

Prof. Luiz Bianchi

19

Fortran 77 As matrizes tem essenciais aplicaes em lgebra linear. So usualmente representadas por arrays de duas dimenses. Por exemplo, a declarao
real A(3,5)

define um array bidimensional de 3 x 5 = 15 nmeros reais. conveniente imaginar o primeiro ndice como o ndice de linha e o segundo como ndice de coluna. Assim, entende-se como mostrado na seguinte ilustrao:
(1,1) (2,1) (3,1) (1,2) (2,2) (3,2) (1,3) (2,3) (3,3) (1,4) (2,4) (3,4) (1,5) (2,5) (3,5)

Arrays bidimensionais tambm podem ter ndices definidos dentro de faixa numrica abitrria. A sintaxe geral para a declarao :
nome (indInferior1 : indSuperior1, indInferior2 : indSuperior2)

O tamanho total do array :


tamanho = (indSuperior1-indInferior1+1)*(indSuperior2-indInferior2+1)

muito comum em Fortran declarar arrays maiores do que o tamanho da matriz desejada. (Isso porque Fortran no permite alocao dinmica de memria). Exemplo: program matrizbi implicit none real a(3,5) integer i,j c c c Nesse exemplo so usados os elementos de at 3 por 3. do 20 j = 1, 3 do 10 i = 1, 3 a(i,j) = real(i)/real(j) write(*,*)a(i,j) continue continue stop end

10 20

Os elementos na submatriz A(1:3,4:5) ficam indefinidos. Neste caso, no assumido que esses elementos sejam inicializados com valor zero pelo compilador. (Alguns compiladores podero zerar, mas no todos).

Iterao implcita

Prof. Luiz Bianchi

20

Fortran 77 Por exemplo, uma matriz bidimensional (3 x 4) de nmeros inteiros pode ser impressa, codificando-se como segue: program loopImplicito implicit none integer a(3,4),i,j data a/1,2,3,4,5,6,7,8,9,10,11,12/ do 10 i = 1, 3 write(*,1000) (a(i,j), j=1,4) 10 continue 1000 format (I3) stop end Nas instrues acima, verifica-se uma iterao explcita referente as linhas da matriz e uma iterao implcita que se refere as colunas, ndice j. Freqentemente, o comando format envolve repeties, por exemplo:
950 format (2X, I3, 2X, I3, 2X, I3, 2X, I3)

Para este tipo de codificao, h uma notao resumida, como:


950 format (4(2X, I3))

possvel fazer repeties sem posicionar explicitamente quantas vezes o formato ser repetido. Supondo que se deseja imprimir os primeiros 50 elementos de um vetor, com 10 elementos em cada linha., pode-se proceder como segue: program repete implicit none integer x(80),i data x/80*100/ write(*,1010) (x(i), i=1,50) 1010 format (10I6) stop end O comando format declara que dez nmeros sero impressos. Mas a descrio do comando diz haver 50 nmeros a serem impressos. Contudo, depois de serem impressos os primeiros dez elementos, o mesmo comando format automaticamente utilizado para os prximos dez e assim por diante.

Armazenamento de matrizes de duas dimenses


O Fortran armazena arrays como uma seqncia linear contgua de elementos. conveniente saber que arrays de duas dimenses so armazenados em colunas. No exemplo acima, o

Prof. Luiz Bianchi

21

Fortran 77 elemento (1,2) seguir o elemento (3,1). Sucedem os demais da segunda coluna, depois a terceira coluna, e assim por diante. Considerar o exemplo no qual foi utilizado apenas at 3 por 3 elementos do array definido com o tamanho de 3 x 5, A(3,5). Os 9 elementos considerados sero armazenados nas primeiras nove localizaes de memria, as outras 6 ltimas localizaes que foram inicialmente reservadas no sero usadas.

Matriz multidimensional
O Fortran 77 permite arrays de at sete dimenses. A sintaxe e o formato de armazenamento so anlogos aos de duas dimenses.

O comando dimension
H uma forma alternativa para declarar arrays em Fortran 77. Os comandos
real A, x dimension A(10,20) dimension x(50)

so equivalentes a
real A(10,20), x(50)

O comando dimension hoje um estilo considerado antiquado.

17. Subprogramas
Quando um programa maior que umas poucas centenas de linhas, torna-se difcil sua compreenso. Programas que resolvem problemas de engenharia geralmente possuem dezenas de milhares de linhas. O nico modo para tratar cdigos extensos utilizar uma abordagem modular e dividir o programa em pequenas unidades denominadas subprogramas. Um subprograma consiste num trecho de cdigo para solucionar um subproblema bem definido. Extensos programas, geralmente tm que resolver o mesmo subproblema com diferentes dados. Em vez de duplicar cdigo, resolve-se esta questo atravs da adoo de subprogramas. O mesmo subprograma pode ser chamado muitas vezes para operar com diferentes dados de entrada. O Fortran utiliza dois tipos de subprogramas, denominados funes e sub-rotinas.

Funes
Funes Fortran so totalmente similar as funes matemticas: Ambos aceitam um conjunto de argumentos de entrada (parmetros) e retornam um valor de mesmo tipo. Na discusso precedente foi falado sobre subprogramas definidos pelo usurio. O Fortran 77 tambm possui funes incorporadas. Um exemplo bsico ilustra o uso de uma funo:

Prof. Luiz Bianchi

22

Fortran 77

x = cos(pi/3.0)

cos refere-se a funo coseno, assim x receber o valor 0.5 (se pi estiver corretamente definido; o Fortran 77 no possui constantes incorporadas). H muitas funes embutidas no Fortran 77. Algumas das mais comuns so:
abs min max mod sqrt sin cos tan atan exp log valor absoluto valor mnimo valor mximo resto da diviso raiz quadrada seno coseno tangent arco tangente exponencial (natural) logaritmo (natural)

Exemplos:
real x, numAbs integer y, z, resto x = -1 y = 5 z = 2 numAbs = abs(x) resto = mod(y,z)

Em geral, a funo sempre tem um tipo. A maioria das funes internas mencionadas acima, contudo, so genricas. Conforme mostrado no exemplo acima, pi e x podem ser do tipo real ou double precision. O compilador verificar o tipo e o uso da verso correta de cos (real ou double precision). Infelizmente, o Fortran no realmente uma linguagem polimrfica, de maneira que, em geral deve-se atentar para os tipos das variveis e suas funes. Agora, sero verificadas as funes definidas pelo usurio. Uma funo semelhante a um programa, mas ela pode retornar um valor. Uma funo pode utilizar argumentos, como constantes, variveis ou expresses passadas para ela por um programa de chamada. Caso uma funo no tenha argumentos, sua instruo function deve incluir um conjunto de parnteses vazio. Uma funo retorna um valor atribuindo um valor ao seu nome em uma ou mais instrues do programa. No exemplo a seguir, a funo Celsius calcula o nmero de graus Celsius a partir dos graus Fahrenheit. Quando a funo for chamada a partir do programa principal, uma varivel que contm o valor do argumento ser passada para a funo. O resultado do clculo retornado para o programa de chamada. program chama real temp write(*,*) 'Insira graus fahrenheit: ' read (*,*) temp

Prof. Luiz Bianchi

23

Fortran 77 write(*,*) 'Temperatura: ', celsius(temp), ' graus C.' stop end real function Celsius(fah) Celsius = (fah - 32) * 5 / 9 return end Observar que a estrutura da funo envolvida assemelha-se a do programa principal. As diferenas so: Funes tem um tipo. Este tipo deve tambm ser declarado no programa chamador. O valor de retorno ser armazenado na varivel que tem o mesmo nome da funo. Funes so terminadas pelo comando return em vez de stop.

A sintaxe geral de uma funo em Fortran 77 :


tipo function nome (lista-de-variveis) declaraes comandos return end

A funo deve ser declarada com o mesmo tipo da varivel declarado no programa chamador. A funo chamada simplesmente usando o nome da funo e a lista de parmetros entre parnteses.

Sub-rotinas
Um funo essencialmente retorna um valor. Pretendendo retornar dois ou mais valores (ou ocasionalmente nenhum), deve-se desenvolver uma sub-rotina. A seguir mostrado a sintaxe de uma sub-rotina:
subroutine nome (lista-de-argumentos) declaraes comandos return end

Observe-se que a sub-rotina no tem nenhum tipo especificado e conseqentemente no ser declarado no programa chamador. A seguir apresentado um exemplo de uma sub-rotina que tem por objetivo trocar dois valores inteiros: subroutine itroca (a, b) integer a, b c Variaveis locais integer tmp tmp = a

Prof. Luiz Bianchi

24

Fortran 77 a=b b = tmp return end Observar que h dois blocos de declarao de variveis. O primeiro, declara os parmetros de entrada e sada, isto , variveis comuns ambos chamador e chamado. O segundo bloco declara variveis locais, ou seja, aquelas que s podem ser usadas dentro do subprograma. Pode ser usado o mesmo identificador de varivel em diferentes subprogramas que o compilador reconhecer e far a necessria distino.

Chamada-por-referncia
O Fortran 77 utiliza o paradigma denominado chamada-por-referncia. Isto significa que em vez de passar os valores dos argumentos para a funo/sub-rotina (chamada-por-valor), so passados os endereos de memria dos argumentos. Um pequeno exemplo, a seguir, mostra a diferena: program chama integer m, n c m=1 n=2 call itroca(m, n) write(*,*) m, n stop end O resultado deste programa 2 1, exatamente o que era esperado. Entretanto, se o Fortran 77 estivesse usando chamada-por-valor o resultado teria sido 1 2, ou seja, as variveis m e n no seriam permutadas. A razo para isto que apenas os valores de m e n foram copiados da subrotina itroca, e igualmente se a e b fosse trocado dentro da sub-rotina os novos valores no teriam sido retornado ao programa principal.

Prof. Luiz Bianchi

25

Вам также может понравиться