Например, при вычислении выражения (++x || ++y && ++z) и при х=2 не произойдет изменения значений y и z, т.к. первый операнд имеет значение true и по нему можно сделать вывод о значении всего выражения, независимо от значения его второй части (++y && ++z).
Что напечатает программа:
#define PRINT(int) printf (“%d\n”, int) int x=2, y=1, z=0;
x=((x&&y)||z); PRINT(x); |
(2&&1)||0) à x=1 |
PRINT(x || !y &&z); |
(истина || ((ложь) && ложь))àистина (1) |
#define PRINT3(x, y, z) printf (“x = %d\t y = %d\t z = %d\n”, x, y, z)
int x, y, z;
x = y = z = 1;
++x || ++y && ++z |
(x=2) à больше ничего не вычисляется |
PRINT3(x, y, z) |
x=2 y=1 z=1 |
x = y = z = 1;
++x && ++y || ++z |
((x=2) && ((y=2)) à истина à z не вычисляется |
PRINT3(x, y, z) |
x=2 y=2 z=1 |
x = y = z = 1;
++x && ++y && ++z |
(x=2) && ((y=2) && (z=2) |
PRINT3(x, y, z) |
x=2 y=2 z=2 |
x = y = z = -1;
++x && ++y || ++z |
(x=0) à ложь à y не вычисляется , z не вычисляется |
PRINT3(x, y, z) |
x=0 y= -1 z=0 |
x = y = z = -1;
++x || ++y && ++z |
(x=0) || ((y=0)à ложь à z не вычисляется ) |
PRINT3(x, y, z) |
x=0 y=0 z= -1 |
x = y = z = -1;
++x && ++y && ++z |
(x=0) à ложь à y и z не вычисляется |
PRINT3(x, y, z) |
x=0 y=-1 z=-1 |
Пример 1. Проанализируйте запись с помощью логических операций высказываний, являющихся истинными при выполнении следующих условий:
высказывание |
запись высказывания с помощью логических операций |
неверно, что 0 < Х <= 3 , У > 5 |
! ((0 < Х) && (Х <= 3) && (У > 5)); (X<=0) || (X > 3) || (Y <=5); |
Х не является min (Х, У) |
! (X <=Y); X>Y |
Z является min (Х, У, Z) |
(Z <= X) && (Z <= Y); |
Y не является max (X,Y,Z) и не является min (X, Y, Z) |
! ((Y >= Х) && (Y >= Z)) && (! ((У <= X) && (Y <= Z))); |
X, Y, Z равны между собой |
(X==Y) && (X==Z) && (Y==Z); |
каждое из чисел X, Y, Z строго положительно |
(X>0) && (Y >0) && (Z>0); |
хотя бы одно из чисел X, Y, Z положительно |
(X>0) || (Y >0) || (Z>0); |
только одно из чисел X, Y, Z является положительным |
((X>0) && (Y<0) && (Z<0)) || ((Y>0) && (X<0) && (Z<0)) || ((Z>0) && (X<0) && (Y<0)); |
ни одно из чисел X, Y, Z не равно 10 |
(X !=10) && (Y != 10) && (Z != 10); int(X==10)+int(Y==10)+int(Z==10)=0; |
Пример 2. Для следующих логических выражений проанализируйте формулировки высказываний на обычном языке:
(X == 12) && (Y == 12) && (Z == 12): каждое из чисел равно 12;
(X < 0) && (Y > 0) || (Y < 0) && (X > 0): X и Y имеют разные знаки;
X*Y<0;
(X * Y * Z < 0) && ( X * Y > 0) : X и Y имеют одинаковые знаки, а Z – им противоположный;
X * Y * Z < 0: две переменные имеют одинаковые знаки, а третья – им противоположный
Пример 3. Вычислить и вывести на экран результат логического выражения для заданных значений логических переменных a, b, c:
#include <stdio.h>
main()
{bool a, b, c, d;
a = true; b=true; c = false;
d = a && (!(b &&(!c)));
printf (" %d\n", d); // 0
return (0);
}
Пример 4. Вычислить и вывести на экран результат логического выражения для заданных значений целых переменных a, b, c:
a || b && c
#include <stdio.h>
main()
{bool a, b, c, d;
int ia, ib, ic;
printf (" input a, b, c:\n");
printf ("0 - true, 1 - false:\n");
canf ("%i%i%i, ", &ia, &ib, &ic);
a = bool(ia); b=bool (ib); c = bool(ic);
d = a || b &&c;
printf ("d= %d\n", d);
return (0);
}
Результат:
1 1 1
d= 1
Пример 5. Присвоить логической переменной b значение логического выражения, истинного при выполнении следующего условия и ложного в противном случае: целые n и k имеют одинаковую четность.
#include <stdio.h>
main()
{int n, k;
bool b;
printf ("input n,k:\n");
scanf ("%i%i", &n, &k);
b = (n % 2 == k % 2);
printf ("b=%d\n", b);
return (0);
}
Результат:
4 8
b=1
Для закрепления умения применять логические операции полезно научиться выполнять упражнения двух типов:
Такие задачи, в зависимости от того, какие логические операции используются при определении областей, можно классифицировать следующим образом:
· В выражении не используются логические операции. Например, точки первой и третьей четвертей, включая и оси координат, определяется с помощью выражения x*y >=0.
· Используется только операция &&, если область состоит из одной части. Например, точка внутри треугольника с вершинами (1, 1), (0, 0), (-1, 1) определяются так: y > abs(x) && y <=1.
· Используется только операция ||, если область состоит из нескольких относительно несложных частей, для определения каждой из которых достаточно одного неравенства. Например, область, состоящая из левой половины круга радиуса 2 с центром в начале координат, включая и полуокружность, и точек справа от оси OY определяется так: x > 0 || x*x + y*y <=4.
· Используются как операция &&, так и операция ||, если область «склеена» из нескольких частей. Каждая из них определяется с помощью нескольких неравенств, соединенных операцией &&. Например, ту же левую половину круга радиуса 2, включая и его границы, и правую относительно оси OY часть полукольца, образованного окружностями радиусов 2 и 3 с центром в начале координат, можно определить так:
x <= 0 && x*x + y*y <=4 || x >=0 && x*x + y*y >= 4 && x*x + y*y <=9.
· Используется операция отрицание (!), если легче определить область, которой точки не принадлежат, или некоторую часть уже определенной области надо «выбросить» из нее. Например, так легче определить круг радиуса 5 с центром в начале координат, из которого выброшен треугольник с вершинами (1,1) (0, 0) и (-1, 1):
x*x + y*y <= 25 && ! (y >= abs(x) && y <=1).
Область ограничена линиями y = -x, x=0, y=-1. Соответствующее выражение для ее записи: if (y <=x && x >=0 && y >-1) cout << ”YES”; else cout << ”NO”;
Задание. Нарисуйте область плоскости, в которой и только в которой истинно выражение:
x > y && x < 2 && y > -1;
x > y && x < 2 || y > -1;
x > y && ( x<2 || y > -1);
x > y || x < 2 && y > -2;
x > y || x < 2 || y > -1;
Пример
Написать программу, проверяющую, попадает ли точка в область. Результат вывести в виде текстового сообщения.
Область можно описать как круг, пересекающийся с треугольником. Точка может попадать либо в круг, либо в треугольник, либо в их общую часть:
{x2 + y2 <=1} или {х≤0 и y ≤ 0 и y ≥ -x-2}
1
-2 1
-1
-2
Программа:
#include <iostream.h>
int main()
{double x, y;
cout << " input x, y" << endl;
cin >> x >> y;
if ((x*x +y*y <= 1) || (x<=0 && y <=0 && y >= -x-2))
cout << "YES" << endl;
else cout << "NO" << endl;
return 0;
}
Поразрядные логические операции
Обратите внимание, на специфические операции, определенные в C++ только для целочисленных типов и для выражений, приводимых к целому типу, – поразрядные логические операции. Их распространенное применение – обработка информации в регистрах, области системных данных компьютера, от различных его устройств, когда в силу ограниченности пропускной способности каналов информация упаковывается в байт, слово и т.д., а также – кодируется некоторым образом.
Результат поразрядной логической операции – целое число. Биты результата формируются из битов операндов поразрядно по тем же правилам, что и для логических операций. Только операндами и результатами вместо true является 1, а вместо false – 0. Операции выполняются слева направо, кроме операции поразрядного
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.