Во многих экономических и информационных задачах обрабатываются ведомости, документы, списки. При этом появляется необходимость объединять данные различного типа в одну группу. Для работы с группой данных в языке ПАСКАЛЬ введено понятие записи, одной из наиболее удобных и гибких структур данных, применяемых при описании сложных объектов.
Запись — последовательность состоящая из фиксированного числа величин различных типов, называемых полями или компонентами записи.
Понятие записи рассмотрим на примере ведомости списка студентов с их оценками:
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=recordx,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 doif M=12 thenbeginM:=1;Year:=Year + 1;endelse M:=M + 1;
Это эквивалентно следующему:if Date.M=12 thenbeginDate.M:=1;Date.Year:=Date.Year + 1;endelseDate.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=recordfio: string[20]
ex1,ex2,ex3: 2..5;bal: 6..15;sum: real;nalog: real;itog: real;end;varx: array[ 1..30 ] of stud;i,k,m,n: integer;y: 6..15;z: stud;beginwriteln(‘ введите кол-во студентов: ‘);readln(n);for i:=1 to n do with x[ i ] dobeginwrite(‘введите ФИО ‘i’-го студента: ‘);readln(fio); write (‘ введите его три оценки: ‘);readln(ex1,ex2,ex3);end;for i:=1 to n do with x[ i ] dobeginbal:=ex1+ex2+ex3;if (ex1=2) or (ex2=2) or (ex3=2)then sum:=0else if bal=15 then sum:=75else if bal>12 then sum:=62.5else if bal>9 then sum:=50else sum:=0;nalog:=sum * 0.01; itog:=sum-nalog;end;for k:=1 to n-1 dobeginy:=x[ k ].bal; m:=k;for i:=k+1 to n doif y<x[ i ].bal then beginy:=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 ] dobeginwrite(i:3, fio:20, ex1:4, ex2:4, ex3:4); writeln(bal:5, sum:9:2, nalog:8:2, itog:7:2);end;end.