Функция 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+ лучше использовать при отладке программы. В хорошо отлаженной программе таких ошибок возникать не должно, – за это отвечает программист. При компиляции окончательной версии эти директивы лучше отключить, чтобы не увеличивать размер программы и не замедлять её работу.

Итоги

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

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

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

• Целые числа представлены пятью типами, которые отличаются размерами и диапазонами.

• Присвоение переменной порядкового типа значения, выходящего за допустимый диапазон, влечет ошибку нарушения диапазона.

• При включенной директиве $R+ нарушение диапазона приводит к аварии программы, а при отключенной – к переполнению или антипереполнению.

• Функцией ORD можно определить код любого значения порядкового типа.

• Переход к следующему или предыдущему значению порядкового типа выполняется функциями SUCC и PRED.

Перейти на страницу:

Похожие книги