Выражения и преобразование типов. Операции и выражения. Приоритеты операций

Страницы работы

Фрагмент текста работы

Например, при вычислении выражения (++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

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

  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>

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. Операции выполняются слева направо, кроме операции поразрядного

Похожие материалы

Информация о работе

Тип:
Конспекты лекций
Размер файла:
456 Kb
Скачали:
0