Показать сообщение отдельно
Старый 15.01.2016, 20:41   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Олес Посмотреть сообщение
Описать функцию PosLast(subS,S) целого типа, возвращающую номер позиции, с которой в строке S содержится последнее вхождение подстроки subS. Если в строке S отсутствуют подстроки subS, то функция возвращает 0. пожалуйста, помогите написать программу как можно подробнее. почему она считает с конца? зачем нужно k?
Знаете... я, извините, не стал разбираться с Вашей программой, а просто накатал свою. Надеюсь, устроит.
Пояснения:
1. В Паскале существует стандартная функция Pos(Substr,S:String):Byte, возвращающая индекс (номер первого элемента) вхождения подстроки в строку. Почему бы ею не воспользоваться?
2. Но если таких вхождений несколько, то функция Pos выдаст индекс первого из них. А нам надо последнего.
3. Выход: проинвертировать (переписать наоборот от конца к началу) и строку, и подстроку, потом через Pos найти индекс.
4. Но найденный индекс будет соответствовать последней букве исходной подстроки, причем считая справа налево.
5. Поэтому индекс нужно пересчитать.
Код:
Function PosLast(Subs, S: string): byte;
var
 k,i,L1,L2: byte;
 S_inv,Subs_inv:String;
begin
 L1:=Length(S);
 S_inv:='';
 for i:=1 to L1 do
  S_inv:=S_inv+S[L1-i+1];
 L2:=Length(Subs);
 Subs_inv:='';
 for i:=1 to L2 do
  Subs_inv:=Subs_inv+Subs[L2-i+1];
 k:=Pos(Subs_inv,S_inv);
 if k>0 then k:=L1+2-k-L2;
 PosLast:=k;
end;

var
 s,s1: string;

begin
 writeln('Enter the string:');
 readln(s);
 writeln('Enter the substring:');
 readln(s1);
 writeln('Last entry position number is ', PosLast(s1,s));
 readln
end.
Программа отлажена и оттестирована на Free Pascal.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070