Departamento de Física Aplicada e Termodinâmica
Física Computacional A
DFAT/
FiscompFA
Expressões Numéricas
Professor: Anibal Leonardo Pereira última atualização: março 2011
Estagiários:
2004/1 a 2005/2
Luciana Conceição Iecker Lima
2010/1
Magali dos Santos Leodato
2009/1 a 2010/2
Filipe da Fonseca Cordovil
Monitores:
2001/1
Diego Chagas Garcia
2002/2
Erick Azevedo Meirelles
2003/1 a 2003/2
Luciana Maria dos Santos Azevedo
2003/1 a 2003/2
Tatiana Gonçalves Martins
2003/1 a 2005/2
Renato Nascente Júnior
2004/1 a 2005/2
Públio Martins Romano M. Carreiro
2006/1 a 2007/2
Luiz Fernando Rosalba Telles Souza
2006/1 a 2007/2
Paulo Henrique Pfitzner
2008/1 a 2008/2
Filipe da Fonseca Cordovil
2008/1 a 2009/2
Magali dos Santos Leodato
2011/1 a
Filipe da Fonseca Cordovil
1. Tipos de Dados no Fortran
A especificação de tipo (
tipo de dados) num programa define:
•um conjunto de valores
•
um meio para representar os valores
•
as operações que são possíveis de serem realizadas com eles
O Fortran 2003 possui 5
tipos de dados intrínsecos
que são divididos em duas classes: numérica e não
numérica.
•
Tipo numérico
•
inteiro
•real
•complexo
•Tipo não numérico
•
caractere
•lógico
intrínseco é o adjetivo que se aplica a tipo de dados, operações, instrução de atribuição e procedimentos (funções e sub-rotinas) que estão definidos no Fortran e podem ser utilizadas sem que se tenha que fazer alguma definição ou especificação adicional
Os subtipos (
kind) mais utilizados com dados numéricos são os subtipos
precisão simples
e
precisão dupla
, que
são, essencialmente, caracterizados pelo número de bits que o computador utiliza para representar os números.
Precisão simples e precisão dupla dependem do tamanho da palavra do computador.
Muitos computadores pessoais ainda em uso, foram construídos com CPU's que utilizam palavras de 32 bits, mas a maioria dos computadores novos utilizam palavras de 64 bits. O computador de 64 bits que utiliza um software de 32 bits é considerado como sendo uma máquina de 32 bits.
Para o computador com palavra de 32 bits, a precisão simples usa 32 bits e a precisão dupla 64 bits. Para o computador com palavra de 64 bits, a precisão simples usa 64 bits e a precisão dupla 128 bits. Portanto a precisão é muito dependente do computador (do tamanho da palavra) onde o programa será executado. Por este motivo o Fortran disponibiliza uma forma de trabalhar que permite minimizar (em alguns casos isolar completamente) a influência desta característica. Como isto é feito será abordado posteriormente.
Os tamanhos das palavras utilizadas pelas CPU's dos computadores foram: 6-, 8-, 12-, 16-, 18-, 24-, 32-, 36-, 39-, 48-, 60- e 64-bit. Desde 2008 a CPU utilizada nos microcomputadores pessoais é da família x86-64 portanto capazes de trabalhar com palavras de 64-bits. Entretanto, quando o microcomputador utiliza um software escrito usando bits a CPU acaba sendo utilizada no modo 32-bits, e o microcomputador se comporta como se fosse de 32 bits não de 64 bits.
http://en.wikipedia.org/wiki/Integer_(computer_science) em 08/02/2011
Outro tipo de dado bastante útil (
este não é intrínseco) que pode ser utilizado no Fortran é o dado
tipo derivado
.
O tipo derivado é um tipo de dado definido pelo usuário. Com o tipo derivado o usuário ficar responsável por
definir o tipo e também as operações que poderão ser utilizadas com o tipo que está definindo.
2. Constante Literal
Constante literal (
muitas vezes chamada somente de constante) são os totens utilizados para representar os valores
de um tipo particular de dado, isto é, os caracteres que podem ser utilizados na sua representação.
Totem (em inglês: token) é um segmento de texto ou símbolo que é manipulado pelo compilador como uma entidade. É uma entidade (um conjunto de caracteres) que possuí algum tipo de significado.
2.1-Constante Literal Caractere
A constante literal caractere utiliza os caracteres disponíveis no conjunto de caracteres que o Fortran usa para
criar os totens desejados, isto é, as constantes. Exemplo: "Entre com um nome"
2.2-Constante Literal Inteira
A constante literal inteira é usada para representar os valores do tipo inteiro intrínseco. São números inteiros
com sinal. Exemplos:
34 -45 +1000 -976
Para a constante literal inteira o sinal positivo é opcional. O intervalo (
range) para os inteiros é dependente do
tamanho da palava utilizada no computador:
•
palavra de 16 bits: – 32768 até +32767
•
palavra de
32 bits
: – 2147483648 até + 2147483647 (
precisão simples
)
•palavra de
32 bits
: −9223372036854775808 até +9223372036854775807 (
precisão dupla
)
2.3-Constante Literal Real
Constante literal real é usada para representar os valores do tipo real intrínseco. Consiste de uma cadeia de
dígitos com um ponto decimal (
para nós seria a vírgula decimal). São de dois tipos:
ponto fixo
e
ponto flutuante
.
Ponto fixo
:
podem ser com ou sem sinal.
Exemplos:
0.5 +3.67 –37.0 -0.78
O ponto decimal tem que (
é obrigatório) aparecer na constante. Por clareza é sempre importante escrever o zero:
escreva
2.0
não
2.
escreva
0.5
não
.5
O sinal positivo é opcional. O intervalo (
range) é dependente do tamanho da palava do computador.
Ponto flutuante
:
podem ser com ou sem sinal. Neste caso a letra
E
(
ou a letra minúsculae
) tem que ser
utilizada.
Exemplos:
0.5E2(= 500.0) →
0.5×10
22E2
(= 200.0) →
2
×
10
2–37E-3
(= –0.037) →
−37×10
−3O sinal positivo é opcional. Da mesma forma o intervalo (
range) é dependente do tamanho da palava do
computador.
Não importa como o número real é escrito pelo usuário ou como ele é mostrado na tela do micro ou como ele é
lido ou escrito numa entrada ou saída formatada, na memória do computador ele é sempre guardado como ponto
flutuante (
definida pela IEEE 754 – Standard for Floating-Point Arithmetic, que o Fortran chama de número real).
O Fortran pode identificar o tipo do número pela forma como ele é escrito. Então, o número
58
é um número
inteiro
enquanto
58.0
é um número
real
.
O intervalo (
range) e a precisão do número real é definido pelo
parâmetro de subtipo
(
kind parameter). Isto será
visto com detalhes posteriormente.
Para os computadores com palavra de 32 bits:
•
32 bits: de
−
10
38até
10
38(
precisão simples
)
•32 bits: de
−10
308até
10
308(
precisão dupla
)
2.4-Constante Literal lógica
A constante literal lógica pode conter apenas dois valores: .true. e .false.
Assim mesmo, como está escrito. Utilizando-se o ponto inicial e o ponto final em cada uma delas. .true. – significa verdadeiro
.false. – significa falso
O Fortran quando mostra estes valores utiliza apenas as letras T e F
Os valores lógicos serão abordados e trabalhados futuramente.
3. Constante com Nome
A forma como usualmente empregamos o termo constante pode criar uma certa confusão.
É muito comum utilizar-se apenas o termo constantes para nos referirmos a estes dois tipos de constante. Daí a
confusão.
Constante literal
como o próprio nome diz, constante literal é uma constante que é escrita no programa, literalmente escrita no
programa. Pode ser numérica ou não numérica.
program ex1 implicit none real:: x, y, z x = 2.9
y = 7.0
z = 3*x +0.5/y print*,"z=",z end program ex1
Este programa utiliza quatro constantes literais numéricas:
3 que é uma constante do tipo inteiro
2.9, 7.0 e 0.5 são constantes do tipo real
são constantes literais, porque elas estão literalmente escrita no programa
Se um programa utiliza, por exemplo, a constante literal inteira 3 em muitos lugares diferentes no código fonte,
quando houver a necessidade de trocar o valor da constante, de 3 para 8, é necessário fazer a troca de cada
ocorrência da constante literal 3 pela constante literal 8. Um trabalho imenso e muito sujeito a erros, principalmente
em programas grandes.
Observe que os valores 2.9 e 7.0 estão literalmente escritos no programa, mas estes valores estão associados (sendo guardados) nas variáveis x e y.
Escrito assim, o leitor pode ser enganado e pensar que os valores guardados nas variáveis x e y (2.9 e 7.0) são constantes. Não são. Apesar de (neste caso) estes valores terem sido escritos no programa como constantes literais numéricas.
Não se deixe enganar. Os valores guardados nos objetos de dados (nas entidades) x e y são variáveis, não constantes, apesar desta forma de uso.
Constante com nome
Constante com nome é um valor constante que pode ser tratado por um nome, não pelo seu valor.
Uma constante com nome pode ser numérica ou não numérica.
program ex2 implicit none
real,parameter::pi=3.14 real:: x, y, t
t = 9.7
y = sin(2*pi*t) print*,"y=",y end program ex2
O programa utiliza uma constante com nome chamada pi do tipo real que contém o valor 3.14
utilizamos o nome pi não o valor 3.14 quando necessitamos usar o valor 3.14, ou seja, utilizamos a constante com nome
Se um programa utiliza, por exemplo, a constante com nome
pi
em muitos lugares diferentes do programa,
quando houver a necessidade de trocar o valor da constante de 3.14 para 3.141559 é necessário trocar este valor
apenas na definição da constante com nome (
um único local) que o novo valor será automaticamente usado no
programa todo. Um trabalho bastante reduzido quando comparado com o uso da constante literal e o mais
importante muito menos sujeito a erros.
4. Nomes e Variáveis
Nome
Um nome, no Fortran 2003, pode ter
até 63 caracteres alfanuméricos, mas tem que, obrigatoriamente,
começar com uma letra
.
Os caracteres alfanuméricos disponíveis para uso nos nomes são definidos pelo conjunto de caracteres do
Fortran (
na prática o código ASCII). Pode-se utilizar 52 letras, 10 dígitos e o caractere sublinha ( _ ) nos nomes.
velocidade VELOCIDADE VELOcidade vELocidade veloCIDADE
são nomes que caracterizam o mesmo objeto (
obviamente, evite o uso destas formas esquisitas).
Um
nome tem que ser único
no programa Fortran.
program var1 implicit none real::var1=4.3 print*,"var1=",var1
end program var1
Este programa não pode ser utilizado pois o nome var1 é ambíguo (não único).
var1 é o nome do programa, mas também é o nome de uma variável real no mesmo programa (esta é a ambiguidade)
Variável
Uma
variável
é uma posição de memória cujo valor guardado nela pode mudar durante a execução do
programa. Uma variável tem tipo, isto é, tem regras que definem como ela guarda os valores, quais valores pode
guardar e quais operações podem ser realizadas com os valores.
Uma variável é definida numa instrução de definição de tipo, por exemplo:
real:: x !define variável x como sendo do tipo real
integer:: i !define variável i como sendo do tipo inteiro
character(len=12):: nome !define variável nome como sendo do tipo caractere com !comprimento igual a 12 caracteres
A variável pode ser
inicializada
na sua declaração, isto é, definida e ao mesmo tempo receber um valor.
real:: x=2.5 !define a variável x como real e a inicializa com o valor 2.5Variável indefinida:
quando se declara uma variável e não se atribui um valor à ela, diz-se que a variável está indefinida (
existe, mas não tem um valor conhecido guardado nela).
Variável definida:
quando a variável recebe um valor, diz-se que ela foi (
ou está) definida (
ela contém um valor conhecido).
A definição de uma variável pode ser feita pelo processo de inicialização ou então pela atribuição de um valor
em algum ponto dentro do programa
5. Instrução Implicit None
A regra criada na primeira versão do FORTRAN chamada de regra implícita é definida assim:
uma variável cujo nome inicia com a letra
•
i, j, k, l, m, n
é automaticamente definida como sendo do tipo
inteiro
uma variável cujo nome inicia com qualquer
•outra leta
é do tipo
real
.
toda variável que iniciavam com letras diferentes de
i j k l m n
é automaticamente definida como sendo
variável do tipo real
O tempo mostrou que esta regra é uma armadilha, pois esconde (
dificulta a localização) de erros nos programas.
Ela ainda existe no padrão atual para manter compatibilidade com as versões anteriores, mas o Fortran dispõe da
instrução implicit none (
nenhuma implícita, ou seja, nenhuma regra implícita é utilizada) que deve ser utilizada em
program soma x = 4.5 y = 5.5 z = x + y
print*,"soma=",z end program soma
A forma mais adequada de trabalhar é escrever o programa
utilizando a instrução implicit none
program soma implicit none real:: x, y, z x = 4.5
y = 5.5 z = x + y
print*,"soma=",z end program soma
6. Operadores Numéricos Intrínsecos
Os operadores numéricos implícitos do Fortran são:
operador
precedência significado
**
exponenciação
1
2**3 →
2
3(=8)
*
multiplicação
2
2*3 →
2
×
3
(=6)
/
divisão
2
6/3 →
6
÷
3
(=2)
+
adição
3
2 + 3 →
2
3
(=5)
–
subtração
3
5 – 3 →
5
−
3
(=2)
Operador binário
operadores binários são aqueles que operam num par de operandos: exemplo: A * B → (opr)
op
(opr)
Operador unário
são os operadores que operam apenas em um operando: exemplo: – B →
op
(opr)
Uma regra importante é: dois operadores não podem ser escrito adjacentes, isto é, não pode haver dois
operadores um do lado do outro.
Exemplo:
-10 está corretoporque
–
é um operador unário
*10 está erradoporque
*
é um operador binário
2*5 está correto
operador binário
2*-5 está errado
porque existem dois operadores adjacentes
2*(-5) está correto
porque não há dois operadores adjacentes
Quando uma expressão envolve vários operadores as operações são realizadas da esquerda para a direita
seguindo a ordem de precedência. ( Mnemônico para esta regra →
PEMDAS
)
•
parêntese
parêntese tem maior prioridade
tudo o que estiver entre parêntese é feito primeiro
•exponenciação
a operação de exponenciação tem prioridade
1
•
multiplicação
e
divisão
tem mesma prioridade:
2
são feitas na ordem em que aparecem, da esquerda para a direita
•adição
e
subtração
tem mesma prioridade:
3
são feitas na ordem em que aparecem, da esquerda para a direita
•exceção
a exceção da regra da esquerda para a direita é a operação exponenciação
por exemplo: A**B**C é feita da direita para a esquerda ou seja:
A
BCExemplo:
W = V * T - G / 2 * T ** 2
→
W
=
V
×
T
−
G
2
×
T
2
neste exemplo :
1) operação
A
=
T
22) operação
B
=
V
×
T
3) operação
C
=
G
2
4) operação
D
=
C
×
A
5) operação
W
=
B
−
D
← resultado final
7. Expressão Numérica
Expressões numéricas representam cálculos numéricos e são formadas com operadores numéricos e operandos
numéricos. A avaliação (
o cálculo) da expressão leva a um valor número simples (
um valor escalar).
Exemplos:
E = m * c**2→
E
=
m c
2y = y_0 + v_y0 * t + (1.0/2.0)* g * t**2
→
y
=
y
0
v
y0t
1
2
g t
2
Os operadores intrínsecos (** * / + – ) são intrínsecos porque eles são disponibilizados pelo Fortran. Eles
são preexistentes. Existem também os operadores que podem ser construídos pelo usuário que neste caso não são
intrínsecos. Eles serão visto posteriormente.
7.1-Divisão Inteira
Causa de muitos erros nos programas para os programadores desatentos.
A divisão inteira é feita pela divisão de duas entidades inteiras e o seu resultado é um inteiro. Porque um inteiro
não tem a parte fracionária (
decimal) ela é eliminada na resposta, então:
1
2
→ 1/2
1÷2
esta divisão inteira gera como resposta o número
zero
não o número 0.5 como seria
desejado
por sua vez a divisão real
1.0
2.0
→ 1.0/2.0
1.0÷
2.0
gera o número 0.5 como esperado
ATENÇÃO:
1/2
→
0
enquanto
1.0/2.0
→
0.5
É muito importante lembrar que estes dois tipos de dados numérico (
no computador) são diferentes.
O que faz
com que as operações matemáticas realizadas com os inteiros e os reais no computador gerem valores diferentes.
Para melhorar e reforçar este entendimento, vamos analisar a operação de divisão do número 1 pelo número 4.
Na matemática
esta divisão gera o valor 0.25.
Por outro lado,
no computador
o resultado depende do tipo numérico utilizado:
números tipo real:
1.0
4.0
=0.25000000
números tipo inteiro:
1
4
=0
Usando números reais a resposta obtida é a esperada (
0.25000000 ou 0.25) enquanto, com números inteiros aresposta é diferente do que se espera porque como o valor inteiro resultante da divisão não pode conter a parte
decimal (
fracionária) ela foi descartada, o que faz com que a resposta obtida seja o número zero. Claramente
diferente da matemática.
Você pode pensar que isto é um erro.
É inesperado, mas não um erro
, porque isto ocorre devido a forma como
internamente o computador guarda a e manipula os números.
Ao encontrar o número 1 (não 1.0) e o número 4 (não o 4.0) o Fortran sabe que eles são números inteiros e portanto a divisão que está sendo feita é uma divisão entre números inteiros – ou como usualmente chamamos: divisão inteira. Para fazer a operação de divisão inteira o Fortran procede assim:
• converte o inteiro 1 para o real 1.0
• converte o inteiro 4 para o real 4.0
• implementa a operação de divisão obtendo o resultado 0.25000000
• como a operação de divisão está sendo feita entre dois inteiros o resultado da divisão também será um inteiro, por isto o Fortran transforma o resultado obtido (0.25000000 que é um número real) em um número inteiro. Porque inteiros não tem a parte fracionária, o resultado obtido da divisão inteira será o número zero
• Percebeu? Nada de errado. Estranho apenas para quem não conhece a regra utilizada pelo Fortran para fazer divisão inteira
• por outro lado, por exemplo, dividir 6 por 3 dá a resposta correta tanto na divisão inteira quanto na divisão real: 6/3 = 2 e 6.0/3.0 =2.0
Importante
: não esqueça que divisão inteira e divisão real pode produzir resultados distintos no computador
8. Expressões Modo Misto
O Fortran permite o uso de expressões que utilizam operando de tipos diferentes.
A regra geral é que o “
tipo mais simples
” é convertido para o tipo mais complexo (
coerced – forçada a agir como).
Isto aplica-se a operação não a expressão como um todo.
Porque o tipo inteiro é um tipo mais simples que o tipo real as operações em uma expressão mista serão
realizadas pela aritmética real não inteira.
Exemplos:
1/2 gera o valor 0 (modo simples: 2 valores inteiros) 1.0/2 gera o valor 0.5 (modo misto)1/2.0 gera o valor 0.5 (modo misto)
1.0/2.0 gera o valor 0.5 (modo simples: dois valores reais)
7/2 * 4.0 gera o valor 12.0 porque 7/2 é avaliada primeiro gerando o número 3 e
3 * 4.0 → 12.0 (esperado 14.0; obtido 12.0)
RECOMENDAÇÃO:
não deixe expressões mistas tomarem conta do seu programa, pois isto é fonte de
muitos erros difíceis de serem encontrados.
Transforme as expressão mistas em expressão simples.
Exemplo: real(7/2)*4.0 gera o valor 14.0 porque é uma expressão modo simples
real(1)/real(2) gera o valor 0.5 porque é uma divisão modo real simplesPor exemplo se você deseja obter a parte inteira de um valor pode fazer assim:
7.0/2.0 gera o valor 3.5
int(7.0/2.0) gera o valor 3
9. Comando de Atribuição
A instrução de atribuição (
comando de atribuição) é a forma utilizada para escrever um valor num objeto (
guardar – escrever na posição de memória reservada para o objeto de dado especificado).
A forma geral do comando de atribuição é: variável = expr
ATENÇÃO:
o sinal de igual não tem a mesma interpretação que o sinal de igual na matemática.
É necessário entender que a melhor representação seria uma seta: ←
a seta não pode ser utilizada porque os caracteres possíveis de serem utilizados num programa Fortran – NA PRÁTICA – são aqueles contidos na tabela ASCII (posições 32 a 126) e a seta não está disponível
a instrução v = g*t significa calcule a expressão colocada no lado direito do sinal de igual
g
×
t
e
guarde (
escreva na posição de memória) o valor calculado na variável v. A melhor forma de representar isto seria:
v
g
×
t
mas, infelizmente esta representação não é possível de ser utilizada no Fortran. Por isto utiliza-se o sinal de
igual (=) que está disponível na tabela ASCII (
a seta conforme dito não está disponível).
Se a expressão utilizada é do tipo mista o resultado é primeiro convertido para o mesmo tipo da variável que vai
receber o valor calculado e depois guardada na (
atribuída à) variável.
Isto significa que é possível haver perda de
dados.
Portanto muita atenção ao escrever expressões no Fortran.
Por exemplo, com :
integer:: N real : x, yas expressões:
N = 7.0 / 3 gera o valor 2x = 7 / 3 gera o valor 2.0
y = 7.0 / 3 gera o valor 2.3333
x = 7 / 3.0 gera o valor 2.3333
Novamente
,
NÃO
deixe expressões mistas tomarem conta do seu programa.
10. Acumulador
Uma expressão muito utilizada em computação é aquela que chamamos de acumulador.
(
porque, neste exemplo, o resultado é um somatório também se usa o termo : somador).
Uma expressão acumuladora é similar a expressão: n = n + 1 ou n = n + a
A expressão acumuladora é muito utilizada para gerar uma sequência de números.
Por exemplo, quando se deseja criar a sequência 1 2 3 4 5 6 7 . . . .
n = n + 1
matematicamente isto é inconsistente
porque fazendo-se n = 5 teríamos: 5 = 5 + 1 5 = 6, o que é uma inconsistência matemática→
mas claro que a coisa toda não se passa assim no computador. No computador o processo é assim:
n= 1 a variável n inicia com o valor 1 no passo 1, adiciona-se 1 a variável n
n = 1 + 1 n=2 que então passa a ter o valor 2→
no passo 2, adiciona-se 1 a variável n
n = 2 + 1 n=3 que passa a ter o valor 3. Se forem efetuados apenas 2 passos a variável n→
termina com o valor 3
11. Saída de Dados para a Tela do Computador
O processo de transferência de dados permite que dados possam tanto entrar quanto sair de um programa.
A forma mais simples de saída de dados é aquela que mostrar os dados na tela do computador. A instrução
PRINT*,
é utilizada para isto.
A instrução print*, é chamada de saída com formato livre (
saída usando lista dirigida à).
A forma geral da instrução é:
print formatos, listaonde: formatos
especifica os formatos que serão utilizados com as variáveis da lista
o formato permite controlar a aparência dos dados (forma como os dados da lista serão escritos). O mais simples é deixar o compilador usar um formato default. Este formato default é chamado de lista dirigida à. Frequentemente ele é chamado de formato livre. Cada compilador possuí o seu próprio formato default (que são parecidos, mas não são iguais). A instrução PRINT*, é a instrução utilizada para escrever na tela do computador
Outra forma de enviar dados para a tela do micro é aquela que faz uso da instrução
write.A instrução write(unit=*, fmt=*) implementa a mesma ação que a instrução print* , isto é, envia a lista que
for utilizada com ela para a tela do micro.
A forma geral da instrução é: write(unit = u, fmt = formatos) lista
onde:
uformatos
Número inteiro que especifica a unidade . O * significa a tela do micro
os formatos controlam a forma como os dados da lista serão escritos. O * significa lista
dirigida, neste caso à saída (
ou formato livre)
lista
é uma lista de entidades (
objetos de dados) separadas por vírgula
LISTA DIRIGIDA À
a lista dirigida à é utilizada quando se escreve um asterisco ( * ) no formato.
A instrução PRINT* é uma instrução que está usando a lista dirigida à como formato para as entidades
declaradas na sua lista. Como a lista foi omitida, ela é considerada uma lista dirigida à saída vazia, portanto a
instrução irá imprimir na tela do micro (
lista dirigida à saída) uma linha vazia.
Exemplo:
program s_01
!--- !-- Programa exemplo de saída de dados !-- na tela do monitor
!-- AUTOR: Anibal L. Pereira 24/06/2010 !--- implicit none
real::var = 10.5
print*,"O valor de var é igual a:", var
end program s_01
O programa s_01 define uma variável real chamada
var e a inicializa com o valor 10.5.
Depois, utiliza a instrução de saída de dados
print*,"O valor de var é igual a:", varque ao utilizar um asterisco ( * ) no formato faz uso do
formato
lista dirigida à saída
– que em termos
práticos pode ser entendido como formato livre.
Esta instrução escreve na tela do computador a lista especificada, que neste caso é uma
lista
composta por duas
entidades:
• "O valor de var é igual a:"
• var
A lista pode conter constantes, variáveis, expressões e strings (
cadeias de caracteres) separadas por vírgulas.
Neste caso, nossa lista possui duas entidades:
•um string
a sentença O valor de var é igual a: delimitada por aspas
[
as aspas ( " ) são utilizadas para marcar o início e o fim do string – seus limites ]neste caso o string é uma constante literal do tipo caractere ou como usualmente os referimos uma
constante literal caractere
Recorde que o Fortran permite o uso de aspas ( ” ) e de apóstrofo ( ' ).
Entretanto, ao se utilizar um deles (na abertura ou no fechamento) o outro será obrigatoriamente do mesmo tipo, então:
print*, ” O valor de var1 é igual a: ” e
print*, ' O valor de var1 é igual a: ' podem ser utilizadas sem problema algum
•
uma variável
Não esqueça: as entidades utilizadas na lista são separadas por vírgula.
Exemplo:
program s_01a
!--- !-- Programa exemplo de saída de dados na tela !-- usando a instrução write
!-- AUTOR: Anibal L. Pereira 03/10/2010
!--- implicit none
real::var = 10.5
write(unit=*,fmt=*)"O valor de var é igual a:", var
end program s_01a
O programa s_01a utiliza a instrução write
para a saída de dados
write(unit=*,fmt=*) . . .
que faz uso do asterisco ( * )
unit=* unidade → (monitor
)
fmt=* formato → (
lista dirigida à saída
)
Observe que a instrução escreve na tela do computador a lista. Neste caso, duas entidades.
12. Entrada de Dados pelo Teclado
A forma mais simples de entrar dados no computador é a instrução READ*, que permite a entrada de dados
pelo teclado. A forma geral da instrução é:
read formatos, lista-variáveisonde: formatos
especifica os formatos que serão utilizados com as variáveis lidas
a utilização de um formato na entrada de dado pelo teclado é uma técnica que, muito frequentemente, leva a erros pois o usuário tem que se preocupar com o formato dos dados que está fornecendo ao programa. Por isto é recomendado que não se utilize dados formatados quando os dados devem ser fornecidos pelo teclado. O melhor é utilizar uma lista dirigida à entrada pois isto diminui muito a quantidade de erros. A instrução READ*,
é a instrução de leitura que usualmente é utilizada
lista-variáveis
é uma lista de variáveis separadas por vírgula
Exemplo:
program ent_01
!--- !-- Programa exemplo de entrada de dados !-- pelo teclado
!-- AUTOR: Anibal L. Pereira 24/06/2010 !--- implicit none
real::x, y, z
print*,"Entre com 2 números" read*, x,y
z = x + y
print*,x, "+", y, "=", z
end program ent_01
O programa ent_01 solicita que o usuário entre dados
pelo teclado.
Para isto ele utiliza a instrução de entrada de dados
read*, x,yquando se utiliza um asterisco ( * ) isto significa lista
dirigida (
que pode ser entendida como formato livre).
Como a instrução é de entrada então é uma lista
dirigida à entrada
Observe também que este programa está utilizando as instruções:
print*,"Entre com 2 números"que utilizam lista dirigida à saída, por isto elas escrevem suas listas (
com formato livre) na tela do micro.
Exemplo:
program ent_01a
!--- !-- Programa exemplo de entrada de dados !-- pelo teclado, usando a instrução write !-- AUTOR: Anibal L. Pereira 03/10/2010 !--- implicit none
real::x, y, z
print*,"Entre com 2 números" read(unit=*, fmt=*) x,y
z = x + y
write(unit=*, fmt=*) x, "+", y, "=", z
end program ent_01a
O programa ent_01a solicita que o usuário entre dados
pelo teclado, usando a instrução
read(unit=*, fmt=*) x,y
que faz uso do asterisco ( * )
unit=* unidade → (monitor
)
fmt=* formato → (
lista dirigida à entrada
)
ENTRANDO OS DADOS
A entrada dos dados pode ser feita
•
na mesma linha separada por espaço em branco ou então separada por vírgula
enquanto não se pressionar a tecla <enter> é possível fazer correções nos dados que estão sendo
escritos
•
pode-se também pressionar tecla <enter> após a entrada de cada um dos dados
neste caso, depois de pressionar a tecla <enter> não é mais possível fazer qualquer correção no
dado fornecido.
13. Instrução PRINT usando Formato
A instrução print conforme destacado tem a forma:
print formatos, lista
onde: formatos
especifica os formatos que serão utilizados com as entidades na lista
usa-se o formato para controlar a aparência dos dados que serão escritos na tela do computador
lista
Identifica as entidades (
objetos) que serão escritas
Se for utilizada a instrução
write(unit=*write(unit=*, fmt=formatos) lista
onde: formatos
especifica os formatos que serão utilizados com as entidades na lista
DESCRITOR DE EDIÇÃO DE DADOS
Existem vários descritores de edição de dados que podem ser utilizados, mas neste momento vamos destacar os
descritores: A, I, F, E, ES, EN
•
A[
w
]
Alfanumérico
descritor de edição de dado caractere utilizado para formatar o (
controlar a aparência) caractere
A
w
w → tamanho do campo , isto é, quantos caracteres serão utilizados
•
I
w
[
.m
]
Inteiro
descritor de edição de dado inteiro utilizado para formatar números inteiros
I
w.m
w → tamanho do inteiro, isto é, quantos dígitos serão utilizados para mostrar o inteiro
m → garante que pelo menos m dígitos serão mostrados. Zeros anteriores serão usados se necessário
•
F
w.d
Real
descritor de edição de dado real utilizado para formatar números reais
F
w.d
w → tamanho total do campo do real, isto é, quantas posições serão utilizados para mostrar o real
incluindo o sinal e o ponto decimal
d → número de dígitos depois do ponto decimal
•
E
w.d
Real
descritor de edição de dado real utilizado para formatar números reais
E
w.d
w → tamanho total do campo do real, isto é, quantas posições serão utilizados para mostrar o real
incluindo o sinal e o ponto decimal
d → número de dígitos depois do ponto decimal
há também a forma
E
w.d
[E
e
]
que não abordaremos neste momento
•
EN
w.d
Real
descritor de edição de dado real utilizado para formatar números reais
mantissa maior que 1 e menor que 1000
EN
w.d
w → tamanho total do campo do real, isto é, quantas posições serão utilizados para mostrar o real
incluindo o sinal e o ponto decimal
d → número de dígitos depois do ponto decimal
há também a forma
EN
w.d
[E
e
]
que não abordaremos neste momento
•
ES
w.d
Real
descritor de edição de dado real utilizado para formatar números reais
mantissa maior que 1 e menor que 10
ES
w.d
d → número de dígitos depois do ponto decimal
há também a forma
ES
w.d
[E
e
]
que não abordaremos neste momento
FATOR DE REPETIÇÃO
Todos estes descritores de edição de dados podem ser multiplicados por um número inteiro que representa a
quantidade de repetições do descritor de edição de dados.
Exemplo:
5A3
→ é o mesmo que
A3, A3, A3, A3, A3
Exemplos:
considere os seguintes valores: n = 678 e x = 35.141592654 •
A
→ "Entre com um número"
•
A20
→ "Entre com um número" (
cada acentos aumenta em um a contagem dos caracteres)
•
I3
→ 678
•I6.4
→ 0678
•F6.3
→ 35.142
•F6.1
→ 35.1
•E9.3
→ 0.351E+02
•E9.1
→ 0.4E+02
•EN9.2
→ 35.14E+00
•EN9.1
→ 35.1E+00
•ES9.3
→ 3.514E+01
•ES9.1
→ 3.5E+01
program ex3
!--- !-- Programa exemplo de formatação
!-- AUTOR: Anibal L. Pereira 28/06/2010 !--- implicit none
integer:: n=678 real:: x=35.141592654
print*,"Entre com um número" print"(A20)","Entre com um número"
print"(i3)", n print"(i6.4)", n print"(f6.3)", x print"(f6.1)", x print"(E9.3)", x print"(E9.1)", x print"(EN9.2)", x print"(EN9.1)", x print"(ES9.3)", x print"(ES9.1)", x
end program ex3
Na realidade a frase entre com um número, que está sendo escrita duas vezes no programa, não tem nenhum significado para que o usuário entre com um número, pois não há instrução de entrada de dado no programa
A saída deste programa é mostrada abaixo:
Entre com um número Entre com um número 678
program ex4
!--- !-- Programa exemplo de formatação
!-- AUTOR: Anibal L. Pereira 28/06/2010 !--- implicit none
integer:: n=678 real:: x=35.141592654
print"(a20)","Entre com um número" print"(i3,i6.4)", n, n
print"(f6.3,f6.1)", x, x print"(E9.3,E9.1)", x, x print"(EN9.2,EN9.1)", x, x print"(ES9.3,ES9.1)", x, x
end program ex4
Novamente a frase 'Entre com um número', não significa uma ação que o usuário deva fazer, pois neste programa, também, não há instrução de entrada de dado
A saída deste programa é mostrada abaixo:
Entre com um número 678 0678
35.142 35.1 0.351E+02 0.4E+02 35.14E+00 35.1E+00 3.514E+01 3.5E+01
Quando o descritor de edição de formato do dado numérico não é compatível com o valor a saída é preenchida
com asteriscos ( * )
. Se o descritor for para um dado caractere, o valor será cortado se o dado é maior que a
quantidade de caracteres reservada para a saída
program ex5
!--- !-- Programa exemplo de formatação
!-- AUTOR: Anibal L. Pereira 28/06/2010 !--- implicit none
integer:: n=678 real:: x=35.141592654
print"(a11)","Entre com um número"
print"(i2)", n print"(f5.3)", x print"(E7.3)", x print"(EN8.2)", x print"(ES8.3)", x
end program ex5
Novamente: Não há instrução de entrada de dado
A saída deste programa é mostrada abaixo:
Entre com u **
***** ******* ******** ********
program ex6
!--- !-- Programa exemplo de formatação
!-- AUTOR: Anibal L. Pereira 28/06/2010 !--- implicit none
integer:: n=678 real:: x=35.141592654
print"(i3,i3,i3,i3)", n, n, n, n print"(4i3)", n, n, n, n
print"(i5,i5,i5,i5)", n, n, n, n print"(4i5)", n, n, n, n
print"(2f7.3)",x, x print"(3E12.3)",x, x, x
end program ex6
A saída deste programa é mostrada abaixo:
678678678678 678678678678
678 678 678 678 678 678 678 678 35.142 35.142
14. Controle de Fluxo
Um programa de computador inicia a sua execução na primeira instrução do programa e vai, sequencialmente,
executando as outras instruções na ordem em que elas aparecem (
em que elas são escritas no código fonte).
Entretanto, muitas vezes é necessário altera a ordem de execução das instruções existente no programa. Isto pode
ser feito com declarações de controle de fluxo.
14.1. Instrução IF
Uma forma de se fazer o controle de fluxo de um programa é utilizando a instrução IF. A instrução IF é a forma
mais simples de controle de fluxo. Ela tem a seguinte forma:
if(expr) instrução-fortran
A instrução IF avalia a expressão colocada entre parênteses e se o resultado obtido for verdadeiro ela executa a
instrução-fortran especificada. Caso o resultado da avaliação seja falso a instrução-fortran não é executada.O fluxograma ao lado mostra a instrução IF
Observe que a instrução-fortran não é executada
quando o resultado é falso
Exemplo:
program m_01 implicit none integer::massa character(len=5):: tp="menor" print*,"Entre com uma massa entre 0 e 49 kg ou então entre 51 e 100 kg" read*, massa print* if(massa > 50) tp="maior" print*,"A massa é ",tp," que 50 kg" end program m_01
Observe que o programa m_01 troca a mensagem mostrada na tela do micro conforme o valor numérico
fornecido pelo usuário.
•
se o valor for menor que 50 a mensagem é: A massa é menor que 50 kg
•se o valor for maior que 50 a mensagem é: A massa é maior que 50 kg
O fluxograma ao lado mostra o programa.
Observe o controle de fluxo está sendo feito pela
instrução IF
a atribuição do valor maior à variável caractere tp será
ou não realizada, conforme o número que o usuário
entra no programa.
Portanto há um controle no fluxo do programa, como
desejado
14.2. Construção IF
Quando há a necessidade de se executar mais de uma instrução Fortran é necessário utilizar a construção IF. A
construção IF tem a seguinte forma:
if(expr) then
bloco A
else
bloco B
end if
agora, quando expr for avaliada como sendo verdadeira a construção if executa o conjunto de instruções colocado
no bloco A (
entre o then e o else). Por outro lado se a avaliação de expr for falsa o conjunto de instruções colocado
no bloco B (
entre o else e o end if) será executado em vez do bloco A.
Exemplo:
if(massa_que_levanta > 61.0) then p=(m*g)/10 else p=m*g end if
Forma simplificada da construção IF:
if(expr) then
bloco A
end if
Exemplo:
if((m/2) = = 50.0) then tempo=10.0 massa=3 end if
esta forma da construção IF (
sem a instrução else) faz a mesma tarefa da instrução IF, porém permite executar mais
de uma declaração.
No exemplo, além de atribuir o valor 10 à variável tempo, também atribuí o valor 3 à variável massa.
14.3. Construção IF-ELSEIF
A forma geral de uma construção IF é o IF-ESLSEIF-ELSE-ENDIF:
IF–ELSEIF–ELSE–ENDIF
Esta construção tem a forma:
if(expr_1) then bloco 1 elseif(expr_2) then bloco 2 elseif(expr_3) then bloco 3 else bloco_else end ife funciona assim:
•expr 1
se expr 1 for
verdadeira
o bloco 1
é executado
ao termino da execução do bloco 1 o controle do programa passa para a instrução que
segue o IF
se expr 1 seja
falsa
, o fluxo do programa passa para o elseif que segue o IF
•expr 2
se expr 2 for
verdadeira
o bloco 2
é executado
e ao término passa para a instrução que segue o IF
se expr 2 for
falsa
, o fluxo segue para o próximo elseif
•expr 3
se expr 3 for
verdadeira
o bloco 3
é escutado
ao término segure para a instrução depois do IF
14.4. Construção CASE
Uma construção
CASE(
caso) é bastante útil para lidar com alternativas que são mutuamente exclusivas, onde a
ordem em que elas aparecem não é importante (
levada em conta).
Uma construção
CASE(
caso) tem a forma:
select case (expr_caso) case (lista_valor_caso) bloco_1 case (lista_valor_caso) bloco_2 case default bloco_n end select
A expressão caso que determina a seleção do caso (
expr_caso) pode ser uma expressão inteira, caractere oulógica.
Expressão real não pode ser usada
.
Quando uma declaração
select caseé encontrada o valor da expressão
expr_casoé calculado e o bloco de
declarações que segue a declaração caso apropriada (
se existir) é executada.
Uma declaração caso tem a forma:
case (lista_valor_caso)ou
case default
Numa construção caso só pode existir um declaração default. O bloco de declaração referente à declaração
default só é executado se nenhuma declaração caso foi satisfeita.Exemplos:
select case (x>1 .and. x<4) case (.true.)
print*,"intervalo correto" case (.false.)
print*,"intervalo errado" end select
select case (num) case ( 1 ) x = 5*y case ( 2 ) x = -13*y case default x = y**2 end select
select case (objeto) case ("circulo") area = pi * r**2 case ("retangulo") area = lado * lado case default
print*,"Não é circulo nem & & retângulo"
end select
A lista_valores_caso pode tomar uma das seguintes formas:
Faixa de valores
Condição de ocorrência
valor_caso-1:valor_caso_2
valor_caso:
:valor_caso
valor_caso-1
expr_caso
valor_caso-2
valor_caso
expr_caso
valor_caso
expr_caso
•
sobreposição de faixas não é permitido
•
a construção caso é concluída com a execução do bloco selecionado, se existir algum. Não é permitido a
execução de mais de um bloco
•
se não houver seleção de algum caso e não existir a declaração
defaulta construção caso acaba sem a
select case (expr-caso) case( 1 )
bloco-1 case( 2 ) bloco-2 end select
select case (expr-caso) case( 1 )
bloco-1 case( 2 ) bloco-2 case default bloco-default end select
15. Expressão Relacional
As expressões utilizadas na instrução IF e na construção IF com muita frequência são expressões relacionais.
Uma expressão relacional, estabelece um relacionamento entre duas entidades do programa. Sua forma geral é:
2
exp
1
exp
operador
onde: exp1 = expressão aritmética ou caractere
operador = operador relacional
exp2 = expressão aritmética ou caractere
Os operadores relacionais que pode ser utilizados para escrever as expressões relacionais são:
Operadores relacionais:
operador
significado
= =
igual
/ =
diferente
>
maior que
> =
maior ou igual a
<
menor que
Por exemplo: a expressão
b
2
4ac
pode ser escrita como: b**2 >= 4*a*c e o resultado desta avaliação
só pode ser
verdadeiro
ou
falso
.
O valor de uma expressão relacional é sempre um valor lógico: verdadeiro ou falso.
Exemplos: operação resultado
7 < 10 .TRUE. 7 < = 10 .TRUE. 7 = = 10 .FALSE. 7 > 10 .FALSE. 7 < = 7 .TRUE.
"A" < "B" .TRUE. ! verdade porque é avaliado na ordem alfabética (7+3) < (6+11) .TRUE.
16. Variáveis Numéricas
A ideia de variável numérica no Fortran é similar àquela utilizada no contexto matemático.
Por exemplo, sabe-se pela matemática que a área de um círculo é calculada pela expressão:
área
=
r
2onde
r
é o raio do círculo.
•
Observe que a expressão utilizou o símbolo
(
pi do alfabeto grego). Este símbolo não pode ser
representado no Fortran 2003. Por este motivo, usa-se o nome pi para representar este símbolo
porque o Fortran foi desenvolvido por quem utiliza a língua inglesas, caractere que não estão na tabela
ASCII não são utilizados no Fortran. A exceção fica para os caracteres utilizados nas constantes literais
caractere. Portanto acentos, cê-cedilha e outros símbolos que não existem na tabela ASCII só podem ser
usados em constante caractere
•
recorde que o Fortran representa a operação de multiplicação por um asterisco ( * )
•e a operação exponenciação por dois asteriscos ( ** )
por isto a expressão
área=
r
2no Fortran é escrita assim: area = pi*r**2
Atente ao fato de área estar escrito sem o acento. Tem que ser assim, pois área sendo o nome de uma variável no Fortran não pode ter acento
Na equação area = pi*r**2
•
cada variável que aparece do lado direito do sinal de igual (
pi e r) tem que ter um valor para que aexpressão toda possa ser avaliada
•
depois que a expressão colocada no lado direito do sinal de igual é calculada o resultado é atribuído à
variável existente no lado esquerdo do sinal de igual
Na matemática é possível escrever a expressão
área
=
r
2 assim
r
2=
área
.As duas expressões representa a mesma coisa, portanto podem ser intercambiadas sem problema
No Fortran (e para a grande maioria das linguagens de computação) este tipo de inversão é proibida. Aquilo que se deseja calcular tem que estar colocado no lado direito do sinal de igual na expressão. Exemplos: correto: x = 2 + 5
errado: 2 + 5 = x
Variáveis numéricas no Fortran podem ser de 3 tipos:
inteira, real, complexa
inteira
integer
real
real
Numa primeira vista o conceito de tipo nos números parece estranho, principalmente quando pensamos em
números inteiros e números reais. Mas, é importante ter uma boa compreensão sobre esta distinção, para que não se
cometa erros grosseiros nos cálculos que serão realizados no computador.
Neste texto a atenção está voltada para os números inteiros e reais, porque números complexos são construídos
utilizando-se dois números reais. Números complexos serão usados posteriormente.
17. Definindo Variáveis Numéricas
A definição de uma variável (
definição de tipo de uma variável) tem a seguinte forma geral:
TIPO atributos :: lista-variáveis
para as variáveis numéricas tipo inteiro e tipo real, a forma mais simples de uso desta instrução de declaração de
tipo é:
integer:: lista-variáveis
real :: lista-variáveis
Exemplos:
integer:: num, var1, var2real:: massa, var3, var4
Nestes exemplos nenhum atributo foi utilizado. A lista-variáveis é uma lista de nomes de variáveis
separados por vírgula.
Se as variáveis fossem complexa a instrução ficaria assim:
complex :: z1, z218. Construção DO WHILE
Processo de repetição
A repetição de uma instrução ou um conjunto de instruções é algo muito útil. O Fortran dispõe de algumas
formas de fazer a repetição de um bloco. No momento será apresentado a construção DO WHILE.
A construção DO WHILE permite a execução repetitiva de um bloco de instruções enquanto um dada condição
é satisfeita.
A forma de uma construção DO WHILE é:
DO WHILE(expr-lógica) . . . . boco-do-while . . . . END DO
onde:
expr-lógica → é uma expressão lógica que será avaliada em
verdadeira
ou
falsa
Exemplos:
k = 1
DO WHILE( k < 4) k = k + 1
print*,"k = ", k end do
Imprime:
k = 2 k = 3 k = 4
i = 0 x = -0.1
DO WHILE( sin(x) < cos(x) ) x = x + 0.1
i = i + 1
y = sin(x) + cos(x+0.03) print*,"i = ", i, "y = ", y end do
Imprime:
i = 1 y = 0.99955004 i = 2 y = 1.0913953 i = 3 y = 1.1723357 i = 4 y = 1.2415626 i = 5 y = 1.2983841 i = 6 y = 1.3422326 i = 7 y = 1.3726701 i = 8 y = 1.3893921 i = 9 y = 1.3922318
k = 20
DO WHILE( k < 4) k = k + 1
print*,"k = ", k end do
Esta construção DO WHILE não será executada, pois a condição k<4 com k = 20 sempre será falsa
19. Arquivo
Usualmente os dados fornecidos à um programa e/ou gerados por ele são preservados num arquivo, o que
possibilita que eles sejam reutilizados sempre que forem necessários.
open(unit=20, file="pontos.dados", status="new", action="write") . . .
write(unit=20, fmt=*) i, x . . .
close(unit=20)
As declarações de entrada e saída (
read e write), quando se referem a um arquivo em particular
(file="<nome-arquivo>"), utilizam o número da unidade (unit=<número>) especificada na declaração open. O
número utilizado usualmente é um número inteiro positivo (
entre 10 e 99).
Para o Fortran o usual é utilizar o número 6 (unit=6) para conectar o monitor do computador e o
número 5 (unit=5) para conectar o teclado. O fabricante do compilador Fortran pode utilizar
qualquer valor diferente destes para pré-conectar os dispositivos que julguem necessários ao
funcionamento do seu compilador. Usualmente o fabricante utiliza um número entre 0 e 9.
Por
segurança
, ao conectar uma unidade aos seus programas, utilize valores entre 10 e 99, porque
assim você muito provavelmente não sobrescreverá nenhuma unidade pré-conectada pelo
compilador e desta forma manterá o Fortran funcionando corretamente.
A declaração open [ open(unit=20, file="pontos.dados", status="new", action="write") ] escrita da
forma mostrada conecta o arquivo pontos.dados à unidade 20.
Depois de se conectar um arquivo, todas as vezes que a unidade (
no exemplo a unidade 20) for referida isto
significa que se está utilizando o arquivo indicado na declaração (pontos.dados).
É usual, na declaração open, utilizar o nome do arquivo, a unidade, o estado (
status
="new") e a ação
(
action
="write") que pode ser executada.
Minimamente é possível utilizar a declaração open assim: open(unit=, file="")
então: open(unit=20, file="arq.dados")
Declaração com mais atributos:
As opções são:
•
FORM=<exp-caracter>
exp-caracter pode ser um dos seguintes:
formatted
(valor
default – utilizado se não for indicado outro valor)unformatted
•
ACCESS=<exp-caracter>
exp-caracter pode ser um dos seguintes:
sequential (
default)
direct
•
STATUS =<exp-caracter>
exp-caracter pode ser um dos seguintes:
old
new
scratch
replace
unknown
(
default)
•
ACTION=<exp-caracter>
exp-caracter pode ser um dos seguintes:
read
write
readwrite (
default)
•
IOSTAT=<int-var>
int-var é uma variável inteira que é igual zero se o comando executou corretamente e um valor
positivo caso contrário
valor igual a
zero
– nenhum erro ocorreu
valor
positivo
– erro (
o valor indicará que tipo de erro ocorreu)
valor
negativo
– fim de arquivo encontrado não ocorreu erro
ou
fim de registro encontrado não ocorreu erro
Os valores tanto positivos quanto negativos são definidos pelo fabricante do compilador (
particulares do compilador), isto é, cada fabricante tem a liberdade de utilizar o valor que desejar para indicar
condições diferentes, mas obrigatoriamente os valores serão como indicados: positivos ou
negativos
•
POSITION=<exp-caracter>
exp-caracter pode ser um dos seguintes:
append (
vai para o final do arquivo)
rewind
(vai para o início do arquivo)
Observação:
dados de entrada/saída que serão usados (
escritos e lidos) com o mesmo compilador pode ser do tipo
não formatado (
unformatted). Isto economiza espaço em disco e elimina erro de arredondamento decorrente da
conversão dos dados da representação interna do computador para a representação formatada (
externa).
Atenção:
dados não formatados devem ser usado principalmente quando se deseja guardar os dados
temporariamente (
número muito grande de dados) para uso posterior pelo mesmo programa utilizando o
mesmo compilador (
geralmente no mesmo tipo de computador). Tirando esta situação, geralmente, não é
uma boa ideia usar dados não formatados em arquivos.
Evite o uso de arquivos não formatados !
Exemplos:
program ex_arq1
!--- !-- Exemplo de escrita
!-- AUTOR: Anibal L. Pereira 03/10/2010 !--- implicit none
integer:: n=6 real:: x=5.1
open(unit=20, file="arq.dados", status="new",& action="readwrite")
write(unit=20,fmt=*) n*x
close(unit=20)
end program ex_arq1
program ex_arq2
!--- !-- Exemplo de leitura
!-- AUTOR: Anibal L. Pereira 03/10/2010 !--- implicit none
real:: nx
open(unit=30, file="arq.dados", status="old",& action="readwrite")
read(unit=30,fmt=*) nx
print"(a,f6.1)", "nx = ", nx
close(unit=30)
end program ex_arq2
20. Cabeçalho
O preenchimento do cabeçalho é uma ação fundamental. O cabeçalho faz parte da documentação interna do
programa. Não deixe de escrever no cabeçalho os dados que atualizam sua identificação.
Esta tarefa não é opcional.
É obrigatória
.
Um cabeçalho terá informações significativas, tais como:
•nome da instituição
•
nome do programa
•
especificação do programa (
propósitos)
•
versão do programa
•identificação do autor
•
identificação dos colaboradores
•
data da criação do programa e suas atualizações
•descrição de como usá-lo
Entretanto, nossos programas disponibilizam informações mínimas (
propósito, nome do arquivo, autor, autores das revisões e respectivas datas), por isto os cabeçalhos que utilizamos são similares a:
!--- ! Propósito: Este programa lê 3 números e calcula a soma e a média deles !--- ! Arquivo: soma_e_media.f03 ! Autor: Anibal L. Pereira 11/06/2010 !Revisões: !---