Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 597

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!Срочно нужна ваша помощь в решение задачи:

Реализовать функцию поиска N-го вхождения подстроки Subs в строку S.

Я написал часть кода,но дальше не знаю что делать!Помогите плиз и по возможности поясните где я неправ !
Заранее спасибо!))(часть кода ниже)

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls, DB, ADODB;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Label1: TLabel;
  12. Label2: TLabel;
  13. Edit1: TEdit;
  14. Edit2: TEdit;
  15. Button1: TButton;
  16. Memo1: TMemo;
  17. ADODataSet1: TADODataSet;
  18. procedure Button1Click(Sender: TObject);
  19. private
  20. { Private declarations }
  21. public
  22. { Public declarations }
  23. end;
  24.  
  25. var
  26. Form1: TForm1;
  27.  
  28. implementation
  29.  
  30. function Search(s:string; N:Byte;Subs:string):Boolean;
  31. var
  32. p: integer;
  33.  
  34. begin
  35. p:= pos(subs,s);
  36. while (pos(subs,s))<>0 do
  37. begin
  38. delete(s,1,pos(subs,s));
  39. p:=p+1;
  40. end;
  41. if p<N then
  42. search:=False
  43. else
  44. search:=True
  45. end;
  46.  
  47.  
  48.  
  49.  
  50. {$R *.dfm}
  51. procedure TForm1.Button1Click(Sender: TObject);
  52. var
  53. subs,s:string;
  54. N:Byte;
  55. p:Integer;
  56. begin
  57. s:=Edit1.text;
  58. subs:=Edit2.text;
  59. p:= pos(subs,s);
  60. while (pos(s,subs))<>0 do
  61. begin
  62. Search(s,1,subs);
  63. end;
  64. memo1.lines.add(IntToStr(p));
  65. end;
  66. end.


verlite Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: verlite (статус: Посетитель)
Вопрос отправлен: 28 декабря 2009, 16:49
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Жикльор

Здравствуйте, verlite!

Код программы находится в приложении:

Приложение:
  1. unit Unit1;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  7. Dialogs, StdCtrls;
  8.  
  9. type
  10. TForm1 = class(TForm)
  11. Edit1: TEdit;
  12. Edit2: TEdit;
  13. Label1: TLabel;
  14. Button1: TButton;
  15. procedure Button1Click(Sender: TObject);
  16. procedure Search(s: string; subs: string);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22.  
  23. var
  24. Form1: TForm1;
  25.  
  26. implementation
  27.  
  28. {$R *.dfm}
  29.  
  30. procedure TForm1.Button1Click(Sender: TObject);
  31. begin
  32. Search(Edit1.Text,Edit2.Text);
  33. end;
  34.  
  35. procedure TForm1.Search(s, subs: string);
  36. var
  37. count: integer;
  38. begin
  39. count:=0;
  40. while pos(subs,s) <> 0 do
  41. begin
  42. count:=count + 1;
  43. Delete(s,pos(subs,s),Length(subs));
  44.  
  45. end;
  46. Label1.Caption:=IntToStr(count);
  47. end;
  48.  
  49. end.
  50.  


Ответ отправил: Жикльор (статус: 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

verlite (статус: Посетитель), 28 декабря 2009, 19:37 [#2]:

Да,согласен,один цикл лишний..
а по поводу N-го вхождения:
надо узнать сколько раз повторяеться подстрока в строке
(например сколько раз в 'aabb3bb' повторяеться 'b'
verlite

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

verlite (статус: Посетитель), 28 декабря 2009, 22:58 [#6]:

Оо!Большое спасибо Валь)))
То что надо -прям дополнил задачу))
во-во как раз та версия ,где нужна одна функция и процедура))
Спасибо большое=)

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.