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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2012, 06:44   #11
Malgor
Пользователь
 
Регистрация: 04.04.2012
Сообщений: 22
По умолчанию

Это условие будет прерывать выполнение тела цикла пока x>0, т.е. мы пропустим участок с уже найденной комбинацией и дальнейшая проверка будет идти уже после неё
Malgor вне форума Ответить с цитированием
Старый 20.06.2012, 07:40   #12
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Цитата:
Сообщение от bakanaev Посмотреть сообщение
То получается что последовательность находится 2 раза, что не правильно в моем случае

Выход это использовать что то типа счетчика как предложил s-andriano, но его код я что не смог понять + как не крути делфи на него все равно ругается


Может кто подскажет как реализовать?
Я пока сам буду думать, но и ваши мысли с удовольствием послушаю!
"Делфи ругается" - замечательная диагностика. Что пишет то?
У меня Делфи не установлена, поэтому при всем желании проверить никак не могу.
Но подозреваю, что "ругается" не на приведенный мной код, а на что-то вне его, например, не забыли ли Вы описать константы?
Должно быть примерно так:
Код:
const
  SampleLength = 5;
  sample : array[0..SampleLength-1]of char = ('1','2','1','2','1');
s-andriano вне форума Ответить с цитированием
Старый 20.06.2012, 09:26   #13
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
Да ладно вам))) Я не спишу не куда
советую посмотреть мой второй вариант (см пост 1).
С небольшой доработкой учитывая
Цитата:
То получается что последовательность находится 2 раза, что не правильно в моем случае
код с доработкой и пояснениями.
Код:
k:=0;
listbox.items.delimiter:=';';
s:=listbox.DelimiterText;             //получаем одну большую строку где исходные строки списка разделены ';'
s:=s +';'                             // для общности в конец добавим еще одну чтобы получить строку такого вида  '1;2;3;1;1;1;'
while k>=0 do begin                   // пока не посмотрели всю строку
  k:=posEx('1;2;1;2;1;2;', s, k+1);   // ищем нужную посл-ть начиная с k+1 позиции строки
  if k>0 then i:=k div 2 else i:=-1;  // переходим от индекса в строке(k) к индексу в списке (i) -1 такой последовательности нет
  if i>=0 then begin
    // здесь ваши действия например! showmessage('Нашли в строке ' + inttostr(i));
    k:=k+12;                          // 12 это - длина строки '1;2;1;2;1;2;'
    // ! если в результате действий ListBox изменился то надо снова s:=...  
  end;
end;
в случае если индекс в списке не нужен, достаточно только факта что нашли.
следующие две строки
Код:
  if k>0 then i:=k div 2 else i:=-1;  
  if i>=0 then begin
выше заменяются на одну
Код:
  if k>0 then begin
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 20.06.2012 в 09:33.
evg_m вне форума Ответить с цитированием
Старый 20.06.2012, 09:35   #14
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

а вы не пробовали все эти цифры прегнать в строку? и использовать команду pos? если строки гиганские(несколько млн) то тогда искать первое вхождение в и удалять просмотренное.

Код:
var
s1:AnsiString;
poisk:string;
i,glob:integer;
begin
  s1:='115111100090911112011111111011110';
  poisk:='1111';
  glob:=0;
  while pos(poisk,s1)> 0 do
  begin
    i:=pos(poisk,s1);
    glob:=glob+i;
    Label1.Caption:=Label1.Caption+' '+inttostr(glob);//собираем начальные индексы
    delete(s1,1,i);//удаляем всё что проглядел и ненашёл . (если последовательность можно включать друг в друга)
  end;
end;
наверное долгий алгоритм, но просто я привык пользоваться стандартными средствами языка.

или если использовать библиотеку StrUtils как советуют выше то получиться на строчку меньше и если подумать на одну переменную меньше.
Код:
var
s1:AnsiString;
poisk:string;
i,glob:integer;
begin
  s1:='115111100090911112011111111011110';
  poisk:='1111';
  glob:=1;
  while posEx(poisk,s1,glob)> 0 do
  begin
    i:=posEx(poisk,s1,glob);
    glob:=i+1;
    Label1.Caption:=Label1.Caption+' '+inttostr(glob-1);//собираем начальные индексы
  end;
end;
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.

Последний раз редактировалось IliaIT; 20.06.2012 в 10:18.
IliaIT вне форума Ответить с цитированием
Старый 20.06.2012, 10:10   #15
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,527
По умолчанию

Цитата:
если строки гиганские(несколько млн) то тогда искать первое вхождение в и удалять просмотренное.
Как раз большие строки в циклах лучше не трогать (удалять, а тем более добавлять). Модификация большого куска медленной (по сравнению со скоростью процессора) памяти.=> тормоз.
а использовать PosEx поиск с указанной позиции (>=Delphi7).
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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