|
Вопрос # 3 452/ вопрос открыт / |
|
Здрасте, уважаемые эксперты! Нужна срочно ваша помощь. Нужно написать функцию rightposition, которая получает два параметра str1 и str2 типа string и возвращает позицию начала последнего появления str2 в str1.
Например: rightposition ('Миссисипи', 'си' ) дает значение 6.
Заранее спасибо!
 |
Вопрос задала: Neryungrinochka (статус: Посетитель)
Вопрос отправлен: 27 ноября 2009, 21:04
Состояние вопроса: открыт, ответов: 3.
|
Ответ #1. Отвечает эксперт: Паровоз
Здравствуйте, Neryungrinochka!
Можно предложить следующую функцию:
function rightposition(const str1,str2:string):integer;
var
s:string;
no,len:Integer;
begin
s:=str1;
len:=Length(str2);
Result:=1-len;
no:=Pos(str2,str1);
while no>0 do
begin
s:=Copy(s,no+len,Length(s)-no-len+1);
Result:=Result+len-1+no;
no:=Pos(str2,s);
end;
end;
 |
Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 27 ноября 2009, 23:14
|
Ответ #2. Отвечает эксперт: Егор
Здравствуйте, Neryungrinochka!
Вот функция, которая ищет подстроку, начиная с права:
function rightposition(const st, subs : string) : integer;
var
i, j, lensubs : integer; // lensubs - длина подстроки
match : boolean; // логическая переменная - нашли ли подстроку
begin
Result:=0; // поначалу предполагаем, что строку не нашли
lensubs:=length(subs);
for i:=length(st) downto 1 do // начинаем просмотр с конца строки
begin
if st[i]=subs[lensubs] then // если последние символы строки и подстроки совпадают, то проверим остальные
begin
match:=true; // предположим, что подстрока найдем
for j:=1 to lensubs-1 do // начинаем просмотр с конца подстроки
if st[i-j]<>subs[lensubs-j] then // если нашли несовпадение, то...
begin
match:=false; // отмечаем флаг, как "совпадения нет"
break; // и оканчиваем цикл проверок
end;
if match then // смотрим, было ли совпадение
begin
Result:=i-lensubs+1; // совпадение было - вернём позицию, с которой совпадение было
exit; // и выйдем из функции
end;
end;
end;
end;
Код проверил. Функция работает шустро на любых длинах строк.
 |
Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 28 ноября 2009, 01:36
|
Ответ #3. Отвечает эксперт: min@y™
Мож сделать попроще?
uses StrUtils;
function RightPosition(const str1, str2: string): Integer;
var
Index: Integer;
begin
Result:= 0;
Index:= 1;
repeat
Index:= PosEx(str2, str1, Index);
if Index <> 0
then begin
Result:= Index;
Inc(Index);
end;
until Index = 0;
end;
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 28 ноября 2009, 09:51
|
Мини-форум вопроса
Всего сообщений: 3; последнее сообщение — 28 ноября 2009, 12:13; участников в обсуждении: 2.
|
Егор (статус: 10-ый класс), 28 ноября 2009, 01:40 [#1]:
Паровоз:
ужасный код.
находим первое вхождение строки, отрезаем, находим второе, отрезаем...
советую прочитать вот это, хотя бы.
если передать такой функции строчку длиной 50 тыс символов 'a' и подстрокой из одной буквы 'a', то результат надо будет ждать несколько секунд (на моём компе - порядка 12-ти).
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.
|
|
Паровоз (статус: 10-ый класс), 28 ноября 2009, 12:01 [#2]:
To Neryungrinochka:
Для обсуждения вопроса служит минифорум и не нужно для этого использовать личную почту. В том письме, которое Вы мне прислали, по-существу, нет никакого кода, кроме двух строчек
s1:=Edit1.text;
s2:=Edit2.text;
Поэтому исправлять там нечего.
|
|
Паровоз (статус: 10-ый класс), 28 ноября 2009, 12:13 [#3]:
"Паровоз: ужасный код." "советую прочитать вот это, хотя бы."
To Егор:
Ваши советы никому не нужны. Вы предлагаете человеку, который не может написать больше двух строк кода типа
s1:=Edit1.text;
s2:=Edit2.text;
серьезно заняться программированием.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|