Строки в процедурах и функциях
Строки можно передавать в процедуры и функции как аргументы (значения параметров), а также возвращать как результат функций. Построим процедуру, которая заменяет в строке s все вхождения слова-образца wOld на слово-замену wNew (здесь wOld и wNew — это имена переменных, а выражение «слово wOld» означает «слово, записанное в переменную wOld»).
Сначала разработаем алгоритм решения задачи. На первый взгляд кажется, что можно написать такой алгоритм на псевдокоде:
Однако такой алгоритм работает неверно, если слово wOld входит в состав wNew, например, нужно заменить '12' на 'А12В' (покажите самостоятельно, что это приведет к зацикливанию).
Чтобы избежать подобных проблем, попробуем накапливать результат в другой символьной строке res, удаляя из строки s уже обработанную часть. Предположим, что на некотором шаге в оставшейся части строки s обнаружено слово wOld (рис. 8.13, а).
Рис. 8.13
Теперь нужно выполнить следующие действия:
1) ту часть строки s, которая стоит слева от образца, «прицепить» в конец строки res (рис. 8.13, б);
2) «прицепить» в конец строки res слово-замену wNew (рис. 8.13, в);
3) удалить из строки s начальную часть, включая найденное слово-образец (рис. 8.13, г).
Далее все эти операции (начиная с поиска слова wOld в строке s) выполняются заново до тех пор, пока строка s не станет пустой. Если очередное слово-образец найти не удалось, вся оставшаяся строка s приписывается в конец строки-результата, и цикл заканчивается.
В начале работы алгоритма в строку res записывается пустая строка ' ', не содержащая ни одного символа. В таблице 8.3 приведён протокол работы алгоритма замены для строки '12.12.12', в которой нужно заменить слово '12' на 'А12В'.
Теперь можно написать процедуру на школьном алгоритмическом языке. Так как она должна менять строку s, эта строка должна быть одновременно аргументом и результатом (в школьном алгоритмическом языке — аргрез), а старое и новое слова — это просто аргументы (арг).
Дадим некоторые пояснения к программе. Переменная р — это номер первого символа первого найденного слова-образца wOld, а в переменной lеn записана длина этого слова. Если после поиска слова значение р меньше нуля (образец не найден), происходит выход из цикла:
Если р > 1, то слева от образца есть какие-то символы, и их нужно «прицепить» к строке res:
Условие р+lеn>длин (s) означает, что образец стоит в самом конце слова, при этом остаток строки s — пустая строка.
В конце программы результат записывается на место исходной строки s.
Приведём пример использования процедуры:
Построенную выше процедуру можно легко превратить в функцию. Для этого нужно:
• в заголовке функции указать, что она возвращает строку (добавить ключевое слово лит);
• все параметры должны быть аргументами (нужно убрать аргрез и арг);
• поскольку в школьном алгоритмическом языке нельзя менять аргументы внутри процедуры, назовём первый параметр (исходную строку) s0, и введём дополнительную переменную s для работы со строкой в процедуре;
• в конце нужно записать результат во встроенную переменную знач, а не в s.
Ниже показаны все изменённые части подпрограммы:
Вызывать функцию можно таким образом:
Следующая страница Рекурсивный перебор