Стандартные подпрограммы, обрабатывающие порядковые типы данных
Только для величин порядковых типов определены следующие функции и процедуры:
Функция ord(x) возвращает порядковый номер значения переменной x (относительно того типа, к которому принадлежит переменная х).
Функция pred(x) возвращает значение, предшествующее х (к первому элементу типа неприменима).
Функция succ(x) возвращает значение, следующее за х (к последнему элементу типа неприменима).
Процедура inc(x) возвращает значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+1).
Процедура inc(x,k) возвращает k-е значение, следующее за х (для арифметических типов данных это эквивалентно оператору x:=x+k).
Процедура dec(x) возвращает значение, предшествующее х (для арифметических типов данных это эквивалентно оператору x:=x-1).
Процедура dec(x,k) возвращает k-e значение, предшествующее х (для арифметических типов данных это эквивалентно оператору x:=x-k).
На первый взгляд кажется, будто результат применения процедуры inc(x) полностью совпадает с результатом применения функции succ(x). Однако разница между ними проявляется на границах допустимого диапазона. Функция succ(x) неприменима к максимальному элементу типа, а вот процедура inc(x) не выдаст никакой ошибки, но, действуя по правилам машинного сложения, прибавит очередную единицу к номеру элемента. Номер, конечно же, выйдет за пределы диапазона и за счет усечения превратится в номер минимального значения диапазона. Получается, что процедуры inc() и dec() воспринимают любой порядковый тип словно бы "замкнутым в кольцо": сразу после последнего вновь идет первое значение.
Поясним все сказанное на примере. Для типа данных
type sixteen = 0..15;
попытка прибавить 1 к числу 15 приведет к следующему результату:
+ 1 1 1 1
_________________________
1 0 0 0 0
Начальная единица будет отсечена, и потому получится, что inc(15)=0.
Аналогичная ситуация на нижней границе допустимого диапазона произвольного порядкового типа данных наблюдается для процедуры dec(x) и функции pred(x):
dec(min_element)= max_element
Опишем теперь порядковые типы данных более подробно.
1. Логический тип boolean имеет два значения: false и true, и для них выполняются следующие равенства:
ord(false)=0, ord(true)=1, false<true,
pred(true)=false, succ(false)=true,
inc(true)=false, inc(false)=true,
dec(true)=false, dec(false)=true.
2. В символьный тип char входит 256 символов расширенной таблицы ASCII (например, 'a', 'b', 'я', '7', '#'). Номер символа, возвращаемый функцией ord(), совпадает с номером этого символа в таблице ASCII.
3. Целочисленные типы данных сведем в таблицу:
Тип данных
Количество
Диапазон
байтов
битов
shortint
128..127
-27..27-1
byte
0..255
0..28-1
integer
-32768..32767
-215..215-1
word
0..65535
0..216-1
longint
-2147483648..2147483647
-231..231-1
Перечисляемые типы данных задаются в разделе type явным перечислением их элементов. Например:
type week =(sun,mon,tue,wed,thu,fri,sat)
0 1 2 3 4 5 6
Напомним, что для этого типа данных:
inc(sat) = sun, dec(sun) = sat.
Интервальные типы данных задаются только границами своего диапазона. Например:
type month = 1..12;
budni = mon..fri;
Программист может создавать и собственные типы данных, являющиеся комбинацией нескольких стандартных типов. Например:
type valid_for_identifiers = 'a'..'z','A'..'Z','_','0..9';
Этот тип состоит из объединения нескольких интервалов, причем в данном случае изменен порядок латинских букв: если в стандартном типе char 'A' < 'a', то здесь, наоборот, 'a' < 'A'. Для величин этого типа выполняются следующие равенства: