Читайте также:
|
|
Обработка строк текста
9.1. Типы данных CHAR и STRING
В Turbo Pascal имеется два типа данных для работы с текстами: О char — литерный или символьный тип;
П String — СТрОКОВЫЙ ТИП ИЛИ ПрОСТО СТрОКЭ.
Символьный тип
Значением переменных символьного типа char является один символ. Каждому символу соответствует код символа — целое число в диапазоне от О до 255. Из этого следует, что символьный тип является порядковым. В некоторых языках программирования (С, Java) тип char относят к целым типам, что разумно, т. к. в памяти компьютера нет символов —- есть только их числовые коды. Это первый момент, который важно уяснить — все действия по обработке символов, в конечном счете, сводятся к действиям над целыми числами, расположенными строго по порядку.
Над данными символьного типа определены следующие операции отношения: =, о, <, >, <=, >=, вырабатывающие результат логического типа.
Обратите внимание — при выполнении всех операций сравнения коды символов сравниваются как обычные целые числа. При этом получается, что любая заглавная буква всегда меньше соответствующей ей строчной, т. к. в кодовой таблице сначала располагаются все заглавные буквы, а затем строчные (см. приложение 2). Точно так же любая буква латинского алфавита всегда меньше любой буквы русского алфавита, даже если их изображения на экране практически неразличимы (А латинская, А русская).
Для данных символьного типа определены следующие стандартные функции: П chr(x) — возвращает значение символа по его коду;
П ordfch) —- возвращает код заданного символа ch; П pred(ch) — возвращает предыдущий символ; О succ(ch) — возвращает следующий символ;
П upcase(ch) — преобразует строчную букву в заглавную. Обрабатывает буквы только латинского алфавита.
Например:
П ord('A')=65
О спг(128)='Б'
О pred('B'}='A>
CJ succ(T') = 'flr
upcase('n')='N'
Строковый тип
Строка — это последовательность символов. Максимальное количество символов в строке (длина строки) может изменяться от I до 255. Переменную строкового типа можно определить через описание типа в разделе определения типов или непосредственно в разделе объявления переменных.
Type
ИмяТипа = string [максимальная длина строки];
Var
Идентификатор,
ИмяТипа;
Строковую переменную можно задать и без предварительного объявления
типа:
var
Идентификатор,
string[MaKc. длина строки];
ИЛИ var
Идентификатор,...: string;
Если максимальная длина строки не указывается, то она равна 255 байт.
Строковые данные могут использоваться в программе также в качестве констант.
Например:
const stradres = 'ул. Мира, 35'; { строковая константа }
sadr: string[12] = ' ул. Мира' { типизированная константа, ее можно использовать как обычную переменную ]
type str!25 = string [125];
var strl:str!25; { описание с заданием типа }
stl: string; { по умолчанию длина строки = 255 |
st2,st3: string[50];
strnazv: string[280]; { ошибка, длина больше 255 }
В дальнейшем во всех примерах для удобства будем начинать имена всех переменных строкового типа с буквы з.
Строка в языке Turbo Pascal трактуется как массив символов. Для строки из п символов в памяти отводится п+l байт; п байтов — для хранения символов строки, а один дополнительный байт — для значения текущей длины строки. Этот дополнительный байт имеет номер 0, соответственно первый символ строки имеет номер 1, второй — номер 2 и т. д.
Например, переменная sadr типа string [12] хранится в памяти таким образом (табл. 9.1).
Таблица 9.1. Распределение памяти для хранения переменной
Всего строка занимает 13 байтов, из них последние 4 байта оказались незанятыми, т. к. реальная длина строки составляет 8 символов, это значение и хранится в нулевом байте строки. Незанятые байты составляют "хвост" строки, в котором может быть любой "мусор", однако программа не будет обращаться к "хвосту", т. к. реальный размер строки ей известен.
(Замечание ~^)
Из этого представления понятно и ограничение на максимальную длину строки — 255 символов, т. к. для хранения длины строки отведен всего один байт (максимальное двоичное число, которое можно уместить в один байт, — восемь подряд идущих единиц, что соответствует десятичному числу 255).
К любому символу в строке можно обратиться как к элементу одномерного массива
array [0.. n] of char
по номеру (индексу) данного символа в строке. Индекс определяется выражением целочисленного типа, которое записывается в квадратных скобках, как для массива.
Обратите внимание — в отличие от массивов переменные строкового типа могут участвовать целиком в операторах ввода/вывода.
Например, readln(stl); writeln(st2>;
При вводе строки количество символов в ней определяется автоматически, при этом автоматически заполняется нулевой байт. Для получения длины строки имеется функция length, которая возвращает значение нулевого байта строки (см. разд. 9.3).
Разумеется, никто не запрещает вводить и выводить строки по отдельным символам, как массивы, используя любой из операторов цикла. Однако такая необходимость возникает редко. Посимвольный ввод строки стоит реализовать только в том случае, если необходимо совместить ввод и какую-то обработку символов (см. листинг 9.9). Посимвольный вывод также удобно использовать для какой-либо нестандартной формы вывода.
Приведем пример, в котором исходная строка вводится целиком, а выводится по отдельным символам (листинг 9.1). В данном случае программа сначала выводит строку в "перевернутом" виде (например, вводим РОЗА, а выводится АЗОР). Затем та же строка выводится в прямом виде, но каждое слово с новой строки. Считаем, что слова разделены пробелами, причем не обязательно одиночными. Обратите внимание на условие, которое проверяет начало нового слова. Разбивка строки на слова — это типовое действие со строками.
Листинг 9.1. Вывод строки в перевернутом виде и по отдельным словам
var s:string;
i: integer; begin
write('Введите строку');readln(s);
for i:=length(s) ciownto 1 do write (s[i]);
for i:=l to length(s)-l do
if (s[i]) = ' ') and (s[i+l]<>' ') then writeln
else write(s[i]); readln; end
Еще один пример, в котором выполняется обработка строки как массива символов. Данная программа (листинг 9.2) проверяет правильность расстановки скобок в выражении (можно считать ее маленькой частичкой компилятора, т. к. перед преобразованием любого выражения в исполнимый код всегда проверяется правильность расстановки скобок). В последней главе (см. листинг 13.3) приводится пример программы для решения аналогичной задачи в более сложной постановке.
;•.......... -.................................:................ •;•"".............;•'-'................ '•........... """'.'..............................................................,,,.,..„..................................................... j
^Листинг 9.2. Проверка баланса скобок в скобочном выражении
var k,i:integer;{ k — номер символа, i — для определения баланса скобок)
s:string;
begin
writeln('Введите скобочное выражение:']; readln(s);
k:=l; i:=0;
while (k<=length(s)) and (i>=0) do
begin
{ если i<0, то выражение неправильно: ')' предшествует '(' }
if s[k]-'(' then i:=i+l;
if s[k]='} ' then i:=i-l,-
k:=k+l; ehd;
if i=0 then writeln('Скобки расставлены правильно.')
{ если i>0, то не хватает закрывающихся скобок }
else writeln{'Скобки расставлены неправильно'};
readln * *
end.
Дата добавления: 2015-11-14; просмотров: 71 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Новая услуга в вашем салоне! | | | Операции над строками |