Булевы выражения могут быть включены в состав операторов IF и WHILE языка CF-Паскаль для уменьшения сложности многих программ. В качестве иллюстрации переработаем программу MinSort с использование булевых условий вместо вложенных операторов IF там, где это возможно.
Новые идеи: Булевы выражения языка Паскаль.
SR23. <условие>::= <выражение> <сравнение> <выражение>
| NOT(<условие>)
|(<условие>) AND (<условие>)
|(<условие>) OR (<условие>)
это правило показывает, что любое условие, используемое с булевым оператором, должно быть заключено в скобки.
Примеры выражений с одинаковым значением:
NOT(Ch1 < Ch2) | Ch1 >= Ch2 |
NOT(Ch1 > Ch2) | Ch1 <= Ch2 |
NOT(Ch1 = Ch2) | Ch1 <> Ch2 |
(Ch1 <= Ch2) AND (Ch1 >= Ch2) | Ch1 = Ch2 |
(Ch1 <= Ch2) AND (Ch1 < Ch2) | Ch1 < Ch2 |
(Ch1 <> Ch2) AND (Ch1 > Ch2) | Ch1 > Ch2 |
(Ch1 < Ch2) AND (Ch1 > Ch2) | FALSE (как правило, это ошибка) |
(Ch1 < Ch2) OR (Ch1 > Ch2) | Ch1 <> Ch2 |
(Ch1 <= Ch2) OR (Ch1 < Ch2) | Ch1 <= Ch2 |
(Ch1 = Ch2) OR (Ch1 <> Ch2) | TRUE (как правило, это ошибка) |
Булевы тождества и факты могут быть использованы для создания эквивалентных условий языка Паскаль. Например, закон деМоргана:
|
|
NOT(P OR Q) = (NOT P) AND (NOT Q)
Означает, что операторы IF, начинающиеся с
IF NOT((Ch1 = Ch2) OR (Ch3 < Ch4))
и
IF (Ch1 <> Ch2) AND (Ch3 >= Ch4)
будут иметь одинаковые действия. Большинству людей более понятен второй вариант.
Булевы выражения очень полезны в программировании. Например:
WHILE (Ch = ‘ ‘) OR (Ch = ‘0’)
DO
READ(Ch)
будет продолжать считывание до первого непробельного ненулевого символа.
IF (Ch >= ‘0’) AND (Ch <= ‘0’)
THEN
WRITE(Ch)
будет печатать только цифры.
Снова семейство программ MinSort.
Булевы выражения позволяют программе MinSort быть улучшенной, создавая новое семейство программ MinSortB. Раздел проекта 3.1 может быть заменен следующим:
Design part 3.1
BEGIN {печатаем минимальное значение из Ch1, Ch2, Ch3 в OUTPUT, оставшиеся значения помещаем в Ch1, Ch2}
IF (Ch1 < Ch2) AND (Ch1 < Ch3)
THEN
{Печатаем Ch1 в OUTPUT, помешаем Ch3 в Ch1}
BEGIN
WRITE(Ch1);
WRITE(Ch1:= Ch3)
END
ELSE
{Печатаем минимум из Ch2, Сh3 в OUTPUT. В случае необходимости копируем Ch3 в Ch2}
IF Ch2 < Ch3
THEN
BEGIN
WRITE(Ch2);
Ch2:= Ch3
END
ELSE
WRITE(Ch3)
END