#19 Записи в Паскале (Record): Оператор присоединения with do

Что такое записи

Запись - специальная структура данных в Паскале, которая представляет собой фиксированный набор полей с указанными типами.

Если переменную указанного типа можно сравнить с коробкой специальной формы/размера, то запись можно сравнить с пеналом (напр. школьным) - т.е. специальным хранилищем, в котором есть отделения под конечный набор хранимых предметов (причем предметы эти могут быть в т.ч. разного типа).

Объявление записей, составное имя

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

Как уже более-менее опытные программисты, давайте сразу перейдем к примеру:

type
// объявим свой тип "TPhoneItem", котроый является записью
  TPhoneItem = Record // Начало объявления типа TPhoneItem
    Name: string[20];
    Tel: string[10];
  end; // конец объявления типа записи

var
  // объявим одну переменную нашего типа TPhoneItem
  student1: TPhoneItem;
begin

  // заполним ее поля данными
  student1.Name := 'Ivan';
  student1.Tel := '+79456754';

  // распечааем содержимое полей
  writeln(student1.Name, ' ', student1.Tel);
end.  

-- а данном случае в нашей записи мы объявили два поля, как строковые переменные с фиксированной длиной (можно было бы использовать и обычный тип string)

Обратите внимание как мы обращаемся в этом же примере к полям записи - мы используем сначала имя записи, а потом имя поля, например:

student1.Name

-- такое имя называется составным.

Оператор Присоединения with ... do - упрощение синтаксиса работы с записью

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

type
  TPhoneItem = Record
    Name: string[20];
    Tel: string[10];
  end;
var
  student1: TPhoneItem;
begin

  with student1 do begin // работаем с student1
    Name := 'Ivan';
    Tel := '+79456754';
  end;

  writeln(student1.Name, ' ', student1.Tel);
end. 

Или даже так:

type
  TPhoneItem = Record
    Name: string[20];
    Tel: string[10];
  end;
var
  student1: TPhoneItem;
begin

  with student1 do begin // работаем с student1
    Name := 'Ivan';
    Tel := '+79456754';
    writeln(Name, ' ', Tel);
  end;
end.  

Задачи для самостоятельного решения

  1. Получите случайный набор из 5 чисел, величиной от 1 до 50.
    Рассчитайте для каждого числа два его наибольших делителя, число и два делителя храните как запись, а для всего набора используйте массив записей.
    Используйте в коде do with

    Выведите на экран результаты расчетов для каждого из исходных значений

Что еще почитать

Key Words for FKN + antitotal forum (CS VSU):