Во многих экономических и информационных задачах обрабатываются ведомости, документы, списки. При этом появляется необходимость объединять данные различного типа в одну группу. Для работы с группой данных в языке ПАСКАЛЬ введено понятие записи, одной из наиболее удобных и гибких структур данных, применяемых при описании сложных объектов.
Запись - последовательность состоящая из фиксированного числа величин различных типов, называемых полями или компонентами записи.
Понятие записи рассмотрим на примере ведомости списка студентов с их оценками:
N| Фамилия И.О. | Оценка|
1 | Андреев С.Н. | 5 3 4 |
2 | Иванова Л.П. | 5 5 5 |
3 | Соколов Ю.Т. | 4 4 5 |
Каждая строка в этой ведомости состоит из отдельных элементов - данных различного типа:
a)порядковый номер - целое число;
б) Фамилия И.О. - массив символов;
в) оценки - массив целых чисел.
Эти данные можно объединить в одну группу и считать записью. Запись в целом и ее отдельные элементы обозначаются именами. Введем следующие обозначения: В - имя всей записи; N - порядковый номер;
ФИО - фамилия,имя,отчество;ОЦЕНКА - оценки.
Обращение к элементу записи в программе выполняется с помощью уточненного имени . Уточненное имя содержит имя записи и имя элемента и записывается в следующем виде:
ИМЯ ЗАПИСИ.ИМЯ ЭЛЕМЕНТА;
Пример,
B.N;
B.ФИО;
B.ОЦЕНКА;
Запись можно описать тремя способамими:
- В разделе описания переменных:
var <имя записи> : record <имя элемента1>:<тип элемента1>; <имя элемента2>:<тип элемента2>; ............................................................... <имя элемента n>:<тип элемента n>;
- В разделе описания типов:
type <имя типа>=record <имя элемента1>:<тип элемента1>; <имя элемента2>:<тип элемента2>; ................................................................ <имя элемента n>:<тип элемента n>; end; var <имя записи>:<имя типа>;
- В разделе описания констант, если первоначальное значение записи - константа.
Пример:
type B=record x,y,z:integer; end; const ved:B=(x:5,y:4,z:6);
где x,y,z - элементы;
5,4,6 - их значения.
Правила работы с записями:
- С компонентами записи можно обращаться как с компонентами соответствующего типа.
- Элемент записи можно указывать как в левой части оператора присваивания, так и в правой.
- Обращение к элементам записи осуществляется с помощью указания имени поля через точку.
- Обращение к записи в целом возможно только в операторе присваивания и только если в левой и в правой части будут стоять одинаковые записи.
Например:
VED:=VED1 + VED2 ; {Запись 1 (10 полей) + Запись 2
(10 полей) результат Запись 3 (20 полей). }
- Отметим, что обращение к элементам записи происходит с помощью уточненного имени. Оператор присоединения позволяет упростить обращение к элементу записи. Имя записи выносится в заголовок оператора присоединения , а в блоке используются только имена элементов записи.
Общая форма оператора присоединения:
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.