"Информатика. Учебное пособие для учреждений общего среднего образования с русским языком обучения", Г.А. Заборовский, А.Е. Пупцев
Символьные данные нужны программе, чтобы работать с буквами, словами и целыми текстами. Отдельный символ хранится в переменной типа char, а строка типа string объединяет символы в последовательность с пронумерованными позициями. В Pascal для таких данных предусмотрены функции, которые возвращают длину, фрагмент или позицию, и процедуры, которые изменяют строку. Понимание разницы между ними помогает безопасно искать, извлекать, вставлять и удалять текст.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Символьная переменная типа char хранит один символ: букву, цифру, пробел или знак пунктуации. Значение можно задать непосредственно, например c := 'A', или получить при вводе. Обратиться к этому значению можно по имени переменной, а если символ находится в строке — по имени строки и его позиции, например s[1]. Тип char нужен, когда программа обрабатывает отдельные знаки, а не весь текст сразу.
Строка типа string — упорядоченная последовательность символов, у каждого из которых есть позиция. Её длина может меняться: пользователь может ввести текст разного размера, а программа — добавить или удалить его часть. Позиции позволяют обращаться к отдельным символам и выделять фрагменты. Поэтому строка удобна для хранения слов, предложений и других текстовых данных.
Функция обработки строки получает аргументы — значения, переданные ей для работы, — и возвращает результат. Например, Length возвращает длину строки, Copy — фрагмент, а Pos — позицию подстроки. Результат можно вывести, сравнить или сохранить в переменной, тогда как аргументы лишь задают, что именно нужно обработать.
Процедура обработки строки выполняет действие, но не возвращает значение для присваивания. Insert и Delete изменяют строковую переменную, переданную им в качестве аргумента. Функцию обычно используют внутри выражения, например n := Length(s), а процедуру вызывают отдельной командой, например Delete(s, 2, 3). Это различие помогает понять, где искать результат работы подпрограммы.
Строка хранит символы последовательно, поэтому каждому из них соответствует своя позиция. В Pascal обращение s[i] означает символ строки s с номером i, причём отсчёт начинается с 1, а не с 0. Позиция нужна, чтобы указать программе конкретное место: без неё нельзя надёжно извлечь или изменить часть текста. Например, чтобы прочитать первый символ непустой строки, обращаются к s[1].
Length, Copy и Pos решают разные задачи, поэтому их выбирают по требуемому результату. Length(s) сообщает, сколько символов в строке; это полезно, когда нужно проверить её размер или работать с последним символом. Copy(s, p, n) возвращает фрагмент от позиции p длиной до n символов, потому что иногда требуется получить часть текста, не изменяя оригинал. Pos(t, s) ищет подстроку t в строке s и возвращает позицию её первого вхождения, чтобы найденное место можно было использовать дальше.
Insert и Delete изменяют строку, поэтому аргументы этих процедур описывают не только текст, но и место действия. Вызов Insert(t, s, p) вставляет текст t в строку s перед позицией p; существующие символы справа сдвигаются. Delete(s, p, n) удаляет из s до n символов, начиная с p, а оставшаяся часть строки соединяется. Отдельные p и n нужны потому, что начальная позиция показывает место, а количество символов — размер фрагмента.
Для отдельного символа можно применить UpCase(c): функция преобразует латинскую строчную букву в прописную и возвращает символ. Она подходит, например, для приведения введённой латинской буквы к единому регистру; возможности преобразования зависят от используемой среды Pascal. Функция Ord(c) даёт числовой код символа, а Chr(n) по коду возвращает символ. Эти функции полезны, когда программу нужно связать с числовым представлением символов, например сравнивать коды или переходить от кода к знаку.
Операцию выбирают по тому, нужно ли получить значение или изменить исходный текст: для измерения и поиска подходят функции, для вставки и удаления — процедуры. Граничные случаи проверяют отдельно, потому что пустая строка не имеет символа на позиции 1, а неудачный Pos возвращает 0. Если результат поиска равен нулю, нельзя передавать его как найденную позицию в Copy или Delete. При работе с краями строки сверяют позицию и длину фрагмента с Length(s), чтобы не обращаться к несуществующим символам.
| Средство | Назначение | Аргументы | Результат или изменение |
|---|---|---|---|
| Length(s) | Определить длину строки | Строка s | Целое число |
| Copy(s, p, n) | Получить фрагмент строки | Строка, начальная позиция, число символов | Новая строка |
| Pos(t, s) | Найти первое вхождение подстроки | Искомая подстрока t и строка s | Позиция или 0, если вхождения нет |
| Insert(t, s, p) | Вставить фрагмент в строку | Фрагмент t, строка s, позиция p | Изменяет строку s |
| Delete(s, p, n) | Удалить часть строки | Строка s, начальная позиция, число символов | Изменяет строку s |
| UpCase(c) | Преобразовать латинскую строчную букву в прописную | Символ c | Символ |
Сначала определите, нужен ли вам результат-функция или изменение исходной строки процедурой. Затем сверьте порядок аргументов: особенно важно не перепутать строку, позицию и количество символов. После поиска проверяйте, что Pos вернул не 0.
Задача 1. Для строки «информатика» определить число символов и вывести первый символ. Сначала нужно получить длину строки функцией, а затем обратиться к символу по позиции. Так мы отдельно решаем две задачи: считаем все знаки и читаем конкретный знак.
Ответ: длина равна 11, первый символ — и. В программе для чтения первого символа можно использовать выражение s[1], а не Copy, поскольку нужен один знак по известной позиции.
Задача 2. В строке «школьная информатика» найти позицию слова «информатика» и вывести это слово. Сначала нужно найти начало подстроки, так как слово расположено не в начале строки. Затем можно извлечь его с помощью Copy, указав найденную позицию и длину слова.
Ответ: позиция слова — 10, результат Copy — «информатика». Использование Length(t) удобно тем, что не приходится вручную повторно задавать число символов слова.
Задача 3. Ввести строку, заменить в ней слово «кот» на «пёс», если оно встречается, и сообщить, если его нет. Поиск выполняют до изменения строки, иначе можно начать удаление с неверной позиции. После успешного поиска сначала убирают найденное слово, а затем вставляют замену на то же место.
Ответ: при наличии слова строка изменяется, при отсутствии программа сообщает об этом. Поиск через Pos, а затем Delete и Insert позволяет не трогать другие символы и правильно обработать случай неудачного поиска.
Ошибка — считать, что Pos возвращает 0 при найденной подстроке. Ноль означает, что вхождения нет; его можно перепутать с позицией из-за привычки начинать нумерацию с нуля. Проверьте смысл результата на короткой строке: найденный фрагмент начинается с позиции 1 или больше, а не найденный даёт 0.
Не путайте номер позиции с количеством символов: в Copy(s, p, n) и Delete(s, p, n) это разные аргументы. Первый задаёт место начала, третий — длину извлекаемого или удаляемого фрагмента. Ошибку допускают, когда читают аргументы как одну общую характеристику части строки. Для проверки проговорите каждый аргумент отдельно: «с какого места» и «сколько символов».
Insert и Delete — процедуры, поэтому нельзя ожидать, что они вернут новую строку для присваивания. Их вызовы изменяют строковую переменную s, а отдельного результата, как у Copy, нет. Такое заблуждение появляется, если все средства обработки текста считать функциями. Проверка проста: после вызова выведите саму переменную и убедитесь, что использовали команду процедуры отдельно.
Нельзя игнорировать границы строки и результат поиска. Если строка пуста, у неё нет символа s[1], а Pos при отсутствии фрагмента даёт 0, не подходящий для обработки как найденная позиция. Причина ошибки — предположение, что искомый текст обязательно существует или любая позиция допустима. Перед обращением к символу проверьте длину, а перед удалением или извлечением — результат Pos и границы фрагмента.
Для обработки строк нужны знания о типах char и string, переменных и индексации: позиция указывает, к какому символу обращается программа. Аргументы функций и процедур связывают текущую задачу с темой подпрограмм: функция возвращает значение, процедура выполняет действие. Эти навыки применяются при обработке текстовых данных и проверке вводимых строк, например при поиске нужного слова или контроле формата ответа. Похожий подход пригодится и при работе с массивами символов, где элементы также расположены по индексам.
Чем строковая переменная отличается от переменной типа char?
Переменная char хранит один символ, например букву или знак. Переменная string хранит последовательность символов, поэтому в ней могут находиться слово, предложение или пустая строка.
Что возвращает Pos, если подстрока не найдена?
Pos возвращает 0, если искомая подстрока отсутствует. Перед использованием найденной позиции в Copy, Insert или Delete нужно проверить, что результат больше нуля.
Как определить длину строки?
Для этого вызывают функцию Length(s), где s — строковая переменная. Функция возвращает целое число символов; для пустой строки результат равен 0.
Чем Copy отличается от Delete?
Copy(s, p, n) возвращает новую строку — фрагмент исходной, начиная с позиции p и длиной до n символов. Delete(s, p, n) не возвращает фрагмент, а удаляет его прямо из строки s.
Почему Insert и Delete не возвращают новую строку?
Это процедуры: они выполняют действие над строковой переменной, переданной им для изменения. Поэтому результат нужно проверять в самой переменной после вызова, а не присваивать вызов выражению.
4.2. Процедуры и функции обработки символьных переменных