Это данные, для которых можно чётко ответить на вопросы: следующее значение? предыдущее значение? Например - целые числа: за числом 8 следует 9, а перед ним - 7. Символьные данные - упорядочены по своим кодовым значениям. Для порядковых типов в Паскале есть функции: ORD(X) - порядковый номер X, PRED(X) - предыдущее значение для X, SUCC(X) - значение, следующее за X. Где X - выражение. Например, программа
var X: Char;
begin
X:= 'F'; writeln('SUCC(F) = ', SUCC(X));
writeln('=> ',Char(Byte(X)+3));
writeln('==>',SUCC(Char(Byte(X)+3)));
readln;
end.
------
Выводит результат:
------------------
Turbo Pascal Version 7.0
SUCC(F) = G
=> I
==>J
----
В программе показано, что параметром SUCC(<выражение порядкового типа>) является ВЫРАЖЕНИЕ. Применено преобразование типов: Byte(Char) и наоборот Char(Byte). Понятие порядковый тип пригодится в дальнейшем.
Для данных порядкового типа можно объявить подтип, называемый тип-диапазон. Синтаксис описания таких типов:
Type <имя типа> = <мин.значение>..<макс.значение>;
Например:
type Rus_Zaglavn = 'А'..'Я';
Тип Rus_Zaglavn (русские заглавные) - это подтип символьного типа Char.
Тип-диапазон часто применяется при описании массивов (о массивах -далее).
Если при работе программы значения какой-то переменной НЕ ДОЛЖНЫ выходить за известный диапазон, то тип-диапазон можно применить для контроля правильности
работы программы. Например:
-------
label nacalo;
var Lat_Zaglavn: 'A'..'Z'; SS: string[100];
begin
SS := '';
nacalo:
write('Введите лат. заглавную букву (Z - выход)');
readln(Lat_Zaglavn);
SS := SS + Lat_Zaglavn;
if Lat_Zaglavn < 'Z' then goto nacalo;
end.
-------
Результат нормальной работы программы:
Введите лат. заглавную букву (Z - выход)P
P
Введите лат. заглавную букву (Z - выход)R
PR
Введите лат. заглавную букву (Z - выход)I
PRI
Введите лат. заглавную букву (Z - выход)V
PRIV
Введите лат. заглавную букву (Z - выход)E
PRIVE
Введите лат. заглавную букву (Z - выход)T
PRIVET
Введите лат. заглавную букву (Z - выход)I
PRIVETI
Введите лат. заглавную букву (Z - выход)K
PRIVETIK
Введите лат. заглавную букву (Z - выход)Z
PRIVETIKZ
--------------
Результат ввода недопустимого символа (9)
Error 201: Range check error.
------
Примечание: чтобы такой контроль работал,
нужно включить опцию компилятора: [X] Range checking.
Для этого: Меню\Options\Compiler\ установить
[X] Range checking.
---------------
Применение этих типов облегчаем программирование и понимание текста программы.
Например, числа 1..12 можно использовать для обозначения месяцев, но можно описать тип:
type mesac = (jan, feb, mar, apr, may, jun, jul, avg, sen, oct, nov, dec);
И переменную этого типа:
var MM: mesac;
Тогда можно использовать значения jan..dec в качестве значений переменной MM.
Такие значения не вводятся и не выводятся, поэтому приходится применять преобразование типов при вводе-выводе. При этом jan преобразуется в 0. Программа:
-------------
type mesac = (jan, feb, mar, apr, may, jun, jul,
avg, sen, oct, nov, dec);
var MM: mesac;
begin
write('Введите лучший месяц в году 1..12 --> ');
readln(byte(MM));
MM := PRED(MM); {потому что номер января = 0}
write('Лучший месяц для Вас - ');
if MM = jan then writeln('январь') else
if MM = feb then writeln('февраль') else
if MM = mar then writeln('март') else
if MM = apr then writeln('апрель') else
if MM = may then writeln('май') else
if MM = jun then writeln('июнь') else
if MM = jul then writeln('июль') else
if MM = avg then writeln('август') else
if MM = sen then writeln('сентябрь') else
if MM = oct then writeln('октябрь') else
if MM = nov then writeln('ноябрь') else
if MM = dec then writeln('декабрь');
readln;
end.
----------------
Результат работы:
----------------
Введите лучший месяц в году 1..12 --> 3
Лучший месяц для Вас - март
--------------
Если применить массивы (которые изучим позже), то получим компактную версию этой программы:
---------------
type mesac = (jan, feb, mar, apr, may, jun, jul,
avg, sen, oct, nov, dec);
var MM: mesac;
const mes: array [mesac] of string =
('январь','февраль','март','апрель','май',
'июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь');
begin
write('Введите лучший месяц в году 1..12 --> ');
readln(byte(MM));
MM := PRED(MM);
write('Лучший месяц для Вас - ');
writeln(mes[MM]); readln;
end.
------
Результат тот же.
------
Это вещественные числа. В Паскале и Делфи несколько вещественных типов, отличающихся точностью и диапазоном значений.
Turbo Pascal обеспечивает пять предопределенным вещественных типов. Каждый
тип имеет свой диапазон и точность:
Тип Диапазон Точность Байт
Real 2.9e-39..1.7e38 11-12 6
Single 1.5e-45..3.4e38 7-8 4
Double 5.0e-324..1.7e308 15-16 8
Extended 3.4e-4932..1.1e4932 19-20 10
Comp -9.2e18..9.2e18 19-20 8
Обратите внимание: тип Comp - 64-разрядное целое число. В нем можно хранить
только интегральные значения в диапазоне (-2 63 + 1)..(2 63 - 1).
Turbo Pascal поддерживает две модели генерации объектного кода с числами с
плавающей запятой :
- Программная поддержка чисел с плавающей запятой {$N-}
- Аппаратная (80x87) поддержка чисел с плавающей запятой {$N+}
Вы можете использовать директиву компилятора $N для переключения между двумя
моделями.
В режиме $N+, директива компилятора $E управляет, включать ли библиотеки
эмуляций 80x87 в готовую программу.
Для современных компьютеров нужно установить: {$N-} {$E-}
(Меню\Options\Compiler\
[X] 8087/80287
[ ] Emulation
)
----------------------------------------------------------
Функция Описание
----------------------------------------------------------
Abs Возвращает абсолютное значение аргумента
ArcTan Возвращает арктангенс аргумента
Cos Возвращает косинус аргумента
Exp Возвращает экспоненту аргумента
Frac Возвращает дробную часть аргумента
Int Возвращает целую часть аргумента
Ln Возвращает натуральный логарифм аргумента
Pi Возвращает значение числа Pi
{3.1415926535897932385}
Sin Возвращает синус аргумента
Sqr Возвращает аргумент в квадрате
Sqrt Возвращает квадратный корень аргумента
Полезно также знать, что в Паскале нет операции возведения в любую степень.
Вместо этого для целых степеней можно использовать многократное умножение. Когда Вы изучите оператор цикла, это будет несложной задачей. Возведение в нецелую степень основано на следующем преобразовании:
Пусть требуется вычислить:
Z = ab
Логарифмируем обе части. Получим:
ln(Z)=b*ln(a); следовательно:
Z = eb*ln(a) = exp(b*ln(a)) ... (1)
То есть возведение в степень можно выполнить по формуле (1),
в том числе и для целых показателей, но это выполняется намного медленнее (и теряется точность).