2. Flores?
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.
UFS - DCOMP - Prof. Kenia 2
Kodel
3. O segredo é não correr atrás das
borboletas... É cuidar do jardim
para 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 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.
UFS - DCOMP - Prof. Kenia 7
Kodel
8. Aplicação de Arquivos
Considerando, 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 Arquivos
Possí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 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
UFS - DCOMP - Prof. Kenia 12
Kodel
13. 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.
UFS - DCOMP - Prof. Kenia 13
Kodel
14. Associação a Nome Externo
Exemplo:
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 Arquivos
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.
UFS - DCOMP - Prof. Kenia 17
Kodel
18. Abrindo Arquivos
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.
UFS - DCOMP - Prof. Kenia 18
Kodel
19. Abrindo Arquivos
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.
UFS - DCOMP - Prof. Kenia 19
Kodel
20. Abrindo Arquivos
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.
UFS - DCOMP - Prof. Kenia 20
Kodel
21. Abrindo Arquivos
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.
UFS - DCOMP - Prof. Kenia 21
Kodel
22. Abrindo Arquivos
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).
UFS - DCOMP - Prof. Kenia 22
Kodel
23. Fechando Arquivos
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.
UFS - DCOMP - Prof. Kenia 23
Kodel
24. Lendo e Gravando Dados em Arquivos
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.
UFS - DCOMP - Prof. Kenia 24
Kodel
25. Lendo e Gravando Dados em Arquivos
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.
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
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;
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
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;
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 total
procedure 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ÁCIA
var
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
consulta
procedure 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í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.
UFS - DCOMP - Prof. Kenia 43
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].
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