![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
Lo |
![]()
Сообщение
#1
|
Гость ![]() |
Рассказываю: необходим код по прямому поиску строки в тексте. Прямой, значит символьные элементы заносятся в массив и подстрока последовательно смещаясь сравнивается со строкой. Такой алгоритм есть еще у Вирта, но достаточно древний. А необходимо реализовать поиск со знаками *, ?. Только нужен элегантный код. Заранее спасибо
Сообщение отредактировано: volvo - 17.12.2004 16:35 |
___ALex___ |
![]()
Сообщение
#2
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
см. исходник Pos-а
|
Lo |
![]()
Сообщение
#3
|
![]() Группа: Пользователи Сообщений: 8 Репутация: ![]() ![]() ![]() |
Что значит Pos-a в исходниках?
|
mvg |
![]()
Сообщение
#4
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 36 Репутация: ![]() ![]() ![]() |
поконкретней о задаче
-------------------- Да пребудет паскаль вовеки!
|
GLuk |
![]()
Сообщение
#5
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
Покажи что сам написал, юзая "древний" способ Вирта.
После знака * могут следовать какие-нибудь символы (вероятнее всего могут конечно, но вдруг чо)?? Исходник Pos'a - это либо дизассемблить тот участок кода (Pos - это процедурка такая в паскале) или просто поглядеть в дебуггере |
Lo |
![]()
Сообщение
#6
|
![]() Группа: Пользователи Сообщений: 8 Репутация: ![]() ![]() ![]() |
mvg
Задача: найти слово в тексте. Проще - подстроку в строке. Но стандатные функции работы со строками не используются(Pos). У вирта есть алгоритм поиска, когда текст представлен, как массив char'ов и слово ищется в нем, сравнивая почленно элементы массива и сдвигая дальше. Вопрос: как эффективно реализовать поиск, если знаки * и ? встречаются в искомом слове. (Так, возможно, ищутся по имени файлы в винде) |
Lo |
![]()
Сообщение
#7
|
![]() Группа: Пользователи Сообщений: 8 Репутация: ![]() ![]() ![]() |
Gluk
Исходники Pos-а не пойдут: там не реализован поиск с *. |
trminator |
![]()
Сообщение
#8
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
на pascal.sources.ru много таких исходников
-------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Lo |
![]()
Сообщение
#9
|
![]() Группа: Пользователи Сообщений: 8 Репутация: ![]() ![]() ![]() |
Спасибо всем! Тему можно закрывать. Все получилось
|
trminator |
![]()
Сообщение
#10
|
Четыре квадратика ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 579 Пол: Мужской Репутация: ![]() ![]() ![]() |
Так выложи, что получилось-то. Другим тоже интересно!
-------------------- Закон добровольного труда Зимерги:
Люди всегда согласны сделать работу, когда необходимость в этом уже отпала |
Lo |
![]()
Сообщение
#11
|
![]() Группа: Пользователи Сообщений: 8 Репутация: ![]() ![]() ![]() |
Мне текст отправить в исходники или кусок кода выложить сюда?
|
GLuk |
![]()
Сообщение
#12
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
Для полного завершения темы по ходу лучше сюда постить, а после в исходники.
|
GLuk |
![]()
Сообщение
#13
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Мне текст отправить в исходники или кусок кода выложить сюда? кусок кода выложить сюда? |
Lo |
![]()
Сообщение
#14
|
![]() Группа: Пользователи Сообщений: 8 Репутация: ![]() ![]() ![]() |
Соответственно, в главной вызывается 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 |
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 18:41 |