Это данные, для которых можно чётко ответить на вопросы: следующее значение? предыдущее значение? Например - целые числа: за числом 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),
в том числе и для целых показателей, но это выполняется намного медленнее (и теряется точность).