You are on page 1of 24

NOES BSICAS DE LINGUAGEM FORTRAN Notas de Aula

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Linguagem Fortran (Notas de Aula)


1. Introduo: A linguagem FORTRAN foi a primeira linguagem de programao de alto nvel desenvolvida, foi desenvolvida pela IBM especificamente para clculos numricos, o que o torna muito robusto para trabalhar com nmeros. Aqui, ser abordada a programao estruturada tambm conhecida como programao up-down (de cima para baixo). Um programa escrito como um texto, onde as frases so 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 execuo, chamado de no-estruturado, comeando do incio do texto, indo para o meio, depois para o final, voltando para o incio, de novo para o final, voltando para o meio, e finalmente terminando a execuo do programa.

Figura 1: Seqncia de execuo de um programa no-estruturado. Complicado? Por isso foram criadas regras de programao aconselhando aos programadores que fossem criados programas mais organizados, tanto na disposio dos comandos, quanto na execuo, estes programas so 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 ilegveis os programas. Os programas estruturados tm as seguintes caractersticas: Clareza deve estar claro o que cada comando realiza; Legibilidade deve ser fcil de se ler e compreender; Adaptvel deve ser fcil adapt-lo a qualquer situao; Fcil Manuteno deve ser fcil alterar, ou encontrar as linhas de comando; Boa Documentao Qualquer pessoa, mesmo que no saiba programar com Fortran, deve ter condies de compreender o programa. Alm dessas caractersticas, o programa s pode usar trs estruturas bsicas de controle: Seqncia comandos escritos um aps o outro na ordem em que vo ser executados; Seleo comandos que permitem escolher entre um resultado e outro, ou entre a execuo de um comando e outro; Repetio, Iterao ou Loop comandos que permitem repetir quantas vezes se queira um determinado comando ou conjunto de comandos. O princpio bsico da programao estruturada que a execuo do programa deve ser feita sempre para diante, sem desvios e retornos. Os comandos de seleo e de repetio so considerados como um nico comando e no como desvios ou retornos.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

2. Caractersticas Bsicas 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 Nmeros: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Smbolos: + -

Constantes, Variveis e Tipos: Constantes: Local na memria do computador que serve para guardar um nmero, letra ou smbolo, este valor no pode ser alterado. representado com um nome que dado pelo programador, que tambm no pode ser alterado durante o programa. O nome deve obedecer a algumas regras que sero apresentadas a seguir. Varivel: Local na memria do computador que serve para guardar um nmero, letra ou smbolo, este valor pode ser alterado. representado com um nome que dado pelo programador, que no pode ser alterado durante o programa. O nome deve obedecer a algumas regras que sero apresentadas a seguir. Regra para dar nome a variveis: 1) Cada nome deve ter no mximo 6 caracteres e no mnimo 1 caracter; 2) O primeiro caracter deve ser obrigatoriamente uma letra; 3) Os demais caracteres s podem ser letras ou nmeros; 4) No pode ter espao em branco no meio do nome. Exemplos: Nomes vlidos: JOSE, A1, D3F4, HI98, a23, joao, df34, A4f5. Nomes invlidos: JOS, 1A, D!F4, H(1), 5b, joo, Nomecomprido. Tipos: Identifica o tipo de informao que a varivel ou constante ir guardar. Integer guarda nmeros inteiros, ex. 1 23 -15 0; Real guarda nmeros reais, ex. 1.2 23.0 -15. 0.002; Complex guarda nmeros complexos, ex. 1.2 + i 23.0 -15. + i 0.002; Character guarda caracteres, ex. ab, DaQ, 09, +, (%)\!; Logical guarda valores lgicos, ou seja, verdadeiro ou falso; Obs. 1: Basta a presena de um ponto . para que o nmero seja real. Obs. 2: Se no for especificado o tipo de constante ou varivel, 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 nmero complexo escrito entre parntesis. 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., no se pode esquecer os pontos no incio e no fim dos valores lgicos. Qual a importncia de se dividir as constantes e variveis em tipos ? Existem dois grandes problemas, o primeiro a quantidade de memria requerida para guardar um valor qualquer. lgico que para guardar o nmero 9284365.9872 deve-se gastar mais memria que para guardar o nmero 19, por exemplo. Alm disso, existem tipos que admitem operaes aritmticas como os tipos integer, real e complex, enquanto que outros no admitem, como o character e o logical. No faz sentido dividir o valor abc por 2, ou multiplicar o valor .true. por 3.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Como informar qual o tipo de uma varivel ? Basta escrever o nome do tipo seguido de um espao e do nome das varivel no programa, onde os nomes das variveis so separados por vrgula (,). 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 varivel possui um tamanho de memria para que ele possa guardar informaes, conforme apresentado a seguir: Tipo Tamanho Valor Mnimo Valor Mximo 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 varivel vazio 32.767 caracteres Logical 4 bytes .false. ou .true. .false. ou .true. Obs. 1: O nmero real pode ser representado na forma de notao cientfica, onde o smbolo E ou e representa a base da potncia 10. 12 -4 Ex. 1.5E12 = 1.5 x 10 ,-0.1e-4 = -0.1 x 10 . Obs. 2: Para nmeros reais qualquer valor acima de -1.1754944E-38, ou abaixo de +1.1754944E-38 considerado igual a zero (0). Obs. 3: O expoente da potncia 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 apstrofes 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 varivel possui mais 1, onde este byte a mais, guarda o tamanho da constante ou varivel. 3. Expresses: Existem trs tipos de expresses em Fortran, as expresses aritmticas, cujo resultado um nmero, as expresses lgicas, e as expresses relacionais, cujos resultados so .true. ou .false.. Expresses Aritmticas: Operador Fortran + * / ** Operador Matemtico + ab ou ab Significado Adio Subtrao Multiplicao Diviso Potenciao ou Radiciao Exemplo A+B AB A*B A/B A ** B

Como na matemtica existe uma hierarquia, chamada de ordem de precedncia, ou seja, quais operaes sero executadas primeiro. Em uma expresso aritmtica os operadores sero executados obedecendo a ordem de precedncia, mas para operadores de mesma ordem sero executados da esquerda para a direita. A ordem de precedncia pode ser alterada com parntesis ( e ), pode-se ter vrios nveis de parntesis, mas no se pode usar colchetes [ e ] ou chaves { e }. A ordem de precedncia apresentada a seguir: Operador ** * / Ordem de Precedncia a 1 ordem (ordem mais alta) a 2 ordem a 3 ordem

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias 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 Expresses Aritmticas 2

Codificao 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 no podem aparecer juntos: Por exemplo: a * -b a * (-b). Obs. 3: Nos expoentes podem existir constantes, variveis ou expresses aritmticas. Obs. 4: Das operaes aritmticas acima, a diviso diferente para nmeros inteiros e reais, para operaes com nmeros inteiros, a casa decimal do resultado truncada. Exemplos: 7 / 2 = 3, e no 3.5 1 / 3 = 0, e no 0.33, pois os resultados so inteiros, mas 7.0 / 2 = 3.5 e 1.0 / 3 = 0.33, pois quando um dos nmeros real o resultado passa a ser real, exceto quando a varivel inteira, neste caso o resultado convertido para inteiro. Expresses Lgicas: Operador Fortran .GT. .GE. .LT. .LE. .EQ. .NE. Operador Matemtico > < = 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 precedncia igual para todos os operadores lgicos e os resultados de cada operao ser sempre .true. ou .false., a ordem de precedncia pode ser alterada com parntesis ( e ). Exemplo: (A .GT. B) .EQ. (C .NE. D) Expresses Relacionais: Operador Fortran .NOT. .AND. .OR. .XOR. Operador Matemtico No existe No existe Significado Negao E Ou Ou exclusivo Exemplo .NOT. A A .AND. B A .OR. B A .XOR. B

A ordem de precedncia a mesma apresentada acima, elas funcionam e obedecem as mesmas regras que as expresses aritmticas, e pode ser alterada com parntesis. Elas so usadas em conjunto com as expresses lgicas.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias 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 matemtica usa, a seguir so apresentadas tabelas chamadas de Tabela Verdade. Estas tabelas mostram os possveis resultados das expresses 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 Atribuio, Escrita e Leitura: Como guardar um valor numrico na memria do computador ? H vrias maneiras de se guardar no apenas um nmero, mas qualquer tipo de informao, como texto, som, imagem, etc. Contudo, o nosso objetivo guardar, ou armazenar, nmeros e caracteres na memria do computador. Uma maneira usar o comando de atribuio, semelhante ao comando de igualdade da matemtica, porm muito mais poderoso. 4.1. Comando de Atribuio: O comando de atribuio serve para armazenar valores numricos e caracteres em constantes e variveis, ou seja, na memria do computador, pois constantes e variveis so pequenos pedaos de memria do computador que servem como armazenamento temporrio ou permanente. Quando gravamos apenas nas constantes ou variveis estamos gravando na memria principal (RAM), e como ele voltil ao trmino do programa a memria apagada. Enquanto que, quando gravamos no disco rgido ou nos disquetes, neste caso dizemos que guardamos em arquivos (memria secundria ou de massa) as informaes ficam gravadas permanentemente, at o momento que decidirmos apagar as informaes. Para usar o comando de atribuio basta colocarmos do lado esquerdo uma varivel ou uma constante, o smbolo de igualdade (=) seguida de uma constante, varivel ou expresso do lado direito. Ex.: x=5 y=a+b z = nome Obs.: Do lado esquerdo no pode aparecer nenhuma expresso ou constante, apenas variveis, pois no h como fazer uma atribuio a uma expresso, nem a uma constante, j que seu valor fixo. At agora vimos que o smbolo de atribuio idntico a igualdade da matemtica, qual a diferena? Na matemtica podemos ter algo como o seguinte exemplo: x=x+1 y y=2 Na matemtica no se pode ter algo parecido, como dizer que x = x + 1? x = x + 1, basta passar tudo que tem x para a esquerda, ento: xx=1 0 = 1, zero igual a um !!! Isto pode? claro que no. Ento como o computador faz isso ? Ele pega o valor de x que est guardado na memria do computador (se no tiver nenhum ento zero para nmero, e vazio para caracteres) soma com 1 e guarda o novo valor no x que est do lado esquerdo. Por exemplo, suponha que na memria do computador tem x = 2, ento temos: x=x+1

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

x=2+1 x = 3, ou seja, na memria passa a ficar gravado o valor 3, ao invs do 2 que havia antes. O que vlido e o que no vlido? Vlido No vlido 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 tambm para escrever em um arquivo no disco. O comando de escrita WRITE, ele pode ser utilizado de uma forma muito complexa, porm 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 nmero correspondente a linha onde est o formato do nmero (ser apresentado mais adiante), o segundo * substitui o dispositivo de sada (monitor, impressora ou arquivo). 4.3. Comando de Leitura: um comando utilizado para ler do teclado do computador, e tambm para ler de um arquivo no disco. O comando de leitura READ, tambm utilizaremos sua forma mais simples, a chamada forma livre. Diferentemente do comando de escrita, o comando de leitura s pode se referenciar a variveis, j que a leitura de um valor deve ser guardado na memria do computador. Formas de uso: read(*,*) a read (*,*) b O primeiro * substitui o nmero correspondente a linha onde est o formato do nmero (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 varivel de cada vez. Exemplo: read(*,*) a, b, c write(*,*) a, b, texto, 5, a + 2 * b Porm na leitura deve-se ter o cuidado de separar os valores digitados por vrgulas ou espaos, j para a escrita sero escritos todos juntos, ento para evitar esse pssimo hbito vou aconselhar que use um comando de escrita e de leitura para cada varivel, 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 extenso .for. Na digitao deve-se observar o seguinte:

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Para as colunas: 1. O programa deve ser escrito a partir da coluna 7 at a coluna 72, aps esta coluna tudo desprezado. 2. A coluna 1: reservada para sinalizao de comentrios, basta colocar uma letra c (maisculo ou minsculo) nesta coluna e toda a linha considerada como comentrio, ou seja, um aviso ou mensagem, e no como parte constituinte do programa. 3. Colunas 1 a 5: numerao de linhas, pode-se numerar todas as linhas do programa, mas na prtica se numeram apenas comandos que exigem a numerao. 4. Coluna 6: identificador de continuao de linha de comando. Caso algum comando no caiba entre as colunas 7 e 72, basta colocar um caracter qualquer na coluna 6 e continuar o comando como se no houvesse interrupo, um comando pode ocupar mais de uma linha (duas, trs, 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 vrias linhas). 3. Linha 3: Pode-se declarar variveis (pode fazer isso em vrias linhas). 4. Linha 4 at a antepenltima: Escreve-se o programa. 5. Penltima linha: o comando stop, indicando a parada de execuo do programa. 6. ltima linha: o comando end indicando o final do programa. O comando stop apenas encerra a execuo do programa, podem existir vrios comandos stop no programa, porm apenas um comando end. Pode-se colocar comentrios em qualquer linha do programa. A seqncia aqui sugerida para que se possa escrever programas sem se ter problemas, apesar de alguns comandos poderem vir em posio diferente, porm recomendo seguir esta receita de bolo. A seguir apresento um pequeno programa que l dois nmeros e apresenta sua soma. O primeiro passo dar uma mensagem pedindo para o usurio digitar um nmero, em seguida se l esse nmero, o segundo passo apresentar uma nova mensagem para se digitar um nmero e novamente se l esse nmero. O terceiro passo somar os nmeros e armazenar o resultado em uma varivel, apresentando o resultado acompanhado de uma mensagem que o identifica. program soma real x, y, s write(*,*)Digite um nmero: read(*,*)x write(*,*)Digite outro nmero: read(*,*)y s=x+y write(*,*)O resultado da soma : , s stop end O programa pode ser escrito em letras maisculas ou minsculas, foi convencionado pelos programadores que programas escritos em Fortran seriam em letras maisculas, porm por motivo de esttica, aparncia com outras linguagens de alto nvel como o Pascal e C, escreverei todos os programas em letras minsculas. A seguir o programa ser reescrito nas respectivas colunas e com comentrios.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

1 c c c c c

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

6 I

7 d u

8 a l n

9 l o r

0 m

1 i p e

2 r a r v

4 d

5 e

7 S

8 o r

9 u e

0 z s

1 a e

3 Q

4 u a

5 e r

6 i

7 r a

8 o

9 z s

1 J

2 a

3 n

4 i d

5 o e

6 r

l i e , r * ) e * ) e

c s

m i

r o e

a s i s

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

o x o ( * o ( * n

v s i ) x g ) y r m

t d

d e ( d e (

* ,

e d

i i

r g

o i

n e

m u

e m

o n

t d s + t t p p

* ,

n d

d i

o g

n t

e o

r u

o t

a 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

s w d s e

* a

o d

Obs. 1: Obs. 2: Obs. 3: Obs. 4:

A numerao acima apenas para identificar a coluna em que iniciou a digitao. Podem existir quantas linhas em branco se desejar no programa. Apenas os comentrios podem ocupar qualquer coluna e qualquer linha no programa . O comando program foi substitudo por comentrios que so mais explicativos.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Na tela do computador surgir algo do tipo: C:\>soma Digite um nmero: 2 Digite outro nmero: 3 O resultado da soma : , 5 Program Stopped. C:\> De agora em diante todos os programas sero apresentados livremente sem os quadrados da tabela da pgina anterior. 7. Funes Predefinidas Algumas funes matemticas comuns esto incorporadas no Fortran e podem ser utilizadas normalmente no programa. Deve-se tomar algumas precaues no uso das funes, a primeira quanto ao argumento delas, deve-se observar o tipo de argumento (inteiro, real, complexo ou character), a segunda precauo quanto ao valor retornado da funo (resultado da funo) a varivel onde ser armazenado o resultado da funo deve ser do mesmo tipo do valor que a funo retorna. Tipo do Tipo do Valor Argumento Retornado (tipo de x) Valor absoluto (mdulo) abs(x) real real Valor absoluto (mdulo) iabs(x) integer integer Valor absoluto (mdulo) cabs(x) complex complex Converter nmero real para inteiro ifix(x) real integer Converter nmero inteiro para real float(x) integer real Resto da diviso 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 hiperblico sinh(x) real real Coseno hiperblico cosh(x) real real Tangente hiperblico tanh(x) real real Parte real do nmero complexo real(x) complex real Parte imaginria do nmero complexo imag(x) complex real Conjugado do nmero complexo conjg(x) complex complex Comprimento do string* len(x) character integer * O comprimento do string corresponde quantidade de caracteres na varivel. Funes mais Comuns Funes em Fortran Exemplos de uso das funes: Expresso Aritmtica Expresso 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 Cincias Ambientais - UFERSA Prof. Idalmir

Notas de aula de Fortran - Departamento de Cincias 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 nmero e apresentar o seno, coseno e tangente: program trigon c declarao da varivel real x c leitura do nmero write(*,*) Digite um nmero: read(*,*) x c clculo das funes e apresentao dos resultados write(*,*)Seno do nmero em radianos = ,sin(x) write(*,*)Coseno do nmero em radianos = ,cos(x) write(*,*)Tangente do nmero 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 declarao da varivel character com no mximo 30 caracteres character*30 nome c leitura do nome write(*,*) Digite seu nome (mximo 30 letras): read(*,*) nome c clculo da quantidade de letras e apresentao do resultado write(*,*)Quantidade de letras no nome = ,len(nome) c fim do programa stop end 3. Programa para calcular as razes reais de uma funo do 2 grau: program grau2 c declarao da varivel 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 clculo das razes delta = b**2 4 * a * c x1 = (-b + sqrt(delta)) / (2 * a) x2 = (-b - sqrt(delta)) / (2 * a) c apresentao dos resultados write(*,*)x1 = ,x1 write(*,*)x2 = ,x2 c fim do programa stop end
o

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

10

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

4. Programa para calcular o mdulo e o ngulo de um nmero complexo: program cmplx c declarao da varivel complex c real modulo, angulo c leitura do nmero write(*,*) Digite um nmero complexo: read(*,*) c c clculo e apresentao dos resultados write(*,*)Mdulo do nmero complexo = ,cabs(c) write(*,*) ngulo do nmero complexo = ,atan(imag(c) / real(c)) c fim do programa stop end

8. Vetores e Matrizes A declarao de vetores e matrizes feita por meio do comando DIMENSION. Por exemplo, para declarar que uma varivel V um vetor de 10 componentes, fazemos: DIMENSION V(10) Note que isto no especifica o tipo de V. Seu tipo especificado por meio dos comandos listados acima. possvel especificar o tipo de um vetor (ou matriz) e seu tamanho em uma nica declarao. Por exemplo, no caso da matriz M(10,10) (matriz 10 x 10): REAL*8 M(10,10) Note que nas declaraes acima, os ndices de V e M variam de 1 a 10. Muitas vezes necessrio 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 Cincias Ambientais - UFERSA Prof. Idalmir

11

Notas de aula de Fortran - Departamento de Cincias 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 Lgicos O fortran fornece um conjunto de comandos que permitem a implementao de testes lgicos. A sintaxe para estes comandos : IF("valor"."condio"."valor")THEN "instrues" ELSE "instrues" ENDIF ou, numa forma mais complexa: IF("valor"."condio"."valor")THEN "instrues" ELSE IF("valor"."condio"."valor")THEN "instrues" ELSE "instrues" ENDIF importante notar que os pontos entre "valor" e "condio" so obrigatrios. A palavra "instrues" no bloco de testes acima representa um conjunto de instrues a serem executadas se o teste lgico correspondente for satisfeito. Estas instrues podem envolver mais de uma linha. Durante a execuo de um bloco de testes, o fortran executar apenas o conjunto de instrues associadas ao primeiro teste lgico que for satisfeito. As instrues associadas a ELSE so executadas se nenhum dos demais testes lgicos for satisfeito. As instrues IF("valor"."condio"."valor")THEN e END IF so obrigatrias. Por outro lado, ELSE IF("valor"."condio."valor")THEN e ELSE so opcionais. O teste ELSE IF("valor"."condio"."valor")THEN pode aparecer mais de uma vez no mesmo bloco de testes lgicos. Nas instrues acima: "valor" - representa tanto um nmero quanto o valor de uma varivel ou valor retornado por uma funo. "condio" - denota a condio lgica que se deseja testar. Estas condies podem ser tanto operadores lgicos (.GE., . GE., .LT, .LE., .EQ. e .NE.), quanto operadores relacionais (.AND., .OR., .NOT. e .XOR.). No caso de um teste envolvendo uma varivel lgica, delcaradas por meio de LOGICAL TESTE (TESTE o nome da varavel), deveramos fazer o teste lgico utilizando IF(TESTE)THEN. As instrues associadas a este teste lgico sero executadas apenas se a varivel TESTE for verdadeira. Neste ponto, til mencionar o modo de se atribuir um valor a variveis lgicas. 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 Cincias Ambientais - UFERSA Prof. Idalmir

12

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

O valor de TESTE pode ser alterado durante o programa por meio de atribuies explicitas do programador. possvel testar mais de uma condio em um nico IF. Para isto, utilizamos AND ou OR. Por exemplo, o teste lgico IF("valor1"."condio1"."valor2".AND."valor3"."condio2"."valor4")THEN far com as instrues associadas a ele sejam executadas apenas se os testes "valor1"."condio1"."valor2" e "valor3"."condio2"."valor4" forem simultaneamente verdadeiros. Outra maneira de usar o comando IF : IF("valor1"."condio1"."valor2") "instruo" Em muitos casos essa instruo pode ser o comando GOTO "n", onde "n" o nmero de uma linha de comando. O GOTO leva a execuo do programa para a linha "n", que ser a linha da prxima intruo a ser executada. Porm, esse comando pode executar apenas uma nica instruo, se quizermos executar mais de uma instruo, devemos usar o THEN e o ENDIF. 10. Loops O comando DO do fortran permite que um conjunto de instrues seja executado at que um contador atinja um certo valor determinado. A sintaxe deste comando : DO "contador"="incio","fim","passo" "instrues" ENDDO "contador" - representa a variavel que ser incrementada no loop. "contador"="incio" faz com que o valor da varivel "incio" seja atribudo varivel "contador". "fim" - possui o seguinte significado: o loop ser abandonado quando o valor de "contador" for maior que "fim". Esta condio testada a cada vez que um valor atribuido a "contador". Isto feito na primeira linha do loop (linha que contm DO...). As instrues contidas no loop no sero executadas quando o teste sobre o "contador" for feito e constatado que o loop deve ser abandonado. "passo" - representa o incremento na varivel "contador". Esta varivel incrementada na linha que contm a declarao DO. No permitido ao programador alterar o valor do contador dentro do loop. "instrues" - representa o cojunto de instrues a serem executadas no loop. Estas instrues podem envolver mais de uma linha. ENDDO - delimita o fim das linhas de comando a serem executadas pelo loop.

Pode se usar tanto variveis do tipo real como inteiro para controlar e incrementar o loop. No entanto, recomenda-se o uso de variveis do tipo inteiro para evitar problemas numricos. Como ltima observao, permitido omitir "passo" no loop. Neste caso, o compilador fortran assume que o incremento de "contador" 1. Embora no faa parte do padro do fortran 77, loops do tipo DO WHILE("varivel1"."condio"."varivel2") "instrues" ENDDO so aceitos pela maior parte dos compiladores fortran 77. A instruo "varivel1"."condio"."varivel2" funciona como um teste lgico, descrito acima. O loop executado enquanto o teste lgico for verdadeiro.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

13

Notas de aula de Fortran - Departamento de Cincias 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"="incio","fim","passo" write(*,*) variavel(contador) ENDDO porm tem a vantagem de no pular de linha toda vez que executar o comando write. Outra maneira muito usada para o comando DO : DO "n" "contador"="incio","fim","passo" "instrues" CONTINUE

"n" ou

"n"

DO "n" "contador"="incio","fim","passo" "instrues" "ltima instruo"

onde "n" o nmero da linha do comando CONTINUE, que simplesmente continua o comando DO, ou pode ser o nmero da linha da ltima instruo. 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 dimenso 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 Cincias Ambientais - UFERSA Prof. Idalmir

14

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

write(*,*) (sum(i,j), j = 1, col) enddo stop end 11. Comentrios Podemos fazer comentrios de duas maneiras: Colocando-se um "c" ou "C" na primeira coluna da linha em que se quer fazer o comentrio. Colocando-se um smbolo de exclamao ("!") em qualquer coluna da linha que se quer fazer o comentrio, a diferena que com "!" o comentrio pode ocupar a mesma linha que uma instruo.

12. Formatao dos Dados Para se escrever algo no monitor ou se ler algo do teclado, no precisamos usar nenhum tipo de formatao, porm isso muito importante quando queremos ler algo de um arquivo, ou escrever algo no arquivo. Os comandos utilizados para este fim so: WRITE("onde","como") READ("onde","como") Nos exemplos anteriores a opo "onde" foi escolhida como a saida padro, representada por um "*". Em geral, a saida padro o monitor. Porm veremos mais adiante que sua funo tambm escrever em um arquivo de dados. A opo "como" requer uma discusso um pouco mais detalhada. Apesar de termos usado sem formatao, sua funo formatar a entrada ou sada 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 so as numeraes das linhas correspondentes aos comandos FORMAT. As diferentes instrues para FORMAT so separadas por vrgula. Algumas instrues utilizadas no FORMAT so: FORMAT("nmero"x,'Mensagem',\,FX.Y,IX) "nmero"x - introduz "nmero" espaos em branco na linha impressa, antes da prxima instruo que aparece aps a vrgula. 'Mensagem' - imprime uma mensagem delimitada por ' '. \ - Move cursor para o comeo da prxima linha, ou seja, pula uma linha. FX.Y - avisa ao compilador que um nmero 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 aps o ponto decimal. IX - avisa ao compilador que um nmero inteiro ser impresso com X caracteres (incluindo o sinal negativo se for o caso).

onde estas instrues podem aparecer em qualquer quantidade, ou na ordem que ns necessitarmos. Para usarmos as instrues mais de uma vez no mesmo FORMAT basta acrescentar a quantidade na frente da instruo. Se for mais de uma instruo temos que coloc-la entre parntesis.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

15

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Exemplo 3: Uso da formatao 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 numerao da linha. O mesmo comando FORMAT pode ser usado por vrios 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=NMERO,STATUS=STATUS,FORM=TIPO) NOME - Nome do arquivo. Pode ser um nome entre ' ', como 'saida.dat' por exemplo, ou uma varivel do tipo cadeia de caracteres, previamente definida. NMERO - Unidade lgica 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 no existe e criado no momento em que a instruo OPEN executada. Neste caso, podemos escrever no arquivo. Finalmente, STATUS='UNKNOWN', permite uma maior flexibilidade no que se refere ao acesso ao arquivo. No entraremos em detalhes sobre esta opo aqui, pois importante em programao se ter segurana no que se est fazendo. Saber previamente se o arquivo acessado j existe ou no importante para evitar que resultados anteriores sejam apagados ou que os novos sejam misturados com antigos. TIPO - Se a opo FORM for omitida, o compilador assumir que o arquivo formatado. Neste caso, os seu conteudo ser escrito em ASCII. Isto pode ser reforado fazendo-se TIPO='FORMATTED'. Para que o arquivo seja escrito em binrio, fazemos FORM='UNFORMATTED'. Isto basntante til quando estamos lidando com arquivos grandes. Um arquivo em binrio ocupa muito menos espaco em disco do que um arquivo em ASCII. ! O d indica dupla preciso

10

20

30

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

16

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

GRAVAO 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 lgica associada a ele for 10, por exemplo, para escrever uma dada varivel X em formato livre neste arquivo, fazemos: WRITE(10,*)X Note que o comando FORMAT descrito acima tambm pode ser usado junto com WRITE para escrever em arquivos. No entanto, se o arquivo for aberto como binrio, 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 padro (em geral teclado). Do mesmo modo que o comando WRITE, o comando READ possui os seguintes argumentos "onde" e "como". Sua utilizao, analoga descrita acima para o comando WRITE. Este comando tambm pode ser combinado com FORMAT. FECHAMENTO DE ARQUIVO - O comando CLOSE(NMERO) fecha o arquivo associado unidade lgica NMERO. importante que os arquivos sejam fechados, principalmente quando foram abertos para gravao. Para terminar este ponto, devemos mencionar que o acesso a arquivos depende bastante do compilador fortran utilizado. Mais precisamente, as opes do comando OPEN variam de compilador para compilador. Embora seja sempre possvel escrever um arquivo em binrio, por exemplo, a declarao pode no ser FORM='UNFORMATTED'. Nestes casos, necessrio consultar o manual do fabricante. Exemplo 1: O exemplo abaixo ilustra a entrada e sada 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 Cincias Ambientais - UFERSA Prof. Idalmir

17

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

14. Funes Uma FUNO em fortran retorna um valor, que pode ser atribudo a uma varivel ou comparado a algum outro valor. Por exemplo se f(x) uma funo que recebe um argumento x e retorna um valor real ao final de sua execuo, podemos atribuir este valor varivel real Y: y=f(x) Existem funes pre-definidas, como SIN(X), EXP(X), etc... Entretanto, o programador tambm pode definir funes que sejam convenientes para seu programa. Isto feito por meio da declarao FUNCTION. Uma FUNCTION construda do seguinte modo: function f(x1,x2,i1,i2,etc..) real*8 f real*8 x1,x2,etc.. integer i1,i2,etc.. (instrues) f=expresso end Observaes: function f(x1,x2,i1,i2...) - marca o comeo da regio do programa na qual a funo f ser definida. f - neste caso o nome da funo, que poderia ter at seis caracteres. real*8 f - avisa ao compilador que esta funo retornar um resultado real em preciso dupla. escolhemos real*8 apenas como exemplo. na realidade, esta funo poderia retornar um resultado lgico, por exemplo, para isto, teramos que utilizar logical f. Observaes anlogas podem ser feitas quanto declarao das variveis 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 funo f. (instrues) - representa vrias operaes, testes lgicos, chamadas de funes ou subbrotinas (que veremos mais adiante), que podem ser feitas antes da funo retornar um valor. f=expresso - atribui um valor funo f que ser retornado. Note que neste caso no se deve escrever f(x1,x2,i1,i2...). Isto seria errado. end - delimita o fim das instrues para a funo.

As vezes necessrio fazer com que a funo no execute todas as linhas, abreviadas no exemplo acima por (instrues), dependendo dos resultados intermedirios obtidos nestas linhas ou se a funo for definida por meio de testes lgicos (veremos isto mais adiante). Para isto, utilizamos o comando RETURN. Contudo, importante ter em mente que uma funo deve retornar um valor. Ento, necessrio que a declarao F=expresso aparea antes de RETURN. importante mencionar que todas as variveis, exceto aquelas que so passadas para funo por argumento (ou por COMMON como veremos abaixo), so locais. Mais precisamente, as demais partes do programa no sabem que elas existem. Isto significa, que podemos utilizar uma varivel x dentro de uma funo sem nos preocuparmos se existe alguma outra varivel no programa, fora desta funo, que possua o mesmo nome. Entretanto, importante ter em mente que, em princpio, variveis definidas dentro de uma funo deixam de existir quando samos da funo. Em outras palavras, se uma dada varivel x possui um certo valor antes de sairmos da funo, esta varivel pode conter lixo na prxima vez que o programa acessar esta funo. Para que esta varivel no perca seu contedo, devemos utilizar a instruo SAVE nome da varivel, na linha abaixo da linha em que a varivel declarada.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

18

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Como ltima observao, importante ter em mente que uma FUNCTION pode chamar outras FUNCTIONS. Porm, ela no pode chamar a si prpria (recursividade). Embora vrios compiladores fortran permitam recursividade, o fortran 77 padro no permite isto. Exemplo 2: O exemplo abaixo ilustra algumas das caractersticas 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 varivel x incrementada de dx a cada vez que o loop executado. Em cada loop, a funo xabs chamada. Esta funo o valor absoluto de x. Note que desnecessrio se fazer uma FUNCTION com este fim. O fortran prov uma funo intrnseca (ABS) para isto. Alguns comentarios sobre as instrues novas que apareceram no exemplo acima. A instruo PARAMETER serve para se definir uma constante que pode ser utilizada no programa. Embora as constantes definidas por PARAMETER se paream com variveis, elas no podem ser alteradas pelo programa. O comando SNGL utilizado no ltimo loop converte o valor de seu argumento em real de preciso simples. Isto extremamente til quando se deseja escrever num arquivo de dados. Em primeiro lugar, o arquivo ocupar menos espao em disco (o que pode ser muito importante se o arquivo for grande). Em segundo lugar, muitos softwares grficos tm problemas em ler arquivos de dados em dupla preciso.

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

19

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

15. Subrotinas O fortran permite a separao do programa em vrias partes independentes que executam tarefas diferentes. Estas partes independentes so chamadas SUBROUTINE. Uma subrotina recebe, ou no, uma lista de variveis por argumento, de modo anlogo s FUNCTIONS descritas acima. A diferena fundamental entre uma SUBROUTINE e uma FUNCTION que a primeira no 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,... "instrues" end O comando END delimita o fim da subrotina. Todas as observaes feitas sobre as variveis locais a uma FUNCTION permanecem vlidas no caso de uma subrotina. O comando RETURN tambm pode ser utilizado dentro de uma subrotina, afim de que as demais linhas da subrotina no sejam executadas. Isto particularmente til no caso em que, se alguns resultados intermedirios assumem certos valores, no necessrio (ou no se deve) executar as demais linhas da subrotina. De modo anlogo s FUNCTIONS, as "instrues" representam um conjunto de linhas contendo vrias instrues diferentes, que podem ser chamada a FUNCTIONS ou outras subrotinas, etc... Porm, recursividade tambm no permitida aqui (veja comentrios em FUNES). Apresentamos uma lista de argumentos bastante limitada para a subrotina, embora estes argumentos podem ser vetores, matrizes, etc... Na realidade, poderamos ter passado at mesmo subrotinas ou FUNCTIONS por argumento. Para se passar uma FUNCTION por argumento, necessrio avisar ao compilador que no se trata de uma varivel, 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 preciso. Isto no necessariamente verdade. Ela poderia retornar um valor em preciso simples, por exemplo. Neste caso, deveramos modificar a instruo correspondente a declarao de seu tipo convenientemente. No caso de alguns compiladores, apenas as instrues descritas acima so necessrias 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 FUNO esteja presente no lugar onde a subrotina chamada.

A chamada de uma subrotina executada por meio da instruo CALL. Por exemplo CALL NOME(A1,A2,...,J1,J2,...) faz com que as instrues contidas na subrotina NOME sejam executadas e a lista de argumentos (A1,A2,...,J1,J2,...) seja transferida a ela. Ao trmino da execuo dos comandos da subrotina, as variveis contidas na lista de argumentos so "devolvidas" atualizadas para a parte do programa

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

20

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

que chamou a subrotina, caso alguma delas tenha sido alterada. Note que utilizamos nomes diferentes para as variveis da lista de argumentos para insistir no fato de que os nomes de variveis dentro das subrotinas (ou FUNCTIONS) so independentes dos nomes de variveis em outras partes do programa. Isto no 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 lgico) no conhecido. Por esta razo, necessrio declarar o tipo da FUNCTION dentro de uma subrotina ou funo. Note que isto no quer dizer que se uma FUNCTION passada por argumento ela deve possuir o mesmo nome na lista de argumentos da declarao 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 varivel. 16. Common Uma vez que as variveis dentro de FUNCTIONS e SUBROUTINES so independentes, o comando COMMON extremamente importante para que SUBROUTINES e FUNCTIONS se comuniquem sem que tenhamos que passar todas as variavis 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 criao de COMMONS independentes. Isto muito til quando apenas um certo grupo de variveis passado para uma subrotina (ou funo) e esta recebe um outro grupo de variveis diferentes de uma outra subrotina (ou funo). X1,X2,... - representa a lista de variveis associadas a este COMMON. Estas variveis podem ser inteiras, reais, vetores, matrizes, etc... (no podem ser funes ou subrotinas). importante que as variveis que ocupam mais espao na memria apaream em primeiro lugar na lista do COMMON do que aquelas que ocupam menos espao. Por exemplo, um nmero real em preciso dupla deve aparecer antes de um nmero inteiro. Isto tambm verdade para os argumentos da subrotina. Para que duas subrotinas (ou funes) diferentes acessem e/ou alterem uma (ou algumas) das variveis na lista de um COMMON basta que o COMMON esteja presente nas duas (ou mais) subrotinas (e/ou funes). Note, mais uma vez, que as variveis da lista do COMMON podem ter nomes diferentes nas diferentes subrotinas ou funes. O compilador identifica as variveis num dado COMMON pela sua posio na lista. Exemplo 3: integer*2 i integer*2 n parameter(n=10) real*8 v2(n) real*8 v1(n) common/zerav1/v1 real*8 absx external absx do i=1,n v1(i)=0.d0 v2(i)=0.d0 end do call altera(v2,absx)

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

21

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

do i=1,n write(*,*)' i = ',i,' v1(i) = ',sngl(v1(i)), ' v2(i) = ',sngl(v2(i)) end do end subroutine altera(v2,f) integer*2 n parameter(n=10) real*8 v2(n) real*8 v1(n) common/zerav1/v1 real*8 f external f real*8 fexp integer*2 i real*8 x real*8 dx parameter(dx=0.5d0) x=-2.d0 do i=1,n x=x+dx v1(i)=f(x) v2(i)=fexp(x) end do end function absx(x) real*8 absx real*8 x if(x.lt.0.d0)then absx=-x else absx=x end if end function fexp(x) real*8 fexp real*8 x fexp=exp(x) end

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

22

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

Exerccios Fortran 1. Faa um programa que leia 3 nmeros diferentes e os escreva em ordem crescente. 2. Faa um programa que leia dois vetores e apresente o produto escalar e o produto vetorial deles. 3. Faa um programa que leia uma lista de valores (semelhante a vetores) de uma experincia de laboratrio (por exemplo, temperatura e velocidade do som no ar) e calcule as mdias aritmticas, o desvio padro e a varincia de cada uma das grandezas, alm disso, calcule a correlao. As equaes esto no final das notas de aula. 4. Faa um programa que calcule a integral de uma funo pelo mtodo do retngulo. 5. Faa um programa que calcule a soluo de um sistema de equaes pelo mtodo iterativo.

Obs.: Para todos os programas use arquivos de dados na entrada e na sada dos resultados, crie tambm funes e/ou subrotinas para os clculos.

a) Mdia Aritmtica:

x=
b) Desvio Padro:

xi
i =1

1 (x1 + x2 +  + xN ) N

=
c) Regresso Linear:

1 N (xi x )2 N 1 i =1
v=
2

a=

xi yi N xi yi
i =1 i =1

xi2
i =1

onde N a quantidade de medies, xi o i-simo valor medido, x o valor mdio, o desvio padro, v a varincia, x e y, so os desvios padres das grandezas x e y e R a correlao entre os valores das grandezas x e y.

1 N xi N i =1

i =1 2

b=

yi a xi
i =1 i =1

R=a

x y

Notas de aula de Fortran - Departamento de Cincias Ambientais - UFERSA Prof. Idalmir

23