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: