Олег Деревенец - Песни о Паскале
- Название:Песни о Паскале
- Автор:
- Жанр:
- Издательство:неизвестно
- Год:неизвестен
- ISBN:нет данных
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Олег Деревенец - Песни о Паскале краткое содержание
Песни о Паскале - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
В Паскале есть функция, определяющая числовой код данных любого порядкового типа. Она называется 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+ лучше использовать при отладке программы. В хорошо отлаженной программе таких ошибок возникать не должно, – за это отвечает программист. При компиляции окончательной версии эти директивы лучше отключить, чтобы не увеличивать размер программы и не замедлять её работу.
• Существуют три категории типов данных: простые, сложные и указатели.
• Простые типы данных делятся на порядковые и вещественные.
• К порядковым типам относятся целые числа, символы, перечисления и булевы данные.
• Целые числа представлены пятью типами, которые отличаются размерами и диапазонами.
• Присвоение переменной порядкового типа значения, выходящего за допустимый диапазон, влечет ошибку нарушения диапазона.
• При включенной директиве $R+ нарушение диапазона приводит к аварии программы, а при отключенной – к переполнению или антипереполнению.
• Функцией ORD можно определить код любого значения порядкового типа.
• Переход к следующему или предыдущему значению порядкового типа выполняется функциями SUCC и PRED.
• Для быстрого прибавления и вычитания единицы предпочтительней применять процедуры INC и DEC.
• Порядковые типы данных обладают рядом общих свойств, что позволяет применять их в счетчиках циклов и в метках оператора выбора.
А) Напомню, что функция SizeOf возвращает объём памяти, занимаемый переменной, например:
Writeln( SizeOf( LongInt ) ); { 4 }
Writeln( SizeOf( M1 ) ); { 1 }
Воспользуйтесь ею для распечатки размеров всех известных вам порядковых типов данных.
Б) Перечислимые типы и диапазоны строятся на базе других типов данных (Byte, ShortInt и так далее). Какие типы данных, по вашему мнению, будут положены в основу следующих диапазонов:
var N : -10..10;
M : -200..200;
R : 0..40000;
L : 0..400000;
S : ’0’..’9’;
В) Процедура печати Writeln не способна распечатать название месяца, представленного в перечислении. Напишите для этого свою собственную процедуру (объявите тип TMonth и воспользуйтесь оператором CASE).
Читать дальшеИнтервал:
Закладка: