Program hashing; //Este programa funciona perfeitamente em Delphi 6, // mas nao funciona em Delphi 5 {$APPTYPE CONSOLE} const tamtab= 251; inf=0; sup=250; ErroDupl='Erro - Tentativa de colocar duplicata'; Type inteiro = 0..maxint; cadeia = string[30]; faixa = inf..sup; apont = ^valor; valor = record Nome:cadeia; nota:real; Prox:Apont; End; TipoTab=array[faixa] of Apont; contchar = 1..30; // Inicializa tabela Procedure Inicializa (var tab:TipoTab); var j:inteiro; Begin For j:=inf to sup do tab[j]:=nil; End; // Cria o endereco hash somando o valor ASCII do nome mod 251 Function Hash(nome:cadeia):inteiro; var j,soma:inteiro; Begin soma:=0; For j:=1 to 8 do soma:=soma + ord(nome[j]); hash:=soma mod tamtab; End; // Converte os caracteres minusculos em maiusculos Function Convert(nome:cadeia):cadeia; var j:byte; Aux:cadeia; Begin Aux:=''; For j:=1 to length(nome) do Aux:= Aux + upcase(nome[j]); Convert:= Aux; End; // Objetivo: Inserir registros na cabeça de lista em uma estrutura de lista ligada // Param. entrada: inicio(apontador), nome(cadeia), nota(real) // Param. saída: inicio(apontador) Procedure Insere_Inicio(var inicio:apont; Nome:cadeia; nota:real); var atual:apont; Begin New(atual); atual^.nome:=nome; atual^.nota:=nota; atual^.prox:=Inicio; Inicio:=atual; End; // Objetivo: Inserir um novo registro em uma lista ligada ordenada // Param. entrada: inicio(apontador), Nome(cadeia), nota(real) // Param. saída: inicio(apontador), dupl(boolean) Procedure Tenta_Inserir(var inicio:apont; var dupl:boolean; Nome:cadeia; nota:real); begin If inicio=nil then Begin Insere_Inicio(inicio,Nome,nota); Dupl:=false; End else If inicio^.nome=nome then dupl:= true else Tenta_Inserir(inicio^.prox,dupl,Nome,nota); End; // Impressao dos registros Procedure Imprimir(Tab:tipotab); var I:inteiro; Ponteiro:Apont; begin For I:=inf to sup do Begin Ponteiro:= Tab[i]; while Ponteiro<>Nil do Begin Writeln('[',I:3,']= ',Ponteiro^.Nome); Writeln('[',I:3,']= ',Ponteiro^.Nota); writeln; Ponteiro:=Ponteiro^.prox; end; end; end; // Programa Principal var Nome:cadeia; nota:real; tab:tipotab; dupl:boolean; I,endereco:inteiro; Begin repeat write('Digite um Nome, para encerrar ''Fim'': '); readln(Nome); nome:=convert(Nome); if nome = 'FIM' then break; write('Digite a nota: '); readln(nota); if length(Nome)<8 then for I:=length(nome)+1 to 15 do Nome:= Nome + ' '; Endereco:=Hash(Nome); Tenta_Inserir(Tab[Endereco],Dupl,Nome,nota); if Dupl then writeln(Nome,' ',ErroDupl); until false; writeln; writeln('------ Tabela ------'); writeln; Imprimir(Tab); readln; End.