Pascal. Записи. Записи с вариантами

Записи. Записи с вариантами. Оператор присоединения with


Содержание





1. Какие преимущества дает использование записей в языке Паскаль?

Записи позволяют группировать данные различных типов по некоторым признакам. Полями (элементами) записи могут быть переменные разных типов.

Например:

  • запись, которая содержит информацию о координатах точки на плоскости (x; y);
  • запись, которая содержит информацию о фамилии, имени и отчестве работника;
  • запись, которая содержит информацию о книге в библиотеке: фамилия читателя, имя читателя, адрес читателя.

Использование записей есть удобным в случае, когда нужно сохранять и обрабатывать массивы переменных разных типов.

 


2. Какие типы переменных можно использовать в записях?

В записях переменные могут иметь разные типы данных. Это могут быть и стандартные типы данных и типы данных пользователя. Этим запись существенно отличается от массива.

  


3. Какой общий вид описания записи?

В программе запись можно описывать двумя способами:

  • с использованием описания типа записи в разделе type;
  • с использованием описания переменной типа «запись» в разделе описания var.

Способ 1. Описание записи с использованием раздела описания типов type. В результате будет получен собственный тип, который есть записью. С помощью этого способа можно передавать переменные, которые являются записями, в процедуры или функции как параметры.

type
  <Название_типа_записи> = record
    <поле1:тип>
    <поле2:тип>
    ...
    <полеN:тип>
  end;

где

    • Название_типа записи – название типа, который присваивается переменным этой записи;
  • поле1, поле2, полеN – названия переменных, которые есть полями записи;
  • тип – название некоторого типа из допустимых типов программы (integer, real, string …).

После такого описания, в разделе var можно описывать переменную этого типа:

var
  <Имя_переменной>:<Название_типа_записи>;

Способ 2. Описание записи непосредственно в разделе описания переменных var.

var
  <Имя_переменной>: record
    <поле1:тип>
    <поле2:тип>
    ...
    <полеN:тип>
  end;

 


4. Пример описания и использования записи, которая описывает координаты точки на плоскости (x; y).

Способ 1. С использованием раздела описания типов type.

type
  // описание записи типа TPoint
  TPoint = record
    x:real; // координата x
    y:real; // координата y
  end;

var
  P:TPoint; // переменная с именем P типа TPoint, выделяется память

Чтобы записать значения координат в переменную P, нужно написать следующий текст:

...

begin

  ...

  P.x := 12.5;
  P.y := -8.3;

  ...

end;

...

Способ 2. Непосредственно в разделе описания переменных var.

var
  P2:record // переменная, есть записью с двумя полями x и y
    x:real;
    y:real;
  end;

Доступ к полям переменной P2:

...

begin

  ...

  P2.x := -9.25;
  P2.y := 18;

  ...

end;

...

 


5. Пример описания и использования записи типа TBOOK (КНИГА).

Пример описания записи типа TBOOK (КНИГА), которая содержит следующие поля:

  • название книги;
  • фамилия автора книги;
  • год издания книги;
  • стоимость книги.
type
  TBOOK = record
    Title:string;
    Author:string;
    Year:integer;
    Price:real;
  end;

var
  B:TBOOK;

...

begin

  ...

  B.Title := 'Java 8';
  B.Author := 'Herbert Schildt';
  B.Year := 2015;
  B.Price := 0.00;

  ...

end;

 


6. Как осуществляется присвоение одной записи другой?

Чтобы осуществить присвоение значений полей одной записи другой, необходимо чтобы обе записи были одного типа. Этот тип должен быть описан в разделе type.

В приведенном примере осуществляется присвоение значения переменной M1 в переменную M2. Обе переменные есть записями типа TMonth.

type
  // Описание записи, которая описывает месяц года
  TMonth = record
    num:1..12;       // номер месяца в году (1-январь, 2-февраль, ...)
    name:string[20]; // название месяца
    quarter:1..4;   // номер квартала, к которому относится месяц
  end;

var

  M1,M2:TMonth;

  M3:record
    num:1..12;  // номер месяца в году (1-январь, 2-февраль, ...)
    name:string[20]; // название месяца
    quarter:1..4;   // номер квартала, к которому относится месяц
  end;

begin

  ...

  M1.num := 2;
  M1.name := 'Февраль';
  M1.quarter := 1;

  // присвоение значения одной переменной другой, переменные есть записями
  M2:=M1;

  // Ошибка - "Incompatible types: 'Record' and 'TMonth'
  // M3:=M1;

  ...

end;

 


7. Пример описания и использования одномерного массива записей типа TBOOK (КНИГА).
...

type
  TBOOK = record
    Title:string;
    Author:string;
    Year:integer;
    Price:real;
  end;

var
  Books:array[1..20] of TBOOK;

begin

  ...
 
  Books[3].Title := 'C# 4.0';
  Books[3].Author := 'Herbert Schildt';
  Books[3].Year := 2011;
  Books[3].Price := 0.99;

  ...

end;

 


8. Пример описания и использования вложенных записей.

В приведенном примере описываются две записи типов TName и TBOOK. В записи типа TBOOK описана переменная типа TName.

type
  TName = record
    Name:string[20];
    Surname:string[20];
  end;

  TBOOK = record
    Title:string;
    Author:TName; // вложенная запись
    Year:integer;
    Price:real;
  end;

var
  B:TBOOK;

begin

  B.Title := 'C# 4.0';
  B.Author.Name := 'Herbert';
  B.Author.Surname := 'Schildt';
  B.Year := 2011;
  B.Price := 0.99;

end;

 


9. Какие преимущества дает использование оператора With в записях?

Оператор with позволяет сократить длинные обозначения элементов записей. Оператор with также улучшает читабельность и сокращает время набора текста программы, в которой происходит частое обращение к полям записей. Кроме того, оператор with уменьшает время выполнения программы, так как ссылка на запись осуществляется только один раз.

Оператор with открывает область действия, которое содержит имена полей переменной типа запись.



Общая форма записи оператора with:

with <имя_переменной_типа_record> do
  оператор;

Оператор with может быть составным:

with <имя_переменной_типа_record> do
begin
  оператор1;
  оператор2;
  ...
  операторN;
end;

 


10. Пример использования оператора присоединения With.
type
  TName = record
    Name:string[20];
    Surname:string[20];
  end;

  TBOOK = record
    Title:string;
    Author:TName; // вложенная запись
    Year:integer;
    Price:real;
  end;

var
  B:TBOOK;

begin

  with B do
  begin
    Title := 'C# 4.0';

    with Author do
    begin
      Author.Name := 'Herbert';
      Author.Surname := 'Schildt';
    end;

    Year := 2011;
    Price := 0.99;
  end;

end;

 


11. Какие преимущества дает использование записей с вариантами.

В записях можно задавать тип, который содержит определения нескольких вариантов структуры. Запись может содержать только одну вариантную часть.

Записи с вариантами – это переменная, которая может содержать (в разные моменты времени) объекты различных типов и размеров. Все требования относительно размеров и выравнивания переменных в памяти берет на себя компилятор. Записи с вариантами позволяют сохранять разнородные данные в одной области памяти.

Использование вариантных частей приводит к минимизации затрат памяти. Это есть эффективным, когда в программе используются массивы записей, которые содержат много полей.

 


12. Пример использования записи с вариантами.

В данном примере приводится описание и использование записи с вариантами, которая описывает принадлежность сотрудника учебного заведения к той или иной категории сотрудников.

В зависимости от категории, для работника формируются соответствующие поля в записи. Категория сотрудника сохраняется в переменной f_worker.

Запись с вариантами содержит часть case … of. Компилятор интерпретирует поля записи в зависимости от значения переменной f_worker.

type
  TName = record
    Name:string[20];
    Surname:string[20];
  end;

  // Запись с вариантами, которая описывает сотрудника учебного заведения
  TWorker = record
    name:TName; // Имя сотрудника
    birth:string[10]; // Дата рождения

    // Сотрудник может принадлежать к одной из трех категорий
    case f_worker:1..3 of
      1: // если администрация
        (post_adm:string[100]; // должность
         rate:real;   // ставка: 0.5, 0.75, 1.0
         salary:real); // размер оклада 

      2: // если препод
        (hours:integer;   // педнагрузка, часы
         fee: real);      // часовая оплата

      3: // если вспомогательный персонал
        (post_pers:string[100]; // название должности
         rank:integer;     // тарифный разряд
         tariff:real);     // тарифная ставка
  end;

begin

  W1.name.Name := 'Ivan';
  W1.name.Surname := 'Kornilenko';
  W1.birth := '19.02.1988';

  // Если сотрудник - администрация, то
  W1.f_worker := 1; // администрация
  W1.post_adm := 'Director';
  W1.rate := 0.75;
  W1.salary := 18800.50;

  // Если сотрудник - преподаватель, то
  W1.f_worker := 2;
  W1.hours := 72;
  W1.fee := 230.55;

  // Если сотрудник - персонал, то
  W1.f_worker := 3;
  W1.post_pers := 'Водитель';
  W1.rank := 3;
  W1.tariff := 14390.35;

end;