Информатика. Учебник для 9 класса (по учебнику К. Ю. Полякова, Е.А. Еремина, базовый уровень)
§19. Символьные строки.
Что такое символьная строка?
Ключевые слова:
• символьная строка • длина строки • сцепление строк • срез строки (подстрока) • удаление символов • вставка символов • поиск подстроки
В середине XX века первые компьютеры создавались, прежде всего, для выполнения сложных математических расчётов, а сейчас они чаще всего обрабатывают текстовую (символьную) информацию.
Символьная строка — это последовательность символов.
В алгоритмическом языке и в Паскале для работы со строками используются специальные типы данных, которые позволяют:
• работать с целой символьной строкой как с единым объектом;
• использовать строки переменной длины.
Такой тип данных в алгоритмическом языке называется литерным и обозначается лит, а в Паскале называется строковым и обозначается string.
Используя дополнительные источники, выясните, что означают слова «литера» и «литерный».
Используя дополнительные источники, выясните значение английского слова string.
Вот пример объявления строки:
лит s var s: string;
Новое значение записывается в строку с помощью оператора присваивания:
s:=’Вася пошёл гулять’ s:=’Вася пошёл гулять’;
или оператора ввода с клавиатуры:
ввод s readln(s);
Обратите внимание, что при вводе строк в Паскале нужно использовать оператор readln (англ. read line — читать до конца строки) вместо read.
Существуют стандартные функции, которые определяют длину строки (количество символов в ней). В алгоритмическом языке такая функция называется длин, а в Паскале — length (в переводе с англ. — длина). В этом примере в целочисленную переменную п записывается длина строки s:
n:=длин (s) n:=length (s);
Напишите полную программу, которая вводит строку с клавиатуры и выводит на экран её длину. Проверьте, как эта программа реагирует на строку с пробелами.
Сравнение строк
Строки можно сравнивать между собой так же, как числа. Например, можно проверить равенство двух строк:
ввод S
если s=’sEzAm’ то
вывод ‘Слушаюсь и повинуюсь!’
иначе
вывод ‘Пароль неправильный’
все
Та же программа на языке Паскаль:
readln (s);
if s=’sEzAm’ then
write(‘Слушаюсь и повинуюсь!’)
else
write ( ‘Пароль неправильный’);
Запишите в тетради, как нужно объявить в этой программе переменную s.
Можно также определить, какая из двух строк больше, какая — меньше. Если строки состоят только из русских или только из латинских букв, то меньше будет та строка, которая идёт раньше в алфавитном порядке. Например, слово «паровоз» будет меньше, чем слово «пароход»: они отличаются в пятой букве и «в» < «х». Это можно проверить экспериментально, например, с помощью такой программы:

Но откуда компьютер «знает», что такое алфавитный порядок? Оказывается, при сравнении используются коды символов (вспомните материал учебника для 8 класса). В современных кодировках и русские, и английские буквы расположены в алфавитном порядке, т. е. код буквы «в» меньше, чем код буквы «х».
С помощью программы сравните пары слов и сделайте выводы:
пар — парк Пар — пар steam — Пар
Steam — steam 5Steam — Steam
He используя программу, сравните пары слов:
парта — парк ПАрта — Парк СПАМ — Spam
ПОЧТА — spam П04та — ПОЧта почТА — Post
55-66 9 — 128
Посимвольная обработка строк
Для того чтобы работать с отдельными символами строки, к ним обращаются так же, как к элементам массива: в квадратных скобках записывают номер нужного символа. Например, так можно изменить четвёртый символ строки на «а» (конечно, длина строки должна быть не менее четырёх символов):
s[4]:= ‘а’ s[4]:= ‘а’;
Приведём программу, которая вводит строку с клавиатуры, заменяет в ней все буквы «э» на буквы «е» и выводит полученную строку на экран:

В цикле

мы перебираем все символы строки с первого до последнего, и если очередной символ — буква «э», делаем замену:

Вспомните, чем отличается запись s=’e’ от записи s: = ‘e’.
Запишите решение этой задачи, используя цикл пока (while).
Операции со строками
Оператор + используется для «сложения» (объединения, сцепления) строк, эта операция иногда называется конкатенацией. Например:
s1: = ‘Привет’
s2: = ‘Вася’
s:=s1 + ‘,’ + s2 + ‘!’
Здесь и далее считаем, что в программе объявлены строковые (литерные) переменные s, s1 и s2.
Запишите в тетради, какое значение будет иметь переменная s после выполнения этого фрагмента программы. Проверьте ответ с помощью компьютера.
Для обработки строк обычно используют готовые вспомогательные алгоритмы из библиотеки языка программирования — процедуры и функции. Различие между ними состоит в том, что процедура изменяет переданную ей строку, а функция возвращает результат — новое значение, — не изменяя исходную строку.
Для того чтобы выделить часть строки (подстроку), в алгоритмическом языке применяется операция получения среза (англ. slicing). Например, s[3:7] означает «символы строки s с 3-го по 7-й включительно». В Паскале для этого используется функция сору, она принимает три параметра: имя строки, номер начального символа и количество символов. Оба следующих фрагмента копируют в строку s1 символы строки s с 3-го по 7-й (всего 5 символов):
s:=f1234567891 s:=’123456789′;
s1:=s [3:7] s1:=copy(s,3,5);
Запишите в тетради, какое значение будет иметь переменная si после выполнения этого фрагмента программы. Проверьте ответ с помощью компьютера.
Для удаления части строки нужно вызвать стандартную процедуру, указав имя строки, номер начального символа и число удаляемых символов:
s:=’123456789′ s: = ‘123456789 ‘ ;
удалить (s, 3, 6) delete (s, 3, 6) ;
Запишите в тетради, какое значение будет иметь переменная s после выполнения этого фрагмента программы. Проверьте ответ с помощью компьютера.
При вставке символов процедуре передают вставляемый фрагмент, имя исходной строки и номер символа, с которого начинается вставка:
s:= 11234567891 s:= ‘123456789’;
вставить(1 ABC 1, s, 3) insert(1 ABC 1, s, 3);
Запишите в тетради, какое значение будет иметь переменная s после выполнения этого фрагмента программы. Проверьте ответ с помощью компьютера.
Используя только операции выделения подстроки и «сложения» строк, постройте из строки
s: = *информатика!
как можно больше слов русского языка. Постарайтесь использовать наименьшее возможное число операций. Проверьте ваши решения с помощью программы.
Приведите несколько способов построения строки
‘А. Семёнов’
из строки
s: = ‘Семёнов Андрей’
Какой из них лучше? Как вы сравнивали эти способы?
Поиск в символьных строках
Существуют функции для поиска подстроки (и отдельного символа) в строке. Им нужно передать образец для поиска и строку, в которой надо искать:

Функция позиция возвращает целое число — номер символа, с которого начинается образец (буква «с») в строке s. Если образец встречается в строке несколько раз, функция находит первый из них. В языке Паскаль функция pos (от англ. position — позиция, расположение) работает точно так же.
Выясните экспериментально, какое значение возвращает функция позиция (pos), если образец для поиска не найден в строке.
Как можно найти вторую букву «с» с начала строки?
Вводится строка, в которой сначала записана фамилия человека, а затем через пробел — его имя, например ‘Семёнов Андрей’.
Запишите операторы, которые позволяют:
а) найти номер пробела, разделяющего фамилию и имя, и записать его в переменную р;
б) выделить из строки фамилию и записать её в переменную fam;
в) выделить из строки имя и записать его в переменную name;
г) приписать перед фамилией первую букву имени, точку и пробел.
Преобразования «строка ? число»
Иногда символьная строка, которая передаётся программе, содержит запись числа. С таким значением нельзя выполнять арифметические операции, потому что это символы, а не число.
Чему будут равны значения переменных п и s после выполнения этих команд? Как нужно объявить эти переменные в программе?
n:= 12 + 34;
s: = ’12’ + ’34’;
Для того чтобы с данными можно было выполнять вычисления, нужно преобразовать число, записанное в виде цепочки символов, в числовое значение. Для этого в алгоритмическом языке есть стандартные функции:
лит_в_цел — переводит строку в целое число;
лит_в_вещ — переводит строку в вещественное число.
Разберём такой пример:
лит s, цел N, лог ОК
s:=’123′
N:= лит_в_цел(s, OK) | N = 123
если не ОК то
вывод ‘Ошибка!’
все
Строку не всегда можно преобразовать в число (например, если в ней содержатся буквы). Поэтому функция лит_в_цел использует второй параметр — логическую переменную ОК. Функция записывает в эту переменную логическое значение да («истина»), если операция закончилась успешно, и нет (ложь), если произошла ошибка.
Изучите приведённый фрагмент программы и выясните, как объявляется логическая переменная.
А вот пример использования функции лит_в_вещ:
лит s, вещ X, лог ОК
s:=’123.456′;
Х:=лит_в_вещ(s, ОК) | Х= 123.456
если не ОК то
вывод ‘Ошибка!’
все
Какие из этих строк можно преобразовать в целое число, какие — в вещественное?
а) ’45’;
б) ‘5р.’;
в) ‘14.5’;
г) ’14;5′;
д) ‘tu154’;
е) ’543.0’;
ж) ’(30)’.
Обратное преобразование (из числа в строку) возможно всегда:
N:=123
s:=цел_в_лит(N) | s=’123′
X:=123.456
s:=вещ_в_лит(X) I s=’123.456′
Изучите приведённый фрагмент программы и выясните, как называются функции для преобразования целого числа и вещественного числа в символьную строку.
В языке Паскаль строка преобразуется в число (целое или вещественное) с помощью процедуры val:
var r: integer;
• • •
s : = ‘123’;
val(s, N, r); {N=123}
s:=’123.456′;
val (s, X, r); {X=123.456}
Третий параметр г служит для того, чтобы определить, была ли ошибка. Если после вызова процедуры val значение г равно нулю, то ошибки не было, иначе в переменную г записывается номер первого ошибочного символа.
Преобразование числа в строку выполняет процедура str:
n : = 123;
str(N, s); {s=’123′}
х:=123.456;
str (X, s); {s=’1.234560E+002′}
str(X:10:3, s); {s=’ 123.456′}
По умолчанию вещественные числа записываются в научном формате (‘1.234560Е+002’ означает 1,23456•102). В последней строке примера используется форматный вывод: запись Х:10:3 означает «вывести число в 10 позициях с тремя знаками в дробной части».
Выводы
• Символьная строка — это последовательность символов.
• Длина строки — это количество символов в строке.
• Подстрока — это часть символьной строки.
• При обращении к отдельному символу строки его номер записывают в квадратных скобках.
• Знак « + » при работе со строками означает объединение строк.
• Для обработки символьных строк используют вспомогательные алгоритмы стандартной библиотеки — процедуры и функции. Процедура изменяет переданную ей строку, а функция возвращает результат — новое значение, не изменяя исходную строку.
• Функции поиска подстроки возвращают номер символа, с которого начинается подстрока, или 0 в случае неудачи.
• Строку можно преобразовать в число для того, чтобы затем выполнять с ним вычисления. Число можно преобразовать в символьную строку.
Нарисуйте в тетради интеллект-карту этого параграфа.
Вопросы и задания
1. Во многих языках программирования можно использовать массивы символов, т. е. массивы, каждый элемент которых — один символ. Чем отличается строка от массива символов?
2. Чем отличается действие оператора + для чисел и для символьных строк?
3. Можно ли обойтись без стандартной функции для вставки подстроки? Если да, то чем её можно заменить?
4. Как определить, что при поиске в строке образец не найден?
5. Как бы вы искали первый символ «с» с конца строки?
6. Выполните по указанию учителя задания в рабочей тетради.
§19. Символьные строки.