Вопрос № 178073: Доброго времени суток дорогие эксперты! Необходимо решить парочку задач на тему "Строковый тип" Задание 1: Составить программу, которая использует указанную функцию или процедуру обработки строки. Реализация такой подпрограммы...
Вопрос № 178073:
Доброго времени суток дорогие эксперты!
Необходимо решить парочку задач на тему "Строковый тип"
Задание 1: Составить программу, которая использует указанную функцию или процедуру обработки строки. Реализация такой подпрограммы должна происходить без использования стандартных процедур и функций при работе со строками (length, concat, copy, delete, insert, pos, uppercase, lowercase и др; сравнение строк напрямую недопустимо – допускается лишь посимвольное сравнение). Причем: необходимо
реализовать подпрограмму, реализующую указанную последовательность действий при заданных ограничениях (если таковые имеются).
вот задача 1: Функция Poz_end(subs,s:string):integer, аналогичная стандартной функции Pascal Pos(subs,s:string):integer, с той лишь разницей, что функция Poz_end находит последнее вхождение в строке s подстроки subs.
Задача 2) 2) Вводится строка. Если она является записью числа в римской системе счисления, то преобразовать ее
в целое число.
Писать программы и под программы в TP-7.0 с коментариями для понимания большего!
Отвечает amnick, 10-й класс :
Здравствуйте, Юдин Евгений Сергеевич.
Решение первой задачи (я позволил себе назвать требуемую функцию LastPos, поскольку Poz_end — коряво (ни английский, ни русский) и по смыслу неверно — "позиция конца")
Код:
program q178073a;
{ функция находит последнее вхождение
в строке s подстроки substr возвращает найденную позицию или 0, если подстрока substr не найдена в строке s } function LastPos( substr: String; s: String): byte; var nS, nSub, p, i : integer; ok : boolean; begin nS := ord( s[0] ); { длина строки s } nSub := ord( substr[0] ); { длина искомой подстроки substr } p := nS - nSub; { отступаем от конца строки s на длину искомой подстроки } while p >= 0 do begin { пока не проверили
всю строку s } ok := true; { предполагаем совпадение } for i := 1 to nSub do if substr[i] <> s[p+i] then begin ok := false; { нет, не совпало } break; end;
if ok then begin { нашли последнее вхождение } LastPos := p+1; { возвращаем позицию } exit; end; dec( p ); { в данной позиции не совпало, переходим к предыдущей } end; LastPos := 0; { подстрока не найдена, возвращаем 0 } end;
procedure test( substr, str: string ); var
n: byte; begin n := LastPos( substr, str );
if n > 0 then writeln( 'Позиция последнего вхождения подстроки "', substr, '" в строку "', str, '" = ', n ) else writeln( 'Подстрока "', substr, '" не найдена в строке "', str, '"' ); end;
* Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи.
(полный список тарифов)
** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
*** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.