Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск слова в файле 
:(
    Опции темы
Gon
Дата 17.11.2008, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



Надо найти слово в неограниченном файле, выделить его цветом и вывести 5 строк текста содержащегося в файле, включая строку с словом.
Дак вот, написал код, слово находится, все работает. Но, если это слово явл. частью другого слова то то оно тоже выделяется цветом.
Помогите исправить код чтобы находило только имено слово.

Код

PROGRAM seach_;
USES CRT;
VAR
  T: TEXT;
  M, I: BYTE;
  Sl, TX: STRING;
  Ch: CHAR;
  Str: INTEGER;
PROCEDURE Stroki;
  BEGIN
    IF NOT EOF(T)
    THEN
      BEGIN
        READ(T, Tx);
        READLN(T);
        WRITELN(Tx)
      END
  END;
BEGIN
  CLRSCR;
  ASSIGN(T, 'Text.txt');
  RESET(T);
  WRITE('Введите слово: ');
  READ(Sl);
  Str := 0;
  Ch := 'Y';
  WHILE (NOT EOF(T)) AND (M = 0)
    DO
      BEGIN
        READ(T, TX);
        Str := Str + 1;
        FOR I := 1 TO length(TX)
        DO
          M := POS(Sl, TX);
        READLN(T);
      END;
  RESET(T);
  IF M > 0 THEN
    BEGIN
      WHILE Str > 1
      DO
        BEGIN
          READLN(T);
          Str := Str - 1
        END;
      WHILE M > 1
      DO
        BEGIN
          READ(T, Ch);
          WRITE(Ch);
          M := M - 1
        END;
      TEXTCOLOR(4);
      READ(T, Ch);
      WHILE (Ch <> ' ') AND (Ch <> ',') AND (Ch <> '.') AND (Ch <> '!')
            AND (Ch <> '?') AND (Ch <> ':') AND (Ch <> ';')
      DO
        BEGIN
          WRITE(Ch);
          READ(T, Ch);
        END;
      TEXTCOLOR(7);
      WRITE(Ch);
      Stroki;Stroki;Stroki;Stroki;Stroki;
    END;
END.
 

Это сообщение отредактировал(а) volvo877 - 17.11.2008, 20:15
PM MAIL   Вверх
volvo877
Дата 17.11.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 2
Всего: 116



Цитата(Gon @  17.11.2008,  17:21 Найти цитируемый пост)
Помогите исправить код чтобы находило только имено слово.
Тебе надо проверять, есть ли перед найденной позицией M разделитель (если M <> 1), и есть ли в позиции M+Length(SL) разделитель, если это не выходит за пределы строки... Если хотя бы одно из вышеприведенных условий не выполняется, то найденное тобой вхождение - это обрывок более длинного слова, и его мало того, что надо проигнорировать, надо ещё изъять этот обрывок из строки TX, потому что вслед за ним в этой же строке может встречаться ещё и отдельное слово SL...

Вот я тут поправил твою программу, попробуй, вроде нигде не накосячил:

Код

PROGRAM seach_;
USES CRT;

Const
  chars = [' ', ',', '.', '!', '?', ':', ';'];
VAR
  T: TEXT;
  M, I: BYTE;
  chng, Sl, TX: STRING;
  Ch: CHAR;
  Str: INTEGER;
  changed: boolean;

PROCEDURE Stroki;
  BEGIN
    IF NOT EOF(T)
    THEN
      BEGIN
        READ(T, Tx);
        READLN(T);
        WRITELN(Tx)
      END
  END;
BEGIN
  CLRSCR;
  ASSIGN(T, 'Text.txt');
  RESET(T);
  WRITE('Введите слово: ');
  READ(Sl);

  { 1: создаем строку для замены "обрывка слова" }
  chng := '';
  for i := 1 to length(sl) do
    chng := chng + '*';

  Str := 0;
  Ch := 'Y';
  WHILE (NOT EOF(T)) AND (M = 0)
    DO
      BEGIN
        READ(T, TX);
        Str := Str + 1;

        repeat
          changed := false;
          M := POS(Sl, TX);
          if m > 0 then begin
            if
              (
                (m = 1) or ((m > 1) and (tx[m - 1] in chars))
              )
              and
              (
                (m + length(sl) - 1 = length(tx)) or
                ((m + length(sl) - 1 < length(tx)) and (tx[m + length(sl)] in chars))
              )
              then
                {
                  Ok
                }
              else begin
                delete(tx, m, length(sl));
                insert(chng, tx, m);
                M := 0; changed := true;
              end;
          end;
        until not changed;
        READLN(T);
      END;
  RESET(T);
  IF M > 0 THEN
    BEGIN
      WHILE Str > 1
      DO
        BEGIN
          READLN(T);
          Str := Str - 1
        END;
      WHILE M > 1
      DO
        BEGIN
          READ(T, Ch);
          WRITE(Ch);
          M := M - 1
        END;
      TEXTCOLOR(4);
      READ(T, Ch);
      WHILE (Ch <> ' ') AND (Ch <> ',') AND (Ch <> '.') AND (Ch <> '!')
            AND (Ch <> '?') AND (Ch <> ':') AND (Ch <> ';')
      DO
        BEGIN
          WRITE(Ch);
          READ(T, Ch);
        END;
      TEXTCOLOR(7);
      WRITE(Ch);
      Stroki;Stroki;Stroki;Stroki;Stroki;
    END;
END.

PM MAIL   Вверх
Gon
Дата 17.11.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 30.4.2008

Репутация: нет
Всего: нет



Спс за алгоритм, щас попробую сам поправить, если неполучится на крайнсяк твое возьму.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0642 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.