Академический Документы
Профессиональный Документы
Культура Документы
Sumrio
1. Prlogo........................................................................................................................................3 Fortran 77......................................................................................................................................3 2. Introduo..................................................................................................................................3
Por que Fortran?..............................................................................................................................3 Portabilidade....................................................................................................................................3
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.
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.
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.
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.
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.
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.
Fortran 77 Exemplos:
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.
5. Constantes
Exemplos de constantes inteiras (integer): : Exemplos de constantes reais (real):
0 -100 32767 +15
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.
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
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.
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
Expresses aritmticas
Expresses simples so da forma: Exemplos: x + y
x + 2 * y
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.
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
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)
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
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
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
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
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
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
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.
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
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
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)
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
Resultado do exemplo:
Valor de i = 3.
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
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
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.
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:
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
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
17
Fortran 77
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)
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/
18
Fortran 77
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
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)
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
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)
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.
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)
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:
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
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 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
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.
25