Pascal. Запись (RECORD)

Во многих экономических и информационных задачах обрабатываются ведомости, документы, списки. При этом появляется необходимость объединять данные различного типа в одну группу. Для работы с группой данных в языке ПАСКАЛЬ введено понятие записи, одной из наиболее удобных и гибких структур данных, применяемых при описании сложных объектов.

Запись - последовательность состоящая из фиксированного числа величин различных типов, называемых полями или компонентами записи.

Понятие записи рассмотрим на примере ведомости списка студентов с их оценками:

N| Фамилия И.О. | Оценка|

1 | Андреев С.Н. | 5 3 4 |

2 | Иванова Л.П. | 5 5 5 |

3 | Соколов Ю.Т. | 4 4 5 |

Каждая строка в этой ведомости состоит из отдельных элементов - данных различного типа:

a)порядковый номер - целое число;

б) Фамилия И.О. - массив символов;

в) оценки - массив целых чисел.

Эти данные можно объединить в одну группу и считать записью. Запись в целом и ее отдельные элементы обозначаются именами. Введем следующие обозначения: В - имя всей записи; N - порядковый номер;

ФИО - фамилия,имя,отчество;ОЦЕНКА - оценки.

Обращение к элементу записи в программе выполняется с помощью уточненного имени . Уточненное имя содержит имя записи и имя элемента и записывается в следующем виде:

ИМЯ ЗАПИСИ.ИМЯ ЭЛЕМЕНТА;

Пример,

B.N;

B.ФИО;

B.ОЦЕНКА;

Запись можно описать тремя способамими:

  1. В разделе описания переменных:
    var <имя записи> : record
    <имя элемента1>:<тип элемента1>;
    <имя элемента2>:<тип элемента2>;
    ...............................................................
    <имя элемента n>:<тип элемента n>;
  2. В разделе описания типов:
    type <имя типа>=record
    <имя элемента1>:<тип элемента1>;
    <имя элемента2>:<тип элемента2>;
    ................................................................
    <имя элемента n>:<тип элемента n>;
    end;
    var <имя записи>:<имя типа>;
  3. В разделе описания констант, если первоначальное значение записи - константа.

    Пример:

    type B=record
    x,y,z:integer;
    end;
    const ved:B=(x:5,y:4,z:6);

    где x,y,z - элементы;

    5,4,6 - их значения.

Правила работы с записями:

  1. С компонентами записи можно обращаться как с компонентами соответствующего типа.
  2. Элемент записи можно указывать как в левой части оператора присваивания, так и в правой.
  3. Обращение к элементам записи осуществляется с помощью указания имени поля через точку.
  4. Обращение к записи в целом возможно только в операторе присваивания и только если в левой и в правой части будут стоять одинаковые записи.

    Например:

    VED:=VED1 + VED2 ; {Запись 1 (10 полей) + Запись 2
    

    (10 полей) результат Запись 3 (20 полей). }

  5. Отметим, что обращение к элементам записи происходит с помощью уточненного имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения , а в блоке используются только имена элементов записи.

Общая форма оператора присоединения:

with <имя записи> do
begin
операторы, содержащие имена элементов записи
end;

Пример:

with b do
begin
n:=2 ;
s:=ОЦЕНКА[1]+ОЦЕНКА[2]+ОЦЕНКА[3] ;</p>
read(n);
end;

Приведем пример оператора with:

with Data do
if M=12 then
begin
M:=1;
Year:=Year + 1;
end
else M:=M + 1;

Это эквивалентно следующему:

if Date.M=12 then
begin
Date.M:=1;
Date.Year:=Date.Year + 1;
end
else
Date.M:=Date.M + 1;

В операторе with сначала производится проверка каждой ссылки на переменную, а именно: можно ли ее интерпретировать, как поле записи. Если можно, то она всегда интерпретируется именно таким образом, даже если имеется доступ к переменной с тем же именем.

Рассмотрим пример эффективного использования записей в программе начисления стипендии студентам по шаблону:

N

Ф.И.О

эк.1

эк.2

эк.3

балл

сумма

проф

итого

1

Иванов И.И.

4

4

3

11

50

0.25

49.75

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

Графа “балл” вычисляет суммарную оценку за семестр. “Сумма” - определяет размер стипендии по упрощенному правилу: если нет двоек и балл равен 15, то стипендия - 75 руб.; при условии, что 12 < балл < 15, то стипендия - 62 руб.50 коп., а если 9 < балл< 12, то 50 руб. В противном случае, сумма равна 0. В графе “проф” указывается профсоюзный взнос в размере 1% от стипендии, а графа “итого” определяет сумму денег к выдаче.

В программе предусмотрим перед распечаткой итоговой ведомости упорядочение записей по убыванию в графе “балл”

progrаm spisok;
type stud=record
fio: string[20]
ex1,ex2,ex3: 2..5;
bal: 6..15;
sum: real;
nalog: real;
itog: real;
end;
var
x: array[ 1..30 ] of stud;
i,k,m,n: integer;
y: 6..15;
z: stud;
begin
writeln(‘ введите кол-во студентов: ‘);
readln(n);
for i:=1 to n do with x[ i ] do
begin
write(‘введите ФИО ‘i’-го студента: ‘);
readln(fio); write (‘ введите его три оценки: ‘);
readln(ex1,ex2,ex3);
end;
for i:=1 to n do with x[ i ] do
begin
bal:=ex1+ex2+ex3;
if (ex1=2) or (ex2=2) or (ex3=2)
then sum:=0
else if bal=15 then sum:=75
else if bal>12 then sum:=62.5
else if bal>9 then sum:=50
else sum:=0;
nalog:=sum * 0.01; itog:=sum-nalog;
end;
for k:=1 to n-1 do
begin
y:=x[ k ].bal; m:=k;
for i:=k+1 to n do
if y<x[ i ].bal then begin
y:=x[ i ].bal; m:=i ; end;
z:=x[ k ]; x[ k ]:=x[ m ]; x[ m ]:=z;
end;
writeln; writeln(‘ СТИПЕНДИАЛЬНАЯ ВЕДОМОСТЬ ‘);
for i:=1 to 64 do write(‘-‘); writeln;
write(‘ | N | Ф.И.О. | эк1 | эк2 | эк3 | балл | сумма | ‘);
writeln(‘ налог | итого | ‘);
for i:=1 to 64 do write (‘ - ‘); writeln;
for i:=1 to n do with x[ i ] do
begin
write(i:3, fio:20, ex1:4, ex2:4, ex3:4); writeln(bal:5, sum:9:2, nalog:8:2, itog:7:2);
end;
end.