Escolar Documentos
Profissional Documentos
Cultura Documentos
CAP ITULO
2
Para reexo !! 41 42 42 43 45 46 48 52 Se um dia tiver que escolher entre o mundo e o amor... Lembre-se: Se escolher o mundo, car sem o amor, mas se escolher o amor, com ele conquistar o mundo!! Albert Einstein 1879 1955
2.1 INTRODUO
As entradas e sadas de dados em Fortran so realizadas pelas unidades lgicas. Uma unidade lgica : - um nmero inteiro no negativo associado a um dispositivo fsico tal como uma unidade de disco (HD, disquete, CD,...), teclado, monitor ou uma impressora. A unidade lgica conectada a um arquivo ou dispositivo pela instruo OPEN (ver Seo 2.4, na pg. 45), exceto nos casos dos arquivos pr-conectados. - um asterisco, *, indica o arquivo ou dispositivo padro (default), pr-conectado, de entrada e de sada, usualmente o teclado e a tela do monitor, respectivamente. Leia a nota da pgina 46. - uma varivel tipo CHARACTER corresponde ao nome de um arquivo interno.
42 ARQUIVO
O Fortran trata todos os dispositivos fsicos tais como unidades de discos, teclado, impressora, monitor ou arquivos internos como arquivo (le) ou arquivo externo. A estrutura do arquivo determinada pelos dados (formatados ou no), o tipo de acesso ao arquivo e espao (comprimento) para a informao. O Fortran fornece instrues e procedimentos para manipular dados por leitura e escrita, conhecidas por entradas e sadas de dados, inclusive com o uso de arquivos internos. Do ingls vem a denominao Input/Output, ou simplesmente I/O, para Entrada/Sada de dados. Entre as instrues disponveis veremos somente algumas, a saber: WRITE e READ, que so responsveis pela transferncia de dados, OPEN, que conecta as unidades lgicas aos arquivos e FORMAT, que fornece informaes explcitas de formato dos dados. O objetivo deste livro dar uma formao bsica, portanto no sero tratados assuntos relativos a tratamento de posicionamento interno num arquivo, tipos de arquivos, entre outros. Para um avano no estudo da linguagem Fortran, consulte as referncias bibliogrcas, na pg. 106.
43
ADVANCE=<modo> : argumento opcional, especica se a prxima sada (ou entrada) deve iniciar numa nova linha ou no. O padro (default), na ausncia do parmetro, <modo> =YES, ou seja, a nova sada avanar para uma nova posio ou nova linha. Adotando o argumento <modo> como NO no ocorrer avano para a nova linha ou posio de escrita. Uma aplicao pode ser vista na pg. 44, no exemplo da instruo READ. Vejamos o seguinte exemplo.
Programa 21: Exemplo de sada de dados
1 2 3 4 5 6 7 8 9 10
PROGRAM saida IMPLICIT NONE INTEGER :: a=10, b=20, c=135 WRITE(*,*) a OPEN(UNIT=10, FILE="saida1.txt") WRITE(10,*) b WRITE(10,200) c 200 FORMAT(I3) CLOSE(10) END PROGRAM saida
No primeiro WRITE, o contedo da varivel a ser escrito na tela do monitor e em formato livre. No segundo, o resultado armazenado na varivel b ser escrito no arquivo de nome saida1.txt, identicado pela unidade lgica 10, procedimento permitido pela instruo OPEN. J a outra sada de resultado, pela varivel c, tambm no arquivo anterior, mas formatada pela instruo FORMAT, localizada no programa pelo rtulo nmero 200, que neste caso instrui o compilador a imprimir um nmero (do tipo inteiro) com 3 algarismos. Como exemplo, o nmero 135 poder ser impresso ajustadamente no espao designado. Quando o nmero no couber nos espaos determinados pela formatao uma sequncia de asteriscos ser impressa no lugar do nmero ou da informao. A instruo CLOSE, que encerra a atividade da unidade 10, estudada na pg. 46.
44
[FMT=]<formato> : especica com que formato(s) a leitura dos dados realizada. Para instruir o compilador a ler numa formatao livre (ou lista-direta) utilizado o asterisco (*). Neste caso, a memria receber uma informao sem nenhum tipo de preocupao com a editorao da informao. Uma formatao diferente da livre obtida pela instruo FORMAT, que ser descrita na Seo 2.6 (na pg. 48). A palavra-chave FMT opcional e no utilizada na maioria dos programas.
O argumento ADVANCE apresentado na instruo WRITE tambm pode ser utilizado aqui, com o mesmo signicado. Vejamos um exemplo:
Programa 22: Exemplo de entrada de dados
1 2 3 4 5 6 7 8 9 10 11
PROGRAM leitura IMPLICIT NONE REAL :: a, b, c WRITE(*,*,ADVANCE="NO")"Digite um numero real: " READ(*,*) a OPEN(UNIT=20, FILE="dados1.txt") READ(20,*) b READ(20,50) c 50 FORMAT(F5.2) CLOSE(20) END PROGRAM leitura
No primeiro READ, o contedo da varivel a ser preenchido via teclado e em formato livre. Utilizar o teclado signica digitar uma informao, compatvel com o tipo da declarao da varivel, e na sequncia teclar <ENTER>3 . Observe que no WRITE aplicado o argumento ADVANCE, e a prxima instruo de leitura (ou de escrita) no avanar para a prxima linha. Assim, na sequncia, o cursor car posicionado ao lado da sada anterior aguardando a leitura da varivel a. No segundo READ, a varivel b receber um valor que est armazenado num arquivo de nome dados1.txt, identicado pela unidade lgica 20, anteriormente habilitada pela instruo OPEN. J a outra entrada de informao, pela varivel c, tambm oriunda do arquivo anterior, mas formatada pela instruo FORMAT, localizada no programa pelo rtulo nmero 50, que neste caso instrui o compilador a ler um nmero, do tipo real, com 5 espaos, sendo dois para as casas decimais aps a vrgula. Neste caso, o nmero 56.50 caber ajustadamente, pois tem 5 espaos (caracteres) e com duas casas decimais. Perceba que o ponto decimal faz parte da contagem dos espaos disponveis. Quando o nmero no couber nos espaos determinados pela formatao, o compilador arredondar o nmero, fazendo-o se ajustar na formatao determinada ou imprimir asteriscos.
3 Usaremos
45
CONSIDERAES ADICIONAIS SOBRE WRITE/READ 1) possvel ter mltiplas sadas e/ou entradas de dados, da seguinte forma: WRITE(*,*) a, c, resultado READ(*,*) b,g nas quais, as variveis (separadas por vrgulas) a, c e resultado fornecem sadas; e as variveis b e g recebem valores de entrada. 2) Para lermos uma informao do tipo CHARACTER necessrio alterar a instruo de leitura da seguinte forma: READ(*,(A)) b em que o argumento (A) especica a leitura de caracter, exigindo assim a declarao da varivel b como segue CHARACTER :: b ou, por exemplo CHARACTER(LEN=3) :: b Nesta ltima declarao, a varivel armazenar um caracter de comprimento igual at 3 unidades.
46
STATUS=<estado> : um argumento opcional e fornece o estado do arquivo, e <estado> pode ser: a) OLD : o arquivo j existe, b) NEW : o arquivo no existe, e ser criado, c) REPLACE : um novo arquivo ser aberto. Se o arquivo j existe os dados sero apagados, para ser re-utilizado, d) STRATCH : o arquivo ser criado temporariamente, e aps o uso ser eliminado. Neste caso o argumento FILE no pode ser especicado, isto , o arquivo no ter nome. e) UNKNOWN : desconhecido. Este o argumento padro por denio (default), na ausncia do STATUS. Exemplos: OPEN(UNIT=10, FILE="resultados.txt", STATUS="NEW") OPEN(UNIT=20, FILE="dados1.txt", STATUS="OLD") OPEN(50, FILE=entrada1.txt) No primeiro exemplo, uma unidade lgica com o nmero 10 criada e cuja unidade fsica (ou arquivo) de nome resultados.txt conter e/ou estar habilitado para armazenar valores. Perceba que um arquivo novo, ou seja, ele ser criado na execuo do programa. Caso o arquivo interno j exista, o compilador retornar uma mensagem de erro, e encerrar a execuo. No segundo exemplo, a unidade lgica ser de nmero 20 e o arquivo dados1.txt existente, caso contrrio o compilador acusar um erro de inexistncia do arquivo interno. No ltimo caso, a unidade lgica a 50 e o arquivo entrada1.txt, mas observe que a palavrachave UNIT foi omitida, bem como o status e, portanto, considerado como desconhecido.
AS UNIDADES PR-CONECTADAS
Foi mencionado que a numerao adotada para a unidade lgica no pode ser qualquer. Os compiladores designam nmeros inteiros para as suas unidades lgicas padro, chamadas de Unidades de Entrada/Sada Pr-conectadas. Por exemplo, a unidade lgica 5 est conectada ao dispositivo padro de entrada, usualmente o teclado, e a unidade 6 para o dispositivo de sada, usualmente a tela do monitor. Assim, nas instrues de entrada/sada de dados o asterisco representa estas unidades
47
do seu arquivo externo. Ou seja, fecha o acesso ao arquivo e libera o nmero da unidade lgica de I/O associada a ela. A sintaxe : CLOSE([UNIT=]<nmero>) em que: <nmero> : o nmero da unidade lgica denida no argumento UNIT da instruo OPEN. Podemos fechar vrios arquivos simultaneamente, bastando para isso informar as unidades separadas por vrgulas. Exemplos: CLOSE(10,12,20) CLOSE(UNIT=11) CLOSE(50) Observe que no primeiro exemplo a instruo CLOSE encerra simultaneamente 3 unidades lgicas. Outro ponto importante que a palavra-chave UNIT opcional e s foi utilizada no segundo exemplo. Para a instruo OPEN h outros argumentos, que no sero tratados aqui, e aconselhvel veric-los nos livros indicados nas referncias bibliogrcas, na pg. 106. Exemplos resolvidos:
1) Escreva um programa em Fortran 95 que leia um valor inteiro via dispositivo padro, multiplique-o por dez e escreva o resultado em um arquivo com nome saida1.txt. Soluo: Adotaremos como unidade de sada a 50, e as variveis a e b, respectivamente, para entrada e sada de dados. Assim, o cdigo abaixo resolve o nosso problema. Digite-o, compile-o e execute-o. 2) Escreva um programa em Fortran 95 que leia um valor inteiro armazenado num arquivo de nome saida1.txt (do exemplo anterior), multiplique-o por mil e escreva o resultado em um arquivo com nome saida2.txt. Soluo: Adotaremos como unidade de entrada a 60 e a de sada a 61 e, as variveis a e b, respectivamente, para entrada e sada de dados. Devemos lembrar que o arquivo de leitura j existe e, portanto, o argumento STATUS ter como parmetro OLD. O cdigo abaixo resolve o problema. Digite-o, compile-o e execute-o. Observe o uso da instruo & para quebra de linha no Fortran.
Programa 23:
PROGRAM open1 IMPLICIT NONE INTEGER :: a,b OPEN(UNIT=50,FILE="saida1.txt") WRITE(*,*)"Digite um no. inteiro" READ(*,*) a b = a*10 WRITE(50,*)b CLOSE(50) END PROGRAM open1
Programa 24:
PROGRAM open2 IMPLICIT NONE INTEGER :: a,b OPEN(UNIT=60,FILE="saida1.txt",& & STATUS="OLD") OPEN(61,FILE="saida2.txt") READ(60,*) a b = a*1000 WRITE(61,*)b CLOSE(60) CLOSE(61) END PROGRAM open2
48
Podemos atribuir unidade lgica uma varivel, conforme o exemplo abaixo, no qual a varivel ue, cujo valor inteiro informado pelo usurio, substitui o inteiro no argumento UNIT dos exemplos acima.
Programa 25: Exemplo do uso de unidades lgicas
1 2 3 4 5 6 7 8 9 10 11 12 13
PROGRAM unidade1 IMPLICIT NONE INTEGER :: a,b,ue WRITE(*,*)"Digite um numero inteiro:" READ(*,*) a b = a*10 WRITE(*,*)"Informe o numero (>8) da unidade logica & &de saida:" READ(*,*) ue OPEN(UNIT=ue,FILE="saida1.txt") WRITE(ue,*)b CLOSE(ue) END PROGRAM unidade1
49
OS CDIGOS-CHAVE Existe mais de uma dzia de espcies de formatao (cdigos-chave) em Fortran 95, mas usaremos somente alguns, descrito na tabela 2.1. Para auxiliar na compreenso da tabela temos que: w: a largura do campo (nmero de dgitos) destinado ao referido dado. A largura do campo (w) inclui o nmero total de posies, inclusive o sinal e o ponto decimal da mantissa, o smbolo E, o sinal (de + ou de ) e os dois dgitos do expoente (ou os dgitos determinados para o expoente, e).; corresponde aos dgitos aps o ponto decimal espao (casas decimais da mantissa); os dgitos do expoente E; signica o nmero de vezes que a formatao ser utilizada, ou seja, indica uma repetio. Por exemplo, no caso de 3A8, signica que sero impressos ou lidos 3 variveis do tipo CHARACTER de tamanho igual a 8 cada. Tabela 2.1 Descrio de algumas formataes utilizadas na instruo FORMAT. Cdigo-chave nAw nIw nFw.d Signicado Interpreta os prximos w caracteres como um conjunto de caracteres (cdigo-chave A) de texto. Interpreta os prximos w dgitos como um nmero inteiro (cdigo-chave I). Interpreta os prximos w dgitos como um nmero real, numa notao sem potncia de dez (cdigo-chave E), com d casas aps o ponto decimal. Interpreta os prximos w dgitos como um nmero real, de preciso simples, numa notao com potncia de dez (cdigo-chave E), com d casas aps o ponto decimal. Interpreta os prximos w dgitos como um nmero real, de preciso simples, numa notao cientca de potncia de dez (cdigo-chave ES), com d casas aps o ponto decimal. Interpreta os prximos w dgitos como um nmero real, de preciso dupla, numa notao com potncia de dez (cdigo-chave D), com d casas aps o ponto decimal. Fornece n espaos horizontais (cdigo-chave X). o conhecido Tab: move a leitura/escrita para a coluna c, em que c o nmero da coluna.
d: e: n:
nEw.d[Ee]
nESw.d[Ee]
nDw.d[Ee]
nX Tc
Mais informaes sobre os tipos de formatao (cdigos-chave) podem ser obtidas nas referncias indicadas no nal do livro. Sempre que o tamanho da informao for menor que o espao reservado, a informao ser escrita justicada direita e sero acrescentados espaos em branco antes, para com-
50
pletar o espao reservado. Quando a sada sem formatao o que determinar o espao reservado ser a denio de preciso adotada. Por exemplo, um nmero inteiro de preciso simples ter 11 espaos reservados para a sada ou leitura, j includo o sinal. O sinal positivo (+) omitido. O TAMANHO DO PAPEL DE IMPRESSO Antes do computador enviar a informao para o dispositivo de sada, construdo uma imagem de cada linha. A memria do computador que contm esta imagem chamada de rea de armazenamento de dados temporrio (output buffer). A largura de cada linha igual a 133 caracteres, sendo o primeiro espao destinado ao caracter de controle, que veremos a seguir. Os demais 132 espaos so para armazenar a sada de dados. Assim, cada impresso ou sada de informaes dividida em pginas, de tamanho aproximadamente igual a 37,8 cm para a largura e 27,9 cm para a altura. Estas dimenses esto relacionadas com os formulrios contnuos muito utilizados at o nal do sculo passado. Cada pgina dividida em linhas, e cada linha em 132 colunas, com um caracter por coluna. Para estas medidas, e dependendo do nmero de linhas por polegada que a impressora imprime, correspondem entre 60 e 72 linhas. As margens superior e inferior equivalem aproxidamente a 1,27 cm. O CARACTER DE CONTROLE Este item muito importante na sada de dados pelo WRITE. O primeiro caracter da imagem, contida na rea de armazenamento de dados temporrio, conhecido como caracter de controle e especica o espaamento vertical da sada. A tabela 2.2 apresenta as possibilidades e as aes deste caracter de controle. Tabela 2.2 Caracteres de controle da sada formatada. Caracter de controle Ao 1 <espao> 0 + Avana para a prxima pgina (Nova pgina) Espaamento simples entre linhas Espaamento duplo entre linhas No h espaamento entre linhas. Sobrescreve (escreve em cima da) a linha anterior
Se qualquer outro caracter for utilizado como caracter de controle resultar em espaamento simples entre linhas, como se fosse usado o espao em branco (<espao>). Para evitar erros na sada, no esquea do caracter de controle. Por exemplo, a seguinte instruo de sada WRITE(*,100) a 100 FORMAT(I2) imprimir um valor numrico inteiro de duas posies. Esta a inteno. Vejamos dois possveis valores. Se for passado para a varivel a o valor 7, a sada ser exatamente 7, justicada a direita. Mas se for passado o valor 71 o resultado ser 1, porque o primeiro
51
caracter destinado ao de controle, neste caso o 7 e foi assumido como espao em branco, portanto o espaamento entre linhas ser simples. No caso anterior no ocorreu erro porque o primeiro caracter foi um espao em branco, j que o nmero tinha somente um algarismo. Ento muita ateno. Alguns exemplos de formatao so apresentados a seguir.
Programa 26: Exemplo do uso de formatos
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
PROGRAM format1 IMPLICIT NONE REAL :: a = 123.45, b = WRITE(*,100) a ! WRITE(*,200) a ! WRITE(*,300) a ! WRITE(*,400) a ! WRITE(*,500) a ! WRITE(*,600) a ! WRITE(*,700) a,b,c ! 100 FORMAT(0,E11.5) 200 FORMAT(0,F6.2) 300 FORMAT(1,E12.6) 400 FORMAT( ,E10.2) 500 FORMAT( ,E15.5E6) 600 FORMAT( ,ES10.2) 700 FORMAT(+,3ES10.2) END PROGRAM format1
6789.10, c = 0.000778
a a a a a a a saida: saida: saida: saida: saida: saida: saida: 0.12345E+03 123.45 0.123450E+03 0.12E+03 0.12345E+000003 1.23E+02 1.23E+02 6.79E+03
7.78E-04
Observe as sadas escritas como comentrio4 . Atente, especialmente para a segunda formatao, que exatamente o nmero original. As demais alteram a forma de escrever e no mudam o signicado matemtico da varivel a, a no ser nas ltimas que reduzem a preciso do valor. Na ltima, foram realizadas trs sadas com a mesma formatao, denida no FORMAT de rtulo 700. Nesta utilizada a formatao em notao cientca, e observe o caso do nmero 6789.10, que arredondado para se ajustar ao espao determinado e, no nmero 0.000778 os zeros so abandonados e ajustados no expoente da notao cientca. As duas primeiras sadas sairo na pgina corrente, com espaamento duplo entre linhas. Na terceira sada, o caracter de controle instrui que o resultado seja escrito numa pgina nova. Os demais sero escritos nesta mesma pgina com espaamento simples entre as linhas. A ltima sada sobrescrever a anterior. Mais informaes a respeito de formatao de sada/entrada de dados so obtidas nos livros sobre Fortran, citados nas referncias bibliogrcas, na pg. 106. Quando o nmero no se ajusta na formatao determinada, um conjunto de asteriscos impresso no lugar do nmero ou da expresso. Veja o exemplo abaixo.
4 Lembrete: um comentrio em Fortran inserido pela instruo ! (sinal de exclamao) antes da sentena que desejamos comentar. Pode aparecer em qualquer parte do programa.
52
PROGRAM format2 IMPLICIT NONE INTEGER :: a1 = 12345, a2 = 678 WRITE(*,100) a1 ! a saida: **** WRITE(*,100) a2 ! a saida: 678 100 FORMAT( ,I4) END PROGRAM format2
Na primeira sada os asteriscos substituiram o nmero 12345, porque o espao reservado para sua impresso menor que o tamanho (em espaos) do nmero. Na segunda sada uma coluna em branco foi acrescentada antes do nmero 678 para completar o nmero de casas da declarao formatada, j que ele menor que o espao reservado. Ou seja, sempre que o nmero for menor que o espao reservado, o nmero ser escrito justicado direita. As formataes podem ser utilizadas diretamente nas instrues READ e WRITE. Por exemplo, as seguintes instrues WRITE(*,100) a1, a2 READ(*,200) a3, a4 100 FORMAT( ,I3,2X,E10.2) 200 FORMAT(2I5) podem ser substitudas por WRITE(*,( ,I3,2X,E10.2)) a1, a2 READ(*,(2I5)) a3, a4
A vericao de aprendizado pela prtica com exerccios e com a soluo de problemas. altamente recomendvel que faa os exerccios a seguir, bem como os disponveis no site http://www.orengonline.com/fortran95/. Aps este treinamento estar apto a resolver problemas. As respostas e comentrios a respeito dos exerccios encontram-se no referido endereo eletrnico, em exerccios. E, para vericar se est pronto para resolver problemas, um conjunto deles est disponvel em problemas, tambm no site acima indicado.
EXERCCIOS
2.1) O que sair impresso nas seguintes instrues Fortran? Use a = 345 e b = 1.0020E6 e c = 1.0001E6 a) INTEGER :: a WRITE(*,100) a 100 FORMAT((1,a = , I4.1)
53
b) WRITE(*,( , ES12.6)) b c) WRITE(*,( ,O resultado da diferenca entre ,ES14.6, e , ES14.6, eh: , ES14.6)) b,a,b-a
2.2) Qual a largura (w) mnima necessria para imprimir um valor real num formato de notao com potncia de dez (E) e numa notao cientca de potncia de dez (ES) com 5 bits signicativos de preciso? 2.3) Escreva um programa que leia dois valores reais de preciso simples de um arquivo de nome entrada.txt e escreva a soma deles em um novo arquivo, j existente, de nome saida.txt. Use a instruo FORMAT para os valores. 2.4)