|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
способность кода исправлять ошибки
как определить способность кода исправлять ошибки, если вводится какое-то число n и n двоичных кодовых комбинаций? На выходе нужно вывести кратность ошибок, которые можно исправить.
Может кто хотя бы знает как вообще определять эту кратность? И кодовое расстояние складывается из всех кодовых комбинаций или считается по каждой? |
#2
|
||||
|
||||
Не ясна задача, можно немного подробностей?
Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#3
|
||||
|
||||
Чтобы посчитать кодовое расстояние двух кодовых комбинаций надо сложить их по модулю 2. Кодовое расстояние кода ( d ) - минимальное кодовое расстояние , рассчитанное для всех пар кодовых комбинаций.
Тогда кратность обнаруживаемых ошибок ( r ) будет: r <= d-1 Кратность исправляемых ошибок ( s ) будет: s <= (d-1)/2 Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#4
|
|||
|
|||
получается мне нужно складывать попарно по модулю 2 все комбинации и для каждой пары находить свое кодовое расстояние d и s?
|
#5
|
||||
|
||||
Цитата:
Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#6
|
|||
|
|||
ааа понятно
|
#7
|
|||
|
|||
ладно... вроде разобралась с программой.. только теперь вопрос как работать с двоичным кодом в Делфи? есть ли такой специальный тип данных для этого?
|
#8
|
|||
|
|||
вот что у меня получилось... вроде работало сначала, а теперь не хочет.. в чем ошибка?
Код:
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; |
#9
|
||||
|
||||
Ты используешь переменную от другого цикла.
Может быть вместо Код:
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; Код:
for l:=1 to Length(d) do // ведь здесь переменная l begin if StrToInt(d[l])=1 then dd:=dd+1; if dd<dmin then dmin:=dd; dd:=0; end; Велик и могуч наш Object Pascal ! ICQ: 357-591-887 |
#10
|
|||
|
|||
о да! точно!! спасибо!
и еще плюс вот это из того цикла убрать надо: Код:
if dd<dmin then dmin:=dd; dd:=0; |
#11
|
||||
|
||||
Немного подправил:
Код:
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 |
#12
|
|||
|
|||
спасибо учту!
|