Formatação de Entrada e Saída
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:
- nespecificação1, n2especificação2, …
- 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:
1234567 | 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