Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Синтаксис
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 30.04.2009, 09:38
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию способность кода исправлять ошибки

как определить способность кода исправлять ошибки, если вводится какое-то число n и n двоичных кодовых комбинаций? На выходе нужно вывести кратность ошибок, которые можно исправить.

Может кто хотя бы знает как вообще определять эту кратность? И кодовое расстояние складывается из всех кодовых комбинаций или считается по каждой?
Ответить с цитированием
  #2  
Старый 30.04.2009, 11:31
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Не ясна задача, можно немного подробностей?
__________________
Некоторые программисты настолько ленивы, что сразу пишут рабочий код.

Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты.
Ответить с цитированием
  #3  
Старый 30.04.2009, 17:34
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию

Чтобы посчитать кодовое расстояние двух кодовых комбинаций надо сложить их по модулю 2. Кодовое расстояние кода ( d ) - минимальное кодовое расстояние , рассчитанное для всех пар кодовых комбинаций.
Тогда кратность обнаруживаемых ошибок ( r ) будет: r <= d-1
Кратность исправляемых ошибок ( s ) будет: s <= (d-1)/2
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
  #4  
Старый 30.04.2009, 19:05
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

получается мне нужно складывать попарно по модулю 2 все комбинации и для каждой пары находить свое кодовое расстояние d и s?
Ответить с цитированием
  #5  
Старый 30.04.2009, 19:29
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию

Цитата:
Сообщение от Athen
получается мне нужно складывать попарно по модулю 2 все комбинации и для каждой пары находить свое кодовое расстояние d и s?
Нет, я же написал, что нужно - считаешь кодовое расстояние для всех пар, из полученных значений выбираешь минимальное - это и есть кодовое расстояние кода ( d )
__________________
Велик и могуч наш Object Pascal !
ICQ: 357-591-887
Ответить с цитированием
  #6  
Старый 30.04.2009, 20:10
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

ааа понятно
Ответить с цитированием
  #7  
Старый 03.05.2009, 19:54
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

ладно... вроде разобралась с программой.. только теперь вопрос как работать с двоичным кодом в Делфи? есть ли такой специальный тип данных для этого?
Ответить с цитированием
  #8  
Старый 07.05.2009, 10:57
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
Восклицание

вот что у меня получилось... вроде работало сначала, а теперь не хочет.. в чем ошибка?
Код:
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  
Старый 07.05.2009, 12:03
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 27.12.2006
Адрес: Псков
Сообщения: 274
Версия Delphi: Delphi 7
Репутация: 497
По умолчанию

Ты используешь переменную от другого цикла.
Может быть вместо
Код:
       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  
Старый 07.05.2009, 18:26
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

о да! точно!! спасибо!
и еще плюс вот это из того цикла убрать надо:
Код:
if dd<dmin then dmin:=dd;
dd:=0;
теперь работает вроде бы!
Ответить с цитированием
  #11  
Старый 07.05.2009, 23:17
Аватар для Rokuell
Rokuell Rokuell вне форума
Активный
 
Регистрация: 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
Ответить с цитированием
  #12  
Старый 08.05.2009, 19:10
Athen Athen вне форума
Прохожий
 
Регистрация: 27.11.2007
Сообщения: 16
Репутация: 10
По умолчанию

спасибо учту!
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:17.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter