|
Главная | Правила | Регистрация | Дневники | Справка | Пользователи | Календарь | Поиск | Сообщения за день | Все разделы прочитаны |
|
Опции темы | Опции просмотра |
15.01.2016, 17:32 | #1 (permalink) |
Member
Регистрация: 07.01.2016
Сообщений: 15
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Процедуры и функции на языке Pascal
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
Регистрация: 08.03.2016
Сообщений: 0
|
Я помогу вам ускорить решение проблемы, прочтите похожие темы Turbo Pascal. Процедуры и функции Turbo Pascal. Процедуры и функции Подпрограммы. Процедуры и функции Паскаль. Процедуры, функции, параметры |
15.01.2016, 20:41 | #2 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Пояснения: 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. |
|
16.01.2016, 11:15 | #4 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Она ничего не "считает".
Прежде всего, заметим, что тип "строка" в какой-то мере эквивалентен типу "массив символов" (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] Вот это и делается. |
16.01.2016, 11:23 | #5 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Еще один момент.
Заменил в предпоследней строке функции k:=L1-k-L2+2; на k:=L1+2-k-L2; Разумеется, это одно и то же, просто сообразил, что в некоторых случаях некоторые трансляторы, получив промежуточный отрицательный результат, могут заверещать (в смысле выдать сообщение об ошибке). |
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
|
Опции темы | |
Опции просмотра | |
|
|