Upload
elaine-cecilia-gatto
View
388
Download
2
Embed Size (px)
DESCRIPTION
Algoritmos - Arquivos Parte 3
Citation preview
ARQUIVOSProf.ª Ms. Eng.ª Elaine Cecília GattoAlgoritmos e Estruturas de DadosEngenharia de ComputaçãoUniversidade Sagrado Coração
Pesquisar no arquivo - sequencial
iniciotipo pessoa = registrocaracter: nome;inteiro: fone;fimregistro;
tipo pessoal = arquivo composto de pessoa;pessoa: aux,pessoal: agenda;caracter: nomeprocurado;
abra(agenda);leia(nomeprocurado);
repitacopie(agenda, aux);avance(agenda);
até(aux.nome = nomeprocurado) ou (fda(agenda));
se(aux.nome = nomeprocurado)então escreva(aux.fone);senão escreva(“telefone
não registrado”);fimse;
feche(agenda);fim.
Pesquisar no arquivo - sequencial
iniciotipo pessoa = registrocaracter: nome;inteiro: fone;fimregistro;
tipo pessoal = arquivo composto de pessoa;pessoa: aux,pessoal: agenda;caracter: nomeprocurado;
abra(agenda);leia(nomeprocurado);
repitacopie(agenda, aux);avance(agenda);
até(aux.nome = nomeprocurado) ou (fda(agenda));
se(aux.nome = nomeprocurado)então escreva(aux.fone);senão escreva(“telefone
não registrado”);fimse;
feche(agenda);fim.
Não é possível apenas avançar pelos registros, uma vez que precisamos verificar se o conteúdo de cada um deles é o esperado, por isso se copia para um registro auxiliar cada um dos registros armazenados.
Alteração - sequencialiniciotipo pessoa = registro
caracter: nome;inteiro: fone;
fimregistro;tipo pessoal = arquivo composto de pessoa;pessoa: aux,pessoal: agenda;caracter: nomeprocuradointeiro: novofone;abra(agenda);leia(nomeprocurado);copie(agenda,aux);enquanto(aux.nome <> nomeprocurado) e (não fda(agenda)) faça
avance(agenda);
copie(agenda, aux);fimenquanto;se(aux.nome = nomeprocurado)então inicio
escreva(aux.nome, “possui fone”, aux.fone);
escreva(“novo telefone”);leia(novofone);aux.fona novofone;guarde(agenda, aux);
fim;senão escreva(“telefone não registrado!”);fimse;feche(agenda);fim.
Alteração - sequencialiniciotipo pessoa = registro
caracter: nome;inteiro: fone;
fimregistro;tipo pessoal = arquivo composto de pessoa;pessoa: aux,pessoal: agenda;caracter: nomeprocuradointeiro: novofone;abra(agenda);leia(nomeprocurado);copie(agenda,aux);enquanto(aux.nome <> nomeprocurado) e (não fda(agenda)) faça
avance(agenda);
copie(agenda, aux);fimenquanto;se(aux.nome = nomeprocurado)então inicio
escreva(aux.nome, “possui fone”, aux.fone);
escreva(“novo telefone”);leia(novofone);aux.fona novofone;guarde(agenda, aux);
fim;senão escreva(“telefone não registrado!”);fimse;feche(agenda);fim.
É preciso ter o cuidado de não avançar a posição corrente depois de ter sido encontrado o registro, pois temos, após a atualização, de regravá-lo na mesma posição.
Exclusão - sequencialiniciotipo pessoa = registro
caracter: nome;inteiro: fone;
fimregistro;tipo pessoal = arquivo composto de pessoa;pessoa: aux,pessoal: agenda;caracter: nomeprocurado, confirmacao;abra(agenda);leia(nomeprocurado);repita
copie(agenda, aux);avance(agenda);
até(aux.nome = nomeprocurado) ou (fda(agenda));
se(aux.nome = nomeprocurado)então inicio
escreva(aux.nome, aux.fone);escreva(“confirma exclusão
(s/n) ?”);leia(confirmacao);se confirmacao = “s”então elimine(agenda);fimse;
fim;senão escreva(“nome não
encontrado”);fimse;
feche(agenda);fim.
Exclusão - sequencialiniciotipo pessoa = registro
caracter: nome;inteiro: fone;
fimregistro;tipo pessoal = arquivo composto de pessoa;pessoa: aux,pessoal: agenda;caracter: nomeprocurado, confirmacao;abra(agenda);leia(nomeprocurado);repita
copie(agenda, aux);avance(agenda);
até(aux.nome = nomeprocurado) ou (fda(agenda));
se(aux.nome = nomeprocurado)então inicio
escreva(aux.nome, aux.fone);escreva(“confirma exclusão
(s/n) ?”);leia(confirmacao);se confirmacao = “s”então elimine(agenda);fimse;
fim;senão escreva(“nome não
encontrado”);fimse;
feche(agenda);fim.
É importante certificar-se de que a posição corrente no arquivo é a correta, apresentando os dados que nela constam;
Sempre é recomendável solicitar uma confirmação para uma operação de exclusão, porque depois de executa não haverá mais volta
RANDÔMICO• É quando a circusntância de armazenamento que perfaz o
algoritmo é a da localização do registro dentro do arquivo ficar diretamente relacionada a uma informação constituinte desse arquivo.
• Através de um dos campos do registro podemos determinar o lugar onde ele está guardado, podendo acessá-lo de modo instantaneo.
• Podemos acessar um registro específico diretamente, sem nos preocuparmos com seus antecessores, utilizando nesse acesso o mesmo campo que determinou sua posição no arquivo no instante da gravação.
RANDÔMICO• O campo que determina a posição do registro no arquivo é
denominado CHAVE, pois é a informação capaz de acessar o registro.
• A CHAVE determinada no algoritmo deve ser única, pois nunca podemos armazenar dois registros diferentes em uma mesma localização.
• Em um arquivo randômico os arquivos não ficam localizados na ordem em que são gravados.
• Cada registro possui um lugar reservado para ser guardado, identificado através da chave.
Cadastro randômicoiniciotipo aluno = registrocaracter : nome;inteiro : numero;real : n1, n2, n3, n4;fimregistro;tipo sala = arquivo composto de aluno;aluno : aux;sala : diario;abra(diario);RepitaLeia(aux.numero, aux.n1, aux.nome);
se(aux.numero>0)então inicioaux.n2 0;aux.n2 0;aux.n4 0;posicione(diario, aux.numero);guarde(diario, aux);fim;fimse;até aux.numero = 0;feche(diario);fim.
Cadastro randômicoiniciotipo aluno = registrocaracter : nome;inteiro : numero;real : n1, n2, n3, n4;fimregistro;tipo sala = arquivo composto de aluno;aluno : aux;sala : diario;abra(diario);RepitaLeia(aux.numero, aux.n1, aux.nome);
se(aux.numero>0)então inicioaux.n2 0;aux.n2 0;aux.n4 0;posicione(diario, aux.numero);guarde(diario, aux);fim;fimse;até aux.numero = 0;feche(diario);fim.
Precisamos atribuir a n1, n2 e n3 o valor zero para que todos os campos a serem armazenados estejam preenchido;
O comando posicione determina que a localização no arquivo seja a estabelecida pelo número de chamada, que é a chave de acesso utilizada pelo professor.
Acessando registros diretamente
iniciotipo aluno = registrocaracter : nome;inteiro : numero;real : n1, n2, n3, n4;fimregistro;tipo sala = arquivo composto de aluno;aluno : aux;sala : diario;Inteiro: numeroAluno;
abra(diario);leia(numeroaluno);posicione(diario, numeroaluno);copie(aux.nome, “possui nota”, aux.n1);feche(diario);fim.
Acessando registros diretamente
iniciotipo aluno = registrocaracter : nome;inteiro : numero;real : n1, n2, n3, n4;fimregistro;tipo sala = arquivo composto de aluno;aluno : aux;sala : diario;Inteiro: numeroAluno;
abra(diario);leia(numeroaluno);posicione(diario, numeroaluno);copie(aux.nome, “possui nota”, aux.n1);feche(diario);fim.
Após a execução do comando POSICIONE, o registro que está apto a ser manipulado é o indicado pela chave numeroAluno fornecida anteriormente
Alteraçãoiniciotipo aluno = registrocaracter : nome;inteiro : numero;real : n1, n2, n3, n4;fimregistro;tipo sala = arquivo composto de aluno;aluno : aux;sala : diario;inteiro: numeroaluno, qualnota;real: nota;
abra(diario);leia(numeroaluno, qualnota);posicione(diario, numeroaluno);copie(diario, aux);escolha qualnota
caso 1: nota aux.n1;caso 2: nota aux.n2;caso 3: nota aux.n3;caso 4: nota aux.n4;
fimescolha;
Alteraçãoescreva(aux.nome, “possui nota”, qualnota, “=”, nota);escreva(“nova nota: ”);leia(nota);escolha qualnota
caso 1 : aux.n1 nota;caso 2 : aux.n2 nota;caso 3 : aux.n3 nota;caso 4 : aux.n4 nota;
fimescolha;
guarde(diario, aux);feche(diario)fim.
ARQUIVOS EM PASCAL
type nome_do_registro = recordnome_do_campo : tipo do dado;end;nome_do_arquivo = file of nome_do_registro;
varvariável_do_arquivo : nome_do_arquivo;variável_do_registro : nome_do_registro;
ARQUIVOS EM PASCAL
type registro = recordnome : string;endereco : string;telefone : string;
end;arquivo = file of registro;
varagenda : arquivo;reg : registro;
COMANDOS EM PASCAL• ASSING: associa nomes de arquivos e variáveis locais, do programa
com arquivos de dispositivos de memória secundária, como por exemplo, disco.
• REWRITE: abre novos arquivos, pois, antes de posicionar o ponteiro no registro de número zero, o comando rewrite apagará todo o conteúdo do arquivo.
• RESET: abre arquivos e posiciona o ponteiro no registro de número zero, sem destruir os dados já existentes no arquivo.
• CLOSE: fecha arquivos que foram abertos pelo comando REWRITE ou pelo comando RESET. As atualizações só serão efetuadas em um arquivo assim que ele for fechado.
COMANDOS EM PASCAL• READ: lê os dados que estão armazenados nos registros de um arquivo.
• WRITE: grava os dados nos registros de um arquivo.
• SEEK: posiciona o ponteiro no registro desejado. O primeiro registro do arquivo é sempre o de número zero.
• FILESIZE: retorna o número de registros presentes em um arquivo.
• FILEPOS: retorna o número do registro em que o ponteiro está localizado.
• NOT EOF: verifica o final do arquivo
ARQUIVOS EM PASCAL
type carro= recordplaca: string;marca: string;ano: integer;
end;frota = file of carro;
vardetran: frota;carros : carro;
Criando um arquivo em Pascal
Program cria;Uses crt, wincrt;
Type carro = recordPlaca : string;Marca : string;Ano : integer;
End;Frota = file of carro;Var
Detran : frota;Carros : carro;
BeginAssing(detran, ‘carros.dat’);Rewrite(detran);Close(detran);End.
Arquivos em Pascal• Inclusão sequencial de dados em arquivos• Inclusão ordenada de dados em um arquivo• Exclusão física de dados de um arquivo• Exclusão lógica de dados de um arquivo• Alteração de dados de um arquivo• Consulta geral de dados em um arquivo• Consulta específica de dados em um arquivo• Consulta formulada de dados em um arquivo
• Ascencio, A. F. G. Lógica de Programação com Pascal. São Paulo: Makron Books, 1999. Página 86.
Exercícios