Up

8 класс. Простые и составные условия

 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) числе.



Следует обратить внимание на то, что признаки делимости в программировании отличаются от тех, которые изучались в курсе математики 5-го класса. Программирование использует запись
 x % y = = 0  для проверки условия делимости. Оно означает, что если при делении числа x на число y остаток от деления равен 0, то x нацело делится на y. Если остаток ненулевой, то признак делимости не срабатывает (первое число не делится нацело на другое).
15.2. Составные условия 
С высказываниями можно производить логические операции (НЕ, И, ИЛИ). Для логических переменных также определены логические операции, соответствующие операциям над высказываниями: !(), &&, ||. Логические выражения, в которых наряду с простыми условиями (сравнениями) используются логические операции, называют составными условиями. Можно привести таблицы истинности  для этих операций, но лучше сформулируем их кратко.
Для НЕ: условие меняет своё значение на противоположное
!(true) = false,   !(false) = true.
Для И: условие будет истинно только если ВСЕ условия, которые оно скрепляет, будут истинны.
То есть    true && true && true && true = true,        true && false && true && true = 0.
Причём срабатывает проверка следующим образом: если очередное условие имеет значение true, то переходим к проверке следующего, как только попалось условие со значением false, проверка прерывается тут же с результатом false. Если все условия true, проверка идёт до конца.
Для ИЛИ: условие будет ложно, только если ВСЕ условия, которые оно скрепляет, будут ложны. false || false || false || false = false,    false || false || true|| false = true.
Проверка идёт до конца, если все условия ложны, и проверка останавливается, если одно из выражений имеет значение true, тогда ответом будет именно true.
В логических выражениях могут встречаться как арифметические операции, так и логические. Порядок выполнения операций определяется их приоритетом, если нет скобок: 
1) !; 2) *, /, %, &&; 
3) +, −, ||; 
4) = =, !=, +, <, >, <=, >=. 
Пример 15.3. 
Определение порядка действий для выражения (a, d — bool, c, b — int): 
a || (c < b) && d 
Первым выполняется сравнение c и b, затем логическая операция &&, потом — ||.

Операции с одинаковым приоритетом выполняются по порядку, слева направо. Для изменения порядка выполнения операций применяют скобки.

Рассмотрим ещё пример:

Рассмотрим выражение (! (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.


Комментариев нет:

Отправить комментарий