Во многих экономических и информационных задачах обрабатываются ведомости, документы, списки. При этом появляется необходимость объединять данные различного типа в одну группу. Для работы с группой данных в языке Pascal введено понятие записи, одной из наиболее удобных и гибких структур данных, применяемых при описании сложных объектов.
Запись — последовательность состоящая из фиксированного числа величин различных типов, называемых полями или компонентами записи.
Понятие записи рассмотрим на примере ведомости списка студентов с их оценками:
Тип записи
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>;
end;
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] ;
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.