Песни о Паскале - [62]

Шрифт
Интервал

В Паскале есть функция, определяющая числовой код данных любого порядкового типа. Она называется 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 }


Функция PRED (от PREDECESSOR – «предшественник») возвращает предыдущее значение порядкового типа:


>      Writeln ( Pred(20) );       { 19 }

>      Writeln ( Pred(’D’) );       { ’C’ }

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

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


Функции SUCC и PRED подчиняются директиве контроля диапазонов $R+. Например, следующие операторы вызовут аварийное прекращение программы:


>{ $R+ }

>      m:= Succ(Dcb); { превышение верхнего предела }

>      m:= Pred(Jan); { выход за нижний предел }


В Borland Pascal есть одна тонкость: директива $R+ не действует, если функции SUCC и PRED вызываются для чисел, например:


>{ $R+ }

>var B : byte;

>      ...

>      B:=255; B:= Succ(B);       { нет реакции на переполнение }

>      B:=0;       B:= Pred(B);       { нет реакции на антипереполнение }


В таких случаях в Borland Pascal имеет силу директива проверки переполнения $Q+, которая соответствует флажку «Overflow Checking» в окне опций компилятора (рис. 74). Директивы $R+ и $Q+ можно применять совместно, например:


>{ $R+, Q+ }

>var B : byte;       { допустимые значения для байта от 0 до 255 }

>      C : ’a’..’z’; { это ограниченный диапазон символов }

>      ...

>      C:=’z’; C:= Succ(C);       { сработает R+ }

>      B:=255; B:= Succ(B);       { сработает Q+ }


Счетчики циклов

В операторе FOR-TO-DO для счетчика цикла мы применяли числовые переменные. Теперь разнообразим меню: ведь для этого годятся переменные любого порядкового типа, например:


>var m : (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dcb);

>      ...

>      for m:= Jan to Dcb do...


А вот так вычисляется сумма кодов для символов от «a» до «z», здесь счетчиком цикла является символьная переменная:


>var Sum : word; Chr : char;

>      ...

>      Sum:=0;

>      for Chr:= ’a’ to ’z’ do Sum:= Sum + Ord(Chr);


Метки в операторе выбора

Вот ещё одно следствие числового кодирования: любой порядковый тип может служить меткой в операторе CASE-OF-ELSE-END:


>var c : char;

>      ...

>      Case c of

>      ’0’..’9’: Writeln(’Цифра’);

>      ’a’..’z’: Writeln(’Латинская строчная’);

>      ’A’..’Z’: Writeln(’Латинская заглавная’);

>      end;


А вот ещё пример.


>type TMonth = (Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dcb);

>var m : TMonth; { здесь хранится один из месяцев }

>      ...

>      Case m of

>      Jan, Feb, Dcb : Writeln(’Зима’);

>      Mar..May       : Writeln(’Весна’);

>      Jul..Aug       : Writeln(’Лето’);

>      Sep..Nov       : Writeln(’Осень’);

>      end;


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

Разумный контроль

Директивы $R+ и $Q+ лучше использовать при отладке программы. В хорошо отлаженной программе таких ошибок возникать не должно, – за это отвечает программист. При компиляции окончательной версии эти директивы лучше отключить, чтобы не увеличивать размер программы и не замедлять её работу.

Итоги

• Существуют три категории типов данных: простые, сложные и указатели.

• Простые типы данных делятся на порядковые и вещественные.

• К порядковым типам относятся целые числа, символы, перечисления и булевы данные.


Рекомендуем почитать
Необычайный Эйдан Ходж 1

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


Мое Черное Сердце

Его мир это ночь. Злой дух. Живой мертвец. Слуга тьмы. Он продал свою душу ради любви. И теперь каждую ночь ровно в полночь он приходит в этот мир чтобы убивать. Тысяча невинных душ это цена одной души… той единственной. Ради любви к которой он покончил с собой и заключил сделку с дьяволом. Но черная испепеляющая страсть не самое возвышенное чувство, за которое он выдавал свою любовь. Но есть ли время, чтобы это понять? Поздно начинать жить, когда ты уже мертв. Будет ли у него шанс почувствовать искреннюю нежность, которая не разольется жгучим ядом по его венам?.


Одержимые

"Да — я мисс Совершенство и меня зовут Кэрри Тимберли, мне шестнадцать"Так начинается история девушки, не знавшей, что в вскоре жизнь её измениться. Кэрри ждёт поступление в закрытую школу, под названием Кроуфилд. Только в той школе всё не так, как кажется на первый взгляд. Кэрри попытается узнать, и это приведет к неожиданным последствиям. Что за тайна, скрывается за стенами элитного учебного заведения "Воронье поле"?


Зеркала

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


Шептунья

Легко ли быть не такой как все? Безусловно, если твои магические силы вызывают восхищение, страх или любые другие сильные эмоции. Но если это всего лишь непонятная смесь странностей? Что делать? И как быть, если родной отец вдруг «продаёт» пугающему вампиру, совершенно не интересуясь твоим мнением? Быть женой ненавистного существа или же попытаться скрыться, устроив всем незабываемое прощание?


Фарг. Проблему решаю кардинально.

Два года! Два года сохнуть по нему и стесняться признаться... Отдых с подругой решит твою проблему!