Algoritmos - Arquivos Parte 3

Preview:

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

Recommended