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