- •Программирование на языке Pascal введение
- •Этапы разработки программ
- •Ядро Турбо Паскаль
- •Среда программирования Турбо паскаль
- •Функциональные клавиши
- •2.3. Текстовый редактор
- •Запуск и отладка программы
- •Элементы языка
- •3.1. Алфавит
- •3.2. Зарезервированные слова и идентификаторы
- •3.3. Общая структура программ в Турбо Паскаль
- •3.4. Основные типы данных. Простые типы
- •Основные операторы языка программирования Турбо Паскаль
- •4. 1. Ввод – вывод информации в Турбо Паскаль
- •4.2. Математические операции, встроенные математические функции Турбо Паскаль
- •4.3. Пустой оператор и составной оператор
- •4.4. Условный оператор
- •4.5. Оператор выбора
- •4.6. Операторы повторений
- •5. Символьные типы данных
- •6. Строковые типы данных
- •Стандартные процедуры и функции для строк
- •7. Структурированные типы данных. Массивы
- •7. 1. Одномерные массивы
- •Доступ к элементам массива
- •7.2. Сортировка массивов
- •7.2.1. Сортировка вставкой
- •7.2.2. Сортировка выбором
- •7.2.3. Сортировка обменом (пузырьковая сортировка)
- •7.3. Многомерные массивы
- •8. Записи
- •9. Множества
- •10. Типизированные константы
- •10.1. Константы простых типов и типа string
- •10.2. Константы-массивы
- •10.3. Константы-записи
- •10.4. Константы-множества
- •Литература
8. Записи
Рассмотрим еще один структурированный тип данных, так называемые записи (Record), позволяющие хранить вместе переменные, имеющие различные типы данных:
Структура объявления типа записи такова:
<имя типа> = RECORD <список полей> End;
Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификаторами ставится двоеточие и описание типа поля (полей), например:
type
Birthday = record
day, month: byte;
year: integer;
end;
var
a,b: Birthday;
…
В этом примере тип Birthday (день рождения) есть запись с полями day, month и year (день, месяц и год); переменные А и В содержат записи типа Birthday.
Как и в массиве, значения переменных типа записи можно присваивать переменным того же типа, например:
a: =b;
К каждому из компонентов записи можно получить доступ, если использовать составное имя, т.е. указать имя переменной, затем точку и имя поля:
a.day: =27
b.year: =1939;
Для вложенных полей приходится продолжать уточнения:
type
Birthday = record
day, month: byte;
year: integer;
end;
var
c: record
name: string;
bd: Birthday;
end;
begin
. . . .
if c.bd.year =1939 then…
end.
Чтобы упростить доступ к полям записи, используется оператор присоединения with:
With <переменная> do <оператор>
Здесь With, do – ключевые слова (с, делать);
<переменная> – имя переменной типа запись, за которым, возможно, следует список вложенных полей;
<оператор> – любой оператор Турбо Паскаль.
Например:
With c.bd do month: =9;
это эквивалентно:
With c do With bd do month: =9;
Турбо Паскаль разрешает использовать записи с так называемыми вариативными полями, например:
Type
Forma =record
Name: string;
case byte of
0: (Birth Place: string [40]);
1: (Country: string [20];
Entri Port: string [20];
Entry Pate: 1…31;
Exite Pate: 1…31)
End;
В этом примере тип FORMA определяет запись с одним фиксированным полем Name и вариативной частью, которая задается предложением case of. Вариативная часть состоит из нескольких вариантов (в примере для двух вариантов: 0 и 1). Каждый вариант определяется константой выбора, за которой следует двоеточие и список полей, заключенный в круглые скобки. В любой записи может быть только одна вариативная часть, и, если она есть, то должна располагаться за всеми фиксированными полями.
Отличительной особенностью вариативной части является то обстоятельство, что все заданные в ней варианты «накладываются» друг на друга, т.е. каждому из них выделяется одна и та же область памяти. Это открывает дополнительные возможности преобразования типов, например:
Var
met 4: record
case byte of
0: (by: array [0…3]of byte);
1: (wo: array [0…1]of word);
2: (lo: longint);
end;
В этом примере запись met 4 имеет три варианта, каждый из которых занимает в памяти один и тот же участок в 4 байт. В зависимости от того, к какому полю мы обращаемся в программе, этот участок может рассматриваться как массив из 4 байт (поле by) массив из двух целых типа Word или, наконец, как одно целое число типа Longint. Например, этой записи можно сначала присвоить значение как длинному целому, а затем проанализировать результат по байтам или словам.
Var
x: word;
xb: byte;
xl: LongInt;
Begin
. . . .
with m do
begin
lo:= trunc(2*pi*x);
if wo[1]=0 then
if wo[1] =0 then
xb: =x[0]
else
x:= wo[0]
else
x1: =lo
end;
. . . .
End.
Предложение CASE…OF, открывающее вариативную часть, внешне похоже на соответствующий оператор выбора, но на самом деле играет лишь роль своеобразного служебного слова, обозначающего начало вариативной части. Именно поэтому в конце вариативной части не следует ставить END как пару к CASE…OF (Поскольку вариативная часть всегда последняя в записи, за ней все же стоит END, но лишь как пара к RECORD)
Ключ выбора в предложении CASE…OF фактически игнорируется компилятором: единственное требование, предъявляемое к нему Турбо Паскаль, состоит в том, чтобы ключ определял некоторый стандартный или предварительно объявленный порядковый тип. Причем сам этот тип никак не влияет ни на количество следующих ниже вариативных полей, ни даже констант выбора. В Турбо Паскаль можно в поле ключа выбора указывать переменную порядкового типа и даже присваивать ей в программе значение.
Это, однако, не влияет на выбор поля. Значения констант выбора в Турбо Паскаль могут быть производными, в том числе повторяющимися, например:
type
rec1= record
a: byte;
b: word;
end;
rec 2 =record
c: longint;
case x: byte of
1: (d: word);
2: (e: record case Boolean of
3: (f: rec 1);
3: (g: single);
'3': (c: word)
end)
end;
var
r: rec2;
begin
r.x:= 255;
if r.e.g =0 then
writeln('O.K.')
else
writeln (r.e.g.);
End.
В этом предложении case Boolean of в записи, определяемой в поле Е, объявляет ключом выбора логический тип, который, как известно, имеет лишь значения TRUE и FALSE. Константы же выбора следующих далее вариантов не только содержат совершенно не свойственные этому типу значения, но и две из них повторяющиеся, а общее количество вариантов три, а не два, как следовало бы ожидать.
Имена полей должны быть уникальными в пределах той записи, где они объявлены, однако, если записи содержат поля-записи, т.е. вложены одна в другую, имена могут повторяться на разных уровнях вложенности.
