Вещественные выражения
В выражениях вещественного типа допускаются следующие операции:
+ - сложение;
- - вычитание;
* - умножение;
/ - деление.
Наряду с вещественными операндами в вещественных выражениях могут использоваться операнды целого типа. Кроме того, рассмотренные функции Abs и Sqr приусловии вещественного аргумента дают вещественный результат. Приведем функции, которые дают вещественный результат вне зависимости от аргумента:
Sin(x), Cos(x) - вычисляют одноименные тригонометрические функции (значение аргумента передается в функцию в радианах – вещественный тип).
ArcTan(х) - вычисляет обратную тригонометрическую функцию – арктангенс (значение угла возвращается в радианах.); тип аргумента х - Real.
Ln(x) - вычисляет натуральный логарифм – вещественный тип; тип аргумента х - Real.
Exp(x) - вычисляет экспоненту – вещественный тип; тип аргумента х- Real.
Sqrt(x) - вычисляет квадратный корень – вещественный тип; тип аргумента х - Real.
Необходимо отметить, что операция возведения в степень в Паскале отсутствует, но для вещественных выражений эта проблема легко решается, если воспользоваться свойствами функций Exp (экспонента) и Ln (натуральный логарифм). Из математики известны тождества:
и
Отсюда следует, что
.
Для вычисления логарифмов по другим основаниям можно применять формулу:
.
Здесь a > 0 и a ≠ 1. Приведём пример. Пусть мы имеем математическое выражение:
Средствами языка Паскаль это выражение следует записать так:
(x*x-a)/(sqr(sin(x)/cos(x))-sin(x)*sin(x)*sin(x))*
exp(-b*b/x)-exp((x*x-b)*ln(a))*(b-x)/(a-x*x*x)
Хотя вещественный тип относится к скалярным, но на переменные и выражения данного типа накладываются некоторые ограничения. В частности, к вещественным аргументам нельзя применить функции порядка. - Pred и Succ. Нельзя использовать вещественные значения при индексации массивов, в качестве параметра цикла типа for и т. п.
Логические выражения
Понятие логического выражения или выражения типа Boolean во многом базируется на понятии операций отношения. Сами эти операции используют в качестве операндов выражения практически всех скалярных и базовых типов: вещественного, целого, логического, символьного и строкового.
При выполнении этих операций допускается смешение типов Real (всех вещественных), Integer (всех целых). Результат операции отношения для любых операндов всегда логического типа - {false, true}.
В Паскале реализованы следующие операции отношения:
= - равно;
<> - не равно;
> - больше чем;
< - меньше чем;
>= - больше или равно;
<= - меньше или равно.
Примеры:
А = В {результат равен true, если А равно В
и false, если А не равно В}
А <> В {результат равен true, если А не
равно В и false, если А равно В}
А > В {результат равен true, если А больше
В и false в противном случае}
А > 0 {результат равен true, если А больше
нуля и false в противном случае}
В операциях сравнения для символов и строк необходимо вспомнить, что у каждого элемента скалярного, перечислимого типа есть свой код - порядковый номер. Его можно получить, используя функцию Ord. Заведомо известно, что коды всех латинских и русских букв упорядочены согласно таблице ASCII (смотри п.3.5.4), а коды всех цифр упорядочены по их арифметическим значениям. Данное отношение порядка и позволяет сравнивать любые символы и строки.
Пример:
'А' < 'D'
‘X’ < ‘Y’
‘2’ < ‘5’
‘ABCD’ < ‘АВСЕ’
'ABC' < 'ABCD'
Кроме операций отношения в логических выражениях используются скобки и логические связки (операции с операндами типа Boolean):
- унарная (имеющая один операнд): not;
- бинарные (имеющие два операнда): and, or, xor.
Запись бинарных логических связок осуществляется следующим образом:
<логическое выражение - первый операнд> <логическая связка> <логическое выражение - второй операнд> ;
При использовании логических связок необходимо большое внимание уделять расстановке скобок так, как при совместном использовании операций сравнения и логических связок можно легко ошибиться. Логические связки имеют более высокий приоритет, чем операции сравнения.
Примеры логических выражений со связками:
(А>5) and (Т<10)
((М<3) or (Х<0)) and Z.
С помощью произвольных логических выражений X и Y можно легко показать смысл логических связок. Напомним, что выражения X и Y могут иметь только одно из двух значений {false, true}.
X and Y - ("конъюнкция") данное логическое выражение истинно, тогда и только тогда, когда X и Y одновременно истинны.
X or Y - ("дизъюнкция") данное логическое выражение истинно, когда по крайней мере одно из выражений X или Y истины.
X xor Y - ("исключающая дизъюнкция") данное логическое выражение истинно, когда X<>Y и ложно в обратном случае.
not Х - ("отрицание") данное логическое выражение истинно, когда X— ложно и ложно, когда X— истинно.
Используя операции отношения на множестве логических значений можно определить и другие операции математической логики.
Например:
(X, Y:Boolean)
Х<= Y- импликация;
Х = Y— эквивалентность;
Х <> Y— исключающее или.
Сами логические операции очень удобно определять с помощью таблиц истинности, в которых единица соответствует логическому значению true, а ноль - false.
Пусть X и Y это логические операнды. Для всевозможных комбинаций их значений построим таблицу истинности логических выражений X and Y, X or Y, X xor Y, not X, X<=Y , Х = Y.
X | Y | X and Y | X or Y | Х <> Y | Х<= Y | X =Y | not Х |
При анализе сложных логических выражений тоже очень удобно пользоваться таблицами истинности, предварительно разбив выражение на элементарные части. Пример: для выражения (A and В) or (A and (not В)) составим следующую таблицу:
A | B | A and B | not B | A and (not B) | (A and B) or (A and (not B)) |
При вычислении логических выражений можно воспользоваться установкой компилятора {$В-} или {$В+}. Она отвечает за режим оптимизации вычисления логических выражений. Например, в логическом выражении
(2<>2) and (a<y) and (t<z)
достаточно вычислить первый элемент конъюнкции, чтобы сказать, что всё логическое выражение ложно. Но в некоторых случаях режим оптимизации приводит к ошибкам. Например, в той части логического выражения, которая была отброшена в результате оптимизации вызывалась функция, имеющая логическое значение и выполняющая полезную работу, но в результате оптимизации функция не будет вызвана и это приведет к ошибке.