Понедельник, 29 Апреля 2024, 03.26.13
Приветствую Вас Гость

Всё о Паскале

Меню сайта
реклама
Наш опрос
Каким языком программирования вы владеете ?
Всего ответов: 571
Целый тип Логический Символьный Тип-диапазон Перечисляемый Массивы Записи

Записи

Запись — это структура данных, состоящая из фиксированного числа компонентов, называемых полями записи. В отличие от массива, компоненты (поля) записи могут быть различного типа. Чтобы можно было ссылаться на тот или иной компонент записи, поля именуются.
Структура объявления типа записи такова:
<имя типа> = RECORD <сп.полей> END

Здесь:
      <имя типа> — правильный идентификатор;
      RECORD, END — зарезервированные слова (запись, конец);
      <сп.полей> — список полей; представляет собой последовательность разделов записи, между которыми ставится точка с запятой.

Каждый раздел записи состоит из одного или нескольких идентификаторов полей, отделяемых друг от друга запятыми. За идентификатором (идентификаторами) ставится двоеточие и описание типа поля (полей), например:
  type
      BirthDay = record
      day,month : Byte;
      year : Word
      end;
  var
      a,b : Birthday;

В этом примере тип BIRTHDAY (день рождения) есть запись с полями DAY, MONTH и YEAR (день, месяц и год); переменные А Й В содержат записи типа BIRTHDAY.

Как и в массиве, значения переменных типа записи можно присваивать другим переменным того же типа, например
      а := b;

К каждому из компонентов записи можно получить доступ, если использовать составное имя, т. е. указать имя переменной, затем точку и имя поля:
      a.day := 27;
      b.year := 1939;

Для вложенных полей приходится продолжать уточнения:
  type
      BirthDay = record
      day,month: Byte;
      year : Word
      end;
  var
      с : record
      name : String;
      bd : BirthDay
      end;
  begin
      if c.bd.year = 1939 then ...
  end.

Чтобы упростить доступ к полям записи, используется оператор присоединения WITH:
WITH <переменная> DO <оператор>
Здесь:
      WITH, DO — ключевые слова (с, делать);
      <переменная> — имя переменной типа "запись", за которым, возможно, следует список вложенных полей;
      <оператор> — любой оператор Турбо Паскаля.

Например:
      with c.bd do month := 9;
Это эквивалентно
      with с do with bd do month := 9;
ИЛИ
      with c,bd do month := 9;
ИЛИ
      c.bd.month := 9;

Турбо Паскаль разрешает использовать записи с так называемыми вариантными полями, например:
  type
      Forma = record
      Name: String;
      case Byte of
        0: (BirthPlace: String [40]);
        1: (Country : String [20];
        EntryPort : String [20];
        EntryDate : 1..31;
        ExitDate : 1..31)
  end;
В этом примере тип FORMA определяет запись с одним фиксированным полем NAME и вариантной частью, которая задается предложением CASE ... OF. Вариантная часть состоит из нескольких вариантов (в нашем примере — из двух вариантов: 0 и 1). Каждый вариант определяется константой выбора, за которой следует двоеточие и список полей, заключенный в круглые скобки. В любой записи может быть только одна вариантная часть, и, если она есть, она должна располагаться за всеми фиксированными полями.

Замечательной особенностью вариантной части является то обстоятельство, что все заданные в ней варианты "накладываются" друг на друга, т. е. каждому из них выделяется одна и та же область памяти. Это открывает дополнительные возможности преобразования типов, например:
  var х
      mem4 : record
      case Byte of
        0 : (by : array [0..3] of Byte);
        1 : (wo : array [0..1] of Word);
        2 : (lo : longint);
  end;
В этом примере запись МЕМ4 имеет три варианта, каждый из которых занимает в памяти один и тот же участок из 4 байтов. В зависимости от того, к какому полю записи мы обращаемся в программе, этот участок может рассматриваться как массив из 4 байтов (поле BY), массив из двух целых типа WORD (поле wo) или, наконец, как одно целое число типа LONGINT (поле LO). Например, этой записи можно сначала присвоить значение как длинному целому, а затем проанализировать результат по байтам или словам:   var
      х : Word;
      xb: Byte;
      xl: Longint;
  begin
      .....
      with m do
        begin
          lo := trunc(2*pi*x);
          if wo[l] = 0 then
        if by[l] = 0 then
          xb := x[0]
        else
          x := wo[0]
        else
        xl := lo
      end;
      .....
  end.
Предложение CASE . . . OF, открывающее вариантную часть, внешне похоже на соответствующий оператор выбора, но на самом деле лишь играет роль своеобразного служебного слова, обозначающего начало вариантной части. Именно поэтому в конце вариантной части не следует ставить END как пару к CASE . . OF. (Поскольку вариантная часть — всегда последняя в записи, за ней все же стоит END, но лишь как пара к RECORD). Ключ выбора в предложении CASE . . . OF фактически игнорируется компилятором. Единственное требование, предъявляемое к нему Турбо Паскалем, состоит в том, чтобы ключ определял некоторый стандартный или предварительно объявленный порядковый тип. Причем сам этот тип никак не влияет ни на количество следующих ниже вариантных полей, ни даже на характер констант выбора. В стандартном Паскале в качестве ключа выбора необходимо указывать нeкоторую переменную порядкового типа, причем в исполняемой части программы можно присваивать значение этой переменной и таким образом влиять на выбор полей. В Турбо Паскале также можно в поле ключа выбора указывать переменную порядкового типа и даже присваивать ей в программе значение, что однако не влияет на выбор поля: значения констант выбора в Турбо Паскале могут быть произвольными, в том числе повторяющимися, например:

  type
      reel = record
        а : Byte;
        b : Word;
      end;
      rec2 = record
        с : longint;
        case x : Byte of
        1 : (d : Word);
        2 : (e : record
          case Boolean of
          3 : (f : reel);
          3 : (g : Single);
          '3' : (c : Word)
        end)
      end;
      var
        r : rec2;
      begin
        r.x := 255;
        if r.e.g = 0 then
          WriteLn('O.K.')
        else
          WriteLn(r.e.g)
  end.

В этом примере предложение
      case Boolean of
в записи, определяемой в поле Е, объявляет ключом выбора логический тип, который, как известно, имеет лишь два значения — TRUE и FALSE. Константы же выбора следующих далее вариантов не толвко содержат совершенно не свойственные этому типу значения, но и две из них повторяются, а общее количество вариантов — три, а не два, как следовало бы ожидать.

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

Форма входа
Календарь новостей
«  Апрель 2024  »
ПнВтСрЧтПтСбВс
1234567
891011121314
15161718192021
22232425262728
2930
Поиск
Друзья сайта
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0