Тема 4. Строки Раздел 4. 2. Стр. 42 – 60.
Эпиграф n Когда справедливость исчезнет, то не останется ничего, что могло бы придать ценность жизни людей. Кант (22. 04. 1724 – 12. 02. 1804)
Введение. Применение строк n n Для того, чтобы компьютер мог обрабатывать тексты, программа должна уметь оперировать не только с числами, но и со словами. Текст - это произвольная последовательность символов некоторого алфавита. Алфавит - любое множество символов, например (0, 1, 2, . . . ), ( А, Б, В, …), ( A, B, C, . . . ).
4. 1. Определение строки • Строка - последовательность символов определенной длины. Элементы строки хранятся в байтах памяти компьютера.
4. 2. Особенности строк n n Строки занимают промежуточное положение между простыми и структурированными типами данных. Строки обладают свойствами как простых, так и структурированных типов данных.
Строка = » БЕЛАЯ ВОРОНА в типах данных Свойства структурированного типа 1. Состоит из элементов простого типа. 2. Можно выполнять действия с отдельными символами. n Свойства простого типа 1. Стандартный тип. В отличии от структурированных типов. 2. Ввод/вывод строки целиком. 3. Сравнение строк. n
4. 3. Описание строки в программе n n Для описания строкового типа данных используется зарезервированное слово STRING. Другие простые типы описываются стандартными идентификаторами (Например, Integer, Byte, Boolean).
2 способа описания строки в программе 1. 2. Без указания длины строки: Var Stroka 1: String; (По умолчанию, длина строки не превышает 255 символов. ) С указанием длины строки: Var Stroka 2: String[80];
4. 4. Длина строки n n Значение типа STRING представляет собой строку длиной до 255 символов (с 1 по 255). При этом нулевой байт строки содержит информацию о её текущей длине.
Текущая длина строки - величина изменяющаяся, определяемая реальными данными, которая не может превышать максимальную длину, указанную для данной строковой переменной.
А каким будет содержимое оставшихся неиспользованными байтов строковой переменной, текущее значение которой короче максимальной длины? n n Длина текущего значения строковой переменной постоянно фиксируется в нулевом байте. Поэтому к «лишним» байтам просто нет доступа и их содержимое совершенно не важно.
4. 5. Действия (операции) над строками: 1. 2. 3. 4. 5. Действия над отдельными символами; Действия над строкой; Манипулирование длиной строки; Стандартные функции; Стандартные процедуры.
4. 5. 1. Действия над отдельными символами строки n n Обратиться к отдельному символу строки можно, указав имя строки переменной, а также порядковый номер символа в строке. Примеры: a[5]: =’F’; Write(b[33]);
n n n Отдельные символы строки представляют собой значения типа Char; Над элементами строки допустимы те же действия, что и над символьными значениями – прежде всего операции сравнения (=, <>, >, >=, <, <=); Примеры, использования: If a[5]>’F’ then … While b[11]=’ 4’ do …
4. 5. 2. Действия над строкой a). Ввод-вывод целой строки; b). Присваивание целой строки; c). Конкатенация; d). Сравнения.
a). Ввод-вывод целой строки: Значение переменной типа String можно вводить с клавиатуры, отображать на экране с помощью единственного оператора. Например: Read. Ln(Stroka 1); Write(Stroka 2); n
b). Присваивание целой строки n n n Строковой переменной можно сразу присвоить нужное значение. При этом явно заданное значение типа String заключается в апострофы. Например: a: =’Это строка’; b: =’’; {”нулевая строка”}
Примечание 1. n ”Нулевая строка” – это строка содержит только нулевой символ с информацией о её длине, которая равна нулю.
c). Конкатенация – объединение или сцепление n Вот как это выглядит: a: =’ Это строка, ’+’которая ’+’служит примером’; n После выполнения этого оператора значением переменной a станет строка: ’ Это строка, которая служит примером’
Замечание 1. n При этом, если длина объединенной строки превысит максимальную длину допустимую для переменной a, «лишние» символы окажутся отброшены.
Конкатенация (продолжение) Операцию объединения можно применять не только к явно заданным значениям, но и к переменным типа String: a: =b+c; Здесь a, b, c – строковые переменные. В результате выполнения этого оператора текущие значения переменных b и c окажутся слиты и полученное строковое значение будет присвоено переменной a. n
d). Сравнения n К строкам применимы операции сравнения: n ’кот’<’котёнок’ n n n Строковые значения заданы явно; Кот меньше котёнка. a
Примечание 2. n n n При сравнении строк меньшей считается та из них, у которой меньше первый символ. Если первые символы совпадают, то сравниваются вторые, и так далее. Если одна строка является частью второй, например "кот" и "котёнок", то более короткая строка является меньшей.
4. 5. 3. Манипулирование длиной строки Информация о текущей длине строки содержится в её нулевом байте, к которому можно обратится так же, как и к остальным элементам строки. n Например: j: =ord(Stroka 1[0]); Таким образом можно выяснить текущую длину строки. (См. ниже фу-цию Length) n
Изменение длины строки n n Текущую длину строки можно изменить, присвоив другое значение. Например, можно уменьшить длину, чтобы «отсечь» ненужное содержимое строковой переменной.
Что представляет собой длина строки? n n Информация о длине строки хранится в её нулевом байте не как число, а в виде символа из таблицы ASCII, код которого и соответствует длине. Процедура вывода Write(Stroka 2[0]) выведет на экран не число, а символ.
4. 5. 4. Стандартные функции n n Length Concat Pos Copy
Функция Length(s) n вычисляет длину строки s. Оператор y: =Length(s) дает тот же результат, что и оператор y: =Ord(s[0]).
Функция Concat(s 1, s 2, . . . , sn) n выполняет операцию конкатенации, объединяя несколько строк в одну.
Пример n В результате выполнения операторов first: ='бул'; second: ='ав'; third: ='ка'; wrd: =Concat(first, second, third) в переменную wrd будет записано слово "булавка".
Функция Pos(sub, s) n n n определяет, является ли строка sub частью строки s. Если это так, то она возвращает порядковый номер первого символа в строке s, начиная с которого элементы этих строк совпадают. Если sub не является частью s, то возвращается 0.
Пример n n В результате выполнения операторов s: ='буававка'; sub: ='ав'; n: =Pos(sub, s); в переменную n будет записано число 3.
Функция Copy(s, start, len) возвращает часть строки s, начинающуюся с символа с порядковым номером start. Количество возвращаемых символов равно len. n В результате выполнения операторов s: ='булавка'; s 1: =Copy(s, 3, 5); в переменную s 1 будет записано слово "лавка". n
4. 5. 5. Стандартные процедуры n n n Delete Insert Fillchar(s[n], m, c) Str Val
Процедура Delete(s, start, len) n n удаляет часть строки s, начинающуюся с символа с порядковым номером start. Количество удаляемых символов равно len. После выполнения операторов s: ='булавка'; Delete(s, 3, 3); в переменной s будет записано слово "бука".
Процедура Insert(ins, s, start) n n вставляет в строку s, начиная с позиции start, все символы строки ins. После выполнения операторов s: ='булка'; ins: ='ав'; Insert(ins, s, 4); в переменной s будет записано слово "булавка".
Процедура Fillchar(s[n], m, c) заполняет строку s, начиная с позиции n, m одинаковыми символами, образец символа находится в переменной c. n В результате выполнения операторов c: ='*'; Fillchar(s[5], 10, c); в переменную s будет записано 10 звездочек, начиная с пятого символа. n
Примечание n n Данная процедура заполняет смежную область памяти, не проверяя границы расположения переменных. Поэтому, если максимальная длина строки s задана равной 11, последние три символа будут записаны в ячейки памяти, соседние с ячейками переменной s. В этом случае возможно нарушение данных в смежной с s переменной.
Процедура Str(x, s) n n n преобразует число, записанное в переменной x, в строку. Переменная x может быть любого целого или вещественного типа. После выполнения операторов x: =14; Str(x, s); в переменную s типа String будет записано слово "14".
Пример n n В результате выполнения операторов xreal: =145/3; Str(xreal, s); в переменную s типа String будет записано слово "4. 83333333 E+01".
Пример n n n В процедуре Str допускается использовать формат так же, как и при выводе значений. Поэтому выполнение следующих двух операторов xreal: =145/3; Str(xreal: 6: 2, s); приведет к тому, что в переменную s будет записано слово " 48. 33".
Процедура Val(s, x, err) n n преобразует последовательность символов, записанную в строке s, в числовое значение и сохраняет его в числовой переменной x. Тип переменной x должен соответствовать типу преобразуемого числа.
Процедура Val(s, x, err) n n Если это не соблюдается или в строке s записано не число, то преобразование не будет выполнено, значение x не изменится, а в переменной err будет записан код ошибки, представляющий собой номер первого символа в строке, при анализе которого произошла ошибка преобразования. Если ошибки в задании исходных данных нет, то в переменной err возвращается 0.
Процедура Val(s, x, err) n n Например: s: ='14'; s 1: ='0. 0035'; Val(s, x, err); Val(s 1, y, err); в переменной x типа Integer будет записано число 14, а в переменной y типа Real - число 3. 5000 E-03.
Процедура Val(s, x, err) n Процедура Val не учитывает формат целочисленной переменной, поэтому при преобразовании строки в целочисленное значение могут возникнуть такие же ошибочные ситуации, как и присваивании целочисленных значений для разных целых типов.
Пример n при преобразовании строки « 256» в значение типа Byte в зависимости от настройки опции компилятора «Range Checking» либо в переменную x запишется 0, либо произойдет аварийное прерывание программы.
4. 6. Примеры обработки строк 1. 2. 3. Поиск и замена подстрок. Удаления повторяющихся пробелов. Сортировка слов в предложении.
4. 6. 1. Программа поиска и замены Uses CRT; Var s 1, s 2, s 3: String; i, n: Byte; Begin Text. Back. Ground(1); Clr. Scr; Write. Ln('Введите строку'); Read. Ln(s 1);
s 2: ='ст'; s 3: ='тип'; n: =0; Repeat n: =Pos(s 2, s 1); If n<>0 Then Begin Delete(s 1, n, 2); Insert(s 3, s 1, n); End; Until n=0; Write. Ln(s 1); Read. Ln; End.
Результат выполнения программы
4. 6. 2. Программа удаления повторяющихся пробелов Uses crt; var a: string; i: integer; begin clrscr; write ('Исходный текст a='); readln(a) ; i: =1;
repeat if copy(a, i, 2)=' ‘ then a: = copy (a, 1, i) +copy (a, i+2, length(a)) else i: =i+1; until (i>length(a)); writeln ('a=', a); readln; end.
4. 6. 3. Программа сортировки слов в предложении Const m=20; Var S, spr: String; i, j, d, n, k: Byte; MS: Array[1. . m] Of String;
Begin Write. Ln('Введите текст предложения'); Read. Ln(S); Write. Ln(S); j: =1; Repeat d: =Pos(' ', S); MS[j]: =Copy(S, 1, d-1); Delete(S, 1, d); j: =j+1; Until d=0;
MS[j]: =S; For i: =1 To j Do Write. Ln(MS[i]); For i: =1 To i-1 Do For k: =1 To j-i Do If MS[k]>MS[k+1] Then Begin spr: =MS[k+1]; MS[k+1]: =MS[k]; MS[k]: =spr; End;
For i: =1 To j Do Write. Ln(MS[i]); d: =Length(MS[1]); k: =1; For i: =2 To j Do If d
Результат выполнения программы
Выводы: 1. 2. 3. Строка – стандартный тип данных (String), обладающий свойствами как простых, так и структурированных типов. Со строкой, как с единым целым можно выполнять отдельные действия, включая стандартные функции и процедуры. Строку можно использовать как массив символов.


