Что значит выражение перечисляемого типа в паскале. Структурированные типы данных. Описание и использование


Алгоритм языка Pascal построен таким образом,что для того чтобы оперировать с переменными,нужно обычно указать их тип. Причем описание типа для каждой переменной необходимо производить до выполнения программы (в разделе var). То есть запуске компилятора программа сначала получает сведения,касательно того с какими типами данных будет работать и только потом выполняет какие-либо действия.
Итак в Паскале 3 основных типа: простой,структурированный и указатель. Однако каждый тип имеет свои подтипы. Для удобства все типы данных приведены в виде списка.

Для каждого типа характерен свой диапазон значений. Ниже приведены диапазоны значений для простого типа

Чаще всего используют типы integer ,real ,longint ,byte ,string ,boolean и char так как обычно в задачах не указывается какие конкретно типы должны быть использованы для решения. Будьте внимательны при использовании типов и внимательно следите за допустимыми диапазонами для каждого типа. Например дробным числам нельзя присваивать тип integer ,а типом сhar может быть только один символ (например переменная f:=gfgfgf не может быть char)
Теперь о том как описать тип. Как уже было сказано выше операторам присваивается тип в самом начале программы (можно даже сказать что до начала программы). Итак описываются типы в разделе var, который находится до начала программы (то есть до begin). Рассмотрим простой пример
var x,u,yu,i:integer;
s,f:real;
g:string;
begin
....
end. Как видно из примера шаблон описания типа выглядит так
оператор1,оператор 2: тип; Как вы уже заметили нет необходимости описывать каждый оператор, если тип общий,достаточно перечислить их через запятую. Также нет необходимости после каждого типа переходить на новую строку,здесь это сделано просто для более удобного чтения кода. Вообще код должен быть читабельным и хорошо воспринимаемым, поэтому советуется операторы общего типа объединять,а каждый тип писать с новой строки.

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

type Cardsuit = (clubs , diamonds , hearts , spades ) ;

Здесь производится объявление типа данных Cardsuit (карточная масть), значениями которого может быть любая из четырёх перечисленных констант. Переменная типа Cardsuit может принимать одно из значений clubs, diamonds, hearts, spades , допускается сравнение значений типа перечисление на равенство или неравенство, а также использование их в операторах выбора (в Паскале - case) в качестве значений, идентифицирующих варианты.

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

На базе перечислений в некоторых языках могут создаваться типы-множества . В таких случаях множество понимается (и описывается) как неупорядоченный набор уникальных значений типа-перечисления.

Перечисляемый тип может использоваться в объявлениях переменных и формальных параметров функций (процедур, методов). Значения перечислимого типа могут присваиваться соответствующим переменным и передаваться через параметры соответствующих типов в функции. Кроме того, всегда поддерживается сравнение значений перечислимого типа на равенство и неравенство. Некоторые языки поддерживают также другие операции сравнения для значений перечислимых типов. Результат сравнения двух перечислимых значений в таких случаях определяется, как правило, порядком следования этих значений в объявлении типов - значение, которое в объявлении типа встречается раньше, считается «меньше» значения, встречающегося позже. Иногда перечислимый тип или некоторый диапазон значений перечислимого типа также может быть использован в качестве типа индекса для массива. В этом случае для каждого значения выбранного диапазона в массиве имеется один элемент, а реальный порядок следования элементов соответствует порядку следования значений в объявлении типа.

Реализация

Обычно в процессе компиляции значения перечислений представляются при помощи целых чисел. В зависимости от конкретного языка программирования такое представление может быть либо полностью скрыто от программиста, либо доступно ему с помощью тех или иных «обходных манёвров» (например, принудительного преобразования значения типа перечисление к значению типа «целое число»), либо даже управляемо программистом (в таких случаях программист имеет возможность явно указать, какими числами будут кодироваться все или некоторые значения типа-перечисления). У всех вариантов есть свои положительные и отрицательные стороны. С одной стороны, возможность использования числовых значений констант, составляющих тип-перечисление, особенно при злоупотреблении ею, лишает смысла использование этих типов и создаёт опасность появления ошибок (когда используются числовые значения, для которых в типе нет соответствующих констант). С другой стороны, явное управление значениями даёт некоторые дополнительные возможности. Например, позволяет использовать типы-перечисления при организации интерфейса с модулями, написанными на других языках, если они используют или возвращают кодированные целыми числами значения из некоторого предопределённого набора.

Ещё одна возможность, которую дают перечислимые типы на уровне реализации языка - экономия памяти. При небольшом объёме типа-перечисления для хранения значения этого типа достаточно нескольких битов (вышеприведённый тип Cardsuit требует всего два бита на значение, в то время как стандартное целое число на большинстве используемых архитектур занимает 32 бита - в 16 раз больше), и компилятор может использовать этот факт для уплотнения хранения данных в памяти. Это может быть особенно важно, если несколько значений типов-перечислений хранятся в одной записи - уплотнение записей при обработке больших их количеств может освободить много памяти. Правда, необходимо отметить, что компиляторы обычно не реализуют эту возможность, по крайней мере, в последнее время, когда компьютерная память существенно подешевела.

Критика

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

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

Описание перечислений в различных языках

Enum cardsuit { CLUBS , DIAMONDS , HEARTS , SPADES };

Динамические языки слабой типизации с C-подобным синтаксисом (например perl или JavaScript), как правило, не имеют перечислений.

C++

Перечисления в языке C++ прямо наследуют поведение перечислений языка C, за исключением того, что перечисляемый тип в C++ - настоящий тип, и ключевое слово enum используется только при объявлении такого типа. Если при обработке параметра являющегося перечислением, какое-либо значение из перечисления не обрабатывается (например один из элементов перечисления забыли обработать в конструкции switch), то компилятор может выдать предупреждение о забытом значении.

enum Cardsuit { Clubs , Diamonds , Spades , Hearts }

Java

В первоначальной Java перечислений не было, вместо них предлагалось использовать классы со статическими константами. Начиная с версии 5 (1.5) перечисления были введены в язык, они представляют собой полноценный класс, в который можно добавлять произвольное количество полей и методов. Перечисления были введены для улучшенного контроля за типобезопасностью.

Конструкция, задающая альтернативы для простого типа выглядит так:

<простой тип> ::= <перечисляемый тип>

<предопределенный тип>

<ограниченный тип>

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

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

При формулировке многих алгоритмов в виде текста программ целые числа используются в том случае, когда их собственно числовое значение несущественно и число указывает только на выбор значения из небольшого множества возможных вариантов. Так, например дни недели можно закодировать таким образом: понедельник - 1, вторник - 2, и т.д. Однако над этими числами нельзя выполнять никаких операций, кроме проверки на равенство или присваивания. Попытка сложить эти числа приведет к бессмыслице. Для дальнейшего использования в программе таких данных желательно определить их тип как перечисляемый. Это позволит:

сделать текст программы удобным для чтения и избавить программиста от необходимости самому кодировать значения;

подключить контроль за выполнением операций, т.е. при попытке умножить понедельник на вторник появится сообщение об ошибке;

при условии, что кардинальное число типа меньше или равно 256, разместить эти данные в одном байте, т.е. экономить память.

Конструкция, определяющая правило описания перечисляемого типа имеет вид:

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

<список значений> ::= <значение>

<список значений>,<значение>

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

<целое >

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

Пример раздела типов с такими описаниями:

Day = (mo, tu, we, th, fr, sa, su); {card(day)=7}

Notation= (do_, re, mi, fa, sol, la, si); {card(notation)=7}

Тогда, при описании переменных MyDday и MyNota в разделе переменных:

MyNota: Notation;

можно, например, использовать такие операторы присваивания:

Поскольку предопределенный тип является скалярным, для него полезно определить функции, которые возвращают предшествующее и последующее значения для своего аргумента. В языке Паскаль такими функциями являются соответственно Pred(x) и Succ(x). Так, в результате выполнения оператора MyDay:=Pred(sa) переменной MyDay будет присвоено значение fr, а выполнение оператора MyNota:=Succ(do_) присвоит переменной MyNota значение re. Очевидно, что эти функции не определены на соответственно "первом" и "последнем" значениях, т.е. обращения вида Pred(do_) или Succ(si) вызовут сообщение об ошибке. Кроме того, существенным недостатком перечисляемого типа является отсутствие поддержки вывода его значений в подавляющем большинстве существующих систем программирования, что заставляет использовать для вывода, например, такой фрагмент текста программы.

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

type nm = (word1, word2, …, wordN) ; var w: nm;

здесь nm – идентификатор типа (произвольный), word1, word2… - конкретные значения, которые может принимать переменная w, принадлежащая типу nm. Значения данного типа считаются упорядоченными, т.е. описание типа одновременно вводит упорядочение word1 < word2 < wordN. Порядковые значения отсчитываются с 0.

К переменным типа перечисления можно применять функции ord, pred, succ и процедуры inc и dec.

Ко всем переменным одного и того же скалярного типа применимы операции отношения: =, <>, <=, >=, <, >.

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

Пример 1. type color = (red, yellow, green, blue);
Здесь определено, что red < yellow < green < blue. Переменная типа color может принимать одно из перечисленных значений.

Функция succ(x)

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

Пример 2. Пусть задана последовательность букв в алфавитном порядке. Тогда succ(A) есть B; succ(L) есть M и т.д.

Для примера 1 succ(red) есть yellow.

Функция pred(x)

По элементу x определяется последовательность, которой принадлежит x, и выдается предыдущий элемент этой последовательности.

Пример 3. pred(F) есть E; pred(Z) есть Y и т.д.

Функция ord(x)

Выдается номер элемента x в последовательности.

Пример 4. ord(red) равен 0, а ord(green) равен 2.

Чьё множество значений представляет собой ограниченный список идентификаторов.

Энциклопедичный YouTube

  • 1 / 5

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

    type Cardsuit = (clubs , diamonds , hearts , spades ) ;

    Здесь производится объявление типа данных Cardsuit (карточная масть), значениями которого может быть любая из четырёх перечисленных констант. Переменная типа Cardsuit может принимать одно из значений clubs, diamonds, hearts, spades , допускается сравнение значений типа перечисление на равенство или неравенство, а также использование их в операторах выбора (в Паскале - case) в качестве значений, идентифицирующих варианты.

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

    На базе перечислений в некоторых языках могут создаваться типы-множества . В таких случаях множество понимается (и описывается) как неупорядоченный набор уникальных значений типа-перечисления.

    Перечисляемый тип может использоваться в объявлениях переменных и формальных параметров функций (процедур, методов). Значения перечислимого типа могут присваиваться соответствующим переменным и передаваться через параметры соответствующих типов в функции. Кроме того, всегда поддерживается сравнение значений перечислимого типа на равенство и неравенство. Некоторые языки поддерживают также другие операции сравнения для значений перечислимых типов. Результат сравнения двух перечислимых значений в таких случаях определяется, как правило, порядком следования этих значений в объявлении типов - значение, которое в объявлении типа встречается раньше, считается «меньше» значения, встречающегося позже. Иногда перечислимый тип или некоторый диапазон значений перечислимого типа также может быть использован в качестве типа индекса для массива. В этом случае для каждого значения выбранного диапазона в массиве имеется один элемент, а реальный порядок следования элементов соответствует порядку следования значений в объявлении типа.

    Реализация

    Обычно в процессе компиляции значения перечислений представляются при помощи целых чисел. В зависимости от конкретного языка программирования такое представление может быть либо полностью скрыто от программиста, либо доступно ему с помощью тех или иных «обходных манёвров» (например, принудительного преобразования значения типа перечисление к значению типа «целое число»), либо даже управляемо программистом (в таких случаях программист имеет возможность явно указать, какими числами будут кодироваться все или некоторые значения типа-перечисления). У всех вариантов есть свои положительные и отрицательные стороны. С одной стороны, возможность использования числовых значений констант, составляющих тип-перечисление, особенно при злоупотреблении ею, лишает смысла использование этих типов и создаёт опасность появления ошибок (когда используются числовые значения, для которых в типе нет соответствующих констант). С другой стороны, явное управление значениями даёт некоторые дополнительные возможности. Например, позволяет использовать типы-перечисления при организации интерфейса с модулями, написанными на других языках, если они используют или возвращают кодированные целыми числами значения из некоторого предопределённого набора.

    Ещё одна возможность, которую дают перечислимые типы на уровне реализации языка - экономия памяти. При небольшом объёме типа-перечисления для хранения значения этого типа достаточно нескольких битов (вышеприведённый тип Cardsuit требует всего два бита на значение, в то время как стандартное целое число на большинстве используемых архитектур занимает 32 бита - в 16 раз больше), и компилятор может использовать этот факт для уплотнения хранения данных в памяти. Это может быть особенно важно, если несколько значений типов-перечислений хранятся в одной записи - уплотнение записей при обработке больших их количеств может освободить много памяти. Правда, необходимо отметить, что компиляторы обычно не реализуют эту возможность, по крайней мере, в последнее время, когда компьютерная память существенно подешевела.

    Критика

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

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

    Описание перечислений в различных языках

    Enum cardsuit { CLUBS , DIAMONDS , HEARTS , SPADES };

    Динамические языки слабой типизации с C-подобным синтаксисом (например perl или JavaScript), как правило, не имеют перечислений.

Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: