Сложные типы данных.
Записи
Все типы данных, как простые так и сложные, которые мы изучали и применяли раньше, могут использоваться для хранения данных только одного типа. Например в переменных типа integer можно хранить только целые числа. В переменных типа array, set можно хранить только элементы их базового типа и т.д. Но так как вычислительная техника используется в различных информационных, справочных, экономических и других информационных системах, то возникает необходимость в организации сложного типа данных для хранения неоднородной (разного базового типа) информации. Для работы с группой различных по типу данных, в системе программирования Turbo Pascal применяют тип данных "запись".
Что такое запись.
Понятие записи мы рассмотрим на примере списка учащихся с их оценками:
N Фамилия И.О. Оценки
1 Иванов И.И. 5 3 4 2
2 Петров С.С. 3 4 5 5
3 Сидоров П.П. 3 3 3 4
Каждая строка в этой ведомости состоит из отдельных элементов - данных разного типа:
а) порядковый номер - целое число;
б) Фамилия И.О. - символьная строка;
в) оценки - массив целых чисел.
Эти данные можно объединить в одну группу и считать записью. Запись в целом и отдельные её элементы (поля) обозначаются именами. Вве- дём например следующие обозначения: R_EX - имя всей записи; N - порядковый номер; NAME - Фамилия И.О.; RB - оценки.
Обращение к элементу записи.
Обращение к элементу (полю) записи в программе выполняется с помощью уточнённого (составного) имени. Уточнённое имя содержит имя записи и имя элемента и записывается в следующем виде:
<имя записи>.<имя элемента (поля) записи>
Например:
R_EX.N
R_EX.NAME
R_EX.RB
Декларация (объявление) записи.
Объявление записи можно производить в разделе объявления переменных VAR или с использованием раздела объявления типов пользователя TYPE.
Объявление записи в разделе объявления переменных VAR имеет следующий вид:
VAR
<имя записи>: RECORD
<имя поля 1>: тип;
<имя поля 2>: тип;
. . .
<имя поля n>: тип
END;
Здесь служебные слова RECORD END играют роль операторных скобок. Между ними производится описание полей записи. Вместо одного имени записи допускается использование нескольких имён, записанных через запятую.
Для представленной выше ведомости учащихся описание записи выглядит следующим образом:
VAR
R_EX: RECORD
N: Integer;
NAME: String[25];
RB: Array[1..4] of byte
END;
Рассмотрим более универсальную форму объявления записи - с использованием раздела типов пользователя TYPE. Объявление имеет вид:
TYPE
<имя типа>: RECORD
<имя поля 1>: тип;
<имя поля 2>: тип;
. . .
<имя поля n>: тип
END;
VAR
<имя записи>: <имя типа>;
Объявление двух записей нашей ведомости можно сделать следующим образом:
TYPE
SSS: RECORD
N: Integer;
NAME: String[25];
RB: Array[1..4] of byte
END;
VAR
R_EX1, R_EX2: SSS;
Элементы (поля) записи используются в программе так-же как и обычные переменные. Над элементом (полем) записи можно выполнять действия, допустимые для данных его типа. Например:
R_EX1.N := 2;
R_EX2.Name := Сидоров П.П.;
Обращение к записи в целом, а не только к её отдельным её елементам, допускается только в операторе присваивания. При этом слева и справа от знака присваивания должны использоваться имена записей одинакового типа.
R_EX1 := R_EX2;
Оператор присоединения.
Обращение к элементам (полям) записи происходит с помощью уточнённого имени. Оператор присоединения позволяет упростить обращение к элементу (полю) записи. Имя записи выносится в заголовок оператора присоединения, а в блоке используются только имена элементов записи. Общая форма оператора присоединения:
WITH <имя записи> DO
Begin
{операторы, содержащие только
имена элементов записи.}
End;
Например, для рассмотренной выше записи (списка учащихся) оператор присоединения может выглядеть так:
WITH R_EX1 DO
Begin
Write(Введите номер записи );
Readln(N);
Write(Введите Фамилию И.О. )
Readln(Name);
End;
Записи с вариантами.
Особой разновидностью записей являются "записи с вариантами", которые объявляются с помощью зарезервированного слова "CASE". С помощью записей с вариантами Вы можете одновременно сохранять различные структуры данных, которые имеют одну большую общую часть, и небольшие части, различные в разных структурах. Например, запись хранящая параметры геометрических фигур. Для квадрата задаётся одна сторона, для треугольника две стороны и угол между ними, для окружности её радиус. Общей частью являются координаты текущей точки x,y
AR
MS: Record {переменная типа запись}
x: real; {текущая координата x}
y: real; {текущая координата y}
Case Fig: (Square, Triangle, Circle) of {вариантная часть}
Square: (side: real); {квадрат}
Triangle: (side1, side2, angle: real); {треугольник}
Circle: (Radius: real); {окружность}
END;
Вариантная часть может быть только одна и должна располагаться в конце записи. Начинается она служебным словом case, за которым следует переменная выбора варианта. За каждым возможным значением этой переменной через двоеточие в круглых скобках записываются поля данного варианта записи с указанием их типов. Круглые скобки необходимы, если даже для данного варианта записи поля отсутствуют. Перед тем, как использовать один из вариантов записи, переменной выбора варианта необходимо присвоить соответствующее (одно из возможных) значение.
Использование записей
Программы, в которых используется одна запись как самостоятельная переменная, встречаются достаточно редко. Как правило необходимо несколько записей для организации какой-либо информационной системы. Иногда с этой целью используют массивы записей. Это облегчает доступ к данным, но ограничивает объём используемой в такой системе информации. Поэтому наиболее часто используются файлы записей, которые могут хранить очень большой объём информации на протяжении длительного времени.
Пример программы
Дан файл, содержащий записи о книгах. Сведения о каждой из книг - название книги, фамилия автора, год издания. Программа определяет количество книг, год издания которых меньше или равен 1600.
PROGRAM EX_33_1; Type Book=record {тип - запись} Title: string[40]; {наименование книги} Author: string[40]; {автор} Entry: integer; {год издания} end; ff= file of book; {тип - файл записей} Var s: longint; {сумма искомых книг} k: book; {переменная - запись} log_f: ff; {переменная - файл записей} BEGIN s:=0; Assign(log_f,bibliot.dat); reset(log_f); while not eof(log_f) do begin read(log_f,k); if k.entry<=1600 then s:=s+1; end; Writeln(Книг изданных ранее 1600 года включительно ,s); END.
Сложные типы данных. Записи (Turbo Pascal 7.0)
Лекции по предмету «Программирование»