| 
| 
 | Вопрос # 3 597/ вопрос открыт / | 
 |  Здравствуйте, уважаемые эксперты!Срочно нужна ваша помощь в решение задачи:
 Реализовать функцию поиска N-го вхождения подстроки Subs в строку S.
 
 Я написал часть кода,но дальше не знаю что делать!Помогите плиз и по возможности поясните где я неправ !
 Заранее спасибо!))(часть кода ниже)
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls, DB, ADODB; type  TForm1 = class(TForm)    Label1: TLabel;    Label2: TLabel;    Edit1: TEdit;    Edit2: TEdit;    Button1: TButton;    Memo1: TMemo;    ADODataSet1: TADODataSet;    procedure Button1Click(Sender: TObject);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementation function Search(s:string; N:Byte;Subs:string):Boolean; varp: integer; begin   p:= pos(subs,s);  while (pos(subs,s))<>0 do  begin  delete(s,1,pos(subs,s));   p:=p+1;  end;   if p<N then    search:=False    else    search:=Trueend;    {$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);varsubs,s:string;N:Byte;p:Integer;begins:=Edit1.text;subs:=Edit2.text;  p:= pos(subs,s); while (pos(s,subs))<>0 do begin  Search(s,1,subs); end; memo1.lines.add(IntToStr(p));end;end.
|  |   Вопрос задал: verlite (статус: Посетитель)Вопрос отправлен: 28 декабря 2009, 16:49
 Состояние вопроса: открыт, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Жикльор Здравствуйте, verlite!
 Код программы находится в приложении:
 Приложение:Переключить в обычный режим unit Unit1; interface uses  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,  Dialogs, StdCtrls; type  TForm1 = class(TForm)    Edit1: TEdit;    Edit2: TEdit;    Label1: TLabel;    Button1: TButton;    procedure Button1Click(Sender: TObject);    procedure Search(s: string; subs: string);  private    { Private declarations }  public    { Public declarations }  end; var  Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject);beginSearch(Edit1.Text,Edit2.Text);end; procedure TForm1.Search(s, subs: string);varcount: integer;begincount:=0;while pos(subs,s) <> 0 do  begin  count:=count + 1;  Delete(s,pos(subs,s),Length(subs));    end;Label1.Caption:=IntToStr(count);end; end. 
|  | Ответ отправил: Жикльор (статус: 5-ый класс)Время отправки: 28 декабря 2009, 20:12
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо большое!)) |  Ответ #2. Отвечает эксперт: Мережников Андрей Здравствуйте, verlite!Если надо только узнать количество вхождений одной подстроки в другую, так можно и без цикла сделать. Например так:
 uses ... StrUtils...;
 
 function TForm1.Search(s,subs:string):integer;
 var s1:string;
 begin
 if length(subs)>0
 then begin
 s1:=ReplaceStr(s,subs,'');
 Result:=(length(s)-length(s1)) div length(subs);
 end
 else Result:=0;
 end;
 
|  | Ответ отправил: Мережников Андрей (статус: Абитуриент)Время отправки: 28 декабря 2009, 20:28
 Оценка за ответ: 4
 Комментарий к оценке: спасибо!учту!) |  
 Мини-форум вопросаВсего сообщений: 6; последнее сообщение — 28 декабря 2009, 22:58; участников в обсуждении: 3. 
|   | Мережников Андрей (статус: Абитуриент), 28 декабря 2009, 19:24 [#1]:что значит надо найти N-ое вхождение подстроки в строку? Позицию, с которой начинается вхождение? Уточните. И для чего цикл запускается дважды (в обработчике кнопки и в вызываемой процедуре)? |  
|   | verlite (статус: Посетитель), 28 декабря 2009, 19:37 [#2]:Да,согласен,один цикл лишний.. а по поводу N-го вхождения:
 надо узнать сколько раз повторяеться подстрока в строке
 (например сколько раз в 'aabb3bb' повторяеться 'b'
 |  
|   | verlite (статус: Посетитель), 28 декабря 2009, 19:44 [#3]:когда я запускал программу у меня в Memo-поле выводился так например: 
 строка'abb45a'
 
 подстрока'aаа'
 
 Memo-поле '1'
 |  
|   | Мережников Андрей (статус: Абитуриент), 28 декабря 2009, 20:32 [#4]:ReplaceStr - заменить на StringReplace(s, subs, '', [rfReplaceAll])
 |  
|   | Валя (статус: 1-ый класс), 28 декабря 2009, 22:39 [#5]:я бы такую задачу через рекурсию решил 
 
 function search(n: integer; subs,s: string): integer;
var p: integer;
begin
  p:=pos(subs,s);
  if n>0 then begin
    if p>0 then begin
      search:=p+search(n-1,subs,copy(s,p+1,length(s)-p));
      if not f then search:=0;// нет n вхождений
      end
      else
      f:=false;  // нет n вхождений
    end
    else
    search:=0;   // последнее вхождение
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  subs,s:string;
  N:Byte;
begin
s:=edit1.text;
subs:=edit2.text;
f:=true;
n:=5;
 memo1.lines.add('includ '+IntToStr(n));
 memo1.lines.add('position '+IntToStr(search(n,subs,s)));
end; |  
|   | verlite (статус: Посетитель), 28 декабря 2009, 22:58 [#6]:Оо!Большое спасибо Валь))) То что надо -прям дополнил задачу))
 во-во как раз та версия ,где нужна одна функция и процедура))
 Спасибо большое=)
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |