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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2011, 00:36   #1
dukales
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 58
Радость abs символа?

Есть си-шная хэш-функция:
Код:
unsigned short int Hash_Function(char *key)
{
	unsigned short int sum=0;
	char space = ' ';
	for (int i=0;(i+2)<=strlen(key);i+=2)
	{
		if (sum>=(sum+abs(key[i])+abs(key[i+1]))) //Если сумма после сложения увеличилась значит
		sum=(sum+abs(key[i])+abs(key[i+1])+1); //было переполнение . Спасаем этот бит
		else sum=(sum+abs(key[i])+abs(key[i+1]));
	if (sum & 0x8000!=0) //Организация циклического сдвига влево
		sum=(sum<<1) + 1; 
	else  sum=(sum<<1);
	}
	if (i==(strlen(key)-1))
	{
		if (sum>=(sum+abs(key[i])+space)) //Если сумма после сложения увеличилась значит
		sum=(sum+abs(key[i])+space+1);    //было переполнение . Спасаем этот бит
		else sum=(sum+abs(key[i])+space);
		if (sum & 0x8000!=0)  //Организация циклического сдвига влево
			sum=(sum<<1) + 1; else  sum=(sum<<1);
	}
return sum;
}
портирую её на паскаль:
Код:
function hash(key: string) : integer;
var i: integer; //счетчик
	sum: integer; //сумма 
    space: char; 
begin
 sum := 0;
 space:= ' ';
 i := 0;
 while (i+2)<=length(key) do
       begin
	     if (sum >= (sum + (abs(key[i])) + abs(key[i + 1]))) then //Если сумма после сложения увеличилась значит
		    begin
			  sum := (sum + abs(key[i]) + abs(key[i + 1]) + 1); //было переполнение . Спасаем этот бит
		    end
	 	     else 
			begin 
			  sum := (sum + abs(key[i]) + abs(key[i + 1]));
			end;
	     if sum >= $8000 then //Организация циклического сдвига влево
		    begin
			  sum := sum shl 1 + 1;
			end
		     else  
			begin
			  sum := sum shl 1;
			end;
	 i := i + 2;
   end;
 if (i = (strlen(key) - 1)) then
	begin		
	  if (sum >= (sum + abs(key[i]) + space)) then //Если сумма после сложения увеличилась значит
		  begin
		    sum :=(sum + abs(key[i]) + space + 1);    //было переполнение . Спасаем этот бит
		  end
		   else 
		  begin
		    sum := (sum + abs(key[i]) + space);
	      end;  
	  if sum >= $8000 then //Организация циклического сдвига влево
		 begin
		   sum := sum shl 1 + 1;
	     end
		  else  
	     begin
		   sum := sum shl 1;
	     end;
	end;
  hash:=sum;	
 end;
ругается на (abs(key[i])), спрашивается зачем модуль символа???
dukales вне форума Ответить с цитированием
Старый 06.09.2011, 07:13   #2
dukales
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 58
По умолчанию

Так в чём всё-таки загвоздка?
а, да, собственно условия:
• Преобразование строкового ключа в целое число:
A) Сложение двухбайтовых слов; после каждого сложения – циклический сдвиг суммы на один разряд влево.

• Хеширование целочисленного ключа:
N) Алгоритм середины квадрата.

• Разрешение коллизий:
Z) Алгоритм Уильямса.

Последний раз редактировалось dukales; 06.09.2011 в 07:19.
dukales вне форума Ответить с цитированием
Старый 06.09.2011, 10:15   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
спрашивается зачем модуль символа???
а в С, то не просто символ.
символ==число(причем со знаком)
потому там все так.
а в Паскале придется выкореживатся, либо делать как массив smallint(вроде он один байт)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.09.2011, 12:37   #4
dukales
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 58
По умолчанию

на smallint паскаль орёт как на неопознанный тип.
dukales вне форума Ответить с цитированием
Старый 06.09.2011, 12:42   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а shortint?(я уже не помню типы паскаля)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 06.09.2011, 12:47   #6
dukales
Пользователь
 
Регистрация: 26.06.2011
Сообщений: 58
По умолчанию

все равно орёт компилятор на место (abs(key[i]) - мол, функция с указанными параметрами abs не найдена
dukales вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из базы ABS достать файлы oleg17 БД в Delphi 5 21.09.2010 17:02
c++ удаление символа 0479 Помощь студентам 1 21.09.2010 02:33
Не используя стандартные функции (за исключением abs), вычислить с точностью до eps>0: GHOST_DOG Помощь студентам 2 12.12.2008 05:58
log(abs(cos(x))) DeFace Общие вопросы C/C++ 3 28.09.2008 17:32