comp-science.narod.ru ==> Дидактические материалы по информатике ==> Записи


 

Записи в языке Pascal

Запись — структурированный тип данных. Записи являются неоднородными неупорядоченными структурами с прямым доступом к компонентам. Компоненты записи называют полями записи.

Обычно запись содержит совокупность разнотипных атрибутов, относящихся к одному объекту.

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

	рекордсмен
	страна
	статус соревнований (Олимпиада, чемпионат мира)
	длина дистанции
	год рекорда
	время

Структурная диаграмма для записи

Структурная диаграмма для записи
Запись может быть объявлена в разделе type:
идентификатор типа = Record
 			поле1: тип;
			поле2: тип;
			…
			полеN: тип
end;
Например,
type beg = record
		fam: string[25];
		srtana: string[20];
		status: boolean; {Олимпиада - true; чемпионат мира - false}
		dlina: longint;
		god: 1900..2009;
		vr: string[15];
	   end;

Var a: beg;

К каждому элементу записи можно обратиться, используя составное имя, которое имеет следующую структуру:

<имя переменной>.<имя поля>

Например,

			a.fam; a.dlina и т.п.

Если, например, требуется полю "status" присвоить значение «true», то это делается так:

			a.status := true;

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

Например,

type beg1 = record
		fam: string[25];
		srtana: string[20];
		status: boolean; {Олимпиада - true; чемпионат мира - false}
		dlina: longint;
		god: 1900..2009;
		vr: record min: longint;
			   sec: real
		    end
	   end;

Var a: beg1;

Поля такой записи, находящиеся на третьем уровне, идентифицируются тройным составным именем. Например,

		a.vr.min
		a.vr.sec

В программе могут использоваться массивы записей.

Любая обработка записей, в том числе ввод и вывод, производится поэлементно.

Например,

var b: array[1..200] of beg1;

...
write('Число рекордсменов? '); readln(n);
for i:=1 to n do
with b[i] do
begin
	write('Фамилия спортсмена? '); readln(fam);
	write('Гражданин какой страны спортсмен? '); readln(strana);
	write('Статус соревнования? '); readln(status);
	write('Длина дистанции? '); readln(dlina);
	write('Год проведения соревнования? '); readln(god);
	write('Время, за которое спортсмен пробежал дистанцию (мин, сек)? '); readln(vr.min, vr.sec);
end;
...

В примере был использован оператор присоединения, который имеет следующий вид:

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

Он позволяет, один раз указав имя переменной типа "запись" после слова with, работать в пределах одного оператора (простого или составного) с именами полей как с обычными переменными, т.е. не писать громоздких составных имен.

Объём памяти, занимаемый записью, определяется суммарным объёмом, занимаемым её полями:

type beg1 = record
		fam: string[25];          {26 байт}
		srtana: string[20];       {21 байт}
		status: boolean;          {1 байт}
		dlina: longint;           {4 байта}
		god: 1900..2009;          {2 байта}
		vr: record min: longint;  {4 байта}
			   sec: real      {6 байт}
		    end
	   end;

Всего получаем: 26+21+1+4+2+4+6=65 байт

Массив, описанный выше, занимает 65 байт × 200 элементов = 13000 байт оперативной памяти.

Записи с вариантами

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

Вариантная часть записи начинается выбором case и следует за общей частью; после ее окончания в записи не могут появляться никакие другие поля, поэтому case закрывается служебным словом end.

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

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

Структурная диаграмма для записи с вариантами

Структурная диаграмма для записи с вариантами

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

 Type pol=(m,w);
       people=record
            fam:string[20];
            godro:1900..2007;
		case mw:pol of
                     m: ( voen: boolean; spec: string[15]);
                      w: ( merry: boolean; child: byte)
                 end;
var  p1, p2: people;

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

К элементам вариантной части можно обращаться так же, как к элементам фиксированной части записи.

			P1.mw:=m;   p1.voen:=true; p2.child:=2;

В процессе выполнения программы в структуру записи включается тот вариант, элементам которого в данный момент было присвоено значение. Как только какому-либо элементу другого варианта присваивается некоторое значение, в структуру записи включается этот вариант, а элементы предыдущего варианта становятся неопределенными.

Данное обстоятельство учитывается и при подсчете объема памяти, отводимого под запись с вариантами. Статические поля учитываются обычным образом, а среди вариативной части отыскивается тот случай, где суммарный объем памяти для полей максимальный.

Type pol=(m,w);
       people=record
            fam:string[20]; {21}
            godro:1900..2007; {2}
		case mw:pol of {1}
                     m: ( voen: boolean; spec: string[15]); {1+16=17}
                      w: ( merry: boolean; child: byte) {1+1=2}
                 end;


21 + 2 + 1 + max(17, 2) = 41 (байт)

 

Рассмотрим пример работы с записями без вариантов.

Задача. Сведения о деталях, хранящихся на складе, содержат следующие атрибуты: название, количество, стоимость одной детали. Вывести информацию о детали, суммарная стоимость для которой максимальна.

program ex_zap;
type detal = record a: string[30]; kol, st: integer; end;
var a: array [0..99] of detal; n, i, max: integer;
begin
 write('Количество деталей? ');
 readln(n);
 for i:=0 to n-1 do
With a[i] do 
begin write('Информация об ', i, ' детали: ');
   readln(a);
   readln(kol);
   readln(st);
 end;
 max := 0;
 for i:= 1 to n-1 do
  if a[max].kol*a[max].st < a[i].kol*a[i].st then max:=i;
 writeln('Искомая деталь: ',  a[max].a, ' стоимостью ', a[max].st, ' в количестве ', a[max].kol);
end.

 

Контрольные вопросы и задания
  1. Чем отличается тип "запись" от других структурированных типов?
  2. Могут ли поля записи быть одного и того же типа?
  3. Как обратиться к отдельному полю записи?
  4. Что такое "оператор присоединения"? В каких целях он используется?
  5. Что такое "запись с вариантами"?
  6. Как определить объем памяти под статическую запись? запись с вариантами?
  7. Как заполнить массив записей?

Рейтинг ресурсов УралWeb

 

© А.П. Шестаков, 2009
X