- •Лабораторная работа №1 Линейные и разветвленные программы
- •Примеры использования арифметических операций
- •Примеры использования операций инкремента и декремента
- •Примеры использования операций отношения
- •Примеры использования поразрядных логических операций: Поразрядное логическое умножение:
- •Логический сдвиг:
- •Поразрядное логическое сложение:
- •Сложение по модулю 2 (исключающее или):
- •Примеры более сложного использования поразрядных логических операций:
- •Примеры записи логических выражений:
- •Алгебраические выражения
- •Пример вычисления значения выражения
- •Примеры использования преобразования типов
- •2. Особенности преобразования типов int и double:
- •6. Приведение типа в случае использования указателей:
- •7. Преобразование старшего типа к младшему удобно использовать для выделения отдельных частей переменной или константы:
- •9. Проанализируйте преобразование типов в операторах присваивания:
- •Особенности представления чисел по двоичному основанию
- •Особенности выполнения арифметических операций над вещественными числами
- •Операции умножения и деления
- •Ошибки округления
- •Переполнение (ошибка переполнения)
- •Потеря порядка (ошибка исчезновения порядка)
- •Катастрофическая потеря порядка (ошибка потери порядка)
- •Операции сложения и вычитания
- •Переполнение (ошибка переполнения)
- •Потеря значащих цифр
- •Особенности выполнения операций отношения (сравнения)
- •Правила работы с данными вещественных типов
- •Замечания по программированию алгебраических выражений
- •Условный оператор
- •Оператор switch Пример 1. Печать событий в зависимости от года
- •Пример 2. Распознавание вводимых символов
- •Пример 3. Печать сообщений о работе программы
- •Пример 4. Селектор перечислимого типа
Примеры записи логических выражений:
Пример 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 ();
Для закрепления умения применять логические операции полезно научиться выполнять упражнения двух типов:
-
Дана некоторая область плоскости. Записать логическое выражение, принимающее значение «истина» тогда и только тогда, когда точка с координатами (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”;
Задание. Нарисуйте область плоскости, в которой и только в которой истинно выражение:
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;
}