Тип записи

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

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

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

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Иванов И.И.44311500.2549.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.