const KEYLEN = 3; N = 5; M = 2*N; type tkey = string[KEYLEN]; tval = string; ps = ^tval; pk = ^tkey; Const NotError : tval = 'Not in table'; VAR Y : array [0..M-1] of ps; X : array [0..M-1] of pk; Function Hash(key : tkey):word; var i : byte; res : real; begin res := 0; for i := 1 to KEYLEN do res := res + ord(key[i]); res := sqrt(res); res := res - trunc(res); Hash := trunc(res * M); end; Procedure AddPair(key:tkey;val:tval); var nv : ps; nk : pk; c : 0..M-1; begin c := Hash(Key); while X[C] <> nil do c:=(c+1) mod M; New(nv);NV^ := val; New(nk);NK^ := key; X[C] := NK; Y[C] := NV; end; Function GetValue(key : tkey):tval; var c : 0..M-1; begin c := Hash(Key); while (X[C]^ <> Key) and (X[C] <> nil) do c:=(c+1) mod M; if X[C] <> nil then GetValue := Y[C]^ else GetValue := NotError; end; var i : 0..M-1; begin for i := 0 to M-1 do begin X[i] := nil; y[i]:=nil;end; AddPair('SPB','Saint Petersburg'); AddPair('MOS','Moscow'); AddPair('_NY','New York'); AddPair('TUA','Tula'); AddPair('Sux','SuxxCity'); WriteLn(GetValue('SPB')); WriteLn(GetValue('_NY')); WriteLn(GetValue('MOC')); WriteLn(GetValue('Sux')); end.