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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2013, 00:31   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию в программе по нахождению избыточности (код Хеминга) иногда выводится не тот результат

Здравствуйте, написал программу, которая имеет tedit и кнопку и ричедит, при нажатии на кнопку берутся данные из эдита (двоичные, разрешил ввод только 0 или 1), затем данные нумеруются с конца строки, и пока не найдена единичка программа ничего не делает, как только единица найдена, то программа выводит номер позиции этой единицы в едит, и переводит номер позиции этой едмницы в двоичный код и выводит в ричедит, ошибка в том, что иногда номер позиции не так выводится, а на единицу больше, а иногда правильно, зависит от значений введенных в ричедит, вот код:
Код:
var
i:Integer;
Form1: TForm1;

function TForm1.Bin(x: Integer): string;
const t:array[0..1] of char = ('0','1');
var res:string;
d:0..1;
begin
res:='';
while (x<>0) do
begin
d:=x mod 2 ;
res:=t[d]+res;
x:=x div 2 ;
end;
Bin:=res;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text:=Trim(Edit1.text);
 if edit1.text='' then exit;
 RichEdit1.clear;
 if RadioButton1.Checked=True then
 begin
 for i:=length(Edit1.text) downto 0 do
  begin
   if Edit1.Text[i]='1' then
   begin
     RichEdit1.Lines.Add(IntToStr(i)+'='+bin(i));
   end;
  end;
  Edit1.SetFocus;
  end;
  Button2.Visible:=True;
end;
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 05.03.2013, 10:07   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
for i:=length(Edit1.text) downto 1 do
нумерация в строке начинается с 1. (а массивы с 0).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 05.03.2013, 17:42   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

ды я знаю просто так поставил 0, пробовал и 1 и 0 поставить в цикле то, но все равно не так работает. например я ввел 1010
порядковый номер создается с конца строки начиная от 1 и т.д до конца(т.е до начала строки), то есть у числа 0 позиция 1, у числа 1 позиция 2, у числа 0 позиция 3, у числа 1 позиция 4. программа должна вывести в ричедит номера позиций единичек и перевести их в двоичный код, 1010 отработал не правильно, а вот 10101 работает нормально
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 05.03.2013, 18:02   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

а вот этот код почему-то работает, но он неэффективен, потому что большой, что тут можно оптимизировать?
Код:
var
i:Integer;
Form1: TForm1;

function TForm1.Bin(x: Integer): string;
const t:array[0..1] of char = ('0','1');
var res:string;
d:0..1;
begin
res:='';
while (x<>0) do
begin
d:=x mod 2 ;
res:=t[d]+res;
x:=x div 2 ;
end;
Bin:=res;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
  k:Byte;
begin
  Edit1.Text:=Trim(Edit1.text);
 if edit1.text='' then exit;
 RichEdit1.clear;
 if RadioButton1.Checked=True then
 begin
   k:=Length(Edit1.Text);
 for i:=1 to k do
  begin
   if Edit1.Text[i]='1' then
   RichEdit1.Lines.add(IntToStr(k)+'='+bin(k));
   Dec(k);
  end;
  Edit1.SetFocus;
 end;
  Button2.Visible:=True;
end;
И еще одно, из того что вывелось в ричедит нужно найти сумму (ну из двоичных чисел) как реализовать?
from dark to light)

Последний раз редактировалось Алексей_2012; 05.03.2013 в 18:04.
Алексей_2012 вне форума Ответить с цитированием
Старый 05.03.2013, 18:18   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для кода в #1
Код:
 for i:=length(Edit1.text) downto 1 do
...
RichEdit1.Lines.Add(IntToStr(length(Edit1.text)-i+1)+'='+bin(length(Edit1.text)-i+1));
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 07.03.2013, 00:23   #6
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Спасибо большое! Вот что получилось
Код:
function TForm1.Bin(x: Integer): string;
const t:array[0..1] of char = ('0','1');
var res:string;
d:0..1;
begin
res:='';
while (x<>0) do
begin
d:=x mod 2 ;
res:=t[d]+res;
x:=x div 2 ;
end;
Bin:=res;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit1.Text:=Trim(Edit1.text);
 if edit1.text='' then exit;
 RichEdit1.clear;
 if RadioButton1.Checked then
 begin
 for i:=length(Edit1.text) downto 1 do  if Edit1.Text[i]='1' then
 RichEdit1.Lines.Add(IntToStr(length(Edit1.text)-i+1)+'='+bin(length(Edit1.text)-i+1));
 Edit1.SetFocus;
 end;
  Button2.Visible:=True;
end;

А как в том же цикле суммировать те же двоичные цифры, переведенной функцией bin?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 07.03.2013, 20:17   #7
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

ну дак что, есть идеи реализации циклического сумматора?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 07.03.2013, 20:29   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Ну просуммируйте length(Edit1.text)-i+1 и сумму преобразуйте в двоичное с помощью функции
Код:
function IntToBin(Value: Integer; LenResult: Byte): String;
var i: Integer;
begin
  Result:='';
  for i:=0 to LenResult-1 do
    if Value and (1 shl i)>0 then Result:='1'+Result
                             else Result:='0'+Result;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:=IntToBin(333,24);
end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 08.03.2013, 00:26   #9
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

эмм, извиняюсь, нужно по модулю 2, то есть если порядковый номер 1 и 8, то в двоичном виде должно получится это:

+0001
1000=1001 ну инвертировать и получим избыточный код 0110, ну это я уже сам сделаю конечно, ладно думаю плохой пример взял, возьму еще один


+1111
0101
_______
1010, в общем если 1+1=0, если 0+1=1 или 1+0=1, и если 0+0=0)))

в общем нужно сложить все полученные номера позиции единиц в двоичном виде, и инверитровать, ну 0 заменить на 1, а 1 на 0
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 08.03.2013, 00:35   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для такого сложения XOR есть. Т.е. не суммируем, а используем XOR
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Массивы - не тот результат. amuleg Общие вопросы C/C++ 6 24.01.2012 14:25
не выводится результат rinatey Помощь студентам 0 06.12.2011 16:04
код Хеминга world12_tk Помощь студентам 0 02.06.2011 19:31
Код написал код, но ответ постоянно один и тот же SkuLLL Помощь студентам 4 14.12.2010 19:25
Не тот результат! Dawystrik Общие вопросы Delphi 3 22.03.2009 09:50