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




Функция 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;