Строка, оканчивающаяся нулевым байтом - символом с кодом 0. Не накладывается ограничение на их размер (до 65535 байтов); тип определен как PChar.
Ключ {X+} - в этом случае используется как строка, эквивалентная массиву типа
Pchar=array [0…k] of char; {расширенный синтаксис}
где k - количество символов в строке, не считая символа с кодом 0 в конце строки.
В версии 7.0 используются стандартные модули Strings и Windows.
Запись
Тип записьвключает компоненты, которые могут быть разного типа. Называют их полями. Зарезервированное слово - record. После него перечисляются все поля записи с указанием через двоеточие их типов. Запись завершается словом end.
Поля отделяются друг от друга ; . Количество полей может быть любым.
Если несколько полей записи имеют один и тот же тип, то имена полей можно перечислить через запятую, а затем указать общий тип.
Пример
type type
complex=record complex = record
re: real; re, im: real
im: real end;
end;
Далее можно задать переменные
var
x, y, z: complex;
Другой вариант задания переменной в записи
var
x, y, z: record
re, im: Real;
end;
Доступ к полям записи осуществляется указанием имени переменной и имени поля, записываемого через точку.
Пример
x.re, y. im
x. im: = 1.7;
x.re := 1.5;
y . re : = - x.re;
y. im: = - x. im;
Можно задать и типизированные константы типа запись.
Пример
type
point = record
x, y: Real
end;
vector = array [0..1] of point;
month = (Jan, Feb, Mar, Apr, May, Jun, Jyl, Aug, Sep, Oct, Nov, Dec);
Поля должны указываться в той последовательности, в какой они перечислены в объявлении типов.
Для того, чтобы не выписывать имя записи каждый раз при обращении к полям, используют оператор WITH.
Структура оператора
with <имя переменной записи> do <оператор>;
Внутри оператора можно указывать только поле записи.
Пример
with x do
begin
re:=1.5 {x.re := 1.5;}
im:=1.7; {x. im: = 1.7;}
y.re:=-re; ; {y . re : = - x.re;}
y.im:=-im; {y. im: = - x. im;}
end;
Для вложенных полей делают уточнение.
Пример
type
birthday = record
day, mounth: byte;
year :word
end;
var
c :record
name: string;
bd: Birthday
end;
begin
……………………
if c.bd. year =1939 then
……………………
end.
Записи с вариантами
Прежде чем начать разговор о записи с вариантами, ещё раз построим запись с описанием конкретного объекта.
Для описания объекта «человек» могут понадобиться, например, следующие характеристики:
- фамилия, имя, отчество (символьные массивы или строки);
- пол (перечисляемый тип из двух значений):
- индекс специальности (целое) и т.д.
Описание типа запись представляет собой список описаний его элементов (поля записи); каждое описание похоже на описание простой переменной. Список полей начинается зарезервированным (служебным) словом record и завершается зарезервированным (служебным) словом end.
type
person = record
name, secondname, surname: string[20];
sex: (Male, Female);
speciality: word;
end;
Уникальность имён записей требуется только внутри записи. Идентификаторы полей могут совпадать с другими идентификаторами текущего блока, а также с идентификаторами полей в других записях. Конфликт не наступает, так как идентификатор поля всегда выступает в программе в паре с переменной-записью.
Далее определяем переменные.
var
sasha, masha: person;
Доступ производится с помощью конфигурации R.F, которая называется селектор записи, где R – переменная типа запись, F – идентификатор поля.
Пример
sasha.name:=’Александр’;
masha.name:=’Мария’;
sasha.sex:=Male;
masha.sex:=Female;
masha.speciality:=sasha.speciality;
Можно строить:
- массивы, состояшие из записей.
- записи, в состав которых, в свою очередь входят записи.
Пример
var
group: array [1..10] of person;
Для переменной group доступ к полям записи, составляющих этот массив, производится следующим образом:
if group[i].name=’Борис’ then
writeln (group[i].surname);
Во втором случае (запись в записи) пусть необходимо хранить дату рождения человека. Определим её как новый тип запись.
type
date=record
month :( Jan, Feb, Mar , Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
day: 1..31;
year: 1900..2000
end;
Используем введённые типы данных в записи person:
type
person=record
name, secondname, surname: string[20];
sex: (Male, Female);
specialty: word;
birthday: date;
end;
Доступ к полям элемента birthday производится по общим правилам:
sasha.birthday.year:=1970;
masha. birthday.month:=Feb;
Слева от точки находится переменная типа запись
В первом примере - group[i], во втором - sasha.birthday.
На основе записи person построим запись с вариантами. Рассмотрим тип person. В этом типе поле sex(пол) имеет значение Male. Для него рассмотрим
- время прохождения очередных военных сборов;
- курит человек или нет.
Можно задать два отдельных типа зersonмale и зersonаemale, в которых задать соответствующие поля.
Любой тип запись помимо фиксированного списка полей может содержать так называемую вариантную часть, предполагающую определение нескольких вариантов структуры этого типа. Различие может касаться как числа компонентов, так и их типа.
Вариантная часть содержит несколько альтернатив, в каждой из которых в круглых скобках задаётся список полей, присущих данному варианту. Списку предшествует метка, являющаяся конкретным значением поля, которое и является критерием выбора вариантов. Перечисление альтернатив начинается с определения этого поля.
type
personsex = (Male, Female);
date=record
month :( Jan, Feb, Mar , Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec);
day: 1..31;
year: 1900..2000
end;
person = record
имя типа
name, secondname, surname : string[20];
переменная выбора варианта
с указанием типа
specialty: word;
birthday: date;
case sex: personsexof
Male: (army:date; Smoking : Boolean);
Female: ( eyescolor: (Blue, Brown, Green, Gray))
end;
1. Начало вариантной части отмечается служебным словом case;после определения поля-признака выбора вариантов (переменная выбора варианта) записывается служебное слово of. Завершается вариантная часть словом endвместе с завершением всей записи. Следовательно, в определении типа может быть только одна вариантная часть и должна быть в конце записи.
2. Альтернативы вариантной части помечаются допустимыми значениями поля sex. Определение этого поля вынесено из фиксированной части и помещено в заголовке вариантной части. Поле, значение которого задают варианты, иногда называют дискриминантом записи.
3. Для того, чтобы поле sex могло служить дискриминантом, его тип должен задаваться идентификатором. Поэтому перечисляемый тип определен отдельно, а в заголовке вариантной части использован идентификатор personsex.
4. Идентификаторы полей во всех вариантах должны быть различны и отличаться от идентификаторов полей фиксированной части.
5. Для некоторых значений поля-дискриминанта вариант может отсутствовать. Тогда после двоеточия может быть пустой список вида ( ).
Теперь возможно
if group[i].sex= Male then group[i].smoking:= true
else group[i].eyescolor:=Green;
Возможно, что идентификатор ключа выбора (переменной выбора варианта) отсутствует.
type
forma = record
name :string;
case byte of
0: (birthplace: string[40]);
1: (country: string[20];
entryport: string[20];
entrydate: 1..31;
exitdate: 1..31)
end;
Все заданные варианты в вариантной части накладываются друг на друга, то есть каждому из них выделяется одна и та же область памяти.
Это открывает возможности преобразования типов.
Пример
var
mem4: record
case byte of
0: (by: array[0..3] of byte);
1: (wo: array[0..1] of word);
2: (lo: longint)
end;
Каждый из трёх вариантов занимает в памяти один и тот же участок из 4 байт. В зависимости от того, к какому полю записи мы обращаемся в программе, этот участок рассматривается как массив из 4 байт (поле by), массив из 2 целых типа word (поле wo) или как целое число типа longint (поле lo).