Laboratório No. 06

Objetivo:

O objetivo deste laboratório é a implementação de uma pequena base de dados de dados de alunos contendo nome e RA. Apesar de o RA ser usado primariamente como chave para identificação no mundo real, nesse exemplo a chave primária para as operações será o nome do aluno.

A implementação deverá usar uma tabela de espalhamento com encadeamento (hash with chaining). Dentro de cada lista, as entradas de alunos deverão estar em ordem crescente de nome, usando a ordem a comparação lexicográfica (a mesma dada pela função strcmp).

A função de hash usada deverá ser a mesma para todos os alunos, e deverá ser o ou exclusivo bit-a-bit dos caracteres do nome do aluno módulo TAMHASH (o tamanho da tabela de hash).

Os comandos disponibilizados pelo interpretador, no arquivo principal.c, são:

insere 999999 "Fulano de Tal"
Insere o aluno com RA 999999 e nome Fulano de Tal.
remove "Fulano de Tal"
Remove o aluno com nome Fulano de Tal.
consulta "Fulano de Tal"
Realiza uma consulta, buscando pelo aluno de nome Fulano de Tal.
imprime
Imprime a tabela de espalhamento.
sair
Encerra a execução do programa.

Implementação:

Os comandos do interpretador já vêm implementados. Alguns detalhes de implementação estão descritos em forma de comentário nas funções. Para certificar-se do formato de saída, verifique os arquivos de teste.

Você deverá submeter apenas o arquivo hash.c.

Exemplo de entrada:

Neste laboratório, a primeira linha da entrada indica a função a ser testada. Por exemplo, a seguinte entrada:

Hash
insere 996677 "Fulano de Tal"
insere 996677 "Fulano de Tal"
imprime
consulta "Fulano de Tal"
consulta "Maria da Silva"
consulta "abc"
remove "Fulano de Tal"
remove "Fulano"
imprime
sair

Gera a seguinte saída:

Testando apenas a função `Hash´.
Insere: 996677 "Fulano de Tal"
Insere: 996677 "Fulano de Tal"
Nome repetido: "Fulano de Tal"

Imprime Tabela: 1 aluno(s):
(12) 996677 "Fulano de Tal"

Consulta: "Fulano de Tal"
996677 "Fulano de Tal"
Consulta: "Maria da Silva"
Nome inexistente: "Maria da Silva"
Consulta: "abc"
Nome inexistente: "abc"
Remove: "Fulano de Tal"
Remove: "Fulano"
Nome inexistente: "Fulano"

Imprime Tabela: 0 aluno(s):

Testes:

Neste laboratório o formato dos testes difere dos demais. Cada caso de teste testará o funcionamento de apenas uma função implementada pelo aluno, as demais funções serão testadas usando-se as implementações do gabarito. Para isso, será fornecido um arquivo objeto .o para a linkagem junto ao programa compilado no formato ELF, e deve ser compatível com o compilador gcc para linux, e possivelmente outros compiladores que aceitem o formato ELF.

Essa funcionalidade é fornecida apenas como conveniência, e pode ser desabilitada pelo aluno, caso, por exemplo, exista algum problema com a linkagem. Para isso basta descomentar a linha CFLAGS+=-DNOGAB no arquivo Makefile. Note que, no Susy esse recurso não será desabilitado e será usado para rodar todos os testes.

Haverá 8 grupos de teste, um para cada função a ser testada. Os arquivos de cada grupo são iguais, variando apenas a função testada em cada um deles. E serão, repectivamente, Hash, CriaTabela, InsereTabela, RemoveTabela, ConsultaTabela, NumeroAlunosTabela, ImprimeTabela, LiberaTabela.

Observações adicionais:

  1. Você deve submeter apenas o arquivo hash.c.
  2. Você não deve modificar, ou remover as partes do código entre #ifndef ... #endif no início de cada função.
  3. A sua última submissão deve incluir todos os casos, testando todas as funções.