EDII03 [2012.1] Manipulação de Arquivos em Pascal

45
Manipulação de Arquivos em Pascal Estrutura de Dados II Unidade 3 1 UFS - DCOMP - Prof. Kenia Kodel

Transcript of EDII03 [2012.1] Manipulação de Arquivos em Pascal

Page 1: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Manipulação de Arquivos em PascalEstrutura de Dados II

Unidade 3 1UFS - DCOMP - Prof. Kenia

Kodel

Page 2: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

O verbo educar é originário do latim e quer dizer extrair de dentro. Logo, a educação não se constitui em mero estabelecimento de informações, mas sim de se trabalhar as potencialidades do ser, a fim de que floresçam.

Flores?Flores?

2UFS - DCOMP - Prof. Kenia Kodel

Page 3: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

O segredo é não correr atrás das

borboletas... É cuidar do jardim para que elas venham até

você..

Mário Quintana3UFS - DCOMP - Prof. Kenia

Kodel

Page 4: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

UFS - DCOMP - Prof. Kenia Kodel

4

Para implementar programa infantil

para ordenação (alfabética) de palavras, que

estrutura de dados você usaria? Por

quê?

Page 5: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Considerando a base de dados abaixo, referente à tabela de

preços de uma papelaria, que estrutura de dados você

usaria para mantê-la?

UFS - DCOMP - Prof. Kenia Kodel

55UFS - DCOMP - Prof. Kenia Kodel

Page 6: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Definição de Arquivos

Os arquivos são elementos de armazenamento de dados residentes em memória secundária, ou seja, memória não volátil.

Portanto são diferentes dos outros itens de armazenamento de dados (residentes na memória principal): registros, vetores, matrizes; os quais não preservam os dados neles depositados, após o término da execução dos programas que os definem.

6UFS - DCOMP - Prof. Kenia Kodel

Page 7: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Declaração Pascal de Arquivos

Do ponto de vista lógico, os arquivos são coleções de registros e são declarados:

var

<Nome>: file of <TipoRegistro>;

Onde:o Nome – nome do arquivo (interno);o TipoRegistro – tipo dos registros que

comporão o arquivo.

7UFS - DCOMP - Prof. Kenia Kodel

Page 8: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Aplicação de Arquivos

Considerando, por exemplo, a

necessidade de cadastrar os

pacientes a serem atendidos

por um médico; onde as

consultas são marcadas com

antecedência de meses.

Para cadastro dos dados dos

pacientes, um array de registros poderia ser usado?

8UFS - DCOMP - Prof. Kenia Kodel

Page 9: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Aplicação de ArquivosPossível solução:

type TpRegMed = record Nome: string[20]; Convenio, Fone: string[10]; Pago: real; Retorno: boolean; end;var ArqPacientes: file of TpRegMed;

Considerando a definição dada, nesta temos que ArqPacientes é um arquivo composto por registros formados por cinco campos: nome, convênio, fone, (valor) pago e retorno.

9UFS - DCOMP - Prof. Kenia Kodel

Page 10: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

type TpRegMed = record Nome: string[20]; Convenio, Fone: string[10]; Pago: real; Retorno: boolean; end;var ArqPacientes: file of TpRegMed;

0 ≡

1 ≡

2 ≡

3 ≡

4 ≡

5 ≡

6 ≡

7 ≡

...

N ≡

ArqPacientes

Nome Convênio Fone Pago Retorno

Maria BoaSaude 322 18,50 true

10UFS - DCOMP - Prof. Kenia Kodel

Page 11: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Associação a Nome Externo Para gerenciamento dos dados mantidos em

arquivos, são necessários comandos específicos; de manipulação de arquivos.

Um destes refere-se à associação a nome externo. O assign é o procedimento que possibilita a

associação do nome externo do arquivo ao seu nome lógico (interno).

Os arquivos são elementos que existem independente da existência do programa que o manipula. Portanto, apresentam nome externo, através do qual, por exemplo, outros programas os identificam.

11UFS - DCOMP - Prof. Kenia Kodel

Page 12: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Associação a Nome Externo

Através do nome externo o arquivo mantém-se disponível para outros programas.

assign(var <arqinterno>; <arqexterno>: string);

Onde: <arqinterno> é o nome lógico do arquivo,

nome interno <arqexterno> é o nome externo do arquivo

12UFS - DCOMP - Prof. Kenia Kodel

Page 13: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Associação a Nome Externo

Exemplo:assign(ArqPacientes,‘Consultas.dat’);

Com a execução do programa que manipula ArqPacientes, considerando os efeitos da instrução dada acima, o arquivo Consultas.dat externo, é associado ao arquivo interno ArqPacientes.

Mesmo após a conclusão do referido programa, o arquivo Consultas.dat existirá, preservando os dados neste mantidos.

13UFS - DCOMP - Prof. Kenia Kodel

Page 14: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Associação a Nome ExternoExemplo:

assign(ArqPacientes,‘C18nov08.dat’);...assign(ArqPacientes,‘C20nov08.dat’);

Um único arquivo lógico pode ser associado a diversos arquivos externos (um por vez), dependendo da situação problema a ser solucionada.

Antes da definição do nome externo do arquivo pode ser descrito o caminho de localização deste: ‘C:\Hospital DaSaude\ DrCuraTudo\Consultas.dat’

14UFS - DCOMP - Prof. Kenia Kodel

Page 15: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Abrindo Arquivos Para manipulação de dados mantidos em arquivos

é preciso abir estes (arquivos). Em Pascal há dois comandos para abrir arquivos:

reset(var <Arquivo>);rewrite(var <Arquivo>);

O reset é um procedimento útil para abrir arquivos já existentes. Preserva os dados mantidos neste.

Com o reset, caso o arquivo não exista, ocorre um erro de execução.

15UFS - DCOMP - Prof. Kenia Kodel

Page 16: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Abrindo Arquivos Como já dito, tem-se:

reset(var <Arquivo>);rewrite(var <Arquivo>);

As características do reset já foram vistas. O rewrite é um procedimento útil para

criar e abrir novos arquivos. Caso o arquivo já exista, o rewrite provoca

a perda dos dados mantidos neste.

16UFS - DCOMP - Prof. Kenia Kodel

Page 17: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

reset(ArqPacientes);

rewrite(ArqPacientes);

Na prática, se usamos apenas o reset para abrir os arquivos manipulados por um programa; na primeira vez que o usuário executar a aplicação, como o cadastro não existe, o reset provocaria erro de execução.

Abrindo Arquivos

17UFS - DCOMP - Prof. Kenia Kodel

Page 18: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

reset(ArqPacientes);rewrite(ArqPacientes);

E se usamos, na prática, apenas o rewrite, para abrir os arquivos manipulados por um programa; a primeira vez que o usuário executar a aplicação, como o cadastro não existe, o rewrite provoca a criação do arquivo; mas em todas as outras vezes, que o arquivo (cadastro) deve apenas ser aberto, o rewrite, provoca a perda dos dados.

Abrindo Arquivos

18UFS - DCOMP - Prof. Kenia Kodel

Page 19: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

reset(ArqPacientes);rewrite(ArqPacientes);

Precisamos então: sendo a primeira vez que o usuário está executando o programa (o cadastro ainda não existe), o rewrite deve ser usado para criar o arquivo. E, em todas as outras vezes (o cadastro já existe e deve ser preservado) usar o reset.

Abrindo Arquivos

19UFS - DCOMP - Prof. Kenia Kodel

Page 20: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

procedure AbrirArquivo(Arquivo: TipoArquivo; NomeArq: string);begin assign(Arquivo,NomeArq); {$I-} reset(Arquivo); {$I+} if IOResult <> 0 then rewrite(Arquivo);end;

Neste tenta-se abrir o arquivo com reset, presumindo que o Arquivo já exista.

Caso o arquivo não exista, com {$I-} é efetuado o desligamento da diretiva de compilação fazendo com que o erro não seja tratado através de mensagem ao usuário, mas que seja atribuído um código de erro à variável predefinida IOResult.

Abrindo Arquivos

20UFS - DCOMP - Prof. Kenia Kodel

Page 21: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

procedure AbrirArquivo(Arquivo: TipoArquivo; NomeArq: string);begin assign(Arquivo,NomeArq); {$I-} reset(Arquivo); {$I+} if IOResult <> 0 then rewrite(Arquivo);end; Se a IOResult for diferente de zero é porque houve erro

na tentativa de abrir o arquivo. Se houve erro é porque o arquivo não existia, então este deve ser criado – usando o rewrite.

Se a IOResult for igual a zero é porque não houve erro na tentativa de abrir o arquivo. Ou seja, o arquivo já existia e foi devidamente aberto com reset. Neste caso o rewrite não precisa ser usado.

Abrindo Arquivos

21UFS - DCOMP - Prof. Kenia Kodel

Page 22: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

procedure AbrirArquivo(Arquivo: TipoArquivo;

NomeArq: string);

begin

assign(Arquivo,NomeArq);

{$I-} reset(Arquivo); {$I+}

if IOResult <> 0 then

rewrite(Arquivo);

end; Importante destacar que a abertura de um arquivo requer

a associação prévia deste a um nome externo. Em aplicações que manipulam arquivo, a abertura deste

deve ser efetuada no início da aplicação, e uma única vez, não deve ser feita então, por exemplo, em laços (de operações).

Abrindo Arquivos

22UFS - DCOMP - Prof. Kenia Kodel

Page 23: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

close(var <Arquivo>);

Através do comando close é possível fechar um

arquivo. Vale esclarecer que a ausência do close não é

identificada nem no processo de compilação, nem

no de execução . Porém pode provocar danos nos

dados mantidos no arquivo. O processo de fechar um arquivo deve ser efetuada

ao final da manipulação deste e uma única vez.

Assim, também, não deve ser mantido em laços de

operações.

Fechando Arquivos

23UFS - DCOMP - Prof. Kenia Kodel

Page 24: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Para armazenamento, usar:

write(var <Arquivo>,<Registro>);

Para leitura, usar:

read(var <Arquivo>,var <Registro>);

Exemplo, a instrução write(Arq,R); provoca o armazenamento do registro R no arquivo Arq. Mas, resta esclarecer em que posição.

O read e o write são aplicados ao registro da posição corrente do arquivo.

Para gerenciamento de um arquivo é mantido um ponteiro numérico que indica a posição (corrente) do registro a ser manipulado.

Lendo e Gravando Dados em Arquivos

24UFS - DCOMP - Prof. Kenia Kodel

Page 25: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Para armazenamento, usar:

write(var <Arquivo>,<Registro>);

Para leitura, usar:

read(var <Arquivo>,var <Registro>);

• Inicialmente, logo após a abertura de um arquivo, o

ponteiro lógico é setado na posição zero deste.

• Havendo leituras (read) ou gravações (write), esta

operação é efetuada sobre o registros que encontra-

se na posição corrente e o apontador é atualizado em

uma posição.

Lendo e Gravando Dados em Arquivos

25UFS - DCOMP - Prof. Kenia Kodel

Page 26: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Em geral, no processo de inclusão de novos registros, estes devem ser adicionados ao final do arquivo, após o último registro. Para tanto, é útil a função eof.

eof(<Arquivo>):boolean;

eof é uma função que retorna true quando é encontrado o fim do arquivo.

Manipulando Arquivos

26UFS - DCOMP - Prof. Kenia Kodel

Page 27: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Caso seja necessário manipular um registro que encontra-se numa dada posição do arquivo, é útil procedimento seek.

seek(var <Arquivo>; <posição>: longint);

Considerando seek(Arq,50); o ponteiro é posicionado na posição 50 do arquivo Arq; então a próxima operação de leitura ou armazenamento será efetuada sobre o registro que se encontra nesta posição.

Manipulando Arquivos

27UFS - DCOMP - Prof. Kenia Kodel

Page 28: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Para identificar em que posição se encontra o

ponteiro de um arquivo há a função filepos.

filepos(<Arquivo>):longint;

E para identificar quantos registros compõem o

arquivo é útil a função filesize.

filesize(<Arquivo>): longint;

Vale esclarecer que o número de registros que

compõem um arquivo também é denominado

tamanho do arquivo.

Manipulando Arquivos

28UFS - DCOMP - Prof. Kenia Kodel

Page 29: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

Arquivos devem ser aplicados em aplicações

computacionais que manipulam dados que devem

ser mantidos permanentemente: agenda

telefônica, estoque, cadastros.

Vale considerar que a memória permanente tem

também grande capacidade de armazenamento de

dados, mas é lenta em relação à memória principal.

Aplicando Arquivos

29UFS - DCOMP - Prof. Kenia Kodel

Page 30: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

ARQUIVOSaplicação

Implementar programa de cadastro dos medicamentos de uma farmácia.

30UFS - DCOMP - Prof. Kenia Kodel

Page 31: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

dados

type Str20 = string[20]; TpReg = record Nome: Str20; Preco: real; Estoque: integer; {Quantidade em estoque} end;var ArqFarma: file of TpReg; RegFarma: TpReg;

Opcao: char; CadastroVazio, Existe: boolean; Pos: longint;

31UFS - DCOMP - Prof. Kenia Kodel

Page 32: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

principalbegin CadastroVazio:=false; assign(ArqFarma,'Farmas.dat'); {$I-} reset(ArqFarma); {$I+} if IOResult <> 0 then rewrite(ArqFarma); repeat clrscr; writeln('*** farma ***'); writeln; writeln(' 1 - incluir'); writeln(' 2 - excluir'); writeln(' 3 - editar estoque'); writeln(' 4 - consultar'); writeln(' 5 - listar todos'); writeln(' 6 - encerrar'); writeln; writeln('Opcao:'); repeat Opcao:=readkey; until Opcao in ['1','2','3','4','5','6']; if Opcao in ['2','3','4','5'] then

VerifiqueVazio(CadastroVazio); if not CadastroVazio then case Opcao of '1': incluir; '2': excluir; '3': alterar; '4': consultar; '5': listarTodos; end; until Opcao = '6'; close(ArqFarma); end. 32UFS - DCOMP - Prof. Kenia

Kodel

Page 33: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

principal

procedure VerifiqueVazio(var inicio: boolean);begin inicio:=false; if filesize(ArqFarma)=0 then begin inicio:=true; clrscr; writeln('impossivel realizar operação, cadastro vazio'); writeln('pressione qualquer tecla'); readln; end;end;

33UFS - DCOMP - Prof. Kenia Kodel

Page 34: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

inclusãoprocedure incluir;var R: char;begin repeat clrscr; writeln('*** inclusao ***'); writeln; with RegFarma do begin writeln('Nome: '); readln(Nome); writeln('Preco: '); readln(Preco); writeln('Estoque: '); readln(Estoque); end; seek(ArqFarma,filesize(ArqFarma)); write(ArqFarma,RegFarma); writeln; writeln('Deseja efetuar nova inclusao? S/N '); repeat R:=upcase(readkey); until (R='S') or (R='N'); until R='N';end; 34UFS - DCOMP - Prof. Kenia

Kodel

Page 35: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

consulta totalprocedure listarTodos;begin clrscr; writeln('*** lista todos ***'); writeln; writeln('Nome':20,'Preco':12,'Estoque':10); seek(ArqFarma,0); while not eof(ArqFarma) do begin read(ArqFarma,RegFarma); if RegFarma.Nome <> 'XXX' then with RegFarma do writeln(Nome:20,Preco:10:2,Estoque:10); end; writeln; writeln('pressione qualquer tecla'); readkey;end;

35UFS - DCOMP - Prof. Kenia Kodel

Page 36: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

consultaprocedure consultar;var Remedio: Str20; R: char;begin repeat clrscr; writeln('*** consulta ***'); writeln; writeln('Nome: '); readln(Remedio); localizar(Remedio,Existe,Pos); if Existe then with RegFarma do begin writeln('Nome: ',Nome); writeln('Preco: ',Preco); writeln('Estoque: ',Estoque); end else writeln('*** medicamento inexistente ***'); writeln; writeln('Deseja efetuar nova consulta? S/N '); repeat R:=upcase(readkey); until (R='S') or (R='N'); until R = 'N';end;

Page 37: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

consultaprocedure localizar(N: Str20; var Achou: boolean; var Posicao: longint);begin Achou:=false; Posicao:=-1; seek(ArqFarma,0); while not eof(ArqFarma) do begin read(ArqFarma,RegFarma); if RegFarma.Nome = N then begin Achou:=true; Posicao:=filepos(ArqFarma)-1; end; end;end; Por que continuar a busca mesmo já

tendo localizado o elemento desejado? Por que continuar a busca mesmo já

tendo localizado o elemento desejado?

37UFS - DCOMP - Prof. Kenia Kodel

Page 38: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

ARQUIVOSaplicação

38UFS - DCOMP - Prof. Kenia Kodel

Implementar

procedimento de

exclusão (lógica).

Page 39: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

CADASTRO FARMÁCIA

inclusãoprocedure incluir;var R: char;begin repeat clrscr; writeln('*** inclusao ***'); writeln; with RegFarma do begin writeln('Nome: '); readln(Nome); writeln('Preco: '); readln(Preco); writeln('Estoque: '); readln(Estoque); end; seek(ArqFarma,filesize(ArqFarma)); write(ArqFarma,RegFarma); writeln; writeln('Deseja efetuar nova inclusao? S/N '); repeat R:=upcase(readkey); until (R='S') or (R='N'); until R='N';end;

Ajustar procedimento de inclusão de forma a evitar

redundância de dados.

Ajustar procedimento de inclusão de forma a evitar

redundância de dados.

Page 40: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

ARQUIVOSaplicação

Implementar

procedimento de

alteração (ajuste

do estoque).

40UFS - DCOMP - Prof. Kenia Kodel

Page 41: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

ARQUIVOSaplicação

Analisando a situação problema, que outras alterações (edições) são provavelmente necessárias?

41UFS - DCOMP - Prof. Kenia Kodel

Page 42: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

ARQUIVOSexercício

Criar programa Pascal para manter as notas dos alunos da turma de Programação Imperativa: 3 notas (de 0 a 10).

42UFS - DCOMP - Prof. Kenia Kodel

Page 43: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

ARQUIVOSexercício

Criar trecho de código Pascal para manter o ranking de um jogo. Neste são mantidos nome do jogador e pontuação (o que também corresponde à entrada). Um nome não pode aparecer mais de uma vez no jogo. O ranking é composto por até 5 jogadores.

43UFS - DCOMP - Prof. Kenia Kodel

Page 44: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

UFS - DCOMP - Prof. Kenia Kodel

44

Propor situação problema cuja solução ótima requer a aplicação de arquivos de dados.

Construir programa correspondente.

Disponibilizar as operações de:

a) inclusão,

b)consulta total,

c) consulta por chave [lida].

Cuidando do

jardim!!!

Cuidando do

jardim!!!

Page 45: EDII03 [2012.1]  Manipulação de Arquivos em Pascal

ARQUIVOSCOMPLEMENTAR ESTUDOS:

Fundamentos da Programação de ComputadoresAna Fernanda Gomes Ascencio

Edilene Aparecida Veneruchi de Campos

Capítulo Arquivo45

45UFS - DCOMP - Prof. Kenia Kodel