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.