- •Лекция 4 Операции и выражения
- •Понятие выражения и операции
- •Классификация операций
- •Приоритеты (ранги) операций
- •Арифметические операции
- •Примеры использования арифметических операций Выделение цифр в целом числе
- •Выделение цифр в вещественном числе
- •Арифметические операции над переменными символьного типа
- •Операции инкремента и декремента
- •Особенности выполнения операций инкремента и декремента
- •Операции присваивания
- •Примеры использования
- •Операции отношения
- •Логические операции
- •Особенности выполнения логических операций
- •Примеры использования логических операций
- •Логические выражения и примеры их записи
- •Поразрядные логические операции
- •Примеры выполнения поразрядных логических операций:
- •Операции поразрядного сдвига
- •Дополнительные операции Операции доступа к компонентам структурированного объекта
- •Операции доступа к адресуемым компонентам классов
- •Определение размера sizeof
- •Вызов функции ( )
- •Индексация [ ]
- •Операция запятая ,
- •Операция расширения области видимости ::
- •Преобразование типа
- •Правила преобразования типов
- •Примеры преобразования типов
- •2. Особенности преобразования типов int и double:
- •7. Проанализируйте преобразование типов в операторах присваивания:
- •8. Приведение типа в случае использования указателей:
- •9. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •10. С помощью приведения типа можно получить дробную часть числа:
- •Программирование вычисления алгебраических выражений
- •Определение первого символа вводимого значения
- •Контроль правильности ввода значения переменной
- •Основные встроенные (стандартные) функции
- •Пример вычисления по формуле
- •Замечания по программированию алгебраических выражений
- •Особенности представления чисел по двоичному основанию*
- •Особенности выполнения арифметических операций над вещественными числами*
- •Операции умножения и деления
- •Операции сложения и вычитания
- •Особые ситуации Ошибки округления
- •Ошибки переполнения
- •Потеря (исчезновение) порядка
- •Катастрофическая потеря порядка
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Обратить внимание
- •Правила работы с данными вещественных типов
Примеры использования логических операций
#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.
Для закрепления умения применять логические операции полезно научиться выполнять упражнения двух типов:
-
Дана некоторая область плоскости. Записать логическое выражение, принимающее значение «истина» тогда и только тогда, когда точка с координатами (x, y) принадлежит указанной области.
-
По заданному выражению нарисовать область плоскости, в которой и только которой указанное выражение истинно.
Такие задачи, в зависимости от того, какие логические операции используются при определении областей, можно классифицировать следующим образом:
-
В выражении не используются логические операции. Например, точки первой и третьей четвертей, включая и оси координат, определяется с помощью выражения 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;
}