
07.05.2009, 23:17
|
 |
Активный
|
|
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
|
|
Немного подправил:
Код:
function DoXOR(StrIn, Key : String) : String;
var
i, l_In, l_Key : Integer;
begin
Result := '';
l_In := Length(StrIn);
l_Key := Length(Key);
if (l_In > 0) and (l_Key > 0) then
for i := 1 to l_In do
// т.к в строке только '0' или '1' переводим каждый символ в соотв. ему код с пом. ф-ии Ord
// вычитая код 48 ( это код символа '0' ) получаем 0 или 1 , делаем xor и переводим обратно в символ
Result := Result + Char( ((Ord(StrIn[i])-48) xor (Ord(Key[i])-48)) + 48 );
end;
procedure TForm1.Button1Click(Sender: TObject);
var n,i,k,dmin,s,l,dd,m,m1:integer; a:array [1..100] of string;
d: string;
begin
n:=UpDown1.Position;
dmin:=MAXINT; // так проще
for i:=1 to n do a[i]:=Memo1.Lines.Strings[i];
for m:=1 to n do
if Length(a[m])<>Length(a[m-1]) then
begin
Memo1.Clear;
messagebox(0, pchar('Вводите кодовые комбинации одинаковой длины!'),pchar('ВНИМАНИЕ!'),mb_iconinformation+mb_ok);
Close; // кстати, можно вместо закрытия формы просто делать выход из процудуры вызывая Exit;
// Form1.Close; - это тоже самое что и Close т.к. по умолчанию вызывается метод твоей формы
end;
for i:=1 to n-1 do
for k:=i+1 to n do // достаточно начинать с i+1 чтобы потом не проверять равенство индексов
begin
dd:=0; // сначала приравниваем к нулю, чтобы потом использовать в цикле
d:=DoXOR(a[i],a[k]);
Memo1.Lines.Add('d=: '+d);
for l:=1 to Length(d) do
begin
if StrToInt(d[i])=1 then dd:=dd+1;
end;
if dd<dmin then dmin:=dd; // ищем минимальное кодовое расстояние
end;
s:= (dmin-1) div 2;
Memo1.Lines.Add('--- Кратность ошибок, которые можно исправить <= '+IntToStr(s));
end;
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
|