СТРОКИ СИМВОЛОВ
Строкового типа в стандартном Паскале нет, поэтому там использовали символьные массивы при работе со строками символов.
Символьные строки представляют один из наиболее полезных и важных типов данных. Для определения строкового типа в Турбо-Паскале используется ключевое слово string, вслед за которым в квадратных скобках указывается максимальная длина строки, например:
type
line = string[80];
var
line1,line2: line;
Переменная line1 в качестве своего значения может иметь любую последовательность символов произвольной длины ( в пределах от нуля до 80). Значение строковой переменной может быть присвоено с помощью оператора присваивания или процедуры ввода:
line1:='программирование';
readln(line2);
Если указание длины строки опущено, то длина строки по умолчанию является максимально возможной и равна 255 символов.
Важнейшим отличием строк от символьного массива является то, что строки могут динамически менять свою длину. При этом необходимо помнить, что память выделяется по максимуму. Самый первый байт в строке имеет индекс 0 и содержит текущую длину строки.
Для строк символов определена операция конкатенация, обозначаемая символом '+', смысл которой заключается в формировании новой символьной строки, значением которой будут строки-операнды, расположенные последовательно друг за другом. Например:
line1:=line1+'-экзамен';
При выводе line1 получим строку: пpогpаммиpование-экзамен. Кроме операции конкатенации, над значениями строкового типа определены операции сравнения с обычным смыслом:
<
<=
>
>=
=
<>
при выполнении которых действуют следующие правила: более короткая строка всегда меньше длинной; а если длины сравниваемых строк равны, то происходит поэлементное сравнение символов этих строк с учетом лексикографической упорядоченности значений стандартного символьного типа char.
Доступ к отдельным элементам строк производится аналогично доступу к элементам одномерного массива: после имени строковой переменной необходимо в квадратных скобках указать выражение целого типа, обозначающее номер элемента строки. Данная конструкция имеет тип char и является переменной, т.е. может находиться в левой части оператора присваивания:
line[1]='П'
или
if line[i] in ['a'..'z'] then k:k+1;
Рассмотрим пример пpогpаммы, опpеделяющей количество знаков пpепинания в пpоизвольной стpоке символов:
program pr25;
var
str : string;
i,
k: integer;{Количество знаков пpепинания}
begin
writeln('Введите стpоку символов:');
read (str);
for i:=1 to length(str) do {length(str)определяет длину
текущей строки}
if str[i] in [':','.',',','"','!','?',';'] then k:=k+1;
writeln('k=',k);
end.
Распространенной ошибкой при работе со строками является работа с элементами строки без учета её текущей длины. Следующая программа будет формировать строку из 26 символов, представляющих последовательность заглавных букв латинского алфавита:
program pr27;
var
str : string[26];
i:integer;
begin
str:='';
for i:=1 to 26 do
str:=str+chr(ord('A')+i-1);
writeln(str);
end.
В Турбо-Паскале имеются встроенные функции и процедуры для обработки строк:
concat(str1[,str2, ... ,strn]) - функция, возвращающая строку, представляющую собой сцепление строк параметров str1,str2, ... ,strn;
copy(str,i,c)- функция, возвращающая строку, которая копируется из строки str, начиная с символа i длиной с символов;
delete(str,i,c)- процедура, удаляющая из строки str с символов, начиная с символа с номером i;
insert(subsrt,str,i) - процедура, вставляющая подстроку substr в строку str, начиная с символа с номером i;
pos(substr,str) - функция, возвращающая номер позиции в строке str, начиная с которой подстрока substr входит в строку str; если подстрока не найдена, возвращается нуль.
Здесь представлены наиболее часто используемые функции. Приведем пример программы, опpеделяющей количество символов и слов в пpоизвольной стpоке символов [4].
program pr28;
const YES=1; {Константы, опpеделяющие является ли }
NO=0; { текущий символ элементом слова}
var
str : string;
nw, {Количество слов}
nc, {Количество символов}
inword: integer; {Пеpеменная, пpинимающая значения
констант YES или NO}
i : integer;
begin
writeln('Введите стpоку символов:');
read (str);
nw:=0;nc:=0;inword:=NO;
for i:=1 to length(str) do
begin
nc:=nc+1;
if str[i] in [':','.',',','"','!','?',';',' ']{Если pазделитель,}
then inword:=NO {то текущий символ вне слова}
else
if inword=NO then
begin inword:=YES;
nw:=nw+1;
end;
end;
writeln ('nc=',nc,'nw=',nw);
end.
В Турбо-Паскале 7.0 появился новый тип данных - строки, заканчивающиеся нулевым символом (#0), или, как их ещё называют, ASCIIZ-строки. В таких строках можно размещать до 65535 любых символов, кроме нулевого. Реализация механизма ASCIIZ-строк состоит из двух компонентов: во-первых введен новый предопределенный тип Pchar, а также некоторые синтаксические допущения, связанные с этим типом, и, во-вторых, в систему стандартных модулей добавлен модуль String, в котором содержится пакет разнообразных функций для работы с этими строками. Подробно работа с такими строками в этом пособии не рассматривается.