В примере используется b — таблица из 10 строк по 15 символов каждая. При ее вводе необходимо набирать строки по 15 символов и нажимать <Enter>. Неудобство такого ввода заключается в том, что все строки должны содержать по 15 символов, т. е. если набираются слова, то в них не может быть более чем 15 букв, а в коротких словах надо добавлять пробелы.
При обработке символьных массивов используются такие же алгоритмы, как и для числовых. Например, требуется слово, заданное как массив символов, записать в обратном порядке, т. е. справа налево. При разработке алгоритма можно использовать такую постановку задачи: данный числовой массив переписать так, чтобы последний элемент встал на первое место, предпоследний на второе и т. д., а первый — на последнее. Другими словами, необходимо из массива а1, а2, ..., аn, получить аn, аn-1, ..., а1 ,который будет находиться в массиве b (рис.8).
На рисунке 8 в рамке обведена формула пересчета индекса: когда у массива а номера перечисляются в прямом порядке, т. е. текущий индекс элемента массива изменяется от 1 до n, у элементов массива b индексы должны меняться от n до 1.
Рис. 8. Перемещение элементов из массива а в массив b и пересчет индексов
Такое изменение и обеспечивает данная формула, она приведена для индексов массива b. Программа Р32 производит перемещение элементов в обратном порядке, для символьных данных она называется программой обращения слова:
program Р28;
constn = 15;
vara, b:array[ 1.. n ]of char;i:integer;
Begin
fori: = 1tondo
Begin
read(a [ i ]);
b [n-i+1]:= a[i]
end;
fori: = 1tondo
write(b [ i ])
End.
Несколько подряд записанных символов образуютстроку.
Строка — это ограниченная апострофами последовательность любых символов.
Длина строки, обрабатываемой в Паскале, не должна превышать 255 символов (апострофы не считаются). Это связано с тем, что в конце строки, в дополнительном байте, хранится ее длина — количество символов, а наибольшее целое число, которое может быть записано в байте, — 255. Если требуется обработать текст, длина которого большее 255 знаков, то надо использовать массив строк.
Описание строки имеет вид:
varх:string[ 20 ];
Строка х должна быть не более чем из 20 символов. Если она меньше, то будет занимать в памяти столько байтов, сколько знаков она содержит (плюс 1 байт — длина). Поэтому при вводе строк нет необходимости дополнять их до указанной в описании длины.
Для обработки строк используются специальные операции и собранные в специальную библиотеку подпрограммы. Операции позволяют работать со строками, как с цельными объектами, а подпрограммы, в основном, — с отдельными символами или частями строк. Операции над строками — это объединение, сравнение и присваивание.
Объединение строк. Эта операция позволяет объединить две строки в одну, присоединив начало второй строки к концу первой. Объединение обозначается знаком «+». Например:
var x, у, 2:string [ 10 ];
begin:
x: = ‘тепло’;
у: = ‘ход’;
z: = х + у;
write (z)
End.
Переменным х и у присваиваются значения строк, а переменной z - результат объединения этих строк в одну:‘теплоход’. При печати строки будет выдано содержимое области памяти, называемой z.
Очевидно, что операция объединения строк некоммутативная, т. е. для нее
а+b < > b+а,
поэтому при использовании объединения необходимо предусматривать, с какой стороны к данной строке присоединяется другая: слева или справа.
Как и для арифметических операций, для данной операции со строками существует нейтральный элемент, не влияющий на ее результат. Это — строка нулевой длины (пустая строка), обозначаемая двумя рядом стоящими апострофами ("). Такую строку можно присоединить к любой строке слева или справа и строка не изменится.
Сравнение строк. Для строк используются такие же операции отношения, как и для чисел, но они имеют несколько другой смысл. Если строки сравнивать на «равно» (=), то выполнение равенства означает посимвольное совпадение строк. Соответственно «не равно» (<>) означает несовпадение хотя бы в одном знаке. Остальные отношения (<, £, ³, >) относятся к длинам строк, т. е. сравниваются не символы строк, а их количества. Если записать:
‘а’ < ‘b’ + ‘с’,
то сначала выполнится объединение строк (эта операция имеет более высокий приоритет), а затем сравнение длин. В данном случае условие удовлетворяется, так как строка из одного символа меньше (по длине), чем строка из двух символов.
Присваивание. Оператор присваивания для строковых данных имеет вид:
Имя_строковой _переменной: = строковое выражение;
Имя строковой переменной может быть простое или с индексом (элементом массива строк). Если в результате выполнения всех операций строкового выражения получается строка, длина которой превышает длину в описании переменной, стоящей слева от знака присваивания, то такая строка укорачивается справа до допустимой длины.
var x:string [ 6 ];
Begin
х: = ‘мим’ + ‘озабоченный’;
write (x)
End.
В результате работы этой программы будет напечатано слово «мимоза». Поэтому допустимая длина x - 6 символов, значение выражения справа от присваивания «мимозабоченный» сократится до «мимоза», остальные символы будут отброшены.
Длина строки. Функция длины строки выдает количество символов строки: