Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

for LETTER in VOWELS' ( 'A') .. VOWELS' ( 'O') loop

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

Типы BOOLEAN и CHARACTER языка Ada фактически являются встроенными перечислимыми типами. Обычными операциями с перечислимыми типами являются оп­ределение предшествующего и последующего элементов, позиции в списке величин и значения данной позиции. В Pascal эти операции предоставляются встроенны­ми функциями. Например, значение функции Pred (blue) равно red. В Ada эти операции являются атрибутами. Например, значение LETTERS'PRED ('В') равно 'А'.

Перечислимые типы способствуют повышению читабельности и надежности про­грамм. Читабельность улучшается непосредственно: именованные значения легко разли­чаются, тогда как закодированные – нет. Закодированные элементы бессмысленны для всех, кроме автора программы. Предположим, что программе на языке FORTRAN потребуется переменная, принимающая значения десяти различных цветов. Скорее всего, названия цветов будут закодированы в виде целых чисел 1, 2,..., 10. Использованные для коди­ровки целочисленные значения малоосмысленны. Если, например, константа 4 обозначает голубой цвет, и это значение присваивается переменной, то этот факт будет далеко не очевидным чита­телю программы.

С точки зрения надежности перечислимые типы предоставляют два преимущества. Во-первых, если целая переменная используется программистом для кодирования, тре­бующего небольшого диапазона целых значений, то может появиться ошибка выхода из диапазона, которая не будет обнаружена системой поддержки исполнения программ. Во-вторых, допускается применение любого арифметического оператора к закодированным дням и любым це­лым числам, поскольку типы этих величин будут совпадать. Это исключает обнаружение компилятором многих логических ошибок и опечаток, связанных с закодированными данными. Поскольку в языках ANSI C и C++ перечислимые переменные рассматрива­ются как целые, то ни одного из этих преимуществ данные языки не имеют.

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

В силу указанных недостатков типы enum (перечислимые типы) языков C и C++ не включены в язык Java. Они имеются в C#, но подчиняются более строгим правилам. Для использования числовых значений членов перечисления в C# необхо­димо явно приводить их к соответствующему целочисленному типу, например:

public enum Numbers

{

zero, one, two

}

…………………………………………..

MessageBox.Show (((int) Numbers.two * 2).ToString());

 

4.4.2. Ограниченные типы

 

Ограниченным типом называется непрерывная подпоследователь­ность порядкового типа. Например, тип 12..14 является ограниченным целым типом. Впервые ограниченные типы появились в языке Pascal, также они имеются в языках Modula-2 и Ada.

В языке Pascal объявление ограниченного типа выглядит следующим образом:

Type

TUpperCase = 'A'..'Z'; TIndex = 1..100;

Связь ограниченного типа с его родительским типом устанавливается путем сопоставле­ния величин в определении ограниченного типа с соответствующими величинами в ра­нее объявленном или встроенном порядковом типе. Тип TUpperCase в приведенном выше примере определен как ограниченный встроенный тип отдельных символов. Тип TIndex определен как ограниченный тип целых чисел.

В языке Ada ограниченные типы относятся к классу подтипов. Они не являются новыми типами, но лишь дают новые имена ограниченным версиям существующих типов. Предположим, что тип DAYS определен как в предыдущем разделе, и запишем следующее:

subtype WEEKDAYS is DAYS range Mon..Fri;

subtype INDEX is INTEGER range 1..100;

 

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

DAY1: DAYS;

DAY2: WEEKDAYS;

 

DAY2:= DAY1;

присваивание разрешено только в случаях, когда значение переменной DAY1 не равно Sat или Sun. В языках Pascal и Modula-2, как и в языке Ada, подтипы наследуют все разрешенные родительскому типу опера­ции.

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

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

type DERIVED_SMALL_INT is new INTEGER range 1..100;

subtype SUBRANGE_SMALL_INT is INTEGER range 1..100;

Переменные обоих типов, DERIVED_SMALL_INT (производный тип) и SUBRANGE_SMALL_INT (подтип – ограниченный тип), наследуют область значений и операции над переменными типа INTEGER. Тем не менее, переменные типа DERIVED_SMALL_INT не совместимы ни с каким типом INTEGER, тогда как перемен­ные типа SUBRANGE_SMALL_INT совместимы с величинами типа INTEGER и любого его подтипа.

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

 

4.4.3. Реализация порядковых типов

 

Для реализации перечислимых типов необходимо установить соответствие между неотрицательными целым числами и символьными константами. Обычно по умолчанию первое из перечисляемых значений представляется числом 0, второе – числом 1 и так далее. Операции с переменными перечислимых типов значительно отличаются от операций с целыми числами, исключением являются только операторы отношений, идентичные для обоих случаев. Как указывалось ранее, перечислимые типы языков ANSI C и C++ рассматриваются как целые типы.

Ограниченные типы реализуются так же, как и породившие их типы, за исключением того, что в каждом операторе присваивания и в каждом выражении, которые содержат переменную ограниченного типа, компилятор должен выполнять неявную проверку вы­хода значения переменной за пределы допустимого диапазона. Это увеличивает размер программы и время ее выполнения, однако хорошо оптимизированный компилятор может минимизировать количество проверок.




Дата добавления: 2014-12-15; просмотров: 134 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.157 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав