Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
л_4_Операции_и_выражения.doc
Скачиваний:
10
Добавлен:
05.11.2018
Размер:
660.99 Кб
Скачать

Примеры использования логических операций

#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 =0  ложь

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) && (X==Z) || (X==Y) && (Y==Z || (Z==X) && (Z==Y));

каждое из чисел 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>

#include <conio.h>

int main()

{bool a, b, c, d;

a = true; b=true; c = false;

d = a && (!(b &&(!c)));

printf (" %d\n", d); // 0

_getch();

return 0;

}

Пример 4. Вычислить и вывести на экран результат логического выражения для заданных значений целых переменных a, b, c:

a || b && c

#include <stdio.h>

#include <conio.h>

int main()

{bool a, b, c, d;

int ia, ib, ic;

printf (" input a, b, c:\n");

printf ("0 - true, 1 - false:\n");

scanf ("%i%i%i, ", &ia, &ib, &ic);

a = bool(ia); b=bool (ib); c = bool(ic);

d = a || b &&c;

printf ("d= %d\n", d);

_getch();

return 0;

}

Результат:

1 1 1

d= 1

Пример 5. Присвоить логической переменной b значение логического выражения, истинного при выполнении условия «целые n и k имеют одинаковую четность» и ложного в противном случае:.

#include <stdio.h>

#include <conio.h>

int 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);

_getch();

return 0;

}

Результат:

4 8

b=1

Пример 6.

Для закрепления умения применять логические операции полезно научиться выполнять упражнения двух типов:

  1. Дана некоторая область плоскости. Записать логическое выражение, принимающее значение «истина» тогда и только тогда, когда точка с координатами (x, y) принадлежит указанной области.

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

Такие задачи, в зависимости от того, какие логические операции используются при определении областей, можно классифицировать следующим образом:

  • В выражении не используются логические операции. Например, точки первой и третьей четвертей, включая и оси координат, определяется с помощью выражения 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”;

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

Область можно описать как круг, пересекающийся с треугольником. Точка может попадать либо в круг, либо в треугольник, либо в их общую часть:

{x2 + y2 <=1} или {х≤0 и y ≤ 0 и y ≥ -x-2}

1

-2 1

-1

-2

Программа:

#include <iostream>

#include <conio.h>

using namespace std;

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;

cin >> x >> y; //с помощью условной тернарной операции

cout <<

(((x*x +y*y <= 1)||(x<=0 && y <=0 && y >= -x-2)) ? "Yes" : "No");

cout <<endl;

_getch();

return 0;

}