Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 281

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты!
есть пример текста:
=========
снег
волна
=========
мусор
=========
снег
дерево
дети
=========
есть простой поиск через POS
if (Pos('дети', Strings[Index]) <> 0) ...
который выводит в TStringList строку, где есть слово "дети", а как организовать поиск строк между "======" по слову "дети"
т.е. в результате заносится в TStringList только:
=========
снег
дерево
дети
=========
если возможно примером кода.
Заранее спасибо.

paradale Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: paradale (статус: Посетитель)
Вопрос отправлен: 13 октября 2009, 14:12
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Егор

Здравствуйте, paradale!
Ставите на форму два Memo и кнопку. Обработчик кнопки приведён в приложении.
После запуска в первое мемо забиваете исходный текст, во втором - получаете искомые строчки.

Приложение:
  1. procedure TForm1.Button1Click(Sender: TObject);
  2. var
  3. i, i1, i2 : integer;
  4. begin
  5.  
  6.  
  7. inc(i);
  8. if i=Memo1.Lines.Count then
  9.  
  10.  
  11.  
  12. i1:=i;
  13. i2:=i;
  14.  
  15.  
  16. while (Pos('=========', Memo1.Lines[i1])=0) and (i1>0) do
  17. dec(i1);
  18.  
  19.  
  20. while (Pos('=========', Memo1.Lines[i2])=0) and (i2<Memo1.Lines.Count-1) do
  21. inc(i2);
  22.  
  23.  
  24. for i:=i1 to i2 do
  25. Memo2.Lines.Add(Memo1.Lines[i]);
  26. end;


Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 13 октября 2009, 18:58
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 10; последнее сообщение — 14 октября 2009, 21:12; участников в обсуждении: 4.

13 октября 2009, 14:36: Вопрос перемещён из тематического раздела Delphi » Общие вопросы по программированию в раздел Delphi » Алгоритмы, преобразования модератором Ерёмин А.А.

min@y™

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

paradale (статус: Посетитель), 13 октября 2009, 18:13 [#5]:

да. куча знаков равно - это часть текста.
Егор:
вы правильно поняли. так.
paradale

paradale (статус: Посетитель), 14 октября 2009, 18:36 [#6]:

Егор:
спасибо вам большое.
Егор

Егор (статус: 10-ый класс), 14 октября 2009, 18:47 [#7]:

спасибо?
а оценка за ответ где?

"а компот?" :)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
paradale

paradale (статус: Посетитель), 14 октября 2009, 20:49 [#8]:

сейчас будет оценка ) не успел.
только доп. вопрос.
ваш код ищет только первое вхождение, а как быть с последующими? пример:
=========
снег
дерево
дети
=========
витязь
=========
вода
радуга
дети
=========
ищем по слову дети и в мемо2 выводится только первое вхождение
=========
снег
дерево
дети
=========
paradale

paradale (статус: Посетитель), 14 октября 2009, 20:50 [#9]:

а необходимо еще вывести и второе
Егор

Егор (статус: 10-ый класс), 14 октября 2009, 21:12 [#10]:

ну вот ведь, а!
как суп, так и ложку :D

так и надо было писать, что нужно было все вхождения найти :)

вот, держите:
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.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:44
Выполнено за 0.03 сек.