9.9 Exercício: Implementação
da Classe Dictionary
- 
A classe Dicionário em Smalltalk comporta-se como
uma lista indexada.
 
- 
Na realidade esta é a forma como uma instância
de Dictionary se mostra para o usuário.
 
- 
Um Dictionary é implementado internamente como uma
tabela de Hashing, para melhor tempo de acesso.
 
- 
Você vai implementar uma Classe Dicionário
em C++ que:
 
- 
Utilize hashing encadeado e um vetor como tabela de hashing.
 
- 
Utilize Strings como chaves.
 
- 
Possua uma função de hashing que utilize shift
folding sobre o string-chave e mod(k,17) sobre o resultado do
folding.
 
- 
Seja um dicionário genérico, sendo capaz, em
teoria, de armazenar objetos de qualquer tipo, através de ponteiros
void.
 
Na prática você vai implementar-lo para
inteiros, floats e strings.
 
9.9.1 Modelagem do Dictionary
- 
Você vai precisar de 2 classes:
 
- 
O Dicionário em si, implementado como um vetor de
ponteiros para Associações
 
- 
A Associação, que associa uma chave a um objeto.
 
- 
A Associação conterá um campo para a
chave (ponteiro para char), um campo para o objeto associado (ponteiro
void, para objetos genéricos), um campo tipo (definido por nós
como inteiro) e um ponteiro para a próxima associação.
 
- 
O campo tipo é necessário para que saibamos
qual é o tipo de objeto que é apontado pela associação,
já que C++ não associa informaçoes sobre pertinência
de classe a objetos.
 
     Classe
Dicionário {
    Associação
dados[17];
}
 
Classe Associação
{
caracter   
*chave;
inteiro    
tipo;
void       
*valor;
Associação 
*prox;
}
 
9.9.2 Implementação da Classe Dictionary
- 
 O Dicionário deverá ser capaz de:
 
- 
Adicionar um novo objeto, lendo a chave, o tipo e o objeto
e adicionando-o.
 
- 
Recuperar e imprimir um objeto a partir da chave. Lembre-se
que em C++ para isto é necessário que, ao imprimir, primeiro
seja verificado qual o tipo para que seja chamada a impressão correta.
 
- 
Imprimir todas as chaves. Esta impressão deverá
ser da forma mais simples possível, sem se preocupar com a ordem.
 
- 
Lembre-se de fazer um typecasting ao imprimir,
depois que descobrir qual é o tipo do objeto apontado pelo ponteiro
valor.