3.8 Especificações de Formato

Como foi visto na seção anterior (seção 3.7) utilizamos os comandos read e write. Da forma como foi apresentado, esses comandos leram ou escreveram no formato livre, ou seja, sem formato, no entanto é possível que esses comandos (read e write leiam e escrevam com um formato, por exemplo, um número real seja escrito com quantas casas decimais desejarmos.

O foco desse curso é basicamente trabalhar com números inteiros e reais e também com caracteres, assim direcionaremos as especificações de formato para os números, reais e inteiros, e também caracter. Outras formas de formatação para conversão de inteiros e decimais, para dados lógicos, binários e hexadecimais também são possíveis mas não o faremos aqui, assim seremos pragmáticos dentro do que se destina esse aprendizado de Fortran. Se em um futuro próximo seja necessário a utilização dos formatos que não será exposto aqui na apostila, nos livros apontados nas referências é possível ser encontrado, e com a base vista no decorrer do curso, seremos capaz de utilizá-los quando necessário.

Formatação de números inteiros, reais e caracteres.

Vamos exemplificar os tipos de formatação a partir de um programa.

!
! PROGRAMA PARA EXEMPLIFICAR OS TIPOS DE FORMATO
! PARA LEITURA E ESCRITA NO FORTRAN PARA NUMEROS
! INTEIROS E REAIS E TAMBEM PARA CARACTERES
!
program formato
implicit none
!
! DECLARACAO DE VARIAVEIS
real(kind=4) :: r_1,r_2
real(kind=8) :: r_3,r_4
integer :: i_1,i_2
character(10) :: c_1, c_2
!
! NUMEROS REAIS COM SIMPLES PRECISAO
r_1 = 3.55891; r_2 = 12345.67891011
!
! NUMEROS REAIS COM DUPLA PRECISAO
r_3 = 0.00056789d0; r_4 = 123456789.10111213d0
!
! NUMEROS INTEIROS
i_1 = 123456789; i_2 = 987
!
! VARIAVEL CARACTER
c_1 = 'abcdefghij'; c_2 = 'abcdefghijklmn'
!
! ESCREVENDO NA TELA
write(*,900) r_1,r_2
write(*,901) r_1,r_2
write(*,902) r_3,r_4
write(*,903) i_1,i_2
write(*,904) c_1,c_2
write(*,905) r_1,r_2,r_3,r_4,i_1,i_2,c_1,c_2
!
! FORMATOS
900 format(f10.3, 2x, f10.6)
901 format(e10.3, 2x, e10.5)
902 format(d10.4, 2x, d10.8)
903 format(i10, 2x, i4)
904 format(a10, 2x, a20)
905 format(f10.5,1x,f10.5,1x,d10.6,1x,d10.8,1x,i10,1x,i4,a10,1x,a12)
!
stop
end program formato
!

Se o programa compilar de primeira, ao executar o resultado que aparecerá na tela será:

[23:05][sjfsato@speed:~/Physics/FisComp_2_sem_2009/aulas/prog]
$ ./formato.x 
     3.559  **********
 0.356E+01  .12346E+05
0.5679D-03  **********
 123456789   987
abcdefghij            abcdefghij
   3.55891 ********** ********** **********  123456789  987abcdefghij
[23:05][sjfsato@speed:~/Physics/FisComp_2_sem_2009/aulas/prog]
$

Porque ao invés de mostrar os números o que apareceu foram vários asteriscos?

Iremos por partes, podemos perceber que o comando write está com números (900, 901, 902, 903, 904, 905) ao invés de asteriscos. Como sabemos o segundo asterisco do comando write significa que será escrito no formato livre. Ao colocarmos algum indicador, que deve ser um número inteiro com até 6 posições (por exemplo 999999), que são os números 900, 901, 902, 903, 904 e 905 estamos especificando algum tipo de formato. A instrução com o número dentro do comando write necessariamente informa ao compilador que existira uma linha com um número igual ao declarado com as informações do formato, isto é, no primeiro comando write informamos o número 900 então em alguma linha abaixo do comando write(*,900) existirá uma linha que inicia-se com o número 900.

Na linha que inicia-se com o número 900 indicamos o formato desejado e este formato irá aparecer na tela ou então em um arquivo, percebe-se que após o número 900 aparecerá a declaração de formato format e em seguida o formato propriamente dito, por exemplo, f10.3. Estes formatos tem os seguinte significados:

Para responder a questão inicial porque apareceram os asteriscos ao invés de números, levamos em conta que agora formatamos os números e estamos “mandando imprimir números que estão fora do que foi formatado.