В табл. 2.6 приведен список стандартных функций, обеспечивающих связь между различными типами данных.
Функции Ord, Pred и Succ применимы только к порядковым типам данных, т. е. из простых типов данных ко всем, кроме вещественных.
Функция Ord, применяемая к целому числу, дает его собственное значение. Например:
Ord(-35) = -35 . Ord(128) = 128
Таблица 2.6
Стандартные функции, связывающие различные типы данных
Обращение | Тип аргумента | Тип результата | Действие |
Ord (x) | Любой порядковый | I | Дает порядковый номер значения х в его типе |
Pred (x) | То же | Тот же, что у х | Дает предыдущее по отношению к х значение в его типе |
Succ (x) | -//- | Тот же, что ух | Дает следующее по отношению к х значение в его типе |
Chr (x) | Byte | Char | Дает символ с порядковым номером х |
Odd (x) | I | Boolean | Дает True, если х — нечетное число, и False, если х — четное |
Если аргумент целый, то, например, оператор
у:= Pred(x) эквивалентен у:= х — 1, а оператор
у:= Succ(x) эквивалентен у:= х + 1.
Для аргумента символьного типа эти функции дают соответственно предыдущий и следующий символы в таблице внутренней кодировки. Поскольку латинский алфавит всегда упорядочен по кодам, т.е.
|
|
Ord(a) < . Ord(b) < …. < . Ord ( z ), то, например, можно записать
Pred(b) = a . Succ(b) = с. То же относится и к цифровым литерам:
Pred(5) = 4 . Succ(5) = 6.
Функция Chr (х) является обратной к функции Ord (х), если х — символьная величина. Например, для кода ASCII справедлива запись:
Ord(a) = 97 . Chr(97) = а.
Эту их «взаимообратность», если х— символьная величина, можно выразить формулой
Chr(Ord(x)) = х.
В некоторых случаях возникает задача преобразования символьного представления числа в числовое. Например, получить из литеры 5 целое число 5 можно следующим образом:
N:= Ord(5) — Ord(0).
Здесь N— целая переменная и использован тот факт, что код литеры 5 на пять единиц больше кода 0.
Булевский тип данных также является порядковым. Порядок расположения двух его значений следующий: False, True. Тогда справедливы следующие отношения:
Ord(False) = 0 . Succ(False) = True .
Ord(True) = 1 . Pred(True) = False.
Приведем интересный пример. Пусть х, у, z — вещественные переменные. Требуется определить, какую задачу решает следующий оператор:
z:= х * Ord(x > .= у) + у * Ord(y > . x).
Ответ: z =max(x, у), т.е. данную задачу можно решить без использования условного оператора if..then..else.
Упражнения
1. Вычислить значения следующих логических выражений:
а) К mod 7 = К div 5-1 при К = 15 .
б) Odd(Trunc(10 * Р)) при Р = 0.182 .
в) Not Odd(n) при n = 0 .
г) t And (P mod 3 = 0) при t = True, P = 10101 .
д) (х * у < . > . 0) And (у > . х) при х = 2, у = 1 .
е) a Or Not b при а = False, b = True.
2. Определить какое значение получит логическая переменная d при а = True и х = 1 после выполнения следующих операторов присваивания:
|
|
а) d:= х < . 2 .
б) d:= Not a Or Odd(x) .
в) d:= Ord(a) < . > . х.
3. Написать оператор присваивания, в результате выполнения которого логическая переменная t получит значение True, если следующее утверждение истинно, и значение False — в противном случае:
а) из чисел х, у, z только два равны между собой .
б) х — положительное число .
в) каждое из чисел х, у, z положительное .
г) только одно из чисел х, у, z положительное .
д) р делится без остатка на q .
е) цифра 5 входит в десятичную запись трехзначного целого числа к.
