Опубликован: 01.11.2004 | Уровень: для всех | Доступ: свободно | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 9:

Структурированные типы данных языка Object Pascal

< Лекция 8 || Лекция 9: 123 || Лекция 10 >

Записи

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

Запись может иметь поля двух видов:

  • фиксированные поля, которые всегда присутствуют в создаваемом экземпляре записи;
  • вариантные поля (располагаются только после фиксированных полей), для которых память при создании экземпляра записи выделяется только под одно самое наибольшее поле из варианта.

Объявление типа записи завершается ключевым словом end;.

Например:

type            
  MyDateRec = record
    Year: Integer;            
    Month: 1..12;   
    Day: 1..31; 
   end;                 
var 
   {Объявление переменных}
   Record1, Record2: MyDateRec;
begin
{Доступ к полям записи: }
  Record1.Month := 11;
  Record1.Day := 22;
 {Доступ к полям записи:}
  with Record1 do           
     begin
      Year := 2004;
      Month := 11;
      Day := 22;
      end;
  {Копирование значений полей
   записей одного типа }
    Record2:= Record1;

Переменная типа записи может быть объявлена одновременно с определением полей записи.

Например:

var 
   S: record                  
  Name: string;                
  Age: Integer;
end;

Запись, состоящая из одних вариантных полей, реализует тип, в некотором роде аналогичный типу union для языка С++.

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

Объявление записи имеет следующее формальное описание:

type имя_типа_записи = record
  список_полей: тип; {фиксированные поля}
  ...
case тег: тип_варианта
    of {вариантные поля}
  константа_или_список: (вариант_1);
  ...
  константа_или_список: (вариант_n);
end;

Описание каждого фиксированного поля состоит из его идентификатора (или списка идентификаторов) и типа. Описания полей разделяются точкой с запятой. Вариантная часть объявления записи начинается с зарезервированного слова case.

При определении вариантной части тег и символ двоеточия могут быть опущены в том случае, если тип_варианта описывает существующий тип или каждая константа ( константа_или_список ) в вариантной части является значением типа тип_варианта.

Тип варианта не может быть длинной строкой, динамическим массивом, типом Variant или интерфейсом, но он может быть указателем на эти типы.

Например:

type                  
  TPerson = record
  FirstName, LastName: string[40];
  case bl: Boolean
      of {Вариантные поля}
    True: (str1: string[40]);
    False: (str2: string[20];
            date1: TDate);
end;
  TShapeList = (Rectangle, Circle,
     Other, Ellipse);
  TFigure = record
    case TShapeList of
      Rectangle: (Height, Width: Real);
      Circle: (Radius: Real);
      Ellipse, Other: ();
end;

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

Файлы

Файл представляет собой упорядоченный набор элементов одного типа.

Стандартные процедуры ввода и вывода используют предопределенный тип TextFile, или Text, который реализует файл как упорядоченный набор строк символов.

Объявление типа файл и создание переменных файлового типа имеет следующее формальное описание:

type тип_файла = file of тип; 
var идентификатор: file of тип_файла;

Тип, указываемый после ключевых слов file of, может быть производным типом или базовым типом. Так, в качестве типа можно указать string[число_символов] или array[нач_инд..кон_инд] of Char.

Объявление нетипизированного файла имеет следующее формальное описание:

var идентификатор: file;

Для создания переменной файлового типа следует предварительно объявить файловый тип, а затем объявить переменную созданного типа, или сразу объявить переменную, указав используемый тип как файловый.

Например:

type
  Phone = record  Name: string[30];
  PhoneNumber: string[20];
  end;
  {Объявление файлового типа }
  PhoneList = file of Phone;
var
  {Объявление переменной файлового типа}
  book1: PhoneList;
  {Объявление переменной с указанием типа
   как файлового типа}
  book2: file of Phone;
< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Александр Демьяненко
Александр Демьяненко

Можно ли сдавать один и тот же тест несколько раз?
Или же один и тот же тест можно сдать лишь однажды?

Максим Стогний
Максим Стогний

Добрый день!

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

тип_метода (имя_класса::*имя_метода_указателя)
    (список параметров);
тип_функции (*имя_ функции_указателя)
    (список параметров);

при этом можно было  тип_функции во втором описании заменить на тип_метода? Т.е.:

тип_метода (*имя_ метода_указателя)
    (список параметров);