• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

Процедуры и функции на языке Pascal

Олес

Новые
Регистрация
7 Янв 2016
Сообщения
15
Реакции
0
Баллы
0
Процедуры и функции на языке 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.
 
Описать функцию 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.
 
что считает конкретно эта скобка? S[L1-i+1]
 
что считает конкретно эта скобка? S[L1-i+1]
Она ничего не "считает".
Прежде всего, заметим, что тип "строка" в какой-то мере эквивалентен типу "массив символов" (Array [1..N] of Char). Но не полностью. Читать символ S - можно, а вот присваивать (S:='Щ') - нельзя, но можно добавлять символ: 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 ↔ S[N-i+1]
Вот это и делается.
 
Еще один момент.
Заменил в предпоследней строке функции
k:=L1-k-L2+2;
на
k:=L1+2-k-L2;
Разумеется, это одно и то же, просто сообразил, что в некоторых случаях некоторые трансляторы, получив промежуточный отрицательный результат, могут заверещать (в смысле выдать сообщение об ошибке).
 
Назад
Сверху