Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.12.2010, 20:14
Kekcuk Kekcuk вне форума
Прохожий
 
Регистрация: 19.11.2009
Сообщения: 2
Репутация: 10
Печаль КМП алгоритм поиска: выделение найденного образца

вообщем имеется ричэдит
нужно реализовать алгоритм поиска кнута-морриса-пратта..

мучаюсь с ним мучаюсь..
проверяет находится ли образец в строке и выделяет найденный образец ..НО только в первой строке и только если образец встречается в строке один раз
нужно как то сделать чтобы он выделял по всем строкам, ну и в случае если образец находится несколько раз в одной строке

помогите кто чем может, я помогу вам
вот мой корявенький код:

Код:
var 
  S:array[0..10000] of char;
    P: array[0..10000] of word; 
    i,k,l1 : longint;
    m :longint;

Procedure Prefix; 
Begin
 P[1]:=0; 
 k:=0;
 for i:=2 to m do 
 begin
  while (k>0) and (S[k+1]<>S[i]) do
  k:=P[k]; 
  if S[k+1]=S[i] then
  k:=k+1;
  P[i]:=k; 
 end;
End;

procedure TForm1.Button1Click(Sender: TObject); 
var n : longint;
   T : array[0..40000] of char;
   ss,sss:string;
begin
for l1:=0 to richedit1.Lines.Count-1 do
  begin
 ss:= RichEdit1.Lines[l1];
  for i:=0 to length(ss) do
    begin
    T[i]:=ss[i];
    end;

 sss:=Edit1.text;
  for i:=0 to length(sss) do
    begin
    S[i]:=sss[i];
    end;

 m:=length(sss);
 Prefix; 
 k:=0; 
 n:=length(ss);
 for i:=0 to n do
  begin
    while (k>0) and (S[k+1]<>T[i]) do
    k:=P[k];
    if S[k+1]=T[i] then
    k:=k+1;
      if k=m then 
        begin
          showmessage('vhodit')   ;
           with RichEdit1 do                         
            begin
            SetFocus;
            SelStart :=i-m;
            SelLength:= Length(sss);
            end;
        k:=P[k];
        end;
   end  ;
end;
Ответить с цитированием
  #2  
Старый 02.12.2010, 02:43
ЖабаДушитКота ЖабаДушитКота вне форума
Прохожий
 
Регистрация: 01.12.2010
Сообщения: 9
Репутация: 16
По умолчанию

В RichEdit в качестве текста вставлял твой же код. Находит все че хочешь

Код:
procedure TForm1.Button1Click(Sender: TObject);
var n : longint;
   T : array[0..40000] of char;
   ss,sss:string;
begin
  {for l1:=0 to richedit1.Lines.Count-1 do begin}
    ss:=RichEdit1.Text;
    for i:=0 to length(ss)-1 do begin
      T[i]:=ss[i];
    end;
    sss:=Edit1.text;
    for i:=0 to length(sss) do begin
      S[i]:=sss[i];
    end;
    m:=length(sss);
    //Prefix;
    k:=0;
    n:=length(ss);
    for i:=0 to n do begin
      while (k>0) and (S[k+1]<>T[i]) do
        k:=P[k];
      if S[k+1]=T[i] then
        k:=k+1;
      if k=m then begin
        //showmessage('vhodit');
        with RichEdit1 do begin
          SetFocus;
          SelStart:=i-m;
          Perform(EM_SCROLLCARET,0,0); //это для прокрутки (если найденное слово вне видимой области)
          SelLength:= Length(sss);
        end;
        k:=P[k];
        sleep(400); //это чтобы успеть посмотреть,
                                       //как выделяется найденное
      end;
    end;
  {end;}
end;

Последний раз редактировалось ЖабаДушитКота, 03.12.2010 в 00:35.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:22.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025