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