15.1. Логический тип данных
Напомним изученные в 7-м классе понятия высказывание и условие для исполнителя. Высказывание — повествовательное предложение (утверждение), о котором можно сказать, истинно оно или ложно. Условием для исполнителя является известное ему высказывание, которое может соблюдаться (быть истинным) либо не соблюдаться (быть ложным). В языке программирования Pascal для работы с условиями определен логический тип данных bool. Величины типа boolean могут принимать два значения — false (ложь) и true (истина). Значения false и true получаются в результате выполнения операций сравнения над числовыми данными. Для сравнения используют знаки, указанные в таблице.
Операция Запись в программе
Равно (=) = =
Не равно (≠) ! =
Больше (>) >
Меньше (<) <
Больше или равно (>=) >=
Меньше или равно (<=) <=
Тип Boolean назван в честь английского математика и логика Джорджа Буля, занимавшегося вопросами математической логики в XIX в. Данный тип присутствует в подавляющем большинстве языков программирования. В некоторых языках (в Си и С++ тоже) реализуется через числовой тип данных. Тогда за значение ложь принимается 0, а за значение истина — 1.
Сравнивать можно константы, переменные, арифметические и логические выражения. Логическое выражение — выражение, принимающее одно из двух значений: true или false. Логические выражения можно присваивать переменным типа boolean, а также выводить их значения на экран: будет выведено слово false или true соответственно (пример 15.1). Условия для исполнителя являются частным случаем логических выражений.
Пример 15.1.
Примеры логических выражений:
3 < 7 — логическое выражение, значение которого true;
2 + 2 * 2 = 8 — логическое выражение, значение которого false;
fabs(-5) > fabs(3) — логическое выражение, значение которого true;
y >= x * x — логическое выражение, значение которого можно определить, только зная значения переменных x и y. При x = 2 и y = 10 значение выражения — true. При x = 10 и y = 2 — false.
В программе учитывается, что числовое значение false — это 0, а true — это 1. Проверим истинность этих выражений в программе:
int main( void)
{
bool a1, a2, a3, a4, a5;
int x, y;
a1 = 3 < 7;
cout << "a1 = " << a1 << endl;
a2 = (2 + 2 * 2 == 8);
cout << "a2 = " << a2 << endl;
a3 = fabs(-5) * fabs(3);
cout << "a3 = " << a3 << endl;
x = 2;
y = 10;
a4 = (y >= x * x);
cout << "a4 = " << a4 << endl;
x = 10; y = 2;
a5 = (y >= x * x);
cout << "a5 = " << a5 << endl;return 0;
}
Результат работы программы:
Пример 15.2.
Написать программу, которая выведет на экран значение true или false в зависимости от того, является ли введенное число x четным или нет.
Число является четным, если остаток от деления его на 2 равен нулю. Значение переменной a определяется значением выражения x % 2 = = 0.
int main( void)
{bool a;
int x;
cout << "x = ";
cin >> x;
a = (x % 2 == 0);
cout << "Number is even - " << a;
return 0;
}
Сообщение на английском. Может создать затруднение для учащихся, изучающих не английский, а другие иностранные языки. Number - число, is - есть (аналог тире в русском в данном случае), even - чётное. Для информации - odd - нечётное.
Если после сообщения 0, то утверждение ложно, если будет 1 - то правда. Ниже скриншоты результатов при чётном (6) числе, нечётном (11) числе.
Операции с одинаковым приоритетом выполняются по порядку, слева направо. Для изменения порядка выполнения операций применяют скобки.
Рассмотрим ещё пример:
Рассмотрим выражение (! (a) < b) с переменными а и b типа int. Сначала идёт отрицание a, а потом сравнение с b.
Если сначала нужно сравнить a и b, то надо другим способом расставить скобки (! (a < b)).
Пример 15.4*.
Рассмотрим выражение: a < b && c < d
Если a, b, c, d имеет тип int, то получим ошибку: любое условие в С++ всегда берётся в скобки.
int main( void)
{
int a,b,c,d;
cin >> a >> b >> c >> d;
cout << (a < b && c < d); //без скобок не сработает выполнение программы
return 0;
}
При составлении программ часто приходится менять условие на противоположное ему для проверки в программе. Не забывайте, что два значения могут сравниваться так:
a > b или противоположное ему условие a <= b
a < b или противоположное ему условие a >= b
a = = b или противоположное ему условие a !=b
Пример 15.6.
Написать программу, которая выдаст на экран значение true или false в зависимости от того, находится ли число B между числами A и C.
Рассмотрим два случая. Верно неравенство: А < B < C. Этому неравенству соответствует логическое выражение: (А < B) && (В < С). Присвоим переменной r1 значение этого выражения. Верно неравенство: А > B > C. Этому неравенству соответствует логическое выражение: (А > B) && (В > С). Присвоим переменной r2 значение этого выражения. Ответом на задачу будет значение логического выражения r1 || r2.
int main( void)
{
int A, B, C;
bool r1, r2, rez;
cout <<"Vvod A, B, C" << endl;
cin >> A >> B >> C;
r1 = (A < B) && (B < C);
r2 = (A > B) && (B > C);
rez = r1 || r2;
cout << "B beetwin of A and C - " << rez;
return 0;
}
Запустить программу и ввести значения A = 5, B = 0, С = –5. Результат: 1
Запустить программу и ввести значения A = –2, B = –7, С = 5. Результат: 0.
В отличие от учебника могу привести ещё одно решение, которое проверяет нахождение числа В между А и С. Из курса математики известно, что если от большего числа отнять меньшее, то результат будет положительный, если от меньшего большее, то отрицательный. Поэтому можно найти произведение двух разностей (В - А) и (В - С). Если В находится между двумя оставшимися числами, то одна разность будет со знаком "+", а другая со знаком "-". Произведение получится со знаком "минус". В иных случаях, получится либо 0, либо положительный результат.
Поэтому программу можно представить так:
int main( void)
{
int A, B, C;
bool rez;
cout <<"Vvod A, B, C" << endl;
cin >> A >> B >> C;
rez = ((B-A) * (B-C) < 0);
cout << "B beetwin of A and C - " << rez;
return 0;
}
Количество переменных на 2 меньше, а результат тот же.
Вопросы.
1. Что такое составное условие?
2. Назовите логические операции, используемые в C++.
3. Какой приоритет у логических операций !(), &&, ||?
Упражнения
1. Сформулируйте и реализуйте обратную задачу для примера 15.2: для всех тех случаев, для которых в исходной задаче было true, нужно вывести 0 и, наоборот, для всех тех случаев, в которых в исходной задаче получалось false, получить 1.
2. Определите, что делают следующие программы, и дополните команду вывода.
int main( void)
{
int x;
bool a;
cout <<"Vvod x = ";
cin >> x;
a = ((x % 10) = = 0);
cout << "Number x is ... " << a;
return 0;
}
____________
int main( void)
{
int x;
bool a;
cout <<"Vvod x = ";
cin >> x;
a = ((x >= 10) && (x < 100));
cout << "Number x is ... " << a;
return 0;
}
3. Напишите программу, которая выведет на экран значение true или false, в зависимости от того, является ли введенное число x положительным или нет.
4. Напишите программу, которая выведет на экран значение true или false, в зависимости от того, является ли введенное число x четырехзначным или нет.
5*. Заданы два положительных числа x и y. Определите, верно ли, что первое число меньше второго и хотя бы одно из них нечетное. Выведите на экран true или false.
Комментариев нет:
Отправить комментарий