§ 8.6. Логический тип данных. Логическое выражение

Школьный курс C++
Содержание

О типе bool

В языке python существует логический тип данных bool и одноименная функция преобразования bool(). Переменные этого типа могут содержать всего два значения – True (истина) и False (ложь). True и False являются логическими литералами (константами). Обратите внимание, что литералы начинаются с прописной буквы – это требования синтаксиса. В python True интерпретируется, как любое ненулевое значение, а False как 0 (действительный или целый). Формально, логический тип является подмножеством целого типа. Этот тип данных назван в честь Дж. Буля, разработавшего математическое представление законов логики. Поэтому переменные логического типа часто так и называются – булевскими.

>>> a = 2021
>>> bool(a)
True
>>> a = 0.0
>>> bool(a)
False

За счет того, что любое арифметическое выражение можно использовать в качестве логического выражения, код программы становится еще более компактным.

Такой подход используется давно и в других языках программирования, например, C++

Операции отношения (сравнения)

Операции отношения сравнивают два значения. В python определены следующие операции сравнения:

<   меньше
<=  меньше либо равно
>   больше
>=  больше либо равно
==  равно
!=  не равно
Пробелы между символами не допускаются!

Сравниваться могут константы, переменные и сложные выражения, включающие различные операции и функции. Результатом сравнения двух выражений является True или False. Например:

>>> a = 5
>>> b = 10
>>> a > b
False
>>> a != 3
True
>>> b == 10
True

Задача 1. Дана координатная плоскость и прямая на ней. Составить программу, которая выводит значение True, если точка находится в заштрихованной области (справа от прямой).

Программа 8.6.1
x = float(input('x = '))
print(x > 2)

Задача 2. Поле шахматной доски определяется парой натуральных чисел, не превосходящих 8: первое число x — номер поля по горизонтали (при счете слева направо), второе число y — номер поля по вертикали (при счете снизу вверх). Даны натуральные числа x1 и y1 – позиция фигуры слона. Составить программу которая выводит True, если слон угрожает полю (x2, y2).

Программа 8.6.2
x1 = int(input('x1 = '))
y1 = int(input('y1 = '))
x2 = int(input('x2 = '))
y2 = int(input('y2 = '))
print(abs(y2-y1) == abs(x2-x1))

Вывод

x1 = 4
y1 = 4
x2 = 6
y2 = 5
False

Идея алгоритма заключается в следующем: если абсолютные значения разности соответствующих координат по х: x1 и x2 и по y: y1 и y2 будут равны, то слон будет угрожать этому полю (выводится значение True).

Логические операции and, or, not

  • Логическая операция and реализует булевскую операцию “И” (конъюнкция, логическое умножение). Эта операция бинарная, т. е. имеет два операнда, в качестве которых могут выступать, например, операции сравнения. Результат логического выражения True, если оба операнда истинны.
  • Логическая операция or реализует булевскую операцию “ИЛИ” (дизъюнкция, логическое сложение). Эта операция тоже является бинарной. Результат логического выражения False, если оба операнда ложны.
  • Логическая операция not реализует булевскую операцию “НЕ” или логическое отрицание (инверсия). Эта операция является унарной (выполняется над одним операндом). Результат True, если операнд имеет значение False, и наоборот.
>>> a = 5
>>> b = 10
>>> a > b or b == 0
False
>>> a == 5 and b % 2 == 0
True
>>> not a == 7
True

Поскольку операнды логических операций (как уже было заявлено выше) могут быть обычными арифметическими выражениями (возвращающими числовое значение, а не логическое), то логическое выражение можно записывать в более лаконичной форме. Например, проверку на четность можно записать так:

a % 2 == 0

или так:

not a % 2
Если a = 10, то в обоих случаях выражения вернут значение True. Почему так? Выражение a % 2, в этом случае, вернет 0, что интерпретируется как False. А not, в свою очередь, инвертирует значение в True. Второй вариант выглядит более компактным, поэтому используется чаще.

Задача 3. Дана координатная плоскость и три прямых на ней. Составить программу, которая выводит значение True, если точка находится в заштрихованной области (ограниченной этими прямыми).

Программа 8.6.3
x = float(input('x = '))
y = float(input('y = '))
print(x >= -3 and x < 1 and y < 3)

Вывод

x = 3
y = 1
False

Рассмотрим более сложный пример.
Задача 4. Дана точка A с координатами (x, y). Составить программу, которая печатает True, если точка принадлежит заштрихованной области, и False в противном случае.

Прежде чем решать данную задачу, мы должны определить уравнения для двух прямых и кривой в первой четверти. Уравнение прямой, проходящей через точки (-5;0) и (0;5): y = x + 5. Уравнение прямой, проходящей через точки (-5;0) и (0;-5): y = -x - 5. Кривая в первой четверти представляет собой дугу окружности с центром в начале координат. Уравнение такой окружности: r2 = x2 + y2. Поскольку радиус окружности равен 5, то уравнение примет вид x2 + y2 = 25. Вывод формулы уравнения окружности и определение уравнения прямой смотрите ниже, под спойлером “Примеры решения задач”.
Программа 8.6.4
x = float(input('x = '))
y = float(input('y = '))
print(y <  x + 5 and
      y > -x - 5 and
      x < 0 or
      x * x + y * y < 25 and
      x > 0 and
      y > 0)

Вывод

x = 2
y = -2
False

Логическое выражение в этой задаче необходимо разбить на две части. Первая часть описывает область в виде треугольника, слева от оси y. А вторая – описывает сектор окружности в первой четверти. Поскольку точка может находиться либо в первой области, либо во второй – они связаны логической операцией or.

Приоритет логических операций

В языке программирования python логические операции имеют следующий приоритет по возрастанию:

Операция Описание
if – else Условное выражение
or Булевское «или»
and Булевское «и»
not x Булевское «не»
in, not in, is, is not, <, <=, >, >=, !=, == Сравнение, включая тесты на членство и тесты на идентичность

Ассоциативность логических операций – левая. Это означает, что вычисления будут выполняться слева направо. На этом основаны “ленивые вычисления” (см. прим. ниже).
Таблицы приоритета логических операций в других языках программирования довольно сильно отличаются от соответствующей таблицы в языке python. Причина заключается в том, что только при таком порядке круглые скобки в логическом выражении можно не использовать. Но это не означет, что скобки вообще не нужны. Если вы не уверены в результате или хотите чтобы большое логическое выражение воспринималось визуально лучше, то скобки, конечно, использовать можно. Заметим, что все арифметические операции имеют больший приоритет по сравнению с логическими.

Логические выражения и законы Булевой алгебры

Длинные выражения можно упростить, если использовать законы Булевой алгебры. Приведем пример.

В этой задаче использовался распределительный (дистрибутивный) закон для “ИЛИ”:
A ^ B v A ^ C = A ^ (B v C)

Задача 5. Дана точка A с координатами (x, y). Составить программу, которая печатает True, если точка принадлежит заштрихованной области, и False в противном случае.

Исходное логическое выражение имеет вид:

x ** 2 + y ** 2 < 25 and x < -3 or x ** 2 + y ** 2 < 25 and x > 3

Если применить дистрибутивный закон, то можно это выражение сделать значительно короче, как показано в программе 8.6.5.

Программа 8.6.5
x = float(input('x = '))
y = float(input('y = '))
print(x ** 2 + y ** 2 < 25 and 
     (x < -3 or x > 3))

Вывод

x = 5
y = 3
False

Однако, в данном случае, скобки всё же нужны! Если во втором операнде при and убрать скобки, то выражение:

x ** 2 + y ** 2 < 25 and x < -3 or x > 3

вернёт True, при тех же исходных данных. Дело в том, что здесь включается принцип “ленивых вычислений“. Часть этого выражения, до операции or (ввиду старшинства and), является левым операндом or. Поскольку логическая операция or возвращает True, если хотя бы один из операндов имеет значение True, то любое значение x > 3 приведет к тому, что выражение, в целом, всегда будет истинно. Будьте внимательны при составлении логических выражений!

Принцип “ленивых” вычислений заключается в следующем. Если операции or или and возвращают значение достаточное для вычисления всего выражения (False для первого операнда, в случае с and, и True для первого операнда, в случае с or), то вычисления останавливаются и возвращается результат.

Приложение

Примеры решения задач
Задача 6. Дана координатная плоскость и прямая на ней. Составить программу, которая выводит значение True, если точка находится в заштрихованной области.

Для решения задачи необходимо составить уравнение прямой:

Коэффициенты k и b можно пределить по координатам пресечения осей x и y. Прямая пересекает оси в точках (0;3) и (3;0). Определим коэффициент b. Подставим в уравнение прямой значения координат x = 0, y = 3. Получаем b = 3. Определим коэффициент k. Подставим в уравнение прямой значения координат x = 3, y = 0 и полученное значение b. Получаем k = -1. Следовательно, уравнение этой прямой:

y = -x + 3

Так как заштрихованная область находится ниже этой прямой, то y < -x + 3. Учитывая, что заштрихованная область находится правее оси y и выше оси x, программу можно составить так:

Программа 8.6.6
[python] x = float(input('x = '))
y = float(input('y = '))
print(y < -x + 3 and y > 0 and x > 0)
[/python] Задача 7. На координатной плоскости даны две окружности с общим центром в точке (0;-1) с радиусами r1 = 5 и r2 = 3 и прямая y = 1. Дана точка A с координатами (x, y). Составить программу, которая печатает True, если точка принадлежит заштрихованной области, и False в противном случае.

Для решения задачи выясним, как получить уравнение окружности. Рассмотрим систему координат в которой построена окружность с центром в точке P(x0;y0) и радиусом r. Пусть A - точка лежащая на окружности с координатами (x;y).

Отрезки r, x - x0 и y - y0 образуют прямоугольный треугольник, где r - его гипотенуза, а x - x0 и y - y0 - его катеты. Тогда по теореме Пифагора:

Это и есть уравнение окружности. Очевидно, что центр окружности смещен на 1 ниже по оси y. Поскольку радиусы известны, то мы можем составить уравнения для обеих окружностей в виде:

x2 + (y + 1)2 = 25
x2 + (y + 1)2 = 9

Так как заштрихованная область находится ниже окружности с радиусом r' = 5, но выше окружности с радиусом r'' = 3, логические выражения примут вид:

x2 + (y + 1)2 < 25
x2 + (y + 1)2 > 9

При составлении итогового логического выражения учитываем, что заштрихованная область находится выше прямой y = 1. Таким образом, программа может быть составлена следующим образом:

Программа 8.6.7
[python] x = float(input('x = '))
y = float(input('y = '))
print(x ** 2 + (y + 1) ** 2 < 25 and
x ** 2 + (y + 1) ** 2 > 9 and
y > 1)
[/python]
Вопросы
Темы сообщений
Задания А
Задания Б
Задания С
Ссылки
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (1 оценок, среднее: 5,00 из 5)
Загрузка...

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Обсуждение закрыто.