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:тип>
    ...
    <поле1:тип>
  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
  Books:array[1..20] of TBOOK;
  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
      Name := 'Herbert';
      Surname := 'Schildt';
    end;

    Year := 2011;
    Price := 0.99;

  end;

end;


11. Які переваги дає використання записів з варіантами.

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

Запис з варіантами – це змінна, яка може містити (в різні моменти часу) об’єкти різних типів і розмірів. Усі вимоги відносно розмірів і вирівнювання виконує компілятор. Записи з варіантами дозволяють зберігати різнорідні дані в одній області пам’яті.

Запис може містити тільки одну варіантну частину.

Використання варіантних частин приводить до мінімізації витрат пам’яті. Це є особливо ефективним, коли в програмі використовуються масиви записів, що містять багато полів.


12. Приклад опису та використання запису з варіантами.

У даному прикладі наведено опис та використання запису з варіантами, який описує належність працівника навчального закладу до тієї чи іншої категорії працівників.
В залежності від категорії, для працівника формуються відповідні поля в записі. Категорія працівника зберігається в змінній 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;

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