EDII03 [2012.1]  Manipulação de Arquivos em Pascal
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,632
On Slideshare
1,632
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
32
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Manipulação deArquivos em Pascal Estrutura de Dados IIUnida 3 de UFS - DCOMP - Prof. Kenia 1 Kodel
  • 2. Flores?O verbo educar é originário do latim e querdizer extrair de dentro. Logo, a educaçãonão se constitui em mero estabelecimento deinformações, mas sim de se trabalhar aspotencialidades do ser, a fim de quefloresçam. UFS - DCOMP - Prof. Kenia 2 Kodel
  • 3. O segredo é não correr atrás dasborboletas... É cuidar do jardimpara que elas venham até você. . Mário Quintana UFS - DCOMP - Prof. Kenia 3 Kodel
  • 4. ara implementar programa infantil para ordenação (alfabética) de palavras, que estrutura de dados você usaria? Por quê?UFS - DCOMP - Prof. Kenia 4 Kodel
  • 5. 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 5 Kodel
  • 6. 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. UFS - DCOMP - Prof. Kenia 6 Kodel
  • 7. Declaração Pascal de ArquivosDo 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. UFS - DCOMP - Prof. Kenia 7 Kodel
  • 8. Aplicação de ArquivosConsiderando, por exemplo, a necessidade de cadastrar os pacientes a serem atendidos por um médico; onde as Paaca sto dos da dos r da r dos consultas são marcadas com pa es, um array de r r cient egistos poder serusa ia do? antecedência de meses. UFS - DCOMP - Prof. Kenia 8 Kodel
  • 9. 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. UFS - DCOMP - Prof. Kenia 9 Kodel
  • 10. 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 ≡ Nome Convênio Fone Pago Retorno ... Maria BoaSaude 322 18,50 true N ≡ ArqPacientes UFS - DCOMP - Prof. Kenia 10 Kodel
  • 11. 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. UFS - DCOMP - Prof. Kenia 11 Kodel
  • 12. Associação a Nome ExternoAtravé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 UFS - DCOMP - Prof. Kenia 12 Kodel
  • 13. Associação a Nome ExternoExemplo: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. UFS - DCOMP - Prof. Kenia 13 Kodel
  • 14. 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 DrCuraTudoConsultas.dat’ UFS - DCOMP - Prof. Kenia 14 Kodel
  • 15. 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. UFS - DCOMP - Prof. Kenia 15 Kodel
  • 16. 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. UFS - DCOMP - Prof. Kenia 16 Kodel
  • 17. Abrindo Arquivosreset(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. UFS - DCOMP - Prof. Kenia 17 Kodel
  • 18. Abrindo Arquivosreset(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. UFS - DCOMP - Prof. Kenia 18 Kodel
  • 19. Abrindo Arquivosreset(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. UFS - DCOMP - Prof. Kenia 19 Kodel
  • 20. Abrindo Arquivosprocedure 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. UFS - DCOMP - Prof. Kenia 20 Kodel
  • 21. Abrindo Arquivosprocedure 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. UFS - DCOMP - Prof. Kenia 21 Kodel
  • 22. Abrindo Arquivosprocedure 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). UFS - DCOMP - Prof. Kenia 22 Kodel
  • 23. Fechando Arquivosclose(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. UFS - DCOMP - Prof. Kenia 23 Kodel
  • 24. Lendo e Gravando Dados em ArquivosPara 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. UFS - DCOMP - Prof. Kenia 24 Kodel
  • 25. Lendo e Gravando Dados em ArquivosPara 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. UFS - DCOMP - Prof. Kenia 25 Kodel
  • 26. Manipulando Arquivos 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. UFS - DCOMP - Prof. Kenia 26 Kodel
  • 27. Manipulando Arquivos 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. UFS - DCOMP - Prof. Kenia 27 Kodel
  • 28. Manipulando Arquivos 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. UFS - DCOMP - Prof. Kenia 28 Kodel
  • 29. Aplicando Arquivos 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. UFS - DCOMP - Prof. Kenia 29 Kodel
  • 30. ARQUIVOS aplicação Implementar programa de cadastro dos medicamentos de uma farmácia.UFS - DCOMP - Prof. Kenia 30 Kodel
  • 31. CADASTRO FARMÁCIA dadostype 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; UFS - DCOMP - Prof. Kenia 31 Kodel
  • 32. begin CadastroVazio:=false; CADASTRO FARMÁCIA assign(ArqFarma,Farmas.dat); {$I-} reset(ArqFarma); {$I+} principal 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. UFS - DCOMP - Prof. Kenia 32 Kodel
  • 33. CADASTRO FARMÁCIA principalprocedure 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; UFS - DCOMP - Prof. Kenia 33 Kodel
  • 34. procedure incluir;var CADASTRO FARMÁCIA R: char;begin inclusão 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; UFS - DCOMP - Prof. Kenia 34 Kodel
  • 35. 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; UFS - DCOMP - Prof. Kenia 35 Kodel
  • 36. procedure consultar; CADASTRO FARMÁCIAvar Remedio: Str20; consulta 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;
  • 37. 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; inua á endo ocaiza Porque cont rabuscamesmo j t l l do o el o desej do? ement a UFS - DCOMP - Prof. Kenia 37 Kodel
  • 38. ARQUIVOS aplicação Implementar procedimento de exclusão (lógica).UFS - DCOMP - Prof. Kenia 38 Kodel
  • 39. procedure incluir;var CADASTRO FARMÁCIA R: char;begin inclusão repeat clrscr; writeln(*** inclusao ***); j a pr ust r ocediment de o writeln; incl ã de for aev a us o ma it r with RegFarma do begin writeln(Nome: ); r â de da edund ncia dos. 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;
  • 40. ARQUIVOS aplicação Implementar procedimento de alteração (ajuste do estoque).UFS - DCOMP - Prof. Kenia 40 Kodel
  • 41. ARQUIVOS aplicação Analisando a situação problema, que outras alterações (edições) são provavelmente necessárias?UFS - DCOMP - Prof. Kenia 41 Kodel
  • 42. ARQUIVOS exercício Criar programa Pascal para manter as notas dos alunos da turma de Programação Imperativa: 3 notas (de 0 a 10).UFS - DCOMP - Prof. Kenia 42 Kodel
  • 43. ARQUIVOS exercícioCriar 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. UFS - DCOMP - Prof. Kenia 43 Kodel
  • 44. Propor situação problema cuja solução ótimarequer 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]. C uidando do jardim!!! UFS - DCOMP - Prof. Kenia 44 Kodel
  • 45. ARQUIVOS COMPLEMENTAR ESTUDOS:Fundamentos da Programação de Computadores Ana Fernanda Gomes Ascencio Edilene Aparecida Veneruchi de Campos Capítulo Arquivo 45 UFS - DCOMP - Prof. Kenia 45 Kodel