Удалить из строки первое и последнее вхождение заданной подстроки. - Free Pascal
Формулировка задачи:
1.Написать программу, удаляющую из строки первое и последнее вхождение заданной подстроки.
2.Считывание строк должно осуществляться с экрана и быть реализовано в виде отдельной подпрограммы с передачей параметра-строки по адресу.
3.Поиск и удаление вхождений подстроки должны выполняться в отдельной функции.
4.Вывод результата необходимо выполнять с помощью отдельной подпрограммы.
Решение задачи: «Удалить из строки первое и последнее вхождение заданной подстроки.»
textual
Листинг программы
function del(s, ps : string) : string; var first, last, len : integer; begin len := length(ps); first := pos(ps, s); last := rpos(ps, s); // (существуют как минимум 2 разных вхождения подстрок) И // (они пересекаются, т.е., второе начинается раньше, чем заканчивается первое)? if (first * last * (first - last) <> 0) and (first + len > last) then s := '' else begin // пересечения нет, или вхождении подстрок меньше 2-х if last > 0 then delete(s, last, len); // удаляем сначала последнее if (first > 0) and (first <> last) then delete(s, first, len); // а потом, если их было 2 разных - то и первое end; del := s; // всё, уходим end;
Объяснение кода листинга программы
- Задана функция
del, которая принимает на вход две строкиsиpsи возвращает строку. - Внутри функции объявлены следующие переменные:
first- позиция первого вхождения подстрокиpsв строкеs.last- позиция последнего вхождения подстрокиpsв строкеs.len- длина подстрокиps.
- Переменная
lenинициализируется значением длины подстрокиps. - Переменные
firstиlastинициализируются результатами функцийposиrpos, которые возвращают позиции первого и последнего вхождения подстрокиpsв строкеs. - Далее следует условие, которое проверяет, что:
firstиlastне равны нулю (то есть, подстрока встречается в строке хотя бы дважды).firstменьшеlast(то есть, второе вхождение подстроки начинается раньше, чем заканчивается первое).
- Если условие выполняется, то это означает, что подстрока встречается в строке дважды и эти вхождения пересекаются. В этом случае, функция возвращает пустую строку.
- В противном случае, выполняется следующее условие:
- Если
lastбольше 0, то удаляется последний фрагмент строкиsс конца доlastвключительно. - Если
firstбольше 0 иfirstне равноlast(то есть, подстрок встречается в строке хотя бы дважды, но эти вхождения не пересекаются), то удаляется первый фрагмент строкиsс начала доfirstвключительно.
- Если
- В конце функции, возвращаемое значение функции присваивается переменной
del. - Функция заканчивается и возвращает результат.