| 
| 
 | Вопрос # 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;
 серьезно заняться программированием.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |