Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.12.2009, 11:36   #1
777Aidar777
 
Регистрация: 26.10.2009
Сообщений: 4
По умолчанию Хеш - Функции

Помогите пожалуйста исправить прогу.
Задание:
Реализовать метод внутреннего хеширования. Исходные ключи – любые слова (например – фамилии). Размер хеш-таблицы должен задаваться в программе с помощью константы m. В случае возникновения конфликта при попытке размещения в таблице нового ключа, для него ищется первое свободное по порядку место по формуле
j = (( h (ключ) + i ) mod m ) + 1, где i = 0, 1, 2, . . . , m-2
Программа должна выполнять следующие действия:
• добавление нового ключа в таблицу с подсчетом сделанных при этом сравнений
• поиск заданного ключа в таблице с подсчетом сделанных при этом сравнений
• вывод текущего состояния таблицы на экран


Ошибка состоит в том, что при добавлении ключей (например добавляем var, avr, arv и avr) программа выводит одинаковые ключи. По сути при вводе одинаковых ключей должен выводить сообщение "Kluch uge dobavlalsa!!.".

Код программы:
Код:
program Work2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
const m = 12;

var A : Array [0..m - 1] of String;

Function Hash(str : string) : Integer;
var   Sum, i, Len, Res : Integer;
begin
  Sum := 0;
  Len := Length(str);
  for i := 1 to Len do
    Sum:=Sum + ord(str[i]);
  Res := Sum mod m;
  Result := Res;
end;



function AddToHAsh(str : String; var arr : array of String) : Integer;
var hsh, cmp, r, i, m, j : Integer;
    Free : Boolean;
begin
  hsh := Hash(str);
  Cmp := 0;
  j := 0;
  R := 1;
  Inc(Cmp);
  Free := False;
  If (arr[hsh] = str)
  then
    begin
    writeln('Kluch uge dobavlalsa!!.');
    end
  else
    begin
    if (Arr[hsh] = '')
    then
      begin
      arr[hsh] := str;
      end
    else
      begin
      for i := 1 to (m - 1) do
        begin
        Inc(Cmp);
        j := (hsh + i) mod m;
        if (Arr[j] = '')
        then
          begin
          Arr[j] := str;
          Break;
          end;
        end;
      end;
    end;
  writeln('Comparies: ',  Cmp);
  Result := R;
end;

function DelFromHash(str : String; var arr : array of String) : Integer;
var hsh, r : Integer;
begin
  hsh := Hash(str);
  If (str = arr[hsh])
  then
    begin
    arr[hsh] := '';
    R := 1;
    end
  else
    R := 0;
end;

procedure FindInHash(str : String; var arr : array of String);
var i, j, hsh, Cmp : integer;
    Find : Boolean;
begin
  Find := false;
  Cmp := 0;
  for i := 0 to (m - 1) do
  if (Arr[i] <> '')
  then
    begin
    Find := True;
    Break;
    end;
  if (Find = True)
  then
    begin
    Inc(Cmp);
    hsh := Hash(str);
    if (Arr[hsh] = '')
    then
      begin
      writeln('Nenaideno eto slovo!');
      writeln('Comparies: ', cmp);
      end
    else
      begin
      if (Arr[hsh] = str)
      then
        begin
        writeln('Eto slovo naideni i nahodatsa po');
        writeln('Index is: ', hsh);
        writeln('Comparies: ', cmp);
        end
      else
        begin
        for i := 1 to (m - 1) do
          begin
          Inc(Cmp);
          j := (hsh + i) mod m;
          if (Arr[j] = '')
          then
            begin
            writeln('Nenaideno eto slovo!');
            writeln('Comparies: ', cmp);
            Break;
            end;
      
          if (Arr[j] = str)
          then
            begin
            writeln('Eto slovo naideno');
            writeln('Index is: ', j);
            writeln('Comparies: ', cmp);
            Break;
            end;
          end;
        end;
      end;
    end
  else
    writeln('Hash is empty');
end;

procedure InitArray(var arr : array of String);
var i : Integer;
begin
  for i := 0 to High(arr) do
    arr[i] := '';
end;

procedure PrintArray(arr : array of String);
var i : Integer;
begin
  for i := 0 to High(arr) do
    WriteLn(i, ': ', arr[i]); //вывод массива
end;

procedure ShowMenu;
begin
  WriteLn('0 - Dobavit v hash table');
  WriteLn('1 - Poisk hash table');
  WriteLn('2 - Vivod hash table');
  WriteLn('3 - Exit');
end;

procedure Command;
var num : Integer;
    cmd : Char;
    str : String;
begin
  Write('Enter command: ');
  ReadLn(cmd);
  case cmd of
    '0':
      begin
      str := '';
      while (str = '') do
        begin
        Write('Enter Slovo: ');
        ReadLn(str);
        end;
      If (AddToHAsh(str, a) = 0)
      then
        WriteLn('Nelza dobavit v hash table')
      else
        WriteLn(Hash(str));
      end;

    '1':
      begin
      Write('Enter Slovo: ');
      ReadLn(str);
      FindInHash(str,a);
      end;
    '2': PrintArray(a);
    '3': Exit;
  end;
  Command;
end;

begin
  InitArray(a);
  ShowMenu;
  Command;
end.
777Aidar777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Неправильная хеш функция.(Java) _Studentka_ Помощь студентам 0 09.12.2009 22:54
Хеш-таблица. Непонятно с решением коллизии методом перемешивания внутренними цепочками Познающий Помощь студентам 9 05.12.2009 02:48
Чем отличается описание функции от определения функции в С++? Go6a Помощь студентам 4 18.07.2009 18:07
Функции. Передача массива в качестве параметра функции. Wia Помощь студентам 2 17.03.2009 14:57