CAPÍTULO 6: F90/6 – CONTROLE DE FORMATO PARA ENTRADA E SAÍDA DE DADOS

Nos capítulos anteriores os comandos de entrada e saída de dados, READ, PRINT e WRITE, foram apresentados na forma de formato livre, ou seja, não nos preocupávamos com a forma com a qual os dados lidos ou mostrados eram formatados, Sabíamos que, na entrada, os dados eram colocados em uma linha e separados um do outro por pelo menos um espaço em branco. Na saída, tínhamos a formatação padrão de:

-         12 caracteres para variável inteira;

-         14 caracteres para variável real; e

-         a variável de caracteres ocupava tantos caracteres quantos definidos pela especificação CHARACTER, na declaração.

Neste capítulo vamos introduzir os comandos READ e WRITE com formato para que agora tenhamos a opção de escolher exatamente a forma com a qual nossos dados serão lidos ou mostrados.

TIPOS DE FORMATOS de dados

Cada tipo de dado (variável ou constante) possui uma especificação de formato diferente.

 Nas especificações a seguir o que aparece entre colchetes ([...]) é opcional.

Dados Inteiros

Forma geral:     [r]Iw[.m]

r - fator de repetição (opcional);

I - indica que o formato é de um dado inteiro;

w – tamanho (número de posições) da área ocupada pelo dado, inclusive o sinal;

m – mínimo de dígitos a ser mostrados (opcional).

Exemplos de tamanhos mínimos de formatos para inteiros:

 

DADO DE ENTRADA

FORMATO DE ENTRADA

27

I2

-358

I4

-857341

I7

-2

I2

5

I1

Dados Reais

Os dados reais possuem 4 tipos de formatos:

-         Formato simples;

-         Formato exponencial;

-         Formato para engenharia; e

-         Formato científico.

Formato Simples:

Forma Geral :  [r]Fw.d

r - fator de repetição (opcional).

F - indica formato simples de variável real.

w - tamanho (número de posições) da área ocupada pelo dado; na leitura, é o somatório das posições ocupadas pelo sinal, pela parte inteira e pela fração decimal; e, na apresentação, é o somatório das posições ocupadas pelo sinal, pela parte inteira, pelo ponto decimal e pela fração decimal.

d - indica número de casas decimais do dado.

Exemplos:

 

DADO DE ENTRADA

FORMATO DE  ENTRADA

VALOR ARMAZENADO

FORMATO DE SAÍDA

VALOR DE SAÍDA

358

F3.2

3.58

F4.2

3.58

358

F3.1

35.8

F4.1

35.8

35.8

F4.1

35.8

F4.1

35.8

+358

F4.1

+35.8

F5.1

+35.8

358

F3.3

.358

F5.3

0.358

-358

F4.3

-.358

F6.3

-0.358

 

Formato Exponencial:

Forma Geral:   [r]Ew.d            ou        [r]Dw.d

r - fator de repetição (opcional).

E - indica formato exponencial para dado real de precisão simples.

D - indica formato exponencial para dado real de precisão dupla.

w - tamanho (número de posições) da área ocupada pelo dado; na leitura, é o somatório das posições ocupadas pelo sinal do número, parte decimal, letra E ou D, sinal do expoente e dois dígitos do expoente; na apresentação, é o somatório das posições ocupadas pelo sinal do número, 0 da parte inteira, ponto decimal, fração decimal, letra E ou D, sinal do expoente e dois dígitos do expoente

d - indica o número de casas decimais que tem o dado real.

Exemplo:

 

DADO DE ENTRADA

FORMATO DE ENTRADA

VALOR ARMAZENADO

FORMATO DE SAÍDA

VALOR DE SAÍDA

257E-27

E7.3

.257E-27

E9.3

0.257E-27

-28E+03

E7.2

-.28E03

E9.2

-0.28E+03

14232E-12

E9.3

.14232E–14

E12.5

0.14232E-14

0014232E-12

E11.7

.14232E-10

E12.5

0.14232E-10

 

Formato para Engenharia:

Forma Geral:   [r]EN.d

r - fator de repetição (opcional).

EN - indica o formato exponencial para dado real de utilização em engenharia. O expoente é sempre múltiplo de 3 para coincidir com as unidades de grandeza (Kilo, Mega, Giga, etc.).

w - tamanho (número de posições) da área ocupada pelo dado; na leitura, é o somatório das posições ocupadas pelo sinal do número, parte decimal, letra E, sinal do expoente e dois dígitos do expoente; na apresentação, é o somatório das posições ocupadas pelo sinal. do número, 0 da parte inteira, ponto decimal, fração decimal, letra E, sinal do expoente e dois dígitos do expoente.

d - indica o número de casas decimais que tem o dado real.

Por exemplo, para o programa:

PROGRAM TESTA_FORMATO_EN

   IMPLICIT NONE

   REAL :: W, X, Y, Z

   W = 5987.1

   X = 1,234

   Y = -0.3

   Z = .001

   WRITE (*, "(EN12.3)") W, X, Y, Z

   STOP

END PROGRAM TESTA_FORMATO_EN

Os resultados são mostrados na seguinte tabela:

 

VALOR DE INICIALIZAÇÃO

VALOR DE SAÍDA

5987.1

5.987E+03

1,234

1,234E+00

-0.3

-300.000E-03

.001

1.000E-03

 

Formato Científico:

Forma Geral:   [r]ES.d

r - fator de repetição (opcional)

ES - indica formato exponencial científico para dado real. Neste formato, o valor absoluto da mantissa é maior ou igual a 1 e menor que 10, com exceção de quando o valor de saída é 0

w - tamanho (número de posições) da área ocupada pelo dado; na leitura, é o somatório das posições ocupadas pelo sinal do número, parte decimal, letra E, sinal do expoente e dois dígitos do expoente; na apresentação, é o somatório das posições ocupadas pelo sinal. do número, 0 da parte inteira, ponto decimal, fração decimal, letra E, sinal do expoente e dois dígitos do expoente

d - indica o número de. casas decimais que tem o dado real

Por exemplo, para o programa anterior, utilizando o formato ES, teríamos os resultados que são mostrados na seguinte tabela:

 

VALOR DE INICIALIZAÇÃO

VALOR DE SAÍDA

5987.1

5.987E+03

1,234

1.234E+00

-0.3

-3.000E-01

.001

1.000E-03

Dados de Caracteres

Os dados de caracteres são alinhadas na área ocupada pelo dado da direita para a esquerda.

Forma Geral:    Aw

A - indica que a dado é uma cadeia de caracteres

w - indica o tamanho ocupado pelo dado

Exemplos:

 

CONTEÚDO DA VARIÁVEL

FORMATO MÍNIMO

VALOR DE SAÍDA

Rua Maria Paula 135

A19

Rua Maria Paula 135

Ana Luiza

A8

Ana Luiz

João Batista

A15

   João Batista

 

TIPOS DE FORMATOS DE POSICIONAMENTO

Além das especificações de formato de dados, existem também especificações para controle de posicionamento dos dados na linha de entrada ou saída:

/ - quando encontrada numa seqüência de especificação, causa uma salto para o próximo registro.

Tn - posiciona a leitura ou a apresentação do próximo dado, a partir da n-ésima posição do registro corrente.

TLn - posiciona o próximo dado, n posições à esquerda.

TRn - posiciona o próximo dado, n posições à direita.

nX – insere n brancos.

 

LEITURA DE VARIÁVEIS FORMATADAS

Forma Geral:

READ (*, “(lista-de-formatos)”) lista-de-variáveis

* - indica que a leitura será feita pelo dispositivo padrão de entrada

lista-de-formatos - seqüência de especificações de formatos para as variáveis que estão sendo lidas – um formato para cada variável.

lista-de-variáveis - seqüência de nomes de variáveis para as quais serão lidos os dados.

Exemplo: Leitura da matrícula, nome do aluno e três notas.

READ(*, “(I6, A20, 3F4.2)”) MATRIC, NOME, NOTAl, NOTA2, NOTA3

Entrada de dados:

Matrícu1a        - 000325

Nome              - Patrícia Pilar

Nota1              - 7.50

Nota2              - 10.00

Nota3              - 9.75

Linha de dados:

000325PatríciaÿPilarÿÿÿÿÿÿÿ7501000ÿ975

                   1                   2                   3               3

 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8  posições na linha

ÿ - espaço em branco

APRESENTAÇÃO DE VARIÁVEIS FORMATADAS

Antes de entrarmos na formatação de saída de dados vamos aprender como controlar o espacejamento entre as linhas que queremos mostrar.

A primeira posição numa linha de saída é reservada para o caractere de controle que define o espacejamento para aquela linha, o que nos leva a considerar a área útil de apresentação a partir da posição 2 da linha.

Para efetuar mudanças de linha utilizamos, como já foi visto, a barra (/). Cada barra inserida na lista de especificação de formatos produz naquele ponto, uma mudança de linha. Pode-se colocar, de acordo com a necessidade, qualquer número de barras.

Para posicionar numa linha de saída utilizamos os formatos já vistos: /, T, TL, TR e X.

Por exemplo, para mostrar as seguintes frases, ambas começando na posição 1 de apresentação:

UNIVERSIDADE FEDERAL DE CAMPINA GRANDE

DEPARTAMENTO DE SISTEMAS E COMPUTAÇÃO

pode ser utilizado o seguinte comando de saída:

WRITE(*, “(T2, A38, /, T2, A37)”) “UNIVERSIDADE FEDERAL &

      &DE CAMPINA GRANDE”, “DEPARTAMENTO DE SISTEMAS E &

      &COMPUTAÇÃO”

No WRITE anterior, cada T2 posiciona a saída na posição 1 de apresentação e a barra (/), produz uma mudança de linha antes da saída do próximo elemento.

IMPRESSÃO DE VARIÁVEIS FORMATADAS

Forma Geral:

WRITE (*, “(lista-de-formatos)”) lista-de-variáveis

* - indica que a saída será feita pelo dispositivo padrão de saída

lista-de-formatos - seqüência de especificações de formatos para as variáveis que estão sendo mostrada – um formato para cada variável.

lista-de-variáveis - seqüência de nomes de variáveis para as quais serão lidos os dados.

O comando PRINT também pode ser usado na apresentação formatada.

PRINT “(lista-de-formatos)”, lista-de-variáveis

 

Exemplo: Imprimir uma relação de alunos com matrícula e notas segundo o leiaute abaixo:

ÿÿMATRICULAÿÿÿÿNOME DO ALUNOÿÿÿÿÿÿÿNOTA1ÿÿÿNOTA2ÿÿÿNOTA3

  00004321     José da Silva        7.50   10.00    9.00

Programa:

 

PROGRAM TESTESAIDA

   IMPLICIT NONE

   INTEGER :: MATRIC, N, VEZES

   CHARACTER (LEN = 20) :: NOME

   REAL :: NOTA1, NOTA2, NOTA3

   WRITE (*, "(T2, A28, /)") "Informe o número de alunos:"

   READ (*, "(I2)") N

   WRITE (*, "(T1, A40)") "0000000001111111111222222222233333333334"

   WRITE (*, "(T1, A40, /)") "1234567890123456789012345678901234567890"

   DO VEZES = 1, N, 1

      READ (*, "(I8, A20, 3F4.2)") MATRIC, NOME, NOTA1, NOTA2, &

            &NOTA3

      WRITE (*, "(T4, A9, 4X, A13,7X, A5,3X, A5, 3X, A5)") &

          &"MATRICULA", "NOME DO ALUNO", "NOTA1", "NOTA2", "NOTA3"

      WRITE (*,"(T3, I9.8, 5X , A20, 2(F5.2 ,3X), F5.2, /)") &

             &MATRIC, NOME, NOTA1, NOTA2, NOTA3

   END DO

   STOP

END PROGRAM TESTESAIDA

Exemplo: Nova versão do programa anterior armazenando todos os dados de entrada em variáveis indexadas antes da apresentação:

 

PROGRAM TESTESAIDA2

   IMPLICIT NONE

   INTEGER :: MATRIC(100), N, I

   CHARACTER (LEN = 20) :: NOME(100)

   REAL :: NOTA1(100), NOTA2(100), NOTA3(100)

   WRITE (*, "(T2, A28, /)") "Informe o número de alunos:"

   READ (*, "(I2)") N

   WRITE (*, "(T2, A28, /)") "Informe os dados dos alunos:"

   WRITE (*, "(T1, A40)") "0000000001111111111222222222233333333334"

   WRITE (*, "(T1, A40, /)") "1234567890123456789012345678901234567890"

   DO I = 1, N, 1

      READ (*, "(I8, A20, 3F4.2)") MATRIC(I), NOME(I), NOTA1(I), NOTA2(I), &

            &NOTA3(I)

   END DO

   WRITE (*, "(T4, A9, 4X, A13,7X, A5,3X, A5, 3X, A5, /)") &

          &"MATRICULA", "NOME DO ALUNO", "NOTA1", "NOTA2", "NOTA3"

   DO I = 1, N, 1

      WRITE (*,"(T3, I9.8, 5X , A20, 2(F5.2 ,3X), F5.2)") &

             &MATRIC(I), NOME(I), NOTA1(I), NOTA2(I), NOTA3(I)

   END DO

   STOP

END PROGRAM TESTESAIDA2

Exemplo: Nova versão do programa anterior, agora,  lendo todos os dados de entrada de um arquivo em disco de nome “alunos.dat” criado por um editor de texto:

 

PROGRAM TESTESAIDA3

   IMPLICIT NONE

   INTEGER :: MATRIC, ERRO

   CHARACTER (LEN = 20) :: NOME

   REAL :: NOTA1, NOTA2, NOTA3

 

   OPEN (8, file='alunos.dat', status='OLD')

   WRITE (*, "(T4, A9, 4X, A13,7X, A5,3X, A5, 3X, A5, /)") "MATRICULA",&

          & "NOME DO ALUNO", "NOTA1", "NOTA2", "NOTA3"

   READ (8, "(I8, A20, 3F4.2)", iostat = ERRO) MATRIC, NOME, NOTA1, NOTA2, NOTA3

   DO WHILE (ERRO == 0)

      WRITE (*,"(T3, I9.8, 5X , A20, 2(F5.2 ,3X), F5.2)") MATRIC, NOME, NOTA1,&

             & NOTA2, NOTA3

      READ (8, "(I8, A20, 3F4.2)", iostat = ERRO) MATRIC, NOME, NOTA1, NOTA2,&

            & NOTA3

   END DO

   CLOSE (8)

   STOP

END PROGRAM TESTESAIDA3

Os dados de entrada do arquivo “alunos.dat”, organizado em linhas (registros), estão dispostos da seguinte maneira:

 
11111111Maria Jose da Silva 100009500925
22222222Joao da Mata        050008201000
33333333Marta Guedes        100008450750
44444444Maria Julia da Silva100009500925
55555555Joao Trigueiro      050008201000
66666666Marcos Costa Guedes 100008450750

Exemplo: Fazer um programa Fortran que leia a mostre a seguinte matriz:

A maior parte fracionária tem 3 dígitos, logo d = 3, na leitura e na apresentação e a maior parte inteira tem 3 dígitos, logo:

-         na leitura, w = 3+3 = 6 e assim, o formato será: F6.3

-         na apresentação, w = 3+3+1 (ponto decimal) = 7 e assim, o formato será: F7.3

Dados de entrada:

ÿ2ÿ3          (dimensões da matriz)

ÿ-5750-27300ÿ81200     (1a. linha da matriz)

ÿ37100ÿÿ1000ÿ-3257          (2a. linha da matriz)

Trecho do programa para a leitura da matriz:

! LEITURA DAS DIMENSÕES DA MATRIZ

WRITE(*, “(T2, A31, /)”) “Informe as dimensões da matriz”

READ(*, “(2I2)”) NLIN, NCOL

! LEITURA DA MATRIZ

WRITE(*, “(T2, A38, /)”) “Informe os dados da matriz, &

      &por linha:”

DO I = 1, NLIN, 1

   READ(*,”(3F6.3)”) (MAT(I, J), J = 1, NCOL, 1)

END DO

A apresentação da matriz deve ser feita de acordo com o seguinte leiaute:

ÿÿÿÿÿÿÿÿÿ***MATRIZ LIDA***

(salta uma linha)

ÿÿÿÿÿÿ-5.750ÿÿ-27.300ÿÿÿ81.200

ÿÿÿÿÿÿ37.100ÿÿÿÿl.000ÿÿÿ-3.257

O trecho de programa para apresentação deve ser:

! APRESENTAÇÃO DA MATRIZ

WRITE(*, “(T11, A17, /)”) “***MATRIZ LIDA***”

DO I = 1, NLIN, 1

   WRITE(*, “(T5, 3(2X, F7.3))”) &

         &(MAT(I, J),J = 1, NCOL, 1)

END DO

Note que a barra (/) na lista de especificações de formato do 1o. WRITE faz com que uma linha em branco seja deixada como foi pedido no leiaute do relatório.

O programa completo seria:

 

PROGRAM MATRIZFORMATADA
   IMPLICIT NONE
   INTEGER :: NLIN, NCOL, I, J
   REAL :: MAT(3, 3)
   ! LEITURA DAS DIMENSÕES DA MATRIZ
   WRITE(*, "(T2, A44, /)") "Informe as dimensões da matriz (maximo: 3x3)"
   READ(*, "(2I2)") NLIN, NCOL
   ! LEITURA DA MATRIZ
   WRITE(*, "(T2, A38, /)") "Informe os dados da matriz, &
         &por linha:"
   DO I = 1, NLIN, 1
      READ(*,"(3F6.3)") (MAT(I, J), J = 1, NCOL, 1)
   END DO
   ! APRESENTAÇÃO DA MATRIZ
   WRITE(*, "(T11,A17, /)") "***MATRIZ LIDA***"
   DO I = 1, NLIN, 1
      WRITE(*, "(T5, 3(2X, F7.3))") (MAT(I, J),J = 1, NCOL, 1)
   END DO
   STOP
END PROGRAM MATRIZFORMATADA