- •Лекция 2. Переменные
- •Типы переменных
- •Комментарии
- •Лекция 3. Операции и операнды. Выражения. Стандартные функции и процедуры Операции и операнды. Выражения
- •Стандартные функции и процедуры
- •Лекция 4.Операторы.Ввод-вывод информации. Операторы
- •Ввод-вывод информации
- •Лекция 5.Создание консольного приложения
- •Лекция 6. Управляющие конструкции. Управляющая конструкция if
- •Самостоятельная работа.
- •Цикл for
- •Самостоятельная работа.
- •Инструкция (цикл) while
- •Самостоятельная работа.
- •Оператор цикла с постусловием repeat
- •Самостоятельная работа.
- •Оператор выбора case
- •Оператор перехода goto
- •Лекция 7.Строки Строковые типы
- •Стандартные подпрограммы для строк
- •Строковые выражения
- •Лекция 8. Преобразования типов Преобразования типов
- •Другие преобразования
- •Подстановка значений
- •Глобальная переменная DecimalSeparator
Лекция 7.Строки Строковые типы
Строка представляет собой набор символов, заключенный в апострофы (одинарные кавычки). Например,
'abcde' , 'Иванов И.И.' , '10.0' , 'S='.
Константа типа char представляет собой символьную строку единичной длины. Используемые и Object Pascal типы строк приведены в таблице 1.13.
Типы строк. Таблица 1.13.
|
|
|
|
|
|
Тип строки |
Максимальная длина |
Есть ли нулевой символ в конце |
|
|
ShortString |
255 байт |
нет |
|
|
AnsiString |
2 Гб |
есть |
|
|
String |
255 байт/2Гб |
есть/нет |
|
|
WideString |
2Гб |
есть |
|
|
|
|
|
|
Значение типа ShortString - это так называемые короткие строки, длина которых не превышают 255 символов. Каждый символ занимает один байт, самый первый байт содержит число, указывающее длину строки. Каждый байт имеет свой порядковый номер.Первый байт, содержащий длину строки, имеет номер, равный 0. По номеру символа можно получить доступ к его значению.
Пример 1.
В строке 'Ivanov I:’ дописать полностью имя.
Решение Исходная строка имеет длину равную 9. Увеличим вначале эту длину до 12, а затем поместим в строку недостающие символы.
Программа
program 1;
{$APPTYPE CONSOLE)
uses
SysUtils;
var
s:shortstring;
begin
s : = 'Ivanov I.’;
s [0 ] := chr (12);
s[9]:=’v’;
s[10]:= 'a';
s[11] := 'n’;
s[12] := ‘.’;
writeln('s=',s);
readln
end.
Результат работы программы
s=Ivanov Ivan.
Заметим, что длина строки, хранящаяся в нулевом байте, представлена в символьном виде. Поэтому для преобразования в число следует пользоваться стандартной функци¬ей ord, а обратно - функцией chr.
Короткая строка размещается компилятором в памяти компьютера до начала выполним программы, т.е. статически.
Строка типа AnsiString располагается в памяти иначе. Сама переменная типа AnsiString занимает в памяти 4 байта и является указателем, т.е. содержит адрес той ячейки памяти, начиная с которой будет фактически располагаться символьная строка. Выделение байта в программе происходит на этапе выполнения программы, т.е. динамически. Программа сама определить необходимую длину строки по заданному количеству символов, и операционная система выделяет нужный участок памяти. В конце строки размещается терминальный (завершающий) нуль-#0 и так называемый счетчик ссылок, занимающий 4 байта. Нумерация символов в строке типа AnsiString начинается с единицы т.е. первый символ такой строки имеет индекс 1.
Счетчик ссылок позволяет экономить память. Например ,если в программе имеется фрагмент:
.......................
var s1,s2:ansistring;
.......................
s1:=’stroka’;
s2:=s1;
.......................
то память для размещения переменной s2 не выделяется, а в переменную s2 помещается значение указателя из переменной s1. Счетчик ссылок в области памяти, связанной переменной s1, увеличивает свое значение на 1 и станет равным 2. В общем случае в программе может быть несколько переменных, ссылающихся на одну и ту же строку. Счетчик ссылок равняется количеству ссылающихся на строку переменных. Если одна из ссылающихся на строку типа AnsiString переменных изменит свое значение, то в памяти будет выделено место для новой строки. Число ссылок в прежней строке уменьшается, а в новой строке становится равным 1. Если число ссылок на строку станет равным 0, то строка уничтожается и освобождает место в памяти.
Пример 2.
Составим программу по условию предыдущего примера, используя строку типа AnsiString.
Решение
Для установки длины строки будем использовать стандартную процедуру SetLength
Программа
Program 2;
($AРРТУРЕ CONSOLE}
uses
SysUtils;
var
s:ansistring;
begin
s := 'Ivanov I. ‘;
setlength(s,12);
s [ 9 ] : = ' v' ;
s [ 10 ] : = ' a' ;
s[ 11]:='n’;
s [ 12] : =’. ';
writeln('s=’,s);
readln
end.
Результаты работы программы
s=Ivanov Ivan.
Заметим, что нумерация символов в строке типа AnsiString начинается с 1.
Тип String интерпретируется компилятором Object Pascal по разному ,в зависимости значения директивы компилятора $H. Если она включена-{$H+}-то тип String интерпретируется как AnsiString, если нет –{$H-}- то как ShortString. По умолчанию действует директива {$H+}.
Если в разделе type указано, например, String[10], то независимо от директив компилятора трактуется как ShortString с указанным числом символов.
Тип WideString также представляет собой динамически размещаемые в памяти компьютера строки, длина которых ограничена только объемом свободной памяти компьютера. Однако в отличие от строки типа AnsiString каждый символ является Unicode-символом, т.е. кодируется 2 байтами. Поэтому в строке типа WideString по сравнению со строкой типа AnsiString, имеющей такую же длину, количество символов вдвое меньше.
