我需要在Ada中创建一个哈希函数,它接受一个字符串并返回一个整数。 我到目前为止所做的是:
function hash(Word: unbounded string) return Integer is
h := 5381
c := (first charater of "Word")
begin
while c /= (end of "Word") loop
h := h*33 + c;
c := (next character of "Word");
end while;
return h mod 20;
end hash;
我不知道如何在Ada中选择一个角色,怎么说“我想要这个词的第三个字”字“,这是r。
感谢您的帮助,
吨。
答案 0 :(得分:3)
查看Ada.Strings.Unbounded包提供的服务。
答案 1 :(得分:1)
正如Marc所说,您需要使用Ada.Strings.Unbounded来获取Word
的内容。
您还需要解决另外两个问题:
Unbounded_String
(或String
中没有终止字符,来到那里)。相反,将循环写为for J in 1 .. (length of Word) loop
。J
个字符,它仍然是Character
,你无法将其添加到h
(我认为h
是不可或缺的) 。 Character'Pos (Ch)
返回字符的等效数字,并且可以添加。答案 2 :(得分:1)
function hash(Word: Ada.Strings.Unbounded.Unbounded_String) return Integer is
-- First, because there's no manipulation of the string's
-- contents, doing the work on an unbounded-string is
-- rather pointless... so let's do our work on a regular --' fix for formatting
-- [static-length] string.
Working : String := Ada.Strings.Unbounded.To_String(Word);
-- Second, you need types in your declarations.
h : Integer := 5381;
c : Character := 'e'; --(first charater of "Word");
begin
-- Why use a 'while' loop here? Also, what if the 'word' is
-- abracadabra, in that case c [the first letter] is the
-- same as the last letter... I suspect you want an index.
for Index in Working'Range loop -- Was: while c /= EOW loop --'
declare
-- This is where that 'c' should actually be.
This : Character renames Working(Index);
-- Also, in Ada characters are NOT an integer.
Value : constant Integer := Character'Pos( This ); --'
begin
h := h*33 + value; -- PS: why 33? That should be commented.
-- We don't need the following line at all anymore. --'
--c := (next character of "Word");
end;
end loop;
return h mod 20;
end hash;
当然,这也可以重写,以利用Ada 2012中新的循环结构。
function hash_2012(Word: Ada.Strings.Unbounded.Unbounded_String) return Integer is
-- Default should be explained.
Default : Constant Integer := 5381;
Use Ada.Strings.Unbounded;
begin
-- Using Ada 2005's extended return, because it's a bit cleaner.
Return Result : Integer:= Default do
For Ch of To_String(Word) loop
Result:= Result * 33 + Character'Pos(Ch); --'
end loop;
Result:= Result mod 20;
End return;
end hash_2012;
...我必须问,格式化程序发生了什么?这太可怕了。