Тип записи

Во многих экономических и информационных задачах обрабатываются ведомости, документы, списки. При этом появляется необходимость объединять данные различного типа в одну группу. Для работы с группой данных в языке 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Иванов И.И.44311500.2549.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.