Сделай Сам Свою Работу на 5

Синтаксис и значение выражений перечислимого типа.





Порядковые типы данных

 

D Pascal существенно расширяет CF Pascal добавлением новых типов данных к символам и файлам. Порядковые типы данных описывают простые, неделимые объекты. Перечислимый тип содержит фиксированный набор именованных объектов. Логический тип имеет только два объекта – TRUE и FALSE. Целый тип реализует положительные и отрицательные целые числа. Наконец, часть типа также в свою очередь может быть типом, типом диапазон. Конечно, типы включают операции, которые определяют, что может быть сделано с объектами. Для логического, целого и т.д. эти операции хорошо понятны интуитивно.

 

Типы данных описывают множества значений и операции, которые могут быть применены к ним. Типы данных введенные CF Pascal это CHAR и TEXT. Значениями типа CHAR являются множество допустимых символов Паскаль-машины и операциями над этими значениями являются операторы сравнения:

= < > <= >= <>

значениями которых являются соответствующие математические операции, отражающие различное положение символов в алфавитной последовательности. Значения типа данных TEXT – последовательности строк, каждая строка является последовательностью символов. Операции над такими данными:



RESET REWRITE READ WRITE WRITELN OEF EOLN

Типы данных предлагают преимущества абстрагирования, репликации и аутентификации.

Типы данных абстрагируют важные свойства данных. Например, для понимания сравнения

‘A’ < ‘B’

нет необходимости знать, как эти символы представлены в Паскаль-машине. Последовательность сортировки определяет значение этих операций. Пользователю нет необходимости знать количество битов, которыми представлено символьное значение, что происходит с избыточными битами, действительно ли битовое значение для символа B больше чем для A и т.д.

Модули реализуют разновидность абстракции данных, но типы данных предлагают нечто большее. Объявление переменных типа данных позволяет хранить и манипулировать любым количеством значений типа через эти переменные. Каждое использование переменной в программе дает нам гарантию, что к ней будут применены только допустимые операции.

Контекст операнда в программе подразумевает тип операнда, этот подразумеваемый тип – избыточная информация, которая может быть проверена на соответствие объявленному типу операнда для предотвращения операций над значениями неверного типа. Рассмотрим следующий фрагмент программы:



 

PROGRAM Typex(INPUT, OUTPUT);

VAR

Ch: CHAR;

F: TEXT;

BEGIN {Typex}

...

IF Ch = F

THEN

...

END. {Typex}

 

Поскольку операция = определена в CF Pascal только для символьных операндов, появление Ch и F в качестве операндов подразумевает, что оба они типа CHAR. У Ch тип корректен, а F объявлена как TEXT, поэтому будет выявлено несоответствие.

 

В D Pascal существует две разновидности типов данных: простые типы данных и составные (aggregate) типы данных. Значения простых типов не могут состоять из более мелких частей, с которыми можно работать по отдельности. CHAR – простой тип. Значения сложных типов данных образованы объединением значений простых типов. TEXT – составной тип, потому что строки фалов состоят из символов.

Значения простых типов упорядочены, то есть для каждой пары значений этого типа x, y возможен только один из вариантов: x < y, x = y, x > y. Поэтому эти типы называются порядковыми.

Паскаль содержит три предопределенных порядковых типа, которые задаются идентификаторами CHAR, INTEGER и BOOLEAN. Дополнительно к предопределенным порядковым типам, в Паскале предусмотрено два метода для программиста для определения новых порядковых типов, а именно:

 

  1. Перечислимые типы, значениями которых являются уникальные идентификаторы.
  2. Типы диапазон, значениями которых являются последовательные значения другого порядкового типа.

 

То есть новый порядковые типы данных могут быть определены перечислением констант типа или указанием, что значения типа являются поддиапазоном значений существующего типа. Синтаксис для обозначения таких порядковых типов следующий:



 

<обозначение типа> ::= <идентификатор типа> | <новый тип>

<идентификатор типа> ::= <идентификатор>

<новый тип> ::= <перечислимый тип> | <тип диапазон>

 

Способы описания для <перечислимый тип> и <тип диапазон> будут даны в соответствующих разделах ниже.

 

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

 

<блок> ::= <раздел объявлений типов> <раздел объявлений переменных>

<раздел объявлений процедур> <раздел операторов>

 

<раздел объявлений типов> ::= TYPE <объявления типов> |

 

Это правило показывает что <раздел объявлений типов> может быть пустым (как это было во всех программах до данного места)

 

<объявления типов> ::= <объявления типов> <объявление типа> | <объявление типа>

<объявление типа> ::=<идентификатор > = <обозначение типа>

 

Контекстное правило, которое сопровождает эти синтаксические правила, говорит о том, что только некоторые идентификаторы являются <объявлением типа>:

 

CR Чтобы быть использованным как <идентификатор типа>, <идентификатор> должен ранее появиться в <объявлениях типов>.

 

Таким образом для

TYPE

T1 = CHAR;

T2 = T1;

 

и T1 и T2 являются идентификаторами типа и могут быть использованы в текущем блоке для объявления переменных и формальных параметров, как ранее использовался CHAR.

 

Перечислимые типы

 

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

 

Любой список идентификаторов Паскаля может быть описан как тип данных с одним ограничением, что в данной области видимости каждый идентификатор появится не чаще одного раза. Например, объявления:

TYPE

DayOfWeek = (Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday, Sunday);

VAR

Day : DayOfWeek;

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

Monday < Tuesday < ... < Sunday

Таким образом, есть возможность записывать операторы следующим образом:

IF Day < Saturday

THEN {не weekend}

...

В объявлении:

TYPE

DayOfWeek = (Sunday, Monday, Tuesday, Wednesday, Thursday,

Friday, Saturday);

WeekEndDay = (Saturday, Sunday); {недопустимо}

VAR

Friday : CHAR; {недопустимо}

идентификаторы типа WeekEndDay и переменная Friday являются недопустимыми дубликатами идентификаторов Friday, Saturday и Sunday, которые ранее появились в объявлении типа DayOfWeek. То есть идентификаторы должны быть уникальными для всех их возможных вариантов использования в качестве имен типов, переменных, процедур, или констант в перечислимом типе.

Перечислимые типы являются “суперсимволами” Паскаля. Они могут быть использованы также как и обычные символы Паскаля и к ним применимы те же операции, но программист может изобрести любое их количество, желательно, чтобы идентификаторы соответствовали значению. Ранее мы использовали для таких целей символьные константы, но перечислимые типы лучше. Например, вместо возвращения значений Y или N для обозначения успеха, может быть использован перечислимый тип с идентификаторами Yes и No или даже Success и Failure.

Поскольку буквы алфавита идентификаторы, они могут быть использованы для задания типа данных:

 

TYPE

Alphabet = (A, B, C, D, E, F, G, H, I, J, K, L, M,

N, O, P, Q, R, S, T, U, V, W, X, Y, Z);

VAR

Letter: Alphabet;

Что позволяет следующие выражения:

IF Letter = A

THEN

Letter := E;

но при этом недопустимо:

IF Letter = ‘A’

THEN

Letter := ‘E’;

Поскольку A и E – константы типа Alphabet и соответствуют типу Letter, но ‘A’ и ‘E’ типа CHAR и это другой тип, чем у Letter.

 

Во многих задачах порядок, определенный перечислимым типом может быть полезен. Например, при работе с датами, важен порядок месяцев в календарном году. Поскольку трехсимвольные сокращения названий месяцев (Jan, Feb и т.д.) легко распознаются и компьютером и людьми, эти сокращения используются как строки, имеющие следующий лексикографический порядок.

Apr, Aug, Dec, Feb, Jan, Jul, Jun, Mar, May, Nov, Oct, Sep

который бесполезен в календарном смысле. Однако следующий перечислимы тип:

TYPE

Month = (Jan, Feb, Mar, Apr, May, Jun,

Jul, Aug, Sep, Oct, Nov, Dec);

Предоставляет автоматически способ сравнения значений переменных в соотвествии с календарем, если они заданы типом Month.

 

Синтаксис и значение выражений перечислимого типа.

 

Правила BNF для перечислимых типов ограничивает возможность объявления констант типа до идентификаторов.

<перечислимый тип> ::= (<список идентификаторов>)

<список идентификаторов> ::= <список идентификаторов>, <идентификатор>

| <идентификатор>

Контекстное правило:

<идентификаторы> <перечислимого типа> не могут дублировать другие идентификаторы в данной области видимости.

Данный идентификатор может быть частью только одного перечислимого типа в пределах области видимости. Это позволяют определение типа идентификатора и исключает конфликты значений такие как в случае с выше приведенным примером DayOfWeek и WeekEndDay, где порядок Saturday и Sunday был разный в разных типах.

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

Например, для любого состояния s,

A < B(s) = TRUE, если и только если A(s) появляется до B(s) в объявлении типа, которому принадлежат A и B.

Ситуация аналогична для других операторов сравнения.

 

 








Не нашли, что искали? Воспользуйтесь поиском по сайту:



©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.