На Горох
Информатика, 10 класс

4.2. Процедуры и функции обработки символьных переменных

"Информатика. Учебное пособие для учреждений общего среднего образования с русским языком обучения", Г.А. Заборовский, А.Е. Пупцев

Объяснение темы В оглавлении: 4.2. Процедуры и функции обработки символьных переменных

Кратко о теме

Символьные данные нужны программе, чтобы работать с буквами, словами и целыми текстами. Отдельный символ хранится в переменной типа 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), чтобы не обращаться к несуществующим символам.

Основные средства обработки символьных данных в Pascal

СредствоНазначениеАргументыРезультат или изменение
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. Для строки «информатика» определить число символов и вывести первый символ. Сначала нужно получить длину строки функцией, а затем обратиться к символу по позиции. Так мы отдельно решаем две задачи: считаем все знаки и читаем конкретный знак.

  1. Обозначим строку переменной s и присвоим ей значение 'информатика'. Вычислим Length(s): в слове 11 символов. Результат функции можно сохранить в целой переменной n.
  2. Первый символ находится на позиции 1, поэтому прочитаем s[1]. Обращение корректно, потому что строка непустая. Выведем n и s[1].

Ответ: длина равна 11, первый символ — и. В программе для чтения первого символа можно использовать выражение s[1], а не Copy, поскольку нужен один знак по известной позиции.

Задача 2. В строке «школьная информатика» найти позицию слова «информатика» и вывести это слово. Сначала нужно найти начало подстроки, так как слово расположено не в начале строки. Затем можно извлечь его с помощью Copy, указав найденную позицию и длину слова.

  1. Запишем строку в s, а искомое слово — в t. Вызов Pos(t, s) возвращает 10: перед словом находятся девять символов, включая пробел. Проверка результата нужна, чтобы не извлекать фрагмент при неудачном поиске.
  2. Длина t равна 11, поэтому после успешного поиска выполним Copy(s, 10, Length(t)). Copy вернёт фрагмент, начиная с первой буквы найденного слова. Саму строку s эта функция не изменит.
  3. Выведем полученную часть строки. Если Pos вернул 0, выводить фрагмент по найденной позиции нельзя: следует сообщить, что слово не найдено.

Ответ: позиция слова — 10, результат Copy — «информатика». Использование Length(t) удобно тем, что не приходится вручную повторно задавать число символов слова.

Задача 3. Ввести строку, заменить в ней слово «кот» на «пёс», если оно встречается, и сообщить, если его нет. Поиск выполняют до изменения строки, иначе можно начать удаление с неверной позиции. После успешного поиска сначала убирают найденное слово, а затем вставляют замену на то же место.

  1. Считаем строку в s и найдём p := Pos('кот', s). Если p = 0, выведем сообщение об отсутствии слова и не будем вызывать Delete или Insert. Так программа обработает случай, когда искомого фрагмента нет.
  2. Если p больше нуля, вызовем Delete(s, p, Length('кот')). Процедура удалит три символа, начиная с позиции p. После этого остальная часть строки останется на месте, сдвинувшись влево.
  3. Вызовем Insert('пёс', s, p), чтобы поместить замену перед прежней позицией p. Проверим результат выводом s: новая строка должна содержать «пёс» вместо найденного «кот». Если слово встречалось несколько раз, такой алгоритм заменит только первое вхождение.

Ответ: при наличии слова строка изменяется, при отсутствии программа сообщает об этом. Поиск через 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, переменных и индексации: позиция указывает, к какому символу обращается программа. Аргументы функций и процедур связывают текущую задачу с темой подпрограмм: функция возвращает значение, процедура выполняет действие. Эти навыки применяются при обработке текстовых данных и проверке вводимых строк, например при поиске нужного слова или контроле формата ответа. Похожий подход пригодится и при работе с массивами символов, где элементы также расположены по индексам.

Что запомнить

  • Строка состоит из символов, расположенных по позициям.
  • Length возвращает длину строки.
  • Copy извлекает фрагмент строки.
  • Pos возвращает позицию первого вхождения или 0.
  • Insert и Delete изменяют строковую переменную.
  • Перед обработкой найденного фрагмента следует проверить результат поиска.

Частые вопросы по теме

Чем строковая переменная отличается от переменной типа 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. Процедуры и функции обработки символьных переменных

Учебник

Оглавление →
Предмет
Информатика
Класс
10 класс
Учебник
"Информатика. Учебное пособие для учреждений общего среднего образования с русским языком обучения", Г.А. Заборовский, А.Е. Пупцев