Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Паскаль_Конспект лекций.doc
Скачиваний:
41
Добавлен:
27.05.2015
Размер:
1.39 Mб
Скачать

Лекция 10. Записи и множества

10.1 Запись

Запись в Object Pascal относится к структурированным типам. Запись – содержит именованные компоненты-поля (часто разного типа), объединенные одним общим именем и идентифицируемые (адресуемые) с помощью, как имени записи, так и имени полей.

Разнотипность компонент записи позволяет использовать ее в качестве набора данных, описывающих некоторый информационный объект. Например, при описании учащихся данного класса школы можно рассмотреть следующие индивидуальные характеристики отдельного ученика: фамилию, имя, месяц и число рождения, вес, рост, номер парты и т. д. Видно, что все данные об ученике разного типа. Действительно, фамилия, имя – строки; месяц, номер парты – целые числа; вес и рост – вещественные числа. Таким образом, для хранения информации об учащихся воспользоваться массивом практически невозможно. Но структурированный тип Record предназначен как раз для этого.

При описании переменной - записи предварительно определяют идентификатор типа Record в разделе описания типов.

type

<идентификатор пользовательского типа> = record

<список 1 идентификаторов полей записи>: <тип полей>;

<список 2 идентификаторов полей записи>: <тип полей>;

………………………………………………………………

<список n идентификаторов полей записи>: <тип полей>;

end;

После описания типа можно использовать его идентификатор при описании любого количества переменных, как мы это делали с идентификаторами стандартных типов.

Данный путь не единственный, можно описать переменную типа Record, при этом не описывая типа.

var

<список идентификаторов переменных>: record

<список 1 идентификаторов полей записи>: <тип полей>;

<список 2 идентификаторов полей записи>: <тип полей>;

………………………………………………………………

<список n идентификаторов полей записи>: <тип полей>;

end;

Примеры:

1)

type

child = record

f, i: String;

m, d, n: integer;

x, v: Real;

end;

var

a, b, c: child;

2)

var

a, b, c: record

f, i: String;

in, d, n: integer;

r, v: Real;

end;

3)

Month = (Jan, Feb, Mar, Apr, May, Jun, Jly,

Aug, Sep, Oct, Nov, Dec);

Date : record

D: 1 . . 31;

M: Month;

Y: 1900 .. 2020;

end;

В примерах 1) и 2) переменные a, b, c – это имена записей. В результате описания они имеют один и тот же тип и структуру. В примере 3) Date – имя записи, а разнотипные поля D, M, Y- имеют пользовательский тип (номер дня, месяц, год).

Доступ к конкретному полю записи в программе осуществляется через идентификатор переменной - записи и идентификатор поля, которые разделяются точкой.

Примеры:

a.f , b.r , a.v, c.m

Переменные типа «запись» (указано только первое имя) могут участвовать в операторах присваивания, но никакие операции над ними выполняться не могут. Арифметические или любые другие операции могут выполняться только над отдельными полями записи.

Примеры:

a . f := 'Иванов’ ;

a . i := 'Иван' ;

а . т := 12;

a . d := 23;

a . n := 6 ;

a . r := 1.78;

a . v := 63.5;

m := m + a. r;

t := а . r / a . v;

С целью облегчить выполнение многократных ссылок к полям одной записи используют оператор присоединения:

with <переменная-запись> do <оператор>;

Внутри оператора, входящего в оператор присоединения, компоненты записи обозначаются с помощью только имён полей (имя переменной-записи перед ними не указывается). Заголовок операторов может содержать список переменных-записей:

with <переменная-запись>[,<переменная-запись>] do <оператор>;

Пример (используем запись из приведённого выше примера):

with a do

begin

f:=’Иванов’ ; n:=6; d:=23; r:=1.78; v:=63.5;

end;

Запись может быть элементом массива. Такой массив называют массивом записей. Пример ниже показывает применение массива записей.

type

Point = record

X, Y: Real;

end;

Vector = array[1.. 3] of Point;

В этом примере Point – это запись, то с двумя полями -координатами точки, а Vector – это массив записей. Программа, использующая массив записей приведена ниже.

program p10_1;

{ программа осуществляет ввод информации об учащихся класса,

выводит на экран введенную информацию и отношение роста ученика

к его массе}

const

n = 30; { количество учеников в классе }

type

child = record { Этот тип – это запись, содержащая

информацию об ученике }

f, i : String;

m, d, n : integer;

r, v : Real ;

end;

TKlass = array[1.. n] of child; { Этот тип является массивом записей, содержащих информацию об учащихся класса }

Var

A: TKlass; { А экземпляр типа TKlass }

i, n : integer;

t : real;

begin

Write('Введите количество учеников – n , 0 < n < 30 ' );

Readln(n);

{ ввод данных об учениках }

for i := 1 to n do

begin

Writeln(' N ' , i) ;

Write('введите фамилию: '); Readln(A[i] . f);

Write('введите имя: '); Readln(A[i] . i);

Write('введите месяц рождения: '); Readln(A[i] . m);

Write('введите день рождения: '); Readln (A [i] .d);

Write('введите рост: '); Readln(A[i].r);

Write('введите вес: '); Readln(A[i].v);

Write('введите номер парты: '}; Readln(A[i].n);

end;

{ вывод на экран списка учеников и их данных }

for i:= 1 to n do

Writeln(i: 2, '/', A[i].f : 10, '/' , A[i].i : 10, '/' , A[i].d : 2,

'/' , A[i].m: 2, '/' , A[i].n : 2, '/ ' , A[i] . r : 4 : 1 , '/' ,

A[i].v: 4 : 1 , '/' , A[i] . r , '/' , A [i] .v : 6: 3) ;

end.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]