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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.06.2012, 20:04   #1
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию Не могу додуматься как реализовать

В общем уже пару часов думаю как реализовать свое задание в код.
Суть, есть набор чисел состоящая только из трех чисел 0,1,2
записанных в ListBox
Вот ее кусок
Код:
1
1
1
2
1
1
0
(И так пару тысяч строк)
Нужно постепенно прогонять числа в цикле, и если выпадет последовательность
Код:
1
2
1
2
1
2
1
то надо выполнить действие (скажем сложить) и потом двигаемся дальше, встретилась опять последовательно опять выполнили действие и т.д.

Не могу придумать как ловить эти последовательности

Всем откликнувшимся спасибо!

Последний раз редактировалось bakanaev; 19.06.2012 в 20:33.
bakanaev вне форума Ответить с цитированием
Старый 19.06.2012, 20:21   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
Нужно постепенно прогонять числа в цикле, и если выпадет последовательность
Если длина последовательности фиксирована (задана).
Код:
 if (listbox.items[i+0]='1') 
and (listbox.items[i+1]='2')
and (listbox.items[i+2]='1')
and ... 
then begin
  showmessage('Мы нашли!');
end;
Код:
k:=0;
listbox.items.delimiter:=';';
s:=listbox.DelimiterText;
while k>=0 do begin
  k:=posEx('1;2;1;2;1;2;', s, k+1);
  if k>0 then i:=k div 2 else i:=-1;
  if i>=0 then
    showmessage('Нашли в строке ' + inttostr(i));
end;
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 19.06.2012, 20:34   #3
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

evg_m,
По ходу я не так задал вопрос, надо как только встретится последовательность выполнить действие (скажем сложить) и потом двигаемся дальше, встретилась опять последовательно опять выполнили действие и т.д.

Там строк 3 миллиона )))
P.S Поправил первый пост
bakanaev вне форума Ответить с цитированием
Старый 19.06.2012, 21:12   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Чуть изменив код evg_m
Код:
for i:=0 to listbox.items.count-7 do
  if (listbox.items[i+0]='1') and 
     (listbox.items[i+1]='2') and
     (listbox.items[i+2]='1') and
     (listbox.items[i+3]='2') and
     (listbox.items[i+4]='1') and
     (listbox.items[i+5]='2') and
     (listbox.items[i+6]='1') then begin
    //выполняем действие
  end;
Но больно мрачно в ListBox. Хотя бы в StringList или просто в символьной строке или Stream
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.06.2012, 21:49   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Я думаю, конечный автомат.
Задаете шаблон в массиве символов или чисел - как удобнее.
Состояние автомата =0.
Сравниваете очередной элемент с символом шаблона, имеющим номер состояния автомата, если совпадает, увеличиваете номер состояния автомата. Нет - сбрасываете в 0.
Если номер состояния достиг длины шаблона - искомая последовательность найдена.
Примерно так (не проверял):
Код:
State := 0;
for i:=0 to listbox.items.count-1 do begin
  if (listbox.items[i]=sample[State])then 
    inc(State)
  else
    State := 0;
  if State = SampleLength then begin
    //выполняем действие
    State := 0;
  end;
end;
Соответственно, код не меняется при изменении длины последовательности.

Последний раз редактировалось s-andriano; 19.06.2012 в 22:07.
s-andriano вне форума Ответить с цитированием
Старый 19.06.2012, 21:52   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
мрачно в ListBox
Не то слово... Тормоза обещаются обильные учитывая
Цитата:
Там строк 3 миллиона )))
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 20.06.2012, 04:21   #7
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не то слово... Тормоза обещаются обильные учитывая
Да ладно вам))) Я не спишу не куда
bakanaev вне форума Ответить с цитированием
Старый 20.06.2012, 05:22   #8
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Задача вновь актуальна.
Вариант который предложили выше
Код:
for i:=0 to listbox.items.count-7 do
  if (listbox.items[i+0]='1') and 
     (listbox.items[i+1]='2') and
     (listbox.items[i+2]='1') and
     (listbox.items[i+3]='2') and
     (listbox.items[i+4]='1') and
     (listbox.items[i+5]='2') and
     (listbox.items[i+6]='1') then begin
    //выполняем действие
  end;
Не подходит. Вот почему
Пусть у нас такая последовательность
Код HTML:
1
2
1
То если в наборе будит такой кусок

Код HTML:
1
2
1
2
1
2
То получается что последовательность находится 2 раза, что не правильно в моем случае

Выход это использовать что то типа счетчика как предложил s-andriano, но его код я что не смог понять + как не крути делфи на него все равно ругается
Цитата:
Сообщение от s-andriano Посмотреть сообщение
Код:
State := 0;
for i:=0 to listbox.items.count-1 do begin
  if (listbox.items[i]=sample[State])then 
    inc(State)
  else
    State := 0;
  if State = SampleLength then begin
    //выполняем действие
    State := 0;
  end;
end;
Может кто подскажет как реализовать?
Я пока сам буду думать, но и ваши мысли с удовольствием послушаю!
bakanaev вне форума Ответить с цитированием
Старый 20.06.2012, 06:36   #9
Malgor
Пользователь
 
Регистрация: 04.04.2012
Сообщений: 22
По умолчанию

Код:
for i:=0 to listbox.items.count-7 do
 begin 
 if x>0 then
     begin
        x:=x-1;
        continue
     end;
  if (listbox.items[i+0]='1') and 
     (listbox.items[i+1]='2') and
     (listbox.items[i+2]='1') and
     (listbox.items[i+3]='2') and
     (listbox.items[i+4]='1') and
     (listbox.items[i+5]='2') and
     (listbox.items[i+6]='1') then 
      begin
         x:=6;
         //выполняем действие
     end;
  end;
Коряво, но думаю что-то в этом роде должно работать.

Последний раз редактировалось Malgor; 20.06.2012 в 06:38. Причина: поправил код
Malgor вне форума Ответить с цитированием
Старый 20.06.2012, 06:39   #10
bakanaev
Форумчанин
 
Регистрация: 27.03.2012
Сообщений: 438
По умолчанию

Цитата:
Сообщение от Malgor Посмотреть сообщение
[CODE
if x>0 then
begin
x:=x-1;
continue
end;
Объясните пожалуйста зачем это делать? Я пока начинающий, так что для меня не все понятно
bakanaev вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
не могу реализовать код masterlightsmoke Общие вопросы C/C++ 4 08.12.2011 02:02
не могу реализовать дерево maestro1992 Общие вопросы C/C++ 0 08.11.2010 22:34
не могу додуматься как исправит программу ... YooGine Общие вопросы C/C++ 2 23.07.2010 11:44
Текстовая формула (не могу додуматься) WIC Microsoft Office Excel 1 26.02.2009 12:35