| 
| 
 | Вопрос # 3 281/ вопрос открыт / | 
 |  Доброго времени суток, уважаемые эксперты!есть пример текста:
 =========
 снег
 волна
 =========
 мусор
 =========
 снег
 дерево
 дети
 =========
 есть простой поиск через POS
 if (Pos('дети', Strings[Index]) <> 0) ...
 который выводит в TStringList строку, где есть слово "дети", а как организовать поиск строк между "======" по слову "дети"
 т.е. в результате заносится в TStringList только:
 =========
 снег
 дерево
 дети
 =========
 если возможно примером кода.
 Заранее спасибо.
 
|  |   Вопрос задал: paradale (статус: Посетитель)Вопрос отправлен: 13 октября 2009, 14:12
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: Егор Здравствуйте, paradale!Ставите на форму два Memo и кнопку. Обработчик кнопки приведён в приложении.
 После запуска в первое мемо забиваете исходный текст, во втором - получаете искомые строчки.
 Приложение:Переключить в обычный режим procedure TForm1.Button1Click(Sender: TObject);var  i, i1, i2 : integer;begin      inc(i);  if i=Memo1.Lines.Count then     i1:=i;  i2:=i;    while (Pos('=========', Memo1.Lines[i1])=0) and (i1>0) do    dec(i1);    while (Pos('=========', Memo1.Lines[i2])=0) and (i2<Memo1.Lines.Count-1) do    inc(i2);    for i:=i1 to i2 do    Memo2.Lines.Add(Memo1.Lines[i]);end;
|  | Ответ отправил: Егор (статус: 10-ый класс)Время отправки: 13 октября 2009, 18:58
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 10; последнее сообщение — 14 октября 2009, 21:12; участников в обсуждении: 4. 13 октября 2009, 14:36: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А. 
|   | min@y™ (статус: Доктор наук), 13 октября 2009, 15:05 [#1]:Нифига не понял. Объясни подробнее. Делаю лабы и курсачи по Delphi и Turbo Pascal. За ПИВО! Пишите в личку, а лучше в аську. А ещё лучше - звоните в скайп! |  
|   | Вадим К (статус: Академик), 13 октября 2009, 15:32 [#2]:кучка знаков равно - это часть текста, которые как бы ограничивают блок? и хочется вывести только тот блок, который содержит заданное слово? Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Егор (статус: 10-ый класс), 13 октября 2009, 15:34 [#3]:я так понял: 
 =========
снег
волна
=========- детей нет, не выводим 
 
 =========
мусор
=========- детей нет, не выводим 
 
 =========
снег
дерево
дети
=========- дети есть, выводим 
 так?
 Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | Егор (статус: 10-ый класс), 13 октября 2009, 15:42 [#4]:проще всего - сначала найти строчку с детьми, а потом уже двигаться вверх и вниз в поисках ограничителей Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | paradale (статус: Посетитель), 13 октября 2009, 18:13 [#5]:да. куча знаков равно - это часть текста. Егор:
 вы правильно поняли. так.
 |  
|   | paradale (статус: Посетитель), 14 октября 2009, 18:36 [#6]:Егор: спасибо вам большое.
 |  
|   | Егор (статус: 10-ый класс), 14 октября 2009, 18:47 [#7]:спасибо? а оценка за ответ где?
 
 "а компот?"
   Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  
|   | paradale (статус: Посетитель), 14 октября 2009, 20:49 [#8]:сейчас будет оценка ) не успел. только доп. вопрос.
 ваш код ищет только первое вхождение, а как быть с последующими? пример:
 =========
 снег
 дерево
 дети
 =========
 витязь
 =========
 вода
 радуга
 дети
 =========
 ищем по слову дети и в мемо2 выводится только первое вхождение
 =========
 снег
 дерево
 дети
 =========
 |  
|   | paradale (статус: Посетитель), 14 октября 2009, 20:50 [#9]:а необходимо еще вывести и второе |  
|   | Егор (статус: 10-ый класс), 14 октября 2009, 21:12 [#10]:ну вот ведь, а! как суп, так и ложку
  
 так и надо было писать, что нужно было все вхождения найти
  
 вот, держите:
 
 procedure TForm1.Button1Click(Sender: TObject);
var
  i, i1, i2, k : integer;
begin
  Memo2.Clear; // очистим второе мемо перед выводом туда
 
  // ищем детей:
  for i:=0 to Memo1.Lines.Count-1 do
    if (Pos('дети', Memo1.Lines[i])>0) then
    begin
      i1:=i;
      i2:=i;
 
      // будем искать предыдущие знаки "равно"
      while (Pos('=========', Memo1.Lines[i1])=0) and (i1>0) do
        dec(i1);
 
      // будем искать последующие знаки "равно"
      while (Pos('=========', Memo1.Lines[i2])=0) and (i2<Memo1.Lines.Count-1) do
        inc(i2);
 
      // теперь запишем выделенные строчки во второе мемо
      for k:=i1 to i2 do
        Memo2.Lines.Add(Memo1.Lines[k]);
    end;
end;Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.— Donald E. Knuth.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |