|
Вопрос # 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;
- var
- p: 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:=True
- end;
-
-
-
-
- {$R *.dfm}
- procedure TForm1.Button1Click(Sender: TObject);
- var
- subs,s:string;
- N:Byte;
- p:Integer;
- begin
- s:=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);
- begin
- Search(Edit1.Text,Edit2.Text);
- end;
-
- procedure TForm1.Search(s, subs: string);
- var
- count: integer;
- begin
- count:=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]:
Оо!Большое спасибо Валь)))
То что надо -прям дополнил задачу))
во-во как раз та версия ,где нужна одна функция и процедура))
Спасибо большое=)
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|