Programação de Computadores
Viviane Torres da Silva
[email protected]
http://www.ic.uff.br/~viviane.silva/progIII
Leitura e escrita de arquivos
 Até agora vimos somente como ler dados do teclado (read *)
e escrever dados na tela (print *).
 Contudo, em algumas situações é desejado ler dados de
arquivos e escrever dados em arquivos
– Não é necessário digitar via teclado os dados a cada execução do
programa
– Os resultados do programa podem ser impressos ou enviados para
outras pessoas com mais facilidade
Leitura de arquivo
 Funciona com objetivo semelhante ao “read *”, mas faz a leitura de
um arquivo específico.
 O arquivo a ser lido tem que estar no mesmo diretório do arquivo
Fortran .f
Leitura de arquivo
 Comando:
OPEN (<identificador>,FILE=‘<nome do arquivo>’,
STATUS=’<status>’)
READ (<identificador>, *) <dados a serem lidos>
CLOSE (<identificador>)
 <identificador>: utilizado para identificar o arquivo no
comando de leitura. Evita que se tenha que escrever o nome
todo do arquivo.
 FILE= é obrigatório.
 <status>=NEW | OLD | SCRATCH | UNKNOWN (é opcional)
– New significa que é necessário criar o arquivo, Old que o arquivo já
existe (default), Scratch diz se o arquivo é temporário e Unknow que
não se sabe
 Close: não é necessário sempre fechar o arquivo, mas é um
boa política para permitir que outros tenham acesso.
Exemplo
program ex1
implicit none
integer num, pot
open(1, file='entrada.txt')
read(1,*) num, pot
print *, num, ' elevado a ', pot,
end
 Arquivo entrada.txt:
– 4
3
 Saída do programa:
– 4 elevado a 3 = 64
O arquivo de entrada.txt
tem que estar no mesmo
diretório que o arquivo
ex1.f
' = ', num ** pot
Exercício 1
 Suponha que o arquivo de entrada seja:
1 2 3
4
5
6 7
 Qual é o valor das variáveis nas leituras abaixo:
1.
read (7, *) A, B, C
A=1; B=2, C=3
2.
read (7, *) A, B, C, I, J
A=1; B=2; C=3; I=4; J=5
3.
read (7, *) A
read (7, *) B
read (7, *) C, I
A=1;
B=4;
C=5; I=6
program ex1
implicit none
integer A, B, C, I, J
open(1, file='entrada.txt')
C caso 1
C
read(1,*) A, B, C
C
print*, A, B, C
C caso 2
C
read(1,*) A, B, C, I, J
C
print*, A, B, C, I, J
C caso 3
read(1,*) A
read(1,*) B
read(1,*) C, I
print*, A, B, C, I
close(1)
end
Detalhes
 O nome do arquivo pode ser uma variável:
print *, 'entre o nome do arquivo:‘
read *, NAME
open(1, file=NAME)
 A leitura (usual) é sequencial, então é necessário ler todas as
posições anteriores a que você quer para poder chegar na
posição desejada.
read(1,*) (x(i), i=1,10)
OBS: Tem que saber a quantas informações estão presentes
no arquivo para poder definir o tamanho do vetor.
Exemplo
 Suponha que o arquivo de entrada seja:
1 2 3
4
5
6 7
 Qual é o valor das variáveis na leitura abaixo:
– read (7, *) (x(i), i=1, 7)
– x(1)=1; x(2)=2; x(3)=3; x(4)=4; x(5)=5; x(6)=6; x(7)=7;
Exercício 1
 Ler uma matriz 2 x 2 de um arquivo e escrever o seu
determinante na tela
 Arquivo matriz.txt:
1 2
3 4
 Saída do programa:
Determinante: -2
det = mat(1,1) * mat(2,2) - mat(1,2) * mat(2,1)
Lembrete:
 Lendo matriz 2x3:
 Lendo primeiro todas as colunas de uma linha
 Opção 1
do i=1,2
do j=1,3
read(1,*) (mat(i, j))
enddo
Enddo
 Opção 2
do i=1,2
read(1,*) ((mat(i, j), j = 1, 3))
endo
 Opção 3
read(1,*) ((mat(i, j), j = 1, 3), i=1,2)
program ex3
implicit none
integer i, j, det, mat(2,2)
open(1, file='matriz.txt')
C lê as colunas de uma linha primeiro e depois a próxima
linha
read(1,*) ((mat(i, j), j = 1, 2), i=1,2)
det = mat(1,1) * mat(2,2) - mat(1,2) * mat(2,1)
print *, 'Determinante: ', det
end
Exercício 2
 Suponha que um médico tem um arquivo onde armazena
informações sobre seus 3 pacientes. Os dados armazenados
no arquivo são: nomePaciente, peso, nívelColesterol,
nívelGlicose. Escreva um programa que ajude o médico a fazer
a seguinte consulta:
1. Nome dos pacientes com nível de colesterol acima de 120
2. Nome dos pacientes com nível de glicose acima de 100
3. Relatório sobre o paciente A
Exemplo arquivo de pacientes: paciente.txt
joao 70 100 120
maria 60 80 89
ana 120 200 250
Parte II
Escrita simples de arquivo
 Funciona com objetivo semelhante ao “print *”, mas faz a
escrita em um arquivo específico.
 Comando:
OPEN(<identificador>, FILE=‘<nome do arquivo>’)
WRITE(<identificador>, *) <dados a serem escritos>
CLOSE (<identificador>)
Exemplo
program ex2
implicit none
integer num, pot
open(1, file='entrada.txt')
read(1,*) num, pot
open(2, file='saida.txt')
write(2,*) num ** pot
end
 Arquivo entrada.txt:
4 3
 Arquivo saída.txt:
64
Exercício 1
 Suponha que um médico tem um arquivo onde armazena
informações sobre seus 3 pacientes. Os dados armazenados
no arquivo são: nomePaciente, peso, nívelColesterol,
nívelGlicose. Escreva um programa que gere os relatórios
abaixo em arquivos diferentes:
1. Nome dos pacientes com nível de glicose acima de 100 e com
peso acima de 100kg. Relatório contendo os nomes dos
pacientes, os níveis de glicose de cada um e seus pesos.
2. Nome dos pacientes com nível de glicose (>100) ou colesterol
alto (>120). Relatório com os nomes dos pacientes.
3. Relatório sobre o paciente A
Exercício 2
 Uma secretária possui duas listas cada uma com 3 nomes e
telefones de professores em dois arquivos de entrada (cada
nome está associado a somente 1 telefone). Crie uma terceira
lista de saída, guardando em um arquivo, que contenha a
compilação das duas listas sem repetir os nomes. Caso um
nome aparece em uma lista associada a um telefone e na
outra associada a outro telefone, associe os dois telefones ao
mesmo nome.
Lista 1
Lista 2
Lista de saída
Ana 1111-1111
João 2222-2222
Maria 3333-3333
Valeria 4444-4444
João 2222-2222
Maria 5555-5555
Ana 1111-1111
João 2222-2222
Maria 3333-3333 5555-5555
Valeria 4444-4444
Exercício 3
 Faça um programa onde o usuário forneça o nome de um
arquivo que contém uma lista de 10 número e produza como
saída em outro arquivo a lista ordenada. O nome do arquivo
de saída também deve ser fornecido pelo usuário.
Parte III
Modularização de programas
 Até agora o programa e seus subprogramas ficavam em um
único arquivo. Contudo, é possível organizar o programa de
forma que subprogramas correlatos fiquem em arquivos
separados.
 O comando INCLUDE permite incluir o código dos arquivos de
subprogramas no arquivo do programa principal.
Exemplo
Arquivo ex4.f
program ex4
implicit none
real media, pot
print *, media(4,5)
print *, pot(4,3)
end
include 'media.f‘
include 'pot.f'
Arquivo media.f
real function media(n1, n2)
implicit none
integer n1, n2
media = (n1 + n2) / 2.0
end
Arquivo pot.f
real function pot(n1, n2)
implicit none
integer n1, n2
pot = n1 ** n2
end
Exercício 1
 Faça uma calculadora que forneça as opções abaixo para o
usuário. Cada operação deve ser implementada em um
arquivo diferente.
Opções:
1.Somar
2.Subtrair
3.Multiplicar
4.Dividir
0. Sair do programa
Qual opção você deseja?
Exercício 2
 Uma locadora de veículos aluga automóveis para empresas. A
locadora possui dois arquivos de registros: um com o nome
das empresas que são (ou foram) seus clientes e o CNPJ, e
outro com o CNPJ da empresa, o tipo de veículo alugado e a
placa do veículo. As duas listas possuem 10 elementos.
 Faça um programa que gere como saída os relatórios abaixo.
Cada gerador de relatórios deve ser implementado em um
arquivo .f diferente
1. Nome das empresas que no momento não estão alugando
nenhum veículo
2. Placa de todos os veículos alugados por uma determinada
empresa cujo nome é fornecido pelo usuário
Exercício 3
 Faça um programa que leia um arquivo contendo uma lista de
10 alunos e a disciplina na qual cada aluno está matriculado
(caso um aluno esteja matriculado em mais de uma disciplina,
o seu nome aparecerá mais de uma vez na lista). Em outro
arquivo encontra-se a lista de 5 professores e a disciplina
lecionada por cada professor (cada professor só oferece uma
disciplina).
– Faça uma subrotina que informe o número de alunos matriculados em
uma dada disciplina.
– Faça uma função que retorne o número de alunos de um dado
professor
– Faça uma subrotina que informe o nome dos alunos que não estão
matriculados em na disciplina lecionado por um dado professor.
– Todos os subprogramas devem ser armazenados em um arquivo
diferente.
Download

Arquivos - Leitura e Escrita