ورود

View Full Version : سوال: PoEx معکوس؟



mbshareat
سه شنبه 05 دی 1402, 13:27 عصر
سلام
میخوام یک رشته رو در رشته دیگه رو به ابتدای رشته جستجو بدم. مثلا موقعیت CDE رو قبل از بایت 4 در رشته ABCDEF جستجو بدم.
راه ساده اش این هست:
function RevPosEx(SubS,S:String;P:Word):Word;
Var
I,L:Word;
begin
Result:=0;
L:=Length(SubS);
For I:=P-1 DownTo 1 Do
If Copy(S,I,L)=SubS then
Begin
Result:=I;
Break;
End;
end;

اما این روش کندترین روش هست. بهترین روش جستجوی معکوس رشته کوچک در معکوس رشته بزرگ است.
اما در موقعیت یابی شروع جستجو و برگردوندش به موقعیت در رشته معکوس نشده گیج میشم.
یک تابع نوشتم. دیدم گاهی درست کار نمی کنه.می دونم انجام تکلیف محسوب میشه ولی اگر لطف کنید ، ممنون میشم.

یوسف زالی
سه شنبه 05 دی 1402, 16:33 عصر
سلام.
رشته رو ReverseString کن بعد سرچ کن

mbshareat
سه شنبه 05 دی 1402, 17:31 عصر
سلام
این رو می دونم. فقط در پیدا کردن محل شروع جستجو و دوبار معکوس کردنش گیج شدم.
این کد رو نوشتم:
function TForm1.RevPosEx2(SubS,S:String;P:Word):Word;
Var
I,L,L2:Word;
begin
Result:=0;
SubS:=ReverseString(SubS);
S:=ReverseString(S);
L:=Length(SubS)-1;
L2:=Length(S)+1;
P:=P-1+L;
If P>Length(S) then
P:=1
Else
P:=L2-P;
P:=PosEx(SubS,S,P);
If P=0 then
Exit;
P:=P+L;
Result:=L2-P;
end;

یک TEdit روی فرم گذاشتم.و اینطور امتحان کردم:
ShowMessage(IntToStr(RevPosEx(Edit1.Text,'ABCDE',5 ))+#13+IntToStr(RevPosEx2(Edit1.Text,'ABCDE',5)));
نتیجه دو تابع یکسان بود.اما هنوز مطمئن نیستم.
نمی دونم چرا میگند انسان از کامپیوتر باهوشتره!!