Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_1_метод_указания прога.doc
Скачиваний:
3
Добавлен:
03.11.2018
Размер:
301.57 Кб
Скачать

Примеры записи логических выражений:

Пример 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>

#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. При вводе значения любого из целочисленных типов, превосходящего максимально допустимое значение для диапазона типа соответствующей переменной, фактически вводится неверное значение. Чтобы обнаружить ошибку, необходимо контролировать вводимые данные. Контроль правильности представления значения типа можно реализовать, например, таким образом:

unsigned char uchar; cin >> uchar; if (uchar > 0 && uchar <=255) {……} else return -1; // или

if (uchar < 0 || uchar >255) return -1; //или

int ir; if (abs (ir) > MAXINT) exit ();

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

  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”;

Задание. Нарисуйте область плоскости, в которой и только в которой истинно выражение:

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>

#include <conio.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;

_getch();

return 0;

}