Desde o início, os programas feitos até o momento utilizou uma entrada já estabelecida dentro do próprio programa através de uma variável. No entanto com o Fortran podemos atribuir valores à uma variável através do teclado ou então através de um arquivo. Isto é o que chamamos de input.
Após o processamento dos dados pelo programa a saída pode ser basicamente de duas maneiras, uma pelo tela do computador ou então para um arquivo no formato ASCII ou binário armazenado no computador. Isto é o que chamamos de output.
Para ler algo e atribuir algum valor para uma variável utilizamos o comando read(*,*). O conteúdo entre parênteses tem como objetivo indicar de qual local será lido, teclado ou arquivo, indicado pelo primeiro asterisco e como será lido, com ou sem formato, indicado pelo segunda asterisco. Na presente forma do comando read o primeiro asterisco indica que será lido do teclado e o segundo asterisco indica que será lido no formato livre.
A variável que será atribuída pelo comando read deve estar coerente com a declaração de variáveis feitas no início do programa. Se for declarada uma variável real o número a ser lido será um número real, se for caracter então será lido um ou um conjunto de caracter. Faremos um programa parar exemplificar a entrada e saída de dados3.8.
! ! PROGRAMA PARA EXEMPLIFICAR I/O, SENDO A ENTRADA PELO TECLADO ! E A SAIDA PELA TELA DO COMPUTADOR ! program io1 implicit none ! real(kind=4) :: r_input,r_output integer :: i_input,i_output character(20) :: c_input,c_output ! write(*,*)'Digite um numero real:' read(*,*) r_input ! write(*,*)'Digite um numero inteiro:' read(*,*) i_input ! write(*,*)'Digite uma frase com ate 20 digitos:' read(*,*) c_input ! r_output = r_input i_output = i_input c_output = c_input ! write(*,*)'O que voce digitou como real foi:',r_output write(*,*)'O que voce digitou como inteiro foi:',i_output write(*,*)'O que voce digitou como frase foi:',c_output ! stop end program io1 !
No programa io1.f90 a saída poderia ser simplesmente as variáveis r_input, i_input e c_input, não teria a necessidade de utilizar as variáveis r_output, i_output e c_output.
As combinações de entrada e saída poderiam ser: (1) teclado-tela, (2) teclado-arquivo, (3) teclado-impressora, (4) arquivo-tela, (5) arquivo-impressora, (6) arquivo-arquivo e (7) programa-tela. Dessas possíveis combinações já utilizamos as combinações (1) e (7), as combinações que envolvem impressoras como output dificilmente iremos utilizá-las pois são poucas as vezes onde acertamos os output e deixamos como desejamos, é preferível verificar o arquivo antes de imprimir um trabalho. A combinação mais comum é a (6), pois geralmente montamos um arquivo de entrada, o programa irá processar as informações e depois o resultado será escrito em um arquivo de saída, fazendo com que a execução do trabalho seja mais rápido além da possibilidade de poder interagir com scripts construídos em bash.
Para exemplificar uma entrada e saída utilizando arquivos, utilizaremos o problema do cálculo do centro de massa de um sistema de partículas. Primeiramente criaremos um arquivo com o nome entrada.dat, com o joe, com o seguinte conteúdo abaixo, em que a primeira linha indica a coordenada ,
,
e massa
da partícula 1, ...e a quinta linha indica a coordenada
,
,
e massa
da partícula 5.
O programa será:
!
! PROGRAMA PARA CALCULAR O CENTRO DE MASSA
! COMPOSTA POR 5 PARTICULAS
!
! EXEMPLO DA UTILIZACAO DE VARIOS ARRAYS UNIDIMENSIONAIS
! E TAMBEM A ENTRADA COMO SENDO UM ARQUIVO E A SAIDA TAMBEM
! PARA UM ARQUIVO
!
program rcm2
implicit none
!
! DECLARACAO DE VARIAVEIS
real(kind=4), dimension(5) :: x, y, z, m
real(kind=4) :: xcm, ycm, zcm, mtotal
integer :: i, j, k, error_input, error_output
!
! ZERANDO AS VARIAVEIS
error_input = 0
error_output = 0
!
! ARQUIVO DE ENTRADA
open (UNIT=20, FILE='entrada.dat', STATUS='OLD', ACTION='READ', IOSTAT=error_input)
! ARQUIVO DE SAIDA
open (UNIT=21, FILE='saida.dat', STATUS='REPLACE', ACTION='WRITE', IOSTAT=error_output)
!
! CONDICAO QUE VERIFICA A ABERTURA DOS ARQUIVOS DE ENTRADA
if ( error_input /= 0 ) then
write(*,*)'PROBLEMA COM ARQUIVO DE ENTRADA !!! '
else
write(*,*)'ARQUIVO DE ENTRADA ABERTO COM SUCESSO !!!'
end if
! CONDICAO QUE VERIFICA A ABERTURA DOS ARQUIVOS DE SAIDA
if ( error_output /= 0 ) then
write(*,*)'PROBLEMA COM ARQUIVO DE SAIDA !!! '
else
write(*,*)'ARQUIVO DE SAIDA ABERTO COM SUCESSO !!!'
end if
!
! LENDO ARQUIVO DE ENTRADA, UNIDADE 20, NOME ENTRADA.DAT
do i=1,5
read(20,*) x(i),y(i),z(i),m(i)
end do
!
! ZERANDO AS VARIAVEIS
xcm = 0
ycm = 0
zcm = 0
mtotal = 0
!
! CALCULANDO O SOMATORIO DO CENTRO DE MASSA
do i=1, 5
xcm = xcm + (x(i) * m(i))
ycm = ycm + (y(i) * m(i))
zcm = zcm + (z(i) * m(i))
mtotal = mtotal + m(i)
end do
!
! CALCULANDO O CENTRO DE MASSA
xcm = xcm / mtotal
ycm = ycm / mtotal
zcm = zcm / mtotal
!
! ESCREVENDO PARA O ARQUIVO SAIDA.DAT, UNIDADE 21
write(21,*) xcm, ycm, zcm
!
close(20)
close(21)
!
stop
end program rcm2
!
Detalhes do programa: