Символьные строки

Информатика. Учебник для 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. Выполните по указанию учителя задания в рабочей тетради.


Оглавление

§18. Игровые стратегии.

§19. Символьные строки.

§20. Обработка массивов.