Песни о Паскале | страница 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;