Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2013, 00:14   #1
Silverstone
Пользователь
 
Регистрация: 13.12.2011
Сообщений: 75
По умолчанию Код Хэмминга

Подскажите, почему у меня правит код частично правильно?
Бит, который я вношу специально для ошибки программа честно находит и правит на нужный, но еще почему-то у меня всегда исправляется 7ой бит на нуль. В чем причина?
Код:
unit Unit1;
 
interface
 
uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
 
type
  t=0..1;
  TForm1 = class(TForm)
    Edit1: TEdit;
    Label1: TLabel;
    Button1: TButton;
    Label2: TLabel;
    Label3: TLabel;
    Button2: TButton;
    Label4: TLabel;
    Label5: TLabel;
    Edit2: TEdit;
    Label6: TLabel;
    Label7: TLabel;
    Button3: TButton;
    Label8: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  M1, M2, M3, M4, C1, C2, C3, C11, C12, C13, K1: t;
  k,r,i:integer;
  s:string;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Button1Click(Sender: TObject);
 var
  a, k, k1, code: integer;
  s: string;
begin
 
 if (not(TryStrToInt (Edit1.Text,a)) or (a<4))then
  ShowMessage ('Необходимо 4 символа!')
  else
   begin
    k:=Length(Edit1.Text);
 
    case k of
     1:
       begin
        k1:=2;
        Label3.Caption:='K=2';
       end;
     2..4:
       begin
        k1:=3;
        Label3.Caption:='K=3';
       end;
     5..11:
       begin
        k1:=4;
        Label3.Caption:='K=4';
       end;
    end;
 
    M1:=strtoint(edit1.Text[1]);
    M2:=strtoint(edit1.Text[2]);
    M3:=strtoint(edit1.Text[3]);
    M4:=strtoint(edit1.Text[4]);
    k:=M1+M2+M4;
    if k mod 2=0 then
     C1:=0
       else C1:=1;
 
    k:=M1+M3+M4;
    if k mod 2=0 then
       C2:=0
       else C2:=1;
 
    k:=M2+M3+M4;
    if k mod 2=0 then
    C3:=0
       else C3:=1;
 
       label2.Caption:=IntToStr(C1)+IntToStr(C2)+IntToStr(M1)+
       IntToStr(C3)+IntToStr(M2)+IntToStr(M3)+IntToStr(M4);
       s:=label2.caption;
   end;
 
end;
 
procedure TForm1.Button2Click(Sender: TObject); // ошибка
 var
 O, a: integer;
begin
 O:=StrToInt(Edit2.Text);
 
 case O of
 1:
  begin
   C1:=1;
  end;
 2:
  begin
   C2:=1;
  end;
 3:
  begin
   M1:=1;
  end;
 4:
  begin
   C3:=1;
  end;
 5:
  begin
   M2:=1;
  end;
 6:
  begin
   M3:=1;
  end;
 7:
  begin
   M4:=1;
  end;
 end;
 
 label6.Caption:= IntToStr(C1)+IntToStr(C2)+IntToStr(M1)+
       IntToStr(C3)+IntToStr(M2)+IntToStr(M3)+IntToStr(M4);
 
 K1:=C1+M4+M2+M1;
  if K1 mod 2=0 then
     C11:=0
       else C11:=1;
 K1:=C2+M4+M3+M1;
  if K1 mod 2=0 then
     C12:=0
       else C12:=1;
 K1:=C3+M4+M3+M2;
 if K1 mod 2=0 then
     C13:=0
       else C13:=1;
 
end;
 
procedure TForm1.Button3Click(Sender: TObject); //где ошибка и правка
 var
  res: integer;
begin
  label7.Caption:= IntToStr(C11)+IntToStr(C12)+IntToStr(C13);
  if label7.Caption='000' then showmessage('Нет ошибок');
  if label7.Caption='001' then showmessage('с3-4');
   res:=1;
  if label7.Caption='010' then showmessage('с2-2');
   res:=2;
  if label7.Caption='011' then showmessage('м3-6');
   res:=3;
  if label7.Caption='100' then showmessage('с1-1');
   res:=4;
  if label7.Caption='101' then showmessage('м2-5');
   res:=5;
  if label7.Caption='110' then showmessage('м1-3');
   res:=6;
  if label7.Caption='111' then showmessage('м4-7');
   res:=7;
   showmessage('Ошибка в бите:' + inttostr(res));
   s:=label2.Caption;
  if s[res]='1' then
   s[res]:='0'
   else s[res]:='1';
   label8.Caption:=s;
end;
 
end.
Silverstone вне форума Ответить с цитированием
Старый 06.04.2013, 11:02   #2
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Код:
 if label7.Caption='111' then showmessage('м4-7');
  res:=7;
Т.е. даже если ошибок нет, то всёравно res=7, т.к. присвоение происходит в любом случае.
Ну, как-то так
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
 res: integer;
begin
 label7.Caption:= IntToStr(C11)+IntToStr(C12)+IntToStr(C13);
 res := C11*4+C12*2+C13;
 case res of
   0: showmessage('Нет ошибок');
   1: showmessage('с3-4');
   2: showmessage('с2-2');
   3: showmessage('м3-6');
   4: showmessage('с1-1');
   5: showmessage('м2-5');
   6: showmessage('м1-3');
   7: showmessage('м4-7');
 end;
 if res > 0 then begin
   showmessage('Ошибка в бите:' + inttostr(res));
   s:=label2.Caption;
   if s[res]='1' then
     s[res]:='0'
   else
     s[res]:='1';
   label8.Caption:=s;
 end;
end;

Последний раз редактировалось Sibedir; 06.04.2013 в 11:16.
Sibedir вне форума Ответить с цитированием
Старый 06.04.2013, 11:02   #3
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

__________________________________

Последний раз редактировалось Sibedir; 06.04.2013 в 18:03.
Sibedir вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Assembler. Код Хэмминга. Sonicblow Фриланс 7 15.05.2013 15:41
растяние хэмминга kostan3 Общие вопросы по Java, Java SE, Kotlin 0 29.11.2012 14:11
Код Хэмминга 0479 Помощь студентам 0 12.11.2010 10:32
растояние Хэмминга semennn Помощь студентам 0 06.05.2009 19:11