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.