![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
|||
|
|||
|
как определить способность кода исправлять ошибки, если вводится какое-то число n и n двоичных кодовых комбинаций? На выходе нужно вывести кратность ошибок, которые можно исправить.
Может кто хотя бы знает как вообще определять эту кратность? И кодовое расстояние складывается из всех кодовых комбинаций или считается по каждой? |
|
#2
|
||||
|
||||
|
Не ясна задача, можно немного подробностей?
|
|
#3
|
||||
|
||||
|
Чтобы посчитать кодовое расстояние двух кодовых комбинаций надо сложить их по модулю 2. Кодовое расстояние кода ( d ) - минимальное кодовое расстояние , рассчитанное для всех пар кодовых комбинаций.
Тогда кратность обнаруживаемых ошибок ( r ) будет: r <= d-1 Кратность исправляемых ошибок ( s ) будет: s <= (d-1)/2 |
|
#4
|
|||
|
|||
|
получается мне нужно складывать попарно по модулю 2 все комбинации и для каждой пары находить свое кодовое расстояние d и s?
|
|
#5
|
||||
|
||||
|
Цитата:
|
|
#6
|
|||
|
|||
|
ааа понятно
|
|
#7
|
|||
|
|||
|
вот что у меня получилось... вроде работало сначала, а теперь не хочет.. в чем ошибка?
Код:
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 := 0 to l_In - 1 do begin
Result := Result + IntToStr(StrToInt(StrIn[i + 1]) xor StrToInt(Key[1 + (i mod l_Key)]));
end;
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:=1000000;
dd:=0;
for i:=1 to n do
begin
a[i]:=Memo1.Lines.Strings[i];
end;
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;
Form1.Close;
end;
for i:=1 to n-1 do
for k:=2 to n do
begin
if i<>k then
begin
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;
if dd<dmin then dmin:=dd;
dd:=0;
end;
end;
end;
s:= (dmin-1) div 2;
Memo1.Lines.Add('--- Кратность ошибок, которые можно исправить <= '+IntToStr(s));
end; |