IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Прямой поиск строки
Lo
сообщение 17.11.2003 14:49
Сообщение #1


Гость






Рассказываю: необходим код по прямому поиску строки в тексте. Прямой, значит символьные элементы заносятся в массив и подстрока последовательно смещаясь сравнивается со строкой. Такой алгоритм есть еще у Вирта, но достаточно древний. А необходимо реализовать поиск со знаками *, ?. Только нужен элегантный код. Заранее спасибо

Сообщение отредактировано: volvo - 17.12.2004 16:35
 К началу страницы 
+ Ответить 
___ALex___
сообщение 17.11.2003 18:39
Сообщение #2


Бывалый
***

Группа: Пользователи
Сообщений: 282

Репутация: -  0  +


см. исходник Pos-а
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lo
сообщение 18.11.2003 13:30
Сообщение #3





Группа: Пользователи
Сообщений: 8

Репутация: -  0  +


Что значит Pos-a  в исходниках?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
mvg
сообщение 18.11.2003 14:07
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 36

Репутация: -  0  +


поконкретней о задаче


--------------------
Да пребудет паскаль вовеки!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 18.11.2003 18:53
Сообщение #5


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Покажи что сам написал, юзая "древний" способ Вирта.
После знака * могут следовать какие-нибудь символы (вероятнее всего могут конечно, но вдруг чо)??
Исходник Pos'a - это либо дизассемблить тот участок кода (Pos - это процедурка такая в паскале) или просто поглядеть в дебуггере
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lo
сообщение 19.11.2003 13:08
Сообщение #6





Группа: Пользователи
Сообщений: 8

Репутация: -  0  +


mvg
Задача: найти слово в тексте. Проще - подстроку в строке. Но стандатные функции работы со строками не используются(Pos). У вирта есть алгоритм поиска, когда текст представлен, как массив char'ов и слово ищется в нем, сравнивая почленно элементы массива и сдвигая дальше. Вопрос: как эффективно реализовать поиск, если знаки * и ? встречаются в искомом слове. (Так, возможно, ищутся по имени файлы в винде)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lo
сообщение 19.11.2003 13:12
Сообщение #7





Группа: Пользователи
Сообщений: 8

Репутация: -  0  +


Gluk
Исходники Pos-а не пойдут: там не реализован поиск с *.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 19.11.2003 19:33
Сообщение #8


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


на pascal.sources.ru много таких исходников


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lo
сообщение 24.11.2003 12:09
Сообщение #9





Группа: Пользователи
Сообщений: 8

Репутация: -  0  +


Спасибо всем! Тему можно закрывать. Все получилось
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
trminator
сообщение 24.11.2003 17:14
Сообщение #10


Четыре квадратика
****

Группа: Пользователи
Сообщений: 579
Пол: Мужской

Репутация: -  4  +


Так выложи, что получилось-то. Другим тоже интересно!


--------------------
Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lo
сообщение 27.11.2003 14:52
Сообщение #11





Группа: Пользователи
Сообщений: 8

Репутация: -  0  +


Мне текст отправить в исходники или кусок кода выложить сюда?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 27.11.2003 15:31
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Для полного завершения темы по ходу лучше сюда постить, а после в исходники.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
GLuk
сообщение 29.11.2003 8:38
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 775
Пол: Мужской

Репутация: -  0  +


Цитата
Мне текст отправить в исходники или кусок кода выложить сюда?


кусок кода выложить сюда?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lo
сообщение 1.12.2003 13:54
Сообщение #14





Группа: Пользователи
Сообщений: 8

Репутация: -  0  +


Соответственно, в главной вызывается SmpStr

Код
procedure MaskForm(var M: string);
begin
 i:=1;
 if first=1 then
 begin
   inc(first);
   While True Do
   Begin
     J:=Length(M);
     While I<Length(M) Do
     Begin
       If (M[I]='?') And (M[I+1]='*') Then Delete(M,I,1);
       If (M[I]='*') And (M[I+1]='?') And (I<Length(M)) Then Delete(M,I+1,1);
       If (M[I]='*') And (M[I+1]='*') And (I<Length(M)) Then Delete(M,I,1);
       Inc(I);
     End;
     If J=Length(M) Then Break;
     I:=1;
   End;
 end;
end;

Function StrCmp(S,Mask:String):boolean;
Var
 Msk,St: string;
Begin
 { Приведение маски к формальному виду. Производится однократно }
 MaskForm(Mask);
 { Блок сравнения с маской }
 Ok:=True;
 I:=1;
 J:=0;
 repeat
   j:=j+1;
   i:=1;
   While TRUE Do
   Begin
    Case Mask[I] Of
    '*':
     Begin
      if I=Length(Mask) then Ok:= true
      else
      begin
        washere:= true; { Рекурсивная проверка совпадений для части строки, идущей после символа '*' }
        Msk:=Copy(Mask,I+1,Length(Mask)-I+1);
        St:=Copy(S,J,Length(S)-J+1);
        While (St<>'') And (NOT StrCmp(St,Msk)) Do
        Delete(St,1,1);
        If St='' Then Ok:=False
                 else
                 begin
                   J:=Pos(St,S);
                   break;
                 end;
      end;
     End;
   '?':
    Begin
     if I=Length(Mask) then OK:= true
     else
     begin
       If (I=Length(Mask)) And (J<Length(S)) Then Ok:=False;
       If J>Length(S) Then Ok:=False;
       Inc(J);
     end;
    End;
   Else If Mask[I]<>S[J]
   Then begin
          Ok:= false;
          break;
        end
   Else begin
          if FirstIn= 0 then FirstIn:= J;
          Inc(J);
          Ok:= true;
        end;
   End;
   q:= Length(S);
   If J-1>Length(S) Then Ok:=False;
   If Not Ok Then Break;
   w:= Length(Mask);
   Inc(I);
   If I>Length(Mask) Then Break;
 End;
 w:= Length(Mask);
 q:= Length(S);
 if washere then begin
                   if (j=w+1) or (j=w) then Yes:= true
                 end
 else
 begin
   if (i>w) then Yes:= true
 end
 until (j>=q) or Yes;
 StrCmp:=Ok;
end;


Сообщение отредактировано: volvo - 17.12.2004 16:36
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.07.2025 18:41
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"