Шаг 40.
Структурированные типы. Тип "запись". Вариантные записи

    На этом шаге мы рассмотрим записи с вариантами.

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

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

    Если тип TStudentCard расширить оценками за второй семестр, то в форме вариантной записи он примет такой вид:

type
  TMarksSem1 = record
  MathAnall : Byte; { Мат. анализ }
  LinAl     : Byte; { Лин. алгебра }
  Prog1    : Byte;{ Программирование }
  Phys     : Byte; { Физика }
end; 
TMarksSem2 = record
  MathAnal2 : Byte; { Мат. анализ }
  Electron  : Byte; { Электроника }
  Prog2     : Byte; { Программирование }
  DigAutom  : Byte; { Теория циф. автоматов }
end; 
TStudentCard = record
{ Фиксированная часть записи }
  SurName  : String20; { Фамилия }
  Name       : String20; { Имя }
  FatherName : String20; { Отчество }
  Year     : Integer; { Год рождения }
  HomeAddress: String; { Домашний адрес }
  GroupCode  : String7; { Шифр группы }
{ Вариантная часть записи } 
  case Semestr : Byte of
    1: ( MarksSem1 : TMarksSem1 ) { Оценки за первый  семестр }
    2: ( MarksSem2: TMarksSem2 )  { Оценки за второй  семестр }
end;


    Замечание. Вариантные записи включают две части: первая часть обычная фиксированная запись; вторая часть - вариантная, состоящая из поля признака и одного или нескольких вариантных компонентов. Вариантные компоненты включаются в конкретный элемент типа "запись" по альтернативному принципу, в зависимости от значения поля признака.

    В типе TVarStudentCard поле Semestr является полем признака, поля MarksSem1 и MarksSem2 - альтернативными вариантами данной записи.

    Если объявить, как показано выше переменные Group_KB51 и Group_KB52, то заполнение информацией за первый семестр экземпляра карточки одного студента, имеющей порядковый номер 3, может иметь, например, такой вид:

with Group_KB51[3]   do
begin
  { Заполнение фиксированной части записи   }
  SurName := 'Иванов';
  Name := 'Иван';
  FatherName := 'Иванович';
  Year := 1978;
  HomeAddress := 'г. Курган, ул. Иванова, д.12, кв.63'
  GroupCode := 'КВ-511';
 { Заполнение вариантной части записи   }
  Semestr := 1;   {   Установка признака первого семестра   } 
  with MarksSem1  do  
  {   Оценки  за  первый семестр   } 
  begin
    MathAnal1 := 5;
    LinAl := 4;
    Prog1 := 5;
    Phys := 3;
  end; 
end;

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

    Например, в рассмотренном примере оба альтернативных варианта записи для предмета "Мат.анализ" не могут содержать одинаковый идентификатор MathAnal, а для предмета "Программирование" - одинаковый идентификатор Prog.

    На следующем шаге мы рассмотрим тип "файл".




Предыдущий шаг Содержание Следующий шаг