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

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

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

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

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

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

Здравствуйте, не работает код по паритету, данные вводятся в edit1. Если допустим пользователь введет такое число в двоичной системе счисления: 10010111, то в ричедит должно вывестись такое значение:
1+0=1; 1+0=1; 1+1=0; 0+0=0; 0+1=1; 1+1=0; 0+1=1; и последнее полученное число должно добавится к введенному пользователем числу, то есть тут пользователь ввел 10010111, при паритетном кодировании вышла единичка, значит выводится решение, а затем 100101111, вот так, вот мой код, но прежде 2 слова по той же задаче, но другому алгоритму, я его смог реализовать, но он мне не подходит: сравнивать первый и последующие символы с '1', если есть еденица, то наращивается байтовая переменная, затем определяется четность этой переменной, если значение в переменной четное, то к введенному код прибавляется 0 иначе 1, а вот код первого алгоритма, должно вывестись с решением:

Код:
procedure TForm1.Button1Click(Sender: TObject);
var s,l,m,k:string;
begin

   s:='';
   l:='';
   for i:=1 to length(edit1.text) do
   begin
    l:=Edit1.Text[i-1];
    s:=Edit1.Text[i];
    if (l='1') and (s='1') then
    m:='0'
    else
    if (l='0') and (s='0') then
    m:='0'
    else
    if (l='0') and (s='1') then
    m:='1'
    else
     if (l='1') and (s='0') then
     m:='1';


    k:=s+'+'+m;

   end;
   richedit1.lines.add(k);


 end;
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 08.03.2013, 14:41   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

1) цикл от 2
2) переменную l инициализировать перед циклом как l := Edit1.Text[1];
3) richedit1.lines.add(k); надо сразу после k:=s+'+'+m;
4) но вместо k:=s+'+'+m; надо k:=l+'+'+s;
5) а после этого вставить l:=m;
6) все условия это выполнение операции XOR, чтобы меньше писать можно переписать как str(integer(not (l=s)),m); ну или дельфийскими преобразованиями в которых букв больше ))
7) в конце вывести edit1.text+l;
eoln вне форума Ответить с цитированием
Старый 09.03.2013, 01:58   #3
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Спасибо, смог написать только так
Код:
 
procedure TForm1.Button1Click(Sender: TObject);
var s,l,m,k:string;
begin
   s:='';
  l := Edit1.Text[1];
   for i:=2 to length(edit1.text) do
   begin
       s:=Edit1.Text[i];
    if (l='1') and (s='1') then
    m:='0'
    else
    if (l='0') and (s='0') then
    m:='0'
    else
    if (l='0') and (s='1') then
    m:='1'
    else
     if (l='1') and (s='0') then
     m:='1';


    k:=s+'+'+m;
    richedit1.lines.add(k);
     l:=m;
   end;
         edit1.text:=edit1.text+l;
 end;
но тут такая проблема, то что должно выводится в рич едит первым-выводится последним, пробовал менять цикл на downto и l:=edit1.text[length(edit1.text)]; тогда в рич едит ничего не выводится

напишите пожалуйста код с XOR
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 09.03.2013, 02:37   #4
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

Хотя нет, сам сделал, и оптимизировал как мог, но есть способ написать еще меньше строк кода?
Код:
 
var
s,l,k:string;

procedure tform1.paritet;
begin
k:=s+'+'+edit1.Text[i];
RichEdit1.Lines.Add(k+'='+l);
s:=l;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
   RichEdit1.lines.Add('Êîä ïî ïàðèòåòó. Ðåøåíèå.');
   RichEdit1.lines.Add('-------------------------------------');
  s:=Edit1.Text[1];
  for i:=2 to Length(Edit1.Text) do
  begin
   if (s='1') and (Edit1.Text[i]='0') or (s='0') and (Edit1.Text[i]='1')then  l:='1'
   else
   if (s='1') and (Edit1.Text[i]='1') or (s='0') and (Edit1.Text[i]='0') then
   l:='0';
    paritet;
  end;
    RichEdit1.lines.Add('-------------------------------------');
    RichEdit1.lines.Add('Èòîã: '+Edit1.Text+'='+edit1.Text+s);
 end;
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Старый 09.03.2013, 09:37   #5
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Можно и короче (пункт 6)
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  s, l:string;
  i: integer;
begin
  RichEdit1.lines.Add('???');
  RichEdit1.lines.Add('-------------------------------------');
  s:=Edit1.Text[1];
  for i:=2 to Length(Edit1.Text) do
  begin
    str(integer(not (s=Edit1.Text[i])), l);
    RichEdit1.Lines.Add(s+'+'+edit1.Text[i]+'='+l);
    s:=l;
  end;
  RichEdit1.lines.Add('-------------------------------------');
  RichEdit1.lines.Add('???: '+Edit1.Text+'='+edit1.Text+s);
end;
eoln вне форума Ответить с цитированием
Старый 09.03.2013, 16:19   #6
Алексей_2012
t45t
Участник клуба
 
Аватар для Алексей_2012
 
Регистрация: 20.03.2012
Сообщений: 1,849
По умолчанию

спасибо, все работает, а как складывать двоичные числа в цикле? на теме обсуждается код по Хемингу, там у меня почти ничего не получилось
from dark to light)
Алексей_2012 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не работает код ctpz PHP 11 20.09.2012 14:03
Не работает код Sylar9 Общие вопросы C/C++ 1 03.04.2012 19:32
Не работает код hello19 Общие вопросы C/C++ 11 08.08.2011 16:08
Код не работает в IE asdasdasdasd HTML и CSS 5 24.08.2010 19:36
Не работает код. Messer Общие вопросы Delphi 0 15.05.2010 21:11