Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 15.01.2016, 17:32   #1 (permalink)
Олес
Member
 
Регистрация: 07.01.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию Процедуры и функции на языке Pascal

Описать функцию PosLast(subS,S) целого типа, возвращающую номер позиции, с которой в строке S содержится последнее вхождение подстроки subS. Если в строке S отсутствуют подстроки subS, то функция возвращает 0. пожалуйста, помогите написать программу как можно подробнее. почему она считает с конца? зачем нужно k?

Function PosLast(subs, s: string): byte;
var
i, k: byte;
begin
k:=0;
i:=length(s);
while(i>= 1) and (k=0) do
if copy(s, i, length(subs))=subs then k:=i
else i:=i - 1;
PosLast:= k;
end;
var
s, s1: string;
i: byte;
begin
for i := 1 to 2 do
begin
writeln('Введите строку');
readln(s);
writeln('Введите подстроку');
readln(s1);
writeln('Номер позиции последнего вхождения=', PosLast(s1, s));
writeln;
end;
end.
Олес вне форума   Ответить с цитированием

Старый 15.01.2016, 17:32
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Я помогу вам ускорить решение проблемы, прочтите похожие темы

Turbo Pascal. Процедуры и функции
Turbo Pascal. Процедуры и функции
Подпрограммы. Процедуры и функции
Паскаль. Процедуры, функции, параметры

Старый 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 вне форума   Ответить с цитированием
Старый 15.01.2016, 23:53   #3 (permalink)
Олес
Member
 
Регистрация: 07.01.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

что считает конкретно эта скобка? S[L1-i+1]
Олес вне форума   Ответить с цитированием
Старый 16.01.2016, 11:15   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Олес Посмотреть сообщение
что считает конкретно эта скобка? S[L1-i+1]
Она ничего не "считает".
Прежде всего, заметим, что тип "строка" в какой-то мере эквивалентен типу "массив символов" (Array [1..N] of Char). Но не полностью. Читать символ S[i] - можно, а вот присваивать (S[i]:='Щ') - нельзя, но можно добавлять символ: S:=S+'Щ'.
Теперь допустим, что Вам нужно "перевернуть" строку S, создав строку-перевертыш S1. Пусть S содержит N знаков. Тогда в строке S1 символы должны встать в позиции:
S1[1] ↔ S[N]
S1[2] ↔ S[N-1]
...
S1[N-1] ↔ S[2]
S1[N] ↔ S[1]
И вообще
S1[i] ↔ S[N-i+1]
Вот это и делается.
Vladimir_S вне форума   Ответить с цитированием
Старый 16.01.2016, 11:23   #5 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Еще один момент.
Заменил в предпоследней строке функции
k:=L1-k-L2+2;
на
k:=L1+2-k-L2;
Разумеется, это одно и то же, просто сообразил, что в некоторых случаях некоторые трансляторы, получив промежуточный отрицательный результат, могут заверещать (в смысле выдать сообщение об ошибке).
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 17.01.2016, 17:29   #6 (permalink)
Олес
Member
 
Регистрация: 07.01.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

спасибо большое)
Олес вне форума   Ответить с цитированием
Ads

Яндекс

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

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 09:22.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.