Песни о Паскале | страница 124



Хорошо, а как насчет перечислений и булевого типа? Оказывается, в памяти компьютера они тоже хранятся как числа. Например, упомянутое выше перечисление месяцев в памяти компьютера кодируется числами 0, 1, 2 и так далее, то есть как числовой диапазон 0..11. Таким образом, значение Jan соответствует нулю, Feb – единице и так далее. Подобным образом кодируются и булевы данные: FALSE – нулем, а TRUE – единицей.

В Паскале есть функция, определяющая числовой код данных любого порядкового типа. Она называется Ord (от Order – «порядок»), вот примеры её применения (в комментариях указаны результаты).


>      Writeln ( Ord(5) );       { 5 }

>      Writeln ( Ord(’F’) );       { 70 – по таблице кодировки}

>      Writeln ( Ord(Mar) );       { 2 – смотри перечисление месяцев }

>      Writeln ( Ord(False) );       { 0 }

>      Writeln ( Ord(True) );       { 1 }


Для числа функция возвращает само число, для символа – код по таблице кодировки, а для перечислений – порядковый номер в перечислении, считая с нуля.

Сравнение

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


>if M2 > M1 then … { если второй месяц больше первого }

>if D1 = D2 then … { если дни совпадают }


Нельзя сравнивать данные разных перечислимых типов.


>if M2 > D1 then …       { месяц и день – недопустимо }

>if 'W' > 20 then …       { символ и число – недопустимо }


Но любые типы можно сравнить, приведя их к числовому типу.


>if Ord(M2) = Ord(D1) then … { сравниваются числовые коды }

>if Ord(’W’) > 20 then …       { сравнивается код символа с числом }


Прыг-скок

Итак, числа, символы, булевы данные, диапазоны и перечисления принадлежат к порядковым типам. В общем случае наращивать и уменьшать порядковые переменные путём сложения и вычитания нельзя (можно лишь числа и диапазоны). Но рассмотренные ранее процедуры инкремента (INC) и декремента (DEC) умеют это делать, они были введены в Паскаль фирмой Borland. Другим таким средством являются функции SUCC и PRED, которые существовали ещё в исходной «виртовской» версии языка.

Функция SUCC (от слова SUCCESS – «ряд», «последовательность») принимает значение порядкового типа и возвращает следующее значение того же самого типа, например:


>      Writeln ( Succ(20) );       { 21 }

>      Writeln ( Succ(’D’) );       { ’E’ }

>      Writeln ( Succ(False) ); { True }

>      m:= Succ(Feb);       { переменной m присвоено Mar }