Apostila simples e compacta, porém como tudo o que é essencial para aprender a programar em Fortran
NO ES B SICAS DE LINGUAGEM FORTRAN Notas de Aula
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Linguagem Fortran (Notas de Aula)
1. Introdu o: A linguagem FORTRAN foi a primeira linguagem de programa o de alto n vel desenvolvida, foi desenvolvida pela IBM especificamente para c lculos num ricos, o que o torna muito robusto para trabalhar com n meros. Aqui, ser abordada a programa o estruturada tamb m conhecida como programa o "up-down" (de cima para baixo). Um programa escrito como um texto, onde as frases s o ordens, conhecidas como comandos, dadas ao computador. Quando o computador l um programa dizemos que ele est sendo executado. Este programa pode ser escrito sem uma regra predefinida de execu o, chamado de n o-estruturado, come ando do in cio do texto, indo para o meio, depois para o final, voltando para o in cio, de novo para o final, voltando para o meio, e finalmente terminando a execu o do programa.
: Seq ncia de execu o de um programa n o-estruturado. Complicado? Por isso foram criadas regras de programa o aconselhando aos programadores que fossem criados programas mais organizados, tanto na disposi o dos comandos, quanto na execu o, estes programas s o chamados de estruturados. Basicamente as regras dizem que os programas fossem escritos linearmente de cima para baixo, sem os sobe e desce que complicam e tornam ileg veis os programas. Os programas estruturados t m as seguintes caracter sticas: Clareza deve estar claro o que cada comando realiza; Legibilidade deve ser f cil de se ler e compreender; Adapt vel deve ser f cil adapt -lo a qualquer situa o; F cil Manuten o deve ser f cil alterar, ou encontrar as linhas de comando; Boa Documenta o Qualquer pessoa, mesmo que n o saiba programar com Fortran, deve ter condi es de compreender o programa. Al m dessas caracter sticas, o programa s pode usar tr s estruturas b sicas de controle: Seq ncia comandos escritos um ap s o outro na ordem em que v o ser executados; Sele o comandos que permitem escolher entre um resultado e outro, ou entre a execu o de um comando e outro; Repeti o, Itera o ou "Loop" comandos que permitem repetir quantas vezes se queira um determinado comando ou conjunto de comandos. O princ pio b sico da programa o estruturada que a execu o do programa deve ser feita sempre para diante, sem desvios e retornos. Os comandos de sele o e de repeti o s o considerados como um nico comando e n o como desvios ou retornos.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
2. Caracter sticas B sicas do Fortran: Caracteres aceitos: Letras : a, b, c, d, e, f, g, h, i, j, k, ,l m, n, o, p, q, r, s, t, u, v, w, x, y, z A, B, C, D, E, F, G, H, I, J, K, ,L M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z N meros: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 S mbolos: + -
*
/
=
(
)
,
.
Constantes, Vari veis e Tipos: Constantes: Local na mem ria do computador que serve para guardar um n mero, letra ou s mbolo, este valor n o pode ser alterado. representado com um nome que dado pelo programador, que tamb m n o pode ser alterado durante o programa. O nome deve obedecer a algumas regras que ser o apresentadas a seguir. Vari vel: Local na mem ria do computador que serve para guardar um n mero, letra ou s mbolo, este valor pode ser alterado. representado com um nome que dado pelo programador, que n o pode ser alterado durante o programa. O nome deve obedecer a algumas regras que ser o apresentadas a seguir. Regra para dar nome a vari veis: 1) Cada nome deve ter no m ximo 6 caracteres e no m nimo 1 caracter; 2) O primeiro caracter deve ser obrigatoriamente uma letra; 3) Os demais caracteres s podem ser letras ou n meros; 4) N o pode ter espa o em branco no meio do nome. Exemplos: Nomes v lidos: JOSE, A1, D3F4, HI98, a23, joao, df34, A4f5. Nomes inv lidos: JOS , 1A, D!F4, H(1), 5b, jo o, Nomecomprido. Tipos: Identifica o tipo de informa o que a vari vel ou constante ir guardar. Integer guarda n meros inteiros, ex. 1 23 -15 0; Real guarda n meros reais, ex. 1.2 23.0 -15. 0.002; Complex guarda n meros complexos, ex. 1.2 + i 23.0 -15. + i 0.002; Character guarda caracteres, ex. ab', DaQ, '09', +', (%) !'; Logical guarda valores l gicos, ou seja, verdadeiro ou falso; Obs. 1: Basta a presen a de um ponto "." para que o n mero seja real. Obs. 2: Se n o for especificado o tipo de constante ou vari vel, o Fortran ir considerar todos os nomes iniciados com os caracteres I, J, K, L, M, N, como sendo inteiro e o restante como sendo real. Obs. 3: Um n mero complexo escrito entre par ntesis. Por exemplo: 1 + i 2 = (1, 2) -1 + i3 = (-1, 3) -4.5 i2.1 = (-4.5, -2.1) Obs. 4: Em Fortran, o valor verdadeiro do tipo logical escrito como .true., e o valor falso como .false., n o se pode esquecer os pontos no in cio e no fim dos valores l gicos. Qual a import ncia de se dividir as constantes e vari veis em tipos ? Existem dois grandes problemas, o primeiro a quantidade de mem ria requerida para guardar um valor qualquer. l gico que para guardar o n mero 9284365.9872 deve-se gastar mais mem ria que para guardar o n mero 19, por exemplo. Al m disso, existem tipos que admitem opera es aritm ticas como os tipos integer, real e complex, enquanto que outros n o admitem, como o character e o logical. N o faz sentido dividir o valor abc' por 2, ou multiplicar o valor .true. por 3.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Como informar qual o tipo de uma vari vel ? Basta escrever o nome do tipo seguido de um espa o e do nome das vari vel no programa, onde os nomes das vari veis s o separados por v rgula (","). Por exemplo: integer a1, i2, valor1, numero real a1, i2, valor1, numero complex a1, i2, valor1, numero character a1, i2, valor1, nome logical a1, i2, valor1, logico, vouf Cada tipo de vari vel possui um tamanho de mem ria para que ele possa guardar informa es, conforme apresentado a seguir: Tipo Tamanho Valor M nimo Valor M ximo Integer 4 bytes -2147483648 +2147483647 Real 4 bytes -3.4028235E+38 +3.4028235E+38 Complex 8 bytes -3.4028235E+38 +3.4028235E+38 - i 3.4028235E+38 + i 3.4028235E+38 Character vari vel vazio 32.767 caracteres Logical 4 bytes .false. ou .true. .false. ou .true. Obs. 1: O n mero real pode ser representado na forma de nota o cient fica, onde o s mbolo "E" ou "e" representa a base da pot ncia 10. 12 -4 Ex. 1.5E12 = 1.5 x 10 ,-0.1e-4 = -0.1 x 10 . Obs. 2: Para n meros reais qualquer valor acima de -1.1754944E-38, ou abaixo de +1.1754944E-38 considerado igual a zero ("0"). Obs. 3: O expoente da pot ncia de 10 deve ser inteiro. Obs. 4: O tipo complex pode ser considerado como dois tipos reais, onde cada um ocupa 4 bytes, dando um total de 8 bytes. Obs. 5: Os valores do tipo character devem estar entre ap strofes " " e "'". Ex. Texto' 0897' a1(4)' Obs. 6: O tamanho, em bytes, de um tipo character igual a quantidade de caracteres que a constante ou vari vel possui mais 1, onde este byte a mais, guarda o tamanho da constante ou vari vel. 3. Express es: Existem tr s tipos de express es em Fortran, as express es aritm ticas, cujo resultado um n mero, as express es l gicas, e as express es relacionais, cujos resultados s o .true. ou .false. Express es Aritm ticas: Operador Fortran + * / * Operador Matem tico + ab ou ab Significado Adi o Subtra o Multiplica o Divis o Potencia o ou Radicia o Exemplo A+B A B A*B A/B A * B
Como na matem tica existe uma hierarquia, chamada de ordem de preced ncia, ou seja, quais opera es ser o executadas primeiro. Em uma express o aritm tica os operadores ser o executados obedecendo a ordem de preced ncia, mas para operadores de mesma ordem ser o executados da esquerda para a direita. A ordem de preced ncia pode ser alterada com par ntesis "(" e ")", pode-se ter v rios n veis de par ntesis, mas n o se pode usar colchetes "[" e "]" ou chaves "{" e "}". A ordem de preced ncia apresentada a seguir: Operador * * / Ordem de Preced ncia a 1 ordem (ordem mais alta) a 2 ordem a 3 ordem
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
a
+ Exemplo: A * B * C + D E * F =
4 ordem 5 ordem (ordem mais baixa)
a
(((A * (B * C)) + D) (E * F))
Exemplos de Express es Aritm ticas 2
Codifica o em Fortran a * x *2 + b * y + c a / (b + c)
ax + by + c a b+c x n -1
yn
x * (n 1) / y * n
Obs. 1: Nenhum operador pode ser omitido. Por exemplo: ax + b a * x + b. Obs. 2: Dois operadores n o podem aparecer juntos: Por exemplo: a * -b a * (-b). Obs. 3: Nos expoentes podem existir constantes, vari veis ou express es aritm ticas. Obs. 4: Das opera es aritm ticas acima, a divis o diferente para n meros inteiros e reais, para opera es com n meros inteiros, a casa decimal do resultado truncada. Exemplos: 7 / 2 = 3, e n o 3.5 1 / 3 = 0, e n o 0.33, pois os resultados s o inteiros, mas 7.0 / 2 = 3.5 e 1.0 / 3 = 0.33, pois quando um dos n meros real o resultado passa a ser real, exceto quando a vari vel inteira, neste caso o resultado convertido para inteiro. Express es L gicas: Operador Fortran .GT. .GE. .LT. .LE. .EQ. .NE. Operador Matem tico = Significado Maior que Maior ou igual a Menor que Menor ou igual a Igual Diferente Exemplo A B AB A B AB A=B AB
a a+b + b+c c
x +1
((a + b) / c + a / (b + c)) * (x + 1)
A ordem de preced ncia igual para todos os operadores l gicos e os resultados de cada opera o ser sempre .true. ou .false., a ordem de preced ncia pode ser alterada com par ntesis "(" e ")". Exemplo: (A .GT. B) .EQ. (C .NE. D) Express es Relacionais: Operador Fortran .NOT. .AND. .OR. .XOR. Operador Matem tico N o existe N o existe Significado Nega o E Ou Ou exclusivo Exemplo .NOT. A A .AND. B A .OR. B A .XOR. B
A ordem de preced ncia a mesma apresentada acima, elas funcionam e obedecem as mesmas regras que as express es aritm ticas, e pode ser alterada com par ntesis. Elas s o usadas em conjunto com as express es l gicas.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Obs. O operador .NOT. usado com apenas 1 argumento, os demais usam 2 argumentos. Exemplo: ((A .GT. B) .EQ. (C .NE. D)) . AND. F O significado desses operadores um pouco diferente do que a matem tica usa, a seguir s o apresentadas tabelas chamadas de Tabela Verdade. Estas tabelas mostram os poss veis resultados das express es relacionais. A .false. .false. .true. .true. A .false. .false. .true. .true. B .false. .true. .false. .true. B .false. .true. .false. .true. A .AND. B .false. .false. .false. .true. A .XOR. B .false. .true. .true. .false. A .false. .false. .true. .true. A .false. .true. B .false. .true. .false. .true. .NOT. A .true. .false. A .OR. B .false. .true. .true. .true.
4. Comandos de Atribui o, Escrita e Leitura: Como guardar um valor num rico na mem ria do computador ? H v rias maneiras de se guardar n o apenas um n mero, mas qualquer tipo de informa o, como texto, som, imagem, etc. Contudo, o nosso objetivo guardar, ou armazenar, n meros e caracteres na mem ria do computador. Uma maneira usar o comando de atribui o, semelhante ao comando de igualdade da matem tica, por m muito mais poderoso. 4.1. Comando de Atribui o: O comando de atribui o serve para armazenar valores num ricos e caracteres em constantes e vari veis, ou seja, na mem ria do computador, pois constantes e vari veis s o pequenos peda os de mem ria do computador que servem como armazenamento tempor rio ou permanente. Quando gravamos apenas nas constantes ou vari veis estamos gravando na mem ria principal (RAM), e como ele vol til ao t rmino do programa a mem ria apagada. Enquanto que, quando gravamos no disco r gido ou nos disquetes, neste caso dizemos que guardamos em arquivos (mem ria secund ria ou de massa) as informa es ficam gravadas permanentemente, at o momento que decidirmos apagar as informa es. Para usar o comando de atribui o basta colocarmos do lado esquerdo uma vari vel ou uma constante, o s mbolo de igualdade ("=") seguida de uma constante, vari vel ou express o do lado direito. Ex.: x=5 y=a+b z = nome' Obs.: Do lado esquerdo n o pode aparecer nenhuma express o ou constante, apenas vari veis, pois n o h como fazer uma atribui o a uma express o, nem a uma constante, j que seu valor fixo. At agora vimos que o s mbolo de atribui o id ntico a igualdade da matem tica, qual a diferen a? Na matem tica podemos ter algo como o seguinte exemplo: x=x+1 y y=2 Na matem tica n o se pode ter algo parecido, como dizer que x = x + 1? x = x + 1, basta passar tudo que tem x para a esquerda, ent o: x x=1 0 = 1, zero igual a um ! Isto pode? claro que n o. Ent o como o computador faz isso ? Ele pega o valor de x que est guardado na mem ria do computador (se n o tiver nenhum ent o zero para n mero, e vazio para caracteres) soma com 1 e guarda o novo valor no x que est do lado esquerdo. Por exemplo, suponha que na mem ria do computador tem x = 2, ent o temos: x=x+1
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
x=2+1 x = 3, ou seja, na mem ria passa a ficar gravado o valor 3, ao inv s do 2 que havia antes. O que v lido e o que n o v lido? V lido N o v lido x=1 1=x x=y+1 1+y=x 2 2 2 x = x + 2x 2 x = x 2x + 5 4.2. Comando de Escrita: um comando utilizado para escrever na tela, ou monitor, do computador, e tamb m para escrever em um arquivo no disco. O comando de escrita WRITE, ele pode ser utilizado de uma forma muito complexa, por m utilizaremos sua forma mais simples, a chamada forma livre. Formas de uso: write(*,*) a write(*,*) 5 write(*,*) a + b write(*,*) 5 / x write(*,*) texto' O primeiro *' substitui o n mero correspondente a linha onde est o formato do n mero (ser apresentado mais adiante), o segundo *' substitui o dispositivo de sa da (monitor, impressora ou arquivo). 4.3. Comando de Leitura: um comando utilizado para ler do teclado do computador, e tamb m para ler de um arquivo no disco. O comando de leitura READ, tamb m utilizaremos sua forma mais simples, a chamada forma livre. Diferentemente do comando de escrita, o comando de leitura s pode se referenciar a vari veis, j que a leitura de um valor deve ser guardado na mem ria do computador. Formas de uso: read(*,*) a read (*,*) b O primeiro *' substitui o n mero correspondente a linha onde est o formato do n mero (ser apresentado mais adiante), o segundo *' substitui o dispositivo de entrada (teclado ou arquivo). Obs.: Os comandos de escrita e leitura podem ser utilizados para escrever ou ler mais de uma vari vel de cada vez. Exemplo: read(*,*) a, b, c write(*,*) a, b, texto', 5, a + 2 * b Por m na leitura deve-se ter o cuidado de separar os valores digitados por v rgulas ou espa os, j para a escrita ser o escritos todos juntos, ent o para evitar esse p ssimo h bito vou aconselhar que use um comando de escrita e de leitura para cada vari vel, constante, ou caracter, como nos primeiros exemplos. 5. Como Escrever um Programa em Fortran
1 2 3 4 5 6 7 8 9 10 11 70 71 72 73 74 75 76 77 78
Um programa escrito em Fortran escrito em qualquer editor de textos, em seguida deve ser salvo (gravado em disco) com a extens o .for. Na digita o deve-se observar o seguinte:
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Para as colunas: 1. O programa deve ser escrito a partir da coluna 7 at a coluna 72, ap s esta coluna tudo desprezado. 2. A coluna 1: reservada para sinaliza o de coment rios, basta colocar uma letra c (mai sculo ou min sculo) nesta coluna e toda a linha considerada como coment rio, ou seja, um aviso ou mensagem, e n o como parte constituinte do programa. 3. Colunas 1 a 5: numera o de linhas, pode-se numerar todas as linhas do programa, mas na pr tica se numeram apenas comandos que exigem a numera o. 4. Coluna 6: identificador de continua o de linha de comando. Caso algum comando n o caiba entre as colunas 7 e 72, basta colocar um caracter qualquer na coluna 6 e continuar o comando como se n o houvesse interrup o, um comando pode ocupar mais de uma linha (duas, tr s, etc).
1 1 2 3 4 5 6 7 8 9 2 3 4 5 6 7 8 9 10 70 71 72 73 74 75 76 77 78
Para as linhas: 1. Linha 1: Pode-se usar o comando Program nome, para identificar o nome do programa. 2. Linha 2: Pode-se declarar as constantes (pode fazer isso em v rias linhas). 3. Linha 3: Pode-se declarar vari veis (pode fazer isso em v rias linhas). 4. Linha 4 at a antepen ltima: Escreve-se o programa. 5. Pen ltima linha: o comando stop, indicando a parada de execu o do programa. 6. ltima linha: o comando end indicando o final do programa. O comando stop apenas encerra a execu o do programa, podem existir v rios comandos stop no programa, por m apenas um comando end. Pode-se colocar coment rios em qualquer linha do programa. A seq ncia aqui sugerida para que se possa escrever programas sem se ter problemas, apesar de alguns comandos poderem vir em posi o diferente, por m recomendo seguir esta "receita de bolo". A seguir apresento um pequeno programa que l dois n meros e apresenta sua soma. O primeiro passo dar uma mensagem pedindo para o usu rio digitar um n mero, em seguida se l esse n mero, o segundo passo apresentar uma nova mensagem para se digitar um n mero e novamente se l esse n mero. O terceiro passo somar os n meros e armazenar o resultado em uma vari vel, apresentando o resultado acompanhado de uma mensagem que o identifica. program soma real x, y, s write(*,*)'Digite um n mero:' read(*,*)x write(*,*)'Digite outro n mero:' read(*,*)y s=x+y write(*,*)'O resultado da soma : ', s stop end O programa pode ser escrito em letras mai sculas ou min sculas, foi convencionado pelos programadores que programas escritos em Fortran seriam em letras mai sculas, por m por motivo de est tica, apar ncia com outras linguagens de alto n vel como o Pascal e C, escreverei todos os programas em letras min sculas. A seguir o programa ser reescrito nas respectivas colunas e com coment rios.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
1 c c c c c
2
3 p p
4 r r
5 o o
6 g g
7 r r
8 a a
9 m m
0 a a
1 d :
2 o
3 r c d
4 : o d y p , * s , * m
5
6 I
7 d u
8 a l n
9 l o r
0 m
1 i p e
2 r a r v
3
4 d
5 e
6
7 S
8 o r
9 u e
0 z s
1 a e
2
3 Q
4 u a
5 e r
6 i
7 r a
8 o
9 z s
0
1 J
2 a
3 n
4 i d
5 o e
6 r
7
l i e , r * ) e * ) e
c s
m i
r o e
a s i s
a
p
n
t
o
m
d
e
c
l
a r u w r u w r
r e r r e r r e d = e r o t n
a a a i a a i a o x n i
l
o x o ( * o ( * n
v s i ) x g ) y r m
a
,
c
l
e
i
t
t d
d e ( d e (
* ,
e d
i i
r g
o i
t
n e
m u
e m
r
o n
m
e
r
o
C
l
e
i
t
t d s + t t p p
* ,
u
n d
d i
o g
i
n t
e
m
e o
r u
o t
r
o
n
m
e
r
o
c
s
o
m
a s
o
s
y a e r ( o * g o , r d ) m o a r o e r s e u s l u t l a t d a o d
c
a
p
r
e
s w d s e
* a
o
d
a
s
o
m
a
:
,
s
c
f
i
m
o d
Obs. 1: Obs. 2: Obs. 3: Obs. 4:
A numera o acima apenas para identificar a coluna em que iniciou a digita o. Podem existir quantas linhas em branco se desejar no programa. Apenas os coment rios podem ocupar qualquer coluna e qualquer linha no programa . O comando program foi substitu do por coment rios que s o mais explicativos.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Na tela do computador surgir algo do tipo: C: soma Digite um n mero: 2 Digite outro n mero: 3 O resultado da soma : ', 5 Program Stopped. C: De agora em diante todos os programas ser o apresentados livremente sem os quadrados da tabela da p gina anterior. 7. Fun es Predefinidas Algumas fun es matem ticas comuns est o incorporadas no Fortran e podem ser utilizadas normalmente no programa. Deve-se tomar algumas precau es no uso das fun es, a primeira quanto ao argumento delas, deve-se observar o tipo de argumento (inteiro, real, complexo ou character), a segunda precau o quanto ao valor retornado da fun o (resultado da fun o) a vari vel onde ser armazenado o resultado da fun o deve ser do mesmo tipo do valor que a fun o retorna. Tipo do Tipo do Valor Argumento Retornado (tipo de x) Valor absoluto (m dulo) abs(x) real real Valor absoluto (m dulo) iabs(x) integer integer Valor absoluto (m dulo) cabs(x) complex complex Converter n mero real para inteiro ifix(x) real integer Converter n mero inteiro para real float(x) integer real Resto da divis o de n1 por n2 mod(x1,x2) integer integer Exponencial exp(x) real/complex real/complex Logaritmo log(x) real/complex real/complex Raiz quadrada sqrt(x) real/complex real/complex Seno de um ngulo em radianos sin(x) real/complex real/complex Coseno de um ngulo em radianos cos(x) real/complex real/complex Tangente de um ngulo em radianos tan(x) real real Arco-tangente em radianos atan(x) real real Seno hiperb lico sinh(x) real real Coseno hiperb lico cosh(x) real real Tangente hiperb lico tanh(x) real real Parte real do n mero complexo real(x) complex real Parte imagin ria do n mero complexo imag(x) complex real Conjugado do n mero complexo conjg(x) complex complex Comprimento do string* len(x) character integer * O comprimento do string corresponde quantidade de caracteres na vari vel. Fun es mais Comuns Fun es em Fortran Exemplos de uso das fun es: Express o Aritm tica Express o em Fortran
sin (2y )
x+y
+ sinh (x )
abs( x + y ) / sin( 2 * 3.14 * y ) + sqrt( sin( x ) )
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
9
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
cos(y )e tan (ln (x ))
8. Exemplos de Programas
cos( y ) * exp( tan( log( x ) ) )
1. Programa para ler um n mero e apresentar o seno, coseno e tangente: program trigon c declara o da vari vel real x c leitura do n mero write(*,*) 'Digite um n mero: read(*,*) x c c lculo das fun es e apresenta o dos resultados write(*,*)'Seno do n mero em radianos = ,sin(x) write(*,*)'Coseno do n mero em radianos = ,cos(x) write(*,*)'Tangente do n mero em radianos = ,tan(x) c fim do programa stop end 2. Programa para ler o nome de uma pessoa e dizer quantas letras tem o nome: program letras c declara o da vari vel character com no m ximo 30 caracteres character*30 nome c leitura do nome write(*,*) 'Digite seu nome (m ximo 30 letras): read(*,*) nome c c lculo da quantidade de letras e apresenta o do resultado write(*,*)'Quantidade de letras no nome = ,len(nome) c fim do programa stop end 3. Programa para calcular as ra zes reais de uma fun o do 2 grau: program grau2 c declara o da vari vel real a, b, c, x1, x2, delta c leitura dos coeficientes write(*,*) 'Digite o coeficiente a: read(*,*) a write(*,*) 'Digite o coeficiente b: read(*,*) b write(*,*) 'Digite o coeficiente c: read(*,*) c c c lculo das ra zes delta = b*2 4 * a * c x1 = (-b + sqrt(delta)) / (2 * a) x2 = (-b - sqrt(delta)) / (2 * a) c apresenta o dos resultados write(*,*)'x1 = ,x1 write(*,*)'x2 = ,x2 c fim do programa stop end
o
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
10
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
4. Programa para calcular o m dulo e o ngulo de um n mero complexo: program cmplx c declara o da vari vel complex c real modulo, angulo c leitura do n mero write(*,*) 'Digite um n mero complexo: read(*,*) c c c lculo e apresenta o dos resultados write(*,*)'M dulo do n mero complexo = ,cabs(c) write(*,*)' ngulo do n mero complexo = ,atan(imag(c) / real(c)) c fim do programa stop end
8. Vetores e Matrizes A declara o de vetores e matrizes feita por meio do comando DIMENSION. Por exemplo, para declarar que uma vari vel V um vetor de 10 componentes, fazemos: DIMENSION V(10) Note que isto n o especifica o tipo de V. Seu tipo especificado por meio dos comandos listados acima. poss vel especificar o tipo de um vetor (ou matriz) e seu tamanho em uma nica declara o. Por exemplo, no caso da matriz M(10,10) (matriz 10 x 10): REAL*8 M(10,10) Note que nas declara es acima, os ndices de V e M variam de 1 a 10. Muitas vezes necess rio utilizar ndices que assumam valores negativos ou nulo. Deste modo, se o primeiro ndice da matriz A variar de 0 a 20 e o segundo ndice de -15 a 50 fazemos: DIMENSION A(0:20,-15:50) Finalmente, note que uma matriz pode ser de ordem maior do que 2. Por exemplo, para delcarar uma matriz 10 x 10 x 10, fazemos: DIMENSION M(10,10,10) Exemplo 1: Apresentamos abaixo um exemplo simples do uso de vetores e matrizes program summat real mat1(2,2), mat2(2,2), sum(2,2) write(*,*)'Digite os elementos da primeira matriz (2x2)' read(*,*) mat1(1,1), mat1(1,2), mat1(2,1), mat1(2,2) write(*,*)'Digite os elementos da segunda matriz (2x2)' read(*,*) mat2(1,1), mat2(1,2), mat2(2,1), mat2(2,2) sum(1,1) = mat1(1,1) + mat2(1,1) sum(1,2) = mat1(1,2) + mat2(1,2) sum(2,1) = mat1(2,1) + mat2(2,1) sum(2,2) = mat1(2,2) + mat2(2,2)
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
11
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
write(*,*)'A soma das matrizes e' write(*,*) sum(1,1), sum(1,2), sum(2,1), sum(2,2) stop end 9. Testes L gicos O fortran fornece um conjunto de comandos que permitem a implementa o de testes l gicos. A sintaxe para estes comandos : IF("valor"."condi o"."valor")THEN "instru es" ELSE "instru es" ENDIF ou, numa forma mais complexa: IF("valor"."condi o"."valor")THEN "instru es" ELSE IF("valor"."condi o"."valor")THEN "instru es" ELSE "instru es" ENDIF importante notar que os pontos entre "valor" e "condi o" s o obrigat rios. A palavra "instru es" no bloco de testes acima representa um conjunto de instru es a serem executadas se o teste l gico correspondente for satisfeito. Estas instru es podem envolver mais de uma linha. Durante a execu o de um bloco de testes, o fortran executar apenas o conjunto de instru es associadas ao primeiro teste l gico que for satisfeito. As instru es associadas a ELSE s o executadas se nenhum dos demais testes l gicos for satisfeito. As instru es IF("valor"."condi o"."valor")THEN e END IF s o obrigat rias. Por outro lado, ELSE IF("valor"."condi o."valor")THEN e ELSE s o opcionais. O teste ELSE IF("valor"."condi o"."valor")THEN pode aparecer mais de uma vez no mesmo bloco de testes l gicos. Nas instru es acima: "valor" - representa tanto um n mero quanto o valor de uma vari vel ou valor retornado por uma fun o. "condi o" - denota a condi o l gica que se deseja testar. Estas condi es podem ser tanto operadores l gicos (.GE., . GE., .LT, .LE., .EQ. e .NE.), quanto operadores relacionais (.AND., .OR., .NOT. e .XOR.). No caso de um teste envolvendo uma vari vel l gica, delcaradas por meio de LOGICAL TESTE (TESTE o nome da var avel), dever amos fazer o teste l gico utilizando IF(TESTE)THEN. As instru es associadas a este teste l gico ser o executadas apenas se a vari vel TESTE for verdadeira. Neste ponto, til mencionar o modo de se atribuir um valor a vari veis l gicas. Para atribuirmos a TESTE o valor "verdadeiro", devemos fazer: TESTE=.true. e se quizermos que TESTE seja falso, fazemos: TESTE=.false.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
12
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
O valor de TESTE pode ser alterado durante o programa por meio de atribui es explicitas do programador. poss vel testar mais de uma condi o em um nico IF. Para isto, utilizamos AND ou OR. Por exemplo, o teste l gico IF("valor1"."condi o1"."valor2".AND."valor3"."condi o2"."valor4")THEN far com as instru es associadas a ele sejam executadas apenas se os testes "valor1"."condi o1"."valor2" e "valor3"."condi o2"."valor4" forem simultaneamente verdadeiros. Outra maneira de usar o comando IF : IF("valor1"."condi o1"."valor2") "instru o" Em muitos casos essa instru o pode ser o comando GOTO "n", onde "n" o n mero de uma linha de comando. O GOTO leva a execu o do programa para a linha "n", que ser a linha da pr xima intru o a ser executada. Por m, esse comando pode executar apenas uma nica instru o, se quizermos executar mais de uma instru o, devemos usar o THEN e o ENDIF. 10. Loops O comando DO do fortran permite que um conjunto de instru es seja executado at que um contador atinja um certo valor determinado. A sintaxe deste comando : DO "contador"="in cio","fim","passo" "instru es" ENDDO "contador" - representa a variavel que ser incrementada no loop. "contador"="in cio" faz com que o valor da vari vel "in cio" seja atribu do vari vel "contador". "fim" - possui o seguinte significado: o loop ser abandonado quando o valor de "contador" for maior que "fim". Esta condi o testada a cada vez que um valor atribuido a "contador". Isto feito na primeira linha do loop (linha que cont m DO.). As instru es contidas no loop n o ser o executadas quando o teste sobre o "contador" for feito e constatado que o loop deve ser abandonado. "passo" - representa o incremento na vari vel "contador". Esta vari vel incrementada na linha que cont m a declara o DO. N o permitido ao programador alterar o valor do contador dentro do loop. "instru es" - representa o cojunto de instru es a serem executadas no loop. Estas instru es podem envolver mais de uma linha. ENDDO - delimita o fim das linhas de comando a serem executadas pelo loop.
Pode se usar tanto vari veis do tipo real como inteiro para controlar e incrementar o loop. No entanto, recomenda-se o uso de vari veis do tipo inteiro para evitar problemas num ricos. Como ltima observa o, permitido omitir "passo" no loop. Neste caso, o compilador fortran assume que o incremento de "contador" 1. Embora n o fa a parte do padr o do fortran 77, loops do tipo DO WHILE("vari vel1"."condi o"."vari vel2") "instru es" ENDDO s o aceitos pela maior parte dos compiladores fortran 77. A instru o "vari vel1"."condi o"."vari vel2" funciona como um teste l gico, descrito acima. O loop executado enquanto o teste l gico for verdadeiro.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
13
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Outra maneira de usar o comando DO conhecido como DO implicito, muito para leitura e escrita de matrizes e vetores. Seu formato write(*,*) (variavel(contador), "contador" = "inicio", "fim", passo") onde o comando write executado quantas vezes o comando DO for repetido. semelhante a DO "contador"="in cio","fim","passo" write(*,*) variavel(contador) ENDDO por m tem a vantagem de n o pular de linha toda vez que executar o comando write. Outra maneira muito usada para o comando DO : DO "n" "contador"="in cio","fim","passo" "instru es" CONTINUE
"n" ou
"n"
DO "n" "contador"="in cio","fim","passo" "instru es" " ltima instru o"
onde "n" o n mero da linha do comando CONTINUE, que simplesmente continua o comando DO, ou pode ser o n mero da linha da ltima instru o. Exemplo 2: Apresentamos abaixo um exemplo mais completo que o anterior program summat real mat1(10,10), mat2(10,10), sum(10,10) integer lin, col, i, j write(*,*)'Qual a dimens o das matrizes' read(*,*) lin, col write(*,*)'Digite os elementos da primeira matriz', '(',lin,'x',col,')' do i = 1, lin read(*,*) (mat1(i,j), j = 1, col) enddo write(*,*)'Digite os elementos da segunda matriz', '(',lin,'x',col,')' do i = 1, lin read(*,*) (mat2(i,j), j = 1, col) enddo do i = 1, lin do j = 1,col sum(i,j) = mat1(i,j) + mat2(i,j) enddo enddo write(*,*)'A soma das matrizes e' do i = 1, lin
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
14
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
write(*,*) (sum(i,j), j = 1, col) enddo stop end 11. Coment rios Podemos fazer coment rios de duas maneiras: Colocando-se um "c" ou "C" na primeira coluna da linha em que se quer fazer o coment rio. Colocando-se um s mbolo de exclama o ("!") em qualquer coluna da linha que se quer fazer o coment rio, a diferen a que com "!" o coment rio pode ocupar a mesma linha que uma instru o.
12. Formata o dos Dados Para se escrever algo no monitor ou se ler algo do teclado, n o precisamos usar nenhum tipo de formata o, por m isso muito importante quando queremos ler algo de um arquivo, ou escrever algo no arquivo. Os comandos utilizados para este fim s o: WRITE("onde","como") READ("onde","como") Nos exemplos anteriores a op o "onde" foi escolhida como a saida padr o, representada por um "*". Em geral, a saida padr o o monitor. Por m veremos mais adiante que sua fun o tamb m escrever em um arquivo de dados. A op o "como" requer uma discuss o um pouco mais detalhada. Apesar de termos usado sem formata o, sua fun o formatar a entrada ou sa da de dados. A escolha mais simples dizer ao compilador fortran que escreva em formato livre. Isto pode ser feito colocando-se o caractere "*" no lugar de "como". Para formatarmos os dados, usamos o comando FORMAT. No exemplo a seguir, utilizamos "como" igual a 10 e 20, que s o as numera es das linhas correspondentes aos comandos FORMAT. As diferentes instru es para FORMAT s o separadas por v rgula. Algumas instru es utilizadas no FORMAT s o: FORMAT("n mero"x,'Mensagem', ,FX.Y,IX) "n mero"x - introduz "n mero" espa os em branco na linha impressa, antes da pr xima instru o que aparece ap s a v rgula. 'Mensagem' - imprime uma mensagem delimitada por ' '. - Move cursor para o come o da pr xima linha, ou seja, pula uma linha. FX.Y - avisa ao compilador que um n mero real ser impresso com X caracteres no total (incluindo o sinal de menos, se for o caso, e o ponto decimal) e com Y caracteres ap s o ponto decimal. IX - avisa ao compilador que um n mero inteiro ser impresso com X caracteres (incluindo o sinal negativo se for o caso).
onde estas instru es podem aparecer em qualquer quantidade, ou na ordem que n s necessitarmos. Para usarmos as instru es mais de uma vez no mesmo FORMAT basta acrescentar a quantidade na frente da instru o. Se for mais de uma instru o temos que coloc -la entre par ntesis.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
15
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Exemplo 3: Uso da formata o program exemp1 integer*4 i,j real*8 x, y, w x=10.d0 y=50.d0 i=20 j=100 w=((x - y) / (i + j)) * (i - j) write(*,10)w format(1x,'w = ',f7.3, ) write(*,20)x,y,i,j format(1x,'x = ', f5.2 ,5x, 'y = ', f5.2, 5x, , 'i = ',i2, 5x,'j = ',i3) write(*,30)w,x,y,i,j format(3(f5.2, 5x), , 2(i2, 5x)) stop end O comando FORMAT pode vir em qualquer lugar no programa, devido a numera o da linha. O mesmo comando FORMAT pode ser usado por v rios comandos WRITE e READ. 13. Arquivos de Dados O comando OPEN permite o acesso a um arquivo de dados. A sintaxe para este comando a seguinte: OPEN(FILE=NOME,UNIT=N MERO,STATUS=STATUS,FORM=TIPO) NOME - Nome do arquivo. Pode ser um nome entre ' ', como 'saida.dat' por exemplo, ou uma vari vel do tipo cadeia de caracteres, previamente definida. N MERO - Unidade l gica por meio da qual o arquivo ser acessado. STATUS - Se STATUS='OLD', significa que o arquivo j existe e ser usado para leitura. Se STATUS='NEW', o arquivo ainda n o existe e criado no momento em que a instru o OPEN executada. Neste caso, podemos escrever no arquivo. Finalmente, STATUS='UNKNOWN', permite uma maior flexibilidade no que se refere ao acesso ao arquivo. N o entraremos em detalhes sobre esta op o aqui, pois importante em programa o se ter seguran a no que se est fazendo. Saber previamente se o arquivo acessado j existe ou n o importante para evitar que resultados anteriores sejam apagados ou que os novos sejam misturados com antigos. TIPO - Se a op o FORM for omitida, o compilador assumir que o arquivo formatado. Neste caso, os seu conteudo ser escrito em ASCII. Isto pode ser refor ado fazendo-se TIPO='FORMATTED'. Para que o arquivo seja escrito em bin rio, fazemos FORM='UNFORMATTED'. Isto basntante til quando estamos lidando com arquivos grandes. Um arquivo em bin rio ocupa muito menos espaco em disco do que um arquivo em ASCII. ! O d indica dupla precis o
10
20
30
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
16
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
GRAVA O EM ARQUIVO - O comando WRITE permite escrever num arquivo acessado por OPEN. Por exemplo, se um arquivo for aberto como 'NEW' e se a unidade l gica associada a ele for 10, por exemplo, para escrever uma dada vari vel X em formato livre neste arquivo, fazemos: WRITE(10,*)X Note que o comando FORMAT descrito acima tamb m pode ser usado junto com WRITE para escrever em arquivos. No entanto, se o arquivo for aberto como bin rio, devemos escrever: WRITE(10)X LEITURA DE DADOS - O comando READ permite a leitura de dados para processamento no programa. Os dados podem ser lidos em um arquivo de dados ou a partir da entrada padr o (em geral teclado). Do mesmo modo que o comando WRITE, o comando READ possui os seguintes argumentos "onde" e "como". Sua utiliza o, analoga descrita acima para o comando WRITE. Este comando tamb m pode ser combinado com FORMAT. FECHAMENTO DE ARQUIVO - O comando CLOSE(N MERO) fecha o arquivo associado unidade l gica N MERO. importante que os arquivos sejam fechados, principalmente quando foram abertos para grava o. Para terminar este ponto, devemos mencionar que o acesso a arquivos depende bastante do compilador fortran utilizado. Mais precisamente, as op es do comando OPEN variam de compilador para compilador. Embora seja sempre poss vel escrever um arquivo em bin rio, por exemplo, a declara o pode n o ser FORM='UNFORMATTED'. Nestes casos, necess rio consultar o manual do fabricante. Exemplo 1: O exemplo abaixo ilustra a entrada e sa da de dados utilizando arquivos. program exemp1 real*8 x,y open(file='entrada.dat', unit=10, status='old', form='formatted') open(file='saida.dat', unit=20, status='new', form='formatted') read(10,*)x,y write(20,10)2.d0*x,y/3.d0 close(10) close(20) 10 format(1x,'2*x = ',f6.3,5x,'y/3 = ',f6.3) stop end Para o arquivo de entrada podemos ter: 5.D0 20.D0
o seguinte arquivo de saida ser produzido: 2*x = 10.000 y/3 = 6.667
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
17
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
14. Fun es Uma FUN O em fortran retorna um valor, que pode ser atribu do a uma vari vel ou comparado a algum outro valor. Por exemplo se f(x) uma fun o que recebe um argumento x e retorna um valor real ao final de sua execu o, podemos atribuir este valor vari vel real Y: y=f(x) Existem fun es pre-definidas, como SIN(X), EXP(X), etc. Entretanto, o programador tamb m pode definir fun es que sejam convenientes para seu programa. Isto feito por meio da declara o FUNCTION. Uma FUNCTION constru da do seguinte modo: function f(x1,x2,i1,i2,etc.) real*8 f real*8 x1,x2,etc. integer i1,i2,etc. (instru es) f=express o end Observa es: function f(x1,x2,i1,i2.) - marca o come o da regi o do programa na qual a fun o f ser definida. f - neste caso o nome da fun o, que poderia ter at seis caracteres. real*8 f - avisa ao compilador que esta fun o retornar um resultado real em precis o dupla. escolhemos real*8 apenas como exemplo. na realidade, esta fun o poderia retornar um resultado l gico, por exemplo, para isto, ter amos que utilizar logical f. Observa es an logas podem ser feitas quanto declara o das vari veis x1, x2,i1 e i2. Escolhemos o tipo real e inteiro, apenas para exemplificar. (x1,x2,i1,i2,.) - representa a lista de argumentos para a fun o f. (instru es) - representa v rias opera es, testes l gicos, chamadas de fun es ou subbrotinas (que veremos mais adiante), que podem ser feitas antes da fun o retornar um valor. f=express o - atribui um valor fun o f que ser retornado. Note que neste caso n o se deve escrever f(x1,x2,i1,i2.). Isto seria errado. end - delimita o fim das instru es para a fun o.
As vezes necess rio fazer com que a fun o n o execute todas as linhas, abreviadas no exemplo acima por (instru es), dependendo dos resultados intermedi rios obtidos nestas linhas ou se a fun o for definida por meio de testes l gicos (veremos isto mais adiante). Para isto, utilizamos o comando RETURN. Contudo, importante ter em mente que uma fun o deve retornar um valor. Ent o, necess rio que a declara o F=express o apare a antes de RETURN. importante mencionar que todas as vari veis, exceto aquelas que s o passadas para fun o por argumento (ou por COMMON como veremos abaixo), s o locais. Mais precisamente, as demais partes do programa n o sabem que elas existem. Isto significa, que podemos utilizar uma vari vel x dentro de uma fun o sem nos preocuparmos se existe alguma outra vari vel no programa, fora desta fun o, que possua o mesmo nome. Entretanto, importante ter em mente que, em princ pio, vari veis definidas dentro de uma fun o deixam de existir quando sa mos da fun o. Em outras palavras, se uma dada vari vel x possui um certo valor antes de sairmos da fun o, esta vari vel pode conter "lixo" na pr xima vez que o programa acessar esta fun o. Para que esta vari vel n o perca seu conte do, devemos utilizar a instru o SAVE nome da vari vel, na linha abaixo da linha em que a vari vel declarada.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
18
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
Como ltima observa o, importante ter em mente que uma FUNCTION pode chamar outras FUNCTIONS. Por m, ela n o pode chamar a si pr pria (recursividade). Embora v rios compiladores fortran permitam recursividade, o fortran 77 padr o n o permite isto. Exemplo 2: O exemplo abaixo ilustra algumas das caracter sticas dos comandos descritos acima. integer*4 i real*8 x,y real*8 absx integer*4 n real*8 dx parameter(dx=0.5d0,n=10) x=-2.d0 do i=1,n x=x+dx y=absx(x) write(*,*)' x = ',x,' f(x) = ',y end do write(*,*) x=-2.d0 do while(x.lt.3.0d0) x=x+dx write(*,*)' x = ',sngl(x),' f(x) = ',sngl(absx(x)) end do end function absx(x) implicit none real*8 absx real*8 x if(x.lt.0.d0)then absx=-x else absx=x end if end Em ambos os loops, a vari vel x incrementada de dx a cada vez que o loop executado. Em cada loop, a fun o xabs chamada. Esta fun o o valor absoluto de x. Note que desnecess rio se fazer uma FUNCTION com este fim. O fortran prov uma fun o intr nseca (ABS) para isto. Alguns comentarios sobre as instru es novas que apareceram no exemplo acima. A instru o PARAMETER serve para se definir uma constante que pode ser utilizada no programa. Embora as constantes definidas por PARAMETER se pare am com vari veis, elas n o podem ser alteradas pelo programa. O comando SNGL utilizado no ltimo loop converte o valor de seu argumento em real de precis o simples. Isto extremamente til quando se deseja escrever num arquivo de dados. Em primeiro lugar, o arquivo ocupar menos espa o em disco (o que pode ser muito importante se o arquivo for grande). Em segundo lugar, muitos softwares gr ficos t m problemas em ler arquivos de dados em dupla precis o.
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
19
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
15. Subrotinas O fortran permite a separa o do programa em v rias partes independentes que executam tarefas diferentes. Estas partes independentes s o chamadas SUBROUTINE. Uma subrotina recebe, ou n o, uma lista de vari veis por argumento, de modo an logo s FUNCTIONS descritas acima. A diferen a fundamental entre uma SUBROUTINE e uma FUNCTION que a primeira n o retorna nenhum valor. Ilustramos abaixo a forma que uma subrotina deve possuir: subroutine nome(x1,x2,.,i1,i2,.) implicit none real*8 x1,x2,. integer*4 i1,i2,. "instru es" end O comando END delimita o fim da subrotina. Todas as observa es feitas sobre as vari veis locais a uma FUNCTION permanecem v lidas no caso de uma subrotina. O comando RETURN tamb m pode ser utilizado dentro de uma subrotina, afim de que as demais linhas da subrotina n o sejam executadas. Isto particularmente til no caso em que, se alguns resultados intermedi rios assumem certos valores, n o necess rio (ou n o se deve) executar as demais linhas da subrotina. De modo an logo s FUNCTIONS, as "instru es" representam um conjunto de linhas contendo v rias instru es diferentes, que podem ser chamada a FUNCTIONS ou outras subrotinas, etc. Por m, recursividade tamb m n o permitida aqui (veja coment rios em FUN ES). Apresentamos uma lista de argumentos bastante limitada para a subrotina, embora estes argumentos podem ser vetores, matrizes, etc. Na realidade, poder amos ter passado at mesmo subrotinas ou FUNCTIONS por argumento. Para se passar uma FUNCTION por argumento, necess rio avisar ao compilador que n o se trata de uma vari vel, mas sim de uma FUNCTION. Isto feito dentro da subrotina utilizando o comando EXTERNAL. Por exemplo, para que o compilador espere que uma subrotina receba uma FUNCTION por argumento, devemos incluir as seguintes linhas na subrotina: REAL*8 F EXTERNAL F Note que estamos supondo que F uma FUNCTION que retorna um resultado em dupla precis o. Isto n o necessariamente verdade. Ela poderia retornar um valor em precis o simples, por exemplo. Neste caso, dever amos modificar a instru o correspondente a declara o de seu tipo convenientemente. No caso de alguns compiladores, apenas as instru es descritas acima s o necess rias para se passar uma FUNCTION por argumento. Entretanto, isto pode gerar resultados errados em alguns outros. Por este motivo, importante que a linha EXTERNAL NOME DA FUN O esteja presente no lugar onde a subrotina chamada.
A chamada de uma subrotina executada por meio da instru o CALL. Por exemplo CALL NOME(A1,A2,.,J1,J2,.) faz com que as instru es contidas na subrotina NOME sejam executadas e a lista de argumentos (A1,A2,.,J1,J2,.) seja transferida a ela. Ao t rmino da execu o dos comandos da subrotina, as vari veis contidas na lista de argumentos s o "devolvidas" atualizadas para a parte do programa
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
20
Notas de aula de Fortran - Departamento de Ci ncias Ambientais - UFERSA Prof. Idalmir
que chamou a subrotina, caso alguma delas tenha sido alterada. Note que utilizamos nomes diferentes para as vari veis da lista de argumentos para insistir no fato de que os nomes de vari veis dentro das subrotinas (ou FUNCTIONS) s o independentes dos nomes de vari veis em outras partes do programa. Isto n o verdade no que se refere s FUNCTIONS ou SUBROUTINES. O nome de uma FUNCTION ou subrotina conhecido em todas as FUNCTIONS ou subrotinas do programa. Entretanto, o tipo da FUNCTION (se ela real ou retorna valor l gico) n o conhecido. Por esta raz o, necess rio declarar o tipo da FUNCTION dentro de uma subrotina ou fun o. Note que isto n o quer dizer que se uma FUNCTION passada por argumento ela deve possuir o mesmo nome na lista de argumentos da declara o da subrotina que no resto do programa (na chamada subrotina sim). Neste caso, temos liberdade para escolher seu nome como no caso de qualquer outra vari vel. 16. Common Uma vez que as vari veis dentro de FUNCTIONS e SUBROUTINES s o independentes, o comando COMMON extremamente importante para que SUBROUTINES e FUNCTIONS se comuniquem sem que tenhamos que passar todas as variav is por argumento de uma para a outra. A sintaxe para COMMON a seguinte: COMMON/"nome do common"/X1,X2,. "nome do common" - representa um nome que distinguir um COMMON do outro. A liberdade em se escolher um nome para um COMMON extremamente importante pois permite a cria o de COMMONS independentes. Isto muito til quando apenas um certo grupo de vari veis passado para uma subrotina (ou fun o) e esta recebe um outro grupo de vari veis diferentes de uma outra subrotina (ou fun o). X1,X2,. - representa a lista de vari veis associadas a este COMMON. Estas vari veis podem ser inteiras, reais, vetores, matrizes, etc. (n o podem ser fun es ou subrotinas). importante que as vari veis que ocupam mais espa o na mem ria apare am em primeiro lugar na lista do COMMON do que aquelas que ocupam menos espa o. Por exemplo, um n mero real em precis o dupla deve aparec