Formatação de Entrada e Saída

enter image description here

Vimos a possibilidade de ler dados via teclado usando o comando read * e mostrar saídas no display usando o comando print *. Estas formas de entrada/saída são conhecidas na literatura no formato livre de entrada/saída e chamada de lista de entrada/saída direta.

As três formas permitidas para escrever os comandos de entrada/saída (leitura/escrita), no formato livre de código fonte, são as seguintes:

read(*,*) item1, item2, item3...
print *, item1, item2, item3
write(*,*) item1, item2, item3...

Contudo, a entrada/saída formatada permite mais flexibilidade sobre a transferência de dados.

Entrada e saída formatadas

Sintaxe:

read(*,fmt), lista-de-variáveis 
print fmt, lista-de-variáveis
write(*,fmt), lista-de-variáveis 

em que:
fmt é a especificação do formato (até o momento tínhamos usado o formato padrão * definido pelo compilador)
lista-de-variáveis é a lista das variáveis a serem lidas do teclado ou escritas na tela, se houver mais de uma devem ser separadas por vírgula ,.

Especificação de formato define a maneira pela qual os dados formatado é exibido. É constituída por um conjunto, contendo uma lista de descritores de formato entre parênteses.

Um descritor de formato especifíca o formato exato, por exemplo, a largura dígitos depois do ponto decimal, quantos caracteres e números são exibidos, etc.

Exemplo:

print "(f6.3)", pi

Resuminho:

  • Os formatos servem para que os dados sejam impressos ou lidos de uma forma especifica, determinado pelo programador.
  • Os formatos são compostos por uma seqüência de especificações que determinarão como os dados serão processados.
  • Cada uma dessas especificações devem vir separadas por vírgulas. Pode-se ainda imprimir constantes numéricas e alfanuméricas, sendo que esta ultima deve vir entre apóstrofos ‘ ‘.
  • O uso do * no lugar do formato indica que todos os dados serão impressão de forma livre, com o número de casas especificados pelo próprio compilador. É um recurso útil para se evitar erros.

NOTA O Fortran não considera a primeira coluna da unidade de leitura e impressão quando a saída ou entrada é formatada, por isso deve-se incluir uma casa de impressão a mais para dados. Para formato livre não é necessário pois o Fortran os posiciona automaticamente.

Quando mais de um dado usar a mesma especificação de formato, há duas formas para escrever as especificações:

  1. nespecificação1, n2especificação2, …
  2. n(especificação1, especificação2, …)

— em que n e n2 representam o número de vezes que a seqüência deve se repetir, ou seja número de elementos da lista-de-variáveis.

hans mostre um exemplo aqui

Caso o número de especificações seja menor que o de variáveis a serem lidos ou impressos, a ultima especificação ou a ultima seqüência, caso seja usado o recurso n(especificação1, especificação2, …), será repetida até que se complete o número necessário.

NOTA — Isto não é valido para constantes.

Quando o número de especificações é maior que os de dados a serem impressos as ultimas serão desprezadas.

A forma de se declarar (sintaxe) os formatos é a seguinte:

r format(especificação1, especificação2, ...)

em que r é um numero inteiro, e representa o rótulo do comando format.

Um mesmo format pode ser usado por vários comandos de escrita e leitura.

O formato pode vir entre apóstrofos e parênteses ‘(esp.1, esp2,..)’, dentro do próprio comando de impressão ou leitura.

print '(esp.)', var1
write(*, '(esp.1,esp.2)') var1,var2
read(*, '(esp.1,esp.2)') var1,var2

NOTA — Strings (Character – contantes literais) devem vir entre apóstrofos duplos nessa forma, ex: '(f6.3,1x,"a3")'

Atenção no texto seguinte, tenha em mente que um “especificador” é formado por descritores e símbolos, os quais serão explicados nas Tabela 1 e Tabela 2.

Tabela 1 – Descritores de formato

DESCRITOR DESCRIÇÃO EXEMPLO
I * Usado para entrada/saída do tipo Inteiro.
* Toma a forma rIw.m em que o significado de r, w e m estão explicados na Tabela 2.
* Valores Inteiros são justificados à direita em seus campos (campo = espaço reservado para tipos de valores, geralmente 8).
* Se o tamanho do campo não for largo o suficiente para acomodar o número inteiro, todo o campo será preenchido pelo caractere asterisco *.
print "(3i5)", i, j, k
F * Usado para entrada/saída do tipo Real.
* Toma a forma rFw.d em que o significado der, w e d estão explicados na Tabela 2. Valores reais são justificado à direita.
* Se o campo não for largo o suficiente para acomodar o número real, então será preenchido por caractere asterísco *.
print "(f12.3)", pi
E * Usado para entrada/saída do tipo Real na notação exponencial.
* Toma a forma rEw.d em que o significado de r, w e d estão explicados na Tabela 2. Valores reais são justificado à direita.
* Se o campo não for largo o suficiente para acomodar o número real, então será preenchido por caractere asterísco *.
* NOTA: Para escrever um número real com três casas decimais o tamanho do campo (largura) deve ser no mínimo 10. Um (1) para o sinal da mantissa, dois (2) para o zero, quatro (4) para a mantissa e dois (2) para o expoente. Um fórmula geral é w ≥ d + 7.
print “(e10.3)”,123456.0 resulta em: 0.123e+06
ES * Usado para entrada/saída do tipo Real na notação científica.
* Toma a forma rESw.d em que o significado de r, w e d estão explicados na Tabela 2. O descritor E anterior difere um pouco da tradicional forma conhecida por notação científica.
* A notação científica ES tem a mantissa no intervalo de 1.0 até 10.0, diferentemente do descritor E que tem a mantissa no intervalor de 0.1 até 1.0. Valores reais são justificado à direita. Se o campo não for largo o suficiente para acomodar o número real, então será preenchido por caractere asterísco *. Nesse formato o tamanho do campo também deve satisfazer a expressão w ≥ d + 7
print "(es10.3)",123456.0 resulta em: 1.235e+05
A * Usado para entrada/saída do tipo caractere.
* Toma a forma rAw em que o significados de r e w são dados na Tabela 2.
* Caracteres são justificado à direita em seus campos.
* Se o campo não for largo o suficiente para acomodar o conjunto de caracteres string, então o campo será preenchido pelos primeiros w caracteres da string.
print "(a10)", str
X * Usado para entrada/saída de espaço em branco. toma a forma nX em que n é o número de espaços desejado. print "(5x, a10)", str
/ * Descritor barra (Slash descriptor) – usado para inserir uma linha em branco.
* Toma a forma / e força a próxima entrada/saída de dados acontecer em uma nova linha.
print "(/,5x, a10)", str

Tabela 2 – símbolos usados com os decritores de formato

Simbolo Descrição
c Número da coluna
d Número de dígitos à direita da parte decimal para entradas/saída do tipo Real
m Número mínimo de dígitos a ser exibido
n Número de espaços para pular
r Contador de repetição – o número de vezes para usar um descritor ou grupo de descritores de formato
w Tamanho do campo – número de caracteres para usar para entrada/saída

Exemplo:

program printPi
  pi = 3.141592653589793238 
  Print "(f6.3)", pi 
  Print "(f10.7)", pi
  Print "(f20.15)", pi
  Print "(e16.4)", pi/100
end program printPi

Quando esse código fonte for compilado e executado, produzirá o seguinte resultado:

3.142
3.1415927
3.141592741012573
0.3142E-01

Exemplo 2

program printName
implicit none

   character (len=15) :: first_name
   print *,' Digite seu primeiro nome' 
   print *,' Até 20 letras: '

   read *,first_name 
   print "(1x,a)",first_name

end program printName

Quando esse código fonte for compilado e executado, produzirá o seguinte resultado: (assumindo que o usuário digitou o nome Bartira)

Digite seu primeiro nome
Até 20 letras: 
Bartira 

Exemplo 3

program formattedPrint
implicit none

   real :: c = 1.2786456e-9, d = 0.1234567e3 
   integer :: n = 300789, k = 45, i = 2
   character (len=15) :: str="Tutorials Point"

   print "(i6)", k 
   print "(i6.3)", k 
   print "(3i10)", n, k, i 
   print "(i10,i3,i5)", n, k, i 
   print "(a15)",str 
   print "(f12.3)", d
   print "(e12.4)", c 
   print '(/,3x,"n = ",i6, 3x, "d = ",f7.4)', n, d

end program formattedPrint

Quando esse código fonte for compilado e executado, produzirá o seguinte resultado:

45
045
300789 45  2
300789 45  2
Tutorials Point
123.457
0.1279E-08

n = 300789 d = *******

Comando de Formato

O comando de formato format permite misturar e combinar formatação para tipos caracteres, inteiros e reais em uma única declaração. O exemplo a seguir mostra essa possibilidade:

program productDetails 
implicit none 

   character (len=15) :: name
   integer :: id 
   real :: weight
   name = 'Bolacha'
   id = 1
   weight = 1.24

   print *,'!234567890'
   print *,' Detalhes do produto são' 

   print 100
   100 format (7x,'Nome:', 7x, 'Id:', 1x, 'Peso:')

   print 200, name, id, weight 
   200 format(1x, a, 2x, i3, 2x, f5.2) 

end program productDetails

Quando esse código fonte for compilado e executado, produzirá o seguinte resultado:

!234567890
 Detalhes do produto são
       Nome:       Id: Peso:
 Bolacha            1   1.24

Mais referências:

Exemplo usado em aula no dia 24/05/2016


PF626