Você está na página 1de 233

 

 

 
 


 


 
!"|| #$

| 






 
!%


Ä Introdução.
Ä Bases para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.


!%


Ä & '(
'(
Ä Bases para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.

$
& '(
)*
 +

Ä O que é Fortran?

± Fortran é uma linguagem de programação genérica, mas


com ênfase em processamento matemático. Por essa
razão, é amplamente utilizada em engenharia.

± Fortran significa ³Formula Translation´ e foi a primeira


linguagem de alto nível criada. O início de seu
desenvolvimento vem da década de 1950 a partir dos
laboratórios da IBM e desde então muitas versões foram
lançadas.

± Por convenção, uma versão da linguagem é batizada com


os dois últimos dígitos do ano de lançamento: Fortran 66,
Fortran 77 e Fortran 90 / 95.

‰
& '(
)*
 +

Ä O que é Fortran?

± A versão mais popular, até bem pouco tempo, era o Fortran


77. Atualmente, essa versão vem perdendo espaço para o
Fortran 90/95.

± Há algumas diferenças entre o Fortran 77 e o Fortran


90/95:
´ Fortran 77:
Sem recursos visuais.
Pobre interface com o usuário.

´ Fortran 90/95:
Muitos recursos gráficos.
Criação de softwares com interface amigável.
Compilação de programas desenvolvidos em Fortran com
subprogramas desenvolvidos em C, gerando um único
executável.
Paralelização de cálculos.

& '(
| *
 ,

 +

Ä Por que aprender Fortran?

± Apesar de frequentemente a ³morte´ da linguagem ser


anunciada mundo afora (substituição por outras linguagens
de alto nível), a linguagem permanece viva há mais de 50
anos!

± Existem diversas rotinas já elaboradas, o que facilita o


trabalho do programador (lembrem-se que, em geral,
engenheiros têm pouco tempo para apresentar soluções!)

± É uma linguagem que, atualmente, interage com outros


programas (Visual Basic, Mathcad etc.).


& '(
- % 

Ä Bibliografia:

± FORTRAN 90/95 for Scientists and Engineers


Stephen J. Chapman
WCB McGraw-Hill, 1998.

± Fortran Numerical Recipes


William H. Press, Saul A. Teukolsky, William T. Vetterling, Brian
P. Flannering
Vols. 1 e 2, University of Cambridge.

± Manual do programa.

± Material disponível na Internet.



!%


Ä Introdução.
Ä  
 , , % . '(
.  
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.

È
 
, , % . '(
.
., 


Ä Existem vários compiladores Fortran disponíveis:


± Lahey;
± Compaq;
± Intel;
± Absoft.

Ä Neste curso, vamos utilizar o j  


  ,
versão 6.5. Os comandos que serão apresentados,
no entanto, são válidos para qualquer outro
compilador.


 
, , % . '(
.
/ 

Ä Após a instalação do Compaq Visual Fortran (CVF), a


inicialização é feita através do menu:

± Iniciar > Programas > Compaq Visual Fortran 6 > Developer


Studio

X
 
, , % . '(
.
/ 

Ä O CVF abrirá com o seguinte aspecto:

XX
 
, , % . '(
.
/ 

Ä O estúdio de desenvolvimento do CVF tem o


seguinte aspecto geral (projeto   foi carregado):

,  ,
 


.






'(
.,



, 0


., '(

° 
X
 
, , % . '(
.
/ 

Ä A janela de componentes de projeto (lado esquerdo):


Janela onde se visualizam os arquivos
utilizados pelo projeto:
´ Programa principal.
´ Subrotinas.
´ Funções.
´ Informações sobre o editor de recursos.
´ Pasta com informações sobre
.,

 dependências.

, 0


X$
 
, , % . '(
.
/ 

Ä A janela de edição (lado direito):


´ Programas.
´ Funções, subrotinas etc.





'(


 
, , % . '(
.
/ 

Ä A janela de informações sobre compilação e  :


Tem as seguintes funções:

´ Dá informações sobre a compilação do programa principal,


subrotinas e funções e o link entre elas (na situação abaixo, o
programa foi compilado e gerado (link) com sucesso.

´ Gera erros (impedem a geração do programa (.exe)) e â  


(advertências que não impedem a criação do .exe).

., '(

° 

X
 
, , % . '(
.
/ 

Ä Os arquivos com instruções Fortran podem ter dois


tipos de formato:
± Fixo (arquivo .FOR, Fortran 77, imita os antigos cartões):

´ O código é escrito da coluna 7 à coluna 72. Para continuar um


comando em outra linha, a linha de continuação deve ter um
caractere na coluna 6.

´ Comentários são feitos colocando um j ou  na primeira coluna.

´ Variáveis com até 6 caracteres maiúsculos (em alguns


compiladores). O primeiro não pode ser numérico.

´ As colunas de zero a cinco são reservadas para os endereços


numéricos (rótulos) dos comandos.

X
 
, , % . '(
.
/ 

X   


 
, , % . '(
.
/ 

Ä Os arquivos com instruções Fortran podem ter dois


tipos de formato:
± Livre (arquivo .F90, Fortran 90):

´ O código é escrito da coluna 1 à coluna 132. Para continuação


de linha, utiliza-se o símbolo  (e comercial), que deve ser
colocado no fim da linha a ser continuada.

´ Comentários são feitos posicionando um ' em qualquer ponto da


linha de comando. A partir do ', o compilador entende que
seguirá um texto de comentário.

´ Variáveis com até 31 caracteres (incluindo o símbolo _ ). O


primeiro não pode ser numérico.


 
, , % . '(
.
/ 

X
 
, , % . '(
.
 

 

Ä Caracteres válidos em Fortran:

± Letras maiúsculas: A±Z (26)


± Letras minúsculas: a±z (26)
± Dígitos: 0±9 (10)
± =   : _ (1)
± Símbolos aritméticos: + - / * ** (5)
± Símbolos gerais: ( ) . = , µ
$ : ! ³ % &
; < > ? Vazio (17)

± TOTAL: ùÈ1

± O Fortran não diferencia letras maiúsculas e minúsculas!



 
, , % . '(
.
2   
., % . 

Ä Um programa Fortran pode ser dividido em três


seções:

± Declaração:
´ Grupo de instruções não executáveis, localizadas no início do
programa, que definem o nome do programa e, também, a
quantidade, tipos e nomes de todas as variáveis do programa.

± Execução:
´ Grupo de uma ou mais instruções que descrevem as ações
que serão realizadas pelo programa.

± Término:
´ Consiste de uma ou duas instruções que encerram a
execução de um programa.

X
 
, , % . '(
.
2   
., % . 

3
 '4


25
'(

 6 . 
 
, , % . '(
.
2   
., % . 

Ä Seção de declarações:

± PROGRAM    (OBRIGATÓRIO).

± Comentários (objetivo do programa, dados sobre revisões


etc) (OPCIONAL, mas fortemente RECOMENDADO).

± Tipo e nomes das variáveis e constantes (até 31 caracteres


alfanuméricos). Recomenda-se descrever cada variável
utilizada.

$
 
, , % . '(
.
2   
., % . 

".
 , % .

.
    

2 . , 2 °

3
  



 
, , % . '(
.
2   
., % . 

Ä Seção de execução:

± Seção na qual se posicionam as instruções que formam o


código.

± Comentar as instruções, descrevendo o que fazem


(importante para futura compreensão do programa).

± Letras MAIÚSCULAS para palavras do Fortran (READ,


WRITE, REAL, PROGRAM etc.) e minúsculas para
variáveis, operações etc (Sugestão de estilo).


 
, , % . '(
.
2   
., % . 

.
 
&  '4
, 

  
 
.
 
),
'(
.
 
),
'(
.
 
25, 

 



 
, , % . '(
.
2   
., % . 

Ä Seção de término:

± Contém OBRIGATORIAMENTE o comando END


PROGRAM    (opcional):


 
, , % . '(
.
 

 
 .


Ä As constantes e variáveis em Fortran possuem até


31 caracteres alfanuméricos não podendo ser
iniciadas com dígitos:
± Nomes válidos:
Ä Tempo (Lembre-se que não há distinção entre
maiúsculas e minúsculas!)
Ä distancia
Ä jk123_45
Ä Meu_time_eh_bom

± Nomes inválidos:
Ä 3_dias (inicia com dígito)
Ä JK$ ($ é um caractere ilegal para variáveis)
Ä O_nome_dessa_variavel_eh_muito_grande

 
, , % . '(
.
 

 
 ,

Ä Podem ser dos seguintes tipos:


± Tipos intrínsecos (D  ):
Ä Inteiras (INTEGER)
Ä Reais (REAL) ". 
Ä Complexas (COMPLEX)
Ä Lógicas (LOGICAL)
Ä Caracteres (CHARACTER)

± Tipos derivados:
Ä Definidos pelo usuário para resolver problemas específicos.


 
, , % . '(
.
 

 
 ,

Ä Tipo inteiro:
± Válidos:
Ä 0
Ä 1
Ä -999
Ä 123456789
Ä 17

± Inválidos:
Ä 1,000,000 (vírgulas não são permitidas)
Ä -100. (se tem um ponto decimal, trata-se de um real)

$
 
, , % . '(
.
 

 
 ,

Ä Tipo real:
± Precisão simples, 4 bytes, 32 bits: números com até 7
algarismos significativos e variando entre 10-38 e 10+38 (positivo
ou negativo).
± Válidos:
Ä 10.
Ä -999.99
Ä +1.0E-3
Ä 123.45E20
Ä 0.12E+1

± Inválidos:
Ä 1,000,000. (vírgulas não são permitidas)
Ä 111E3 (é necessário um ponto decimal na mantissa)
Ä 111E2.5 (não é permitido pontos decimais no expoente)
$X
 
, , % . '(
.
 

 
 ,

Ä Tipo caractere:
± Sequências alfanuméricas delimitadas por § ou . Na região
delimitada por § ³ podem ser utilizados quaisquer símbolos,
não só os 86 listados anteriormente.

± Válidos:
Ä µIsto eh um teste¶
Ä µ µ (espaço em branco)
Ä µ (^) µ (apesar de não constar na lista, ^ é
possível dentro dos µ µ)
Ä ³123.45E20´ (tipo caractere, não é número!)

± Inválidos:
Ä Isto eh um teste (não está limitado por µ µ ou ³ ³)
Ä µIsto eh um teste´ (limites misturados)
Ä µ µ Isto eh um teste¶ (não há balanço entre os µ)
$
 
, , % . '(
.
 

 
 ,

Ä Tipo lógico:
± Válidos:
Ä .TRUE.
Ä .FALSE.

± Inválidos:
Ä TRUE (faltam os pontos)
Ä .FALSE (falta o ponto à direita)

$$
 
, , % . '(
.
 

 

 '(

Ä Declaração:

± O Fortran assume, por  , que variáveis iniciadas por I, J,


K, L, M ou N são inteiras. Variáveis iniciadas por qualquer
outra letra é assumida como real.

± Não é recomendável que se utilize diretamente a convenção


estabelecida pelo Fortran. Pode causar erros!

± Assim, sugere-se FORTEMENTE que se declarem todas as


variáveis a serem utilizadas no programa.


 
, , % . '(
.
 

 

 '(

Ä Declaração:

± Como declarar variáveis (modificam-se ao longo do


programa)?

PROGRAM    ...

INTEGER :: , , , ...


REAL :: , , , ...
LOGICAL :: , , , ...
CHARACTER(len=   ) :: , , , ...

Número de
caracteres na
variável

$
 
, , % . '(
.
 

 

 '(

Ä Declaração:

± Como declarar constantes (não se modificam ao longo do


programa)?

PROGRAM    ...

INTEGER, PARAMETER ::    ,    , ...


REAL , PARAMETER ::    ,    , ...
LOGICAL, PARAMETER ::    ,    , ...
CHARACTER(len=   ), PARAMETER ::    , ...

$
 
, , % . '(
.
 

 

 '(

Ä Declaração:

Desabilita os tipos
 do Fortran e
obriga o compilador a
verificar se todas as
variáveis utilizadas
foram declaradas.


 
, , % . '(
.
! -  

,
'4
  .  

Ä Atribuição de valores:
.
7 7  
8
5,
 

Ex.:
a=b+c
c = (b ** c + (2.404 * d + 3.5))
c = c +1

±
5,
  é uma combinação de

´ Variáveis.

´ Operadores aritméticos: ë , ,  (multiplicação),  ,  (exponenciação).

´ Funções intrínsecas: SIN(), COS() etc. (mais a frente será visto


com mais detalhes).

 
, , % . '(
.
! -  

,
'4
  .  

Ä Operações aritméticas:
± Operações com números inteiros levam a números inteiros:
Ä 3/4=0
Ä 7/4=1
Ä 8/4=2

± Operações com números reais levam a números reais:


Ä 3. / 4. = 0.75
Ä 1. / 3. = 0.3333333
Ä Repare que, devido a aproximações e dependendo do
compilador:
± $ùX$19X
± ùX18X

$
 
, , % . '(
.
! -  

,
'4
  .  

Ä Operações aritméticas:
± Hierarquia de operações:

1. Tudo que estiver entre parênteses é avaliado primeiro,


começando dos parênteses mais internos para os mais
externos.

2. Todas as exponenciações são avaliadas da direita para a


esquerda.

3. Todas as multiplicações e divisões são efetuadas da


esquerda para direita.

4. Todas as adições e subtrações são efetuadas da esquerda


para a direita.

‰
 
, , % . '(
.
! -  

,
'4
  .  

Ä Operações aritméticas:
± Aritmética mista:

´ Operação entre um número inteiro e um número real é


chamada de operação de aritmética mista.

´ Quando uma operação com aritmética mista é encontrada, o


Fortran converte o inteiro em real e realiza a operação.

´ A conversão automática não ocorre até que um número inteiro


encontre-se com um número real em uma mesma operação.
Até lá, é possível que operações com aritmética inteira e/ou
real ocorram dentro da expressão.

´ Aritmética mista deve ser EVITADA, salvo em uma exceção


que será apresentada mais adiante.
‰X
 
, , % . '(
.
! -  

,
'4
  .  

Ä Operações aritméticas:
± Aritmética mista (exemplos):
Ä 1+1/4 =1
Ä 1. + 1 / 4 = 1.
Ä 1 + 1. / 4 = 1.25

± Qual seria o resultado armazenado na variável  ?

INTEGER :: nres
nres = 1.25 + 9 / 4

‰
 
, , % . '(
.
! -  

,
'4
 :% 

Ä Atribuição de valores:

  
7 % 8
5,
 7 %


5,
 7 % pode ser definida como uma
comparação entre duas operações aritméticas, sendo da
forma:
a1  a2

onde  é um operador relacional ou lógico.

O resultado dessa operação será .TRUE. ou .FALSE.

‰$
 
, , % . '(
.
! -  

,
'4
 :% 

Ä Operações lógicas
± Operadores relacionais:

>  ° >  °     


  
  
== .EQ. Igual a

/= .NE. Diferente

> .GT. Maior que

< .LT. Menor que

>= .GE. Maior ou igual

<= .LE. Menor ou igual


‰‰
 
, , % . '(
.
! -  

,
'4
 :% 

Ä Operações lógicas
± Operadores relacionais:

Ä 3 < 4 .TRUE.
Ä 3 <= 4 .TRUE.
Ä 3 == 4 .FALSE.
Ä 4 <= 4 .TRUE.
Ä µA¶ < µB¶ .TRUE. (ordem alfabética)

Ä 4 == 4. .TRUE. (inteiro é transformado em real).


Ä 4 <= µA¶ Ilegal, comparação entre inteiro e caractere.

‰
 
, , % . '(
.
! -  

,
'4
 :% 

Ä Operações lógicas
± Operadores lógicos:

è 2 

.AND. E lógico

.OR. Ou lógico

.EQV. Equivalência lógica

.NEQV. Inequivalência lógica

.NOT. Não lógico

‰
 
, , % . '(
.
! -  

,
'4
 :% 

Ä Operações lógicas
± Operadores lógicos:

   è > >

.FALSE. .FALSE. .FALSE .FALSE. .TRUE. .FALSE.

.FALSE. .TRUE. .FALSE. .TRUE. .FALSE. .TRUE.

.TRUE. .FALSE. .FALSE. .TRUE. .FALSE. .TRUE.

.TRUE. .TRUE. .TRUE. .TRUE. .TRUE. .FALSE.

‰
 
, , % . '(
.
! -  

,
'4
. 



Ä Atribuição de valores:

  
7 

8
5,
 7 


5,
 7 

pode ser definida como uma
operação entre caracteres. Há dois operadores de
caracteres:
´
D  
´ Concatenação (//)

O resultado dessa operação será outro caractere.

‰È
 
, , % . '(
.
! -  

,
'4
. 



Ä Operações com caracteres:

1. CHARACTER(len=3) :: file_ext
file_ext = µf¶

Resultado: file_ext = µf¢¢¶ , ¢ representa um espaço vazio.

2. CHARACTER(len=3) :: file_ext_2
file_ext_2 = µFILE01¶

Resultado: file_ext_2 = µFIL¶

‰
 
, , % . '(
.
! -  

,
'4
. 



Ä Operações com caracteres:


3. Substring:

CHARACTER(len=6), PARAMETER :: file_ext = µ123456¶


CHARACTER(len=6), PARAMETER :: file_ext_3 = µ456¶
CHARACTER(len=3) :: file_ext_2, file_ext_4

file_ext_2 = file_ext(1:3) ! Identifica os caracteres


! nas posições de 1 a 3
! da variável file_ext.
file_ext(1:3) = file_ext_3 ! Reescreve posições de 1
! a 3.

Resultados: file_ext_2 = µ123¶ , file_ext = µ456456¶



 
, , % . '(
.
! -  

,
'4
. 



Ä Operações com caracteres:


4. Concatenação (//):

PROGRAM test

CHARACTER(len=10) :: a
CHARACTER(len=8) :: b, c
a = µABCDEFGHIJ¶
b = µ12345678¶
c = a(1:3) // b(4.5) // a(6:8)

END PROGRAM test

Resultado: c = µABC45FGH¶
X
 
, , % . '(
.
 '4
 ; 
 

Ä Algumas funções intrínsecas do Fortran:


  2   2    
   °2
SIN (X) Real Real Seno de X (X em radianos)

COS(X) Real Real Cosseno de X (X em radianos)

TAN(X) Real Real Tangente de X (X em radianos)


ASIN(X) Real Real Arco cujo seno é X (X em
radianos)
ACOS(X) Real Real Arco cujo cosseno é X (X em
radianos)
ATAN(X) Real Real Arco cuja tangente é X (X em
radianos)
EXP(X) Real Real elevado a X

SQRT(X) Real Real Raiz quadrada de X (X•0)



 
, , % . '(
.
 '4
 ; 
 

Ä Algumas funções intrínsecas do Fortran:


  2   2    
   °2
LOG(X) Real Real Logaritmo natural de X (X•0)

LOG10(X) Real Real Logaritmo na base 10 de X (X•0)

IACHAR(C) CHAR(1) Inteiro Retorna a posição do caractere


C na sequência ASCII.
ACHAR(I) Inteiro CHAR(1) Retorna o caractere na posição I
da sequência ASCII.
INT(X) Real Inteiro Retorna a parte inteiro do real X
NINT(X) Real Inteiro Retorna o inteiro mais próximo
de X

$
 
, , % . '(
.
 '4
 ; 
 

Ä Algumas funções intrínsecas do Fortran:


  2   2    
   °2
REAL(I) Inteiro Real Transforma o inteiro I em número
real
MOD(A,B) Real / Inteiro Real / Inteiro Retorna o resto da divisão de A
por B
MAX(A,B) Real / Inteiro Real / Inteiro Retorna o máximo entre A e B.
MIN(A,B) Real / Inteiro Real / Inteiro Retorna o mínimo entre A e B.


 
, , % . '(
.
<




 

Ä No Fortran, a leitura de dados é feita através do


comando READ:

READ (*,*) , , , ...

Ä Exportam-se dados através do comando WRITE:

WRITE (*,*) , , , ...

Ä Mais adiante, novas opções serão dadas para a


leitura e escrita de dados em programas Fortran.


 
, , % . '(
.
!,  '(X

Ä Programa para leitura de um ângulo em graus e


cálculo de seu seno e cosseno, que devem ser
informados ao usuário:

PROGRAM sencos
REAL, PARAMETER :: graus_rad = 3.141592 / 180.
REAL :: theta, senth, costh

READ (*,*) µInforme o angulo em graus:¶, theta


senth = SIN (theta * graus_rad)
costh = COS (theta * graus_rad)
WRITE (*,*) µO seno do angulo¶, theta,¶ graus eh:¶, senth
WRITE (*,*) µO cosseno do angulo¶, theta,¶ graus eh:¶, costh


END PROGRAM sencos
 
, , % . '(
.
!,  '(

Ä Programa para converter uma dada temperatura em


Fahrenheit para Kelvin e Celsius:

± Definição do problema: dada uma temperatura em


Fahrenheit, convertê-la para Kelvin e Celsius.

± Entrada e saída de dados: ler a temperatura  e


escrever os valores convertidos em Kelvin e Celsius.

± Elaboração do algoritmo:

Ä Ler a temperatura .


Ä Converter para Kelvin ( ) e Celsius ( ).
Ä Escrever a temperatura convertida.

± Transformar o algoritmo em um código FORTRAN utilizando


declarações condicionais: vide projeto >  

 
, , % . '(
.
!,  '(

´ Passo 1: criar um projeto dentro do CVF:

No menu de tarefas, clicar em 


= "
>.

 
, , % . '(
.
!,  '(

´ Passo 2: Na caixa de diálogo chamada "


>, com a aba em
| 0
 , selecione ?    @ ,A  BCD
!,,   µ (Windows) ou µ  
!,   ¶
(Texto) e, na caixa de edição chamada , 0
 .
dê o
nome (nesse caso) 'Equation' ao projeto. Clique em 'OK'.

Nome do projeto
Diretório de trabalho

O subdiretório (default) foi


aberto em:
C:\Program Files\Microsoft
Visual
 Studio\MyProjects\Equation
 
, , % . '(
.
!,  '(

´ Passo 3: seleciona-se e define-se o tipo de arquivo que será


empregado:
o Clique, novamente, no menu de tarefas > 
> "
>

o Selecionar 


 .  


para editar o
programa (Fortran
90).
o Entrar com o nome
do programa (deixar
selecionado a adição
ao projeto).
o Será criado o arquivo
 Teste1.f90.
 
, , % . '(
.
!,  '(

´ Passo 4: Codifica-se o programa Fortran:

X
 
, , % . '(
.
!,  '(

o Para observar que o seu programa


realmente já faz parte do projeto,
clique na caixinha 2*  
 na
janela esquerda, que contém os
elementos do projeto. Clicando,
depois, em  

 (a primeira
dentre as três caixinhas amarelas)
deverá aparecer o arquivo teste1.f90,
que já pode ser compilado.


 
, , % . '(
.
!,  '(

´ Passo 5: A compilação é uma


operação que visa detectar
erros de programação (de
sintaxe e de estrutura dos
comandos) e, na ausência de
erros, há a criação do
programa objeto
correspondente ao programa
fonte.

o Dirija-se a   =
.,
6

X.

$
 
, , % . '(
.
!,  '(

o Com a compilação, foi gerado um programa objeto chamado


  D .

Diretório onde foi


criado o projeto

Diretório Debug


 
, , % . '(
.
!,  '(

´ Passo 6: Para criar um programa executável (se não houver


erros de compilação), clique em   =   2*  
5
.


 
, , % . '(
.
!,  '(

o Ao clicar no item   2*  


5
, você %  todas as
,
'  (programa principal, funções e subrotinas) de seu
programa, gerando um único programa executável (que terá o
nome do projeto + .exe). A ligação dessas unidades de
programa já compiladas (programas objeto) em um único
executável é conhecida como operação de ³linking´ (link).

o Observação:
Etapas (válidas para todo tipo de programa):


 
, , % . '(
.
!,  '(

o Se a ligação for feita com sucesso, o CVF gerará o arquivo


Equation.exe (diretório debug).

Diretório Debug

o Pode-se executar o programa através de um duplo clique sobre


Equation.exe ou dentro do próprio CVF.


 
, , % . '(
.
!,  '(

Ä |     = 25

2*  
5
.


 
, , % . '(
.
!,  '(


 
, , % . '(
.
!,  '(

Ä Gere novamente o projeto Equation, porém


utilizando a opção Fortran Console Application.

Ä Dê a temperatura em Celsius e converta para


Fahrenheit e Kelvin.


!%


Ä Introdução.
Ä Bases para programação em Fortran.
Ä 3
 '4
   
  
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.

X
3
 '4
  
!,

'(

Ä Declarações condicionais são aquelas que, através


de instruções lógicas, nos permitem selecionar e
executar partes específicas de um código (blocos)
sem passar por outras.

Ä Em FORTRAN, constroem-se declarações


condicionais através de dois comandos:

± 0     

±
>>j j
>.


3
 '4
  
). &

Ä O comando 0 especifica que um determinado bloco


do código será executado SE E SOMENTE SE uma
dada expressão lógica for verdadeira:
0    ! >
0  " 
0  " 
 

0  " 
> 0
0  " 

± Se   ! for VERDADEIRA, executam-se as


instruções 1 a N.
± Se   ! for FALSA, o programa segue para a
$
próxima instrução após > 0 (0  " ).
3
 '4
  
). &

Ä Outra possibilidade (apenas uma instrução):

0    ! 0  " 

Ä Observações importantes:

1. O comando 0  > deve estar sempre na mesma


linha. Caso o número de colunas ultrapasse o limite
estabelecido pelo compilador FORTRAN, continuar na
linha seguinte:

0  
 >

‰
3
 '4
  
). &

2. Cada instrução deve ocupar linhas exclusivas após o


comando 0  >.

3. O comando > 0 também deve ser posicionado em uma


linha exclusiva.

4. Para melhor visualização do programa, as instruções


devem ser ³indentadas´ (2 ou mais espaços em relação a
0 ).


3
 '4
  
). &

Ä Dentro do comando 0 , caso se deseje executar um


ou mais blocos de código quando a instrução lógica
for falsa, utilizam-se os comandos:

± >
>

± >
>0


3
 '4
  
). &

Ä Forma dos comandos:


0    !  >
0  " 
0  "    X

>
> 0    !  >
0  " 
0  "    

>
>
0  " 
0  "    $

> 0

3
 '4
  
). &

Ä Observações importantes:

1. Os comandos >
> e >
> 0 devem ocupar linhas
exclusivas. Caso a linha seja excedida, estender a linha
através de &.

2. O número de >
>0 em uma declaração condicional é
indeterminado (quantos forem desejados!)

È
3
 '4
  
!,  '(X

Ä Avaliar o valor de uma função de duas variáveis em


um dado ponto (x,y):

  ö   ! ö  !
·
·  ö 
! ö!
   ö   
·  ö   ! ö  !
·   ö    ! ö  !


3
 '4
  
!,  '(X

Ä Etapas do programa:
± Definição do problema: calcular o valor da função f em um
ponto (x,y).

± Entrada e saída de dados: ler o ponto (x,y), exportar o valor


da função f.

± Elaboração do algoritmo:

Ä Leitura dos valores x e y.


Ä Cálculo da função f(x,y).
Ä Escrever o valor da função.

± Transformar o algoritmo em um código FORTRAN utilizando


declarações condicionais.
È
3
 '4
  
  . &

Ä É possível rotular (nomear) o comando 0


associando aos respectivos >
>, >
> 0 e >
0 :
  0    !  >
0  " 
0  " 

>
> 0    !  > 
0  " 
0  "  )-
 '4
 -
.

 Ä Qualquer expressão alfanumérica
>
>  com até 31 caracteres começando
0  "  com uma letra.
0  " 
 Ä Deve ser diferente em cada um dos
0 ao longo do programa e também
> 0 
deve ser diferente de qualquer nome
ÈX de variável ou constante declarada.
3
 '4
  
  . &

Ä Por que nomear o comando 0 ? Só para dar mais


trabalho?!
± Nos ajuda e, também o compilador, na associação dos
blocos de código a declarações condicionais complexas.
Nomeando a declaração em um programa complexo (que se
estende por páginas e páginas) se torna extremamente fácil
identificar a quem pertence um determinado bloco de
código.

± 
.,
*
,;
E .

 .  0F

È
3
 '4
  
 ,'4
. &

Ä Comandos 0 agrupados:

  0    !  >


0  " 
0  " 

  0    !  >
0  " 
0  "  )-
 '4
 .,


Ä Poderia haver um número indeterminado
> 0   de >
> e >
> 0 (cada um com o
0  "  nome associado ao seu respectivo 0 ),
0  "  além dos próprios 0 .

Ä Os 0 são fechados (> 0 ), por
> 0  
definição, do mais interno para o mais
È$ externo.
3
 '4
  
!,  '(

Ä Construir uma declaração condicional na qual, dada


uma nota, associe-se um conceito:

± Conceito A: Nota > 95

± Conceito B: Nota > 86 e Nota <= 95

± Conceito C: Nota > 76 e Nota <= 86

± Conceito D: Nota > 66 e Nota <= 76

± Conceito E: Nota > 0 e Nota <=66

ȉ
3
 '4
  
!,  '(

Ä Opção 1 (0 , >
> 0 e >
>)

 0   # $%& >


0>' ()     *
>
> 0   # +,& > 
0>' ()     -*
>
> 0   # .,& > 
0>' ()     j*
>
> 0   # ,,& > 
0>' ()     *
>
> 
0>' ()     >*
> 0 
È
3
 '4
  
!,  '(

Ä Opção 2 (Comandos 0 agrupados)


 0   # $%& >
0>' ()     *
>
> 
 0   # +,& >
0>' ()     -*
  (
>
> 
  0   # .,& > Quando as opções são
0>' ()     j* mutuamente exclusivas
>
>  é preferível utilizar >
>

 0   # ,,& >  0 a comandos 0
0>' ()     * agrupados!
>
> 

0>' ()     >*
> 0 

> 0 
> 0 
È
> 0 
3
 '4
  
). !2

Ä O comando j
> é uma outra forma de declaração
condicional. É menos utilizada do que o comando IF.

Ä Permite ao programador selecionar um bloco


específico do código para um dado valor inteiro,
lógico ou alfabético.

ȝ
3
 '4
  
). !2

Ä Forma geral do comando:

 
>>j j
>   
j
>   
0  "  )-
 '4

0  "    X Ä .
 segue as

j
>    mesmas
0  "  considerações feitas
0  "     para o comando IF.

Ä @ , XE   "

devem ser
j
> > = 
mutuamente
0  " 
0  "    exclusivos
 Ä 32!<6 é opcional.
>
>>j 
ÈÈ
3
 '4
  
!,  '($

Ä Exemplo de utilização do comando j


>:
0>> 

j 
>>jj
>  
j
> 
0>'(> /D  & '*
j
> &
0>'(> /   &*
j
> &
0>'(> /  '*
j
>
0>'(     / / '*
j
> 0
0>'(> /  *
È >
>>jj
> j 
3
 '4
  
3 

Ä É comum, quando se constroem blocos


condicionais, cometermos erros na escolha do
operador condicional a ser utilizado ou mesmo
errarmos na própria concepção da expressão lógica
(uso de  ao invés de ), etc)

Ä Atenção ao se construir comparações de variáveis


com números reais! Pequenos erros de
aproximação são cometidos durante operações com
aritmética de ponto flutuante. Assim, evite
expressões:
0    & >
Prefira:
 0 -
& 1 &&&& >
!%


Ä Introdução.
Ä Bases para programação em Fortran.
Ä Declarações condicionais.
Ä 3
 '4

  
 
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.

X
3
 '4

  
!,

'(

Ä Declarações recursivas ( ) são aquelas que


permitem a execução de uma sequência de
instruções mais de uma vez.

Ä Em FORTRAN, há dois tipos de declarações


recursivas, que se diferenciam pela forma de
controle do número de repetições:
± š 0> ° : as instruções neles contidas são executadas
indefinidamente até que uma condição especificada pelo
programador seja atingida.

±     : as instruções neles contidas são


executadas um número de vezes previamente especificado.


3
 '4

  
š 0>

Ä Neste tipo de comando, as instruções são repetidas


até que uma condição especificada pelo
programador seja atingida:

Ä Forma geral do comando )-


 '4


)  Ä Pode haver mais de


 uma controle lógico
0    ! > 0 para interrupção do

loop.
> ) Ä A interrupção pode
estar posicionado em
qualquer lugar entre

,'( ) e > )
$
3
 '4

  
!,  '(X

Ä Elaborar um programa FORTRAN para cálculo da


média aritmética e do desvio padrão de um dado
conjunto de números reais.
± A média aritmética é dada pela expressão:

X 
  ð 
 X
± O desvio padrão é dado por:

   
 
ð  ð 
 
 X  X 


L X
3
 '4

  
!,  '(X

Ä Etapas do programa:
± Definição do problema: calcular a média aritmética e o
desvio padrão de um dado conjunto de pontos

± Entrada e saída de dados: ler o número de valores e o


conjunto de valores. Retornar a média e o desvio.

± Elaboração do algoritmo:

Ä Leitura da dimensão do conjunto e dados de entrada.


Ä Cálculo da média e do desvio padrão
± Presença de somatório requer o uso de variáveis acumulativas
(somax, somax2).
Ä Escrever o valor da média, desvio e número de pontos.

± Transformar o algoritmo em um código FORTRAN



3
 '4

  
 


Ä Neste tipo de comando, as instruções são repetidas


um número de vezes previamente especificado.

Ä Forma geral do comando


)      ' '     8 variável inteira utilizada
0  "  como contador.
0  "    = valor inicial para   .

 = valor final para   .
0  " 
  (opcional,  = 1) =
> ) incremento no valor de   .


3
 '4

  
 


Ä   ,  e   podem ser constantes ou variáveis.


Se forem variáveis, seus valores devem ser definidos
antes do comando ).

Ä No início da excução,      e é feita a


verificação:

     1    

Caso seja atendida, as instruções a seguir são


executadas, caso contrário a instrução após >
) é executada.


3
 '4

  
 


Ä Depois que as instruções  a  são executadas, a


variável índice é recalculada:

    
 

Ä O número de iterações realizadas em um dado loop


pode ser calculado por:

    
   


3
 '4

  
!,  '(

Ä Quantas iterações serão realizadas nos comandos


abaixo?
 ) '&  ) '&'
0  "  0  " 
0  "  X 0  "  
> ) > )

 ) '&' 0 ) ''
0  "  0  " 
0  "   0  "  ‰
> )
> )

Ä Reescrever o programa estatística utilizando 


iterativo.

3
 '4

  
 
A
-
° 


Ä Não é obrigatório ³identar´ as instruções no corpo da


declaração recursiva, porém torna muito mais fácil a
leitura do código.

Ä A variável A  não deve nunca ser modificada no


corpo da declaração recursiva:

)2  
0>>
)'0
@
. ,    F

>)
>)2  

X
3
 '4

  
 
A
-
° 


Ä Pode-se sair do  iterativo utilizando uma


declaração condicional:
0>>  
)   ' %

0  # > 0

> )
0> ' 

Este programa escreveria o valor 3.

XX
3
 '4

  
 
A
-
° 


Ä Após o fim da execução do , o valor da variável


índice é indeterminado. Não tentar utilizar este valor
para cálculo de qualquer outra variável no programa!

Ä É ilegal referenciar a uma instrução dentro de um


 sem que este  não esteja sendo executado:

0>>   Ä "(   G @) 6)F


)   ' %
 Ä "(


   '4

&& 
 
,

> )

) ) &&

X
3
 '4

  
H<2
2I&6

Ä j3j> é executado dentro de um loop. Esse


comando pára a execução das instruções e retorna
ao topo do loop:

)2  4 Ä  ;  , % . 
0>>   X
)   ' %

0    j3j>
0> '  ‰
> ) 
0> ' (  '* . 
,F
> )2  4

X$
3
 '4

  
H<2
2I&6

Ä > 0 também é executado dentro de um ,


porém sua execução provoca a saída do loop:

)2    Ä  ;  , % . 
0>>   X
)   ' %

0    > 0
0> '  . 
,F
> )
0> ' (  '*
> )2  4

X‰
3
 '4

  
".
°

Ä 0> :

  )
0  " 
0  " 

0    !  j3j> 

0    !  > 0 

> ) 

X
3
 '4

  
".
°

Ä   iterativos:

  )      ' '  


0  " 
0  " 

0    !  j3j> 

> ) 

X
3
 '4

  
 % , 

Ä Pode-se criar um ou mais  dentro de outros


 gerando, assim,  agrupados:

)2  
XX8X
0>>  ' '  
X8
)   ' 
X$8$
)  ' 
     X8
0> ' ' (  (' ' (  ('   8‰
> ) $8
> ) $X8$
> )2 $8
$$8
X
3
 '4

  
 % , 

Ä O  interno é executado inteiramente antes de se


incrementar o  externo.

Ä Quando o compilador Fortran encontra o primeiro


> ), esse é associado ao ) mais interno.

Ä É recomendável que se nomeie os ) para que se


torne mais fácil a leitura do programa e, também,
seja mais fácil localizar a possível falta de um >
) (erro de programação).

XÈ
3
 '4

  
 % , 

Ä Pode-se nomear a declaração do seguinte modo:

)2  
0>>  ' '  
  )   ' 
  )  ' 
    
0> ' ' (  (' ' (  ('  
> )  
> )   Aos comandos j3j>
> )2 e > 0 devem ser
atribuídos os nomes dos
 aos quais se
X referem.
!%


Ä Introdução.
Ä Elementos básicos para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä <




  
 
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.

XX
<




 
!,

'(

Ä Para ler (importar) ou escrever (exportar) dados em


Fortran, utilizam-se os comandos:
± >
± 0>

Ä Formato dos comandos:


± 0>    '  
± >    '  

XXX
<




 
). ) !6

Ä O comando )2 permite especificar a maneira


exata segundo a qual nós queremos escrever (ou
ler) as variáveis em um programa:

0>'&& '  
&& )2( )       (' 0'* *' .

:   6
5  6
5 

 . 
ù
 J &E
J 1
XX
<




 
). ) !6

Ä O resultado deste comando seria, por exemplo:

Ä Caso fosse assumido formato livre:


0>'()      (''* *'  

Ä Tem-se, portanto, controle sobre a forma como uma


determinada variável é escrita ou, da mesma
maneira, lida.

XX$
<




 
2


  . 

Ä -  de saída:

X X$$

± 133 colunas.
± Coluna 1: parâmetro de controle: ( )2(parâmetro, ...))
Ä µ1¶ : pula para próxima página.
Ä µ µ: imprime a linha imediatamente abaixo da anterior (  ).
Ä µ0¶ : imprime a linha com espaçamento duplo em relação a anterior.
Ä µ+µ : a linha a ser impressa é superposta a anterior.
± Demais colunas:
Ä Espaço para impressão da linha especificada no comando 0>.

XX‰
<




 
2


  . 

Ä Formatos para impressão:


± Números inteiros:
Ä Regra geral: r&w.m
± r: número de vezes que o formato será repetido (default = 1).
± w: número de caracteres a serem usados na leitura ou impressão.
± m: número mínimo de dígitos a serem impressos.

Ä Exemplo:

0>>  ' 40' 0%


0>'&&  '  
' 4' 
0>'&  '  
' 4' 
0>'&  '  
' 4' 
&& )2(('0%'0,'0&
& )2(('0%&'0,'0&+
& )2(('0%'0,'0%
XX
<




 
2


  . 

Ä Formatos para impressão:


± Números inteiros:

X  X X 

Primeiro número: colunas 1 a 5 (I5)


B   K.
 

Segundo número: colunas 6 a 10 (I5)


;%   .  *

Terceiro número: colunas 11 a 16 (I6)  . 
,
 E 
Quarto número: colunas 17 a 26 (I10) 




XX
<




 
2


  . 

Ä Formatos para impressão:


± Números reais:
Ä Regra geral: rw.d
± r: número de vezes que o formato será repetido (default = 1)
± w: número de caracteres a serem usados na leitura ou impressão.
± d: número de dígitos à direita do ponto decimal.

Ä Exemplo:

>'D'0%,
0>'&&'D'
0>'&'D'
&& )2((' ,' +
& )2((' &

XX
<




 
2


  . 

Ä Formatos para impressão:


± Números reais:
Ä 2F6.3
± 2 números reais escritos em 6 colunas e com 3 casas
decimais.
Ä F8.3
± 1 número real escrito em 8 colunas e com 3 casas decimais.
Ä 3F10.2
± 3 números reais escritos em 10 colunas e com 2 casas
decimais.

XXÈ
<




 
2


  . 

Ä Formatos para impressão:


± Números reais:
B   K.
 

;%   .  *

 . 
,
 E 





X  X X   $

XX
<




 
2


  . 

Ä Formatos para impressão:


± Números reais (notação exponencial):
Ä Regra geral: r2w.d
± r: número de vezes que o formato será repetido (default = 1)
± w: número de caracteres a serem usados na leitura ou impressão.
± d: número de dígitos à direita do ponto decimal.
± w >= d + 7

Ä Exemplo:

>0>,'D&&&'...>&' ...>&
0>'&&'D''
&& )2(('>00'>,'>,

X
<




 
2


  . 

Ä Formatos para impressão:


± Números reais (notação exponencial):

 X X   $ $ ‰ ‰ 

A presença do 0 à
esquerda do ponto ) K .  .  ù2XX1 (


decimal depende do
'( >=8ë |
 G(E 
compilador Fortran 



utilizado.
XX
<




 
2


  . 

Ä Formatos para impressão:


± Números reais (notação científica):
Ä Notação exponencial x Notação científica:
± 12342ë x X23402ë‰

Ä Regra geral: r2w.d


± r: número de vezes que o formato será repetido (default = 1)
± w: número de caracteres a serem usados na leitura ou impressão.
± d: número de dígitos à direita do ponto decimal.
± w >= d + 7

Ä Exemplo:

>0,>,'D&&&'...>&
0>'&&'D''
&& )2(('>
00'>,
X
<




 
2


  . 

Ä Formatos para impressão:


± Números reais (notação científica):

 X X   $ $ ‰

Quando for escrever


números muito grandes, ) K .  .  ù2XX1 (


dê preferência à notação
'( >=8ë |
 G(E 
científica. 




X$
<




 
2


  . 

Ä Formatos para impressão:


± Notação lógica
Ä T ± TRUE ; F - FALSE

Ä Regra geral: r<w


± r: número de vezes que o formato será repetido (default = 1)
± w: número de caracteres a serem usados na leitura ou impressão.

Ä Exemplo:

)0j   =>' D 


>
0>'&&   ' D
&& )2(('%

X‰
 X
<




 
2


  . 

Ä Formatos para impressão:


± Caracteres
Ä Regra geral: r!ou r!w
± r: número de vezes que o formato será repetido (default = 1).
± w: número de caracteres a serem usados na leitura ou impressão.
± r! imprime utilizando um número de campos igual ao número de
caracteres presentes na variável. r!w fixa o número de campos a ser
utilizado

Ä Exemplo:

jj> .  (0   *


0>'&  
0>'  
0>'  
& )2(('
 )2(('&
 )2((',
X
<




 
2


  . 

Ä Formatos para impressão:


± Caracteres
Imprime exatamente o
número de campos na
variável (A).

Fixa o número de campos


em 20 (A20).

O número de campos é
insuficiente para escrever
toda a frase (A6)

X
<




 
2


  . 

Ä Formatos para impressão:


± Espaçamentos
Ä Regra geral: rIou 6c
± I 

. ., GJ §§
± 6
  .,
(, .   
± r: número de vezes que o formato será repetido (default = 1).
± c: coluna na qual o texto será iniciado.

Ä Exemplo:

jj> &  (  (


jj> %   ( j  -  '*
0>> $.0' $+$' $$.'
 0&&&
0>'&  '   ' ' ' ' 0
& )2 '&'% ''%&'00' '00' '00' '00
X
<




 
2


  . 

Ä Formatos para impressão:


± Espaçamentos

 X X     

O comando  permite
avançar ou mesmo
regredir na linha que se
está escrevendo.

XÈ
<




 
2


  . 

Ä Formatos para impressão:


± Agrupamento de formatos
Ä Exemplo anterior:

& )2 '&'% ''%&'00' 0


 0
 0


& )2 '&'% ''%&'00'  0




Ä Minimiza-se, assim, o comando )2. Tome cuidado,


entretanto, para não abusar! O comando )2 pode-se tornar
tão complexo que nem você mesmo entenderá!

X
<




 
2


  . 

Ä Formatos para impressão:


± Pulando para outra linha
Ä Dentro de um )2, caso se deseje pular para uma outra
linha, utiliza-se a Cada significa uma linha que se pulará:

0>>  &
>  &%' 0'%' +.$,%
0>'&&  '  ' ''
&& )2&'(         *'0' '
 '(  (' .& '
 '(    (' .'(  *' '
 '(   (' + '
 '(  (' .

X$
<




 
2


  . 

Ä Formatos para impressão:


± Pulando para outra linha

X$X
<




 
!,  '(X

Ä Criar uma tabela com a raiz quadrada, quadrados,


cubos e logaritmos decimal e neperianos dos números
inteiros de 1 a 10.

Ä Funções:
± Raiz quadrada :
5
± Quadrado : 
± Cubo : 
± Logaritmo natural : )& (atenção com o logaritmo!)
± Logaritmo neperiano : ) (atenção com o logaritmo!)

X$
<




 
3 -
. D &62

Ä Verifique sempre se para cada variável ou texto


presente no comando 0> há uma
correspondência no )2. Esse tipo de erro não
é percebido pelo compilador. O erro aparecerá
somente na execução do programa.

Ä O comando )2 é sempre lido da esquerda


para a direita.

Ä Se um formato de impressão é repetido (ex. 2I5,


3F10.3), o programa só passa para o próximo após
essas repetições serem executadas.

X$$
<




 
3 -
. D &62

Ä Verifique sempre se para cada variável presente no


comando 0> há uma correspondência no
)2 e se os tipos a elas associados estão
corretos. Esses erros não são percebidos pelo
compilador. Aparecerão somente na execução.

Ä O comando )2 é sempre lido da esquerda


para a direita.

Ä Se um formato de impressão é repetido (ex. 2I5,


3F10.3) ou um bloco é repetido (ex. 2(I3,1X,I5) ou
3(A2,3X,F10.3)), o programa só passa para o
próximo tipo após essas repetições serem
executadas.
X$‰
<




 
3 -
. D &62

Ä Se há um número menor de variáveis no comando


0> em relação ao que é associado no comando
)2, o programa interrompe a execução do
)2 no primeiro tipo sem associação no
comando 0> ou no fim do )2, o que
acontecer primeiro.

0>>    
0> ' 0& 
0& )2  ' (2  (' 0' (  (' 00' ()  (' .

X$
<




 
3 -
. D &62

Ä Se há um número maior de variáveis no comando


0> em relação ao que é associado no comando
)2, o comando )2 é reiniciado a partir
do parêntese aberto que não precede uma instrução
de repetição. Para clarear...

0>>   '   '  '   0'  %


0> ',& ' ' ' '
,& )2  ' (   (' 0

X$
<




 
3 -
. D &62

0>>   '   '  '   0'  %


0> ',& ' ' ' '
,& )2  ' (   (' '  ' (   *'  '0%

Primeira abertura de
parêntese após o final do
comando que não está
associado a uma repetição.

X$
<




 
<
  . 

Ä Da mesma forma que se escrevem resultados com


formatação, pode-se ler resultados formatados, isto
é, definidos precisamente dentro de uma linha,
através do comando >:
> '&&
&& )2 , ' 0, ! Lê uma variável inteira com 6
! dígitos a partir da 6ª coluna
Ä Valem os mesmos formatos apresentados para o
comando WRITE:
± Inteiros: r&w
± Real: rw.d
± Lógico: r<w
± Caracter: r! ou r!w
± Posicionamento: I ou 6
X$È ± Pula linha: 
!%


Ä Introdução.
Ä Bases para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä ),
'4
 . *
*
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.

X$
),
'4
. *
!,

'(

Ä Até aqui, a quantidade de informação passada aos


programas elaborados foi muito pequena. Como
seria possível, por exemplo, passar 1000 ou 10000
dados de entrada para um programa Fortran?

Ä Além disso, as próprias saídas de dados se


limitaram a pequenas quantidades de informação. E
se tivéssemos uma grande quantidade de
informações de saída ou mesmo quiséssemos
armazenar a saída de dados de um programa?

Ä A resposta para ambas as questões pode ser a


criação de arquivos de entrada ou saída,
respectivamente.
X‰
),
'4
. *
   *

Ä Para se abrir um arquivo texto em Fortran utiliza-se


o comando )>:
± )> =0    ' 0>  (  *'
=
 ( *' 
j0)  ( *' 0)
    
Ä =0
± Número inteiro associado ao arquivo. É o número que será
utilizado para se referenciar a ele nos comandos > e
0>.
Ä 0>
± Nome do arquivo que se deseja abrir.
Ä
=

± Status do arquivo que será aberto: ), >, >j>,



jj ou = ).
Ä j0)
± Estabelece a ação que será executada: >, 0> e
>0>
Ä 0)

X‰X
± É igual a 0 se o arquivo for aberto com sucesso e igual a um
número positivo se falhar.
),
'4
. *
   *

Ä Abrindo arquivo para entrada de dados:

0>>    ' '


)> =0  +' 0>  (     *'
=
 ()*' 
j0)  (>*' 0)
    
)   ' &
>+'
> )

±
=
:
Ä ): diz que o arquivo especificado em 0> já existe. Se não
existe a variável    retornará com um número negativo. Se
existe,    retornará zero.

± j0):
Ä >: especifica que o arquivo será apenas lido, ou seja, não
é possível escrever nenhum dado adicional.
X‰
),
'4
. *
   *

Ä Abrindo arquivo para escrever dados:


0>>    '   ' 
jj>  $   
   %
   (   *

)> =0    ' 0>    '


=
 (>*' 
j0)  (0>*' 0)
    
! Outra possibilidade:

)> =0    ' 0>    '


=
 
(>j>*' j0)  (0>*' 0)
    
) ' &&&
0> %' 
X‰$ > )
),
'4
. *
   *

±
=

Ä >: diz que o arquivo especificado em FILE é novo. Se já


existe a variável ierror retornará positiva. Se não existe a
variável ierror retornará nula.

Ä >j>: diz que o arquivo especificado em FILE será


criado tanto se ele já existe ou não. Se não existir, será criado
diretamente. Se já existir, o arquivo antigo será reescrito. Essa
é a opção correta caso queiramos sempre reescrever o
arquivo de saída.

± j0)
Ä 0>: diz que o arquivo especificado em FILE é apenas
para ser escrito. Qualquer tentativa de leitura de dados desse
arquivo durante a execução do programa causará um erro.

Ä >0>: o arquivo serve tanto para escrever quanto


para leitura.
X‰‰
),
'4
. *
   *

Ä Criando um arquivo temporário:


± Um arquivo temporário é aquele em que se escrevem
dados durante a execução de um programa e, após sua
execução, é automaticamente apagado:

)>  =0  '


=
 (
jj*' 0)
  
  

X‰
),
'4
. *

A  *

Ä Deve-se fechar (prática da boa programação) os


arquivos abertos durante a execução do programa.
Para tanto, utiliza-se o comando j)
>:

j)
> =0    

Ä O comando acima é suficiente para fechar o arquivo.


Pode-se, se for desejado, acrescentar as demais
opções vistas em )>.

Ä Se o arquivo não for fechado pelo programador, o


próprio programa fechará após o término de sua
execução.
X‰
),
'4
. *
&)6!6..  2!3

Ä Na leitura de dados de um arquivo é interessante


acrescentar a variável 0)
:

> ' ' 0)


  

Ä Se a leitura for feita com sucesso, status retornará


igual a 0. Se não, retornará um valor positivo:

Ä Razões para falha:


± Formato inadequado do dado.
± Tentativa de leitura após a última linha do arquivo
(provavelmente, faltam dados no arquivo de entrada)
± Etc.

X‰
),
'4
. *
| .

.. *

Ä Comandos para mudarmos a ordem sequencial de


leitura do programa Fortran:

± -j
j> =0    
Ä Retorna à linha lida previamente.
Ä   é a unidade do arquivo declarada no comando OPEN.
DEVE SER INTEIRO!

± >0 =0    
Ä Retorna ao início do arquivo.
Ä   é a unidade do arquivo declarada no comando OPEN.
DEVE SER INTEIRO!

X‰È
),
'4
. *
!,  '(X

Ä Criar um programa que leia pares de pontos (x,y) e


ajuste uma reta a eles (regressão linear):

± Reta:

ö    D
± Coeficientes: .    
 


Lð   ö  Lð   ö
ö 
Lð   Lð   

D

X‰
.   - 
),
'4
. *
!,  '(X

Ä Etapas do programa:

± Definição do problema: elaborar um programa que ajuste


uma reta a uma nuvem de pontos dada.

± Entrada e saída de dados: entrada de dados a partir de um


arquivo no qual se informam as coordenadas x e y dos
pontos. Como resultado final, o programa exporta a
inclinação da reta e o ponto de interseção com o eixo das
ordenadas.

X
),
'4
. *
!,  '(X

Ä Etapas do programa:
± Algoritmo:
1. Inicializar variáveis n, soma_x, soma_x2, soma_y, soma_xy (iguais a 0).
2. Prompt para informar o nome do arquivo de dados.
3. Abrir arquivo ³filename´
4. Verificar possíveis problemas em 3 (iostat).
5. DO
± READ x, y do arquivo filename
± n=n+1
± soma_x = soma_x + x
± soma_y = soma_y + y
± soma_x2 = soma_x2 + x**2
± soma _xy = soma_xy + x*y
END DO
6. Calcula a inclinação e a interseção.
7. Imprime resultado.
XX
),
'4
. *
!,  '(X

Ä Etapas do programa:

± Transformar o algoritmo proposto em instruções Fortran.

X
!%


Ä Introdução.
Ä Elementos básicos para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä /


. G

G

Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä Aplicações.

X$
/


. G

!,

'(

Ä Vetores e matrizes são representados (e tratados)


como variáveis comuns dentro do Fortran.

Ä Cada elemento do vetor ou matriz é referenciado


pelo nome dado ao vetor ou matriz e sua posição
entre parênteses. Exemplo:
± a(5) é o quinto elemento do vetor a.
± n(2,3) é o elemento localizado na 2ª linha e na 3ª. Coluna
da matriz n.

Ä Todos os elementos de uma matriz ou vetor devem


ser do mesmo tipo!
X‰
/


. G

/


 '(

Ä Vetores (e também matrizes) são declarados através


do comando 02>
0), por exemplo:

>' 02>
0),    

jj> &' 02>


0)&   

)0j' 02>
0)&&   ! 21 elementos de 0 a 20.

0>>' 02>
0)     ! 7 elementos de -3 a 3.

X
/


. G

/


 '(

Ä São inicializados diretamente no corpo de


declaração de variáveis:
0>>' 02>
0)0  4   '''0 
0>>' 02>
0)0  4   ' '0 

Ä Ou ao longo do programa: 1
>' 02>
0)&  4 2
)   ' & 4 = 4 =
4  && 3
> ) 4

Ä Se todos os elementos têm o mesmo valor:


0>>' 02>
0)0     0
X
/


. G

/


 '(

Ä Para facilitar a mudança das dimensões de um vetor


(e também de uma matriz), pode-se definir uma
variável (ou variáveis) para a dimensão através do
comando 2>>:

0>>' 2>>    &&&


>  4  
>  4  

± Se desejarmos modificar as dimensões de 4 e 4,


basta alterar  !

X
/


. G

/



Ä Cada elemento do vetor pode ser tratado como uma


variável análoga às que vêm sendo utilizadas ao
longo deste curso, por exemplo:

0>>' 02>
0)&   
>' 02>
0)  

   
  >  0
0> ' (    ('  

XÈ
/


. G

/



Ä As operações entre vetores podem ser feitas elemento


a elemento utilizando, por exemplo, o comando ):
0>>' 02>
0)0  
0>>' 02>
0)0  D
0>>' 02>
0)0   ! a, b e c têm a mesma dimensão
...
)   ' 0
  

D    
  
D
> )

X
/


. G

/








Ä Suponha os seguintes comandos:


0> '&& ' ' ' 0' %
&& )2  ' (  (' % &

Ä Esses comandos podem ser simplificados através de


loops implícitos:

0> '&&  '   ' % ! Escreve os 5 em uma linha


&& )2  ' (  (' % &

O mesmo tipo de  pode ser aplicado, também com o


comando >.

X
/


. G

/








Ä Loops implícitos agrupados também são possíveis:

0> '&& ' '  ' '   ' 


&& )2  ' 0%'  ' 0%

± Esses comandos geram as linhas (fixa o valor de  e varia ):

2*


1 1
)   ' 
1 2
)  ' 
1 3
2 1 0> '&&
2 2 > )
2 3 > )
XX && )2  ' 0%'  ' 0%
/


. G

 G

 '(

Ä Matrizes são definidas por linhas e colunas, ou seja,


possuem duas dimensões e podem ser declaradas,
por exemplo, da seguinte forma:
± >' 02>
0) ',   
Ä Matriz com elementos reais, formada por 3 linhas e 6 colunas.
As linhas são numeradas de 1 a 3 e as colunas de 1 a 6.
Quaisquer outros valores não são aceitos pelo compilador.

± 0>>' 02>
0) &&&'&&  
Ä Matriz com elementos inteiros, formada por 101 linhas e 21
colunas. As linhas variam de 0 a 100 e as colunas de 0 a 20.

± jj>  ,' 02>


0) '&   
Ä Matriz com elementos formados por caracteres com dimensão
6. A matriz possui 6 linhas e 10 colunas. O índice das linhas
varia de -3 a 3 e as colunas de 1 a 10.
X
/


. G

 G
 . G
.
 .
.: 

a(1,1)
a(2,1)
!  '( .
.:   a(3,1)

 
.,
 ,    a(4,1)
(1,1) (1,2) (1,3)
   . G
a(1,2)
ù
.
A
 
. a(2,2)
(2,1) (2,2) (2,3)

 X5X1
a(3,2)
8
(3,1) (3,2) (3,3) a(4,2)
a(1,3)
(4,1) (4,2) (4,3) a(2,3)
a(3,3)
 G a(4,3)
X$
/


. G

 G
  G '(

Ä As matrizes podem ser inicializadas durante a


execução do programa, por exemplo:

0>>' 02>
0) 0'   
0>>  '
)   ' 0
)  ' 
  '  
> )
> )

X‰
/


. G

 G
  G '(

Ä Ou ainda, através de uma única linha de comando


utilizando o comando RESHAPE e observando como
os elementos são armazenados na memória:

± Durante a execução do código:

   >
>   ' ' ' ' ' ' ' ' ' ' '  '  0'  

± Na declaração de variáveis:

0>>' 02>
0) 0'    0'  
>
>   ' ' ' ' ' ' ' ' ' ' '  '  0'  

X
/


. G

 G
  G '(

Ä Ou, por fim, através de um arquivo de dados utilizando


o comando READ. Suponha, por exemplo, um arquivo
chamado ³inicial.dat´, composto por apenas uma linha:

123123123123

Ä O código que geraria uma matriz semelhante a


anterior seria:

0>>  '
0>>' 02>
0) 0'   
)>.' 0>(    *'
=
()*' j0)(>*
>.'   ' '  ' '   ' 0
X
/


. G

 G
  A E  
-. G


Ä 6.  .   
1
 G
4
1 2 3 ùEX1 8
7
4 5 6 10
8
7 8 9
Ä 6.  . -. G
10 11 12

1 2

ùX$EX1 8 4 5

7 8
X
/


. G

 '4
, ;
 

Ä Funções intrínsecas elementares:


± Pode-se utilizar funções como
0, j)
, , )&,
2),
5 etc. com elementos de vetores e matrizes, por
exemplo:

>' 02>
0)0     &' 0%$' '  
>' 02>
0)0  4
0>>  

4 
0 '    !  

)   ' 0
4      ' >    
> )

XÈ
/


. G

 '4
, ;
 

Ä Funções intrínsecas inquisidoras:


± Funções pelas quais pode-se obter as propriedades de um
dado vetor ou matriz (4):
Ä -)= 4
± Retorna os limites inferiores de 4 (índice da linha e da
coluna)
Ä
> 4
± Retorna a forma de 4.
Ä
0> 4
± Retorna o número de elementos de 4.
Ä =-)= 4
± Retorna os limites superiores de 4 (índice da linha e
da coluna).

X
/


. G

 '4
, ;
 

Ä Funções intrínsecas de transformação:


± Funções cuja entrada de dados é um ou mais vetores ou
matrizes e a resposta é um escalar, vetor ou matriz:
Ä ))=j  '  -
± Retorna um escalar igual ao produto interno do  
pelo  -.
Ä 22=  '  -
± Retorna uma matriz igual ao produto da   pela
 -.
Ä 
)
>  
± Retorna uma matriz igual à transposta de  .

X
/


. G

). D#2 2

Ä Suponha que desejamos aplicar a função ) a todos


os elementos de uma matriz  e que se queira
armazenar o resultado na matriz  :

 )  ! Aplica a todos os elementos de uma só vez

OU

)'  ! ndim1 e ndim2 são as dimensões da matriz


) ' 
 ' ) '  ! Aplica elemento por elemento
>)
>)

XX
/


. G

). D#2 2

Ä Da forma como foi programado anteriormente, caso


haja algum número negativo ou nulo, haverá um erro
durante a execução. Deste modo, modifica-se o código
para:
)'  ! ndim1 e ndim2 são as dimensões da matriz
) ' 
0  ' #&>
 ' ) ' 
>
>
 ' $$$$$$ ! Número grande caso <= 0.
>0
>)
>)

X
/


. G

). D#2 2

Ä O código anterior, contudo, pode ser representado de


modo mais elegante e simples através do comando
WHERE (apenas no Fortran 90/95):

>>  # & &"6!I2 3) )!"3)


  )    >>    !
>
>>> 0  " 
  $$$$$$ 0  " 
> >> 
>
>>> 
0  " 
0  " 

> >> 
X$
/


. G

!  '( L. 
.
.: 

Ä Até aqui, o tamanho de cada matriz ou vetor foi


previamente definido no bloco de declaração de
variáveis no início de cada programa elaborado.
Assim, suas dimensões não se alteram durante a
execução de um programa (  '(
   

.
.:  ):
± >' 02>
0) 0'  

Ä Muitas vezes, entretanto, não sabemos a priori quais


dimensões atribuir a um vetor ou matriz (depende de
dados fornecidos pelo usuário, por exemplo). Nessa
situação pode-se recorrer à  '(  L. 

.
.:  .

X‰
/


. G

!  '( L. 
.
.: 

Ä Para tanto, utilizamos os comandos:


± )j->: declara um dado vetor ou matriz como de
dimensão variável:

>' )j->' 02>


0)  '    '   

± )j>: especifica, durante a execução do programa,


as dimensões de uma dada matriz ou vetor:

)j>          '


    ' ex.:

)j>  &&'&&&'


    

   retorna 0 se a alocação for feita com êxito e um número


positivo caso contrário.

X
/


. G

!  '( L. 
.
.: 

± )j>: verifica a condição (alocada ou não) de uma


dada matriz ou vetor durante a execução do programa:
)j>     

Retorna .TRUE. Se a matriz ou vetor estiver alocada e


.FALSE. caso contrário.

O programa não utiliza uma matriz ou vetor com alocação


dinâmica antes do comando )j> ser executado com
sucesso!

± >)j>: desaloca as matrizes ou vetores alocados.


>)j> (         ,
 =   )

Uma vez desalocados, as matrizes ou vetores não estarão


mais disponíveis para uso!
X
/


. G

!,  '(

Ä Para ilustrar a aplicação da alocação dinâmica de


memória, retornou-se ao programa    

± Vide projeto:      

X
!%


Ä Introdução.
Ä Elementos básicos para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä -   
 '4

 '4

Ä Dupla precisão, complexos e tipos derivados.
Ä Propostas para programas.

XÈ
-   
 '4

3
 '4


Ä Até agora, todos os programas apresentados


consistiram em longas sequências de comandos
agrupadas em um único arquivo (programa
principal).

Ä Para facilitar a programação, o Fortran permite


agrupar blocos ou instruções apresentadas no
programa principal em outros arquivos que podem
ser chamados durante sua execução.

Ä Esses arquivos, que são procedimentos externos ao


programa principal, podem ser de dois tipos:
± Funções.
± Subrotinas.
X
-   
 '4

3
 '4


Ä Subrotinas são subprogramas que podem retornar


resultados múltiplos. As funções, por sua vez, só
podem retornar um único resultado.

Ä O uso de subrotinas e funções trazem os seguintes


benefícios:
± Possibilidade de testar individualmente os procedimentos.
± São reutilizáveis.
± Melhor controle sobre as variáveis.

± Enfim, reduz de maneira significativa o esforço de


programação em grandes códigos!

XÈ
-   
 '4

-   
 '(

Ä Uma subrotina Fortran é uma unidade independente


de um programa que tem a seguinte forma:


=-)=0>  D        


"  "


"  "
>= ! Opcional.
>
=-)=0>  D   ! Nome é opcional.

Ä São chamadas a partir do programa principal através


do comando CALL:
XÈX
j  D        
-   
 '4

-   
 '(

Ä Nomes devem possuir até 31 caracteres, sendo que o


primeiro não deve ser numérico.

Ä A lista de argumentos deve conter as variáveis e/ou


4 que são passados do programa principal para a
subrotina.

Ä Cada subrotina é uma unidade independente de um


programa. Assim, são compiladas separadamente e as
variáveis e constantes a serem utilizadas deverão ser
declaradas na  "  " .

XÈ
-   
 '4

-   
 '(

Ä Por serem unidades independentes, rótulos e variáveis


utilizadas em uma subrotina podem ser novamente
declaradas e utilizadas em outra subrotina.

Ä IMPORTANTÍSSIMO: A ordem e o número de


argumentos utilizados na chamada da subrotina no
programa principal (comando CALL) deve ser mantida
na definição da subrotina (SUBROUTINE (...)).

>   '  ' 


j     '  '  


=-)=0>    ' ' 
XÈ$
>  ' ' 
-   
 '4

-   
 '(

Ä As subrotinas não alocam espaço na memória para as


variáveis passadas ou que serão retornadas por elas.

Ä Na realidade, quando um programa chama uma


subrotina, o que é passado para a subrotina são
ponteiros para posições de memória que contêm os
argumentos (variáveis) dessa chamada:
)2 
=-)=0> D ' 4' 
>  ' D0 >' 0> )=  
0>>    >' 0> 0' 02>
0)0  4
 0>>  
j D ' D'   
 >
=-)=0> D
> )2
Xȉ
-   
 '4

-   
 '(

|'(
 | % .  -  
.
.:  ,  ,
001 a x

002 b(1) y(1)

003 b(2) y(2)

004 b(3) y(3)

005 b(4) y(4)

006 prox i

XÈ
-   
 '4

-    ,  '(X

Ä Subrotina para cálculo da hipotenusa de um triângulo


retângulo:

=-)=0>      '  '  
020j0 )>
>' 0>0   '   '   6 
>' 0>)=   '  
>  

   
 
 
5  

>=
>
=-)=0>   
XÈ
-   
 '4

-    - &"62"6

Ä O atributo INTENT informa ao compilador como o


programador pretende que a variável seja utilizada na
subrotina:

± INTENT (IN) : a variável será utilizada apenas para passar


valores do programa principal para a subrotina (seu valor não
é modificado na subrotina).

± INTENT (OUT) : a variável será utilizada apenas para passar


valores da subrotina para o programa principal (retornará
valores calculados na subrotina).

± INTENT (INOUT): a variável tanto passa valores do programa


principal para a subrotina quanto retorna valores dessa para o
Xȝ
programa principal (  ).
-   
 '4

-    - &"62"6

Ä Para evitar erros de programação, deve-se sempre


utilizar o atributo INTENT:


=-)=0>     '   
>' 0> 0   
>' 0> )=   

   &   
0    ' >    /  

>=
>
=-)=0>  

XÈÈ
-   
 '4

-      '(  ,  '(X

Ä Programa que utiliza a subrotina   

)2   


020j0 )>
>  ' ' 4

0> ' (>        *


> ' ' 

j    ' ' 4 

0> '&& (      *' 4


&& )2 ' &0

XÈ > )2   


-   
 '4

-   ,  


. G


Ä Há três maneiras de passar vetores e matrizes a uma


subrotina:
± Vetores ou matrizes com forma explícita (    ):


=-)=0>      '  ' '  
0>>' 0> 0  '  
>' 0> 0' 02>
0)    
>' 0>)=' 02>
0)    

)   '   Outra possibilidade:


      
data2(1:nvals) = 2. * data1(1:nvals)
> )

>=
X
>
=-)=0>   
-   
 '4

-   ,  


. G


Ä Há três maneiras de passar vetores e matrizes a uma


subrotina:
± Vetores ou matrizes com dimensões assumidas ( 
 ):

=-)=0>      '  '  
0>>' 0> 0   
>' 0> 0' 02>
0)   
>' 0>)=' 02>
0)   

)   '  
      
> )

>=
XX
>
=-)=0>   
-   
 '4

-   ,  


. G


Ä Há três maneiras de passar vetores e matrizes a uma


subrotina:
± Vetores ou matrizes com forma assumida (  ):
Ä Será visto mais adiante...

X
-   
 '4

-   ,   



Ä Para passar caracteres para uma subrotina, não há


necessidade de se definir a dimensão da variável:


=-)=0>      
jj> ' 0> 0    
...

Ä Na chamada da subrotina, o tamanho de    será o


mesmo definido no programa principal. Dentro da
subrotina, essa dimensão pode ser obtida através da
função LEN ().

X$
-   
 '4

-    ,  '(

Ä Definição do problema:
± Para um conjunto de pontos, elaborar subrotina que calcule o
valor máximo e o número da amostra relacionada a esse valor
máximo. Construir, também, programa para teste da subrotina:

Ä Entrada e saída de dados:


± Subrotina: Vetor de dados (dimensão n) com os valores
(números reais). Variável real com o valor máximo e variável
inteira com o número sequencial da amostra).

± Programa principal: Leitura do vetor de dados (dimensão n).

X‰
-   
 '4

-    ,  '(

Ä Algoritmo:
± Subrotina
! Inicializar ³real_max´ com o valor da posição 1 no vetor
! Inicializar ³imax´ como sendo a primeira posição
real_max = a(1)
imax = 1

! Localizar o valor máximo:


do i=2,n
if a(i) >= real_max then
real_max = a(i)
imax = i
end if
end do
X
-   
 '4

-    ,  '(

Ä Algoritmo:
± Programa principal
! Leitura do arquivo com o vetor de dados
! Chamada da subrotina
! Imprime valor final

Ä Transformar os algoritmos em comandos Fortran.

X
-   
 '4

-    - !/2

Ä Os valores de todas as variáveis, vetores e matrizes


declaradas apenas dentro da subrotina (locais) se
tornam indeterminados assim que termina a execução
dessa.

Ä Se se deseja que os valores dessas variáveis não se


percam entre as chamadas de uma dada subrotina,
deve-se utilizar o atributo SAVE. Há três maneiras:

>'
>   '   7    

>  ' ' '  '    7     
' ' '    
'  "  / 

> '     " '   
'  / 
X
-   
 '4

-    ,  '($

Ä Calcular a média e o desvio padrão atualizados de


uma dada sequência de dados:

± O objetivo é, para cada dado informado a uma subrotina, essa


calcule a média e o desvio padrão considerando os valores
anteriores.

± Utiliza, basicamente, as instruções já apresentadas no


programa estatística.

± Verificar o código no projeto      .

XÈ
-   
 '4

: 

Ä Suponhamos que haja um grupo de variáveis em um


dado programa que será compartilhado por várias
subrotinas deste programa. Esse compartilhamento
pode ser feito diretamente com a criação de módulos.

Ä Em Fortran, um módulo é uma unidade separada do


programa principal, compilável, que contém a definição
e/ou valores iniciais de todas as variáveis que
desejamos compartilhar entre várias subrotinas.

Ä Cada subrotina (ou mesmo o programa principal), caso


compartilhem um mesmo módulo, terão acesso às
X mesmas variáveis e valores nelas armazenados.
-   
 '4

: 

Ä Criando um módulo:

2)=> 
' )D  
' >    "  ! 
'
020j0 )>

>

0>>' 2>>     %


>' 02>
0)       

> 2)=> 

-   
 '4

: 

Ä Para utilizar o módulo criado, basta, na primeira linha


não comentada (depois de PROGRAM ou
SUBROUTINE) do programa principal ou subrotina
utilizar o comando USE:

=
>  ! 

X
-   
 '4

: 

Ä Programa utilizando o módulo Ä Subrotina utilizando o


 : módulo teste:

)2  
=-)=0>D
=
>  =
> 
020j0 )>
>' 2>>    0 0>'  

       '''0'%  >
=-)=0>D

j D

> )2  


-   
 '4

: 

Ä Os módulos, além de variáveis, podem armazenar a


definição de subrotinas:

2)=>4D
020j0)>
)"6!&"  
j)0
*

(

=-)=0>D'D'''   
  
020j0)> -   
>'0>0D'
>'02>
0)'0>0 3
 '(
>'0>)=  -  
)0j'0>)=  

>
=-)=0>D
$ >2)=>4D
-   
 '4

: 

Ä O emprego desse tipo de módulo é análogo ao


módulo de variáveis:

)2   


=
> 4D
020j0 )>

j D ' D' ' '  

> )2   

‰
-   
 '4

: 

Ä Por que declarar subrotinas dentro de módulos se


elas podem ser criadas individualmente e
compiladas também individualmente?

Ä Ao se declarar uma subrotina através de um


módulo, fica disponível para o compilador todas as
informações das variáveis por ela utilizadas (tipos,
número, dimensões etc).

Ä Assim, quando a unidade que a chama é compilada,


o compilador checa se, nessa unidade, há
correspondência entre tipos, número e dimensões
em relação ao que é utilizado na subrotina (isto não
é feito caso não se declare dentro do módulo).

-   
 '4

: 

Ä Vetores ou matrizes com forma assumida:

± Quando uma subrotina é declarada utilizando-se módulos,


todos os detalhes das variáveis por ela utilizada são
conhecidos pela unidade que a chama. Os parâmetros
passados pelo programa que a chama também são
conhecidos pela subrotina.

± Assim, a subrotina conhece previamente as dimensões dos


vetores ou matrizes que serão manipulados por ela. Desta
forma, não seria necessário definir de forma explícita as
dimensões desses 4.

± Esta forma de declaração de vetores ou matrizes é


chamada de forma assumida (  4).


-   
 '4

: 

Ä Vetores ou matrizes com forma assumida:

± Definição:

>' 02>
0) '  4' 4' 

± Exemplo de aplicação: vide projeto assumed_shape.


-   
 '4

 '4

 '(

Ä Uma função Fortran é um procedimento cujo resultado


é um número, valor lógico, caractere, matriz ou vetor:

Ä Existem dois tipos: intrínsecas (SIN(x), COS(x), etc.)


ou definidas pelo usuário (valem as mesmas
recomendações feitas para as subrotinas):
=j0)       


"  " >> 0j=0 ) 0) >  


"  "
   
>= ! Opcional.
È
> =j0)  !  é opcional.
-   
 '4

 '4

 '(

Ä Exemplo: função para calcular o valor do polinômio



D
 para um dado valor :

> =j0) 'D''


020j0)>

>'0>0'D''
'
           
'>'0>)= 

 
D


> =j0) 


-   
 '4

 '4

 '(

Ä Exemplo: programa utilizando a função  :


)2   
020j0)>
>  '
>2>  /   
'     "
>'D''

0>'(>      'D *


>''D'
0>'(>     *
>'
0>'&&( (''*(' 'D''
&& )2' &0'' 0

X >)2   


-   
 '4

|  , 
.
. %.


Ä É possível passar procedimentos (funções e


subrotinas) como argumentos de outras funções e
subrotinas.

Ä Para tanto, deve-se utilizar o atributo EXTERNAL na


seção de declaração de variáveis.

XX
-   
 '4

|  , 
.
. %.


Ä Exemplo:
)2 
>' > >   '   '   "8 
'     
>  ' 4'  

j    ' ' 4'   
j    ' ' 4'   

> )2 

X
-   
 '4

|  , 
.
. %.


Ä Exemplo:

=-)=0>     ' ' D'   
020j0 )>
>' > >   '      "
>' 0> 0  ' D
>' 0> )=   

   D   

>
=-)=0>  

X$
!%


Ä Introdução.
Ä Elementos básicos para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Funções e subrotinas.
Ä 3, ,
(E .,
5
, 
 
 
Ä Propostas para programas.

X‰
3, ,
(E.,
5
 ,
 
3, ,
(

Ä Ao longo desse curso, variáveis reais foram


definidas utilizando precisão simples, que,
usualmente, é alocada em 4 bytes (32 bits).

Ä Isto permite representar adequadamente:


± Números reais com até 7 algarismos significativos.
± Números reais tão grandes quanto 1038 ou tão pequenos
quanto 10-38.

Ä Em situações nas quais precisamos lidar com


números com mais algarismos significativos ou
maiores / menores do que os apresentados, pode-se
utilizar números reais com dupla precisão.
X
3, ,
(E.,
5
 ,
 
3, ,
(

Ä Números com dupla precisão ocupam 8 bytes (64


bits) e podem representar:
± Números reais com até 16 algarismos significativos.
± Números reais tão grandes quanto 10308 ou tão pequenos
quanto 10-308.

Ä Variáveis com dupla precisão podem ser declaradas


através de:

)=-> >j0
0)  

Sugere-se representá-las, ao longo do programa, através


de 1.0E0 ou -1.5E-05 etc.

X
3, ,
(E.,
5
 ,
 
3, ,
(

Ä Aritmética mista:
± Quando o Fortran realiza uma operação entre um número
com dupla precisão e outro com precisão simples ou inteiro,
esses últimos são, inicialmente, convertidos para dupla
precisão e o resultado também é em dupla precisão.

± CUIDADO (números em azul em dupla precisão):

Ä 1.0E0 / 3. + 1 / 3 = 3.333333333333333D-01
Ä 1. / 3. + 1.0E0 / 3 = 6.666666333333333D-01
Ä 1.0E0 / 3. + 1. / 3.0E0 = 6.666666666666666D-01

± No uso de variáveis com dupla precisão, garanta que todos


os resultados intermediários sejam também realizados em
dupla precisão e sejam armazenados em variáveis com
dupla precisão!
X
3, ,
(E.,
5
 ,
 
3, ,
(

Ä Funções intrínsecas com dupla precisão:


± Em geral, as funções matemáticas disponíveis em precisão
simples também são disponibilizadas em precisão dupla.
Exemplos:

.,
 3,

Ä Seno:
0 
0
Ä Cosseno: j)
j)

Ä Tangente:  


Ä Log 10: )& )&
Ä Ln: ) )
Ä Etc...

XÈ
3, ,
(E.,
5
 ,
 
3, ,
(

Ä Quando utilizar dupla precisão?


± O uso de variáveis com dupla precisão deve ser feita com
muito cuidado:
Ä Requer o dobro da memória de armazenamento em relação a
variáveis com simples precisão.
Ä O processamento se torna mais lento (operações mais
demoradas).

± Por outro lado, faz-se necessário quando:


Ä Necessitam-se de números reais com mais de 7 algarismos
significativos.
Ä Números reais com ordem de grandeza superior a 1038 ou
inferior a 10-38.
Ä Operações com números reais com dimensões muito
distintas:
± Simples: 1.000.000,0 + 3,25 = 1.000.003,0
± Dupla: 1.000.000,0 + 3,25 = 1.000.003,25
X
Ä Subtração entre números reais muito próximos.
3, ,
(E.,
5
 ,
 
!,  '(X

Ä Elaborar um programa para calcular a derivada da


função f(x) = 1 / x em um dado ponto, utilizando
simples e dupla precisão.

Ä Expressão para cálculo da derivada:

  L  ù   L
 L  
 ù ! ù
Ä Considerar ùx variando entre 10-1 e 10-10.


3, ,
(E.,
5
 ,
 
"K.
.,
5

Ä O Fortran permite representar e operar números


complexos.

Ä Um número complexo pode ser inicializado do


seguinte modo:

j)2>    0%$'0%$

real imaginária

que representa o número a1 = 3.141592 - 3.141592*i

X
3, ,
(E.,
5
 ,
 
"K.
.,
5

Ä Ou ainda...
j)2> ' 02>
0)%,  4
4  &' & ! Todos os elementos de array1 são nulos

j)2>  
>' ( &*  ! Os primeiros dez campos correspondem à
! parte real, os dez seguintes à parte
imaginária.

j)2>  
> '  ! O número complexo deve ser lido na forma, por
! exemplo, (-1.,1.)

j)2>    &' &%


 0> '  ! ! Escreve a1 = (1.000000,2.500000E-01)
3, ,
(E.,
5
 ,
 
"K.
.,
5

Ä Operações com números complexos e outros tipos


de dados:
± O número real ou inteiro é convertido em complexo e o
resultado final se torna complexo. A parte real ou inteira se
torna a parte real do número complexo.

Ä Operadores lógicos:
± Pode-se utilizar os operadores == e /=, porém >, <. >=, etc.
não são possíveis (faria sentido?)

$
3, ,
(E.,
5
 ,
 
"K.
.,
5

Ä Funções intrínsecas:

± j2  '  :
Ä Converte os números reais e/ou inteiros  e  em um
número complexo com parte real igual a  e parte complexa
.
Ä As funções REAL () ou INT () transformam em número real
(precisão simples) ou inteiro a parte real do número complexo
(a parte imaginária é desprezada).

± 02
Ä Converte a parte imaginária do número complexo  em um
número real.

‰
3, ,
(E.,
5
 ,
 
"K.
.,
5

Ä Funções intrínsecas:

± j-
 :
Ä Calcula o módulo do número complexo .

± j) :
Ä Calcula o conjugado do número complexo .

± Funções matemáticas como


0  ' j)
 ' )  '
)&  ' entre outras também podem ser utilizadas com
números complexos. Empregam-se as formas j
0  '
jj)
 ' j)  ' j)&, etc.


3, ,
(E.,
5
 ,
 
6,
 

Ä Até aqui, trabalhou-se com os tipos de dados


intrínsecos ao Fortran: inteiros, reais, complexos,
lógicos e caracteres.

Ä O Fortran, entretanto, permite-nos criar nossos


próprios tipos de dados. Esses tipos de dados são
conhecidos como 
 .

Ä Os tipos derivados são, na realidade, uma forma


bastante conveniente de agrupar todas as
informações sobre um dado item.


3, ,
(E.,
5
 ,
 
6,
 

Ä Ao contrário dos vetores e matrizes, os tipos


derivados permitem que seus elementos sejam de
diferentes tipos.

Ä Sintaxe (logo após PROGRAM e USE ou dentro de


módulos):

3>     
 "8     

> 3>   


3, ,
(E.,
5
 ,
 
6,
 

Ä Exemplo:
± Tipo derivado para definição de características pessoais:

3>    
jj> 0  
jj> 0   D 
jj> $  
0>>   
jj>   
> 3>   

± Uma vez definido o tipo, na seção de declaração de


variáveis, pode ser empregado:
3>       '   
3>   ' 02>
0) &&    
È
3, ,
(E.,
5
 ,
 
6,
 

Ä Exemplo:
± Pode-se, ainda, criar constantes com o tipo definido:

      (  *' (*' *0%,$*' %' ( *

± A constante deve ter seus parâmetros definidos segundo a


ordem apresentada no comando TYPE.


3, ,
(E.,
5
 ,
 
6,
 

Ä Exemplo:
± Pode-se, também, utilizar um tipo derivado como
componente de um outro tipo derivado:

3>  
3>      
>' 02>
0)&   
>   
> 3>

3>  ' 02>
0) &  

$
3, ,
(E.,
5
 ,
 
6,
 

Ä Trabalha-se com esses tipos ao longo de um


programa com o auxílio do símbolo %. Cada
componente trabalha de modo independente.

Ä Exemplo:
± Atribuir ao aluno André a idade de 35 anos
Ä      %

± Atribuir ao 5º aluno da turma, a nota do 3º exame:


Ä %    $%

± Atribuir ao 5º aluno da turma, a idade de 23 anos:


Ä %     
$X
3, ,
(E.,
5
 ,
 
6,
 

Ä Programa para ilustrar a aplicação de tipos


derivados:
±       

$
!%


Ä Introdução.
Ä Elementos básicos para programação em Fortran.
Ä Declarações condicionais.
Ä Declarações recursivas.
Ä Lendo e escrevendo dados.
Ä Operações com arquivos.
Ä Vetores e matrizes.
Ä Subrotinas e funções.
Ä Dupla precisão, complexos e tipos derivados.
Ä | ,  , , % . 
. 

$$

Você também pode gostar