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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2013, 02:44   #1
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию Не работает циклическое кодирование битов

Здравствуйте, не работает циклический код, суть его в том, чтобы:
1) приписать к Tedit1 столько нулей, сколько символов в Tedit2 но на 1 меньше

2)затем отделить с начала строки Tedit1 столько символов, сколько в tedit2 и сложить по модулю 2 отделенные символы с tedit2, не значимые 0 отбрасываются, далее к тому что осталось от сложения снести из tedit1 столько символов, сколько не хватает до количества символов из того же tedit2 ну и так далее, и за место добавленных в пункте 1 нулей поместить сумму, вот мой код, но почему-то у меня не получается((( Помогите кто может, сам уже больше недели решить пытаюсь

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



procedure translater(s: string; var summator1: integer);
var
  kils, i: integer;
  k, j: integer;
begin
  summator1:=0;
  j:=length(s)-1;
  for i:=1 to length(s) do
  begin
    k:=strtoint(s[i]);
    for kils:=1 to j do k:=k*2;
    summator1:=summator1+k;
    Dec(j);
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
 lork1,lork,ted: string;
  i1,k,  ciklizes1: integer;  
 begin
 lork:='';
 RichEdit1.Lines.add('Âàøå ÷èñëî: '+edit1.text);
 RichEdit1.Lines.Add('Âàøà èçáûòî÷íîñòü: '+edit2.text);
 RichEdit1.Lines.Add('Òàê êàê êîëëè÷åñòâî èçáûòî÷íîñòè='+inttostr(length(Edit2.Text))+' òî ê êîäó ïðèïèøåì '+inttostr(length(Edit2.Text)-1)+' íóëÿ(ü)');
 for i1:=1 to Length(Edit2.Text)-1 do lork:=lork+'0';
 RichEdit1.Lines.Add('-------------------------------------------------------');
 RichEdit1.Lines.Add('Ïîëó÷åíî ïðîìåæóòî÷íîå ÷èñëî: '+Edit1.text+lork);
 RichEdit1.Lines.Add('-------------------------------------------------------');
 lork1:='';
 lork:=Edit2.Text;
 translater(lork,ciklizes1);
 ted:=Edit1.Text;
 while ted<>'' do
 begin
  for i1:=1 to length(Edit2.Text) do
  begin
   lork1:=lork1+ted[1];
   Delete(ted,1,1);
  end;
   translater(lork1,k);
   ciklizes1:=(ciklizes1 xor k);
    RichEdit1.Lines.Add(Bin(ciklizes1));
  end;
 Edit1.clear;
 Edit2.Clear;
 Edit1.SetFocus;
 end;
З.Ы. Не рабочее только событие Tbutton1click
from dark to light)

Последний раз редактировалось Алексей_2012; 26.03.2013 в 02:50.
Алексей_2012 вне форума Ответить с цитированием
Старый 26.03.2013, 11:43   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
 RichEdit1.Lines.add('Âàøå ÷èñëî: '+edit1.text);
 RichEdit1.Lines.Add('Âàøà èçáûòî÷íîñòü: '+edit2.text);
перед тем, как скопировать текст в буфер обмена, включите РУССКУЮ раскладку клавиатуры. Обычно этого бывает достаточно, чтобы вставлялись на форум нормальные русские буковки, а не "кракозябры"...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 27.03.2013, 23:38   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Вот код, все никак не исправлю, кто-нибудь поможет, или слишком мало или не понятно объяснил цель задачи?
Код:
function Bin(x: Integer): string;
const
  t:array[0..1] of char = ('0','1');
var
  d: 0..1;
begin
  Result:='';
  while (x<>0) do
  begin
    d:=x mod 2;
    Result:=t[d]+Result;
    x:=x div 2;
  end;
end;



procedure translater(s: string; var summator1: integer);
var
  kils, i: integer;
  k, j: integer;
begin
  summator1:=0;
  j:=length(s)-1;
  for i:=1 to length(s) do
  begin
    k:=strtoint(s[i]);
    for kils:=1 to j do k:=k*2;
    summator1:=summator1+k;
    Dec(j);
  end;
end;



procedure TForm1.Button1Click(Sender: TObject);
var
 lork1,lork,ted: string;
  i1,k,  ciklizes1: integer;  
 begin
lork:='';
 RichEdit1.Lines.add('Ваше число: '+edit1.text);
 RichEdit1.Lines.Add('Ваша избыточность: '+edit2.text);
 RichEdit1.Lines.Add('Так как колличество избыточности='+inttostr(length(Edit2.Text))+' то к коду припишем '+inttostr(length(Edit2.Text)-1)+' нуля(ь)');
 for i1:=1 to Length(Edit2.Text)-1 do lork:=lork+'0';
 RichEdit1.Lines.Add('-------------------------------------------------------');
 RichEdit1.Lines.Add('Получено промежуточное число: '+Edit1.text+lork);
 RichEdit1.Lines.Add('-------------------------------------------------------');
 lork1:='';
 lork:=Edit2.Text;
 translater(lork,ciklizes1);
 ted:=Edit1.Text;
 while ted<>'' do
 begin
  for i1:=1 to length(Edit2.Text) do
  begin
   lork1:=lork1+ted[1];
   Delete(ted,1,1);
  end;
   translater(lork1,k);
   ciklizes1:=(ciklizes1 xor k);
    RichEdit1.Lines.Add(Bin(ciklizes1));
  end;
 Edit1.clear;
 Edit2.Clear;
 Edit1.SetFocus;
 end
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 28.03.2013, 09:16   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
или слишком мало или не понятно объяснил цель задачи?
мне, например, не очень понятно.
Вы пытаетесь объяснить какие-то частности,
а глобальное, на мой взгляд, остаётся за рамками объяснения.

попробуйте конкретизировать - описать что дано и что с этим нужно сделать.
Неплохо бы увидеть конкретный пример
если в Edit2 находится текст '0001' а в Edit1 находится текст 17
то, после нажатия на клавищу, ножно, чтобы в Edit2 добавилось 16 нулей
(т.е. стало 00000000000000000001)
после выделилось что-то с этим сделалось что-то..
моя программа делает то-то, а получается - то-то..

ну не знаю, на мой взгляд так как-то..

примечание 1. Я сейчас выражал исключительно своё, субъективное мнение. Я допускаю, что другим форумчанам понятен и ваш вопрос и то, что Вы пытаетесь получить, и то, что нужно исправить в вашем коде..

примечание 2. Рекомендовал бы Вам делать небольшие тестовые проекты, паковать исходники (можно без exe) в архив, архив выкладывать на форум. Часто это резко ускоряет помощь (проще открыть готовый исходник в Delphi, чем пытаться в уме "выполнить" код, глядя на код на страницах форума). Кроме того, сделанные изменения/исправления могут быть так же выложены на форум, что будет более удобно и быстро для вас...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 21.04.2013, 16:05   #5
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Ладно, вот пример того, как выполняется циклическое кодирование (фото во вложении)

допустим в Tedit1 ввели 10110101
Tedit2 ввели 101

Далее к Tedit1 добавляем два нуля (т.к в едит на 3 символа, то пишем 3-1=2 нуля, если бы в едит 2 было 4 символа, то писали бы три нуля и т.д)
Изображения
Тип файла: jpg циклическое кодирование.jpg (140.6 Кб, 125 просмотров)
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 21.04.2013, 16:41   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,308
По умолчанию

{тут был неправильный код }
"Затупил".
Думаю дальше...

Возник вопрос по ходу решения.
"к тому что осталось от сложения снести из tedit1 столько символов, сколько не хватает до количества символов из того же tedit2" - у Вас в примере на одном из этапов получилось 111, но Вы все равно снесли 0. Как это понимать?

Также, интересно узнать, откуда Вы взяли алгоритм.

Если придерживаться алгоритма из первого поста, то:
Код:
procedure TForm1.Button2Click(Sender: TObject);
var
  lork, p: string;
  k, i, j, f, len: integer;
begin
  RichEdit1.Clear;
  lork := Edit1.text;
  f := ord('0');
  p := Edit2.text;
  k := length(Edit2.text);
  RichEdit1.Lines.add('Ваше число: ' + lork);
  RichEdit1.Lines.add('Ваша избыточность: ' + Edit2.text);
  RichEdit1.Lines.add('Так как колличество избыточности=' + inttostr(k)
      + ' то к коду припишем ' + inttostr(k - 1) + ' нуля(ь)');
  for i := 1 to k - 1 do
    lork := lork + '0';
  len := length(lork);
  i := 0;
  while (i < len - k + 1) do
  begin
    for j := 1 to k do
      lork[i + j] := chr((ord(lork[i + j]) + ord(p[j]) - 2 * f) mod 2 + f);
    j := 1;
    while (lork[i + j] = '0') and (j <= k) do
      inc(j);
    i := i + j - 1;
  end;
  RichEdit1.Lines.add('Число, сложенное со 2м: ' + lork);
  RichEdit1.Lines.add('Измененное число: ' + Edit1.text + copy(lork,
      len - k + 2, k - 1));
  Edit1.Clear;
  Edit2.Clear;
  Edit1.SetFocus;
end;
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 21.04.2013 в 17:12.
BDA вне форума Ответить с цитированием
Старый 21.04.2013, 17:58   #7
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

алгоритм препод объяснял, чтобы мы учились работать с циклическим избыточным кодированием, на предыдущем курсе другой препод давал другой алгоритм
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 21.04.2013, 18:03   #8
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

тут все заработало, BDA, спасибо вам огромное, а что у меня не так в коде было?
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 21.04.2013, 18:13   #9
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,308
По умолчанию

Пожалуйста. Честно говоря, не стал разбирать Ваш код, раз он работал неправильно (сразу стало понятно, что он слишком большой для такой задачи).
Времязатраты на поиски ошибки в Вашем коде больше, чем написание своего кода с нуля.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 21.04.2013, 18:15   #10
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Вот сейчас разбираюсь в вашем коде, если будет что-то не понятно, напишу, потому что хочу в алгоритме разобраться
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Циклическое выполнение функции coNsept Общие вопросы C/C++ 1 04.10.2011 11:59
Циклическое включение russian-stalker Общие вопросы C/C++ 2 04.01.2011 14:33
Циклическое воспроизведение mp3 c++ builder romec1 Gamedev - cоздание игр: Unity, OpenGL, DirectX 11 02.06.2010 15:46
Циклическое копирование - автоматизация копирования metrosoul Microsoft Office Excel 1 11.04.2010 14:35
Циклическое воспроизведение grom333 Мультимедиа в Delphi 7 17.01.2010 18:16