THE BELL

Есть те, кто прочитали эту новость раньше вас.
Подпишитесь, чтобы получать статьи свежими.
Email
Имя
Фамилия
Как вы хотите читать The Bell
Без спама

Описание и использование

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

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

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

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

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

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

Реализация

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

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

Критика

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

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

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

Ada

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

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

C++

C#

Enum Cardsuit { Clubs, Diamonds, Spades, Hearts } ;

Java

Enum Cardsuit { Clubs, Diamonds, Spades, Hearts }

Haskell

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

Data Bool = False | True

Примечания


Wikimedia Foundation . 2010 .

Википедия

По техническим причинам Bool перенаправляется сюда. О Bool можно прочитать здесь: stdbool.h. Логический, булев (англ. Boolean или logical data type) тип данных примитивный тип данных в информатике, которые могут принимать два возможных … Википедия

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

Целое, целочисленный тип данных (англ. Integer), в информатике один из простейших и самых распространённых типов данных в языках программирования. Служит для представления целых чисел. Множество чисел этого типа представляет собой… … Википедия

Примитивный (встроенный, базовый) тип тип данных, предоставляемый языком программирования как базовая встроенная единица языка. В зависимости от языка и его реализации, набор таких типов может сильно различаться. Он определяется… … Википедия

У этого термина существуют и другие значения, см. Множество (значения). Множество тип и структура данных в информатике, является реализацией математического объекта множество. Данные типа множество позволяют хранить ограниченное число значений… … Википедия

Некоторые языки программирования предоставляют специальный тип данных для комплексных чисел. Наличие встроенного типа упрощает хранение комплексных величин и вычисления над ними. Содержание 1 Арифметика над комплексными 2 Поддержка в языках … Википедия

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

Переменными называют величины, значения которыхмогут изменяться в процессе выполнения программы. Каждая переменная задается своим уникальным именем, построенным по правилам, указанным в начале главы. Максимально возможная длина имени зависит от реализации Паскаля, теоретически можно давать переменным имена вплоть до 63 символов длиной, что едва ли актуально – обычно имена не длиннее 5-10 символов.

Поскольку любые данные в памяти компьютера хранятся в числовой форме и двоичной системе счисления, кроме имени, переменной обязательно следует присвоить и тип , определяющийдиапазон значений , принимаемых переменной, испособ ее обработки машиной. Поясним сказанное на примере. Как видно из Приложения 1, латинская большая буква "A" имеет десятичный код 65, или 01000001 в двоичном представлении. Без дополнительной информации отипе данных, хранящихся в некоторой ячейке памяти, компьютеру было бы невозможно решить, что именно представляют из себя эти данные – число 65, код символа "A" или что-то еще. В любом языке программирования, в том числе и в Паскале, существует стандартный набор типов, к которым может быть отнесена та или иная совокупность ячеек памяти. Информацию о типах данных Паскаля удобно свести в таблицу. Строки этой таблицы будут упорядочены постаршинству типов , от самого "младшего", требующего наименьшее число байт для представления, и, соответственно, представляющего наименьший диапазон возможных значений, до самого "старшего", представляющего наибольший диапазон значений. В таблице представлены не все возможные, а лишь основные типы данных Паскаля.

Ключевое слово Паскаля

Название и описание типа

Объем памяти, байт

Диапазон возможных значений

Логический: хранит одну логическую переменную

Символьный: хранит код одного символа из набора ASCII-кодов

от 0 до 255 включительно (2 8 =256)

Целочисленный

Целочисленный без знака

±2 16 - диапазон вдвое больше, так как 16-й бит не занят под знак числа

Длинное целое: для представления больших целочисленных значений

Вещественное число с точностью представления до 11-12 знака в дробной части

~ 2.9*10 -39 - 1.7*10 38

Вещественное число с точностью представления до 15-16 знака в дробной части

~ 5*10 -324 – 1.7*10 308

Последовательность символов типа Charдлиной от 1 до 255

2-256 (данные строки + 1 байт для хранения ее длины)

Любые строки текста, состоящие из печатаемых символов

Теоретически для записи переменной типа Booleanбыло бы достаточно 1 бита, но минимальная адресуемая единица памяти – 1 байт (см. Приложение 1). В этом же Приложении уточните, как именно объем памяти в байтах, выделяемой под переменную, влияет на диапазон представляемых ей значений.

Целочисленные и символьные типы обобщенно называют порядковыми , подчеркивая этим, что данные типы имеют конечный набор значений, которые могут быть упорядочены или перечислены. Напомним, что вещественные значения хранятся в памяти компьютера иначе, чем целые – а именно, как совокупность мантиссы и порядка.

Разумеется, задача правильного выбора типов данных целиком ложится на программиста. Например, если некоторый счетчик в Вашей программе может принимать целочисленные значения от 1 до 100000, неправильно было бы описывать его как переменную типа Integer– ведь 2 15 =32768 и при достижении счетчиком этой величины произойдетсброс его значения, которое станет равно -32768. Разумным в данном случае было бы описание счетчика как переменной типаLongint.

Переменные описываются в программе оператором следующего вида:

var Список1:Тип1;

Список2:Тип2;

СписокN:ТипN;

Здесь список – набор имен переменных, разделенных запятыми (или одна переменная), атип – любой из рассмотренных выше типов данных. Например, конструкция

описывает 2 вещественных переменных с именами tиr, а также целочисленную переменную с именемi. Ключевое словоvarможно и продублировать, но обычно такой необходимости нет. Сокращениеvarобразовано от английского слова "Variable" (переменная).

На занятии будет объяснен алгоритм создания типов данных пользователя в Паскаль (Type). Будут разобраны примеры.

Типы данных в Pascal делятся на простые и сложные.

К простым типам относятся стандартные, перечисляемые и ограниченные.

К сложным типам – массивы, множества, записи, файлы. Элементами сложных типов могут быть простые и сложные типы. Мы познакомимся со сложными типами данных позже.

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

Новые (пользовательские) типы данных нужны в первую очередь для наглядности и удобства:

Пример: Задана матрица размерностью 10 x 50. Выполнить описание матрицы, используя пользовательский тип данных

procedure p(a: array of Integer);

Зато следует создать тип данных и записать так:

1 2 type vector = array [ 1 .. 10 ] of integer ; var procedure p(a: vector) ;

type vector = array of integer; var procedure p(a: vector);

Примеры описания массивов при помощи новых типов

type vector = array of integer; matritsa = array of vector;

  • 1 type matritsa = array [ 1 .. 8 ] of array [ 1 .. 10 ] of integer ;

    type matritsa = array of array of integer;

  • 1 type matritsa = array [ 1 .. 8 , 1 .. 10 ] of integer ;

    type matritsa = array of integer;

  • В следующем примере переменные c и d описаны одинаково:

    1 2 3 4 5 6 type vector = array [ 1 .. 10 ] of integer ; matritsa = array [ 1 .. 8 ] of vector; var a, b: vector; c: matritsa; d: array [ 1 .. 8 ] of vector;

    type vector = array of integer; matritsa = array of vector; var a,b: vector; c:matritsa; d:array of vector;

    Type 1 : Заданы массивы а, b и c. Найти среднее арифметическое минимальных элементов массива (использовать формирования массива и ).
    При описании процедур использовать пользовательские типы данных

    Перечисляемый тип и интервальный тип в Паскаль

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

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

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

    Эти значения не могут являться строками, их нельзя вывести на печать и нельзя ввести в компьютер при помощи операторов Read и Write .

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

    type pt= (word1, word2, ... wordN ) ; var w: pt;

    type pt=(word1,word2, ... wordN); var w: pt;

  • pt – идентификатор типа (произвольный),
  • word1 , word2 … — конкретные значения, которые может принимать переменная w , принадлежащая типу pt
  • значения данного типа считаются упорядоченными, т.е. описание типа одновременно вводит упорядочение word1 .
  • Интервальный тип

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

    Рассмотрим пример объявления интервального типа:

    a: min.. max ;
  • a – интервальная переменная
  • min – нижняя граница
  • max – верхняя граница подмножества
  • границы диапазона разделяются двумя точками
  • граница min всегда должна быть меньше max
  • константы min и max должны принадлежать одному и тому же типу. Они определяют базовый тип переменной a .
  • Совместное использование перечисляемого и интервального типов

    Переменную интервального типа можно задать с основой на базовый перечисляемый тип . Рассмотрим пример:

    Пример: Если переменная b может принимать одно из значений red , yellow , green , то эту переменную можно описать так: b: red..green; базовым типом для b является тип color :

    type color= (red, yellow, green, blue) ; var b: red.. green ; begin b: = red; writeln (b) ; b: = yellow; writeln (b) ; b: = green; writeln (b) ; readln end .

    type color=(red,yellow,green,blue); var b:red..green; begin b:=red; writeln(b); b:=yellow; writeln(b); b:=green; writeln(b); readln end.

    В данном примере тип color — является базовым. Переменная b интервального типа определена при помощи базового перечисляемого типа.

    Пример: Известно, сколько дней в каждом месяце года. Сколько дней летом?
    31,28,31,30,31,30,31,31,30,31,30,31

    Один из вариантов решения данной задачи выглядит так:

      Показать решение:

      1 2 3 4 5 6 7 8 const dni: array [ 1 .. 12 ] of byte = (31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 ) ; var s, i: integer ; begin s: = 0 ; for i: = 6 to 8 do s: = s+ dni[ i] ; {летние месяцы - 6, 7, 8} writeln (s) end .

      const dni: array of byte = (31,28,31,30,31,30,31,31,30,31,30,31); var s,i: integer; begin s:=0; for i:=6 to 8 do s:=s+dni[i]; {летние месяцы - 6, 7, 8} writeln(s) end.

      Код данного решения обладает не самой лучшей наглядностью, к тому же приходится самому вычислять номера месяцев начала и конца лета (6 и 8).
      Удобство и наглядность таких программ можно повысить следующим образом:

      Показать решение:

      1 2 3 4 5 6 7 8 9 TYPE mes = (january, february, march, april, may, june, july, august, september, october, november, december) ; CONST dni: array [ january.. december ] of Byte = (31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 ) ; VAR s: Integer ; i: mes; {переменная счетчика цикла i задана типом mes, а не Integer} BEGIN s: = 0 ; for i: = june to august do s: = s+ dni[ i] ; WriteLn (s) END .

      TYPE mes = (january, february, march, april, may, june, july, august, september, october, november, december); CONST dni:array of Byte = (31,28,31,30,31,30,31,31,30,31,30,31); VAR s:Integer; i:mes; {переменная счетчика цикла i задана типом mes, а не Integer} BEGIN s:=0; for i:=june to august do s:=s+dni[i]; WriteLn(s) END.

    Type 2: Определить по названию дня недели выходной ли это или рабочий день.

  • Определить перечислимый тип со значениями дней недели (mon , tue , wed , thu , fri , sat , sun ).
  • В программе присвоить значение переменной (из значений типа, например, mon ).
  • Проверять переменную: если значение суббота или воскресенье – выдавать сообщение «Выходной!» , иначе «Работаем!» .
  • Type 3: В зависимости от месяца года, выдавать сообщение «холодно» — если зимний месяц, и «тепло» — если летний.

  • Определить перечисляемый тип со значениями названий месяцев года.
  • Объявить переменную, относящуюся к этому типу.
  • В программе присвоить значение переменной (из значений типа).
  • Проверять переменную: если значение относится к зимнему месяцу, — выдавать сообщение «холодно» иначе, — «тепло» .
  • Реализовать несколькими способами.
  • Writeln (pribitie) end .

    var otpravlenie,pribitie:byte; begin otpravlenie:=22; pribitie:=otpravlenie+10; writeln(pribitie) end.

    программа вместо ответа «8» напечатает ответ «32».
    Введение ограниченного диапазонного типа позволит избежать неправильного результата, однако компилятор все равно выдаст ошибку:

    1 2 3 4 5 6 var otpravlenie, pribitie: 0 .. 24 ; begin otpravlenie: = 22 ; pribitie: = otpravlenie+ 10 ; writeln (pribitiedeva) ; var a: znak; begin a: = lev; if a<= strelets then writeln ("огонь" ) ; if (a>= vesi) and (a<= bliznetsi) then writeln ("воздух" ) ; if (a>= rak) and (a<= ribi) then writeln ("вода" ) ; if (a>= kozerog) and (a<= deva) then writeln ("земля" ) ; end .

    type znak=(oven,lev,strelets,vesi,vodoley, bliznetsi,rak,skorpion,ribi,kozerog,telets,deva); var a:znak; begin a:=lev; if a<=strelets then writeln("огонь"); if (a>=vesi) and (a<=bliznetsi) then writeln ("воздух"); if (a>=rak) and (a<=ribi) then writeln ("вода"); if (a>=kozerog) and (a<=deva) then writeln ("земля"); end.

    Type 5: В зависимости от названия цветка, выдавать к какому сезону года он относится:

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

    Простые типы делятся на стандартные (порядковые) и перечисляемые (ограниченные).

    Стандартные типы

    Турбо-Паскаль имеет четыре встроенных стандартных типа: integer (целое), real (вещественное), boolean (логический) и char (символьный).

    Целочисленный тип (integer)

    В Турбо-Паскале имеется пять встроенных целочисленных типов: shortint (короткое целое), integer (целое), longint (длинное целое), byte (длиной в байт) и word (длиной в слово). Каждый тип обозначает определенное подмножество целых чисел, как это показано в следующей Таблице.

    Встроенные целочисленные типы.

    Диапазон

    Формат

    8 битов со знаком

    16 битов со знаком

    2147483648 +2147483647

    32 бита со знаком

    8 битов без знака

    16 битов без знака

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

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

    Операции совершаемые над целыми числами:

    “+” - сложение

    “-“ - вычитание

    “*” - умножение

    SQR - возведение в квадрат

    DIV - после деления отбрасывает дробную часть

    MOD - получение целого остатка после деления

    ABS - модуль числа

    RANDOM(X)-получение случайного числа от 0 до Х

    А:=100 ; b:=60 ; a DIV b результат - 1 а MOD b результат - 40

    Описываются переменные целого типа следующим образом:

    var список переменных: тип;

    Например: var а,р,n:integer;

    Вещественный тип(real)

    К вещественному типу относится подмножество вещественных чисел, которые могут быть представлены в формате с плавающей запятой с фиксированным числом цифр. Запись значения в формате с плавающей запятой обычно включает три значения - m, b и e - таким образом, что m*b е, где b всегда равен 10, а m и e являются целочисленными значениями в диапазоне вещественного типа. Эти значения m и e далее определяют диапазон и точность вещественного типа.

    Имеется пять видов вещественных типов: real, singlе, duble, exnende, comp. Вещественные типы различаются диапазоном и точностью связанных с ними значений

    Диапазон и десятичные цифры для вещественных типов

    Диапазон

    Цифры

    2.9x10Е-39 до 1.7x10Е 38

    1.5x10Е-45 до 3.4x10Е 38

    5.0x10Е-324 до 1.7x10Е 308

    3.4x10Е-493 до 1.1x10Е 403

    2Е 63 до 2Е 63

    Операции совершаемые над вещественными числами:

    • Все операции допустимые для целых чисел.
    • SQRT(x)-корень квадратный из числа х.
    • SIN(X), COS(X), ARCTAN(X).
    • LN(X)-натуральный логарифм.
    • EXP(X)-экспонента Х (е х).
    • EXP(X*LN(A))-возведение в степень (А х).
    • Функции преобразования типов:
      • TRUNC(X)-отбрасывает дробную часть;
      • ROUND(X)-округление.
    • Некоторые правила арифметических операций:
      • Если в арифметическом действии встречаются числа типа real и integer, то результат будет иметь тип real.
      • Все составные части выражения записываются в одну строку.
      • Используются только круглые скобки.
      • Нельзя подряд ставить два арифметических знака.

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

    var список переменных: тип;

    Например:

    var d,g,k:real ;

    Символьный тип(char)

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

    Каждый символ имеет свой код и номер. Порядковые номера цифр 0,1..9 упорядочены по возрастанию. Порядковые номера букв также упорядочены по возрастанию, но не обязательно следуют друг за другом.

    К символьным данным применимы знаки сравнения:

    > , < , >=, <=, <> .

    Например: ‘A’ < ‘W’

    Функции, которые применимы к символьным переменным:

    1. ORD(X) - определяет порядковый номер символа Х. ord (‘a’) =97 ;
    2. CHR(X) - определяет символ по номеру. chr (97 ) =’a’;
    3. PRED(X) - выдает символ, стоящий перед символом Х. pred (‘B’) =’A’;
    4. SUCC(X) - выдает символ, следующий после символа Х. succ (‘A’) =’B’;

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

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

    Type <имя типа>=(список констант) ; Var <имя переменной>:<имя типа>;

    где <список констант> - это особый вид констант, задаваемых через запятую и имеющих свой порядковый номер, начиная с 0.

    Например:

    type направление=(север, юг, запад, восток) ; месяц=(июнь,июль,август,январь) ; емкость=(ведро,бочка,канистра,бак) ; var поворот:направление; отъезд:месяц; объем:емкость; var поворот:(свер, юг, запад, восток) ; отъезд:(июнь, июль, август, январь) ; объем:(ведро, бочка, канистра, бак) ;

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

    Поворот:=юг; отъезд:=август; объем:=бак;

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

    Отъезд:=юг; объем:=август;

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

    1. ORD - порядковый номер

    2. PRED - предшествующий элемент

    3. SUCC - последующий элемент.

    PRED (бочка) =ведро; SUCC (юг) =запад; ORD (июль) =1 ;

    Переменные перечислимого типа можно сравнить, так как они упорядочены и пронумерованы. Так выражения: север < юг, июнь < январь имеют значения TRUE, а юг>запад и бак<бочка значение FАLSE.

    Ограниченный тип

    Если переменная принимает не все значения своего типа, а только в некотором диапазоне, то ее можно рассматривать как переменную ограниченного типа. Каждый ограниченный тип задается путем накладывания ограничения на базовые типы.

    Описывается так:

    TYPE <имя типа>=константа1 ..константа2

    При этом должны выполняться следующие правила:

    1. Обе ограниченные константы должны быть одного типа.
    2. В качестве базового типа можно использовать любой простой тип, кроме действительного(real).
    3. Начальные значение при определении ограниченного типа не должно быть больше конечного значения.
    type index =0 ..63 ; letter=’a’..’z’; var char1,char2:letter; a,g:index ;

    Можно описывать сразу в разделе описания переменных:

    var a,g:0 ..63 ; char1,char2:’a’..’z’.

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

    Энциклопедичный 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), как правило, не имеют перечислений.

    THE BELL

    Есть те, кто прочитали эту новость раньше вас.
    Подпишитесь, чтобы получать статьи свежими.
    Email
    Имя
    Фамилия
    Как вы хотите читать The Bell
    Без спама