Типы Record — записи в Pascal
Обновлено: 27.04.2026
Запись, как и массив, представляет собой структуру данных, то есть является составной, содержит в себе набор элементов. Однако компоненты записи не обязаны быть одного типа, а могут быть разного. Поэтому их называют не элементами, а полями. Кроме того, порядок полей не важен, так как обращение к ним происходит не по индексам, а по их именам–идентификаторам.
Прежде чем в программе создавать переменные для записей, необходимо описать конкретную разновидность записи, то есть определить ее имя, названия полей и их тип. Другими словами, мы создаем пользовательский тип данных, но относящийся к записям. В программе на языке Pascal это делается в разделе type. Рассмотрим пример:
type Product = record cost, price: currency; // цены закупки и продажи qty: word; // количество единиц товара name: string[20]; // название end;
В нем мы создаем пользовательский тип Product, и он относится к записям, потому что описывается через ключевое слово record. Кроме того, record служит открывающей операторной скобкой. Между ней и закрывающей скобкой end находятся определения полей данной записи.
В нашем случае запись как тип данных состоит из 4-х полей. Cost и price имеют тип данных currency (вспомним, что это один из вещественных типов), qty — целый беззнаковый, поле name — строковый. Таким образом одна переменная типа Product, если в дальнейшем она будет объявлена, будет содержать в себе четыре элемента–компонента. Объявим переменную и присвоим ее полям значения:
var a: Product; begin a.name := 'Milk 1L'; a.qty := 100; a.cost := 85.7; a.price := 103.58; end.
Как мы видим, обращение к полям записи происходит в так называемой нотации через точку: сначала идет имя переменной, потом точка, потом имя поля.
В программе может быть множество переменных–записей. Представьте, что кроме молока у нас еще есть переменные типа Product под хлеб, огурцы и тому подобное.
Создайте запись, содержащую поле для фамилии и имени ученика и поле для хранения его баллов. Создайте две переменные этого типа, заполните их поля данными, вводимыми с клавиатуры. Выведите на экран значения полей каждой записи (в Паскале нельзя вывести на экран запись только по имени ее переменной).
Обратим внимание, что постоянно писать имя переменной перед полями, особенно когда понятно, что все будут перечислены, кажется излишним. Поэтому, чтобы было удобно работы с переменными типа record, в языке Pascal существует оператор with...do... (буквально перевести можно как "с именем_переменной делать ..."). Тогда для ранее показанного примера заполнение полей будет выглядеть так:
with a do begin name := 'Milk 1L'; qty := 100; cost := 85.7; price := 103.58; end;
Оберните в with заполнение полей переменных и их вывод на экран в вашей программе.
Записи можно передавать в подпрограммы и возвращать из функций. При возврате запись может использоваться не как смысловая единица, описывающая свойства какого-то объекта реального или виртуального мира, а просто чтобы функция могла вернуть несколько значений, в том числе разнотипных. Ведь в Паскале функции возвращают значение только одной локальной переменной.
В программе ниже определяется функция dFill, которая заполняет данными поля одной записи и возвращает ее в главную программу, где она присваивается переменной a:
type Data = record rand, user: integer; end; var a: Data; function dFill: Data; begin with dFill do begin rand := random(1000) - 500; writeln('Компьютер сгенерировал: ', rand); write('Ваш ответ: '); readln(user); end; end; begin a := dFill; writeln(a.rand, ' ', a.user); end.
В теле функции роль переменной–записи играет само имя функции — dFill.
Полем записи может быть массив. Так в первом примере у нас было поле name с типом string, который подобен массиву. Однако обратное тоже верно: массив может содержать записи, то есть представлять собой массив записей. Поскольку все элементы массива должны быть одного типа, то все элементы в массиве записей должны иметь один и тот же тип записи. Представьте, что есть массив, в котором содержится описание всех товаров магазина.
Усложним программу, объявив в ней массив записей:
type Data = record rand, user: integer; end; var a: array[1..5] of Data; i: byte; function dFill: Data; begin with dFill do begin rand := random(1000) - 500; writeln('Компьютер сгенерировал: ', rand); write('Ваш ответ: '); readln(user); end; end; procedure arrayWrite(var arr: array of Data); begin writeln('Пары массива:'); for i:=0 to high(arr) do begin write(i, '-я: '); with arr[i] do writeln(rand, ' и ', user); end; end; begin randomize; for i:=1 to 5 do a[i] := dFill; arrayWrite(a); end.
Здесь переменная a содержит уже не одну запись, а массив записей. Для его заполнения мы в цикле пять раз вызываем функцию dFill. Каждая возвращаемая из нее запись присваивается не отдельной переменной, а отправляется в свою ячейку массива. Можно сказать, вместо переменной у записи номер–индекс в массиве. Индекс определяется меняющимся значением переменной i.
Напротив, процедура arrayWrite работает сразу с массивом записей. Цикл for на каждой своей итерации извлекает из массива целую запись. Обращаться к ней надо через a[i]. В теле цикла с помощью оператора with "извлекаются" ее поля rand и user. Без with для извлечения полей использовался бы такой синтаксис: arr[i].rand и arr[i].user.
Задания для дополнительной или самостоятельной работы:
Доработайте вашу программу про учеников, чтобы в ней были подпрограммы для заполнения записей данными и вывода содержащихся сведений на экран. Количество учеников должно задаваться пользователем.