"Информатика. Учебное пособие для учреждений общего среднего образования с русским языком обучения", В. М. Котов, А. И. Лапо, Ю.А. Быкадоров, Е.Н. Войтехович
Строковые функции и процедуры помогают программе измерять текст, извлекать его части, находить нужные фрагменты и изменять строку. Символы в строке расположены по порядку и имеют номера, начиная с 1. Length, Copy и Pos возвращают результат, а Insert и Delete меняют строковую величину. Зная назначение этих средств и правила отсчёта позиций, можно обрабатывать текст без ручного подсчёта символов.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Length(S) — функция, которая возвращает целое число символов в строке S. При подсчёте учитываются все символы, в том числе пробелы. Она нужна, чтобы узнать длину текста без ручного пересчёта.
Copy(S, позиция, количество) возвращает часть строки S, начиная с указанной позиции и содержащую заданное количество символов. Эту часть называют подстрокой. Copy удобно применять, когда из текста нужно получить слово или другой фрагмент.
Pos(образец, S) возвращает позицию первого вхождения образца в строку S, а если образец не найден — число 0. Образец — это фрагмент, который требуется отыскать. Функция помогает определить, есть ли нужный текст и где он начинается.
Insert и Delete — процедуры, изменяющие строковую величину. Insert вставляет одну строку в другую, а Delete удаляет из строки заданное количество символов. Они нужны для редактирования текста непосредственно в программе.
Строку удобно представлять как последовательность символов, выстроенных в определённом порядке. Поэтому каждому символу можно сопоставить позицию: первый получает номер 1, следующий — 2. Нумерация с единицы позволяет прямо указывать, откуда начать извлечение, вставку или удаление. Если бы отсчёт начинался с нуля, при ручном поиске нужного места легко было бы ошибиться на один символ.
Length подсчитывает символы строки и выдаёт полученное число, поэтому не нужно перечислять их вручную. Пробел занимает место так же, как буква или знак препинания: он является символом. Например, в строке из трёх букв, пробела и двух букв длина равна шести. У пустой строки нет ни одного символа, поэтому Length для неё возвращает 0.
Copy получает два указания: где начать выбор и сколько символов взять. Сначала по позиции находят нужное место, а затем считают заданное количество символов, включая символ на начальной позиции. Если запрошенное количество ведёт за конец строки, извлечь отсутствующие символы нельзя, поэтому результатом становится только доступная часть. Это позволяет получить фрагмент, даже если его предполагаемая длина больше оставшейся части строки.
Pos проверяет строку слева направо, чтобы сообщить место первого совпадения образца. Поэтому при нескольких одинаковых фрагментах результатом будет позиция самого раннего из них, а не число совпадений и не позиция последнего. Если поиск доходит до конца, не обнаружив образец, функция возвращает 0. Такое специальное значение удобно проверять перед дальнейшими действиями: оно показывает, что подходящей позиции нет.
Insert и Delete работают с самой строковой величиной, а не возвращают выбранную часть текста. Вставка увеличивает строку, и символы справа от места вставки перемещаются дальше. Удаление уменьшает строку, поэтому символы после удалённого участка сдвигаются влево. Из-за такого сдвига позиции последующих символов меняются, и их следует определять уже в изменённой строке.
| Имя | Вид | Назначение и аргументы | Результат или изменение |
|---|---|---|---|
| Length(S) | Функция | Принимает строку S | Возвращает число символов |
| Copy(S, позиция, количество) | Функция | Принимает строку, начало фрагмента и его длину | Возвращает подстроку |
| Pos(образец, S) | Функция | Принимает искомый образец и строку | Возвращает позицию первого вхождения или 0 |
| Insert(вставляемая строка, S, позиция) | Процедура | Принимает текст для вставки, строку и место вставки | Изменяет строку S, вставляя текст |
| Delete(S, позиция, количество) | Процедура | Принимает строку, начало удаления и число символов | Изменяет строку S, удаляя фрагмент |
Сначала определите, нужно ли получить значение или изменить строку: это подскажет, использовать функцию или процедуру. Затем проверьте порядок аргументов и укажите позиции, отсчитывая их с единицы. Если операция зависит от найденного текста, сначала выполните Pos и проверьте его результат.
Задача 1. Для строки S = «Информатика» определите длину. Нужно посчитать каждый символ, не пропуская ни одну букву. Проще применить стандартную функцию Length.
Ответ: Length(S) = 11. Функция вернула число символов в строке.
Задача 2. Для строки S = «программирование» получите фрагмент из пяти символов, начиная с позиции 4. Требуется не найти четвёртую букву с нуля, а начать с символа, которому присвоена позиция 4. Для этого используется Copy.
Ответ: Copy(S, 4, 5) возвращает «грамм». Исходная строка при этом не меняется.
Задача 3. В строке S = «школьная информатика» найдите слово «информатика», затем удалите его. Сначала нужно определить начало слова, поскольку оно стоит после другого фрагмента и пробела. Удалять следует только при условии, что Pos нашла образец.
Ответ: после удаления в S остаётся «школьная ». Пробел перед удалённым словом не входил в заданный фрагмент, поэтому он сохранился. Если бы Pos вернула 0, команду Delete с этой позицией выполнять было бы нельзя.
Отсчёт с нуля. Так ошибаются, перенося правило нумерации из некоторых других языков программирования. В строковых операциях первый символ имеет позицию 1, поэтому позиция 0 не обозначает начало обычного фрагмента. Проверьте себя: выпишите символы строки и подпишите над первым номер 1.
Неверное толкование Pos. Иногда думают, что функция возвращает число совпадений или расположение последнего совпадения. На самом деле она сообщает позицию первого вхождения образца при поиске слева направо. Чтобы проверить ответ, найдите образец в строке вручную и сравните номер самого раннего совпадения с результатом Pos.
Игнорирование результата 0. Ошибка возникает, если найденное значение сразу подставляют в Delete или Copy, не проверив, существует ли образец. Ноль означает, что подходящего фрагмента нет, а не его обычную позицию. Добавьте проверку «результат Pos не равен 0» и выполняйте дальнейшее действие только при её выполнении.
Смешение функций и процедур. Можно ожидать, что Insert или Delete вернут новую строку, как это делают функции Length, Copy и Pos. Но первые две операции изменяют строковую величину, а последние три выдают значение. Проверьте себя вопросом: нужно получить ответ для дальнейшего использования или отредактировать строку? Это помогает выбрать нужный вид операции.
Для строковых операций нужно уметь задавать строковые величины и переменные, а также правильно записывать вызовы стандартных функций и процедур. Эти знания помогают понимать, какие данные передаются операции и где появляется её результат. В свою очередь, обработка строк пригодится при работе с текстовыми данными: можно искать слова, выделять фрагменты и редактировать текст в программе. Такие действия встречаются в задачах, где программе нужно анализировать или менять введённые пользователем сообщения.
С какого номера начинается отсчёт символов в строке?
С единицы: первый символ строки имеет позицию 1, второй — позицию 2 и так далее. Поэтому при работе с Copy, Insert и Delete нельзя начинать отсчёт с нуля.
Учитываются ли пробелы при вычислении длины строки?
Да, каждый пробел считается символом и увеличивает длину строки на единицу. Это относится и к пробелам в начале или конце строки.
Что возвращает Pos, если искомая строка не найдена?
В этом случае Pos возвращает 0. Перед использованием результата для удаления или извлечения фрагмента нужно проверить, что он не равен нулю.
Изменяет ли Copy исходную строку?
Нет, Copy возвращает выбранный фрагмент, но не меняет исходную строку. Чтобы сохранить результат, его можно присвоить другой строковой переменной.
Почему после Insert или Delete могут измениться позиции символов?
Вставка добавляет символы, а удаление убирает их, поэтому часть строки сдвигается. Символы справа от изменённого участка получают новые позиции.
§ 8. Стандартные процедуры и функции для работы со строковыми величинами